iMX6-Uboot启动流程
IMX6uboot的启动流程

IMX6uboot的启动流程⽹上看了后,做了个记录,主要是⼀个流程,具体代码没有分析,有空再细看。
cpu在上电之后,它们会⼲些什么?答:检查电压⼤⼩,确定启动模式等。
简单的检查之后呢?答:⼀般从固化在cpu内部的rom⾥⾯执⾏⼀⼩段code。
这⼀⼩段code具体做了些什么呢?各个cpu⼚商会不同,具体我也不知道。
但是我们应该知道,这⼩段code必须完成确认启动模式,并初始化启动设备,搬移烧录在启动设备⾥⾯的代码到ddr⾥⾯。
ok,搬移了代码后,cpu如何识别代码?将doc,txt⽂件烧进去⾏么?答:当然不⾏,烧录的⽂件也是有格式要求的。
格式在哪⾥定呢?稍等,先要知道⽣成的uboot.bin⽂件需要有个指导⽂件,就是uboot.lds,它的作⽤是在编译过程中,决定各个可执⾏程序段的位置。
其代码如下:1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")2 OUTPUT_ARCH(arm)3 ENTRY(_start)4 SECTIONS5 {6 . = 0x00000000;78 . = ALIGN(4);9 .text :10 {11/* WARNING - the following is hand-optimized to fit within */12/* the sector layout of our flash chips! XXX FIXME XXX */13 board/freescale/mx6q_sabreauto/flash_header.o (.text.flasheader)14 cpu/arm_cortexa8/start.o15 board/freescale/mx6q_sabreauto/libmx6q_sabreauto.a (.text)16 lib_arm/libarm.a (.text)17 net/libnet.a (.text)18 drivers/mtd/libmtd.a (.text)19 drivers/mmc/libmmc.a (.text)2021 . = DEFINED(env_offset) ? env_offset : .;22 common/env_embedded.o(.text)2324 *(.text)25 }2627 . = ALIGN(4);28 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }2930 . = ALIGN(4);31 .data : { *(.data) }3233 . = ALIGN(4);34 .got : { *(.got) }3536 . = .;37 __u_boot_cmd_start = .;38 .u_boot_cmd : { *(.u_boot_cmd) }39 __u_boot_cmd_end = .;4041 . = ALIGN(4);42 _end_of_copy = .; /* end_of ROM copy code here */43 __bss_start = .;44 .bss : { *(.bss) }45 _end = .;46 }View Code代码咱不分析,只看.text :{/* WARNING - the following is hand-optimized to fit within *//* the sector layout of our flash chips! XXX FIXME XXX */board/freescale/mx6q_sabreauto/flash_header.o (.text.flasheader)......}它的第⼀要存储的⽂件是flash_header的内容。
IMX6开发板使用教程资料

D-CHIP i.MX6 开发板安装Android系统方法详细教程一、烧写系统●将i.MX6开发板通讯OTG与电脑的USB口连接;开发板OTG与电脑主机的USB口连接●将核心板上的2PIN拨码开关调为1:OFF,2:OFF。
核心板的2PIN拨码开关设置为全部关闭●在鼎芯科技下载的Android包对应的系统版本中运行相应的MfgTool2对系统进行系统烧写。
运行MfgTool2.exe程序未给i.MX6开发板通电时,软件为识别到设备的接入,显示为No Device Connected.给i.MX6开发板通电后,软件将会识别到设备的接入,并提示HID-compliant device.点击“Start”按钮,执行系统的烧写在软件对开发板烧写过程中,由于数据复制到eMMC存储芯片过程,系统将提示磁盘格式化提示,直接“取消”或者不予理会。
一直等到完成烧写并提示“Done”后,点击“Stop”退出软件,至此,系统已经烧写成功。
●完成烧写工作后,断开电源,并将核心板的2PIN拨码开关恢复原来状态1:ON,2:OFF将核心板的2PIN拨码开关设置为1:ON ;2:OFF状态●接入显示设备(LVDS显示屏)7寸LVDS屏幕(本屏幕作为产品选配件,需要额外购买)通过2x15排针将显示屏接入LVDS0接口接好的开发板显示屏(有木有一种帅帅的感觉?)●将i.MX6开发板的COM口与PC机电脑通讯COM口连接,用以和putty.exe进行数据交互。
开发板COM口连接PC机通讯COM口●运行putty.exe(通过网上百度搜索下载即可),实现通讯数据交互。
运行putty.exe程序在putty.exe主界面的“会话”窗口中设置如上图,“串行口”设置为您PC机COM口的端口号,“速度”处为152000,设置好以后直接按“打开”按钮进入数据侦听界面。
给i.MX6开发板接入电源,设备启动,PuTTY显示从COM口上传的数据信息,i.MX6开发板启动进入系统。
uboot启动流程分析

uboot启动流程分析Uboot启动流程分析。
Uboot是一种常用的嵌入式系统启动加载程序,它的启动流程对于嵌入式系统的正常运行至关重要。
本文将对Uboot启动流程进行分析,以便更好地理解其工作原理。
首先,Uboot的启动流程可以分为以下几个步骤,Reset、初始化、设备初始化、加载内核。
接下来我们将逐一进行详细的分析。
Reset阶段是整个启动流程的起点,当系统上电或者复位时,CPU会跳转到Uboot的入口地址开始执行。
在这个阶段,Uboot会进行一些基本的硬件初始化工作,包括设置栈指针、初始化CPU寄存器等。
接着是初始化阶段,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/中还有这些异常对应的异常处理程序。
uboot 代码运行流程

uboot 代码运行流程U-boot是一款ARM处理器启动管理程序,在ARM开发板研发中具有非常广泛的应用,它可以在开发板上提供各种服务和支持,使得用户能够轻松地启动系统和进行应用开发。
本文将从U-boot代码运行流程方面来介绍U-boot的一般执行过程。
U-boot代码运行流程主要可以分为两个方面,即bootloader代码执行流程和内核启动代码执行流程。
1. Bootloader代码执行流程Bootloader是指从CPU开始运行到操作系统启动、执行前的代码。
它的主要功能是加载操作系统内核、初始化硬件环境以及对操作系统进行配置等。
U-boot在启动过程中需要经历以下几个步骤:1)CPU复位在系统上电或者发生复位时,CPU内部控制块将根据复位信号重新启动,并从指定地址处读取第一条指令。
2)初始化硬件U-boot对内存、Flash、串口等硬件进行初始化,然后启动U-boot的“彩屏”启动画面。
3)读取启动设备U-boot通过Boot Device Driver从存储设备(SD卡、NAND Flash等)中读取启动文件,然后执行它。
默认情况下,U-boot会从SD卡中读取启动文件。
4)解析启动文件U-boot解析启动文件,提取内核映像、设备树和命令行参数等关键信息。
然后执行其它操作,如设备树重定位、加入命令行参数等。
5)启动内核U-boot将内核映像从Flash中加载到内存中,并将控制权转交给内核。
此时内核开始执行,U-boot自己退出。
2. 内核启动代码执行流程内核启动代码主要是内核启动过程中的初始化工作。
启动过程中,操作系统需要对内存进行初始化、加载一些关键模块、初始化驱动程序等工作,以实现操作系统本身的功能。
1)内核初始化内核初始化包括内存管理、进程管理、文件系统、驱动程序初始化等。
此时内核会创建init进程和kthreadd进程。
2)加载模块内核启动后加载模块,模块提供了丰富的功能,如网络支持、图形界面等。
海思uboot启动流程详细分析(一)

海思uboot启动流程详细分析(⼀)第⼀阶段 start.S⾸先我们可以在u-boot.lds中看到ENTRY(_start),即指定了⼊⼝_start,_start也就是整个start.S的最开始;1. reset在arch\arm\cpu\armv8\hi3559av100中的start.S注意x30在ARMV8中代表lr寄存器reset:/** Could be EL3/EL2/EL1, Initial State:* Little Endian, MMU Disabled, i/dCache Disabled*/adr x0, vectorsswitch_el x1, 3f, 2f, 1f3: msr vbar_el3, x0mrs x0, scr_el3orr x0, x0, #0xf /* SCR_EL3.NS|IRQ|FIQ|EA */msr scr_el3, x0msr cptr_el3, xzr /* Enable FP/SIMD */#ifdef COUNTER_FREQUENCYldr x0, =COUNTER_FREQUENCYmsr cntfrq_el0, x0 /* Initialize CNTFRQ */#endifb 0f2: msr vbar_el2, x0mov x0, #0x33ffmsr cptr_el2, x0 /* Enable FP/SIMD */b 0f1: msr vbar_el1, x0mov x0, #3 << 20msr cpacr_el1, x0 /* Enable FP/SIMD */0:/** Cache/BPB/TLB Invalidate* i-cache is invalidated before enabled in icache_enable()* tlb is invalidated before mmu is enabled in dcache_enable()* d-cache is invalidated before enabled in dcache_enable()*//** read system register REG_SC_GEN2* check if ziju flag*/ldr x0, =SYS_CTRL_REG_BASEldr w1, [x0, #REG_SC_GEN2]ldr w2, =0x7a696a75 /* magic for "ziju" */cmp w1, w2bne normal_start_flowmov x1, sp /* save sp */str w1, [x0, #REG_SC_GEN2] /* clear ziju flag */adr x0, vectors,其中的vectors代表了异常向量表主要做了如下事情:1)reset SCTRL寄存器具体可参考reset_sctrl函数,由CONFIG_SYS_RESET_SCTRL控制,⼀般不需要打开。
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代码的运行流程包括启动阶段、入口点、硬件初始化、系统启动、用户交互和系统重启等几个关键步骤。
基于imx6ull的uboot2017启动流程

基于imx6ull的uboot2017启动流程1、Uboot2017编译配置流程/Uboot-2017.03$ make distclean/Uboot-2017.03$ make mx6ull_14x14_evk_defconfig/Uboot-2017.03$ make最后会编译出u-boot-dtb.imx⽂件,可以烧⼊板⼦中启动了。
2、Uboot2017的启动流程分析 1)内核启动的第⼀阶段⾸先,经过上⾯的编译后,会在顶层⽬录下发现⾃动⽣成了u-boot.lds链接⽂件,有了这个⽂件后,我们就会很容易找到我们需要分析的第⼀个⽂件是什么:因此,我们就可以从arch/arm/cpu/armv7/start.S这个⽂件出发,去分析;但是当打开start.S这个⽂件时,并不会发现有程序的⼊⼝,也就是上图的_start这个标志,这个标志定义在arch/arm/lib/vectors.S⽂件中:从上⾯也可以看到,主要定义了异常与中断的跳转函数,⽽第⼀个跳转到的是reset标志,可以发现,reset标志是定义在start.S中的,然后顺着程序向下执⾏:1)将CPU从⽤户模式切换到管理员模式2)禁⽌中断这个函数是对CPU进⾏初始化搜索_main,该函数定义在crt0.S中,这个函数是第⼀阶段的关键,第⼀阶段中最主要的函数是为了调⽤board_init_f:由于此时RAM还并没有初始化,不能使⽤,因此使⽤gd结构体进⾏数据的传输1)设置c代码的运⾏环境,为调⽤board_init_f作准备 a) 设置堆栈 b) 调⽤board_init_f_alloc_reserve接⼝,从堆栈开始的地⽅,为uboot的gd结构分配空间 c) 调⽤board_init_f_init_reserve接⼝,对gd进⾏初始化2)调⽤board_init_f函数,完成⼀些前期的初始化⼯作 a)点亮⼀个Debug⽤的LED灯,表⽰u-boot已经活了 b)初始化DRAM,DDR等system范围的RAM等 c)计算后续代码需要使⽤的⼀些参数,包括relocation destination,the future stack,the future GD location等.3).如果当前是SPL(由CONFIG_SPL_BUILD控制),则_main函数结束,直接返回.如果是正常的u-boot,则继续执⾏后续的动作4).根据board_init_f指定的参数,执⾏u-boot的relocation操作5).清除BSS段6).调⽤board_init_r函数,执⾏后续的初始化操作#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)ldr sp, =(CONFIG_SPL_STACK)#elseldr sp, =(CONFIG_SYS_INIT_SP_ADDR)#endif#if defined(CONFIG_CPU_V7M) /* v7M forbids using SP as BIC destination */mov r3, spbic r3, r3, #7mov sp, r3#elsebic sp, sp, #7 /* 8-byte alignment for ABI compliance */#endifmov r0, spbl board_init_f_alloc_reservemov sp, r0/* set up gd here, outside any C code */mov r9, r0bl board_init_f_init_reservemov r0, #0bl board_init_f 在board_init_f中会顺序的执⾏init_sequence_f中定义的函数指针,函数指针中,⽐较关键的是初始化时钟、初始化内核启动的环境参数、设置串⼝波特率、初始化串⼝、初始化i2c、初始化SPI、初始化ram、设置重定位地址、重定位get_clocksenv_initinit_baud_rateserial_initinit_func_i2cinit_func_spidram_initjump_to_copy.... jump_to_copy函数调⽤crt0.S⽂件中的重定位函数,之后便进⾏清除bss段,之后便调⽤board_init_r函数,进⼊内核启动的第⼆阶段。