转帖经验。
经过将近两个星期的时间,总算移植好了一个勉强能支持基本功能的u-boot了,泪流满面。在刚刚开始移植uboot时走了很多弯路,不过**下来,也算是苦中有乐!
一开始是照着友善的移植Uboot手册上改代码,虽然也看了前半部分的uboot执行流程,但是到了改代码的时候还是很多东西不懂,就照着做,出现各种编译错误,慢慢改,一路下来,最后满怀期待的上电,超级终端里却无我所期待的字样。因为对很多代码不懂,也不知道到底是哪里出了错,甚是迷茫。
经过几次的尝试,还是没有得到最后想要的结果,几乎就要放弃。冷静下来,好好想了想,觉得自己的方法就不对,于是从头再把uboot的执行流程重新仔细学了一遍,大家在学start.S这个文件时基本不会有什么问题,建议大家可以在这个文件下先不用实现nand flash相关部分代码,只要能实现将代码从nor flash搬运即可(其实从nor flash搬运到sdram相关代码Uboot源码已经实现,就是relocate标号),关键的是跳转到lib_arm/board.c这个文件里的函数后就不知道是什么情况了,其实它就是执行一系列的初始化,每个函数基本初始化一个相应的部分,而且这些函数能不能执行都是由我们在include/configs/mini2440.h这个头文件中定义的所有宏来决定的,因此我根据自己的经历建议大家在确保start.S这个文件正确执行的前提下先使得我们自己的uboot执行board_init这个函数,这个函数里的一些修改比较简单,能运行后再使我们的serial_init函数能运行正确,其余board.c下面的很多初始化的函数的不用管,都给注释掉。因为这样,我们的Uboot如果能运行正确的话,我们是可以在串口看到一些相应的基本信息,这样就有助于我们的观察了,就算以后加入什么功能,哪里出了问题,我们也可以用printf输出到串口进行观察。
接下来就是一步步完善uboot功能的时刻了,大家可以根据自己实际的需求去增加一些功能,其实主要就是一些初始化(主要在比如实现从nand flash里面启动,这个你可以照着友善的手册(而且使用他们的nand_read.c这个文件);又比如你要实现网络,在mini2440.h里面增加dm9000相关的宏,然后在board.c里面将cs8900相关初始化的代码更换成dm9000的代码,uboot支持dm9000驱动,所以比较简单,当然,完善Uboot的功能可以照着友善移植uboot手册,关键是要理解相关宏的作用。
如果这样**下来,相信你对Uboot的执行流程会有一个真正比较深刻的理解,还是这个道理,从简单过渡到复杂,最后移植完成后最好回头把相关的部分重新温习一下,这样相信以后就算我们在工作中遇到新的板子,我们应该也会知道从哪里开始,怎么去深入。 |