Linux系统移植⑦:uboot启动流程详解-board_init_r执行过程

Linux系统移植⑦:uboot启动流程详解-board_init_r执行过程

在uboot中,board_init_r 是启动流程中的一个关键函数,负责完成板级(board-specific)的后期初始化工作。以下是关于该函数的详细说明:

1. 函数作用

board_init_r 是U-Boot在重定位(relocation)后执行的第二阶段初始化函数,主要完成:

  • 外设初始化:如网卡、存储设备(MMC/NAND)、USB等。
  • 环境变量加载:从Flash或EEPROM中读取环境变量。
  • 命令行准备:初始化命令行解析器,准备接收用户输入。
  • 启动延迟处理:处理bootdelay,等待用户中断或自动启动。
  • 执行主循环:进入main_loop(),处理用户命令或自动启动内核。

其源码如下:

可以看出board_init_r函数中也是通过调用初始化序列 init_sequence_r进行依次初始化

给出部分代码截图和主要函数解释

initr_trace 函数 :如果定义了宏 CONFIG_TRACE 的话就会调用函数 trace_init,初始化和调试跟踪有关的内容。
initr_reloc 函数 :用于设置 gd->flags,标记重定位完成。
initr_caches 函数 :用于初始化 cache,使能 cache。
initr_reloc_global_data 函数 :初始化重定位后 gd 的一些成员变量。
initr_barrier 函数 : I.MX6ULL 未用到。
initr_malloc 函数 :初始化 malloc。
initr_console_record 函数 :初始化控制台相关的内容, I.MX6ULL 未用到,空函数。
bootstage_relocate 函数 :启动状态重定位。
initr_bootstage 函数 :初始化 bootstage 什么的。
board_init 函数 :板级初始化,包括 74XX 芯片, I2C、 FEC、 USB 和 QSPI 等。这里执行的是 mx6ull_alientek_emmc.c 文件中的 board_init 函数。
stdio_init_tables 函数 : stdio 相关初始化。
initr_serial 函数 :初始化串口。
initr_announce 函数 :与调试有关,通知已经在 RAM 中运行。
power_init_board 函数 :初始化电源芯片,正点原子的 I.MX6ULL 开发板没有用到。
initr_flash 函数 :对于 I.MX6ULL 而言,没有定义宏 CONFIG_SYS_NO_FLASH的话函数 initr_flash 才有效。
initr_nand 函数 :初始化 NAND,如果使用 NAND 版本核心板的话就会初始化NAND。
initr_mmc 函数 :初始化 EMMC,如果使用 EMMC 版本核心板的话就会初始EMMC,
initr_env 函数 :初始化环境变量。
initr_secondary_cpu 函数 :初始化其他 CPU 核, I.MX6ULL 只有一个核,因此此函数没用。
stdio_add_devices 函数 :各种输入输出设备的初始化,如 LCD driver, I.MX6ULL使用 drv_video_init 函数初始化 LCD。
initr_jumptable 函数 :初始化跳转表。
console_init_r 函数 : 控制 台初 始 化, 初 始化 完 成以 后 此函 数会 调 用stdio_print_current_devices 函数来打印出当前的控制台设备
interrupt_init 函数 :初始化中断。
initr_enable_interrupts 函数 :使能中断。
initr_ethaddr 函数 :初始化网络地址,也就是获取 MAC 地址。读取环境变量"ethaddr"的值。
board_late_init 函数 :板子后续初始化,此函数定义在文件 mx6ull_alientek_emmc.c中,如果环境变量存储在 EMMC 或者 SD 卡中的话此函数会调用 board_late_mmc_env_init 函数初始化 EMMC/SD。会切换到正在时候用的 emmc 设备
initr_net 函数 :初 始 化 网 络 设 备 , 函 数 调 用 顺 序 为 initr_net->eth_initialize->board_eth_init()
run_main_loop 函数:主循环,处理命令。

相关推荐
YouEmbedded18 分钟前
解码UDP
linux·udp
w***48821 小时前
Linux安装redis
linux·运维·redis
python百炼成钢3 小时前
28.嵌入式 Linux LED 驱动开发实验
linux·运维·驱动开发
西风未眠4 小时前
高效编辑之vi/vim常用快捷键汇总
linux·编辑器·vim
_Stellar4 小时前
Linux 服务器管理 根目录文件夹权限设置 基于用户组实现安全共享
linux·服务器·安全
LUCIFER5 小时前
驱动开发:详细分析 DTB、DTS、DTSI、DTBO 的区别、用途及它们之间的关系
linux·服务器·驱动开发
liuyao_xianhui6 小时前
版本控制器git--gdb/cgdb
linux·运维·服务器·git
CS_浮鱼6 小时前
【Linux进阶】mmap实战:文件映射、进程通信与LRU缓存
linux·运维·c++·缓存
chuxinweihui7 小时前
应用层协议 HTTP
linux·服务器·网络·网络协议·http
xu_yule7 小时前
Linux_16(多线程)信号量+基于环形队列的生成消费模型+自选锁+读写锁
linux·运维·服务器