您的位置:首页 > 其它

uboot移植总结

2014-06-27 21:18 197 查看
几经周折终于完成uboot的移植,下面对uboot的移植过程进行一下总结:

首先uboot是嵌入式开发过程中最常用的bootloader,它完成了硬件的初始化,并引导内核启动。Uboot的目的就是初始化硬件电路,保存某些信息给内核,然后把内核复制到SDRAM中,最终把控制权交给内核。如果我们不需要uboot的一些复杂的命令我们完全可以自己写一段代码来启动内核。

移植linux内核之前我们要先看一下README,了解一下配置项的作用,以及移植过程。

1 uboot的启动过程分为两个阶段,第一阶段主要完成基本的硬件初始化。主要包括这一阶段由cpu/XXX/start.S 以及board/your_board/lowlevelinit.S完成。

1) 设置中断向量表

2) 进入SVC模式

3) 禁止中断

4) 设置时钟(也可以在stage2设置,s3c2410源代码则在stage1和stage2均进行了设置)

5) 内存初始化(由lowlevelinit.S完成,这样便可以使用SDRAM)

6) 设置栈,为调用C函数做准备

7) 复制uboot的代码到SDRAM中(如果从nandflash启动则需要初始化nandfalsh,并编写复制代码的程序,自己写的这段代码必须在前4K中,可以再uboot.lds设置)

8) 对未初始化数据段清零(这些段的定义从链接文件uboot.lds传入,还有一些宏也从某些文件中传入,可以使用grep “宏名” ./ -nr 搜索)

9) 然后是stage1最后执行的语句,跳转到stage2 的入口点。Ldr pc=,_start_armboot

第二阶段则进行更复杂的操作,

1) 首先是lib_arm/board.c,start_armboot在该文件中定义。

2) 然后是CPU,gpio的初始化(初始化RAM,设置tag的存放位置,进一步的时钟初始化,设置输出终端等)。

3) 接着会初始化norfalsh,nandflash,网络接口。(这写是为了完成分区表的建立,实现Flash的读写,网络启动等,这些并不是必须的,可以参考doc中的READMe.XXX,来配置头文件以及如何编写我们自己的初始化函数)

4) 最后调用thekernerl();函数启动内核。

在移植过程中可能会出现很多问题,和错误要多借助网络,还有许多代码我们可以参考内核,或者其它的bootloader,这样可以进一步提高移植效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: