关于三星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英文协议文档,仔细研究过网上的一些代码,肯定能解决问题。现在的有些新手程序员就是懒,不舍得花时间去学习,不经过思考,什么都想直接拿来主义,把人家写好的代码一拷贝就能用,把自己当成了代码的搬运工而不是设计者,对自己其实也没有什么好处。即使做出来了,也是用过就忘,自身并没有任何提高。
- 关于三星S3C6410裸机程序支持SDHC2.0驱动程序的移植
- S3C6410 LED裸机程序分析
- 三星6410裸机程序开发
- S3C6410裸机程序相关系统函数
- S3C6410 之裸机程序烧写
- S3C6410 之裸机程序烧写
- 裸机S3C6410显示控制器(4)- 裸机程序实现显示图片
- 关于驱动程序的可移植性
- S3C6410 纯粹的裸机SD卡启动
- nandflash裸机驱动程序的分析
- nandflash裸机驱动程序的分析
- I2C协议->裸机程序->adapter驱动程序分析
- spi协议->裸机程序->master驱动程序分析
- 个人总结日记:ltv350三星LCD并行接口接2440处理器的linux驱动程序移植
- 使用J-link在ADS下调试S3C6410裸机程序
- 用IAR和jlink调试s3c6410裸机程序
- s3c6410裸机程序,可打印串口和点亮LED
- 《tiny6410裸机程序》第七章:S3C6410外部中断简介
- java 构造器探秘
- Hibernate查询语言:HQL
- ZooKeeper系列之二:Zookeeper常用命令
- u-boot-2014.10移植第28天----nand flash启动(六)
- powerDesigner逆向工程报错:Unable to list the users.
- 关于三星S3C6410裸机程序支持SDHC2.0驱动程序的移植
- hibernate 入门增删改查demo
- strtok函数的妙用,分割字符串
- 查看linux系统信息命令(kernel、os、cpu等)
- android 混淆
- jar 转 exe 以及exe安装包制作含java环境
- [系统编程] epoll的一点总结
- 修改默认jdk版本
- dede标签详细的dede标签大全,dede标签在线学习