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 函数:主循环,处理命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85305.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85305.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/85305.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenStack入门体验

1.1云计算概述 相信大家都听到很多的阿里云、腾讯云、百度云等等这些词,那到底什么是云计算?云 计算又能做什么? 1.1.1什么是云计算 云计算(cloud computing)是一种基于网络的超级计算模式,基于用户的不同需求,提供所需的资源,包括计算资源、存储资源、网络资源等。云计算…

RK 安卓10/11平台 HDMI-IN 调试

这篇文章我们介绍一下在安卓9、10、11的版本上,rk平台的hdmi-in功能是如何实现的,下篇文章我们再介绍安卓12之后的版本有了什么变化。希望对在rk平台调试hdmi-in功能的朋友有一些帮助。 目录 (1)概述 (2)…

MongoDB学习记录(快速入门)

MongoDB核心 基础概念 数据库 数据库是按照数据结构来组织、存储和管理数据的仓库。在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失。我们需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。数据库…

阿里一面:微服务拆分需要考虑什么因素?

要拆分微服务,首先我们要了解微服务拆了会有什么问题?怎么合理拆服务? 拆分服务会带来什么问题? 举个电商系统下单扣库存的例子。 对于单体应用,通讯在进程内部进行,下单方法调用扣库存方法,…

3D高斯泼溅和4D高斯

1.高斯函数 想象你往平静的湖水里扔一块石头,水波会以石头落点为中心向外扩散,形成一个逐渐衰减的圆形波纹。高斯函数的形状就和这个波纹类似: 中心最高(石头落点,波峰最强)。越往外,高度&…

comfyui插件和comfyui mac安装

mac comfyui安装包 ComfyUI.zip,官方最新0.3.40,如果后续官方有迭代,可以直接通过git更新源码升级 comfyui插件下载,解压放到custom_nodes目录下,包含 comfyui-animatediff-evolved(视频插件) 和…

面试题SpringCloud

SpringCloud有哪些特征? 分布式/版本化配置服务注册与发现路由服务到服务的调用负载均衡断路器领导选举和集群状态分布式消息传递 SpringCloud核心组件? Eureka 注册中心Ribbon 客户端负载均衡Hystrix: 服务容错处理Feign:声明式Rest客户端Zu…

ASR-PRO语音识别可能出现的问题

ASR-PRO语音识别可能出现的问题 4月份有一天刷到牢大/爱丽丝语音自开关灯设备,心血来潮,博主也是浅尝了一下,由此也总结一下,实现此项目会出现的问题。 在实现爱丽丝开关灯模块时ASRPRO语音识别可能出现的问题如下: …

苍穹外卖--缓存菜品Spring Cache

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如: ①EHCache ②Caffeine ③Redis 常用注解…

个人简历制作MarkDown模板

MarkDown制作个人简历的模板放在了github上,大家如有需求,请自取: https://github.com/QQQQQQBY/ResumeTemplate 介绍一下此模板的特点: 🌸个人面试期间使用的、整理的简历格式,现在分享给大家。 ⭐简历采…

【MySQL数据库 | 第五篇】DDL操作2

文章目录 当前数据库student的数据数据表操作 - 修改&删除📖修改操作增加字段👏案例:向数据表student中添加字段 id修改字段的数据类型【只能修改字段的属性】👏案例:将student表中字段age的属性由tinyint unsigne…

【浏览器插件】如何开发一个Chrome浏览器插件

这篇文章来介绍一下,如何开发一个自己的Chrome浏览器插件程序。 Chrome浏览器插件,其实是让浏览器替我们执行我们自己写的代码,既然要让浏览器执行代码,那么首先,就需要定义一个规范,也就是说,需要让Chrome浏览器知道,你写的程序是一个插件。 这就需要介绍一下插件中…

详细讲解Redis为什么被设计成单线程

Redis 被设计成单线程的原因主要有以下几点,这些原因涉及性能优化、复杂性控制、数据一致性以及适用场景等多个方面: 1. 简化设计与实现 避免锁竞争:多线程环境下,多个线程访问共享资源时需要加锁来保证数据一致性。锁的使用会增…

Hive 逻辑优化器

Optimizer PointLookupOptimizer 作用:把符合条件的 OR 表达式转为 IN。 参数hive.optimize.point.lookup 设置是否开启 PointLookupOptimizer,默认为 true. 参数 hive.optimize.point.lookup.min 控制多少个 OR 表达式转为 IN,默认 31。 例…

ZYNQ Petalinux实战:PCIe直通NVMe固态硬盘,解锁存储性能新极限!

突破SD卡和SATA的速度枷锁!本文将手把手教你如何在ZYNQ平台上通过PCIe接口驱动NVMe固态硬盘。从硬件设计、Linux内核配置到创新性的DMA零拷贝优化,实现2000MB/s+ 的存储性能飞跃,附完整代码解析和性能实测对比。 一、为什么选择PCIe NVMe?存储性能革命 ZYNQ传统存储方案面…

05-mcp-server案例分享-用豆包大模型 1.6 手搓文生图视频 MCP-server发布到PyPI官网

1前言 上期给大家介绍过mcp-server案例分享-用豆包大模型 1.6 手搓文生图视频 MCP-server。当时部署的方式使用了一个私有云SSE的部署。当时缺少一个本地部署的方式,有的小伙伴给我留言能不能有一个本地话部署方式了。今天就给大家带来一个本地化部署的方案。 话不…

MCP Parameters 增加描述

场景:本地MCP开发完后是否发现CLINE上显示的Parameters 显示No description 方法1 :使用参数元数据 (Annotated) 可以使用 Pydantic 的with 类提供有关参数的其他元数据Annotated。这种方法更受欢迎,因为它更现代,并且将类型提示…

STM32 GPIO 寄存器开发

🔧 ​一、核心寄存器概览​ ​寄存器​​功能​​位宽​​关键位域​​GPIOx_CRL/CRH​配置引脚模式(输入/输出/复用/模拟)和输出参数32位每4位控制1个引脚:CNF[1:0](模式) MODE[1:0](速度&am…

powershell 获取 用户及进程列表

在PowerShell中获取用户的进程列表,可以通过几种方法实现。以下是一些常见的方法: 方法1:使用Get-WmiObject Get-WmiObject命令可以用来查询Windows Management Instrumentation (WMI)数据库,从而获取关于进程和用户的信息。 # …

量化面试绿皮书:15. 假币一

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。 15. 假币一 有 10个袋子,每个袋子里有 100个相同的硬币。 在除一个以外的所有袋子中,每枚硬币重10 克。 然而&#x…