从总线模型谈SD/MMC架构

本文详细介绍了SD/MMC架构,从mmc_bus_match的总线匹配到mmc_register_driver的驱动注册,再到mmc_alloc_card和mmc_add_card的设备结构体注册。重点讨论了mmc_blk_probe在块设备中的作用,以及mmc_alloc_host和mmc_attach_mmc在设备探测和初始化中的功能。文章还阐述了中断处理和设备节点的创建过程,揭示了总线模型、驱动和设备之间的交互机制。
摘要由CSDN通过智能技术生成

mmc总线:mmc_bus_type

mmc驱动结构体注册:mmc_register_driver函数。

mmc设备结构体注册:mmc_alloc_card和mmc_add_card函数。

1、匹配问题:

由于总线的匹配函数mmc_bus_match直接返回1:

static int mmc_bus_match(struct device *dev, struct device_driver *drv)
{
return 1;
}

根据总线模型:

driver_register

bus_add_driver

driver_attach(drv)

driver_probe_device

really_probe(dev, drv);

ret = dev->bus->probe(dev);

也就是:

static int mmc_bus_probe(struct device *dev)
{
struct mmc_driver *drv = to_mmc_driver(dev->driver);
struct mmc_card *card = dev_to_mmc_card(dev);


return drv->probe(card);  //调用驱动的probe
}

结论:就是把驱动和设备的匹配任务扔给了驱动来完成:really_probe函数调用总线的probe函数,返回0就会调用driver_bound(dev)函数吧驱动和设备进行绑定了。


这里很容易可以推导出mmc_card和mmc_driver 两者第一必须存在,第二mmc_card在drv->probe(card)调用返回值必须为0,这样就算mmc总线的设备和驱动绑定成功。



2、mmc_register_driver驱动注册:


static int __init mmc_blk_init(void)  //属于块设备:

res = register_blkdev(MMC_BLOCK_MAJOR, "mmc"); //将相应的块设备添加到数组中,主设备号、名称、指向下一个指针

res = mmc_register_driver(&mmc_driver);//这里会使用第一点的匹配,调用probe函数,这个函数就是块设备的核心函数mmc_blk_probe


调用probe函数:

mmc_blk_probe

md = mmc_blk_alloc(card); //mmc_blk_data结构体

md->disk = alloc_disk(1 << MMC_SHIFT);//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值