我的内核是linux 2.6.28,已经带有了sd mmc卡驱动了只要在menuconfig里面把相应选项选上即可,
s3c2440-sdi s3c2440-sdi: powered down.
mmc0: error -110 whilst initialising SD card
s3c2440-sdi s3c2440-sdi: powered down.
编译出来了之后,我插上了我的一个512mb的卡,在启动信息了打印如下:
s3c2440-sdi s3c2440-sdi: powered down.
mmc0: error -110 whilst initialising SD card
s3c2440-sdi s3c2440-sdi: powered down.
注意红色部分,进入了之后/dev/devices 里面看不到没有相应的驱动。驱动工作不正常!
但是插上了一个32mb的卡后,就能够正常识别。
在网上查到如下信息:
mmc0: error -110 whilst initialising SD card
應該是卡在 linux/driver/mmc/core/sd.c 的
mmc_sd_init_card() --> mmc_send_app_op_cond(host, ocr, NULL)
ocr 是指 card 內部的 Operation Condition Register (OCR) 讀出來的值
發送 CMD41 CMD55 讀取 OCR 的值
問題是出在 OCR[31] 一直是 0 <--- 初始化沒有完成??
結果問題是出在電壓不足,要把 sd power enable
應該是卡在 linux/driver/mmc/core/sd.c 的
mmc_sd_init_card() --> mmc_send_app_op_cond(host, ocr, NULL)
ocr 是指 card 內部的 Operation Condition Register (OCR) 讀出來的值
發送 CMD41 CMD55 讀取 OCR 的值
問題是出在 OCR[31] 一直是 0 <--- 初始化沒有完成??
結果問題是出在電壓不足,要把 sd power enable
上面这位说的解决方法我也不太清楚,不过他指出的错误地方是正确的,就是在那里出错的。
现在说下这个错误的解决方案:
driver/mmc/core/sd.c 的mmc_sd_init_card()函數中mmc_read_switch前延時10ms
mdelay(10);
err = mmc_read_switch(card);
mdelay(10);
err = mmc_read_switch(card);
看到红色语句了么,就这个加上去就可以了啊,哈哈......
加上红色延时语句之后启动信息如下
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
mmc0: new SD card at address 95b9
mmcblk0: mmc0:95b9 SD02G 1.83 GiB
mmcblk0: p1
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
mmc0: new SD card at address 95b9
mmcblk0: mmc0:95b9 SD02G 1.83 GiB
mmcblk0: p1
驱动工作完全正常。
进入系统后
mount /dev/mmcblk0p1 /mnt