本文诊断MPC83XX处理器,描述uboot的启动流程。
Uboot启动过程如下:
1. Start.s,设置IMMR寄存器,复位时IMMR映射到0xFF400000,该空间与Flash的影射空间冲突,启动后重新映射到0xE0000000;
2. Start.s,设置MPC8349的E300核心;
3. Start.s,初始化MPC8349的LCS0,该位置是Flash0,存放在复位控制字和Uboot代码;
4. Start.s,设置MPC8349的BAT表,该表完成物理地址到虚拟地址的影射;
5. Start.s,使能地址译码、使能CACHE;
6. 将CACHE当作RAM,初始化C语言运行环境;
7. Start.s,调用cpu_init_f C函数;
8. cpu_init_f函数,初始化各种CPU相关的寄存器;
9. Start.s,跳转到board_init_f函数,不返回;
10. board_init_f函数,根据init_sequence表,逐个运行初始化函数;
11. init_sequence表,调用init_timebase函数,初始化时钟基准;
12. init_sequence表,调用env_init函数,初始化uboot环境参数;
13. init_sequence表,调用init_baudrate函数,初始化调试波特率;
14. init_sequence表,调用serial_init函数,初始化串口硬件;
15. init_sequence表,调用console_init_f函数,初始化控制台;
16. init_sequence表,调用display_options函数,初始化显示参数;
17. init_sequence表,调用print_clock_conf打印MPC8349板卡信息;
18. init_sequence表,调用checkcpu函数,读取CPU ID,打印CPU版本号;
19. init_sequence表,调用init_func_ram函数,初始DDR RAM;
20. board_init_f函数,在DDR RAM中建立C语言运行环境以及uboot环境;
21. board_init_f函数,代码重定位,跳转到main_loop函数,不返回;
至此,uboot启动完毕,在main_loop函数中,执行交互式的底层操作,可对用户输入的各种命令进行解析并执行。这些命令包含以下的功能:从以太网下载Linux内核映像和文件系统映像并在RAM中执行、将下载到RAM的内核和文件系统映像烧写到Flash、从Flash启动内核并加载文件系统等。
本文转自:http://blog.163.com/mcu_expert/blog/static/131245153201082810258785/