本帖最后由 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 的基礎(chǔ)上,添加對mmc/sd卡的支持的過程。 -------------------------------------------------------------------------------------------------------- 這里先附上代碼,感興趣或需要的,可以下載: 1. 添加了對SD/MMC的支持:mmcinit->fatls mmc 0,可以查看文件,fatload mmc 0 addr file,可以拷貝文件到內(nèi)存 u-boot-1.1.6_20100601_addSdMmc_20110806.7z:
u-boot-1.1.6_20100601_addSdMmc_20110806.7z
(1.16 MB, 下載次數(shù): 1513)
2011-08-06 16:37 上傳
點(diǎn)擊文件名下載附件
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可以拷貝文件到內(nèi)存 (2)將最新的fat.c和fat.h中內(nèi)容更新過來,解決了fatls亂碼的問題。 感興趣的,可以下載看看:
u-boot-1.1.6_20100601_MMC USB_20110806.7z
(1.16 MB, 下載次數(shù): 988)
2011-08-07 09:56 上傳
點(diǎn)擊文件名下載附件
--------------------------------------------------------------------------------------------------------
【給TQ2440的uboot添加sd/mmc支持過程記錄】 1.本來打算自己寫對應(yīng)的代碼的,可以自己實(shí)在對sd/mmc方面的spec很不了解,硬著頭皮寫了幾行代碼,基本上就沒耐心繼續(xù)寫了。不過后來巧的是,網(wǎng)上找到了S3C24410的uboot中的mmc驅(qū)動: 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 然后網(wǎng)上還能找到2440對于2410的patch: http://docs.openmoko.org/trac/changeset/4108/trunk/src/target/u-boot/patches/uboot-s3c2440.patch 所以,經(jīng)過一番拷貝粘貼的整合,sd/mmc的驅(qū)動,就基本可以用了,一切都顯得很是順利。 2.然后就去測試代碼。發(fā)現(xiàn)可以正確識別我的卡的相關(guān)的信息。 但是在mmc初始化的時(shí)候,mmc_init()-> fat_register_device()-> mmc_block_read()中,發(fā)送完命令,讀完數(shù)據(jù)后,卻死在了: - 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);
復(fù)制代碼中的這一行: while (!(sdi->SDIDSTA & (1 << 4))) {} 然后簡單一點(diǎn)點(diǎn)去猜測可能的原因。 (1)以為頻率設(shè)置有問題呢,所以去嘗試更改了mmc_init()中的clock設(shè)置:
sdi->SDIPRE = 0x04; /* 2440: SDCLK = PCLK / (SDIPRE+1) =50/(4+1)= 10MHz */
但是結(jié)果還是不行。 (2)無意間找到了網(wǎng)上其他人也遇到類似問題: http://my.chinaunix.net/space.php?uid=20543672&do=blog&id=94370 中提到他也是遇到同樣問題,程序死在這一行: while (!(sdi->SDIDSTA & (1 << 4))) {} 然后說原因是其在配置文件 include/configs/mini2440.h中同時(shí)定義了 CONFIG_S3C2410和CONFIG_S3C2440而導(dǎo)致的,而我此處去看了下我這里頭文件EmbedSky.h中,是只有定義了 CONFIG_S3C2440啊,沒有定義兩個(gè)啊。因此,還是無法解決問題,程序死在這行的原因,還是不知道。 (3)后來就一點(diǎn)點(diǎn)加代碼去查看死掉的時(shí)候,當(dāng)然各個(gè)寄存器狀態(tài)如何,發(fā)現(xiàn)死掉的時(shí)候,然后FIFO的狀態(tài)中,一直是檢測到數(shù)據(jù)了,滿FIFO的,半滿這三個(gè)狀態(tài),而數(shù)據(jù)狀態(tài)寄存器中顯示,數(shù)據(jù)一直還剩0x1c0。 (4)最后的最后,當(dāng)在網(wǎng)上到這里: http://72891.cn/archiver/tid-1936727.html 的時(shí)候,看到:
- #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
復(fù)制代碼
突然發(fā)現(xiàn),為何此處,對于2410和2440,SDIIMSK和SDIDAT的寄存器順序都不同,都是顛倒的啊,后來去差2410和2440的datasheet,才發(fā)現(xiàn),原先其他一些地方的關(guān)于2440的定義,都是寫錯了,包括這里的。 真正正確的是: 對于2440:先是SDIIMSK后是SDIDAT,兩者都是32位的; 而對于2410,先是8位的SDIDAT,后是32位的SDIIMSK。 而回去看我的代碼,卻是依舊按照2410的定義,而不是2440的定義!! 所以才導(dǎo)致,代碼里面,去讀sd卡的數(shù)據(jù)寄存器SDIDAT,實(shí)際上卻是讀的SDIIMSK,所以導(dǎo)致FIFO中的狀態(tài)一直顯示FIFO是滿的,數(shù)據(jù)狀態(tài)寄存器顯示數(shù)據(jù)一直還剩0x1c0,因?yàn)閿?shù)據(jù)一直沒被程序讀走。 至此,完全才搞懂了錯誤原因:寄存器定義錯誤,導(dǎo)致程序運(yùn)行異常。 3.此時(shí),算是把mmcinit功能搞定了,然后就去嘗試fatls及fatload,結(jié)果發(fā)現(xiàn)說是找不到FAT FS,所以就又去把fat_register_device()中加上對應(yīng)代碼,看看是否是FAT文件系統(tǒng)注冊方面的問題,后來發(fā)現(xiàn)不是,而是沒有加part.c即fat.c中,加上對應(yīng)MMC的宏定義,以及沒有定義CONFIG_DOS_PARTITION,所以導(dǎo)致沒有對應(yīng)的分區(qū)支持mmc卡。因此頭文件中加上對應(yīng)的CONFIG_DOS_PARTITION宏定義,即源碼里面加上對應(yīng)的CFG_CMD_MMC的支持,即可。 4.最后的運(yùn)行效果,如下: - 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>
復(fù)制代碼
5.又順便把該加的宏定義,都加上了,整理美化了一下代碼。
【暫時(shí)沒搞懂的】 1.sd卡規(guī)范中說明,當(dāng)READ_BL_LEN<12的時(shí)候,才能用那個(gè)公式計(jì)算SD卡容量的,而我這里讀出的READ_BL_LEN卻是15,用那個(gè)公式計(jì)算出來的大小,超過了1GB,而我本身sd卡就是1GB的,所以是不對的。即不知道,當(dāng)READ_BL_LEN>=12的時(shí)候,不知道用啥公式計(jì)算sd卡容量,才是正確的。 |