Linux SD卡驱动开发(六) —— SD卡启动过程总体分析

本文详细解析Linux内核启动时SD卡的初始化过程,从mmc_init开始,涉及mmc、sd总线注册, mmc_blk_init初始化块设备,通过发送CMD命令检测卡状态,区分SD与MMC卡,直至卡设备成功加入系统并启动块设备驱动。
摘要由CSDN通过智能技术生成

一、工作流程

mmc驱动主要文件包括

drivers/mmc/card/block.c
drivers/mmc/card/queue.c
drivers/mmc/core/core.c
drivers/mmc/core/host.c
drivers/mmc/core/

内核启动时,首先执行core/core.c的mmc_init,注册mmc、sd总线,以及一个host class设备。接着执行card/block.c中,申请一个块设备

二、数据结构:

这里涉及三种总线

1. platform bus //MMC host controller 作为一种 platform device, 它是需要注册到 platform bus上 的  
driver/base/platform.c  
struct bus_type platform_bus_type = {  
    .name        = "platform",  
    .dev_attrs    = platform_dev_attrs,  
    .match        = platform_match,  
    .uevent        = platform_uevent,  
    .pm        = &platform_dev_pm_ops,  
};  
  
2. mmc bus type  //在mmc_init()中被创建的.通过调用 mmc_register_bus() 来注册 MMC 总线  
drivers\mmc\core\bus.c  
static struct bus_type mmc_bus_type = {  
    .name        = "mmc",  
    .dev_attrs    = mmc_dev_attrs,  
    .match        = mmc_bus_match,  
    .uevent        = mmc_bus_uevent,  
    .probe        = mmc_bus_probe,  
    .remove        = mmc_bus_remove,  
    .shutdown        = mmc_bus_shutdown,  
    .pm        = &mmc_bus_pm_ops,  
};  
  
3. sdio bus type    //在mmc_init()中被创建的.通过调用sdio_register_bus() 来注册 SDIO 总线  
drivers\mmc\core\sdio_bus.c  
static struct bus_type sdio_bus_type = {  
    .name        = "sdio",  
    .dev_attrs    = sdio_dev_attrs,  
    .match        = sdio_bus_match,  
    .uevent        = sdio_bus_uevent,  
    .probe        = sdio_bus_probe,  
    .remove        = sdio_bus_remove,  
    .pm        = SDIO_PM_OPS_PTR,  
};  
     其中mmc总线操作相关函数,由于mmc卡支持多种总数据线,如SPI、SDIO、8LineMMC而不同的总线的操作控制方式不尽相同,所以通过此结构与相应的总线回调函数相关联。
//总线操作结构
struct mmc_bus_ops {
    void (*remove)(struct mmc_host *);
    void (*detect)(struct mmc_host *);
    int (*sysfs_add)(struct mmc_host *, struct mmc_card *card);
    void (*sysfs_remove)(struct mmc_host *, struct mmc_card *card);
    void (*suspend)(struct mmc_host *);
    void (*resume)(struct mmc_host *);
};
//  mmc卡的总线操作 core/mmc.c
static const struct mmc_bus_ops mmc_ops = {
    .remove = mmc_remove,
    .detect = mmc_detect,
    .sysfs_add = mmc_sysfs_add,
    .sysfs_remove = mmc_sysfs_remove,
    .suspend = mmc_suspend,
    .resume = mmc_resume,
};
// sd卡的总线操作 core/sd.c
static const struct mmc_bus_ops mmc_sd_ops = {
    .remove = mmc_sd_remove,
    .detect = mmc_sd_detect,
    .sysfs_add = mmc_sd_sysfs_add,
    .sysfs_remove = mmc_sd_sysfs_remove,
    .suspend = mmc_sd_suspend,
    .resume = mmc_sd_resume,
};
// sdio的总线操作 core/sdio.c
static const struct mmc_bus_ops mmc_sdio_ops = {
    .remove = mmc_sdio_remove,
    .detect = mmc_sdio_detect,
};

关于总线操作的函数:

.detect,驱动程序经常需要调用此函数去检测mmc卡的状态,具体实现是发送CMD13命令,并读回响应,如果响应错误,则依次调用.remove、detach_bus来移除卡及释放总线。


三、总体架构

1、kernel启动时,先后执行mmc_init()及mmc_blk_init(),以对mmc设备及mmc块模块进行初始化

mmc/core/core.c  
static int __init mmc_init(void)  
    workqueue = alloc_ordered_workqueue("kmmcd", 0);//建立了一个工作队列w
  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Linux中,SD卡驱动程序负责与SD卡进行通信,并提供对其读取和写入的支持。SD卡驱动程序的开发通常需要以下几个步骤: 1. 硬件初始化:首先,需要进行硬件初始化,配置SD卡所连接的总线(如SPI或SDIO)及其相应的引脚。这通常包括设置时钟频率、模式和传输位宽等参数。 2. 协议支持:SD卡使用一种称为SD协议的通信协议进行数据交换。驱动程序需要实现这个协议,以便与SD卡进行正常的通信。这包括命令的发送和接收,数据的读取和写入,以及错误处理等。 3. 设备注册:驱动程序需要将SD卡设备注册到Linux内核的设备模型中,以便其他模块和应用程序能够识别和使用它。这通常涉及到创建设备节点,并将设备与适当的驱动程序进行关联。 4. 文件系统支持:如果SD卡上存在文件系统,驱动程序需要提供对文件系统的支持,以便能够读取和写入文件。这通常涉及到与文件系统相应的模块的集成,以确保文件系统的正确识别和操作。 5. 功耗管理:SD卡通常配备了多种省电模式,以延长电池寿命。驱动程序需要实现相应的功耗管理策略,以便根据需要进入和退出适当的省电模式。 6. 错误处理:SD卡驱动程序应该能够处理各种可能的错误情况,如通信错误、设备故障和文件系统损坏等。这通常包括错误检测、恢复和报告等功能。 开发SD卡驱动程序需要对SD卡及其相关的硬件和协议有所了解,同时熟悉Linux内核编程和驱动程序开发的技巧。通过以上步骤的实施,可以实现一个稳定和可靠的SD卡驱动程序,使得Linux系统能够完全利用SD卡存储提供的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值