uboot启动流程-board_init_r函数执行过程

一.  uboot启动流程

本文来了解 board_init_r 函数执行过程。_main函数会调用到 board_init_r 函数。

二.   board_init_r函数执行过程

_main 函数会调用到 board_init_r 函数。

_main 函数在 uboot的  /arch/arm/lib/crt0.S 文件中。_main函数中,执行完 relocate_vectors 函数(即重定位中断向量表)后,然后清 BSS 段,之后就是调用 board_init_r函数。

前面有文章讲解了 board_init_f 函数,在此函数里面会调用一系列的函数来初始化一些外设和 gd 的成员变量。但是 board_init_f 函数并没有初始化所有的外设,还需要做一些后续工作,这些后续工作就是由 board_init_r 函数来完成的,board_init_r 函数定义在文件 common/board_r.c 中,关键的代码如下:

void board_init_r(gd_t *new_gd, ulong dest_addr) 
{......if (initcall_run_list(init_sequence_r))hang();......
}

initcall_run_list 函数来执行初始化序列 init_sequence_r init_sequence_r 是一个函数集合, init_sequence_r 也定义在文件 common/board_r.c 中,由于 init_sequence_f 的内容 比较长,里面有大量的条件编译代码,这里为了缩小篇幅,将条件编译部分删除掉了,去掉条 件编译以后的 init_sequence_r 定义如下:
init_fnc_t init_sequence_r[] = {initr_trace, initr_reloc, initr_caches, initr_reloc_global_data, initr_barrier, initr_malloc, initr_console_record, bootstage_relocate, initr_bootstage, board_init, /* Setup chipselects */ stdio_init_tables, initr_serial, initr_announce, INIT_FUNC_WATCHDOG_RESETINIT_FUNC_WATCHDOG_RESETINIT_FUNC_WATCHDOG_RESETpower_init_board, initr_flash, INIT_FUNC_WATCHDOG_RESETinitr_nand, initr_mmc, initr_env, INIT_FUNC_WATCHDOG_RESETinitr_secondary_cpu, INIT_FUNC_WATCHDOG_RESETstdio_add_devices, initr_jumptable, console_init_r, /* fully init console as a device */ INIT_FUNC_WATCHDOG_RESET interrupt_init, initr_enable_interrupts, initr_ethaddr, board_late_init, INIT_FUNC_WATCHDOG_RESET INIT_FUNC_WATCHDOG_RESETINIT_FUNC_WATCHDOG_RESETinitr_net, INIT_FUNC_WATCHDOG_RESETrun_main_loop, };

2 行, initr_trace 函数,如果定义了宏 CONFIG_TRACE 的话就会调用函数 trace_init ,初始化和调试跟踪有关的内容。
3 行, initr_reloc 函数用于设置 gd->flags ,标记重定位完成。
4 行, initr_caches 函数用于初始化 cache ,使能 cache
5 行, initr_reloc_global_data 函数,初始化重定位后 gd 的一些成员变量。
6 行, initr_barrier 函数, I.MX6ULL 未用到。
7 行, initr_malloc 函数,初始化 malloc
8 行, initr_console_record 函数,初始化控制台相关的内容, I.MX6ULL 未用到,空函数。
9 行, bootstage_relocate 函数,启动状态重定位。
10 行, initr_bootstage 函数,初始化 bootstage 什么的。
11 行, board_init 函数,板级初始化,包括 74XX 芯片, I2C FEC USB QSPI 等。
这里 board_init 函数调用的是 mx6ull_alientek_nand.c文件中(因为这里我所使用的是 Nand-Flash版的开发板)
12 行, stdio_init_tables 函数, stdio 相关初始化。
13 行, initr_serial 函数,初始化串口。
14 行, initr_announce 函数,与调试有关,通知已经在 RAM 中运行。
18 行, power_init_board 函数,初始化电源芯片,正点原子的 I.MX6ULL 开发板没有用到。
19 行, initr_flash 函数,对于 I.MX6ULL 而言,没有定义宏 CONFIG_SYS_NO_FLASH 的话函数 initr_flash 才有效。但是 mx6_common.h 中定义了宏 CONFIG_SYS_NO_FLASH ,所以
此函数无效。
21 行, initr_nand 函数,初始化 NAND ,如果使用 NAND 版本核心板的话就会初始化 NAND

22 行, initr_mmc 函数,初始化 EMMC ,如果使用 EMMC 版本核心板的话就会初始化
EMMC。就会有 MMC打印信息。
23 行, initr_env 函数,初始化环境变量。
25 行, initr_secondary_cpu 函数,初始化其他 CPU 核, I.MX6ULL 只有一个核,因此此
函数没用。
27 行, stdio_add_devices 函数,各种输入输出设备的初始化,如 LCD driver I.MX6ULL
使用 drv_video_init 函数初始化 LCD 。我所使用的开发板未带LCD屏幕,所以用不到。

28 行,initr_jumptable 函数,初始化跳转表。

29 行 , console_init_r 函 数 , 控 制 台 初 始 化 , 初 始 化 完 成 以 后 此 函 数 会 调 用
stdio_print_current_devices 函数来打印出当前的控制台设备。串口打印如下:
In:    serial
Out:   serial
Err:   serial

31 行, interrupt_init 函数,初始化中断。
32 行, initr_enable_interrupts 函数,使能中断。
33 行, initr_ethaddr 函数,初始化网络地址,也就是获取 MAC 地址读取环境变量 “ ethaddr” 的值。
34 行, board_late_init 函数,板子后续初始化,此函数定义在文件 mx6ull_alientek_emmc.c
中,如果环境变量存储在 EMMC 或者 SD 卡中的话此函数会调用 board_late_mmc_env_init 函数
初始化 EMMC/SD 。会切换到正在时候用的 emmc 设备。

38 行 , initr_net 函 数 , 初 始 化 网 络 设 备 , 函 数 调 用 顺 序 为 :
initr_net->eth_initialize->board_eth_init()

串口打印如下:

Net:   FEC1

40 行,run_main_loop函数 ,是主循环,处理 uboot命令行模式下输入的 命令。

uboot命令行模式:开发板上电时,uboot启动时会进入几秒的倒计时,如果在倒计时之前按下 "Enter"回车键,会进入 uboot命令行模式。uboot命令行模式下可以输入命令,开发板可以接收到 输入的命令。如下就是进入了uboot命令行模式:

以上就是 board_init_r函数大体执行过程。

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

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

相关文章

JAVA毕业设计098—基于Java+Springboot的在线教育课程视频(源码+数据库)

基于JavaSpringboot的在线教育课程视频(源码数据库)098 一、系统介绍 本系统分为管理员、教师、用户三种角色(角色菜单可自行分配) 用户功能: 注册、登录、课程搜索、视频观看、课程资料发布、资料浏览、用户中心、我的发布、通知信息、密码修改 教师功能&…

IP 子网划分(VLSM)

目录 一、 为什么要划分子网 二、如何划分子网 1、划分两个子网 2、划分多个子网 一、 为什么要划分子网 假设有一个B类IP地址172.16.0.0,B类IP的默认子网掩码是 255.255.0.0,那么该网段内IP的变化范围为 172.16.0.0 ~ 172.16.255.255,即…

【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 eureka 一、Eureka原理分析1.1 服务调用出现…

kafka与zookeeper的集群

基础配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configvi /etc/hosts ip1 node1 ip2 node2 ip3 node3zookeeper介绍 zookeeper是一个分布式的协调服务,主要用…

基于YOLOv5、YOLOv8的火灾检测(超实用项目)

目录 1.简介 2.YOLO算法 3.基于YOLOv5、YOLOv8的火灾检测 视频已上传b站 YOLOv5/YOLOv8的火灾检测(超实用项目)_哔哩哔哩_bilibili 本文为系列专栏,包括各种YOLO检测算法项目、追踪算法项目、双目视觉、深度结构光相机测距测速三维测量项…

【yaml文件的编写】

yaml文件编写 YAML语法格式写一个yaml文件demo创建资源对象查看创建的pod资源创建service服务对外提供访问并测试创建资源对象查看创建的service在浏览器输入 nodeIP:nodePort 即可访问 详解k8s中的port:portnodePorttargetPortcontainerPortkubectl run --dry-runc…

数据库 explain 关键字解析

目录 1. explain 概述 2. explain 关键字的使用方式 3. explain 的版本迭代 4. explain 只分析SQL语句,不执行SQL语句 5. explain 输出结果中各个字段的含义 6. type 表示检索表数据的方式 7. key_len表示使用的索引的长度 8. rows 表示预估读取到的行数 9…

电子招标投标系统 —采购招投标管理一体化系统-

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审…

chromadb 0.4.0 后的改动

本文基于一篇上次写的博客:[开源项目推荐]privateGPT使用体验和修改 文章目录 一.上次改好的ingest.py用不了了,折腾了一会儿二.发现privateGPT官方更新了总结下变化效果 三.others 一.上次改好的ingest.py用不了了,折腾了一会儿 pydantic和c…

redis分布式秒杀锁

-- 获取锁标识,是否与当前线程一致? if(redis.call(get, KEYS[1]) ARGV[1]) then-- 一致,删除return redis.call(del, KEYS[1]) end -- 不一致,直接返回 return 0package com.platform.lock;public interface ILock {/*** 获取锁…

全网最新最全的软件测试面试题

一、前言 与开发工程师相比,软件测试工程师前期可能不会太深,但涉及面还是很广的。 在一年左右的实习生或岗位的早期面试中,主要是问一些基本的问题。 涉及到的知识主要包括MySQL数据库的使用、Linux操作系统的使用、软件测试框架问题、测试…

【three.js】坐标辅助器和轨道控制器

结合上一篇基本的3d页面代码,我们在里面添加坐标辅助器,也就是x y z轴坐标系,这样可以更直观的查看物体的位置 一、添加坐标辅助器 查看效果,z轴不显示是因为,z轴是正对我们脸部,从我们正面看就是一个点 …

整体网络架构p22

1. 两次卷积,一次池化。得到一个三维特征图,然后让三维的特征图,三个值进行相乘拉成特征向量,把得到的结果需要靠全连接层。 带参数计算才算一层 算conv的个数FC全连接层就得到卷积神经网络的层数 FC:全连接层 2. 3.reset网络&a…

Fastadmin 子级菜单展开合并,分类父级归纳

这里踩过一个坑,fastadmin默认的展开合并预定义处理的变量是pid。 所以建表时父级id需要是pid; 当然不是pid也没关系,这里以cat_id为例,多加一步处理一样能实现。 废话少说上代码: 首先在控制器, 引用…

【Linux基础】Linux的基本指令使用(超详细解析,小白必看系列)

👉系列专栏:【Linux基础】 🙈个人主页:sunnyll 目录 💦 ls 指令 💦 pwd指令 💦cd指令 💦touch指令 💦mkdir指令(重要) 💦rmdir指令…

openwrt rm500u ncm方式拨号步骤记录

1.进入设备页面 用户名:root 2.创建接口 3.配置接口 国内APN 信息 中国移动APN:CMNET 中国联通APN:3GNET 中国电信APN:CTNET 4.防火墙配置 5.点击Save&Apply 6.配置完成后重启设备。重新进入设备页面,可以看…

【轻松玩转MacOS】外部设备篇

引言 在开始之前,我们先来了解一下为什么要连接外部设备。想象一下,你正在享受MacOS带来的便捷和高效,突然需要打印一份文件,但你发现打印机无法连接;或者你需要将手机投屏到电脑上,却不知道该如何操作。这…

NFTScan | 10.02~10.08 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.10.02~ 2023.10.08 NFT Hot News 01/ 9 月 OpenSea 交易额为 7300 万美元,创两年新低 10 月 2 日,数据显示 9 月 NFT 平台 OpenSea 的交易总额为 73,141,407…

Unity实现设计模式——适配器模式

Unity实现设计模式——适配器模式 适配器模式又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 在一个在役的项目期望在原有接口的基础…

Lua系列文章(1)---Lua5.4参考手册学习总结

windows系统上安装lua,下载地址: Github 下载地址:https://github.com/rjpcomputing/luaforwindows/releases 可以有一个叫SciTE的IDE环境执行lua程序 1 – 简介 Lua 是一种强大、高效、轻量级、可嵌入的脚本语言。 它支持过程编程, 面向对…