U-boot 启动流程分析 4

ARMv8架构u-boot启动流程详细分析(1) armv8 uboot启动流程 阅读详情

下面详细介绍board_init_r函数的调用流程

board_init_r主要做一些板级硬件的初始化,会对板子上的各个外设进行初始化配置,最后调用run_main_loop进入下一级boot或者进入boot console。

1、board_init_r函数类似前面的board_init_f,关键就是遍历执行数组init_sequence_r里面的函数来初始化硬件,下面是具体的代码讲解:


/*
 * We hope to remove most of the driver-related init and do it if/when
 * the driver is later used.
 *
 * TODO: perhaps reset the watchdog in the initcall function after each call?
 */
static init_fnc_t init_sequence_r[] = {
	//根据CONFIG_TRACE来初始化trace system
	initr_trace,
	
	//设置gd flags,标记重定向完成,malloc 已经ready
	initr_reloc, 
	
	/* TODO: could x86/PPC have this also perhaps? */
#ifdef CONFIG_ARM
	initr_caches,
	/* Note: For Freescale LS2 SoCs, new MMU table is created in DDR.
	 *	 A temporary mapping of IFC high region is since removed,
	 *	 so environmental variables in NOR flash is not available
	 *	 until board_init() is called below to remap IFC to high
	 *	 region.
	 */
#endif
	initr_reloc_global_data, //获取uboot的大小,赋值到monitor_flash_len里面
#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
	initr_unlock_ram_in_cache,
#endif
	// PPC专用
	initr_barrier,
	
	//初始化malloc使用的内存区域和大小
	initr_malloc,
	
	// 初始化log system, flag设置为GD_FLG_LOG_READY
	log_init,

	//设置启动stage为board_init_r
	initr_bootstage,	/* Needs malloc() but has its own timer */

	//初始化控制台,申请console_out 和console_in buffer
	initr_console_record,
#ifdef CONFIG_SYS_NONCACHED_MEMORY
	//初始化不经过cache的内存,这个需要cpu支持
	initr_noncached,
#endif
	//设置boot stage为of_live,解析传进来设备树,把dtb里面的信息记录下来
	initr_of_live,
#ifdef CONFIG_DM
	//初始化驱动模型的结构并扫描所有的设备
	initr_dm,
#endif
#if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || defined(CONFIG_RISCV) || \
	defined(CONFIG_SANDBOX)
	board_init,	/* Setup chipselects,进行板级的初始化 */
#endif
	/*
	 * TODO: printing of the clock inforamtion of the board is now
	 * implemented as part of bdinfo command. Currently only support for
	 * davinci SOC's is added. Remove this check once all the board
	 * implement this.
	 */
#ifdef CONFIG_CLOCKS
	//获取cpu的clock信息,保存在gd里面
	set_cpu_clk_info, /* Setup clock information */
#endif
#ifdef CONFIG_EFI_LOADER
	efi_memory_init,
#endif
	//分配struct binman_info结构内存,并设置binman相关信息参数
	initr_binman,
#ifdef CONFIG_FSP_VERSION2
	arch_fsp_init_r,
#endif
	
//在系统启动早期初始化定时器,和将多路复用控制初始化为默认状态
	initr_dm_devices,
	
	//用于初始化标准输出设备链表(struct stdio_dev)
	stdio_init_tables,

	//注册串行端口设备
	serial_initialize,

	//打印出运行调试信息
	initr_announce,
#if CONFIG_IS_ENABLED(WDT)
	//初始化看门狗
	initr_watchdog,
#endif
	INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_NEEDS_MANUAL_RELOC) && defined(CONFIG_BLOCK_CACHE)
	blkcache_init,
#endif
#ifdef CONFIG_NEEDS_MANUAL_RELOC
	initr_manual_reloc_cmdtable,
#endif
#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_MIPS)
	initr_trap,
#endif
#ifdef CONFIG_ADDR_MAP
	initr_addr_map,
#endif
#if defined(CONFIG_BOARD_EARLY_INIT_R)
	board_early_init_r,
#endif
	INIT_FUNC_WATCHDOG_RESET
#ifdef CONFIG_POST
	initr_post_backlog,
#endif
	INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_PCI) && defined(CONFIG_SYS_EARLY_PCI_INIT)
	/*
	 * Do early PCI configuration _before_ the flash gets initialised,
	 * because PCU resources are crucial for flash access on some boards.
	 */
	 //初始化pci
	initr_pci,
#endif
#ifdef CONFIG_ARCH_EARLY_INIT_R
	//cpu相关的初始化,自己实现
	arch_early_init_r,
#endif
	//初始化电源管理,和具体的cpu和板子有关,自己实现
	power_init_board,
#ifdef CONFIG_MTD_NOR_FLASH
	//NOR flash的初始化
	initr_flash,
#endif
	INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
	/* initialize higher level parts of CPU like time base and timers */
	cpu_init_r,
#endif
#ifdef CONFIG_CMD_NAND
	//NAND flash的初始化
	initr_nand,
#endif
#ifdef CONFIG_CMD_ONENAND
	//onenand flash的初始化
	initr_onenand,
#endif
#ifdef CONFIG_MMC
	//mmc的初始化
	initr_mmc,
#endif
#ifdef CONFIG_XEN
	initr_xen,
#endif
#ifdef CONFIG_PVBLOCK
	initr_pvblock,
#endif
	//初始化环境变量,找到load address
	initr_env,
#ifdef CONFIG_SYS_BOOTPARAMS_LEN
	//为boot参数分配地址
	initr_malloc_bootparams,
#endif
	INIT_FUNC_WATCHDOG_RESET
	initr_secondary_cpu, //weak函数,cpu的初始化
#if defined(CONFIG_ID_EEPROM) || defined(CONFIG_SYS_I2C_MAC_OFFSET)
	mac_read_from_eeprom,
#endif
	INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
	/*
	 * Do pci configuration
	 */
	initr_pci,
#endif
	//添加stdio设备到设备表中,iic 串口,lcd,video等等都属于stdio设备
	stdio_add_devices,
	//为gd的jt申请memory
	initr_jumptable,
	
	//下面都是为各种外设进行初始化,太多了,不去一一看了,用到哪个具体分析
#ifdef CONFIG_API
	initr_api,
#endif
	console_init_r,		/* fully init console as a device */
#ifdef CONFIG_DISPLAY_BOARDINFO_LATE
	console_announce_r,
	show_board_info,
#endif
#ifdef CONFIG_ARCH_MISC_INIT
	arch_misc_init,		/* miscellaneous arch-dependent init */
#endif
#ifdef CONFIG_MISC_INIT_R
	misc_init_r,		/* miscellaneous platform-dependent init */
#endif
	INIT_FUNC_WATCHDOG_RESET
#ifdef CONFIG_CMD_KGDB
	initr_kgdb,
#endif
	interrupt_init,
#if defined(CONFIG_MICROBLAZE) || defined(CONFIG_M68K)
	timer_init,		/* initialize timer */
#endif
#if defined(CONFIG_LED_STATUS)
	initr_status_led,
#endif
	/* PPC has a udelay(20) here dating from 2002. Why? */
#ifdef CONFIG_CMD_NET
	initr_ethaddr,
#endif
#if defined(CONFIG_GPIO_HOG)
	gpio_hog_probe_all,
#endif
#ifdef CONFIG_BOARD_LATE_INIT
	board_late_init,
#endif
#if defined(CONFIG_SCSI) && !defined(CONFIG_DM_SCSI)
	INIT_FUNC_WATCHDOG_RESET
	initr_scsi,
#endif
#ifdef CONFIG_BITBANGMII
	initr_bbmii,
#endif
#ifdef CONFIG_PCI_ENDPOINT
	initr_pci_ep,
#endif
#ifdef CONFIG_CMD_NET
	INIT_FUNC_WATCHDOG_RESET
	initr_net,
#endif
#ifdef CONFIG_POST
	initr_post,
#endif
#if defined(CONFIG_IDE) && !defined(CONFIG_BLK)
	initr_ide,
#endif
#ifdef CONFIG_LAST_STAGE_INIT
	INIT_FUNC_WATCHDOG_RESET
	/*
	 * Some parts can be only initialized if all others (like
	 * Interrupts) are up and running (i.e. the PC-style ISA
	 * keyboard).
	 */
	last_stage_init,
#endif
#ifdef CONFIG_CMD_BEDBUG
	INIT_FUNC_WATCHDOG_RESET
	bedbug_init,
#endif
#if defined(CONFIG_PRAM)
	initr_mem,
#endif
#ifdef CONFIG_EFI_SETUP_EARLY
	(init_fnc_t)efi_init_obj_list,
#endif
	//这个是关键的关键,board_int_r最后调用的函数,死循环在main_loop里面,后门分析main_loop
	run_main_loop,
};

手把手教你用Rock 3A开发板调试RK3568的U-Boot启动(附DDR4训练失败排查) 本文详细介绍了如何在Rock 3A开发板上调试RK3568的U-Boot启动过程,特别针对DDR4训练失败问题提供了全面的排查方法。从硬件准备、环境搭建到DDR初始化原理和实战调试技巧,帮助开发者快速解决启动问题,深入理解ARM64架构下的嵌入式开发流程。 阅读详情

相关推荐

(一)u-boot启动流程分析

U-boot是标准的开放源码,主要的作用是系统引导。Uboot支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android, 支持多个处理器系列,如PowerPC、ARM、x86、MIPS。根据具体的项目情况,我们需要修改uboot代码,来支持实际的项目需求。       Uboot的代码量很大,其实我们也

csdn66_2016的博客 1402

u-boot程序框架

u-boot程序框架 _start:(u-boot\arch\arm\cpu\armv8\start.S) b reset b save_boot_params //保存重要的寄存器数据 .globl save_boot_params_ret bl l...

DSP小胖的博客 704

ARMv8架构u-boot启动流程详细分析(一)

文章目录1 概述2 armv8 u-boot的启动3 u-boot源码整体结构和一些编译配置方式3.1 编译配置方式 注:本文基于armv8架构来对u-boot进行启动流程分析,u-boot版本为2022-01。 1 概述 首先引用wiki上的简介: u-boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构。u-boot最先是由德国DENX软件中心团队开发,后续众多有志于开放源码bootloader移植工作的嵌入式开发人员将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支

看我眼色行事的博客 1万+

【u-boot】u-boot源码分析笔记(02) | 运行主线board_init_f分析

本文描述u-boot的启动主线函数:board_init_f。

iriczhao的博客 1177

ARMv8架构u-boot启动流程详细分析(二)

5 u-boot在汇编启动阶段对系统的一些初始化 当cpu交由u-boot接管进入u-boot后,首先会到_start符号出开始执行初始化,并在此期间完成一些必要的系统寄存器相关的初始化,包括保存boot参数,进行地址无关fixed,系统寄存器复位,低平台相关初始化等,启动代码位于arch/arm/cpu/armv8/start.S,入口地址为_start。 首先第一部分代码如下: /**************************************************************

看我眼色行事的博客 6138

U-Boot启动流程详解

本章我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。表 32.1.1 中的“变量”值可以在 u-boot.map 文件中查找,表 32.1.1 中除了__image_copy_start以外,其他的变量值每次编译的时候可能会变化,如果修改了 uboot 代码、修改了 uboot 配置、选用不同的优化等级等等都会影响到这些值。在 u-boot.lds 中有一些跟地址有关的“变量”需要我们注意一下,后面分析 u-boot 源码的时候会用到,这些变量要最终编译完成才能确定的!

qq_28576837的博客 1434

【精读Uboot】SPL阶段的board_init_r详细分析

对于i.MX平台上的SPL来说,其不会直接跳转到Uboot,而是在SPL阶段借助BOOTROM跳转到ATF,然后再通过ATF跳转到Uboot。会初始化设备相关的硬件,最后进入为镜像跳转做准备。下面是调用的核心函数流程,接下来我们会对其中的函数进行详细分析。

Muggle的博客 2588

[TDA4启动流程]【二】【uboot启动流程】

本文档对比了ARM TF-A标准启动流程与TDA4VEN (J722S)芯片的实际实现差异。主要区别包括:TDA4VEN采用多核并行启动(R5/C75/A53)而非单核顺序启动;在标准BL1-BL33流程外,还包含TI特有的TIFS固件和DM固件;U-Boot分为SPL和主程序两阶段实现。文档提供了关键组件的加载地址配置,如ATF(BL31)加载到0x9e780000,OPTEE(BL32)到0x9e800000,U-Boot SPL到0x80080000等。最后展示了uImage生成脚本,详细说明了地址计

weixin_34799243的博客 166

uboot启动流程源码分析(一)

其实前面我学习韦神的书的时候,学习过uboot,知道分为两个阶段。期间对这个uboot的源码没有了解深入。最近坐AVB校验,需要uboot到kernel的这个过程。这里再学习一下。与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段。BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现;BL2阶段主要是对外部设备如网卡、Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2650

U-Boot 之六 详解 U-Boot 及 SPL 的链接脚本、启动流程

我们可以将 U-Boot 的启动过程划分为两个阶段:芯片初始化 和 板级初始化。芯片初始化阶段的代码主要是位于 `./arch/架构/cpu` 目录下,其中再根据架构的不同来区分,主要以汇编语言为主

技术干货 1万+

银河麒麟v10(x86_64)升级openssh实操成功

本文详细介绍了在银河麒麟V10系统上将OpenSSH从8.2p1升级至9.9p2版本的全过程。主要内容包括:系统环境确认、安装telnet备用连接、备份配置、卸载旧版本、安装新版本、服务配置与验证等关键步骤。特别强调了安全注意事项,如必须安装telnet作为备用连接、重要配置备份等。升级后提供了安全加固建议,包括修改SSH端口、禁用root登录等。文章还包含详细的故障排查方法和恢复方案,确保升级过程安全可靠。通过本教程,用户可以顺利完成OpenSSH版本升级,提升系统安全性。

淘淘小窝 1090

(14)uboot之board_init理解 一

uboot启动内存结构图 uboot.bin代码分析图

yxq1280257646的博客 668

灵魂三问:因果推断

什么是因果推断?为什么研究因果推断?怎么进行因果推断研究?

ML OR 智能决策的博客 2902

U-BOOT学习之2014.4版Uboot启动流程分析

一、前言 老大给我布置了一个任务:某某项目uboot开发之usb增强ic驱动。 不知道大家看到这个任务懵不懵,反正我最开始是蒙的。后来又问了一下,才明白到底要做啥。 任务是这样的:因为这个项目的usb线比较长,为了避免usb升级的时候读取u盘失败,所以我们采取的方案是硬件提供一个有i2c支持的usb增强ic。因此,我就需要在车机界面点击升级,车机重启进入uboot启动流程的时候去调用我写的驱动去初始化这个i2c,以此保证usb能正常读取到u盘内容,完成升级。 所以,学习uboot的启动流程就很有必要

陈子陌的博客 963

多个MOS管并联应用场景的四大要点

动态运行时,阈值电压Vgsth最低的MOS管首先打开,最后关闭。这种MOS管一般会占据更多的开关损耗,并且在开关转换过程中,承担了更高的电应力。

VBsemi的博客 3748

EWF写保护功能详解:从安装到实战操作指南

本文详细介绍了EWF写保护功能的安装与实战操作指南。EWF(Enhanced Write Filter)通过重定向写入操作保护硬盘分区,特别适合需要长期稳定运行的系统场景。文章涵盖从安装准备、图形界面操作到命令行高级管理的全流程,并提供了常见问题的解决方案,帮助用户轻松掌握这一实用工具。

weixin_28710999的博客 446

Hi3556v200 u-boot+Liteos方案启动流程分析--4.通用uboot分析之board_init_r

1.前言 本文主要就Hi3556v200的U-boot+Liteos方案的启动流程做简要介绍.我们在前面分析过,uboot执行的过程会执行重定位,这也主要是为了为后续执行kenrel代码腾出空间。重定位后,uboot将执行重定位的uboot代码,这其中会执行board_init_r函数,它会遍历并执行一个函数数组。 U-boot版本:u-boot-2016.11 2.init_sequence_r函数数组 可以看出init_sequence_r函数数组与init_sequence_f还是有区别的,init_

HZero 466

OpenMythos深度解析

本文深入解析了kyegomez/OpenMythos项目如何从第一性原理重建Claude Mythos的核心架构。该项目并非直接复制Claude,而是基于公开论文和实验结果推测其可能的设计理念,构建了包含多模态注意力、深度推理引擎、知识检索模块等六大核心组件的模块化架构。重点剖析了分组查询注意力(GQA)的实现细节,展示了KV头扩展等关键技术。该项目已成为大模型开源社区最受关注的研究之一,为理解Claude的架构思想提供了有价值的参考。

Crown_22的博客 518

决定从头开始分析u-boot-1.1.4源码(一)

在网上看了不少有关u-boot的文章,有的讲得也比较详细,但我按照上面的步骤移植到我的2410开发板总是有点小问题,所以我决定从头开始分析u-boot-1.1.4的源码,希望能对u-boot有个深入的了解,最后移植到我的开发板上.这里需要有点汇编和C基础,我在2410上写过最小启动代码,这个相信问题不大. 下面就从代码的入口地址u-boot-1.1.4\cpu\arm920t\start.s处开始

crtnawwan9623的专栏 822

ESP-Mesh-Lite vs ESP-Mesh:如何选择适合你的物联网组网方案?

本文深入对比了乐鑫ESP-Mesh-Lite与ESP-Mesh两种物联网组网方案的核心差异。重点解析了ESP-Mesh-Lite分布式协议栈架构的优势,即每个节点拥有独立IP,可直接访问外部网络,极大简化了应用层开发。文章从网络架构、性能、开发体验及适用场景等多维度进行分析,为开发者根据项目需求(如分布式数据采集、智能家居或集中控制网络)选择最合适的方案提供了清晰的决策框架。

pluto的博客 817

带有验证码的爆破(包含Burp suite工具爆破)

关于含有验证码爆破的一些总结!

weixin_43960066的博客 8693

2014.4新版uboot启动流程分析 他的博客需要学习

http://blog.youkuaiyun.com/skyflying2012/article/details/25804209   最近开始接触uboot,现在需要将2014.4版本uboot移植到公司armv7开发板。 在网上搜索讲uboot启动过程的文章,大多都是比较老版本的uboot,于是决定将新版uboot启动过程记录下来,和大家共享。 对于uboot,我写了一个专栏来记录我的一些

或许 1120

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

a_zxswer的博客 1692

一,移植uboot-分析uboot启动流程

文档时间:2018-08-08 交叉编译器:arm-linux-gcc-4.3.2 Ubuntu版本:16.04 uboot版本:2013.10 uboot启动流程简要如下:     a,设置CPU为管理模式     b,关闭看门狗     c,关闭中断     d,设置时钟频率     e,进入lowlevel_init.S,初始化各个bank     f,进入board_i...

weixin_33894992的博客 235

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

2014.4新版uboot启动流程分析

转自 http://blog.youkuaiyun.com/skyflying2012/article/details/25804209 最近开始接触uboot,现在需要将2014.4版本uboot移植到公司armv7开发板。 在网上搜索讲uboot启动过程的文章,大多都是比较老版本的uboot,于是决定将新版uboot启动过程记录下来,和大家共享。 [cpp] view

EmSoftEn的专栏 943

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

uboot启动流程分析 & 2014.4新版uboot启动流程分析

2014.4新版uboot启动流程分析:https://blog.youkuaiyun.com/skyflying2012/article/details/25804209 第一阶段: 1.硬件设备初始化 2.加载u-boot第二阶段代码到RAM空间 3.设置好栈 4.跳转到第二阶段代码入口   第二阶段: 1.初始化本阶段使用的硬件设备 2.检测系统内存映射 3.将内核从Flash读取到...

跬步千里,窥叶知秋 779

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: U-boot 启动流程分析 3
下一篇: U-boot 启动流程分析 5
Runner_Linux
博客等级 码龄6年 17粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值