注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 获取当前页面路径,实现权..
 帮助

2440从sd卡启动wince


2008-04-16 15:47:25
 标签:2440 wince sdboot   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://bluefish.blog.51cto.com/214870/71870
    经过一周的时间终于在s3c2440上把sdboot给跑起来了。整个任务是在已有的bootloader上(用usb线从pc下载的方式)修改以支持直接从sd卡上拷贝nk.nb0文件到内存并启动。
    有关sd卡驱动和fat fs的实现用了3个文件来实现。sdboot.c为sd的驱动(可理解为pdd)层,主要实现一些对sd控制器的配置以及一些基本sd命令的实现和对sd卡的操作。sdmmc.c实现了从sd卡读取nk并跳到内存去运行的代码(基本可以理解为sd驱动的mdd层)。sdfat.c文件就是实现fat fs的。mdd层通过fatfs来对pdd层操作以实现读取文件。
    在整个过程中遇到了很多问题,现在列举如下:
1)sd卡初始化问题
    配置gpio有关sd的功能:SDCMD, SDDAT[3:0]。
    使能CLKCON中的SDI位。
    时钟以及计算公式:SDIPRE   = PCLK/(CLK)-1;INICLK=300000;SDCLK=24000000; MMCCLK= 15000000
    cmd0-cmd55-cmd41-cmd2-cmd3-cmd7-cmd6-cmd17
2)对sd卡操作问题
    SD卡包括:一个标识寄存器CID,一个相应地址寄存器RCA,一个其他参数寄存器
CSD。
    对sd卡的操作是驱动通过sd controller来发相应的命令以达到读写等操作的:发送命令通过SDICmdCon[7:0]的除了开始2bit:CmdIndex放置要发送的命令号;SDICmdCon[8]开始发送命令来完成的。
    检测卡的插入,直接用中断引脚的电平来判断。
    判断插入的卡是否是sd卡,用命令cmd55和cmd41,因为mmc卡对cmd55不做回应。
    命令9就是获取sd卡中csd寄存器的值的,该值包括很多sd卡的信息,其中就有sd卡的容量。这个值在sd卡接收到cmd9之后会以response的形式存放在sd控制器的SDI Response Register[0,1,2,3]中。在执行cmd9,cmd10等这样的命令的时候,卡的状态应该是不选中的,或直接在执行它们之前发送cmd7(0)不选中卡,不然的话会timeout。
    用cmd17来读取单个block的数据,该命令要带地址参数(该参数通过cmd3命令来获取),然后根据SDIDSTA和SDIFSTA状态值来从sd控制器的SDIDAT寄存器中读出要读的数据。该命令与cmd9相反,在执行它之前要选中卡。读完一个block之后要做一些善后工作,为下次读取做好准备,不然的话checkcmdend就要一直循环了。因为用的是每次都读一个block,并地址要以block对齐,这样就要考虑要读取的地址是否是block对齐的,长度是否够一个block。
    SDIDCON这个数据控制寄存器也很重要,一些对数据的操作形式就是在这里设置的。
3)fat文件系统问题
    根据MBR找到分区表,根据分区表找到该分区MBR[446B+4个分区表(每个16B)+2B结束符)
    分区表中的第9-12字节为该分区的启始地址(单位没sector),第13-16字节为分区的长度(单位也是sector)

本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/71870





    文章评论
 
2008-04-17 09:59:53
rightsoft 大哥,你好,难得找到介绍这么详细的文章!我目前也在做eboot下的SD驱动,平台是s3c2443,目前之前的初始化命令都成功了,也获得了正确的CSD之类的参数,但是在进行发送CMD17进行读操作时,SDIFSTA一直为0,SDIDSTA一直为0x5,一段时间之后就timeout了,请问这是什么原因啊?

2008-04-17 15:14:46
问题解决了!!是把SDIDCON的参数设为wide bus mode了,文档里有这样一句话:
Wide Bus (4 bit bus width) operation mode may be selected/deselected using ACMD6. The default bus width after
power up or GO_IDLE (CMD0) is 1 bit bus width. ACMD6 command is valid in ‘tran state‘ only. That means that
the bus width may be changed only after a card was selected (CMD7).

2008-04-23 02:26:41
楼主,你好!最近我也在写出2440 bootloader里读写sd卡上文件系统的软件.sd卡的初使化都没有问题.在下发CMD17命令后,查寻SDICSTA的CMDEND状态位时死循环了,跳不出来.壮态不改变.但是单步运行就没有问题.楼主有没有碰到类似问题,还望指教

2008-04-25 08:20:41
楼主可以把代码发给我参考下吗?
谢谢了~~
lihao19850208@yahoo.com.cn

2008-04-25 23:58:41
问题解决了,SDIDCON设置错误

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: