第十一天: SD卡原理分析及SD卡启动详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Karven_/article/details/52202116
  1. 主流的外存设备
    1. 内存和外存的区别: 一般是把这种(random access memory,随机访问存储器,特点是任意字节读写,掉电丢失)叫内存,把ROMread only memory,只读存储器,类似与flash SD卡之类的,用来存储东西,掉电不丢失,不能随机访问,只能以块为单位来访问)叫外存
    2. 软盘、硬盘、光盘、CD、磁带
      1. 存储原理大部分为磁存储,缺点是读写速度、可靠性等。 优点是技术成熟、价格便宜。 广泛使用在桌面电脑中,在嵌入式设备中几乎无使用。
      2. 现代存储的发展方向是Flash存储,闪存技术是利用电学原理来存储 1 0 ,从而制成存储设备。所以闪存设备没有物理运动(硬盘中的磁头),所以读写速度可以很快且物理损耗。
    3. 纯粹的FlashNandFlashNorFlash
      1. 这些东西是最早出现的、最原始的Flash颗粒组成芯片。也就是说NandFlashNorFlash芯片中只是对存储单元做了最基本的读写接口,然后要求外部的SoC来提供Flash读写的控制器以和Flash进行读写时序。
      2. 缺陷:
        1. 读写接口时序比较复杂
        2. 内部无坏块处理机制需要SoC自己来管理Flash的坏块;
        3. 各家厂家的Flash接口不一致,甚至同一个厂家的不同型号、系列的Flash接口都不一致,这就造成产品升级时很麻烦。
        4. NandFlashMLCSLC两种。 SLC技术比较早,可靠性高,缺点是容量做不大(或者说容量大了太贵,一般SLC Nand都是512MB以下);MLC技术比较新,不成熟,可靠性差,优点是容量可以做很大很便宜,现在基本都在发展MLC技术。
    1. SD卡、MMC卡、MicroSDTF
      1. 这些卡其实内部就是Flash存储颗粒,比直接的Nand芯片多了统一的外部封装和接口。
      2. 这些卡都有统一的标准,譬如SD卡都是遵照SD规范来发布的。这些规范规定了SD卡的读写速度、读写接口时序、读写命令集、卡大小尺寸、引脚个数定义。这样做的好处就是不同厂家的SD卡可以通用。
    2. iNandMoviNandeSSD
      1. 电子产品如手机、相机等,前些年趋势是用SD/TF卡等扩展存储容量;但是近年来的趋势是直接内置大容量Flash芯片而不是外部扩展卡。
      2. 外部扩展卡时间长了卡槽可能会接触不良导致不可靠
      3. 现在主流的发展方向是使用iNand MoviNandeSSD(还有别的一些名字)来做电子产品的存储芯片。这些东西的本质还是NandFlash,内部有Nand的存储颗粒构成,再集成了块设备管理单元,综合了SD卡为代表的的各种卡的优势和原始的NandFlash芯片的优势。
      4. 优势
        1. SD卡学习,有统一的接口标准(包括引脚定义、物理封装、接口时序)
        2. 向原始的Nand学习,以芯片的方式来发布而不是以卡的方式
        3. 内部内置了Flash管理模块,提供了诸如坏块管理功能,然Nand的管理容易了起来
    3. SSD(固态硬盘)

 

  1. SD卡的特点和背景知识
    1. SD卡和MMC卡的关系
      1. MMC标准比SD卡标准早,SD卡标准兼容MMC标准
      2. MMC卡可以被SD卡读卡器读写,而SD卡不可以被MMC卡读卡器读写
      3. SD/MMC卡等卡类有统一的接口标准,而Nand芯片没有统一的接口标准
    2. SD卡与MicorSD的区别
      1. 体积大小区别而已,传输原理完全相同
    3. SD卡与TF卡的区别
  2. SD卡的编程接口
    1. SD卡的物理接口
      1. SD卡的物理接口又9个针脚与外界进行连接,这9个脚中有2个地,1个电源,6个信号线。
    2. SD协议与SPI协议
      1. SD卡与SRAM/DDR/SROM之类的东西的不同:SRAM/DDR/SROM之类的存储芯片总线式的,只要连接上初始化好之后就可以有SoC直接以地址来访问;但是SD卡不能直接通过接口给地址访问,它的访问需要按照一定的接口协议(时序)来访问
      2. SD卡虽然只有一种物理接口,但是却支持两种读写协议: SD协议 SPI协议

 

  1. SPI协议特点(低俗、接口操作时序简单、适合单片机)
    1. SPI协议是单片机中广泛使用的一种通信协议,并不是为SD卡专门发明的
    2. SPI协议相对SD协议来说速度比较低
    3. SD卡支持SPI协议就是为了单片机方便使用
  2. SD协议特点(高速、接口时序复杂,适合有SDIO接口的SoC
    1. Sd协议是专门用来和SD通信的。
    2. SD协议要求SoC中有SD控制器,运行在高速率下,要求SoC的主频不能太低
  3. S5PV210SD/MMC控制器
    1. 数据手册Section7
    2. SD卡内部除了存储单元Flash外,还有SD卡管理模块,我们SoCSD卡通信时,通过9针引脚以SD协议/SPI协议向SD卡管理模块发送命令、时钟数据等信息,然后从SD卡返回信息给SoC来交互。工作时每一个任务(譬如初始化SD卡、譬如读一个块、譬如写、譬如擦除······)都需要一定的时序来完成(所谓时序就是先向SD卡发送xx命令,SD卡回xx消息,然后再向SD卡发送xx命令··)
  1. S5PV210SD卡启动详解
    1. SoC为何要支持Sd卡启动
      1. 一个普遍性的原则就是SoC支持的启动方式越多,将来使用时就越方便,用户的可选择性就越大,SoC的适用面就越广。
      2. SD卡启动有一些好处:
        1. 譬如可以在不借用专用的烧录工具(类似与Jlink)的情况下对SD卡进行刷机,然后刷机后的Sd卡插入卡槽,SoC即可启动;譬如可以用SD卡启动进行量产刷机(量产卡)。向x210开发板,板子贴片好的时候,内部iNand是空的,此时直接启动无启动;板子出厂前官方刷机时是把事先做好的量产卡插入SD卡卡槽,然后打到iNand方式启动;因为此时iNand是空的所以第一启动失败,会转而第二启动,就从外部SD2通道的SD卡启动了。启动后会执行刷机操作对iNand进行刷机,刷机完成后自动重启(这回重启时iNand中已经有image了,所以可以启动了)。刷机完成后SD量产卡拔掉,烧机48小时,无死机即可装箱发货
    2. SD卡启动的难点在哪里(SRAMDDRSDCard
      1. SRAMDDR都是总线式访问的,SRAM不需初始化即可直接使用而DDR需要初始化后才能使用,但是总之CPU可以直接和SRAM/DRAM打交道;而SD卡需要时序访问,CPU不能直接和SD卡打交道;NorFlash读取时可以总线式访问,所以Norflash启动非常简单,可以直接启动,但是SD/NandFlash不行
      2. 以前只有NorFlash可以作为启动介质,台式机笔记本的BIOS就是NorFlash做的,后来三星在2440中使用了SteppingStone的技术,让NandFlash也可以作为启动介质。SteppingStone(翻译为启动基石)技术就是在SoC内部内置4KBSRAM,然后开机时SoC根据OMpin判断用户设置的启动方式,如果是NandFlash启动,则SoC的启动部分的硬件直接从外部NandFlash中读取开头的4KB到内部SRAM作为启动内容
      3. 启动基石技术进一步发展,在6410芯片中得到完善,在210芯片时已经完全成熟。210中有96KBSRAM,并且有一段iROM代码作为BL0,BL0再去启动BL1210中的BL0做的事情在2440中也有。只不过那时候是硬件自动完成的,而且没有体系没有210中这么详细)。
    3. S5PV210的启动过程回顾
      1. 210启动首先执行内部的iROM(也就是BL0)BL0会判断OMPin来决定从哪个设备启动,如果启动设备是SD卡,则BL0会从SD卡读取前16KB(不一定是16,反正16是工作的)到SRAM中去启动执行(这部分就是BL1,这就是SteppingStone技术)
      2. BL1执行后剩下的就是软件的事情了,SoC就不用操心了。
    4. SD卡启动流程(bin文件小于16KB和大于16KB
      1. 启动的第一种情况是整个镜像大小小于16KB,这时候这时候相当于于我的整个镜像作为BL1SteppingStone直接硬件加载执行了而已
      2. 启动的第二种情况就是整个镜像分为2部分:第一部分16KB大小,第一部分是剩下的大小,然后第一部分作为BL1启动,负责去初始化DRAM并且将第二部分加载到DRAM中去执行(uboot就是这样做的)
    5. 最重要的但是却隐含未将的东西
      1. 问题: iROM究竟是怎么样读取SD/NAndFlash的?
      2. 三星在iROM中实现内置了一些代码去初始化外部SD/NandFlash,并且内置了读取各种SD/NandFlash的代码在iROM 中。BL0执行时就是通过调用这些device copy  function来读取外部SD/NandFlash中的BL1
  1. S5PV210SD卡启动详解2
    1. SoC支持SD卡启动的秘密(iROM代码)
      1. 三星系列SoC支持SD/NandFlash启动,主要是依靠SteppingStone技术,具体在S5PV210中支持SteppingStone技术的是内部的iROM 代码

 

  1. 再看iROM  Device Copy Function
  2. 扇区和块的概念

 

  1. 早期的块设备就是软盘硬盘这类磁存储设备,这种设备的存储单元不是以字节为单位的而是以扇区为单位的。磁存储设备读写的最小单元就是扇区,不能只读或写部分扇区。这个限制是磁存储设备本身物理方面的原因造成的,也成为了我们编程时必须遵守的规律。
  2. 一个扇区有好多个字节,一般是512个字节。早期的磁盘扇区是512字节,实际上后来的磁盘扇区可以做的比较大(譬如1024字节,譬如2048字节,譬如4096字节),但是原来最早是512字节,很多的软件(包括操作系统和文件系统)已经默认了512这个数字,因此后来的硬件虽然物理上可能支持更大的扇区,但是实际上一般还是兼容512字节扇区这种操作方法
  3. 一个扇区可以看成是一个块block(块的概念就是:不是一个字节,是多个字节组成一个共同的操作单元块),所以就把这一类的设备称为块设备。常见的块设备有:磁存储设备硬盘、软盘、DVDFlash设备(U盘、SSDSD卡?NandFlashNorFlasheMMCiNand
  4. linux里有个mtd驱动,就是用来管理这类块设备的
  5. 磁盘和Flash以块为单位来读写,就决定了我们启动时device copy function 只能以整块为单位来读取SD
  1. 用函数指针方式调用device copy function
    1. 第一种方法:宏定义方式调用。好处是简单方便,坏处是编译器不能帮我们做参数的静态类型校验
    2. 第二种方法:用函数指针方式调用的方式很重要,
  1. S5PV210SD卡启动实战1
    1. 任务:大于16KBbin文件使用SD卡启动
      1. 总体思路:将我们的代码分为2部分: 第一部分BL1小于16KB,第二部分为任意大小,iROM代码执行完成从SDcopyDDR中正确位置,然后BL1远跳转到BL2中执行BL2
    2. 细节1:程序怎么安排? 程序整个分为2个文件夹BL1BL2.各自管理各自的项目
    3. 细节2 :BL1中要完成:关看门狗,设置栈、开iCache、初始化DDR、从SD卡复制BL2DDR中特定位置,跳转BL2
    4. 细节3 BL1SD卡中必须从Block1开始(Block不能用,这个是三星官方规定的),长度为16KB内,我们就定位16KB(也就是32block);BL1理论上可以从33扇区,但是实际上为了安全都会留一些空扇区作为隔离,譬如可以从45扇区,长度由自己定(实际根据自己的BL2大小来分配长度,我们实验时BL2 非常小,因此我们定义长度为16KB,也就是32扇区)
    5. 细节4 DDR初始化好之后,整个DDR都可以使用了,这时在其中选择一段长度足够BL2DDR空间即可。我们选0x23E00000(因为我们BL1中只初始化了DDR1 ,地址空间范围是0x20000000 )
  2. S5PV210SD卡启动实战2
    1. 烧录启动试验
    2. 代码分为两部分的缺陷
      1. 启动分为两部分,这种技术叫分散加载。这种分散加载的方法可以解决问题,但是比较麻烦。
      2. 分散加载的缺陷:第一,代码完全分两部分,完全独立,代码编写和组织上麻烦;第二,无法让工程项目兼容SD卡启动和Nand启动、NorFlash启动等各种方式
    3. uboot中的做法:
      1. 第二种思路:程序代码仍然包括BL1BL2两部分,但是组织形式上不分为两部分而是作为一个整体来组织。它的实现方式是:iROM启动然后从SD卡的扇区1开始读取16KBBL1然后去执行BL1BL1负责初始化DDR,然后从SD卡中读取整个程序(BL1+BL2)到DDR中,然后从DDR中执行(利用ldr pc =main 这种方式以远跳转从SRAM中运行的BL1跳转到DDR中运行的BL2
    4. 再来分析ubootSD卡启动细节
      1. uboot编译好之后有200dKB,超出了16KBuboot的组织方式就是前面16KBBL1,剩下的部分为BL2
      2. uboot在烧录到SD卡的时候,先截取uboot.bin的前16KB(实际脚本截取的是8KB)烧录到SD卡的block~block32;然后将整个uboot烧录到SD卡的某个扇区中(譬如49扇区)
      3. 实际上ubootSD卡启动时是这样的:iROM先执行,根据OMpin判断处启动设备是SD卡,然后从SD卡的block1开始读取16KB8KB)到SRAM中执行BL1BL1执行时负责初始化DDR,并且从SD卡的49扇区开始复制整个ubootDDR中指定位置(0x23E00000)去备用;   然后BL1继续执行知道 ldr pc, =main BL1跳转到DDR上的BL2中接着执行uboot的第二阶段。

总结:uboot中的这种方式比上节讲的分散加载的好处在于:能够兼容各种方式。

 

  1. 解决X210开发板的软开关按键问题
    1. X210开发板的软启动电路详解
      1. 210供电需要的电压比较稳定,而外部适配器的输出电压不一定那么稳定,因此半载了一个稳压器件MP1482。这个稳压芯片的作用就是外部适配器电压在一定范围内变化时稳压芯片的输出电压都是5V
      2. MP1482芯片有一个ENEnable)引脚,这个引脚可以让稳压芯片输出或关闭输出。EN为高电平时有输出电压,EN引脚为低电平时稳压芯片无输出。
      3. 三个因素可以影响EN引脚的电平:
        1. POWER按键(SW1),POWER按键按下时EN为高电平,POWER按键弹起时EN为低电平。
        2. POWER_LOCKEINT0)引脚,这个引脚为POWER_LOCK模式下高电平,则EN为高;若这个引脚为EINIT0模式或者为POWER_LOCK模式但是输出为低电平,则EN为低。
      4. 图中还有EINIT1引脚,这个引脚的作用是用来做中断的,提供给CPU用来唤醒的。
    2. 为什么要软启动
      1. 一般的电路设计都是用拨码开关来做电源开关的(普通的闭合通路开关)这种方式的优点是设计简单,缺点是电路太简单,整个主板要么有电路要么没电无法做休眠模式、低功耗模式等。
      2. 软启动电路是比较接近于实际产品的,其他开发板的硬开关其实是简化版的,和实际产品还有差异。
    3. 开发板供电置锁原理和分析
      1. 软开关在设计时有一个置锁电路,用EINT0,(也就是GPH0_2)引脚来控制的
      2. EINT0这个引脚是有复用设计(两个完全不相干的功能挤在同一个引脚上,同时我们只能让这个引脚用于其中一种功能,这就叫复用)的,一个是GPIO(也就是GPH0_2引脚)、一个是PS_HOLD_CONTROL.(注意EINT0功能算是GPIO下的一个子功能)
      3. PS_HOLDSection2.4 Power Management 章节下的4.10.5.8
      4. PS_HOLD_CONTROL寄存器(0xE010E18C),共有三个位有用
        1. bit0 0表示这个引脚为GPIO功能,1表示这个引脚为PS_HOLD功能
        2. bit9 0表示这个引脚方向为输入,1表示这个引脚方向为输出
        3. bit8 0表示这个引脚输出为低电平,1表示输出为高电平
    4. 写代码+实验验证
      1. 要想让开发板和普通的开发板一样,一按下按键程序运行后即可松手不会断电,则只要在程序的开头部分添加代码去置锁开关板即可
      2. 置锁代码的方法是: PS_HOLD_CONTROL寄存器的bit0891即可
      3. 注意此时关机需要使用复位键即可。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/Karven_/article/details/52202116
今日推荐