把SPI模式的SD卡协议简单的看了下,知道SD卡的初始化过程,读写数据是怎么回事了。
然后跟踪SD卡的初始化,发现SD卡复位,进入IDLE模式都没问题,而问题是出在获取CID上,程序如下:
static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
struct mmc_card *oldcard)
{
省略
----------------
err = mmc_send_if_cond(host, ocr);
if (!err)
ocr |= 1 << 30;
err = mmc_send_app_op_cond(host, ocr, NULL);
if (err)
goto err;
/*
* For SPI, enable CRC as appropriate.
*/
if (mmc_host_is_spi(host)) {
//err = mmc_spi_set_crc(host, use_spi_crc);
err = mmc_spi_set_crc(host, 0); //zhh if (err)
goto err;
}
/*
* Fetch CID from card.
*/
if (mmc_host_is_spi(host))
{
err = mmc_send_cid(host, cid);
}
else
err = mmc_all_send_cid(host, cid);
if (err)
goto err;
-----------------------------
省略
}
于是猜想会不会是spi加了ECC的原因,网上有位高手说SPI模式的SD卡加ECC是自讨苦吃,于是我把ECC去掉了,程序上面红色部分。
然后就成功了。
查看dev是179 0
然后mknod
试了下,OK。
以上是以前记录的SD卡驱动。
今天换了一张SD卡,就mount不上了,如下
# mount -t vfat /dev/sd_spi /mnt/sdcard
mount: mounting /dev/sd_spi on /mnt/sdcard failed: Invalid argument
看下分区
# cat /proc/partitions
major minor #blocks name
31 0 2048 mtdblock0
31 1 4096 mtdblock1
31 2 4096 mtdblock2
31 3 8192 mtdblock3
31 4 8192 mtdblock4
31 5 4096 mtdblock5
31 6 231424 mtdblock6
179 0 492544 mmcblk0
179 1 492512 mmcblk0p1
#
那么SD卡驱动加载肯定没问题了。
发现
mknod /dev/sd_spi b 179 1
就可以了,
以前用的
mknod /dev/sd_spi b 179 0
但是以前的卡这样也可以的。
理论上来说,的确应该用mknod /dev/sd_spi b 179 1
修改后,2张SD卡都能正常使用,明天再多找几张试试。
阅读(4534) | 评论(0) | 转发(0) |