新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Linux SDIO總線驅(qū)動

Linux SDIO總線驅(qū)動

作者: 時間:2016-12-15 來源:網(wǎng)絡 收藏

三.驅(qū)動加載

我們還是以SDIO驅(qū)動為例,注冊一個SDIO驅(qū)動會調(diào)用下面的函數(shù)。

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。這個設備的驅(qū)動很簡單。那來看sdio_driver結(jié)構(gòu)

struct sdio_driver{

char*name; --驅(qū)動名稱

conststruct sdio_device_id *id_table; --驅(qū)動設備ID

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

void(*remove)(struct sdio_func *);

structdevice_driver drv;

};

id_table很熟悉吧,嘿嘿在usb的驅(qū)動中如何將設備和驅(qū)動匹配就是根據(jù)這個東西。在SDIO中也是根據(jù)該id_table來進行設備和驅(qū)動的匹配。

四.驅(qū)動和設備匹配

在介紹了設備注冊和驅(qū)動注冊后,那來看這兩個是怎樣匹配的。記住SDIO驅(qū)動之上有兩條總線一個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的實現(xiàn)你就會發(fā)現(xiàn)就是根據(jù)id_table來實現(xiàn)設備和驅(qū)動的匹配。

五.probe

不管在設備注冊還是驅(qū)動注冊時,如果發(fā)現(xiàn)存在對應的設備和驅(qū)動則會調(diào)用對應的驅(qū)動。不過記住一點是均會先調(diào)用mmc bus的probe其次是sdio bus的probe。其實現(xiàn)的過程與platfrom類似,不多加贅述。

六.總結(jié)

SDIO說白了還是一種總線,其本質(zhì)還是離不開驅(qū)動和設備這兩者,如果有usb驅(qū)動的經(jīng)驗則會很好的理解SDIO總線的驅(qū)動。在linux內(nèi)核是可以觸類旁通的

- sdio_register_driver():向系統(tǒng)注冊sdio接口驅(qū)動,調(diào)用以后,系統(tǒng)會觸發(fā)sdio設備id檢測,如果設備id和接口驅(qū)動里.id_table里定義的id一致,則系統(tǒng)調(diào)用probe函數(shù)。1. 可以在DibBridgeTargetModuleInit()里調(diào)用,這樣insmod之后,驅(qū)動接口即被注冊(設備id被注冊),有相應設備插入則probe會被調(diào)用(此種做法參考LinuxKernelSdioMx28)2. 也可以在sdio初始化時調(diào)用,這樣設備插入時,probe不會被調(diào)用,只有在sdio初始化,sdio_register_driver()被調(diào)用時,系統(tǒng)才會重新檢測設備id,并調(diào)用probe。(此種做法好處是,模塊初始化不涉及何種設備,具有更好的通用性。參考LinuxKernelSdioMx53)


上一頁 1 2 3 下一頁

評論


技術(shù)專區(qū)

關閉