u_boot初始化流程

合集下载

U-Boot工作过程

U-Boot工作过程

ldr r1, =0x38022
str r1, [r0]
# else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
str r1, [r0] /* 看门狗控制器的最低位为0时,看门狗不输出复位信号 */
以上代码向看门狗控制寄存器写入0,关闭看门狗。否则在U-Boot启动过程中,CPU将不断重启。
(5)屏蔽中断
/*
* mask all IRQs by setting all bits in the INTMR - default
ldr pc, _not_used /* 未使用 */
ldr pc, _irq /* irq中断向量 */
ldr pc, _fiq /* fiq中断向量 */
board/samsung/mini2440/nand_read.o (.text)
*(.text)
}
… …
}
第一个链接的是cpu/arm920t/start.o,因此u-boot.bin的入口代码在cpu/arm920t/start.o中,其源代码在cpu/arm920t/start.S中。下面我们来分析cpu/arm920t/start.S的执行。
mrs r0, cpsr
bic r0, r0, #0x1f /*工作模式位清零 */
orr r0, r0, #0xd3 /*工作模式位设置为“10011”(管理模式),并将中断禁止位和快中断禁止位置1 */
mov r1, #5
str r1, [r0]
ldr r0, =MPLLCON

U-boot启动流程分析(三)

U-boot启动流程分析(三)

U-boot 启动流程(Linux 内核)的分析(三)U-boot 属于两阶段的Bootloader ,第一阶段的文件为cpu/arm920t/start.S 和board\samsung\smdk2410/lowlevel_init.S,前者是平台相关的,后者是开发板相关的。

1.U-Boot 第一阶段代码分析(1)硬件设备初始化依次完成如下设置:将CPU 的工作模式设为管理模式(SVC ),关闭WATCHDOG ,设置FCLK ,HCLK ,PCLK 的比例,关闭MMU ,CACHE 。

代码在cpu/arm920t/start.S 中,(2)为加载Bootloader 的第二阶段代码准备RAM 空间。

所谓准备RAM 空间,就是初始化内存芯片,使它可用,对于S3C24x0,通过在Start.S 中调用lowlevel_init 函数来设置存储控制器,使得外接 SDRAM 可用,lowlevel_init.S,文件是与开发板相关的,这表示如果外接的设备不一样,可以修改lowlevel_init.S 文件中的相关的宏。

(3)复制Bootloader 的第二阶段代码到RAM 空间中 这里将整个U-Boot 代码都复制到SDRAM 中,这在cpu/arm920t/start.s 中实现上面这段程序,在使用NANDFlash 启动时,需要修改。

(4)设置好栈 /*栈的设置灵活性很大,只要让sp 寄存器指向一段没有使用的内存即可*/.word TEXT_BASE //这里是获得代码段的起始地址,我的是0x33F80000(在board/xxx/config.mk中//可到找到“TEXT_BASE=0x33F80000”.globl lowlevel_init //这里相当于定义一个全局的lowlevel_init以方便调用lowlevel_init :/* memory control configuration *//* make r0 relative the current location so that it *//* reads SMRDATA out of FLASH rather than memory ! */ldr r0, =SMRDATA //SMDATA表示这 13个寄存器的值存放的开始地址,值为0x33F8xxxx,处于内//存中,这一句的作用是把其值加载到r0中ldr r1, _TEXT_BASE // 把代码的起始地址(0x33F80000)加载到r1中sub r0, r0, r1 //r0减去r1其结果存入r0,也即SMDATA中的起始地址0x33F8xxxx减去//0x33F80000,其结果就是13个寄存器的值在NOR Flash存放的开始地址ldr r1, =BWSCON /* Bus Width Status Controller */ //存储控制器的基地址add r2, r0, #13*4 //在计算出来的存放地址加上#13*4,然后其结果保存在r2中//13 个寄存器,每个寄存器占4个字节0:ldr r3, [r0], #4 //内存中r0的值加载到r3中,然后r0加4,即下一个寄存器的str r3, [r1], #4 //读出寄存器的值保存到r1中,然后r1也偏移4cmp r2, r0 //比较r0与r2的值,如果不等继续返回0:执行,也即13个寄存器的值// 是否读完bne 0b/* everything is fine now */mov pc , lr //程序跳转,返回到cpu_init_crit中.ltorg/* the literal pools origin */SMRDATA :...................relocate : /* 将U-Boot复制到RAM中 */adr r0, _start /* r0:当前代码的开始地址 */ldr r1, _TEXT_BASE /* r1:代码段的连接地址*/cmp r0, r1 /* 测试现在是在FLash中,还在是RAM中,如果要从NandFlash启动的话,这里要根据需要修改 */beq stack_setup /*如果已经在RAM中,则不需要复制*/ldr r2, _armboot_start /*_armboot_start在前面定义,是第一条指令的运行地址*/ldr r3, _bss_start /*在连接脚本U-Boot.lds中定义,是代码段的结束地址*/sub r2, r3, r2 /* r2 <- 代码段长度 */add r2, r0, r2 /* r2 <-代码段的结束地址 */copy_loop :ldmia {r3-r10} /* 从地址[r0]处获得数据 */stmia {r3-r10} /* 复制到地址[r1]处 */cmp r0, r2 /* 判断是否复制完毕 */ble copy_loop /*没有复制完,则继续*/#endif /* CONFIG_SKIP_RELOCATE_UBOOT */ldr r0, _TEXT_BASE /* _TEXT_BASE 为代码段的开始地址,值为0x33F80000 */sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* 代码段下面,留出一段内存以实现malloc */sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* 再留出一段内存,存一些全局参数 */#ifdef CONFIG_USE_IRQsub r0, r0, #(CONFIG_STACKSIZE_IRQ +CONFIG_STACKSIZE_FIQ )#endifsub sp , r0, #12 /* 最后,留出12字节的内存给abort异常 */clear_bss :(5)跳转到第二阶段代码的C 入口点 在跳转之前,还要清除BSS 段(初始值0,无初始值的全局变量,静态变量放在BSS 段。

uboot配置过程分析

uboot配置过程分析

fi
#
命令:mkconfig mini6410 arm s3c64xx mini6410 samsung s3c6410 NAND ram256
$0
$1
$2 $3 $4
$5 $6
$7
$8
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
fi
# create link for s3c64xx-mp SoC if [ "$3" = "s3c64xx-mp" ] ; then
rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi 分析: 上面的语句即判断$2 和$3 等于什么,并且执行相应的语句 $2=arm,$3=s3c64xx 所以执行,蓝色部分不执行 if [ "$3" = "s3c64xx" ] ; then
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk 分析: 如果$5 已经定义并且$5 不等于 NULL,则将 VENDOR = $5(VENDOR 进入 config.mk 文件
= samsung) 追 加
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk 分析: 如果$6 已经定义并且$6 不等于 NULL,则将 SOC = $6(SOC config.mk 文件 内容: ARCH = arm CPU = s3c64xx BOARD = mini6410 VENDOR = samsung SOC = s3c6410 如图:

uboot启动流程分析

uboot启动流程分析

uboot启动流程分析Uboot启动流程分析。

Uboot是一种常用的嵌入式系统启动加载程序,它的启动流程对于嵌入式系统的正常运行至关重要。

本文将对Uboot启动流程进行分析,以便更好地理解其工作原理。

首先,Uboot的启动流程可以分为以下几个步骤,Reset、初始化、设备初始化、加载内核。

接下来我们将逐一进行详细的分析。

Reset阶段是整个启动流程的起点,当系统上电或者复位时,CPU会跳转到Uboot的入口地址开始执行。

在这个阶段,Uboot会进行一些基本的硬件初始化工作,包括设置栈指针、初始化CPU寄存器等。

接着是初始化阶段,Uboot会进行一系列的初始化工作,包括初始化串口、初始化内存控制器、初始化时钟等。

这些初始化工作是为了确保系统能够正常地运行,并为后续的工作做好准备。

设备初始化阶段是Uboot启动流程中的一个重要环节,它包括对外设的初始化和检测。

在这个阶段,Uboot会初始化各种外设,如网卡、存储设备等,并对其进行检测,以确保它们能够正常工作。

最后一个阶段是加载内核,Uboot会从存储设备中加载操作系统的内核镜像到内存中,并跳转到内核的入口地址开始执行。

在这个过程中,Uboot会进行一些必要的设置,如传递启动参数给内核,并最终将控制权交给内核。

总的来说,Uboot的启动流程是一个非常重要的过程,它涉及到系统的硬件初始化、外设的初始化和内核的加载等工作。

只有当这些工作都顺利完成时,系统才能够正常地启动运行。

因此,对Uboot启动流程的深入理解对于嵌入式系统的开发和调试具有重要意义。

通过本文对Uboot启动流程的分析,相信读者对Uboot的工作原理有了更清晰的认识。

希望本文能够对大家有所帮助,谢谢阅读!。

uboot启动流程

uboot启动流程

U-Boot工作过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口(2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核1.1.1 U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/和board/samsung/mini2440/。

U-Boot启动第一阶段流程如下:图 U-Boot启动第一阶段流程根据cpu/arm920t/中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/ (.text)board/samsung/mini2440/ (.text)board/samsung/mini2440/ (.text)*(.text)}… …}第一个链接的是cpu/arm920t/,因此的入口代码在cpu/arm920t/中,其源代码在cpu/arm920t/中。

下面我们来分析cpu/arm920t/的执行。

1. 硬件设备初始化(1)设置异常向量cpu/arm920t/开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /*未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量 */ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 */ /* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef以上代码设置了ARM异常向量表,各个异常向量介绍如下:表 ARM异常向量表在cpu/arm920t/中还有这些异常对应的异常处理程序。

U-Boot中初始化序列的说明

U-Boot中初始化序列的说明

U-Boot中初始化序列的说明展开全文在函数中board_init_f()中,进行了一系列的初始化,主要通过调用初始化序列中的函数来实现。

初始化序列定义如下,这里只留下了我用到的初始化函数:init_fnc_t *init_sequence[] = {get_clocks,init_timebase,env_init,init_baudrate,serial_init,console_init_f,display_options,checkcpu,checkboard,init_func_i2c,init_func_ram,NULL, /* Terminate this list */};下面逐个对这些函数进行说明:get_clocks在文件./include/common.h中定义,在文件./cpu/mpc824x/Speed.c中实现,用于设置global_data中的gd->cpu_clk和gd->bus_clk。

init_timebase在文件./include/common.h中定义,在文件./lib_ppc/time.c中实现,用于设置Time Base寄存器TBU和TBL,将其都设置成0。

env_init在文件./include/common.h中定义,在文件./common/Env_flash.c中实现,用于设置global_data中的gd->env_addr和gd->env_valid。

init_baudrate在文件./lib_ppc/board.c中定义和实现,用于设置global_data中的gd->baudrate。

serial_init在文件./include/common.h中定义,在文件./drivers/serial.c中实现,通过调用函数NS16550_init,对UART 相关的寄存器进行初始化。

NS16550_init在文件./include/ns16550.h中定义,在文件. /drivers/ns16550.c中实现。

uboot 代码运行流程

uboot 代码运行流程

uboot 代码运行流程U-Boot代码运行流程U-Boot(Universal Bootloader)是一个开源的引导加载程序,广泛应用于嵌入式系统中。

它负责在系统上电后初始化硬件并加载操作系统内核,是系统启动的重要一环。

下面将从U-Boot代码的运行流程方面进行介绍。

1. 启动阶段当系统上电后,处理器会从预定义的存储器地址开始运行代码。

U-Boot的启动代码通常存放在ROM中,处理器会从ROM的起始地址开始执行。

启动代码负责初始化处理器和一些外设,然后跳转到U-Boot的入口点。

2. 入口点U-Boot的入口点是指U-Boot的main()函数。

在启动代码的最后,会调用main()函数,从而进入U-Boot的主循环。

U-Boot的主循环负责处理用户输入的命令,并根据命令执行相应的操作。

3. 硬件初始化在main()函数中,首先会进行硬件的初始化工作。

这包括初始化串口、初始化存储器控制器、初始化网络接口等。

硬件初始化的目的是为了确保系统能够正常运行,并为后续的操作做好准备。

4. 系统启动硬件初始化完成后,U-Boot会尝试从存储设备(如闪存、SD卡)中加载操作系统内核镜像。

U-Boot会根据预定义的启动命令(例如bootcmd)来确定从哪个设备加载内核镜像,并执行相应的加载操作。

加载完成后,U-Boot会将控制权交给操作系统内核,进入操作系统的启动阶段。

5. 用户交互一般情况下,U-Boot会在系统启动后进入命令行界面,等待用户输入命令。

用户可以通过串口、网络等方式与U-Boot进行交互,执行各种操作,例如烧写固件、修改配置等。

U-Boot提供了丰富的命令集,可以满足不同的需求。

6. 系统重启当用户输入重启命令或系统发生异常时,U-Boot会执行系统重启操作。

重启操作包括重新初始化硬件、重新加载内核镜像等步骤,以重新启动系统。

U-Boot会将控制权交给重新加载的内核,然后进入内核的启动流程。

总结:U-Boot代码的运行流程包括启动阶段、入口点、硬件初始化、系统启动、用户交互和系统重启等几个关键步骤。

uboot开发流程

uboot开发流程

uboot开发流程U-Boot 开发流程U-Boot 是一个用于启动嵌入式系统的大约 40KB 的嵌入式固件。

它在系统启动过程中通常作为第一个软件组件被加载和执行,负责初始化硬件、加载内核并将其传递给内核。

开发 U-Boot 的步骤:1. 获取 U-Boot 源代码从 U-Boot 官方网站下载最新版本的 U-Boot 源代码。

2. 设置开发环境安装必要的工具链和依赖项,例如交叉编译器、Make 和 Perl。

还要创建一个用于开发和构建 U-Boot 的工作区。

3. 配置 U-Boot打开 U-Boot 配置文件(通常为 'config.h'),并根据您的特定板配置选项,例如板类型、内存大小和外围设备。

4. 编译 U-Boot使用 'make' 命令编译 U-Boot。

5. 调试 U-Boot使用 'gdb' 等调试器调试 U-Boot 代码,并修复任何编译错误或运行时问题。

6. 设置和测试 NAND/NOR 闪存配置 U-Boot 以使用 NAND 或 NOR 闪存,并通过写入和验证图像来测试该配置。

7. 集成 U-Boot 到板级支持包 (BSP)将编译后的 U-Boot 图像集成到您的 BSP 中,这是一个用于支持特定硬件板的软件包。

8. 在目标板上测试 U-Boot将 BSP 部署到目标板,并测试 U-Boot 是否可以正确启动系统。

9. 个性化 U-Boot根据您的特定需求定制 U-Boot 的命令行和功能,例如添加自定义命令或修改环境变量。

10. 维护 U-Boot随着时间的推移,跟踪和应用 U-Boot 社区的更新和补丁,以确保您的开发保持最新且安全。

提示:遵循 U-Boot 文档并充分利用社区支持。

使用版本控制系统来跟踪您的更改。

彻底测试您的代码以确保其稳定性。

保持 U-Boot 与您的目标板紧密集成。

定期更新 U-Boot 以利用最新功能和安全改进。

[uboot](第五章)uboot流程——uboot启动流程

[uboot](第五章)uboot流程——uboot启动流程

[uboot](第五章)uboot流程——uboot启动流程/ooonebook/article/details/53070065以下例⼦都以project X项⽬tiny210(s5pv210平台,armv7)为例[uboot] uboot流程系列:建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例⼦了解⼀下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运⾏位置,功能。

建议可以和《[uboot] (番外篇)global_data介绍》和《[uboot] (番外篇)uboot relocation介绍》结合起来看。

=================================================================================⼀、uboot说明1、uboot要做的事情CPU初始刚上电的状态。

需要⼩⼼的设置好很多状态,包括cpu状态、中断状态、MMU状态等等。

其次,就是要根据硬件资源进⾏板级的初始化,代码重定向等等。

最后,就是进⼊命令⾏状态,等待处理命令。

在armv7架构的uboot,主要需要做如下事情arch级的初始化关闭中断,设置svc模式禁⽤MMU、TLB关键寄存器的设置,包括时钟、看门狗的寄存器板级的初始化堆栈环境的设置代码重定向之前的板级初始化,包括串⼝、定时器、环境变量、I2C\SPI等等的初始化进⾏代码重定向代码重定向之后的板级初始化,包括板级代码中定义的初始化操作、emmc、nand flash、⽹络、中断等等的初始化。

进⼊命令⾏状态,等待终端输⼊命令以及对命令进⾏处理上述⼯作,也就是uboot流程的核⼼。

2、疑问在前⾯的⽂章中虽然已经说明了,在spl的阶段中已经对arch级进⾏了初始化了,为什么uboot⾥⾯还要对arch再初始化⼀遍?回答:spl对于启动uboot来说并不是必须的,在某些情况下,上电之后uboot可能在ROM上或者flash上开始执⾏⽽并没有使⽤spl。

Uboot启动过程详解

Uboot启动过程详解

Uboot启动过程详解u-boot系统启动流程大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。

依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

1、Stage1 start.S代码结构u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下(1)定义入口。

:该工作通过修改连接器脚本来完成。

(2)设置异常向量(Exception Vector)。

(3)设置CPU的速度、时钟频率及终端控制寄存器。

(4)初始化内存控制器。

(5)将ROM中的程序复制到RAM中。

(6)初始化堆栈。

(7)转到RAM中执行,该工作可使用指令ldr pc来完成。

2、Stage2C语言代码部分 lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作:(1)调用一系列的初始化函数。

(2)初始化Flash设备。

(3)初始化系统内存分配函数。

(4)如果目标系统拥有NAND设备,则初始化NAND设备。

(5)如果目标系统有显示设备,则初始化该类设备。

(6)初始化相关网络设备,填写IP、MAC地址等。

(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

3、U-Boot的启动顺序主要顺序如下图所示函数顺序初始化顺序图为 U-Boot顺序下面就根据代码进行解释:/*********************** 中断向量 ***********************/.globl _start //u-boot启动入口_start: b reset //复位向量并且跳转到resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irq //中断向量ldr pc, _fiq //中断向量b sleep_setting //跳转到sleep_setting并通过下段代码拷贝到内存里relocate: //把uboot重新定位到RAMadr r0, _start // r0 是代码的当前位置ldr r2, _armboot_start //r2 是armboot的开始地址ldr r3, _armboot_end //r3 是armboot的结束地址sub r2, r3, r2 // r2得到armboot的大小ldr r1, _TEXT_BASE // r1 得到目标地址add r2, r0, r2 // r2 得到源结束地址copy_loop: //重新定位代码ldmia r0!, {r3-r10} //从源地址[r0]中复制stmia r1!, {r3-r10} //复制到目标地址[r1]cmp r0, r2 //复制数据块直到源数据末尾地址[r2]ble copy_loop系统上电或reset后,cpu的PC一般都指向0x0地址,在0x0地址上的指令是reset: //复位启动子程序/******** 设置CPU为SVC32模式***********/mrs r0,cpsr //将CPSR状态寄存器读取,保存到R0中bic r0,r0,#0x1forr r0,r0,#0xd3msr cpsr,r0//将R0写入状态寄存器中/************** 关闭看门狗 ******************/ldr r0, =pWTCONmov r1, #0x0str r1, [r0]/************** 关闭所有中断 *****************/mov r1, #0xffffffffldr r0, =INTMSKstr r1, [r0]ldr r2, =0x7ffldr r0, =INTSUBMSKstr r2, [r0]/************** 初始化系统时钟 *****************/ldr r0, =LOCKTIMEldr r1, =0xffffffstr r1, [r0]clear_bss:ldr r0, _bss_start //找到bss的起始地址add r0, r0, #4 //从bss的第一个字开始ldr r1, _bss_end // bss末尾地址mov r2, #0x00000000 //清零clbss_l:str r2, [r0] // bss段空间地址清零循环add r0, r0, #4cmp r0, r1bne clbss_l/***************** 关键的初始化子程序************************// * cpu初始化关键寄存器* 设置重要寄存器* 设置内存时钟* /cpu_init_crit:/** flush v4 I/D caches*/mov r0, #0mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB *//************* disable MMU stuff and caches ****************/ mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)orr r0, r0, #0x00000002 @ set bit 2 (A) Alignorr r0, r0, #0x00001000 @ set bit 12 (I) I-Cachemcr p15, 0, r0, c1, c0, 0/******* 在重新定位前,我们要设置RAM的时间,因为内存时钟依赖开发板硬件的,你将会找到board目录底下的memsetup.S。

Tiny4412u-boot分析(2)u-boot启动流程

Tiny4412u-boot分析(2)u-boot启动流程

Tiny4412u-boot分析(2)u-boot启动流程从⼤⽅⾯来说,u-boot的启动分成两个阶段,第⼀个阶段主要的职责是准备初始化的环境,主要有以下⼏点①设置异常向量表②把CPU的⼯作模式设置为SVC32模式③关闭中断、MMU和cache④关闭看门狗⑤初始化内存、时钟、串⼝⑥设置堆栈⑦代码搬移⑧清bss段⑨跳转到c语⾔中执⾏(第⼆阶段)此时系统还没有进⼊C语⾔的运⾏阶段,并没有堆栈,也就不需要额外的RAM。

第⼆阶段在上⼀段建⽴好C语⾔运⾏环境的基础上,进⾏各种外设的初始化,并循环执⾏⽤户命令。

主要流程图如下当我们执⾏make命令来构建u-boot时,它的构建过程是:⾸先使⽤交叉编译⼯具将各⽬录下的源⽂件⽣成⽬标⽂件(*.o),⽬标⽂件⽣成后,会将若⼲个⽬标⽂件组合成静态库⽂件(*.a),最后通过链接各个静态库⽂件⽣成ELF格式的可执⾏⽂件。

在链接的过程中,需要根据链接脚本(⼀般是各个以lds为后缀的⽂本⽂件),确定⽬标⽂件的各个段,链接⽂件通常是board/<board>/⽬录中的u-boot.lds⽂件。

⼀般在链接脚本中通过ENTRY(_start)来指定⼊⼝为_start标号,通过⽂本段(.text)的第⼀个⽬标来制定u-boot⼊⼝⽂件。

所以我们通过这个链接脚本⽂件可以确定u-boot执⾏的⼊⼝。

Tiny4412 u-boot的链接脚本内容为// board/samsung/tiny4412/u-boot.ldsOUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{arch/arm/cpu/armv7/start.o (.text)board/samsung/tiny4412/libtiny4412.o (.text)arch/arm/cpu/armv7/exynos/libexynos.o (.text)*(.text)}. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }. = ALIGN(4);.data : {*(.data)}. = ALIGN(4);. = .;__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;. = ALIGN(4);.rel.dyn : {__rel_dyn_start = .;*(.rel*)__rel_dyn_end = .;}.dynsym : {__dynsym_start = .;*(.dynsym)}.bss __rel_dyn_start (OVERLAY) : {__bss_start = .;_end = .;}/DISCARD/ : { *(.dynstr*) }/DISCARD/ : { *(.dynamic*) }/DISCARD/ : { *(.plt*) }/DISCARD/ : { *(.interp*) }/DISCARD/ : { *(.gnu*) }}在本链接脚本⽂件中,定义了起始地址为0x00000000,每个段使⽤4字节对齐(.ALIGN(4)),⼏个段分别为代码段(.text)、只读数据段(.rodata)、数据段(.data)其中,代码段的第⼀个⽬标为arch/arm/cpu/armv7/start.o,在其中定义了映像⽂件的⼊⼝_start。

uboot dm-gpio使用方法以及工作流程

uboot dm-gpio使用方法以及工作流程

uboot dm-gpio使用方法以及工作流程全文共四篇示例,供读者参考第一篇示例:u-boot是嵌入式系统中常用的引导加载程序之一,它的功能非常强大,可以用来引导内核启动和设置所需的硬件环境。

本文将介绍在u-boot中使用dm-gpio的方法和工作流程。

dm-gpio是u-boot中一个用来管理GPIO引脚的设备模型,通过dm-gpio可以方便地对GPIO进行配置和控制。

在使用dm-gpio之前,我们需要在u-boot的配置文件中开启CONFIG_DM_GPIO选项,以启用dm-gpio功能。

在u-boot中使用dm-gpio的方法如下:1. 初始化dm-gpio设备:在u-boot启动过程中,我们可以通过调用dm_gpio_init函数来初始化dm-gpio设备。

该函数会扫描系统中的GPIO设备,并将其注册到设备模型中。

2. 获取GPIO设备:要操作一个GPIO引脚,首先需要获取指向该引脚的GPIO设备指针。

可以通过调用dm_gpio_lookup_name或dm_gpio_lookup_index函数来获取GPIO设备。

3. 配置GPIO引脚:一旦获得了GPIO设备指针,我们就可以使用dm_gpio_set_value和dm_gpio_get_value函数来设置和读取GPIO引脚的状态。

通过调用dm_gpio_set_value将引脚设置为输出模式,并可以通过dm_gpio_get_value来读取引脚的状态。

dm-gpio的工作流程如下:4. 完成:当GPIO引脚的操作完成后,可以释放GPIO设备指针或在程序退出时做清理工作。

dm-gpio提供了一种方便而灵活的方式来管理GPIO引脚,让开发者能够更加轻松地进行GPIO操作。

通过对dm-gpio的使用方法和工作流程的了解,可以更加高效地利用GPIO资源,提高嵌入式系统的稳定性和可靠性。

第二篇示例:U-Boot 是一个开源的引导加载程序,被广泛应用于嵌入式系统中。

uboot mmc 代码流程

uboot mmc 代码流程

U-Boot是一个开源的嵌入式系统引导程序,它提供了许多硬件抽象和驱动,使得它能够适应各种不同的硬件平台。

U-Boot中的MMC(MultiMediaCard)模块主要用于支持SD/SDHC存储卡。

下面是一个简单的U-Boot中MMC代码流程:
1. 初始化阶段:在U-Boot启动后,首先会进行初始化阶段,包括内存、设备树等基础设置。

在这个阶段,MMC模块会进行一些必要的初始化工作,包括初始化硬件接口、配置寄存器等。

2. 检测阶段:在初始化完成后,MMC模块会进入检测阶段。

在这个阶段,它会扫描系统中的MMC设备,并检查是否有SD卡插入。

如果有SD卡插入,它会获取卡的相关信息,如卡类型、容量等。

3. 挂载阶段:在检测到SD卡后,MMC模块会将SD卡挂载到系统中,使其可以被系统访问。

这个过程包括创建文件系统、挂载文件系统等操作。

4. 配置阶段:在挂载完成后,MMC模块会对SD卡进行一些配置操作,如设置块大小、设置读写速度等。

这些配置操作会影响到后续的读写操作。

5. 读写阶段:在配置完成后,用户就可以对SD卡进行读写操作了。

这个阶段包括打开文件、写入数据、读取数据等操作。

6. 清理阶段:在读写完成后,MMC模块会进行清理工作,包括关闭文件、释放资源等操作。

以上是一个简单的U-Boot中MMC代码流程,具体的实现可能会因不同的U-Boot版本和硬件平台而有所不同。

同时,为了更好地理解和使用U-Boot中的MMC模块,建议参考相关的U-Boot文档和代码注释。

嵌入式linux操作系统u-boot启动顺序以及代码解析

嵌入式linux操作系统u-boot启动顺序以及代码解析

Bootloader/u-boot的启动模式对于计算机系统来说,从计算机开机上电的到操作系统的启动需要一个引导过程。

嵌入式Linux同样也需要一个引导的过程,及引导程序就叫做Bootloader。

Bootloader是在操作系统启动之前执行的一小段程序,通过这段小程序,我们可以初始化硬件设备、建立内存空间映射表,从而建立适当系统软硬件环境,为最终调用操作系统内核做好准备。

对于嵌入式系统,Bootloader是基于特定平台来实现的,因此几乎不可能为所有的计算机操作系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader,Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级的设备的配置。

对于两块不同的嵌入式开发板,即使他们使用同一种处理器,要想让运行于一块板子上的Bootloader运行在另一块板子上,一般都需要修改Bootloader源程序。

反过来大多数的Bootloader都具有很多的共性,某些Bootloader也能够支持多种体系结构的嵌入式系统。

例如:u-boot就同时支持Powerpc、ARm、MIPS和X86等等的体系结构,支持的板子有上百种,通常他们都能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和网口的操作。

系统加电或者复位后,cpu通常都会从某个地址开始执行,这是由处理器决定的,对于ARM处理器而言会从0x00000000取第一条指令,嵌入式系统的开发板都要把ROM和FLASH映射到这个地址上,因此必须将Bootloader的程序存储在相应的FLASH位置,这样系统加电后就会首先执行它。

u-boot的启动一般流程:第一阶段:依赖cpu初始化外围硬件代码,通常用汇编代码实现1、设置cpu的工作模式;2、关中断,以防止意外发生;/************************************************** set the cpu to SVC32 mode,设置cpu工作模式为11010011,* 后五位表示cpu的工作模式设置为”管理”,并且关闭中断* 110则表示IRQ(普通中断)和FIQ(快速中断)都为禁止**************************************************/mrs r0,cpsr//读取cpsr中的数据到r0中bic r0,r0,#0x1f//将寄存器r0的值和0x1f的反码安位与之后将结果存储在r0中相当于清零orr r0,r0,#0xd3//将寄存器r0的值和0xd3 安位或之后将结果保存在r0寄存器之中,关闭中断msr cpsr,r0//将cpsr中的数值写到r0寄存器中3、关闭看门狗,避免系统重启;#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3 C2440)/* turn off the watchdog ,关闭开门狗*/# if defined(CONFIG_S3C2400)# define pWTCON 0x15300000# define INTMSK 0x14400008 /* Interupt-Controller base addresses */# define CLKDIVN 0x14800014 /* clock divisor register */#else# define pWTCON 0x53000000# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ # define INTSUBMSK 0x4A00001C# define CLKDIVN 0x4C000014 /* clock divisor register */# endif4、设置back初始化,设置cpu的工作频率;#if defined(CONFIG_S3C2440)/*FCLK HCLK PCLK = 1: 4: 8*/ldr r0, =CLKDIVNmov r1,#5str r1,[r0]mrc p15,0,r1,c1,c0,0orr r1, r1,#0xc0000000mcr p15,0,r1,c1,c0,0mov r1,#CLK_CTL_BASEmov r2,#MDIV_405add r2,r2,#PSDIV_405str r2,[r1,#0x4]#else/* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldr r0, =CLKDIVNmov r1, #3str r1, [r0]#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 *5、从FLASH拷贝到RAM;#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate: /* relocate U-Boot to RAM */adr r0, _start /* r0 <- current position of code *///adr是读取地址的伪指令,表示将_start标示的运行地址给r0ldr r1, _TEXT_BASE /* test if we run from flash or RAM */// 表示将_TEXT_BASE 指向的地址中的数据拷贝到r1中cmp r0, r1 /* don't reloc during debug *///比较是否相同beq stack_setup //相同跳转出去/*****************不同则执行以下代码***********************/ldr r2, _armboot_start //start起始地址,包含RO代码段+RW 数据段+ZI全局变量ldr r3, _bss_start //全局变量的地址sub r2, r3, r2 /* r2 <- size of armboot *///相减之后得到的是代码段+数据段的总大小add r2, r0 r2, /* r2 <- source end address *///r0是要烧录的内容,表示的是烧录的代码段+数据段的结束地址copy_loop:ldmia r0!, {r3-r10} /* copy from source address [r0] *///ldmia批量的拷贝,向后拷贝32位到r3-r10(将r0中的数据读出到r3-r10的,r0自动加一) stmia r1!, {r3-r10} /* copy to target address [r1] *///stmia批量的存储到r1上也就是目标运行的地址上(将r3-r10中的数据保存到r1指向的地址上,r1自动加一)cmp r0, r2 /* until source end addreee [r2] *///r0 烧录的起始地址,r2烧录的结束地址,相等则说明拷贝完成ble copy_loop#endif /* CONFIG_SKIP_RELOCATE_UBOOT */6、设置建立堆栈;7、执行内存地址上的程序,该工作可以使ldr pc来完成;start.s是u-boot启动所执行的第一个文件,它说做的是设置系统堆栈和cpu的工作方式,为进入c程序奠定基础。

1-2-uboot基础篇-uboot启动流程

1-2-uboot基础篇-uboot启动流程

u-boot 启动第一阶段
u-boot 启动第一阶段
1. _start
_start是u-boot启动后的第一个执行地址。对于任何程序,入口函数是在 链接时决定的,u-boot的入口是由链接脚本决定的。uboot下链接脚本默认 目录为arch/arm/cpu/u-boot.lds。
_start: arch/arm/lib/vectors .S
广州创龙电子科技有限公司 08
u-boot 启动第一阶段
_start:
#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG .word CONFIG_SYS_DV_NOR_BOOT_CFG
#endif
b
reset
@跳到reset入口
ldr
pc, _undefined_instruction @7种异常的入口函数
广州创龙电子科技有限公司 05
u-boot 启动流程概述
stage2 (c语言代码部分)
(1)初始化本阶段使用的硬件设备。 (2)初始化系统内存。 (3)将kernel和文件系统映射从Flash读取到RAM中。 (4)为内核设置启动参数。 (5)调用内核。
广州创龙电子科技有限公司 06
02第 2部分
save_boot_params_ret:
/*
* disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
* except if in HYP mode already
*/
mrs r0, cpsr
and r1, r0, #0x1f
广州创龙电子科技有限公司 04
u-boot 启动流程概述

uboot学习之uboot启动流程简述

uboot学习之uboot启动流程简述

uboot学习之uboot启动流程简述⼀、uboot启动分为了三个阶段BL0、BL1、BL2;BL0表⽰上电后运⾏ROM中固化的⼀段程序,其中ROM中的程序是⼚家写进去的,所以具体功能可能根据⼚家芯⽚⽽有所不同。

功能如下:1. 初始化系统时钟、特殊设备的控制器、启动设备、看门狗、堆栈、SRAM等硬件;2. 验证B1镜像,并且加载BL1镜像到SRAM中,然后跳转到BL1镜像的地址上。

BL0需要将BL1加载到对应的RAM上,这就涉及到它的启动模式,详细如下:1.OneNand Boot模式要了解OneNAND先得了解NOR Flash和NAND Flash。

与NOR Flash相⽐,NAND Flash的读数据速度稍慢,但是擦写速度快得多,并且在容量、使⽤寿命、成本上也占有较⼤优势。

NOR Flash的编程简单,⽽NAND Flash的编程较为复杂(因为它的flash管理需要特殊的接⼝)。

NAND Flash⼀般⽤于存储数据,⽽NOR Flash⼀般⽤于存储启动代码。

NOR Flash带有SRAM接⼝,有⾜够的地址引脚来寻址,可以很容易地存取其内容的每⼀字节(有限的地址引脚是限制其容量的因素之⼀)。

NAND Flash使⽤复杂的I/O⼝来串⾏地存取数据,各个产品或⼚商的⽅法可能各不相同。

为了弥补NAND Flash的不⾜,三星公司在NAND Flash芯⽚内集成了⼀个RAM接⼝,命名为OneNAND Flash,这类Flash拥有与NOR Flash相同的简单接⼝,⽽且不受地址引脚的限制,即容量与地址引脚⽆关。

其实OneNAND 其实就是采⽤了NOR的接⼝,NAND的架构,是两者的性能得到了综合。

这就有了X-LOADER的产⽣,以前我们接触到的都是BOOTLOADER,其实这个X-LOADER也起到初始化的作⽤,因为我们的BOOTLOADER是放在NAND的架构下的,⽽CPU却是从NOR的接⼝下读取BOOTLOADER到SDRAM中的,所以现在要做⼀个⼯作就是要如何将BOOTLOADER在OneNAND的架构下从NAND复制到SDRAM中,这就是X-LOADER的功能了,它不仅初始化OneNAND,并且把U-BOOT从NAND的架构下复制到BufferRam中,再复制到SDRAM中。

U-Boot启动过程--详细版的完全分析

U-Boot启动过程--详细版的完全分析

(一)U—Boot启动过程-—详细版的完全分析我们知道,bootloader是系统上电后最初加载运行的代码.它提供了处理器上电复位后最开始需要执行的初始化代码。

在PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(例如LILO或GRUB),并进一步引导操作系统的启动。

然而在嵌入式系统中通常没有像BIOS那样的固件程序,因此整个系统的加载启动就完全由bootloader来完成.它主要的功能是加载与引导内核映像一个嵌入式的存储设备通过通常包括四个分区:第一分区:存放的当然是u-boot第二个分区:存放着u-boot要传给系统内核的参数第三个分区:是系统内核(kernel)第四个分区:则是根文件系统如下图所示:u—boot是一种普遍用于嵌入式系统中的Bootloader。

Bootloader介绍Bootloader是进行嵌入式开发必然会接触的一个概念,它是嵌入式学院<嵌入式工程师职业培训班〉二期课程中嵌入式linux系统开发方面的重要内容。

本篇文章主要讲解Bootloader的基本概念以及内部原理,这部分内容的掌握将对嵌入式linux系统开发的学习非常有帮助!Bootloader的定义:Bootloader是在操作系统运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备.意思就是说如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。

具体在Bootloader中完成了哪些操作我们会在后面分析到,这里我们先来回忆一下PC的体系结构:PC机中的引导加载程序是由BIOS和位于硬盘MBR 中的OS Boot Loader(比如LILO和GRUB等)一起组成的,BIOS在完成硬件检测和资源分配后,将硬盘MBR 中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。

U-Boot

U-Boot

U-Boot启动流程之stage2
进入无限循环: for (;;) { main_loop (); } main_loop在common/main.c中实现。它通过串口和U-Boot进行交互, 以便引导内核或进行其他参数的修改、设置。
U-Boot的使用(1/3)
1、printenv 打印环境变量 打印U-Boot的环境变量,包括串口波特率、ip地址、mac 地址、内核启动参数、服务器ip地址等等。 2、setenv 设置环境变量 对环境变量的值进行设置,保存在SDRAM中,但不写入 Flash。这样系统掉电以后设置的环境变量就不存在了。 3、saveenv 保存环境变量 将环境变量写入Flash,永久保存。掉电以后不消失。
1、系统上电,进入svc模式 2、关闭看门狗,禁止所有中断 3、进行初级硬件初始化 4、将自身代码拷贝到SDRAM中 5、设置堆栈 6、清空bss段 7、跳转到C语言实现的stage2中
Bootloader的工作模式(一)
下载模式
对研发人员来说,Bootloader一般需要工作在这 种模式下,特别是调试内核或者Bootloader本身 的时候。 通过串口终端与Bootloader进行交互,可以操作 系统硬件。比如通过网口或者串口下载内核,烧 写Flash等等。
典型的Flash存储空间分配图
启动参数
内核
根文件系统
bootloader
copy_myself的实现
copy_myself: …………………….. ldr mov mov bl tst beq 1: r0, =UBOOT_RAM_BASE; 0x33f80000 r1, #0x0 r2, #0x30000 nand_read_whole r0, #0x0 ok_nand_read b 1b
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

U-Boot启动代码分析U-boot的启动顺序分为stage1和stage2两部分,见下图。

依赖于CPU体系结构的代码(如设备初始化代码等)通常放在stage1中用汇编语言实现,而在stage2则通常由C语言实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

以下主要梳理了stage2阶段函数的调用顺序以及每个函数的功能。

U-boot的启动顺序C语言代码部分lib_arm/board.c中的start_armboot既是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个U-boot的主函数,该函数只要完成如下操作。

(1)调用一系列的初始化函数。

(2)初始化Flash设备。

(3)初始化系统内存分配函数(4)如果目标系统拥有NAND设备,则初始化NAND设备(5)如果目标系统有显示设备,则初始化该类设备。

(6)初始化相关网络设备,填写IP、MAC地址等。

(7)进入命令循环(即整个Boot的工作循环),接收用户从串口输入的命令,然后进行相应的工作。

下面结合源码分析函数调用顺序以及函功能:代码:void start_armboot (void){init_fnc_t **init_fnc_ptr;char *s;int mmc_exist = 0;#if defined(CONFIG_VFD) || defined(CONFIG_LCD)unsigned long addr;#endif注释:从U-boot stage1中start.s程序调到这里执行start_armboot函数,这一段代码进行了变量声明,其中定义了一个名为init_fnc_ptr的双重指针。

如果CONFIG_VFD或者CONFIG_LCD被定义了则声明一无符号长整型变量addr,本开发板中没有定义无需声明addr。

代码:/* Pointer is writable since we allocated a register for it */gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));/* compiler optimization barrier needed for GCC >= 3.4 */__asm__ __volatile__("": : :"memory"); //内存屏障,告诉编译器内存被修改过了memset ((void*)gd, 0, sizeof (gd_t));gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); //指向gd之前memset (gd->bd, 0, sizeof (bd_t));// gd->flags |= GD_FLG_RELOC;monitor_flash_len = _bss_start - _armboot_start; //u-boot映像的大小其中_armboot_start为code start ,_bss_start为code + data end == BSS start.注释:gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));//内存强制转换,gd为全局环境变量,gd指向uboot之前的地址;memset ():void * memset(void * s,char c,size_t count)将指针s所指地址以及之后count个地址中数值赋值为c。

memset ((void*)gd, 0, sizeof (gd_t))的作用为:gd整个地址的值初始化为0;memset (gd->bd, 0, sizeof (bd_t))的作用为bd地址的值初始化为0。

代码:for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {if ((*init_fnc_ptr)() != 0) { //相当于调用指针中的一个函数,如果不为0就表示死机hang ();}}注释:将init_squence数组送给init_fnc_ptr,利用循环调用init_squence数组中的多个初始化函数,包括初始化CPU、board、中断、时钟、NOR Flash、NAND Flash等,后面根据代码进行分析。

初始化完成之后进入hang()处于死循环即完成U-boot使命。

init_sequence[ ]数组保存基本的初始化函数指针,在board.c中对数组进行了定义:#if defined(CONFIG_ARCH_CPU_INIT)arch_cpu_init, /* basic arch cpu dependent setup */#endifboard_init, /* basic board dependent setup *///#if defined(CONFIG_USE_IRQ)interrupt_init, /* set up exceptions *///#endif//timer_init, /* initialize timer */#ifdef CONFIG_FSL_ESDHC//get_clocks,#endifenv_init,/* initialize environment */init_baudrate,/* initialze baudrate settings */serial_init,/* serial communications setup */console_init_f,/* stage 1 init of console */off_charge,// xiebin.wang @ 20110531,for charger&power off device.display_banner,/* say that we are here */#if defined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo,/* display cpu info (and speed) */#endif#if defined(CONFIG_DISPLAY_BOARDINFO)checkboard,/* display board info */#endif#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)//init_func_i2c,#endifdram_init, /* configure available RAM banks */#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)//arm_pci_init,#endifdisplay_dram_config,NULL,};注释:下面按照顺序依次分析各个初始化函数作用(绿色代码是被注释掉的并不执行):arch_cpu_init():基本处理器相关配置。

如果定义了CONFIG_ARCH_CPU_INIT则执行此函数,本开发板在include/configs/smdkc100.h中定义了此变量。

最终在串口打印:CPU: SMDK4412-AP1.1 [e4412211]APLL = 1000MHz, MPLL = 800MHzARM_CLOCK = 1000MHzboard_init():基本的板级相关配置,设置了一些寄存器,如时钟,IO口,串口,机器类型,启动参数,指令cache,数据cache.env_init():初始化环境变量,这个函数主要是在gd里保存环境变量的存放地址。

一般使用默认的环境变量值即default_environment数组。

init_baudrate():初始化波特率设置,调用getenv_r()函数来获取环境变量,从上面刚初始化好的环境变量列表里找波特率值,如果没有就赋初始值为CONFIG_BAUDRATE,一般在board.c中定义函数。

serial_init():串口通信设置,在cpu/Arm-cortexa9的serial.c中定义了该函数。

console_init_f():控制台初始化阶段,初始化了几个控制台相关的标记。

在common/Console.c 中定义。

off_charge():管理和关闭设备。

display_banner():打印U-boot信息,包括了一些显示函数,在board.c中定义了该函数。

print_cpuinfo():打印cpu信息,如果定义了CONFIG_DISPLAY_CPUINFO,则执行该函数,本开发板定义了此变量。

checkboard():如果定义了CONFIG_DISPLAY_BOARDINFO,则执行函数。

dram_init():配置可用的RAMdisplay_dram_config():显示RAM的配置,打印出DRAM的大小,在board.c中定义了该函数。

代码:/* armboot_start is defined in the board-specific linker script */mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN,CONFIG_SYS_MALLOC_LEN);#ifndef CONFIG_SYS_NO_FLASH/* configure available FLASH banks */display_flash_config (flash_init ());注释:mem_malloc_init():初始化堆空间,malloc使用的内存空间地址。

在common/Dlmalloc.c 中定义了该函数。

flash_init ():记录下flash的大小,数量,sector的大小数量等,并对flash上重要的数据进行保护。

display_flash_config():通过调用flash_init ()来打印flash的大小信息,在board.c中定义了该函数。

代码:#ifdef CONFIG_VFD# ifndef PAGE_SIZE# define PAGE_SIZE 4096# endif/** reserve memory for VFD display (always full pages)*//* bss_end is defined in the board-specific linker script */addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);vfd_setmem (addr);gd->fb_base = addr;#endif /* CONFIG_VFD注释:如果CONFIG_VFD被定义PAGE_SIZE没有被定义,则定义PAGE_SIZE为4096,为VFD 保存内存空间,以页为单位。

相关文档
最新文档