StarterWare MMCSD 驱动
支持特性:
支持SD v2.0标准
支持标准特性和高标准特性
支持标准速度和高速度的SD卡
支持DMA模式的操作
支持基于FatFs工程的FAT文件系统
不支持的特性
不支持MMC标准
不支持SDIO标准
StarterWare MMC/SD支持
支持SD和MMC总线协议,传输数据读/写到MMC/SD卡的MMC/SD控制器
StarterWare 包含支持MMC/SD控制器的软件包括下面几部分
MMC/SD控制器设备抽象层
MMC/SD协议抽象层
MMC/SD控制器抽象层
文件系统之上的应用程序
支持SD卡的启动代码
MMC/SD控制器设备抽象层
MMC/SD控制器设备抽象层提供寄存器层给SoC上的MMC/SD控制器接口。这一层只包含寄存器层次的APIs接口函数
MMC/SD抽象层
综述
MMC/SD抽象层包含两个部分
MMC/SD控制器抽象层
MMC/SD控制器抽象层提供提供一种方式来抽象控制器应用程序的特性,和提高它的可重用性和应用程序的快速启动。所以,这个应用程序不用顾虑每一步去初始化控制器,不用顾虑被发送到控制器的MMC/SD命令。这个控制器抽象层兼顾了控制器的特性。
MMC/SD协议抽象层
MMC/SD协议抽象层提供一种方法来封装MMC/SD协议特性给应用程序,这样子也提高了它的可重用性和快速启动应用程序。所以,应用程序不需要考虑每个命令发给SD卡。这个MMC/SD卡协议抽象层然后,和MMC/SD控制抽象层相互教育,它映射MMC/SD命令到控制器的特性和发送命令通过控制器。
设计:
MMC/SD设备抽象层被设计成两种主流的
封装MMC/SD协议给用户的应用程序,加快应用程序的开发
容易集成底层的控制器特性和支持多种MMC/SD控制器
一个简单的堆栈,容易被增加
两个文件组成了抽象层
mmcsd_proto.c-包含了抽象层/APIs给MMC/SD协议。这一层集合了卡的特性和初始化序列,一个或者多个数据块的读写命令,等等
hs_mmcsdlib.c-包含了抽象层和APIs给HSMMC/SD控制器在Soc上,这一层集合了MMC/SD协议的映射,来满足控制器寄存器层。这个包含了装换命令数据结构到控制器寄存器层格式,控制器初始化序列等等。
MMC/SD抽象层包含下面的主要的数据结构
mmcsdCardInfo - 这个包含了卡的从卡特性寄存器的特性细节。这些细节被用来适当的发送命令给卡,譬如,从OCR寄存器细节信息,卡的自身能力。这个帮助填内存位置的偏移地址被读/写到卡。总线支持的宽度和传输速度被用来设置传输总线。这个结构体也包含了相关的控制模块的指针卡插进去后设别到的。
mmcsdCtrlInfo-这个保存了控制器特性的细节,这细节是关于底层的控制器的,有用户移植的。细节好像控制器的内存基址,设置的输入时钟,和想要的输出时钟,中断屏蔽想要使能或者去使能默认的中断。他也包含了控制器特性方法的钩子函数给各种操作像是控制器初始化,控制器数据转换/dma准备,卡的状态,命令转移,数据转移,总线狂赌支持,电压范围支持等等。
mmcsdCmd-这个包含了命令细节,它被发送到总线,这个结构体经常位于MMC/SD协议抽象层,和被用控制器抽象层分阶段执行,映射它到控制器特性寄存器层。
虽然这个抽象层是被设计来提高代码的可重用性在不同的平台上,由于StarterWare的基本原则,应用程序也有一个主要的角色来扮演。譬如中断处理也是应用程序里面的一部分。和不仅是DAL而且是抽象层也被实施数据转换的限制,DMA的类型,中断使能与禁止等等。所以,用户应用程序-这个单独的拥有者认识了这些细节/方法,被要求提供这些细节/和方法的实施。这些被一些回调函数提供。
Fatfs
Fatfs支持两部分
1、核心的FAT文件系统指令,那是有文件系统调用和文件系统识别和初始化的。(在third_party/farfs/src/ff.c里发现)
2、多媒体存储设备和Soc特性帮助方法,那是由核心层调用的,(在third_party/fatfs/port里)
集合文件系统支持一个将会提供端口或者媒体特性帮助的方法,这些,帮助方法是fatfs的蓝本和需要被定义支持新媒体。MMC/SD支持是集合在fatfs。这种方法目前支持的是disk_initialize 支持在auto-mount disk_read时候的初始化媒体这些方法是MMC/SD抽象层的APIs去进一步的操作的进一步调用。
多种媒体的支持
fatfs提供多种媒体方式被集合在系统里面,用户或者需要USB或者MMC媒体来支持文件系统来进入,在这种方式下,disk_xxx方式需要驱动的号码,参数。这个帮助在初始化,读,写和IOCTL操作等操作等等,特别给每种类型的媒体。
编程流程:
下面的步骤需要用MMCSDLIB服务在应用程序中
1、初始化mmcsdCardInfo 和 mmcsdCtrlInfo 对象
2、初始化模块mmcsdCardInfo和mmcsdCtrlInfo
3、检查卡的当前状态用MMCSDCardPresent()
4、如果卡目前是在槽里,操作进去下一步,否,则返回错误。
5、初始化控制器用MMCSDCtrlInit()
6、使能中断(像命令完成,命令超时,数据超时和传送完成等)通过用HSMMCSDIntrEnable()
7、执行shell命令像ls,chdir,cs,pwd,cat等等,这些内部嗲用MMCSDLIB函数
MMCSDCardInit(),MMCSDBusWidthSet(),MMCSDTranSpeedSet()(作为disk_initialize()的一部分)
MMCSDReadCmdSeng()作为disk_read()的一部分,MMCSDWriteCmdSend()作为disk_write()的一部分。