==================
SD/EMMC驱动
==================
基础知识:
sd/emmc:
主要区别:初始化流程不同。
sd/emmc寄存器:
CID:(128bit) Card ID寄存器:ID
RCA:(16bit) 相对卡地址寄存器:提供本地系统中卡的地址,可动态变化,在主机初始化时确定。(sdio模式特有)
CSD:(128bit) 卡描述数据寄存器:提供sd卡操作条件相关信息和数据。
SCR: (64bit) sd配置寄存器:提供特定的数据。
OCR:(32bit) 操作条件寄存器:sd卡的操作电压等信息。
//ECSD:扩展CSD寄存器定义eMMC属性和所选模式。它有512字节长。
定义区分:
SD/SDSC 0-2G
SDHC: 2G-32G
SDXC: 32G-2T
通信模式:sdio模式、spi模式
sdio模式: cmd clk dat0-3 vss vcc
spi模式:cs clk miso mosi vss vcc
流程:
初始化:
上电
=> CMD0 //卡进行软复位
=> cmd8 //用于区分SD卡2.0,只有2.0及以后的卡才支持CMD8命令,MMC卡和V1.x的卡,是不支持该命令的。
=> CMD55,ACMD41 //CMD55:确认操作电压范围,ACMD41通过HCS位来告诉SD卡,主机是不是支持高容量卡(SDHC)
=> CMD2 //获取CID
=> CMD3 //设置卡相对地址。(RCA必须非0)
=> CMD9 // 获得SD卡的CSD寄存器内容,得到SD卡的容量和扇区大小等
初始化结束,最后通过CMD7命令操作SD卡。
备注:
对于支持CMD8的卡,主机设置ACMD41的参数HCS=1,告诉SD卡,主机支持SDHC卡。
对2.0的卡,OCR的CCS位用于表示SDHC还是SDSC;对1.x的卡,则忽略该位;
MMC卡只需要发送: CMD0 和 CMD1 即可完成初始化。
CMD3 简单来说:
sd: sdhc 发送CMD3 给sd卡,sd卡返回一个RCA给sdhc。
mmc: sdhc 发送CMD3(带RCA参数)给mmc卡。
SD卡读操作:
https://zhuanlan.zhihu.com/p/354099566
SD卡写操作:
https://zhuanlan.zhihu.com/p/354099566
vxbSdhcCtrl.c
vxbzynqSdhcCtrl.c
vxbmmcstorage.c
mmcIdentify
1.CMD3: 设置卡相对地址
2.CMD9: 获取卡信息
3.CMD7:设置传输状态
4.卡版本:小于4.0版本:
if (!pDrvCtrl->isExendCsd)
{
解析卡的基本信息。
}
if (regValue >= MMC_CSD_SPEC_40)
{
rc = mmcCmdReadExtCsd (pDev, &(pMmcInfo->extCsd[0]));
解析卡的基本信息。
}
5.CMD16 设置块长度
6.是否为高速模式:
高速模式设置一些信息:
7.设置频率和检查是否写保护
//xbd设置
8.设置xbd参数:
blkXbdParams.xbdOps.blkRead = mmcStorageBlkRead;
blkXbdParams.xbdOps.blkWrite = mmcStorageBlkWrite;
blkXbdParams.xbdOps.blkIoctl = mmcStorageIoctl;
blkXbdParams.directModeFlag = pHostSpec->directBio;
blkXbdParams.numBlks = (sector_t)(pDrvCtrl->capacity / pSdHardWare->blockSize);
blkXbdParams.blkSize = pSdHardWare->blockSize;
。。。
9.创建设备
xbdSts = blkXbdDevCreate (&(pDrvCtrl->xbdDev), &blkXbdParams);
blkXbdDevCreate
-》 xbdAttach
-》 devAttach
-》 ddInsert
device_t blkXbdDevCreate(BLK_XBD_DEV* pXbd, BLK_XBD_PARAMS * pParams)
{
//挂载读写接口
pXbd->xbdOps.blkRead = pParams->xbdOps.blkRead;
pXbd->xbdOps.blkWrite = pParams->xbdOps.blkWrite;
pXbd->xbdOps.blkDump = pParams->xbdOps.blkDump;
pXbd->xbdOps.blkIoctl = pParams->xbdOps.blkIoctl;
}
此时,xbd的读写 就和 mmc读写 绑定。
xbd是对块设备(block device)的抽象,而blk是对块设备驱动程序(block device driver)的抽象。
对比 ttyDevCreate //tty设备创建
-》iosDevAdd
-》dllAdd
-》dllInsert
ttyDrv //驱动挂载
-》iosDrvInstall
ttyDrvNum = iosDrvInstall ((DRV_CREATE_PTR) ttyOpen,
NULL,
(DRV_OPEN_PTR) ttyOpen,
(DRV_CLOSE_PTR) ttyClose,
(DRV_READ_PTR) tyRead,
(DRV_WRITE_PTR) tyWrite,
(DRV_IOCTL_PTR) ttyIoctl);
XBD 层在 VxWorks 中扮演着一个抽象层的角色,它提供了统一的块设备访问接口,
并管理块设备缓存和同步机制,使得应用程序可以以统一的方式访问不同类型的块设备,并提高数据读写的性能和可靠性。
TTY 层在 VxWorks 中扮演着一个抽象层的角色,它提供了统一的终端设备访问接口,
并处理终端设备的输入输出、配置和控制功能。通过 TTY 层,应用程序可以以统一的方式访问不同类型的终端设备,并对其进行配置和控制。