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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Linux驅(qū)動中的platform

          Linux驅(qū)動中的platform

          作者: 時間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          從Linux2.6內(nèi)核起,引入一套新的驅(qū)動管理和注冊機制:platform_device 和 platform_driver 。Linux 中大部分的設(shè)備驅(qū)動,都可以使用這套機制,設(shè)備用 platform_device 表示;驅(qū)動用 platform_driver 進行注冊。

          本文引用地址:http://www.ex-cimer.com/article/201610/305944.htm

          Linux platform driver 機制和傳統(tǒng)的device driver機制(即:通過 driver_register 函數(shù)進行注冊)相比,一個十分明顯的優(yōu)勢在于platform機制將設(shè)備本身的資源注冊進內(nèi)核,由內(nèi)核統(tǒng)一管理,在驅(qū)動程序中用使用這些資源時,通過platform device提供的標(biāo)準(zhǔn)接口進行申請并使用。

          platform 是一個虛擬的地址總線,相比 PCI、USB,它主要用于描述SOC上的片上資源。platform 所描述的資源有一個共同點:在CPU 的總線上直接取址。平臺設(shè)備會分到一個名稱(用在驅(qū)動綁定中)以及一系列諸如地址和中斷請求號(IRQ)之類的資源。

          platform 總線下驅(qū)動的開發(fā)步驟是:

          1、 設(shè)備

          需要實現(xiàn)的結(jié)構(gòu)體是:platform_device 。

          1)初始化 resource 結(jié)構(gòu)變量

          2)初始化 platform_device 結(jié)構(gòu)變量

          3)向系統(tǒng)注冊設(shè)備:platform_device_register。

          以上三步,必須在設(shè)備驅(qū)動加載前完成,即執(zhí)行platform_driver_register()之前,原因是驅(qū)動注冊時需要匹配內(nèi)核中所有已注冊的設(shè)備名。platform_driver_register()中添加device到內(nèi)核最終還是調(diào)用的device_add函數(shù)。Platform_device_add和device_add最主要的區(qū)別是多了一步insert_resource(p, r),即將platform資源(resource)添加進內(nèi)核,由內(nèi)核統(tǒng)一管理。

          2、驅(qū)動

          驅(qū)動注冊中,需要實現(xiàn)的結(jié)構(gòu)體是:platform_driver 。

          在驅(qū)動程序的初始化函數(shù)中,調(diào)用了platform_driver_register()注冊 platform_driver 。需要注意的是:platform_driver 和 platform_device 中的 name 變量的值必須是相同的 。這樣在 platform_driver_register() 注冊時,會將當(dāng)前注冊的 platform_driver 中的 name 變量的值和已注冊的所有 platform_device 中的 name 變量的值進行比較,只有找到具有相同名稱的 platform_device 才能注冊成功。當(dāng)注冊成功時,會調(diào)用 platform_driver 結(jié)構(gòu)元素 probe 函數(shù)指針。

          platform_driver_register()的注冊過程:

          1 platform_driver_register(s3c2410fb_driver)

          2 driver_register(drv->driver)

          3 bus_add_driver(drv)

          4 driver_attach(drv)

          5 bus_for_each_dev(drv->bus, NULL, drv, __driver_attach)

          6 __driver_attach(struct device * dev, void * data)

          7 driver_probe_device(drv, dev)

          8 really_probe(dev, drv)

          在really_probe()中:為設(shè)備指派管理該設(shè)備的驅(qū)動:dev->driver = drv, 調(diào)用probe()函數(shù)初始化設(shè)備:drv->probe(dev)



          關(guān)鍵詞:

          評論


          相關(guān)推薦

          技術(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); })();