编写自己的SD/MMC Host驱动(二):工作过程和大结局

本文详细介绍了Linux系统中SD/MMC驱动的工作过程,包括mmc_rescan函数的执行、SD/MMC卡的初始化、卡类型的判断及初始化、发送命令和处理中断的流程。在初始化阶段,通过get_cd检查卡的存在,使用mmc_power_up上电,并通过不同命令(如CMD0, CMD8, CMD55, ACMD41, CMD1)识别卡类型。在数据传输中,通过mmc_request发送请求,等待请求完成,并在中断处理中读写数据。文章还提到了错误处理和热插拔情况下的处理方式。" 119755007,7306290,AUTOSAR Adaptive Platform 深入解析:技术与特点,"['汽车电子', '软件架构', '汽车软件', 'AUTOSAR', '车载通信']
摘要由CSDN通过智能技术生成

上次说到,如果注册成功的话,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_idleSD/MMC卡进入IDLE状态,如果你对协议比较熟的话,就是发送CMD0了。然后调用mmc_send_if_cond发送CMD8设置接口,这个命令只有SD2.0才会响应,对于1.0标准是没关系的。然后就开始判断插入的卡到底是SDIO,SD

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值