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);//