Linux2.6.18 SD卡驱动的修正技巧 01
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
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)这个循环了, |
|
|
|
|
|