2017.01 U-Boot启动流程源码详解:关键步骤与初始化
本文档深入分析了U-Boot 2017.01版本的启动过程源码,主要关注Sunxi架构下的ARMv7处理器,如AM33XX平台。整个启动流程可以大致分为以下几个阶段: 1. **SPL阶段(Second Stage Loader)**: SPL是U-Boot的早期引导部分,首先在`u-boot-spl.lds`链接文件中,它链接了`vectors.S`和`start.S`,这是关键的初始化代码。`save_boot_params`函数保存系统启动参数,接着设置系统服务模式并关闭非安全中断(FIQ和IRQ)。`cpu_init_cp15`负责禁用MMU和缓存,以保护系统在初始状态下不受干扰。 2. **CPU初始化**: - `cpu_init_crit`函数进一步执行低级别初始化,通过`lowlevel_init.S`设置堆栈空间。 - `s_init`函数在`arch/arm/mach-ompa2/am33xx/board.c`中完成,涉及RTC(实时时钟)初始化以及特定于`AM33XX`板子的初始化。 3. **CRT0初始化**: - `_main`函数在`arch/arm/lib/crt0.S`中执行,这里包括更高级别的初始化。 - `board_init_f`是AM33XX板子的初始化函数,负责设置硬件状态,如禁止看门狗、配置串口等。 - `early_system_init`函数执行一系列早期系统设置,比如禁用看门狗、设置串口配置、初始化时钟等,这些操作在`board/ti/am335x/board.c`和`arch/arm/mach-ompa2/am33xx/clock.c`中完成。 4. **特定平台定制**: - `uart_soft_reset`函数对串口进行软件重置,确保通信初始化正确。 这个文档对于理解U-Boot启动流程、学习ARMv7架构下嵌入式系统的设计和调试非常有帮助,特别是对于嵌入式开发人员或研究者来说,它提供了深入了解底层硬件和操作系统交互的重要线索。阅读和研究这部分代码有助于优化启动性能,诊断硬件问题,或者进行定制化功能的添加。
u-boot 2017.01启动过程分析
2019-08-23
***********************************************/
/* SPL阶段 */
u-boot-spl.lds(arch/arm/cpu/armv7/sunxi/u-boot-spl.lds)
|--> vectors.S(arch/arm/lib/vectors.S)
|--> start.S(arch/arm/cpu/armv7/start.S)
|--> save_boot_params
|--> /*set SVC mode .. disable FIQ and IRQ*/
|--> cpu_init_cp15(arch/arm/cpu/armv7/start.S) /*disable MMU stuff and caches*/
|--> cpu_init_crit(arch/arm/cpu/armv7/start.S)
|--> lowlevel_init(arch/arm/cpu/armv7/lowlevel_init.S) /* 板级初始化,设置栈空间 */
|--> s_init(arch/arm/mach-ompa2/am33xx/board.c)
|--> rtc_only(arch/arm/mach-ompa2/am33xx/board.c)
|--> _main(arch/arm/lib/crt0.S )
|--> board_init_f(arch/arm/mach-ompa2/am33xx/board.c)
|--> early_system_init(arch/arm/mach-ompa2/am33xx/board.c)
|--> watchdog_disable(arch/arm/mach-ompa2/am33xx/board.c) /* 禁止看门狗 */
|--> set_uart_mux_conf(board/ti/am335x/board.c) /* 设置串口 */
|--> setup_early_clocks(arch/arm/mach-ompa2/am33xx/clock.c)
|--> uart_soft_reset(arch/arm/mach-ompa2/am33xx/board.c)
|--> board_early_init_f(arch/arm/mach-ompa2/am33xx/board.c)
|--> prcm_init(arch/arm/mach-ompa2/am33xx/clock.c)
|--> set_mux_conf_regs(board/ti/am335x/board.c)
|--> sdram_init(board/ti/am335x/board.c) /* 初始化DDR */
|--> board_init_r(common/spl/spl.c)
|--> gd->bd = &bdata /* gd是保存在r9寄存器的,即r9保存的是指向gdata的指针 */
|--> timer_init(arch/arm/cpu/armv7/sunxi/timer.c) /* 初始化时钟 */
|--> save_omap_boot_params(arch/arm/mach-omap2/boot-common.c) /* 保存启动的device和mode */
|--> preloader_console_init(common/spl/spl.c) /* 初始化gd部分数据结构 波特率 */
|--> serial_init( drivers/serial/serial.c) /* 串口初始化 */
|--> am33xx_spl_board_init() /* 设置频率 */
|--> boot_from_devices(common/spl/spl.c)
|--> spl_ll_find_loader(common/spl/spl.c)
|--> ll_entry_start(include/linker_lists.h)
|--> SPL_LOAD_IMAGE_METHOD("MMC1", 0, BOOT_DEVICE_MMC1, spl_mmc_load_image)(common/spl/spl_mmc.c)
|--> spl_mmc_load_image(common/spl/spl_mmc.c)
|--> mmc_load_image_raw_os(common/spl/spl_mmc.c)
|--> mmc_load_legacy(common/spl/spl_mmc.c)
|--> spl_parse_image_header(common/spl/spl.c) /* 解析 header */
|--> jump_to_image_no_args(common/spl/spl.c)
|--> image_entry /* 结束SPL过程,跳转到u-boot */
/* u-boot阶段 */
u-boot.lds(board/ti/am335x/u-boot.lds)
|--> vectors.S(arch/arm/lib/vectors.S)
|--> start.S(arch/arm/cpu/armv7/start.S)
... ...
|--> _main(arch/arm/lib/crt0.S )
|--> board_init_f_alloc_reserve(common/init/board_init.c) /* 为u-boot的gd结构体分配空间 */
|--> board_init_f_init_reserve(common/init/board_init.c) /* 将gd结构体清零 */
|--> board_init_f(common/board_f.c) /* 将gd结构体清零 */
|--> initcall_run_list(init_sequence_f) (lib/initcall.c)
|--> init_sequence_f[](common/board_f.c) /* 函数指针数组 */
|--> /* 初始化各种外设,比如使能看门狗,串口打印,控制台,并保存板子信息到gd等等 */
剩余11页未读,继续阅读
- 粉丝: 208
- 资源: 46
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展