待烧录bin程序大于16kb,
分bl1 16kb,
16kb以后的为bl2两部分,
从sd卡复制bl2到ddr中特定位置,跳转执行bl2。
BL1大致要做,关开门狗,设置栈,开iCache,初始化DDR,从SD卡赋值BL2到DDR中特定位置,
然后跳转执行BL2,
这个图是SD卡布局图,BLOCK 0是保留的,
这个细节在linux下使用命令烧录可以看出来,
#!/bin/sh
sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1
而直接使用烧录工具,这个细节就被工具本身屏蔽了,so看不出来,
之前的BL1到BL2的跳转是通过远跳转指令来实现的,那是因为它们是一起链接的,
但是现在这个是独立的,so不能那样跳转,
在这里,因为我们知道BL2的地址是多少,so可以使用地址来进行强制跳转,即函数指针,
下面是老师的代码,看了后,蛮有感觉的,
#define SD_START_BLOCK 45
#define SD_BLOCK_CNT 32
#define DDR_START_ADDR 0x23E00000
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)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();
}
The SD/ MMC host controller is a combo(组合) host for Secure Digital card and MultiMediaCard.
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』