Chinaunix
標(biāo)題: 【記錄】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 [打印本頁]
作者: crifan 時(shí)間: 2011-08-06 16:31
標(biāo)題: 【記錄】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持
本帖最后由 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ū)動(dòng):
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ū)動(dòng),就基本可以用了,一切都顯得很是順利。
2.然后就去測試代碼。發(fā)現(xiàn)可以正確識(shí)別我的卡的相關(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的定義,都是寫錯(cuò)了,包括這里的。
真正正確的是:
對于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ù)一直沒被程序讀走。
至此,完全才搞懂了錯(cuò)誤原因:寄存器定義錯(cuò)誤,導(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卡容量,才是正確的。
作者: npuazm 時(shí)間: 2011-08-10 11:10
mark
作者: npuazm 時(shí)間: 2011-08-10 12:24
查看 SD 協(xié)議,里面有這樣的說明
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 協(xié)議的描述的去計(jì)算
“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”
紅色字體是協(xié)議中的內(nèi)容,希望我的描述對你有幫戰(zhàn)
作者: crifan 時(shí)間: 2011-08-10 23:39
回復(fù) 3# npuazm
謝謝。是自己之前沒細(xì)看協(xié)議。
對于更好的mmc的架構(gòu)和實(shí)現(xiàn),新版本的uboot里面都有,也有對應(yīng)的正確的計(jì)算sd卡容量的代碼。
有機(jī)會(huì)的話,再把最新mmc部分整合過來。
作者: crifan 時(shí)間: 2011-08-24 12:10
已實(shí)現(xiàn):
【記錄】將Uboot 2011.06中mmc驅(qū)動(dòng)移植到uboot 1.1.6的過程
http://72891.cn/thread-3582107-1-3.html
作者: happy2468 時(shí)間: 2012-06-29 17:58
本帖最后由 happy2468 于 2012-06-29 17:59 編輯
請問U-BOOT的1.3.4添加USB Mass Storage支持要怎么實(shí)現(xiàn)?
CPU的是DAVINCI
要怎么像的uboot-S3C2410一樣目錄底下有OHCI的相關(guān)代碼實(shí)現(xiàn)
作者: hezhaoaqiang 時(shí)間: 2012-09-06 16:31
回復(fù) 3# npuazm
學(xué)習(xí),可以請教你個(gè)問題嗎?
我用的是Davinci的處理器,AM1808,要在下面添加MMC/SD卡的識(shí)別,我們用的是,hawkboard的uboot源碼,在上面添加,我在網(wǎng)上找了最新的支持davinci 的uboot,里面有對davinci_mmc的程序,但是我不是很清楚在uboot總的程序里面怎么去調(diào)用他,還請你指點(diǎn)迷津。小弟非常感謝~~~
作者: ruanwenlong18 時(shí)間: 2012-09-11 14:22
不錯(cuò) 資料挺詳細(xì)的 樓主好人
歡迎光臨 Chinaunix (http://72891.cn/) |
Powered by Discuz! X3.2 |