上次说到,如果注册成功的话,Linux就会开始初始化SD/MMC了,SD/MMC的初始化都是通过drivers/mmc/core/core.c里面mmc_rescan来完成的:
void mmc_rescan(struct work_struct *work)
{
.......
if (host->ops->get_cd && host->ops->get_cd(host) == 0)
goto out;
...................
mmc_power_up(host);
mmc_go_idle(host);
...................
mmc_send_if_cond(host, host->ocr_avail);
/*
* First we search for SDIO...
*/
...................
err = mmc_send_io_op_cond(host, 0, &ocr);
...................
/*
* ...then normal SD...
*/
err = mmc_send_app_op_cond(host, 0, &ocr);
...................
/*
* ...and finally MMC.
*/
err = mmc_send_op_cond(host, 0, &ocr);
...................
}
首先调用get_cd方法,看看是不是有卡在里面,不然岂不是白忙活!
然后调用mmc_power_up来上电,该函数将调用驱动的set_ios操作函数,控制电源和时钟等。
电也上了,此时就需要调用mmc_go_idle让SD/MMC卡进入IDLE状态,如果你对协议比较熟的话,就是发送CMD0了。然后调用mmc_send_if_cond发送CMD8设置接口,这个命令只有SD2.0才会响应,对于1.0标准是没关系的。然后就开始判断插入的卡到底是SDIO,SD