SD卡

注意:本资料来源于朱友鹏老师的课程的视频,只用于学习使用,如用于其他用途,请联系朱老师本人,不然后果自负,不允许转载!!!
内存:RAM、随机读取、掉电丢失
外存:ROM、只读存取、类似于flash、SD卡 以块为单位访问、掉电不丢失

内存发展的历史:
(1)磁存储设备:缺点是读取速度、可靠性。优点:技术成熟、价格便宜。在嵌入式设备中几乎无使用。
(2)现在的存储发展方向是Flash存储,闪存技术是利用电学原理来存储1和0,从而制成的存储设备。所以闪存设备没有物理运动,读取速度可以很快,而且无物理消耗。
(3)纯粹的Flash:NandFlash、NorFlash
Nandflash、Norflash芯片中最基本的读写接口,然后要求外部的Soc来提供读写控制器和flash时序,缺点是无坏块处理。
Nandflash分为MLC和SLC两种,SLC技术比较早,可靠性高,缺点是容量做不大。MLC技术比较新,不成熟,可靠性差(容易出错,校验为软件校验比较复杂,而且影响读取速度),后来基于MLC的基础上出现了iNand。

SD卡、MMC卡、MicroSD、TF卡

内部是Flash,只是多了外部的封装和接口。有专门的SD卡协议来规定
D卡的读写速度、读写接口时序、读写命令集、卡大小尺寸、引脚个数及定义。

iNand、MoviNand、eSSD

前些年手机、相机等用SD卡/TF卡等拓展内存容量,但是近年来有MLC+硬件校验的技术=iNand可以把内存容量做的很大。所以就不需要SD卡等设备了。
iNand优势:
1、有统一的接口标准
2、以芯片的方式发布
3、内置flash管理模块,提供了注入坏块管理等功能。

SD卡有写保护而TF卡没有,TF卡可以通过卡套转成SD卡使用。

SSD固态硬盘
SD卡协议

SD卡由9个针脚与外界来连接,2个地,一个电源,6个信号线。
SD卡与SRAM/DDR/SROM之类的东西的不同:SRAM/DDR/SROM之类的存储芯片是总线式的,只要连接上初始化好之后就可以由SoC直接以地址方式来访问;但是SD卡不能直接通过接口给地址来访问,它的访问需要按照一定的接口协议(时序)来访
SD卡可用的协议分为SPI和SD卡协议。
SPI协议的特点:SPI协议是单片机中广泛使用的一种协议用来读取SD卡。缺点是较SD协议速度低。SPI协议就是用来支持单片机方便使用的。
SD卡协议的特点:SD协议专门用来和SD卡通信的。Soc中内置SD控制器用来和SD卡通信的,运行在高速率下,要求Soc主频不能太低。

通信时通过9针脚以SD协议/SPI向SD卡管理模块发送命令、时钟、数据等信息,然后从SD卡返回信息来给Soc来交互。工作时通过时序来完成(时序就是发送xx信息,然后SD卡回xx消息,然后再向SD卡发送xx命令····)

S5PV210的SD卡启动详解

SD卡有一些好处:譬如可以在不借用专用烧录工具(类似Jlink)的情况下对SD卡进行刷机,然后刷机后的SD卡插入卡槽,SoC既可启动;譬如可以用SD卡启动进行量产刷机(量产卡)。
SD卡启动难点:
1、SRAM、DDR都是总线式访问的,SRAM不需要初始化,DDR需要初始化,NorFlash读取时可以总线式访问,所以Norflash启动非常简单,可以直接启动,但是SD/NandFlash不行。
2、以前只有Norflash可以作为启动介质,台式机笔记本的BIOS就是Norflash做的。三星公司为了推出Nandflash做启动介质,使用了SteppingStone的技术,就是让iROM和4KB的SRAM,开机为Nandflash启动,则先读取4KB的Nandflash到SRAM,然后运行。
在210中,由96KB的SRAM,并且有一段iROM作为BL0,BL0启动BL1,BL1启动BL2
详细过程
1、(大于16KB的情况):iROM代码执行(BL0),(SD卡已经在iROM中初始化完毕可以直接使用SD卡),判断OMpin的状态,如为SD卡模式,从SD卡中读取16KB的大小(BL1),BL1到SRAM中执行(关看门狗,开icatch,初始化栈等操作),并且初始化DDR,并且把BL2复制到DDR中(0x23E00000),然后跳转(跳转是通过函数指针的方式把0x23E00000当作函数的首地址,再通过link.文件运行0x23E00000地址,和start.S(它中由跳转main函数))到DDR中去运行程序。
2(小于16kb):直接把程序烧到BL1处即可。

细节:

1、BL1在SD卡中必须从Block1开始(Block0不能用,这个是三星官方规定的),长度为16KB内,我们就定为16KB(也就是32个block);BL1理论上可以从33扇区开始,但是实际上为了安全都会留一些空扇区作为隔离,譬如可以从45扇区开始,长度由自己定(实际根据自己的BL2大小来分配长度,我们实验时BL2非常小,因此我们定义BL2长度为16KB,也就是32扇区)。
2、BL2远跳转
(1)因为我们BL1和BL2其实是2个独立的程序,链接的时候我们也是独立分开链接的,所以不能使用ldr pc, =main这种方式来通过链接地址实现远跳转到BL2,我们是使用地址强制转换跳转,因为我们知道BL2的内存地址是0x23E00000所以直接去执行这个地址即可。
iROM中内置了读取各种SD卡/NandFlash的代码,在iROM的手册中iROM application note:block device copy function开一看到。

缺陷:

代码分成2个部分,这种技术叫分散加载,这种分散加载的方法可以解决问题,但是比较麻烦,这种分散加载的缺点是
1、代码完全分成2部分,完全独立,代码编写和组织上麻烦
2、无法让工程项目兼容SD卡启动,Nand启动,Norflash启动等各种方法。

Uboot的做法

程序依然分成BL1和BL2两部分,但是组织形式上部分2部分而是作为一个整体来组织的,他的实现方式是:iROM启动然后从SD卡的扇区1开始读取16KB的BL1,然后去SRAM中执行BL1,BL1负责初始化DDR,然后从SD卡中读取整个程序(BL1和BL2)到DDR中,然后DDR中执行(利用ldr pc, =main这种方式以远跳转从SRAM中运行的BL1跳转到DDR中运行的BL2)。

再来分析uboot的SD启动细节
烧录

1、uboot编译好之后有200多KB,超出了16KB。uboot的组织方式就是前面16KB为BL1,剩下的部分为BL2.
2、uboot在烧录到SD卡的时候,先截取前16KB烧录到SD卡的block1~bolck32,然后在将整个uboot烧录到SD卡的某个扇区中(譬如49扇区)

SD启动

3、实际uboot从SD卡启动的时候是这样的:iROM启动,根据iMpin判断出启动设备的启动方式,SD卡启动,然后从SD卡的block1开始读取16KB到SRAM中,开始运行初始化DDR,从SD卡的49扇区开始复制整个uboot到DDR中指定位置(0x23E00000),然后BL1继续执行直到 ldr pc, =main时BL1跳转到DDR上的BL2中接着执行uboot的第二阶段。
总结:uboot中的这种启动方式比上节讲的分散加载的好处在于:能够兼容各种启动方式。

uboot的疑问

1、uboot从DDR中执行ldr pc, =main如何实现从SRAM中的BL1跳转到DDR中的BL2,(不是BL1和BL2 一起被复制到DDR中的吗?是如何知道DDR中BL2的地址的?)
2、L1执行时负责初始化DDR,并且从SD卡的49扇区开始复制整个uboot到DDR中指定位置(0x23E00000)去备用;然后BL1继续执行直到ldr pc, =main时BL1跳转到DDR上的BL2中接着执行uboot的第二阶段。
这里的执行BL1执行ldr pc, =main时这里是通过什么方式跳转的?main函数的结构又是如何写的?

扇区和块的概念

1、早期的扇区是软盘这类磁存储设备,这种设备的存储单元都是不是以字节为单位,是以扇区为单位的,比如想读取一个字节,就必须读取一个扇区。
2、一个扇区=512Byte,后来也有其他的,如1024字节、2048字节但是由于之前做操作系统和文件系统是用的是512字节,为了兼容,现在都是512字节的。
3、SD卡中一个扇区=一个块
4、linux里有个mtd驱动,就是用来管理这类块设备的。
5、磁盘和Flash以块为单位来读写,就决定了我们启动时device copy function只能以整块为单位来读取SD卡。

用函数指针方式用device copy function
1、第一种方法:用宏定义来调用,好处是简单方便,坏处是编译器不能帮我们参数的静态类型检查
2、第二种方法:用函数指针方式来调用

解决X210开发板的软开关按键问题

看原理图可知:EINT0这个引脚GPIO和作为电源锁。
只要把是这个引脚设为输出、高电平、PWR_Lock模式就可以实现软锁定电源的问题。
代码:只要将start.S将以上3位置1即可。
具体分析如下:
X210开发板的软启动电路详解
(1)210供电需要的电压比较稳定,而外部适配器的输出电压不一定那么稳定,因此板载了一个文稳压器件MP1482.这个稳压芯片的作用就是外部适配器电压在一定范围内变化时稳压芯片的输出电压都是5V。
(2)MP1482芯片有一个EN(Enable)引脚,这个引脚可以让稳压芯片输出或关闭输出。EN为高电平时有输出电压,EN引脚为低电平时稳压芯片无输出。
(3)两个因素可以影响EN引脚的电平:第一个是POWER按键(SW1),POWER按键按下时EN为高电平,POWER按键弹起时EN为低电平;第二个是POWER_LOCK(EINT0)引脚,这个引脚为POWER_LOCK模式下高电平,则EN为高;若这个引脚为EINT0模式或者为POWER_LOCK模式但输出为低电平,则EN为低。
(4)图中还有EINT1引脚,这个引脚的作用是用来做中断,提供给CPU用来唤醒的。

为什么要软启动
(1)一般的电路设计都是用拨码开关来做电源开关的(打到一侧则接通,打到另一侧则关闭)。这种方式的优点是设计简单,缺点是电路太简单,整个主板要么有电要么没电无法做休眠模式、低功耗模式等。
(2)软启动电路是比较接近于实际产品的,其他开发板的硬开关其实是简化版的,和实际产品还有差异。

开发板供电置锁原理和分析
(1)软开关在设计时有一个置锁电路,用EINT0(也就是GPH0_2)引脚来控制的。
(2)EINT0这个引脚是有复用设计(两个完全不相干的功能挤在同一个引脚上,同时我们只能让这个引脚用于其中一种功能,这就叫复用)的,一个是GPIO(也就是GPH0_2引脚)、一个是PS_HOLD_CONTROL。(注意:EINT0功能算是GPIO下的一个子功能)
(3)PS_HOLD在Section2.4 Power Management章节下的4.10.5.8节下。
(4)PS_HOLD_CONTROL寄存器(0xE010E81C),共有3个位有用。
bit0, 0表示这个引脚为GPIO功能,1表示这个引脚为PS_HOLD功能
bit9,0表示这个引脚方向为输入,1表示这个引脚方向为输出
bit8,0表示这个引脚输出为低电平,1表示输出为高电平。
分析:我们要使用软启动置锁,则需要将bit0、8、9都置为1即可。

写代码+实验验证
(1)要想让开发板和普通的开发板一样,一按下按键程序运行后即可松手不会断电,则只要在程序的开头部分添加代码去置锁开关板即可。
(2)置锁代码的方法是:给PS_HOLD_CONTROL寄存器的bit0、8、9均写入1即可。
(3)注意:此时开发板已经置锁,POWER按键已经失效,关机时需要按下复位按键。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值