新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析

GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析

作者:时间:2016-11-26来源:网络收藏
在理解bootloader后,花些时间重新学习了开源软件的makefile和相关脚本之后,自己的u-boot移植工作也比较顺利的完成了:

移植环境:

本文引用地址:http://www.eepw.com.cn/article/201611/321712.htm

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下的网络.

还有很多值得说道的地方,就不详细说了,路漫漫,但是路在脚下



评论


相关推荐

技术专区

关闭