GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析
在理解bootloader后,花些时间重新学习了开源软件的makefile和相关脚本之后,自己的u-boot移植工作也比较顺利的完成了:
移植环境:
ubuntu 12.04
U-Boot 2012.07 (Nov 28 2012 - 20:05:48)
arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2009q1-203) 4.3.3
GNU ld (Sourcery G++ Lite 2009q1-203) 2.19.51.20090205
我移植的uboot只支持nand flash,原因是手头没办法烧写nor flash,所以不敢去动.支持tftp下载各种镜像文件.
给出patch下载的地址:http://download.csdn.net/detail/dndxhej/4833784
因为是采用的nand_spl方式从nand flash启动,将前面4K的镜像执行过程和后面252K大小的镜像执行过程做一个大概的描述性的分析,不想写的过于具体,因为知道过程后和必备的知识后,如果哪里出了问题,那时候也可以一句一句代码的查问题.
前面4K代码在内部sram中执行的步骤是:
1.设置cpu为svc模式
2.关闭开门狗和中断
3.初始化系统时钟
4.禁用MMU和Cache
5.初始化sdram控制器
6.设置sp,跳到刚才提到的nand_boot.c里面的nand_boot函数,这个函数初始化nand的控制器,并将4K之后的u-boot.bin image从nand中load到sdram中,然后跳转到u-boot.bin image的开始处继续后续的工作
后面252K代码在sdram中执行的步骤是:
1.依旧是从start.S汇编开始call_board_init_f,设置好sp后跳到arch/arm/lib/board.c中的board_init_f函数
2.board_init_f完成部分初始化工作后跳转到汇编写的relocate_code
3.relocate_code完成重定位工作后跳转到board_init_r
4.board_init_r函数完成后续的初始化工作后跳转到main_loop,根据延时进入引导os的过程,如果打断这个过程,就进入uboot的命令行模式
简短的分析到这里了,对uboot移植做一个小结:
首先,要有信心解决移植过程中遇到的各种问题
其次,要具备解决各种问题的知识要点,大概列举有makefile,shell脚本,简单的正则表达式,编译链接和链接脚本的写法,arm体系结构和汇编语言,仔细阅读相关的datasheet.
虽然uboot移植成功了,但是uboot作为一款强大的bootloader,还有很多有意思的东西值得我们去学习,比如说:
1.hush的实现,uboot的命令行模式就是基于hush实现的,linux下的shell也是基于这个的,这个处理还是相当复杂的.
2.uboot下的网络实现了物理层(DM9000),网络层(ICMP),传输层(UDP)和应用层(tftp)的具体实现,以后要深入学习网络,可以从uboot实现的简单网络协议栈入手,再深入到linux下的网络.
还有很多值得说道的地方,就不详细说了,路漫漫,但是路在脚下
更多推荐
所有评论(0)