【记录】在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卡的支持的过程。
——————————————————————————————————–
这里先附上代码,感兴趣或需要的,可以下载u-boot-1.1.6_20100601_addSdMmc_20110806.7z:
u-boot-1.1.6_20100601_addSdMmc_20110806.7z (1.16 MB)
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)
——————————————————————————————————–
【给TQ2440的uboot添加sd/mmc支持过程记录】
1. 本来打算自己写对应的代码的,可以自己实在对sd/mmc方面的spec很不了解,硬着头皮写了几行代码,基本上就没耐心继续写了。不过后来巧的是,网上找到了S3C24410的uboot中的mmc驱动:
http://www.hackchina.com/cont/5943
中提到的uboot-s3c2410-mmc.patch,找到源码:
然后网上还能找到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%08xn”, sdi->SDIDSTA); while (!(sdi->SDIDSTA & (1 << 4))) {} debug(“done waiting for SDIDSTA (currently 0x%08xn”, 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) |
突然发现,为何此处,对于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> |
【暂时没搞懂的】
1. sd卡规范中说明,当READ_BL_LEN<12的时候,才能用那个公式计算SD卡容量的,而我这里读出的READ_BL_LEN却是15,用那个公式计算出来的大小,超过了1GB,而我本身sd卡就是1GB的,所以是不对的。即不知道,当READ_BL_LEN>=12的时候,不知道用啥公式计算sd卡容量,才是正确的。
转载请注明:在路上 » 【记录】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 + 解决fatls乱码问题