uboot启动第二阶段——start_armboot

首先看一个gd_t这个结构体,global_data顾名思义就是全局数据,主要保存了uboot的配置信息

bd:板子相关信息    flags:相关标志位    baudrate:串口波特率    have_console:控制台初始化    reloc_off:重定位偏移量    env_addr:环境变量地址    env_valid:环境变量校验成功    fb_base:帧缓冲基地址    jt:一些函数入口

这是一个非常巧妙的用法,将gd的地址保存在r8寄存器中。这样做的好处是,可以方便地在不同的文件中进行调用,并且经常频繁调用的数据存在寄存器中效率会很高。

从中我们可以看出uboot的内存排布是下面这样的

结合start.S和u-boot.lds,可以知道这句代码用于计算镜像大小。

但是分析的时候很容易将C语言调用汇编标志和汇编调用汇编标志搞混,具体分析方法参照我的上一篇博客。

博客链接地址为:https://blog.csdn.net/lushoumin/article/details/82866957

很显然在遍历函数指针数组,并调用所有函数,下面看一下init_sequence这个数组内容

很显然是在做一些初始化工作:

cpu_init:什么也没干

board_init:初始化dm9000网卡,初始化机器码和启动参数地址

interrupt_init:初始化定时器4

env_init:初始化环境变量,就是设置默认环境变量

init_baudrate:初始化串口波特率

serial_init:前面已经初始化过串口,这里什么也没干

console_init_f:初始化控制台,就是让控制台标志位置1

display_banner:显示uboot信息

print_cpuinfo:打印时钟信息

checkboard:打印开发板信息

init_func_i2c:初始化i2c

dram_init:初始化DDR信息

display_dram_config:打印DDR信息

板子上根本没有norflash,所以这些代码没有实际价值

初始化动态内存区域,其实就是清空堆区

初始化MMC或者初始化nandflash,取决于配置

重定向环境变量,即将环境变量从存储介质中重定向到DDR中

从环境变量中获取IP地址和MAC地址

初始化设备驱动链表,并且将一些设备加入链表。事实上,这里我们只是将串口设备加入链表

初始化很多的函数入口地址,事实上整个uboot都没有发现调用这些入口,所以没什么大用,可以不看

初始化控制台,这里初始化完之后,uboot就可以使用控制台了

由于没有配置中断,因此这句代码会指向一个空函数

指向了一个空函数

网卡相关初始化,事实上板子用的dm9000网卡已经在前面初始化过了,这里其实什么也没干

这玩意儿是搞LCD的logo用的,不用管它

这个是更新程序用的,将程序从SD里面烧录的相应介质中

到这里start_armboot的使命就结束了,下面将跳进main_loop函数中进行命令解析和操作。

猜你喜欢

转载自blog.csdn.net/lushoumin/article/details/82867583
今日推荐