ARM芯片开发(S5PV210芯片)——SD卡启动

1、SD卡启动

顾名思义就是启动代码存放在SD卡中,设备从SD卡中启动。用SD卡启动有一些好处:譬如可以在不借用专用烧录工具(类似Jlink)的情况下对SD卡进行刷机,然后刷机后的SD卡插入卡槽,SoC既可启动;譬如可以用SD卡启动进行量产刷机(量产卡)。

2、支持SD卡启动的条件

SD卡启动不是每款芯片都支持的,因为SD卡有个难点,就是SD卡不能上电直接使用也不能通过总线与CPU相连,要通过Soc的SD卡控制器发命令才能与SD卡通信。这个有个矛盾点,SD卡需要初始化才能使用,但是能初始化SD卡的启动代码又在SD卡上,这就陷入了死锁。所以之前的设备都是用Norflash做启动介质,因为NorFlash上电即可使用,还可以片内执行。为了解决SD卡的启动问题,三星提出了启动基石(SteppingStone)的技术。

3、SteppingStone

SteppingStone技术就是在Soc内部内置小容量的IROM和IRAM,在IROM中内置一些固定的代码,其中就包含SD卡的初始化函数,然后SD卡初始化的代码可以在IRAM中执行,这样外部的SD卡初始化的问题就解决了。只需要将启动方式设置成SD卡启动,上电Soc就会去初始化SD卡,然后就可以去SD卡上读取启动代码,顺利启动设备。之所以能提前内置SD卡的初始化函数,是因为SD卡是有协议标准的,无论哪个厂家的SD卡都是遵照SD卡协议,这样的好处就是只要你接入的是标准的SD卡那内置的SD卡函数都能成功初始化,这都是标准化带来的好处。

4、启动方式的选择

S5PV210芯片支持不止一种启动方式,包括iNand、SD卡、Uart等,所以要选择启动方式为SD卡才能顺利从SD卡启动。启动方式的选择是硬编码,不是通过软件去设置。S5PV210可以在上电去读取某几个引脚的高低电平来知道当前设置的启动方式,在外部表现就是开发板上有OM脚,通过去拨动OM脚去施加高/低电平来设置启动方式。具体怎么设置,可以去查数据手册。

5、数据手册中关于SD卡启动的说明

5.1、Global Variable(0xD0037488)

在这里插入图片描述

该表格中列出的是某些特殊地址代表的含义,可以理解成全局变量,因为你已经知道地址就可以直接去取该地址处的数据。0xD0037488是在Soc的IRAM中,硬件会根据当前的启动方式自动赋值。S5PV210支持SD卡通道0和通道2启动,当通过OM脚设置成从通道0启动时,0xD0037488地址处的值为EB000000,设置成通道2启动时,0xD0037488地址处的值为EB200000。在uboot中可以读取该地址处的值来知道当前从哪个SD卡通道启动。

5.2、 设备复制函数

在这里插入图片描述

表格中列出的地址中保存的数据是各个内置函数所在IROM中的地址,也就是相当于告诉你函数指针,你只需要将得到的地址强制转换成对应函数类型的函数指针就可以操作。其中0xD0037F98地址中保存的就是从SD卡读取数据函数所在的地址,该函数就包含了对SD卡的初始化。需要强调,不可直接将表格中的地址强制转换成函数指针去操作,该地址保存的是函数所在的地址,你可以发现表格中的地址都是相差4字节,怎么可以放下一个函数,但是4字节刚好是一个指针的大小,要得到函数所在地址要做一次转换。

5.3、SD卡赋值函数操作说明

在这里插入图片描述

表格中高亮的部分就是通过宏定义的方式去引用SD卡赋值函数,但是更推荐用函数指针的方式去引用,因为宏定义不会检查参数类型,而函数会。下面提供用函数指针去引用该函数,摘抄自uboot。

//定义函数指针类型
typedef u32(*copy_sd_mmc_to_mem)(u32 channel, u32 start_block, u16 block_size, u32 *trg, u32 init);
//取0xD0037F98地址处的数据强制转换成SD卡复制函数进行操作
copy_sd_mmc_to_mem copy_bl2 =(copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));

5.3.1、SD卡赋值函数参数说明

channel:SD卡通道号,表示当前要从哪个SD卡通道读取数据;
start_block:从SD卡的哪个扇区开始读;
block_size:读取多少个块;
trg:将读取到的数据存放到哪个地址;
init:是否初始化,一般填0;

猜你喜欢

转载自blog.csdn.net/weixin_42031299/article/details/118230939
今日推荐