<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux SDIO總線驅(qū)動(dòng)

          Linux SDIO總線驅(qū)動(dòng)

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

          三.驅(qū)動(dòng)加載

          我們還是以SDIO驅(qū)動(dòng)為例,注冊(cè)一個(gè)SDIO驅(qū)動(dòng)會(huì)調(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);

          }

          其實(shí)很好理解sdio_driver其實(shí)是driver的封裝,并且該driver的bus為sdio_bus_type。這個(gè)設(shè)備的驅(qū)動(dòng)很簡(jiǎn)單。那來看sdio_driver結(jié)構(gòu)

          struct sdio_driver{

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

          conststruct sdio_device_id *id_table; --驅(qū)動(dòng)設(shè)備ID

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

          void(*remove)(struct sdio_func *);

          structdevice_driver drv;

          };

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

          四.驅(qū)動(dòng)和設(shè)備匹配

          在介紹了設(shè)備注冊(cè)和驅(qū)動(dòng)注冊(cè)后,那來看這兩個(gè)是怎樣匹配的。記住SDIO驅(qū)動(dòng)之上有兩條總線一個(gè)mmc bus 一個(gè)是SDIO bus。

          先來看mmc bus的match

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

          {

          return1;

          }

          這個(gè)很省事,直接就是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的實(shí)現(xiàn)你就會(huì)發(fā)現(xiàn)就是根據(jù)id_table來實(shí)現(xiàn)設(shè)備和驅(qū)動(dòng)的匹配。

          五.probe

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

          六.總結(jié)

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

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


          上一頁 1 2 3 下一頁

          關(guān)鍵詞: LinuxSDIO總線驅(qū)

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();