SD卡启动



开机后,现从Soc内部的iROM(ROM)的64KB的代码BL0执行,判断用户的OMpin管脚时拨到了哪里,选择什么为启动介质,如SD/MMC/USB等。如果拨到了SD卡为启动介质,则先从SD卡启动介质中,读取16KB,BL1(官方说是可变的,但代码中是不可变的)到96KB的SRAM中运行。到此为止就是steppingstone技术。BL1是我们写的,是我事先写好放在外部的SD卡nandflash等中的。

当我们在SD卡启动的时候:第一种情况,如果整个镜像的大小小于16KB的话,这个时候就相当于我们整个镜像就做为BL1通过steppingstone技术直接硬件加载执行了。

第二种情况,如果整个镜像的大小大于16KB的时候,那么这部分镜像就要分为两个部分,第一部分为16KB,做为BL1加载到96KB的SRAM中去执行启动,并且初始化DRAM,完了将第二部分的大的代码BL2加载到DRAM中去执行。

Soc将BL1读取到iram中去运行,运行结果是将DDR(DRAM)给完全初始化,接着将BL2中的代码复制到DDR中,复制到DDR中的过程,其实就是读SD卡的过程,这个过程也就是先把SD卡的初始化(包括初始化读SD卡内容等的函数),这些代码不用我们自己去写,irom中已经内置了这部分代码。接着我们只需要调用这些函数,将SD卡BL2中的代码直接复制到DDR(DRAM)中正确位置。这时BL1代码还在执行,我们就从BL1远眺转到BL2中执行BL2即可,这样就可以在内存空间很大的DRAM中执行了,并且也将BL2代码复制到了DDR中,也将DDR初始化了。

三星在iROM中内置了一部分代码,这部分代码去初始化外部的SD/NandFlash,并且内置了读取各种SD/NandFlash等的代码(函数)在iROM中,BL0执行时就是通过调用这些device copy function去读取BL1的。

我们写的程序是放在SD卡中,有两部分,一部分是BL1,一部分是BL2,BL1的大小我们要写的小于16KB,这是官方规定的。BL2可以任意大小。所以我们写程序的话,程序我们就可以划分为两个部分,即可以创建一个BL1代码的文件,和一个BL2代码的文件。

我们在使用SD卡的使用,要从SD卡的BLOCK1开始的16KB以内写代码,就是从BLOCK1开始写代码,最多写32个扇区,也就是BLOCK1~BLOCK32,每个扇区BLOCK为512B,所以是16KB是32个扇区。这也是三星官方规定的,因为SD卡的BLOCK0区域是要保留的,不能写。官方规定的,因为S5PV210内部读取SD卡时就是从SD卡的BLOCK1开始读的,这可能是因为iROM中的代码读SD卡时就是从BLOCK1开始读的原因。所以九鼎出的那个SD卡烧录工具在烧录代码时就是从SD卡的BLOCK1开始烧的。

我们在写BL1时,写的程序是,关看门狗,设置栈,开icache初始化DDR,将SD卡BL2的代码复制到DDR的特定位置中,程序这时还在BL1中运行,我们要用一个长跳转指令跳转到DDR的BL2的代码,去执行BL2。我们将BL2复制到DDR中的特定位置,我们给一个特定的地址0x23e00000(因为这个地址Uboot也设定的这个,其实设定为0x20000000也行)因为我们BL1中的代码只初始化了DDR1,DDR1的地址范围时0x20000000~0x2fffffff,只有256MB,(这个地址范围和大小还要去看,目前记得不是很清楚)

我们在写BL2时,实际上不是接着16KB后的BLOCK33开始写的,而是和BL1的BLOCK1~BLOCK32的内容隔了一些安全区,可以隔一定的距离在去写BL2,是为了防止,如果接着BLOCK32之后的BLOCK33开始写BL2,很有可能会因为自己的原因把BL2的代码充掉了。因此我们一般都会隔一些距离,比如BL2的代码我们会放在BLOCK45去写。


启动的详细过程看代码。

宏定义的方式,不能帮助我们去做参数的静态类型检查

typedef的方式定义,可以帮助我们去做参数的静态类型检查。




SD卡怎么在Linux中显示,将SD卡插入读卡器中,插入电脑中,现在SD卡是在windows底下的,切换到linux

在虚拟机中有个选项可以让SD卡从windows中断开连接,连接到linux中,怎么在linux中,看见SD卡的内容呢,

在linux的命令行下,输入ls /dev/sd* 即可。

/dev/sdb 就是我们的SD卡,/dev/sdb1 是我们SD卡的分区。只有1个分区

/dev/sda 是我们硬盘,/dev/sda1 是我们硬盘的分区,有很多个分区


我们写的第一种方式SD卡去启动,这种方式是叫做分散加载,很难兼容其他的启动介质。因为你的代码整体是

分别两部分,将来下载时也是分成两部分去下载的。有缺陷

uboot中的启动方式是很好的:

首先irom中的BL0代码执行,判断OMpin管脚选择了哪种启动方式,如果为SD卡启动

也先从SD卡的block1开始读取16KB(8KB)大小的BL1代码到sram中去运行,运行的

结果是负责初始化DDR,同时将整个uboot代码(BL1,BL2)copy到DDR的确定地址中去,这时BL1还在sram中执行,知道执行到ldr pc, = main,长跳转到DDR中的去执行

uboot的第二阶段(BL2),uboot的第一阶段是在sram中执行的,第二阶段是在DDR中执行的。

uboot的这种方式,让BL1和BL2同时copy到了DDR中,这样可以兼容其他介质的启动。