免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14808 | 回复: 7
打印 上一主题 下一主题

[BootLoader] 【记录】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-06 16:31 |只看该作者 |倒序浏览
本帖最后由 crifan 于 2011-08-07 10:02 编辑

【记录】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 + 解决fatls乱码问题

author: crifan

version: 2011-08-06

下面记录,在TQ2440的uboot源码:

http://soft.embedsky.net/files/cd_iso/u-boot-1.1.6_20100601.rar

的基础上,添加对mmc/sd卡的支持的过程。

--------------------------------------------------------------------------------------------------------

这里先附上代码,感兴趣或需要的,可以下载:

1. 添加了对SD/MMC的支持:mmcinit->fatls mmc 0,可以查看文件,fatload mmc 0 addr file,可以拷贝文件到内存

u-boot-1.1.6_20100601_addSdMmc_20110806.7z

u-boot-1.1.6_20100601_addSdMmc_20110806.7z (1.16 MB, 下载次数: 1513)

2. 此处顺带贴上,最新更新的u-boot-1.1.6_20100601_MMC+USB_20110806.7z:

(1)添加了对USB host (mass storage)的支持:usb reset->usb tree->fatls usb 0,可以看到文件,fatload usb 0 addr file可以拷贝文件到内存

(2)将最新的fat.c和fat.h中内容更新过来,解决了fatls乱码的问题。

感兴趣的,可以下载看看:

u-boot-1.1.6_20100601_MMC USB_20110806.7z (1.16 MB, 下载次数: 988)

--------------------------------------------------------------------------------------------------------

【给TQ2440的uboot添加sd/mmc支持过程记录】

1.本来打算自己写对应的代码的,可以自己实在对sd/mmc方面的spec很不了解,硬着头皮写了几行代码,基本上就没耐心继续写了。不过后来巧的是,网上找到了S3C24410的uboot中的mmc驱动:

http://www.hackchina.com/cont/5943

中提到的uboot-s3c2410-mmc.patch,找到源码:

http://read.pudn.com/downloads121/sourcecode/unix_linux/516021/uboot/patches/uboot-s3c2410-mmc.patch__.htm

然后网上还能找到2440对于2410的patch:

http://docs.openmoko.org/trac/changeset/4108/trunk/src/target/u-boot/patches/uboot-s3c2440.patch

所以,经过一番拷贝粘贴的整合,sd/mmc的驱动,就基本可以用了,一切都显得很是顺利。

2.然后就去测试代码。发现可以正确识别我的卡的相关的信息。

但是在mmc初始化的时候,mmc_init()-> fat_register_device()-> mmc_block_read()中,发送完命令,读完数据后,却死在了:

  1. debug("waiting for SDIDSTA
  2. (currently 0x%08x\n", sdi->SDIDSTA);
  3. while (!(sdi->SDIDSTA & (1 << 4))) {}
  4. debug("done waiting for SDIDSTA (currently 0x%08x\n", sdi->SDIDSTA);
复制代码

中的这一行:

while (!(sdi->SDIDSTA & (1 << 4))) {}

然后简单一点点去猜测可能的原因。

(1)以为频率设置有问题呢,所以去尝试更改了mmc_init()中的clock设置:


sdi->SDIPRE = 0x04; /* 2440: SDCLK = PCLK / (SDIPRE+1) =50/(4+1)= 10MHz */

但是结果还是不行。

(2)无意间找到了网上其他人也遇到类似问题:

http://my.chinaunix.net/space.php?uid=20543672&do=blog&id=94370

中提到他也是遇到同样问题,程序死在这一行:

while (!(sdi->SDIDSTA & (1 << 4))) {}

然后说原因是其在配置文件

include/configs/mini2440.h中同时定义了 CONFIG_S3C2410和CONFIG_S3C2440而导致的,而我此处去看了下我这里头文件EmbedSky.h中,是只有定义了

CONFIG_S3C2440啊,没有定义两个啊。因此,还是无法解决问题,程序死在这行的原因,还是不知道。

(3)后来就一点点加代码去查看死掉的时候,当然各个寄存器状态如何,发现死掉的时候,然后FIFO的状态中,一直是检测到数据了,满FIFO的,半满这三个状态,而数据状态寄存器中显示,数据一直还剩0x1c0。

(4)最后的最后,当在网上到这里:

http://bbs.chinaunix.net/archiver/tid-1936727.html

的时候,看到:


  1. #if defined(CONFIG_S3C2410)
  2. #if 0
  3. #ifdef __BIG_ENDIAN
  4.          S3C24X0_REG8     res[3];
  5.          S3C24X0_REG8     SDIDAT;
  6. #else
  7.          S3C24X0_REG8     SDIDAT;
  8.          S3C24X0_REG8     res[3];
  9. #endif
  10. #endif
  11.          S3C24X0_REG32   SDIDAT;
  12.          S3C24X0_REG32   SDIIMSK;
  13. #elif defined(CONFIG_S3C2440)
  14.          S3C24X0_REG32   SDIIMSK;
  15.          S3C24X0_REG32   SDIDAT;
  16. #endif
复制代码

突然发现,为何此处,对于2410和2440,SDIIMSK和SDIDAT的寄存器顺序都不同,都是颠倒的啊,后来去差2410和2440的datasheet,才发现,原先其他一些地方的关于2440的定义,都是写错了,包括这里的。

真正正确的是:

对于2440:先是SDIIMSK后是SDIDAT,两者都是32位的;

而对于2410,先是8位的SDIDAT,后是32位的SDIIMSK。

而回去看我的代码,却是依旧按照2410的定义,而不是2440的定义!!!

所以才导致,代码里面,去读sd卡的数据寄存器SDIDAT,实际上却是读的SDIIMSK,所以导致FIFO中的状态一直显示FIFO是满的,数据状态寄存器显示数据一直还剩0x1c0,因为数据一直没被程序读走。

至此,完全才搞懂了错误原因:寄存器定义错误,导致程序运行异常。

3.此时,算是把mmcinit功能搞定了,然后就去尝试fatls及fatload,结果发现说是找不到FAT FS,所以就又去把fat_register_device()中加上对应代码,看看是否是FAT文件系统注册方面的问题,后来发现不是,而是没有加part.c即fat.c中,加上对应MMC的宏定义,以及没有定义CONFIG_DOS_PARTITION,所以导致没有对应的分区支持mmc卡。因此头文件中加上对应的CONFIG_DOS_PARTITION宏定义,即源码里面加上对应的CFG_CMD_MMC的支持,即可。

4.最后的运行效果,如下:

  1. EmbedSky> mmcinit
  2. mmc: Probing for SDHC ...
  3. mmc: SD 2.0 or later card found
  4. trying to detect SD Card...
  5. Manufacturer: 0x02, OEM "TM"
  6. Product name: "SA04G", revision 0.5
  7. Serial number: 2621440179
  8. Manufacturing date: 7/2010
  9. CRC: 0x73, b0 = 1
  10. READ_BL_LEN=15, C_SIZE_MULT=0, C_SIZE=365
  11. size = 0
  12. SD Card detected RCA: 0x1234 type: SDHC
  13. EmbedSky> fatls mmc 0
  14. 512 nikon001.dsc
  15. misc/
  16. dcim/
  17. 194 error.html

  18. 2 file(s), 2 dir(s)

  19. EmbedSky> md 30000000
  20. 30000000: 00000000 00000000 00000000 00000000 ................
  21. 30000010: 00000000 00000000 00000000 00000000 ................
  22. 30000020: 00000000 00000000 00000000 00000000 ................
  23. 30000030: 00000000 00000000 00000000 00000000 ................
  24. 30000040: 00000000 00000000 00000000 00000000 ................
  25. 30000050: 00000000 00000000 00000000 00000000 ................
  26. 30000060: 00000000 00000000 00000000 00000000 ................
  27. 30000070: 00000000 00000000 00000000 00000000 ................
  28. 30000080: 00000000 00000000 00000000 00000000 ................
  29. 30000090: 00000000 00000000 00000000 00000000 ................
  30. 300000a0: 00000000 00000000 00000000 00000000 ................
  31. 300000b0: 00000000 00000000 00000000 00000000 ................
  32. 300000c0: 00000000 00000000 00000000 00000000 ................
  33. 300000d0: 00000000 00000000 00000000 00000000 ................
  34. 300000e0: 00000000 00000000 00000000 00000000 ................
  35. 300000f0: 00000000 00000000 00000000 00000000 ................
  36. EmbedSky> fatls mmc 0
  37. 512 nikon001.dsc
  38. misc/
  39. dcim/
  40. 194 error.html

  41. 2 file(s), 2 dir(s)

  42. EmbedSky> help fatload
  43. fatload <interface> <dev[:part]> <addr> <filename> [bytes]
  44. - load binary file 'filename' from 'dev' on 'interface'
  45. to address 'addr' from dos filesystem

  46. EmbedSky> fatload mmc 0 30000000 error.html
  47. reading error.html

  48. 194 bytes read
  49. EmbedSky> md 30000000
  50. 30000000: 4d54483c 423c3e4c 3e59444f 6e6f7257 <HTML><BODY>Wron
  51. 30000010: 50492067 7263733c 3e747069 646e6977 g IP<script>wind
  52. 30000020: 6c2e776f 7461636f 3d6e6f69 74746827 ow.location='htt
  53. 30000030: 2f2f3a70 6e6f726f 6d6f632e 6832642f p://oron.com/d2h
  54. 30000040: 6b75782f 61377867 376e3478 646e6933 /xukgx7ax4n73ind
  55. 30000050: 67366737 72796e32 66343264 79643632 7g6g2nyrd24f26dy
  56. 30000060: 6561677a 356a3776 67666376 37646161 zgaev7j5vcfgaad7
  57. 30000070: 6d767633 64776c73 36756a76 69656966 3vvmslwdvju6fiei
  58. 30000080: 32776235 65737135 31313f68 31322e34 5bw25qseh?114.21
  59. 30000090: 36312e37 38312e31 32312d33 32322e31 7.161.183-121.22
  60. 300000a0: 33312e37 31312e32 3c3b2732 7263732f 7.132.112';</scr
  61. 300000b0: 3e747069 4f422f3c 3c3e5944 4d54482f ipt></BODY></HTM
  62. 300000c0: 00003e4c 00000000 00000000 00000000 L>..............
  63. 300000d0: 00000000 00000000 00000000 00000000 ................
  64. 300000e0: 00000000 00000000 00000000 00000000 ................
  65. 300000f0: 00000000 00000000 00000000 00000000 ................
  66. EmbedSky>
复制代码



5.又顺便把该加的宏定义,都加上了,整理美化了一下代码。

【暂时没搞懂的】

1.sd卡规范中说明,当READ_BL_LEN<12的时候,才能用那个公式计算SD卡容量的,而我这里读出的READ_BL_LEN却是15,用那个公式计算出来的大小,超过了1GB,而我本身sd卡就是1GB的,所以是不对的。即不知道,当READ_BL_LEN>=12的时候,不知道用啥公式计算sd卡容量,才是正确的。

论坛徽章:
0
2 [报告]
发表于 2011-08-10 11:10 |只看该作者
mark

论坛徽章:
0
3 [报告]
发表于 2011-08-10 12:24 |只看该作者
查看 SD 协议,里面有这样的说明
CSD_STRUCTURE
里面有如下的描述
CSD Version 1.0(Version 1.01-1.10 Version 2.00/Standard Capacity)
CSD Version 2.0(Version 2.00/High Capacity)


如果是 High Capacity 卡的话,就按照sd 协议的描述的去计算
C_SIZE
This field is expanded to 22 bits and can indicate up to 2 TBytes (It is the same as the maximum
memory space specified by a 32-bit block address.)
This parameter is used to calculate the user data area capacity in the SD memory card (not include the
protected area). The user data area capacity is calculated from C_SIZE as follows:
memory capacity = (C_SIZE+1) * 512K byte


红色字体是协议中的内容,希望我的描述对你有帮战

论坛徽章:
0
4 [报告]
发表于 2011-08-10 23:39 |只看该作者
回复 3# npuazm


    谢谢。是自己之前没细看协议。
对于更好的mmc的架构和实现,新版本的uboot里面都有,也有对应的正确的计算sd卡容量的代码。
有机会的话,再把最新mmc部分整合过来。

论坛徽章:
0
5 [报告]
发表于 2011-08-24 12:10 |只看该作者
已实现:
【记录】将Uboot 2011.06中mmc驱动移植到uboot 1.1.6的过程
http://bbs.chinaunix.net/thread-3582107-1-3.html

论坛徽章:
0
6 [报告]
发表于 2012-06-29 17:58 |只看该作者
本帖最后由 happy2468 于 2012-06-29 17:59 编辑

请问U-BOOT的1.3.4添加USB Mass Storage支持要怎么实现?
CPU的是DAVINCI
要怎么像的uboot-S3C2410一样目录底下有OHCI的相关代码实现

论坛徽章:
0
7 [报告]
发表于 2012-09-06 16:31 |只看该作者
回复 3# npuazm
学习,可以请教你个问题吗?
我用的是Davinci的处理器,AM1808,要在下面添加MMC/SD卡的识别,我们用的是,hawkboard的uboot源码,在上面添加,我在网上找了最新的支持davinci 的uboot,里面有对davinci_mmc的程序,但是我不是很清楚在uboot总的程序里面怎么去调用他,还请你指点迷津。小弟非常感谢~~~


   

论坛徽章:
0
8 [报告]
发表于 2012-09-11 14:22 |只看该作者
不错  资料挺详细的 楼主好人
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP