微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > uboot stage2 init_fnc_t *init_sequence[]代码分析

uboot stage2 init_fnc_t *init_sequence[]代码分析

时间:11-29 来源:互联网 点击:
 今天总算是把uboot stage2看完了,哎,感受太深了一句话:看完了这些代码,才知道什么叫代码~~

 uboot第二阶段代码是用C写的,本来以为可以比第一阶段的汇编好理解,毕竟对C更熟悉一点。可刚开始进入start_armboot()函数一看,就了~~哎,学习不到家啊~~ 所以,现在还不敢大谈对第二阶段有多理解吧,只是简单记一下,大概理解的。

 本着理解代码高于一切的原则,顺着start_armboot()函数执行顺序读下去。前面的还是比较好理解的,现在就讲讲init_fnc_t *init_sequence[]吧。

 在init_fnc_t *init_sequence[]定义前有这样一行:typedef int (init_fnc_t) (void)哎,这,最怕碰到这种定义了~~都是受谭老师的祸害啊~~自己的C语言基础还是在大二的时候打下的,计算机专业学生学C语言用的居然是谭浩强的那本C搞的直到现在面对这个typedef int (init_fnc_t) (void)都还有点不敢确定。定义init_fnc_t为函数类型,该函数返回int型,无参数。而init_fnc_t *init_sequence[]则是定义一个init_fnc_t指针类型的数组。简单的说就是定义了个函数指针数组,指向一系列cpu初始化函数。包括cpu_init,board_init,interupt_init,env_init,init_baudrate,serial_init,console_init_f,display_banner,dram_init,display_dram_config并且如果定义了CONFIG_VCMA9的话还有checkboard函数。当然这些函数都是返回int并且无参数输入型,有些还是static的。

 现分别说说各个初始化函数吧:简单的现在可以多讲点,还有一些是现在还不太理解或是很长的,需要以后单独列个日志来写吧,打算是这样,希望后面几天能搞懂

 int cpu_init(void):该函数位于ubootcpus3c44b0cpu.c

  该函数只是调用icache_enable()函数实现cpu cache的初始化,然后返回0。

  void icache_enable(void)位于同一文本中。该函数首先调用s3c44b0_flush_cache(),通过向

  LRU RAM写0来刷新cpu cache。刷新cpu cache之后,icache_enale()函数再设置两个非缓冲区域寄    存器NCACHBE0和NCACHBE1 。最后通过设置SYSCFG寄存器来开启cpu cache。

 int board_init(void):函数实现位于ubootoarddaveB2B2.c。依次为初始化GPIO和中断,把cpu体系号传    送给gd->bd->bi_arch_number,把要传送给系统内核(uclinux)的参数的首地址给

  gd->bd-?bi_boot_params。完成后返回0。

 int interrupt_init(void):位于ubootcpus3c44b0interrupt.c

  初始化timer1相关寄存器,用于产生定时中断信号。为什么是timer1呢??好像是timer5做为      uclinux的系统时钟的。以后再研究吧

int env_init(void):该函数位于ubootcommonenv_flash.c。

  大概分为两种情况:如果定义了CFG_ENV_ADDR_REDUND,即如果环境变量需要在SDRAM中有备    份的话,是一种env_init(),如果不需要备份的话,是另外一个env_init()。还是需要单列一篇记录

 int init_baudrate(void):函数位于ubootlib_armoard.c

  如果参数中设置了波特率则利用参数用设置的波特率,否则利用默认的CONFIG_BAUDRATE(115200)

  CONFIG_BAUDRATE宏定义位于ubootincludeconfigsB2.h

  #define CONFIG_BAUDRATE 115200

 int serial_init(void):函数位于ubootcommonserial.c。

  调用 serial_setbrg ()设置串口相关寄存器,包括FIFO寄存器、控制寄存器、列控制寄存器和波特率    约数寄存器等

console_init_f():位于ubootcommonconsole.c。

  这个函数就这句:

          gd->have_console = 1

  就是设置了一下相关的数据

display_banner():位于ubootlib_arm_board.c

  用来打印当前的一些状态

dram_init():位于ubootcpudaveB2B2.c

  设置RAM的起始地址和大小,依据板子硬件设置。设置文件为ubootincludeconfigsB2.h

  #define PHYS_SDRAM_1 0xc0000000 /* SDRAM Bank #1 */
    #define PHYS_SDRAM_1_SIZE 0x01000000 /* 16 MB */

 display_dram_config():位于ubootlib_armoard.c

  打印RAM的相关信息,相关的宏定义都位于ubootincludeconfigsB2.h,当然都是依据板子实际来定    义的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top