前文说到,uboot实现了malloc()可以申请堆内存了,今天这章将会对uboot进行一个了结。
Ip Adderss开发板地址也就是开发板的IP。
gd->bd->bo_ip_addr=getenv_Ipaddr("ipaddr");
通过getenv转string_to_ip实现,完成所见的ip地址。把字符串->点分十进制,因为一个IP地址正好32位,使以用unsigend int进行存储,人看到的点分十进制为192/168.3.1。
MAC地址:网卡或网络设备硬件地址。使用getenv得到ethaddr,将数据放在gd->bd->bi_enetaddr[rag]中。MAC地址有六位组成,对于X210而言是00:40:5C:26:0A:5B,这个数据是默认在uboot中的值,可在config中进行修改初始值,如果save过环境变量,就应该在命令行中进行修改,因为已经存储在SD卡中了。
devices_init()硬件设备初始化,都是驱动设备相关的,根据Linux驱动框架衍生出的结构,该结构从linux内核中移植,集中进行各种硬件的驱动。但是在x210的uboot上没用到,因为用不上,对于x210而言,uboot就是为了去启动内核的,所以没用上,但在内核部分会对相关使用到的硬件进行驱动。
jumptable_init跳转表,初始化gd中的jt值,是对一些函数指针进行函数绑定,目的是使用c语言进行面向对象的操作,本uboot没用上这玩意。
consele_init_r控制台二阶段初始化,前几章出现过相关的内容但那是consele_init_f也就是控制台一阶段初始化。控制台初始化以纯软件形式进行初始化。给相关数据结构填充相应的值,但是在uboot的consele并没有建立缓冲区,其本质还是一个串口,到了内核部分的consele就使用到了缓冲区等机制。
enable_interrupts中断初始化。COSR说到总中断位(CPSR_C)的使能,但在uboot中没有使用到中断,所以是空转。
uboot中经常出现一个以宏为条件编译的代码,一般会用到两种方法:1.调用处进行条件编译。2.提供两种函数体选择(实体函数/空转)。
loadadder与bootfile,都是与内核启动有关,在linux内核中会去参考这些东西(从环境变量中读取到全局变量)。
board_late_init()开发板后期初始化,在x210的uboot中为空转,侧面说明了板级初始化已经基本结束了。
eth_initialze网卡相关初始化。在因为x210已经在board_init中完成了相关内容的初始化,所以结论为空转。
miiphy网卡的mii层初始化,对于x210所使用的DM9000而言来说这一部分是空转。
x210_preboot_init:LCD与logo显示。x210在启动命令之前的初始化。fd_init()是Frame_Buffers像素缓冲器的初始化其大小为显示器的像素长*像素宽*色彩的比特位。LCD_port_init相关gpio的初始化。LCD_reg_init相关寄存器的初始化。init_logo()初始化logo图片,display_logo()显示logo图片。
check menukey to update from sd自动更新,将启动img放到sd卡中(要升级的内核版本),在最后时检查按键进行img升级,按下->updata mode->从sd卡读->烧入INand。不按按键->boot mode->正常运行。这样能快速的烧录系统,用于量产产品。
main_loop死循环,uboot结束。
uboot启动第二阶段总结:主要针对一些硬件与数据结构进行初始化。init_sequence(网卡、机器码、内存传参地址、定时器、gd结构体中的波特率、打印启动信息、cpu时钟设置信息、校验开发板名称、gd中的DDR信息、DDR配置信息表打印)。
mem_malloc_init malloc初始化(堆内存)
mmc_initialize inand/sd卡的初始化(soc相关)
env_relocate 环境变量重定位
ip_addr gd中的ip初始化(bd)
ETH(gd->bd->bienetaddr)相关的初始化
device_init 空转
jumb_table_init 跳转表
console_init 控制台初始化
loadaddr与bootfile 环境变量->全局变量
X210_preboot_init LCD初始化与logo初始化
check_menu_update_from_sd SD卡量产烧录程序
main_loop() 主loop
其中有些空转内容没写
uboot的第一阶段:SOC相关工作;以汇编语言为主;发生在SRAM中。
uboot的第二阶段:开发板相关工作;以c语言为主;发生在DRAM中。
其中移植的重点在于宏定义:x210_sd.h。
特定的硬件初始化放在uboot的二阶段。
值得一提的是串口已经在一阶段实现了。
至此历经8个文章,完成了uboot的大概内容讲解,可喜可贺!