亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 15484 | 回復(fù): 7
打印 上一主題 下一主題

[BootLoader] 【記錄】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-08-06 16:31 |只看該作者 |倒序?yàn)g覽
本帖最后由 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)

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)

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

【給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ù)后,卻死在了:

  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);
復(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í)候,看到:


  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
復(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)行效果,如下:

  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>
復(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卡容量,才是正確的。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-08-10 11:10 |只看該作者
mark

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 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)

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-08-10 23:39 |只看該作者
回復(fù) 3# npuazm


    謝謝。是自己之前沒細(xì)看協(xié)議。
對于更好的mmc的架構(gòu)和實(shí)現(xiàn),新版本的uboot里面都有,也有對應(yīng)的正確的計(jì)算sd卡容量的代碼。
有機(jī)會的話,再把最新mmc部分整合過來。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-08-24 12:10 |只看該作者
已實(shí)現(xiàn):
【記錄】將Uboot 2011.06中mmc驅(qū)動移植到uboot 1.1.6的過程
http://72891.cn/thread-3582107-1-3.html

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 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)

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-09-06 16:31 |只看該作者
回復(fù) 3# npuazm
學(xué)習(xí),可以請教你個(gè)問題嗎?
我用的是Davinci的處理器,AM1808,要在下面添加MMC/SD卡的識別,我們用的是,hawkboard的uboot源碼,在上面添加,我在網(wǎng)上找了最新的支持davinci 的uboot,里面有對davinci_mmc的程序,但是我不是很清楚在uboot總的程序里面怎么去調(diào)用他,還請你指點(diǎn)迷津。小弟非常感謝~~~


   

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-09-11 14:22 |只看該作者
不錯  資料挺詳細(xì)的 樓主好人
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP