G870 Uboot启动步骤
发布时间:2021-12-18 16:32:26 所属栏目:PHP教程 来源:互联网
导读:硬件平台:飞思卡尔iMX258 ARM9 CPU +256MB的Nand Flash(uboot存放在此中) 首先通过uboot的链接文件,其中text段为uboot的代码段,我们可以看到uboot运行时执行的第一段代码在start.S中: OUTPUT_FORMAT(elf32-littlearm, elf32-littlearm, elf32-littlear
硬件平台:飞思卡尔iMX258 ARM9 CPU +256MB的Nand Flash(uboot存放在此中) 首先通过uboot的链接文件,其中text段为uboot的代码段,我们可以看到uboot运行时执行的第一段代码在start.S中: OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); //于4个字节对齐 .text : //代码段 { cpu/arm926ejs/start.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } //只读数据段 . = ALIGN(4); .data : { *(.data) } //读写数据段 . = ALIGN(4); .got : { *(.got) } //uboot特有段 . = .; __u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } //uboot命令段 __u_boot_cmd_end = .; . = ALIGN(4); __bss_start = .; .bss (NOLOAD) : { *(.bss) . = ALIGN(4); } // bss段 _end = .; } 找到start.s这个文件,以这个文件为起点看uboot的启动流程。这里我通过一个图来说明这个过程。 由于iMX258内部具有有32KB的ROM(包括HAB)和128KB的RAM,在uboot加载前,CPU先运行iROM里面的一部分代码,这部分代码为芯片出厂时固化,它根据熔丝配置值可以检测到uboot存放在外部Nand Flash中,所以先copy最前边的一部分uboot代码(即start.s)到内部RAM运行。以上过程CPU上电后就会自动执行,前提是你已经通过熔丝配置好CPU的启动模式等参数。 下面是iMAX25在start.s特有的一部分代码,它完成了把uboot接下来的代码copy到RAM的功能(内部RAM的地址为0x7802_0000~0x7fff_ffff,外部SDRAM的地址为0x8000_0000~0x8fff_ffff)。 #ifdef CONFIG_MX25 /* Copy vectors to mask ROM indirect addr */ adr r0, _start /* r0 <- current position of code */ ldr r1, =0x7801FFC0 /*把RAM 从0x7801FFC0开始的地址装入r1*/ mov r2, #16 /*计数寄存器*/ copyex: subs r2, r2, #1 /*循环16次,一次copy 4个字,总共1kb*/ ldr r3, [r0], #4 /*将存储器地址为r0的字数据-> r3,然后再把r0+4->r0*/ str r3, [r1], #4 /*把r3中的数据加载到r1所对应的地址上,然后r1+4->r1*/ bne copyex /*r2若不等于0,跳至copyex*/ ![]() (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |