x210项目重新回顾之八自己写启动代码

这是对朱老师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拷贝方式也不能结合手动代码重定位。二者只能其一。

你可能感兴趣的:(#,uboot,#,裸机,c语言,linux,uboot,x210)