微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux SDIO总线驱动

Linux SDIO总线驱动

时间:12-15 来源:互联网 点击:

card->

card->

host->

sdio_init_func(host->

mmc_add_card(host->

sdio_add_func(host->card->

func->

device_initialize(&func->

func->dev.parent= &card->

func->

func->

IO驱动为例,注册一个SDIO驱动会调用下面的函数。

int sdio_register_driver(struct sdio_driver*drv)

{

drv->drv.name= drv->name;

drv->drv.bus= &sdio_bus_type;

returndriver_register(&drv->drv);

}

其实很好理解sdio_driver其实是driver的封装,并且该driver的bus为sdio_bus_type。这个设备的驱动很简单。那来看sdio_driver结构

struct sdio_driver{

char*name; --驱动名称

conststruct sdio_device_id *id_table; --驱动设备ID

int(*probe)(struct sdio_func *, const struct sdio_device_id *);

void(*remove)(struct sdio_func *);

structdevice_driver drv;

};

id_table很熟悉吧,嘿嘿在usb的驱动中如何将设备和驱动匹配就是根据这个东西。在SDIO中也是根据该id_table来进行设备和驱动的匹配。

四.驱动和设备匹配

在介绍了设备注册和驱动注册后,那来看这两个是怎样匹配的。记住SDIO驱动之上有两条总线一个mmc bus 一个是SDIO bus。

先来看mmc bus的match

static int mmc_bus_match(struct device *dev,struct device_driver *drv)

{

return1;

}

这个很省事,直接就是1.

那在看sdio bus 的match

static int sdio_bus_match(struct device *dev,struct device_driver *drv)

{

structsdio_func *func = dev_to_sdio_func(dev);

structsdio_driver *sdrv = to_sdio_driver(drv);

if(sdio_match_device(func, sdrv))

return1;

return0;

}

通过查看上面的具体code的实现你就会发现就是根据id_table来实现设备和驱动的匹配。

五.probe

不管在设备注册还是驱动注册时,如果发现存在对应的设备和驱动则会调用对应的驱动。不过记住一点是均会先调用mmc bus的probe其次是sdio bus的probe。其实现的过程与platfrom类似,不多加赘述。

六.总结

SDIO说白了还是一种总线,其本质还是离不开驱动和设备这两者,如果有usb驱动的经验则会很好的理解SDIO总线的驱动。在linux内核是可以触类旁通的

- sdio_register_driver():向系统注册sdio接口驱动,调用以后,系统会触发sdio设备id检测,如果设备id和接口驱动里.id_table里定义的id一致,则系统调用probe函数。1. 可以在DibBridgeTargetModuleInit()里调用,这样insmod之后,驱动接口即被注册(设备id被注册),有相应设备插入则probe会被调用(此种做法参考LinuxKernelSdioMx28)2. 也可以在sdio初始化时调用,这样设备插入时,probe不会被调用,只有在sdio初始化,sdio_register_driver()被调用时,系统才会重新检测设备id,并调用probe。(此种做法好处是,模块初始化不涉及何种设备,具有更好的通用性。参考LinuxKernelSdioMx53)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top