项目场景:
imx6ull从emmc启动之后需要挂载驱动用于存储数据及文件系统
1.硬件设计
用uSDHC2
引脚配置
2.MMC初始化流程
详细学习了mmc的特性及初始化流程,网上有很多相关资料:
(1)mmc和SD卡最主要的区别在初始化cmd流程上;
(2)mmc卡内部集成了flash控制器,使用时不需要用户进行erase操作
(3)如上图,只有发从CMD1才能使mmc到ready状态,检测不到busy信号就一直发CMD1
3.驱动修改调试
3.1 vxworks6.9自带FSL_SDHC驱动,基于这个进行修改,挂载device instances。
3.2 创建SDMMC_BUS,并挂载mmcStorage
以上fslSDHC设备主要完成初始化CMD0~2的过程,并对设备的热插拔进行检测,当然对于emmc设备来说,检测插拔的函数直接返回TRUE,monitor任务也没有必要。但是后续如果需要添加SD卡的驱动时,monitor任务还是需要的。mmcstorge完成CMD3之后包括读写在内的所有功能,创建XBD任务。
3.3 修改的关键位置
调试过程卡住时间最长的地方就是到数据读取时候,初始化时候因为是1bit模式,用CMD线读取状态等操作很顺利,当到开始用data线4bits和8bits读取数据时调不通,原因在于DMA的配置。
(1)使能DMA中断
(2)DMA选择SDMA
4.MMC分区切换
mmc内部有boot1、boot2及用户分区。boot1烧写了BootLoader,若要存参数到boot区,需要切换分区。
(1)分区切换
由extCsd寄存器的第179号控制
bit0~2控制当前分区,bit3~5是使能引导分区的。
(2)切换分区之后出现无法重新启动,主要问题是没有使能boot1引导位。但是这里出现的问题是第179号寄存器取值应该是mmc设备初始化时候已经读出来的,但是这个值是全0,很奇怪,所以导致用这个值或操作分区切换bit位再写入emmc,再次启动时没有引导使能所以起不来。
(3)添加nvRamToFlash.c文件
其中sysNvRamGet与sysNvRamSet函数用于bootline参数存储,偏移地址是0。但是没有生效,参数已经存储到boot2分区,但是启动时这些参数并没有读出来,后续再调试吧。