u-boot做了些什么 : 通俗来说就是设置函数开始存放的位置
根据链接程序确定了 程序主入口 接下来的文本段的排列顺序(这将是启动
最重要的部分)
最先执行start.S 内的代码(这是由链接程序决定的):这是对cpu最初始的操作!!!
- 放在最前面的最开始执行。正常情况下直接跳转到start code执行,但是在这条语句后面紧跟着中断向量表,这些是cpu硬件决定的,必须定义在固定的地址。
- 首先 让cpu进入SVC模式(管理员模式),关看门狗,关所有的中断。
- 设置时钟。直接操作时钟寄存器,设置时钟的分频比
- 跳入cpu init crit函数, 对系统总线进行初始化,只有经过初始化,norflash sdram才能被使用
- 检查现在是否在内存中运行,否则,要将代码拷贝到sdram的 TEXT BASE位置中运行。从norflash 或者nandflash中拷贝需要另行判断。
- 经过以上的代码,现在uboot肯定是在sdram上运行了,然后分配堆栈地址大小。
- 跳转到 start armboot执行(这是第二阶段代码,定义在lib_arm/board.c中)。
lib_arm/board.c 中做了些什么,就是做了一些板载的外设的初始化工作,为接下来程序运行做准备。比如初始化网卡,串口,lcd,sd卡等等外设。
网上关于uboot的移植已经讲得很详细,我这里就仅仅只是谈谈我做了几天的认识,不一定对。
纸上得来终觉浅,绝知此事要躬行。