×
单片机 > 单片机程序设计 > 详情

S5PV210的SD卡启动实战1~2

发布时间:2021-08-16 发布时间:
|

待烧录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.



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义