本帖最后由 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()中,发送完命令,读完数据后,却死在了: - debug("waiting for SDIDSTA
- (currently 0x%08x\n", sdi->SDIDSTA);
- while (!(sdi->SDIDSTA & (1 << 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 的时候,看到:
- #if defined(CONFIG_S3C2410)
- #if 0
- #ifdef __BIG_ENDIAN
- S3C24X0_REG8 res[3];
- S3C24X0_REG8 SDIDAT;
- #else
- S3C24X0_REG8 SDIDAT;
- S3C24X0_REG8 res[3];
- #endif
- #endif
- S3C24X0_REG32 SDIDAT;
- S3C24X0_REG32 SDIIMSK;
- #elif defined(CONFIG_S3C2440)
- S3C24X0_REG32 SDIIMSK;
- S3C24X0_REG32 SDIDAT;
- #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.最后的运行效果,如下: - EmbedSky> mmcinit
- mmc: Probing for SDHC ...
- mmc: SD 2.0 or later card found
- trying to detect SD Card...
- Manufacturer: 0x02, OEM "TM"
- Product name: "SA04G", revision 0.5
- Serial number: 2621440179
- Manufacturing date: 7/2010
- CRC: 0x73, b0 = 1
- READ_BL_LEN=15, C_SIZE_MULT=0, C_SIZE=365
- size = 0
- SD Card detected RCA: 0x1234 type: SDHC
- EmbedSky> fatls mmc 0
- 512 nikon001.dsc
- misc/
- dcim/
- 194 error.html
- 2 file(s), 2 dir(s)
- EmbedSky> md 30000000
- 30000000: 00000000 00000000 00000000 00000000 ................
- 30000010: 00000000 00000000 00000000 00000000 ................
- 30000020: 00000000 00000000 00000000 00000000 ................
- 30000030: 00000000 00000000 00000000 00000000 ................
- 30000040: 00000000 00000000 00000000 00000000 ................
- 30000050: 00000000 00000000 00000000 00000000 ................
- 30000060: 00000000 00000000 00000000 00000000 ................
- 30000070: 00000000 00000000 00000000 00000000 ................
- 30000080: 00000000 00000000 00000000 00000000 ................
- 30000090: 00000000 00000000 00000000 00000000 ................
- 300000a0: 00000000 00000000 00000000 00000000 ................
- 300000b0: 00000000 00000000 00000000 00000000 ................
- 300000c0: 00000000 00000000 00000000 00000000 ................
- 300000d0: 00000000 00000000 00000000 00000000 ................
- 300000e0: 00000000 00000000 00000000 00000000 ................
- 300000f0: 00000000 00000000 00000000 00000000 ................
- EmbedSky> fatls mmc 0
- 512 nikon001.dsc
- misc/
- dcim/
- 194 error.html
- 2 file(s), 2 dir(s)
- EmbedSky> help fatload
- fatload <interface> <dev[:part]> <addr> <filename> [bytes]
- - load binary file 'filename' from 'dev' on 'interface'
- to address 'addr' from dos filesystem
- EmbedSky> fatload mmc 0 30000000 error.html
- reading error.html
- 194 bytes read
- EmbedSky> md 30000000
- 30000000: 4d54483c 423c3e4c 3e59444f 6e6f7257 <HTML><BODY>Wron
- 30000010: 50492067 7263733c 3e747069 646e6977 g IP<script>wind
- 30000020: 6c2e776f 7461636f 3d6e6f69 74746827 ow.location='htt
- 30000030: 2f2f3a70 6e6f726f 6d6f632e 6832642f p://oron.com/d2h
- 30000040: 6b75782f 61377867 376e3478 646e6933 /xukgx7ax4n73ind
- 30000050: 67366737 72796e32 66343264 79643632 7g6g2nyrd24f26dy
- 30000060: 6561677a 356a3776 67666376 37646161 zgaev7j5vcfgaad7
- 30000070: 6d767633 64776c73 36756a76 69656966 3vvmslwdvju6fiei
- 30000080: 32776235 65737135 31313f68 31322e34 5bw25qseh?114.21
- 30000090: 36312e37 38312e31 32312d33 32322e31 7.161.183-121.22
- 300000a0: 33312e37 31312e32 3c3b2732 7263732f 7.132.112';</scr
- 300000b0: 3e747069 4f422f3c 3c3e5944 4d54482f ipt></BODY></HTM
- 300000c0: 00003e4c 00000000 00000000 00000000 L>..............
- 300000d0: 00000000 00000000 00000000 00000000 ................
- 300000e0: 00000000 00000000 00000000 00000000 ................
- 300000f0: 00000000 00000000 00000000 00000000 ................
- EmbedSky>
复制代码
5.又顺便把该加的宏定义,都加上了,整理美化了一下代码。
【暂时没搞懂的】 1.sd卡规范中说明,当READ_BL_LEN<12的时候,才能用那个公式计算SD卡容量的,而我这里读出的READ_BL_LEN却是15,用那个公式计算出来的大小,超过了1GB,而我本身sd卡就是1GB的,所以是不对的。即不知道,当READ_BL_LEN>=12的时候,不知道用啥公式计算sd卡容量,才是正确的。 |