天嵌 ARM开发社区

 找回密码
 注册
查看: 3555|回复: 3

请教如何让ARM板从SD卡更新文件系统

[复制链接]
shruger 发表于 2012-9-3 15:17:46 | 显示全部楼层 |阅读模式
各位大神,小弟想让TQ2440 板子开机的时候能够加载U盘或者SD卡里面yaffs.tar.gz的文件系统。请问能否做到?
亚瑟王 发表于 2012-9-4 09:19:47 | 显示全部楼层
可以的,在u-boot中添加SD卡驱动,或者在u-boot中添加对USB的支持(USB驱动已经OK了的)。具体方法等下回复你。
SWEKEY 发表于 2012-9-5 14:36:04 | 显示全部楼层
亚瑟王 发表于 2012-9-4 09:19
可以的,在u-boot中添加SD卡驱动,或者在u-boot中添加对USB的支持(USB驱动已经OK了的)。具体方法等下回复 ...

请问什么时候能有空给出具体的教程呢?很期待
亚瑟王 发表于 2012-9-6 09:36:41 | 显示全部楼层
SWEKEY 发表于 2012-9-5 14:36
请问什么时候能有空给出具体的教程呢?很期待

你好,下面的内容是转贴的。(原帖位置:http://bbs.chinaunix.net/thread-3577777-1-1.html
下面记录,在TQ2440的uboot源码:
http://soft.embedsky.net/files/cd_iso/u-boot-1.1.6_20100601.rar
的基础上,添加对mmc/sd卡的支持的过程。
--------------------------------------------------------------------------------------------------------
这里先附上代码,感兴趣或需要的,可以下载:
1. 添加了对SD/MMC的支持:mmcinit->fatls mmc 0,可以查看文件,fatload mmc 0 addr file,可以拷贝文件到内存
u-boot-1.1.6_20100601_addSdMmc_20110806.7z:
  u-boot-1.1.6_20100601_addSdMmc_20110806.7z (1.16 MB, 下载次数: 412)
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, 下载次数: 508)
--------------------------------------------------------------------------------------------------------
【给TQ2440的uboot添加sd/mmc支持过程记录】
1.本来打算自己写对应的代码的,可以自己实在对sd/mmc方面的spec很不了解,硬着头皮写了几行代码,基本上就没耐心继续写了。不过后来巧的是,网上找到了S3C24410的uboot中的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对于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%08x\n", sdi->SDIDSTA);
while (!(sdi->SDIDSTA & (1 << 4))) {}
debug("done waiting for SDIDSTA (currently 0x%08x\n", 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)
#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
复制代码
突然发现,为何此处,对于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>
复制代码


5.又顺便把该加的宏定义,都加上了,整理美化了一下代码。
【暂时没搞懂的】
1.sd卡规范中说明,当READ_BL_LEN<12的时候,才能用那个公式计算SD卡容量的,而我这里读出的READ_BL_LEN却是15,用那个公式计算出来的大小,超过了1GB,而我本身sd卡就是1GB的,所以是不对的。即不知道,当READ_BL_LEN>=12的时候,不知道用啥公式计算sd卡容量,才是正确的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-25 09:27 , Processed in 1.062500 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表