VxWorks SD/EMMC驱动

==================
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 层,应用程序可以以统一的方式访问不同类型的终端设备,并对其进行配置和控制。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值