首先看一个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语言调用汇编标志和汇编调用汇编标志搞混,具体分析方法参照我的上一篇博客。
博客链接地址为:/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函数中进行命令解析和操作。