S5PV210的SD卡启动实战1~2

本文详细介绍了物联网设备从BL1到BL2的启动加载过程,包括如何从SD卡读取BL2并复制到DDR内存中执行的具体步骤。此外,还提供了实现这一过程的示例代码。

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org

 

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值