打造属于自己的uboot

对bootloader我一直是很敢兴趣的,之前上嵌入式课的时候由于抽不出时间一直没有好好研究当时使用的vivi。幸好最近忙里偷闲,以ok6410开发板为平台,对于uboot进行了一番不算很深入的研究。


我对bootloader基本上没啥了解,所以本质上是从0开始学起。一开始不知道从哪里入手,幸好有一些开发板的资料,当然包括移植好的uboot,可惜版本有点老,是1.1.6的,不过不失为很好的参考资料。


我将最新版的uboot(2011.12)作为研究版本。本以为有1.1.6版的参考,移植工作应该会很顺利,但是一看源码才发现,两个版本的结构有较大的差别。而且两个版本对smdk6410的一些设置命名也完全不同,在1.1.6中,都是以CFG_开头的,而新版中则改为了CONFIG_。所以不能直接依样画葫芦照搬,还是要从原理出发。


由于新版的uboot中已经加入了对6410的支持,研究过程相对变得方便许多。首先我将2011-12-uboot中有关6400的文件代码都改为了6410,并且删除一些不需要的文件。虽然此版本中的uboot已经支持6410的nand启动,但是使用编译过后的u-boot-nand.bin,串口终端还是没有任何显示。可能相应的nand驱动不符合吧~于是还是按照1.1.6版本的思路,对uboot进行移植。在研究工程中,我一度想放弃,因为实在没有思路,也没有调试的方法。一次偶然的机会,我发现了一个较为实用的调试手段,就是通过arm-linux-objdump工具查看uboot的反汇编代码,具体命令为:arm-linux-objdump -d u-boot > info.txt。反汇编代码帮助了我许多,让我理解了uboot的一些工作机制。


s3c6410的启动方式有很多种,详情可以参看点击打开链接。简单来讲,有两个模式是需要注意的,一个是IROM启动,另一个就是NAND启动。一开始我使用sd卡烧写uboot,其实就是irom启动。在s3c6410出厂时,里面有一段固化程序(固件),一旦选择IROM方式启动,这部分程序会首先运行,这部分程序被称为bootloader0,BL0。主要完成一些初始化工作。然后根据相应管脚的设置确定具体的设备,并从制定的区域读取4KB的程序到指定的区域运行,这段代码被称为BL1。然后再跳转到BL2。具体的,飞凌提供的方案的这样的:提供给用户mmc.bin用来烧写u-boot.bin。我对mmc.bin的理解是这样的:飞凌提供的SD_Writer.exe将MMC.bin中的BL1和BL2写入到SD卡中相应的位置,然后选择IROM方式启动后,在IROM(32KB)的固化程序将SD卡中的BL1 copy至steppingstone区域(SRAM),然后BL1将BL2 copy至SDRAM,完成NAND和一些硬件的初始化,然后把保存在SD卡中的uboot和Zimage copy到内存中,并写入NAND保存,为Nand启动做准备。总结来说,mmc.bin其实就是uboot1.1.6编译得到的,只是启动方式是movinand,所有的原理和uboot是一致的。BL0将BL1加载到steppingstone区域,然后BL1开始初始化硬件,并将u-bootcopy到nand中。当我们烧写完uboot再从nand启动时,从0x0c000,0000,就是steppingstone(其实就是nand 0x0的映射,硬件完成此映射工作)开始执行,对硬件进行初始化,然后将uboot从0x0 copy到ram中,即0x57e00,0000 (ram的起始地址为0x5000,0000)。


uboot的大致工作流程如下:

1. 程序的入口是start.s,在start.s中条用其他函数

2. 首先比较重要的是初始化一些基本的硬件设备,包括关闭看门狗之类的。在lowlevel_inis.s中完成,主要是uart,nand,系统时钟以及memory的一些初始化。

3. 然后调用copy_from_nand,将uboot从nand copy到ram中

4. 验证copy的正确性

5. 跳转到start_armboot,即BL2。使用c语言完成一些高级初始化工作。copy linux kernel到内存中,比如从annd的0x40000 copy 到ram的0x5000,8000.


uart的初始化若正确,则串口终端就可以显示内容了;memory的初始化若不正确,可能在copy code from nand to ram的时候会有错误。另外要注意的是,由于steppingstone的大小为4KB,所以一些关键性代码必须放在uboot的前4kb中,可以通过连接脚本(uboot.lds)来指定。也就是说在前4KB的代码,必须要完成copy from nand to ram。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章