platfrm總線、設備與驅(qū)動_第1頁
platfrm總線、設備與驅(qū)動_第2頁
platfrm總線、設備與驅(qū)動_第3頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、platform 總線、設備與驅(qū)動 2013-09-04 17:38:36分類: LINUXLinux2.6 的設備驅(qū)動模型中,關心總線、設備和驅(qū)動 3 個實體,總線將設備和 驅(qū)動綁定。在系統(tǒng)每注冊一個設備的時候,會尋找與之匹配的驅(qū)動;相反,在系 統(tǒng)每次注冊一個驅(qū)動的時候,會尋找與之匹配的設備,而匹配由總線完成。Linux 發(fā)明了一種虛擬的總線,稱為 platform 總線,相應的設備稱為 platform_device ,而驅(qū)動稱為 platform_driver 。platform_device 結構體:點擊( 此處)折疊或打開1. struct platform device2. con

2、st char * name ;3. u32 id ;4. struct device dev ;5. u32 num_resources ;6. struct resource * resource7. ;platform_driver 結構體:點擊( 此處)折疊或打開1. struct platform (* probe )( struct platform_device *);3.int(* remove )( struct platform_device*);4.void(* shutdown )( struct platform_device*);5.int(*

3、 suspend )( struct platform_device*, pm_message_t state );6.int(* suspend_late )( struct platform_device*, pm_message_t (* resume_early )( struct platform_device*);8.int(* resume )( struct platform_device*);9.struct device_driver driver;10.;系統(tǒng)中為 platform 總線定義了一個 bus_type 的實例 platform_bus_t

4、ype點擊( 此處)折疊或打開1.struct bus type platform bus type= .. name = "platform" ,. dev_attrs= platform_dev_attrs. match= platform_match. uevent = platform_uevent . suspend = platform_suspend= platform_suspend_late= platform_resume_early= platform_resume ,. suspend_late. resume_early

5、. resume10. ;下面就以 內(nèi)核和 DM9000為例,介紹下 platform 總線、設備與驅(qū)動在 代碼中的實現(xiàn), DM9000驅(qū)動部分,依照嵌入式 Linux 應用開發(fā)完全手冊進 行配置,配置如下:archarmplat-s3c24xxcommon-smdk.c 文件中添加,對應的是 platform_device 這個結構體:點擊( 此處)折疊或打開1. #include <linux / dm9000 . h>2.3. static struct resource s3c_dm9k_resource = 4. 0=5. start= S3C2410_CS4, / AD

6、DR2= 0 , 發(fā)送地址時使用這個地址6.end= S3C2410_CS4 +3,7. flags= IORESOURCE_MEM,8.,9. 1=10. start= S3C2410_CS4+ 4 , / ADDR2 = 1, 發(fā)送數(shù)據(jù)時使用這個地址11.end= S3C2410_CS4 +4 + 3 ,12. flags= IORESOURCE_MEM,13.,14. 2=15. start= IRQ_EINT7 ,/ IRQ_DM900016.end= IRQ_EINT7 , /IRQ_DM900017. flags= IORESOURCE_IRQ,18.19.20.;21.22.st

7、atic struct dm9000_plat_data s3c_dm9k_platdata=23. flags = DM9000_PLATF_16BITONLY , / 數(shù)據(jù)總線寬度為1624.;25.26.static struct platform_device s3c_device_dm9k=27. name = "dm9000" ,28. id= 0 ,29. num_resources = ARRAY_SIZE ( s3c_dm9k_resource ),30. resource = s3c_dm9k_resource ,31. dev = 32. platfo

8、rm_data= &s3c_dm9k_platdata ,33.34.;35.36.37.static struct platform_device _initdata* smdk_devs = 38.39.&s3c_device_dm9k ,40.;那么很顯然有 platform_device 就對應應該有個platform_driver ,其在dm9000.c 文件中:點擊( 此處)折疊或打開1.static struct platform driver dm9000 driver=2. driver = 3.name = "dm9000" ,4. ow

9、ner= THIS_MODULE,5.,6. probe = dm9000_probe ,7. remove = dm9000_drv_remove ,8. suspend = dm9000_drv_suspend ,9. resume = dm9000_drv_resume ,10.;那么具體去加載 platform_device 和 platform_driver 到函數(shù)是什么呢?在內(nèi)核 代碼中可以找到:點擊( 此處)折疊或打開1.static int init dm9000 init( void )2.3.4.return platform_driver_register(& d

10、m9000_driver );/* search boardand register*/5.6.module_init ( dm9000_init );7.8.void _init smdk_machine_init( void )9.10.11.platform_add_devices( smdk_devs , ARRAY_SIZE ( smdk_devs);12.13.有一點需要注明:對 platform_device 的定義通常是在 BSP的板文件中實現(xiàn),在板文件中, platform_device 歸納為一個數(shù)組,最終通過platform_add_devices(struct plat

11、form_device *devs, int num)函數(shù) 統(tǒng)一注冊。接下來就分析下 platform_device_register 和 platform_driver_register 這兩 個函數(shù)的流程:點擊( 此處)折疊或打開( devs i )1.platform device register2. platform_device_add (pdev );.7.h);8.9.h10.11.device_add(& pdev -> dev);bus_add_device( dev )bus_attach_device( dev);device_attach(

12、 dev);bus_for_each_drv/ 將設備加載到總線/ 在總線上查找對應的驅(qū)動( dev-> bus , NULL, dev , _device_attacwhile( drv = next_driver (&i ) && ! error )errordriver_probe_deviceif= fn ( drv , data );/ fn -> _device_attac( drv , dev );(drv -> bus -> match&& ! drv -> bus -> match( dev, drv

13、 )12.goto done13.really_probe( dev, drv );14.drv->probe ( dev );15.16.17.platform_driver_register ( struct platform_driver*drv )18.drv -> driver . bus = &platform_bus_type ;19.driver_register (&drv -> driver )20.bus_add_driver( drv );21.driver_attach ( drv );22.bus_for_each_dev( drv

14、 -> busNULL, drv, _driver_attach);23.while ( dev = next_device(&i ) && ! error )24.error = fn ( dev,data); / fn-> _driver_attach25.driver_probe_device( drv ,dev );26.if ( drv->bus -> match&& !drv -> bus -> match( dev ,drv )27.goto done28.really_probe(dev , drv);

15、29.drv->probe (dev );drv->bus->match 對應的就視 platform_bus_type 實例中的 platform_match 函 數(shù):點擊( 此處)折疊或打開1. static int platform_match( struct device* dev , struct device_driver* drv ) 2. 3. struct platform_device*pdev = container_of( dev, struct platform_device, dev );4.5. return( strncmp ( pdev -&

16、gt; name, drv -> name, BUS_ID_SIZE ) = 0 ); / 也就是說匹配 platform 設備和驅(qū)動是根據(jù)兩者的 name 字段是否相同。6. 當總線匹配到了相應的設備和驅(qū)動,則就會運行 drv->probe(dev);這個對應的就是開發(fā)者自行定義的 probe 函數(shù),在此處就是指 dm9000_driver 實例中 dm9000_probe函數(shù),函數(shù)中會對 dm9000進行相應的探測和初始化操作, 并在最后運行 register_netdev(ndev); 在內(nèi)核中注冊一個網(wǎng)絡設備,這樣,系 統(tǒng)運行后會調(diào)用到 dm9000_open函數(shù)申請相應的

17、中斷和初始化操作, 這樣網(wǎng)絡設 備 dm9000就完成了全部的初始化操作,并可以使用了。platform 總線的引入,方便了設備和驅(qū)動的管理與匹配,并能完成相應設備的 自舉和初始化操作,整個過程清晰明了。resource 這個結構體需要說明下:點擊( 此處)折疊或打開1.struct resource2.resource_size_t start ;3.resource_size_t end;4.const char * name;5.unsigned long flags ;6.struct resource* parent ,* sibling, * child ;7.;resource 結構體主要是表明設備的物理資源是那些, 通過 flags 來區(qū)別是內(nèi)存 地址還是中斷資源, 或是別的。 這些資源

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論