这是对朱老师x210裸机课程补充: 视频链接:朱老师x210课程补充--拷贝bootload从SD卡到ddr_哔哩哔哩_bilibili 1.前半部分为代码重定位到内存 代码在news5pv210/noOS/sdram_relocate at master · jimingkang/news5pv210 · GitHub 注意: A) 链接地址0x20000000 B)代码重定位到20000000: adr r0, _start ldr r1, =_start ldr r2, =bss_start cmp r0, r1 beq clean_bss copy_loop: ldr r3, [r0], #4 str r3, [r1], #4 cmp r1, r2 bne copy_loop clean_bss: ldr r0, =bss_start ldr r1, =bss_end cmp r0, r1 beq run_on_dram mov r2, #0 clear_loop: str r2, [r0], #4 cmp r0, r1 bne clear_loop C)跳转: mov lr,pc ldr pc, =main mov lr,pc ldr pc, =buzzer_on 2.后半部分为拷贝mynoos.bin从SD卡到ddr(没用分散加载,而是模拟uboot方式) 代码在news5pv210/noOS/ddrinandmmc at master · jimingkang/news5pv210 · GitHub 注意: A) 链接地址0x20000000 C)sd_relocate.c中 SD_BLOCK_CNT=50(因为我的mynoos.bin大于16k,32块) #define SD_START_BLOCK 45 #define SD_BLOCK_CNT 50 #define DDR_START_ADDR 0x20000000 typedef unsigned int bool; // 通道号:0,或者2 // 开始扇区号:45 // 读取扇区个数:32 // 读取后放入内存地址:0x23E00000 // with_init:0 typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool); typedef void (*pBL2Type)(void); // 从SD卡第45扇区开始,复制32个扇区内容到DDR的0x23E00000,然后跳转到23E00000去执行 void copy_bl2_2_ddr(void) { // 第一步,读取SD卡扇区到DDR中 pCopySDMMC2Mem p1 = (pCopySDMMC2Mem)(*(unsigned int *)0xD0037F98); p1(2, SD_START_BLOCK, SD_BLOCK_CNT, (unsigned int *)DDR_START_ADDR, 0); // 读取SD卡到DDR中 // 第二步,跳转到DDR中的BL2去执行 //pBL2Type p2 = (pBL2Type)DDR_START_ADDR; //p2(); //main(); } D)writesd中:210.bin由mynoos.bin经mk210制作而来,内容一样 #!/bin/sh sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1 sudo dd iflag=dsync oflag=dsync if=mynoos.bin of=/dev/sdb seek=45 E)也可以用sd_fusing.sh 烧写,但是bl2开始块必须和sd_relocate.c中SD_START_BLOCK一致 F)必须用sd拨码启动,而不是用go d0020010启动 G)go d0020010只能适用于手动代码重定位(见第一部分),不能适用sd到ddr拷贝方式;sd到ddr拷贝方式也不能结合手动代码重定位。二者只能其一。