1、uboot
(1)uboot的Makefile
过于复杂,目前不搞。
(2)uboot的启动流程
复杂。
可从uboot.lds文件入手,参考博客:https://www.cnblogs.com/niezhongle/p/11088687.html
具体总结如下:
阶段一:
第一步,肯定是定义入口在哪里,于是uboot 的 stage1 代码通常放在 start.s 文件中,它用汇编语言写成
该工作可通过修改连接器脚本来完成。
第二步, 先要想到异常,于是设置异常向量,(与中断相关)
第三步, 设置 CPU 的模式为 SVC 模式
第四步, 关闭看门狗
第五步, 禁掉所有中断
第六步, 设置以 CPU 的频率
第七步, 关闭看门狗
第八步, 禁掉所有中断
第九步, 设置 CP15, 失效指令(I)Cache 和数据(D)Cache 后, 禁止 MMU 与 Cache。
第十步, 配置内存区控制寄存器
第十一步, 安装 U-BOOT 使的栈空间
第十二步, BSS 段清 0
第十三步, 搬移 Nand Flash 代码
阶段二:
进入C代码:
第一步,指定初始函数表:
第二步. 配置可用的 Flash 区
第三步. 初始化内存分配函数
第四步. nand flash 初始化
第五步, 初始化环境变量
第六步, 外围设备初始化
第七步,I2C 总线初始化 i2c_init();,
第八步,LCD 初始化 drv_lcd_init();
第九步,VIDEO 初始化 drv_video_init();
第十步, 键盘初始化 drv_keyboard_init();
第十一步,系统初始化 drv_system_init();
第十二步,初始化网络设备
初始化相关网络设备,填写 IP、MAC 地址等。
第十三步, 进入主 UBOOT 命令行
进入命令循环(即整个 boot 的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
for (;;) {
main_loop (); /* 在 common/main.c */
}
还需要再学习这方面
2、uboot的移植
uboot的移植一般只能对芯片厂家提供的uboot进行修改移植,我使用的是nxp的im6ull