LINUXMMC/SDLINUXMMC/SD卡驱动开发卡驱动开发主讲主讲::易松华易松华知识点知识点MMC/SDMMC/SD卡物理及电气规范简介卡物理及电气规范简介MMC/SD卡工作原理及关键命令和结构信息S3C2410中MMC/SDHost控制器分析LINUX块设备驱动基本工作原理Linux中MMC/SD卡驱动程序结构分析S3C2410中MMC/SDHost控制器的驱动实现嵌入式系统对存储的要求嵌入式系统对存储的要求MMC/SDMMC/SD存储卡存储卡MMC/SDMMC/SD电气及性能比较电气及性能比较SDSD卡管脚说明卡管脚说明MMC/SDMMC/SD工作连线和总线拓工作连线和总线拓扑结构扑结构知识点知识点MMC/SD卡物理及电气规范简介MMC/SDMMC/SD卡工作原理及关键命令和结构信息卡工作原理及关键命令和结构信息S3C2410中MMC/SDHost控制器分析LINUX块设备驱动基本工作原理Linux中MMC/SD卡驱动程序结构分析S3C2410中MMC/SDHost控制器的驱动实现MMC/SDMMC/SD寄存器寄存器OperatingConditionsRegister(OCR):32bits操作条件寄存器卡支持的电压范围.(2.0~3.6V)CardIdentification(CID)Register:128bits卡标识寄存器包含独一无二的卡号,包括厂家ID,产品名,产品版本号,串号,生产日期等CardSpecificData(CSD)Register:128bits卡专用数据寄存器访问卡的数据所需要的配置信息比如卡的大小,数据访问时间,最大传输速率,最大的读数据块长度、最大的读写的电流、擦除、写保护相关特性等CARDConfigurationRegister(SCR):64bits卡配置寄存器卡的一些特殊信息,比如此卡遵循的SD规范的版本号、SD加密支持、数据总线宽度等RelativeCardAddress(RCA)Register:16bits相对卡地址寄存器用于在多SD卡中标识某卡,从000开始分配。卡只有收到RCA才可以读写1)RCA寄存器在SPI模式下是不可用的MMC/SDMMC/SD卡工作中的关键命令及关键结构卡工作中的关键命令及关键结构信息信息Host与Card的两种工作状态Host与Card的基本通讯:命令与回应MMC/SD卡内信息寄存器MMC/SD卡的驱动过程HostHost与与CardCard两种工作状态两种工作状态基本功能描述卡识别模式host在reset后将处于卡识别模式,并开始寻找总线上的新卡;Card在reset后将一直处于此种模式直到收到SET_RCA命令(CMD3)数据传输模式Card一旦收到RCA信号将进入数据传输模式;Host在识别出总线上所有的卡后将进入数据传输模式HostHost与与CardCard的基本通讯的基本通讯::命令与回应命令与回应命令与回应数据命令与回应数据CMDDATCommandCommandResponseOperation(noresponse)Operation(nodata)FromhosttocardFromhosttocardFromcardtohostMMC/SDMMC/SD命令格式命令格式•Command包含48bits(6Bytes)[47][0]SerialDataMMC/SDMMC/SD卡命令示例卡命令示例MMC/SDMMC/SD卡的回应卡的回应00CONTENT=CIDorCSDCRC100CONTENT1Totallength=48bitsTotallength=136bitsR1,R3,R6R2startbit,always0endbit,always1endbit,always1transmissionbit,‘0’=cardresponseResponsecontent:mirroredcommandandstatusinformation(R1response),OCRregister(R3response,orRCA(R6),protectedbya7bitCRCchecksumMMC/SDMMC/SD卡的状态卡的状态MMC/SDMMC/SD卡的驱动过程(卡检测过卡的驱动过程(卡检测过程)程)idle状态SPI操作模式PoweronCMD0+Asserted(0)CMD0任意状态除了(ina)ACM41ready状态CMD2识别状态CMD3等待状态Inactive状态(ina)CMD15CMD3数据传输模式卡识别模式从CMD1开始多媒体初始花过程卡忙状态或host忽略电压变化Noresponse,非有效命令,必须是多媒体卡不兼容可变电压的卡数据传输模式的任意状态卡响应新的RCAMMC/SDMMC/SD卡的驱动过程(数据传输过程)卡的驱动过程(数据传输过程)CMD3CMD15CMD0CMD13,CMD55CMD7CMD7操作完成等待状态stbyCMD4,9,10断开链接状态disCMD28,29,38程序状态prgCMD7CMD7CMD12或传输结束CMD12操作完成发送数据状态dataCMD17,18,30,56(r)ACMD51传输状态tranCMD16,32…37ACMD6,13,42ACMD22,23CMD24,25,26,27,42,56(w)接受数据状态rcv操作完成卡识别模式数据传输模式数据传输模式的任意状态数据传输模式下无状态转换知识点知识点MMC/SD卡物理及电气规范简介MMC/SD卡工作原理及关键命令和结构信息S3C2410S3C2410中中MMC/SDHostMMC/SDHost控制器分析控制器分析LINUX块设备驱动基本工作原理Linux中MMC/SD卡驱动程序结构分析S3C2410中MMC/SDHost控制器的驱动实现S3C2410MMC/SDS3C2410MMC/SD控制器基本信息控制器基本信息支持MMC2.11标准支持SD1.0标准支持SDIO1.0标准64bytesFIFO支持轮询、中断与DMA传输方式支持SD0~25MHz时钟支持MMC0~20MHz时钟MMC/SDMMC/SD控制器控制器驱动驱动SDSD卡的框架流程卡的框架流程初始化SD时钟,设置好中断及字节序设置命令参数、设置命令号并启动命令传输等待命令成功状态、接收命令回应设置传输超时、块大小、传输方向、传输方式根据数据状态进行数据收发MMC/SDMMC/SD控制器相关寄存器介控制器相关寄存器介绍绍初始化设置类:SDICON、SDIPRE、SDICARG、SDICCON、SDICSTA、SDIRSP0~3数据传输类:SDIDTIMER、SDIBSIZE、SDIDCON、SDIDCNT、SDIDSTA、SDIFSTA、SDIDAT、SDIIMSK知识点知识点MMC/SD卡物理及电气规范简介MMC/SD卡工作原理及关键命令和结构信息S3C2410中MMC/SDHost控制器分析LINUXLINUX块设备驱动基本工作原理块设备驱动基本工作原理Linux中MMC/SD卡驱动程序结构分析S3C2410中MMC/SDHost控制器的驱动实现块设备驱动程序简介块设备驱动程序提供了面向数据块的设备的访问块设备一般以随机的方式传输数据,并且数据总是具有固定大小的块典型的块设备是磁盘驱动器类设备图示对block设备的操作涉及到的内核组件ThegenericblocklayerThegenericblocklayer隐藏硬件细节,提供block设备的抽象视图。提供通用的数据结构描述disks和diskpartitions.I/OschedulerI/Oscheduler(I/O调度器)根据内核制定的策略对未决的(pending)I/O数据传送请求进行排序和调度。提高I/O调度器的效率也是影响整个系统对块设备上数据管理效率的一个方面。blockdevice最后,blockdevice设备驱动程序,完成和硬件的具体交互。知识点知识点MMC/SD卡物理及电气规范简介MMC/SD卡工作原理及关键命令和结构信息S3C2410中MMC/SDHost控制器分析LINUX块设备驱动基本工作原理LinuxLinux中中MMC/SDMMC/SD卡驱动程序结构分析卡驱动程序结构分析S3C2410中MMC/SDHost控制器的驱动实现.MMC/SD卡驱动层次架构:linuxMMC/SD驱动源代码文件组织MMCCore:MMC协议,管理核心程序MMCDeviceBlock存储介质(块设备)MMCHostMMC/SD控制器驱动程序===1)MMCCard隶属于MMCHost,MMCCore实现了MMCHost的管理2)MMCCore通过MMCHost实现了对MMCDevice的检测与初始化管理3)MMCHost与MMCdevice的命令及回应的通讯,通过一个块设备的IO请求队列模块来处理,请求队列的管理由一个MMCCore线程来处理4)mmc_host.mmc_host_ops的函数指针来完成MMC硬件相关操作mmc_host_ops.requestmmc_host_ops.set_iosLinuxLinux中中MMC/SDMMC/SD存储卡驱动程序结存储卡驱动程序结构分析构分析MMCCoreMMCCore管理核心程序管理核心程序MMC模块在系统中将自己注册为MMC总线在MMC总线中管理MMCCard作为Device、MMCBlock驱动接口作为DriverMMCCard隶属于MMCHost,MMCCore实现了MMCHost的管理通过MMCHost,MMCCore实现了Card的检测与初始化管理MMCCoreMMCCore管理核心程序(续)管理核心程序(续)MMCHost与Card的命令及回应的通讯,通过一个请求队列模块来处理,请求队列的管理由一个Core线程来处理MMCBlockMMCBlock存储卡与块设备的接口程序存储卡与块设备的接口程序向MMC总线注册为MMCBusDrvier向系统注册为块设备Driver当MMCHost有Card插入时,检测是否为存储卡,如果是存储卡,为此卡申请请求队列处理函数及gen_disk,并向系统注册为一个块设备知识点知识点嵌入式系统中几种常见的存储解决方案MMC/SD卡物理及电气规范简介MMC/SD卡工作中的关键命令及关键结构信息S3C2410中MMC/SDHost控制器分析Linux中MMC/SD卡驱动程序结构分析S3C2410S3C2410中中MMC/SDHostMMC/SDHost控制器的驱动实现控制器的驱动实现MMCHostMMCHost控制器驱动实现控制器驱动实现根据MMCHost硬件控制器,实现并注册一个Host到MMCCore中控制器驱动通过mmc_host_ops的函数指针来完成硬件相关操作