关于三星S3C6410裸机程序支持SDHC2.0驱动程序的移植

来源:互联网 发布:传奇霸业转生修为数据 编辑:程序博客网 时间:2024/06/07 18:59

公司的产品原来是支持2G的MicroSD(TF)卡,但现在市面上已经基本没有这种类型的卡卖了。为了扩容,也为了后续产品的生产,需要给设备升一下级。由此,也就有了此次USB MASS Storage驱动的移植。

原来的卡是标准的2G卡,遵循的是SD1.0的协议;而现在的基本都是高容量的卡(2G~32G),遵循的是SD2.0的协议。(超高速卡也已开始量产,遵循的是SD3.0的协议)所以要移植好这个驱动,这两种卡的区别是必须要弄明白的。

查看了网上很多资料,发现基本上都是STM32或其他芯片上的例程,而且是SPI模式下的,基本没有直接拿来就可以用的。于是只能根据SD2.0和SD1.0协议的不同,在源代码上一点一点地修改调试。

它俩的不同点,首先是卡的识别方式不同:SD1.0发送CMD0命令就可以初始化卡,然后发送CMD55+CMD41使卡进入就绪状态;但SD2.0是在发送CMD0后,再发送CMD8,然后才能发送CMD55+CMD41。CMD8也成为驱动识别标准卡和高容量卡的判断标准。

第二个不同点是最关键的了:就是卡的容量计算方式的不同。SD1.0里是CSD Version 1.0,主要是由C_SIZE和C_SIZE_MULT以及READ_BL_LEN来计算容量,最大只能支持2GB;而SD2.0是CSD Version 2.0,直接由C_SIZE来计算,最大能支持32GB。而且两个C_SIZE的位数也不同,SD1.0是12位[73:62],SD2.0是22位[69:48]。

把上面这两点弄明白,基本上卡的容量识别及初始化就没问题了。

但是我们目的是做一个USB MASS Storage设备(U盘),仅仅识别出卡还不够,插上USB连接电脑,识别出来的容量仍然不对。仔细研究分析发现是由于容量转换和数据运算时出现错误,存卡的容量(字节数)应用64位的数据(long long)来保存,并且乘除运算最好是用左移右移的方式(左移10位相当于乘以1024,右移9位相当于除以512)来进行,运算结果要经过强制转换数据类型处理,得出的结果才正确。

目前按照上面的方式已经能正常在电脑上识别出TF卡的数据,但是比较大的文件和文件夹里面是乱码。接下来要着手解决。

注:这篇文章讲得有点含含糊糊,没有直接说怎么怎么修改,对新手来说不方便。但是只要好好看过那个SD2.0英文协议文档,仔细研究过网上的一些代码,肯定能解决问题。现在的有些新手程序员就是懒,不舍得花时间去学习,不经过思考,什么都想直接拿来主义,把人家写好的代码一拷贝就能用,把自己当成了代码的搬运工而不是设计者,对自己其实也没有什么好处。即使做出来了,也是用过就忘,自身并没有任何提高。

0 0