第一次写博客,简单记录下自己这周对uboot移植的理解吧!
——小白记录,谨慎参考,敬请指导
1.uboot启动过程
(1)BL0:BL0文件是存放在CPU内部IROM中的一段固化代码,CPU上电后,首先运行BL0文件
作用:初始化系统时钟,设置看门狗,初始化堆栈,加载BL1
(2)BL1:是一段外部代码,存放在SD卡或者是NANDFlash中
作用:初始化RAM,关闭Cache,设置堆栈,加载BL2
(3)BL2:是指代码重定向后在内存中执行的uboot完整代码
作用:初始化其他外设,加载内核
三者之间的关系:(Interal ROM固化代码)BL0将BL1(bootloader的前16KB--BL1)加载到iRAM;BL1然后在iRAM中运行将BL2(剩下的bootloader)加载到SDRAM;BL2加载内核,把OS在SDRAM中运行起来,最终OS是运行在SDRAM(内存)中的。
这三个文件之间的关系就是:BL0 运行时会将 BL1 拷贝到 CPU 的 IRAM 中,然后执行BL1;BL 文件执行起来之后会先进行内存的初始化,之后将 BL2 文件拷贝到外部内存中
2.uboot基础配置
执行命令:make origen_config
调用:mkconfig——生成config.mk与config.h
执行命令:make all
直接生成 uboot.bin 即BL2文件
要想做好uboot移植,就必须学会配置相关的硬件信息。这里在提三个文件,..board/samsung/smdkc210/lowlevel_init.s
../cpu/arm_cortexa9/uboot.lds ../cpu/arm_cortexa9/start.s
lowlevel_init.s:硬件初始化配置
uboot.lds: 链接脚本就是程序链接时的的参考文件,其目的是描述输入文件中各段应该怎么样被映射到输出文件,
以及程序运行时的内存布局等等
start.s:关闭看门狗,关中断,设置时钟,SDRAM初始化
要想做好硬件信息的配置,首先要能读懂芯片手册相应功能所赋予的地址,这样才能在配置的时候进行调用。
例子1:为Exynos4412开发板配置led
第一步:查看Exynos4412开发板原理图,确定led所连接的cpu引脚
由此可知:LED3对应的芯片引脚为GPK1_1
第二步:修改start.s,点亮LED3
在修改start.s之前,我们需要知道GPK1_1控制寄存器的地址,对硬件设备的操作,本质上也就是对CPU引脚所对应寄存器的操作。对寄存器的操作无外乎读/写操作。下面我们查看数据手册得到GPK1_1控制寄存器地址。
控制寄存器:Base Address: 0x1100_0000 偏移地址:0x0060
这里我们需要设置GPK1_1的控制寄存器为输出,GPK1CON寄存器占4个字节,其中4-7位用于对GPK1_1的配置,知道了这些信息,我们开始在start.s中添加点灯代码:
/* LED Test Code */
ldr r0, =0x11000060 //得到GPK1CON寄存器地址
ldr r1, [r0] //将GPK1CON寄存器地址中的数据付给r1
bic r1, r1, #0xf0 //将r1中的数据与0xf00的非即0x11进行与运算,将控制GPK1_1的位清零
orr r1, r1, #0x10 //将控制GPK1_1的位设置为1,由0x1 = Ouput可知,此处将GPK1_1设置为输出
str r1, [r0] //将r1的值写到GPK1CON寄存器所在的地址中
至此,设置GPK1_1所对应的引脚为输出。做好了点亮LED3的第一步,下一步个人认为是设置GPK1_1对应的数据位,就不写了,哈哈哈,终于写了那么多了,不算完,慢慢补充......