最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【记录】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 + 解决fatls乱码问题

工作和技术 crifan 3547浏览 0评论

【记录】在TQ2440的uboot中添加SD/MMC支持 + 添加USB Mass Storage支持 + 解决fatls乱码问题

author: crifan

version: 2011-08-06

 

下面记录,在TQ2440uboot源码:

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)

——————————————————————————————————–

【给TQ2440uboot添加sd/mmc支持过程记录】

1.       本来打算自己写对应的代码的,可以自己实在对sd/mmc方面的spec很不了解,硬着头皮写了几行代码,基本上就没耐心继续写了。不过后来巧的是,网上找到了S3C24410uboot中的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对于2410patch

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_S3C2410CONFIG_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

 

突然发现,为何此处,对于24102440SDIIMSKSDIDAT的寄存器顺序都不同,都是颠倒的啊,后来去差24102440datasheet,才发现,原先其他一些地方的关于2440的定义,都是写错了,包括这里的。

真正正确的是:

对于2440:先是SDIIMSK后是SDIDAT,两者都是32位的;

而对于2410,先是8位的SDIDAT,后是32位的SDIIMSK

而回去看我的代码,却是依旧按照2410的定义,而不是2440的定义!!!

所以才导致,代码里面,去读sd卡的数据寄存器SDIDAT,实际上却是读的SDIIMSK,所以导致FIFO中的状态一直显示FIFO是满的,数据状态寄存器显示数据一直还剩0x1c0,因为数据一直没被程序读走。

至此,完全才搞懂了错误原因:寄存器定义错误,导致程序运行异常。

 

3.       此时,算是把mmcinit功能搞定了,然后就去尝试fatlsfatload,结果发现说是找不到FAT FS,所以就又去把fat_register_device()中加上对应代码,看看是否是FAT文件系统注册方面的问题,后来发现不是,而是没有加part.cfat.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乱码问题

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.180 seconds, using 22.18MB memory