首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux2.6.18 SD卡驱动的修正技巧 01

Linux2.6.18 SD卡驱动的修正技巧 01

platform: s3c2440 + Linux 2.6.18

在Linux2.6.18 中,sd卡的驱动有不少的bug.例如,没有写保护的功能.

在驱动的模块中预留了写保护的函数,但是没有实现,代码也只有几行,只要加上去编译一下就OK了.


static struct mmc_host_ops s3c2410sdi_ops = {.request = s3c2410sdi_request,.set_ios = s3c2410sdi_set_ios,.get_ro = s3c2440_get_ro, //sd card ReadOnly Flag.};

实现函数如下:


static int s3c2440_get_ro(struct mmc_host *mmc){struct s3c2410sdi_host *host = mmc_priv(mmc);unsigned long flags;int present;spin_lock_irqsave(&host->complete_lock, flags);present = read_gpio_bit(S3C2410_GPB0); present &= 0x01;spin_unlock_irqrestore(&host->complete_lock, flags);return present;}

还有一些就是热插拔的和中断检测口,只要设置一下就可以用了.

比较麻烦的是对SD卡写操作,只要写稍微大点的文件到SD卡就会出错,打印出如下信息:


[IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00008000[IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00007000[IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00007000[IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00007000

对比正常传送打印出来的信息,很明显程序是在这里挂掉了.

后来跟踪代码发现,当写一个 4096(512*8)的数据时,只写了第一个512byte就不往下写了,所以dcnt一直为 7000,出现这个现象的原因是因为程序对 host->pio_Words 这个变量赋的值为128,通过 host->pio_words-- 递减到0时就不进入

while(sdi_fsta & S3C2410_SDIFSTA_TFDET && host->pio_words)这个循环了,
返回列表