ARMv7 UBOOT Start.s文件分析

ARMv7 UBOOT Start.s文件分析 reset: /* Allow the board to save important registers */ b save_boot_params 由 reset函数跳转到 **save_boot_params **函数。 b: 跳转不返回。 bl: 跳转返回 (提前将下一条指令存入 **lr **寄存器,在执行玩当前函数后会执行 mov pc, lr ,跳回 **lr **寄存器保存的地址)。 ENTRY(save_boot_params) b save_boot_params_ret @ back to my caller ENDPROC(save_boot_params) .weak save_boot_params 这个函数实际跳转到 save_boot_params_ret 函数。 ENTRY 宏展开得(.type save_boot_params STT_FUNC), .type **是 **GCC** 伪指令,说明**save_boot_params是函数。 **ENDPROC **宏展开得 (size save_boot_params, -save_boot_params),由当前地址减去标号地址,计算 **save_boot_params **函数大小。 .weak 关键字,说明后面的 **save_boot_params **为弱标号,如果链接器在其他地方发现 **save_boot_params **,则这里作废,如果没有发现,则使用这里的。 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 @ mask mode bits teq r1, #0x1a @ test for HYP mode bicne r0, r0, #0x1f @ clear all mode bits orrne r0, r0, #0x13 @ set SVC mode orr r0, r0, #0xc0 @ disable FIQ and IRQ msr cpsr,r0 将 cpsr 状态寄存器存入 r0 将寄存器 r0 中的值与 0X1F 进行与运算,结果保存到 r1 寄存器中,提取cpsr寄存器的低5位,用来设置 **CPU ** 模式 判断 **CPU ** 当前是否处于 HYP 模式 如果 **CPU ** 不是 HYP 模式,则清楚 r0 低5位 将 **CPU ** 切换到 SVC32 模式, CPU 可以使用 SoC 的各种资源 关闭 FIQ 和 IRQ,为了保证 uboot 启动过程不允许被打断 将 r0 的值存回 cpsr 寄存器 #if !...

December 24, 2022 · 3 min · 602 words · nyaruko

Uboot移植之编写自己的boot程序

编译、链接、汇编过程 注意 !,本开发板为正点原子IMX6ULL_Mini开发板,不同点为程序链接地址不同 预编译(Precompile) 将头文件、宏的值展开带到程序里 编译 (Compile) main.c → main.s 汇编(Assembly) main.s→main.o 链接(Link) 将多个xxx.o文件拼接起来,链接成不带后缀的main(ELF)文件 此文件在Linux中可直接运行,但是在单片机中还需要生成为二进制文件 生成二进制文件 将main(ELF)中的无用信息剥离,变为main.bin 编写boot 第一个我们要进行汇编。把mystart.s变成mystart.o。把mylowleve变成mylowleve.o 进行链接。是把这两个文件统合。我们把他起个名字叫myboot这个文件是elf格式的。 生成二进制文件,把myboot中的段信息,调试信息去掉,变为myboot.bin 制作镜像,使用正点原子提供的**(imxdownload),将myboot.bin变为myboot.imx**并烧录到SD卡中 mystart.s b reset b reset b reset b reset b reset b reset b reset b reset reset: bl gpio_out bl led_on mov r0, r1 //跳过流水线 mov r1, r2//跳过流水线 mov r2, r3//跳过流水线 mov r3, r4//跳过流水线 mov r4, r5//跳过流水线 1: b 1b //死循环 gpio_out: /* 1、使能所有时钟 */ ldr r0, =0X020C4068 /* CCGR0 */ ldr r1, =0XFFFFFFFF str r1, [r0] ldr r0, =0X020C406C /* CCGR1 */ str r1, [r0] ldr r0, =0X020C4070 /* CCGR2 */ str r1, [r0] ldr r0, =0X020C4074 /* CCGR3 */ str r1, [r0] ldr r0, =0X020C4078 /* CCGR4 */ str r1, [r0] ldr r0, =0X020C407C /* CCGR5 */ str r1, [r0] ldr r0, =0X020C4080 /* CCGR6 */ str r1, [r0] /* 2、设置GPIO1_IO03复用为GPIO1_IO03 */ ldr r0, =0X020E0068 /* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */ ldr r1, =0X5 /* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */ str r1,[r0] /* 3、配置GPIO1_IO03的IO属性 *bit 16:0 HYS关闭 *bit [15:14]: 00 默认下拉 *bit [13]: 0 kepper功能 *bit [12]: 1 pull/keeper使能 *bit [11]: 0 关闭开路输出 *bit [7:6]: 10 速度100Mhz *bit [5:3]: 110 R0/6驱动能力 *bit [0]: 0 低转换率 */ ldr r0, =0X020E02F4 /*寄存器SW_PAD_GPIO1_IO03_BASE */ ldr r1, =0X10B0 str r1,[r0] /* 4、设置GPIO1_IO03为输出 */ ldr r0, =0X0209C004 /*寄存器GPIO1_GDIR */ ldr r1, =0X0000008 str r1,[r0] mov pc ,lr //从子程序返回 mylowleve....

December 11, 2022 · 2 min · 364 words · nyaruko