SD卡驱动开发心得体会

最近在负责SD卡驱动的开发移植工作,支持vfat文件系统,现在谈一下开发心得吧!

 

      SD卡高度集成闪存,具备串行和随机存取能力。可以通过专用优化速度的串行接口访问,数据传输可靠。接口允许几个卡垛叠,通过他们的外部连接。接口完全符合最新的消费者标准,叫做SD卡系统标准,由SD卡系统规范定义。 SD卡系统是一个新的大容量存储系统,基于半导体技术的变革。它的出现,提供了一个便宜的、结实的卡片式的存储媒介,为了消费多媒体应用。SD卡可以设计出便宜的播放器和驱动器而没有可移动的部分。一个低耗电和广供电电压的可以满足移动电话、电池应用比如音乐播放器、个人管理器、掌上电脑、电子书、电子百科全书、电子词典等等。

 

一、SD Bus Protocol

  SD总线有两种SD Bus和SPI Bus。笔者以SD Bus为例:

  SD Bus由CLK,CMD,DAT0-3,VDD,VSS组成。SD bus模式下的命令和数据流都有一个起始位和一个停止位。命令格式固定为48bits,(start bit 固定为‘0’)+ (transmitter bit为‘1’)+(command & address or parameter)+(CRC7)+(end bit '1')。

   而响应格式有两种,看命令响应的类型,R1,R3,R6的响应格式为,(start bit 固定为‘0’)+ (transmitter bit为‘0’)+(command & status(R1),OCR(R3)or RCA(R6))+(CRC7)+(end bit '1')。R2的响应格式为,(start bit 固定为‘0’)+ (transmitter bit为‘0’)+(CID or CSD))+(CRC7)+(end bit '1')。

 

二、SD卡初始化处理

  首先初始化一下controller,比如fifo,dma模式,enbale位等。初始化好了controller后,需要设置一下啊通讯时钟,设好后就可以去跟SD memory card去做沟通了。这个过程都是通过发送CMD来完成的,首先读取controller的detect寄存器,看有没有卡插入,有插入的情况下才发送CMD0去reset card to idle state,再发送CMD8,把controller提供的电压信息和check pattern发送给SD卡,这一步成功就可以发送ACMD41去获取SD OCR信息,这一步需要把controller的capacity support info和要求SD发送它的OCR给controller,这一步成功后,就可以接着发送CMD2去读SD的CID信息,再发CMD3去读SD卡的RCA,再发CMD9去读SD卡的CSD,这个很重要,卡的容量信息在这里面,再设置通讯bus的宽带,有1线跟4线的区别,最后把CLK设置高一些,可以为25MHZ,这样读数据就快很多。到此为止,卡的初始化工作已经完成,可以进行读写。

 

三、如何判断SD卡是standard SD card还是high capacity SD card

    在初始化过程中,发送ACMD41后,获取的SD OCR寄存器信息,在它的第30bit也就是CCS(card capacity status),如果该位为1,则表明是high capacity SD card,为0的话就是standard SD card。

 

四、SD信息注册给VFAT

   由于需要读取SD卡中vfat文件系统中的文件,因此我们需要把SD卡read操作函数指针、设备类型、容量信息、CID信息注册给fat部分。就是这个结构static block_dev_desc_t mmc_blk_dev = {0};

 

 mmc_blk_dev.if_type = IF_TYPE_MMC;
 mmc_blk_dev.part_type = PART_TYPE_DOS;
 mmc_blk_dev.dev = 0;
 mmc_blk_dev.lun = 0;
 mmc_blk_dev.type = 0;

 mmc_blk_dev.blksz = STORAGE_BLOCK_SIZE;
 /*mmc_blk_dev.lba = 0x400000; get from CSD info */
 mmc_blk_dev.removable = 0;
 mmc_blk_dev.block_read = mmc_block_read;
 ret = fat_register_device(&mmc_blk_dev, 1);

 

把该结构填好后,调用fat_register_device(&mmc_blk_dev, 1)注册。

 

五、uboot下FAT

    uboot下支持fat12、16、32。在 fat_register_device这个接口中有一个bug,用mkdosfs格式化的SD卡,其生成的MBR信息跟在PC上不一样。fat.c中的代码片段&buffer[DOS_FS_TYPE_OFFSET]起始的3个字节数据是否为“FAT”来判断其文件系统是不是FAT格式的,DOS_FS_TYPE_OFFSET为0x36,但是用mkdosfs格式化的SD卡,其生成的MBR信息,其"FAT"描述在偏移0x52处,所以在fat_register_device()接口中需要做兼容性调整。这个小bug可以从static int
read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)这个接口的实现里看出。在这个
read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)接口中已经做了兼容,在boot sector中fat_length,如果为0的话,就做了增加偏移量,用mkdosfs格式化的SD卡,其生成的MBR信息中fat_length恰恰为0.

 

六、总结

   SD卡驱动开发并不复杂,在写代码之前先把SD卡协议搞清楚,再把controller的寄存器意思搞明白,就可以动手干活了。调试是痛苦滴,SD work成功了,也会带来一丝喜悦!

 

 

 

 

时间: 2024-09-24 23:00:40

SD卡驱动开发心得体会的相关文章

FL2440 2.6.28 SD卡驱动BUG解决

FL2440的2.6.28的内核,SD卡驱动默认是有问题的, 在linux-2.6.28.7/drivers/mmc/host目录的s3cmci.c文件的do_pio_write函数中做如下修改: [cpp] view plaincopystatic void do_pio_write(struct s3cmci_host *host)  {  void __iomem *to_ptr;  int res; u32 fifo; u32 *ptr;  to_ptr = host->base + h

Linux驱动之挂在SD卡

      讲解之前我得说一下,现在有一个新的技术在公司已经在用了,远远比你在学校学的东西要先进一点,我们烧写u-boot程序一般是在flash上,然后由flash中的程序来引导linux内核,但是flash成本远远比SD卡要高,现在公司很多都用SD卡来代替flash,这个具体怎么实现,还得自己去学习,我目前也不是很熟悉这个新的技术,就不写出来了,等我熟悉以后再写出来分享吧. Linux中对S3C2440 SD驱动已经支持的非常好.为了让FL2440支持2G以上的SD卡,只需要完成几个步骤即可.

Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

/*********************************************************************************** * * linux 3.5,U-Boot,Busybox,SD卡启动环境搭建 * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 以下所有的shell命令都是在root权限下运行的; * 3. minicom(U-Boot)指的是用minico

Android2.3实现SD卡与U盘自动挂载的方法_Android

本文实例讲述了Android2.3实现SD卡与U盘自动挂载的方法.分享给大家供大家参考,具体如下: 在 s3c6410平台上移植android2.3 过程中SD卡总是不能自动挂载. 查阅相关资料,知道在android2.3中是 vold程序负责检查内核的 sysfs 文件系统,发现有SD卡插入后,自动挂载. 在文件系统目录 /system/etc/  下有一个vold.fstab 文件,该文件是系统与用户硬件平台的交互接口,用户根据自己的平台来配置这个文件,里面内容比较简单,只需要你指定sys下

Android2.3实现SD卡与U盘自动挂载的方法

本文实例讲述了Android2.3实现SD卡与U盘自动挂载的方法.分享给大家供大家参考,具体如下: 在 s3c6410平台上移植android2.3 过程中SD卡总是不能自动挂载. 查阅相关资料,知道在android2.3中是 vold程序负责检查内核的 sysfs 文件系统,发现有SD卡插入后,自动挂载. 在文件系统目录 /system/etc/  下有一个vold.fstab 文件,该文件是系统与用户硬件平台的交互接口,用户根据自己的平台来配置这个文件,里面内容比较简单,只需要你指定sys下

基于全志A20 android4.2平台如何支持三个SD卡

基于全志A20 android4.2平台如何支持三个SD卡            做过android平台的同仁大多都知道android原生态只支持了一个sd卡,默认的挂载点也就是/mnt/sdcard,所以在应用中使用getExternalStorageDirectory()得到的都是/mnt/sdcard,通常会symlink 到/sdcard目录.做过全志平台的童鞋也知道全志android SDK支持2个sd卡,通常是一个内置的,一个外置的,内置的一般是从nand上或者emmc上的用户数据区

信号-安卓开发 如何将float数组 进行音频编解码 转换成wav音频格式 储存到sd卡内部

问题描述 安卓开发 如何将float数组 进行音频编解码 转换成wav音频格式 储存到sd卡内部 最近正在学习安卓音频相关的一些知识,再SD卡里面读取一个wav音频文件,然后对这个文件进行噪音消除,最后输出的数据都是float格式的,这些数据用matlab中的wavwrite函数转换成wav是没有问题的,但是在安卓上如何将这些数据转换成wav还需要大神们请教,应该需要编解码的过程,如果有做这方面的大神 请知道指导...谢谢了 这段代码是将IFFT处理后的文件储存到res里面,因为是分帧进行的信号

【ANDROID游戏开发十三】(保存游戏数据 [下文])详解SQLITE存储方式,并把SQLITE的数据库文件存储在SD卡中!!!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/329.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

在icool6410开发板上从SD卡booting失败, 怎么解决

问题描述 在icool6410开发板上从SD卡booting失败, 怎么解决 我几天前买一个开发板,当出板上已经安装了wince.我想安装Android 所以按照手册的指示进行booting操作.首先,我准备了一个TF卡, 卡上面写着"micro SD HC 2GB""字.我用irom fusing tool 软件把uboot256-sd.bin文件写了在tf card.把开发板的boot pin设置1111 TF card 启动方式.开发板和PC连接以后, 上电!不过, 通