歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux SDIO總線驅動(三)

Linux SDIO總線驅動(三)

日期:2017/3/3 13:42:39   编辑:Linux技術

注冊一個SDIO驅動會調用下面的函數:

/**

* sdio_register_driver - register a function driver

* @drv: SDIO function driver

*/

int sdio_register_driver(struct sdio_driver *drv)

{

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

drv->drv.bus = &sdio_bus_type;

return driver_register(&drv->drv);

}

其實很好理解sdio_driver其實是driver的封裝,並且該driver的bus為sdio_bus_type。這個設備的驅動很簡單。那來看sdio_driver結構

/*

* SDIO function device driver

*/

struct sdio_driver {

char *name;

const struct sdio_device_id *id_table;

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

void (*remove)(struct sdio_func *);

struct device_driver drv;

};

d_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來實現設備和驅動的匹配。

不管在設備注冊還是驅動注冊時,如果發現存在對應的設備和驅動則會調用對應的驅動。不過記住一點是均會先調用mmc bus的probe其次是sdio bus的probe,具體可看mmc_attach_sdio()。其實現的過程與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 © Linux教程網 All Rights Reserved