Linux驅(qū)動(dòng)之總線驅(qū)動(dòng)模型_第1頁(yè)
Linux驅(qū)動(dòng)之總線驅(qū)動(dòng)模型_第2頁(yè)
Linux驅(qū)動(dòng)之總線驅(qū)動(dòng)模型_第3頁(yè)
Linux驅(qū)動(dòng)之總線驅(qū)動(dòng)模型_第4頁(yè)
Linux驅(qū)動(dòng)之總線驅(qū)動(dòng)模型_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

為啥要驅(qū)動(dòng)模型隨著系統(tǒng)結(jié)構(gòu)演化越來(lái)越復(fù)雜,Linux內(nèi)核對(duì)設(shè)備描述衍生出一般性的抽象描述,形成一個(gè)分層體系結(jié)構(gòu),從而引入了設(shè)備驅(qū)動(dòng)模型。這樣描述還是不夠讓人理解,來(lái)看一下這些需求就好理解些:Linux內(nèi)核可以在各種體系結(jié)構(gòu)和硬件平臺(tái)上運(yùn)行,因此需要最大限度地提高代碼在平臺(tái)之間的可重用性。?分層實(shí)現(xiàn)也實(shí)現(xiàn)了軟件工程的高內(nèi)聚-低耦合的設(shè)計(jì)思想。低耦合體現(xiàn)在對(duì)外提供統(tǒng)一的抽象訪問(wèn)接口,高內(nèi)聚將相關(guān)度緊密的集中抽象實(shí)現(xiàn)。Linux內(nèi)核驅(qū)動(dòng)程序模型是先前在內(nèi)核中使用的所有不同驅(qū)動(dòng)程序模型的統(tǒng)一。它旨在通過(guò)將一組數(shù)據(jù)和操作整合到全局可訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)中,來(lái)擴(kuò)展基于基礎(chǔ)總線來(lái)橋接設(shè)備驅(qū)動(dòng)程序。傳統(tǒng)的驅(qū)動(dòng)模型為它們所控制的設(shè)備實(shí)現(xiàn)了某種類(lèi)似于樹(shù)的結(jié)構(gòu)(有時(shí)只是一個(gè)列表)。不同類(lèi)型的總線之間沒(méi)有任何一致性。驅(qū)動(dòng)模型抽象了啥當(dāng)前驅(qū)動(dòng)程序模型為描述總線和總線下可能出現(xiàn)的設(shè)備提供了一個(gè)通用的、統(tǒng)一的模型。統(tǒng)一總線模型包括一組所有總線都具有的公共屬性和一組公共回調(diào),如總線探測(cè)期間的設(shè)備發(fā)現(xiàn)、總線關(guān)閉、總線電源管理等。通用的設(shè)備和橋接接口反映了現(xiàn)代計(jì)算機(jī)的目標(biāo):即執(zhí)行無(wú)縫設(shè)備“即插即用”,電源管理和熱插拔的能力。特別是,英特爾和微軟規(guī)定的模型(即ACPI)可確保與x86兼容的系統(tǒng)上幾乎任何總線上的幾乎所有設(shè)備都可以在此范式下工作。當(dāng)然,雖然大多數(shù)總線都支持其中大多數(shù)操作,但并不是每條總線都能夠支持所有此類(lèi)操作。那么哪些通用需求被抽象出來(lái)了呢??電源系統(tǒng)和系統(tǒng)關(guān)機(jī),對(duì)于電源管理與系統(tǒng)關(guān)機(jī)對(duì)于設(shè)備相關(guān)的操作進(jìn)行抽象實(shí)現(xiàn)。關(guān)機(jī)為什么要被抽象出來(lái)管理,比如設(shè)備操作正在進(jìn)行此時(shí)系統(tǒng)收到關(guān)機(jī)指令,那么在設(shè)備模型層就會(huì)遍歷系統(tǒng)設(shè)備硬件,確保系統(tǒng)正確關(guān)機(jī)。?用戶空間訪問(wèn):sysfs虛擬文件系統(tǒng)實(shí)現(xiàn)與設(shè)備模型對(duì)外的訪問(wèn)抽象,這也是為什么說(shuō)Linux設(shè)備也是文件的由來(lái)。實(shí)際從軟件架構(gòu)層面看,這其實(shí)是一個(gè)軟件橋接模塊,抽象出統(tǒng)一用戶訪問(wèn)接口,橋接了設(shè)備驅(qū)動(dòng)。?熱插拔管理:熱插拔管理機(jī)制定義統(tǒng)一的抽象接口操作符kset_hotplug_ops,不同設(shè)備利用操作符實(shí)現(xiàn)差異化。?設(shè)備類(lèi)型:設(shè)備分類(lèi)機(jī)制,從高層級(jí)抽象描述設(shè)備類(lèi)型,具體可以在sysfs下面體現(xiàn)。用戶空間訪問(wèn)由于具有系統(tǒng)中所有設(shè)備的完整分層視圖,因此將完整的分層視圖導(dǎo)出到用戶空間變得相對(duì)容易。這是通過(guò)實(shí)現(xiàn)名為sysfs虛擬文件系統(tǒng)來(lái)完成的。sysfs的自動(dòng)掛載通常是通過(guò)/etc/fstab文件中的以下條目來(lái)完成的:none/syssysfsdefaults00對(duì)于Debian系統(tǒng)而言,可能在/lib/init/fstab采用下面的形式掛載:none/syssysfsnodev,noexec,nosuid00當(dāng)然也可以采用手動(dòng)方式掛載:#mount-tsysfssysfs/sys當(dāng)將設(shè)備插入樹(shù)中時(shí),都會(huì)為其創(chuàng)建一個(gè)目錄。該目錄可以填充在發(fā)現(xiàn)的每個(gè)層(全局層,總線層或設(shè)備層)中。全局層當(dāng)前創(chuàng)建兩個(gè)文件-'name'和’power'。前者報(bào)告設(shè)備名稱(chēng)。后者報(bào)告設(shè)備的當(dāng)前電源狀態(tài)。它還將用于設(shè)置當(dāng)前電源狀態(tài)。總線層為探測(cè)總線時(shí)發(fā)現(xiàn)的設(shè)備創(chuàng)建文件。例如,PCI層當(dāng)前為每個(gè)PCI設(shè)備創(chuàng)建“irq"和“resource"文件。特定于設(shè)備的驅(qū)動(dòng)程序也可以在其目錄中導(dǎo)出文件,以暴露特定于設(shè)備的數(shù)據(jù)或可用接口。驅(qū)動(dòng)模型實(shí)現(xiàn)先來(lái)梳理一下內(nèi)部幾個(gè)主要與驅(qū)動(dòng)模型相關(guān)的數(shù)據(jù)結(jié)構(gòu):./include/linux/Device.h定義設(shè)備驅(qū)動(dòng)主要數(shù)據(jù)結(jié)構(gòu)bus_type:抽象描述總線類(lèi)型,如USB/PCI/I2C/MMC等device_driver:實(shí)現(xiàn)具體連接在總線上的設(shè)備驅(qū)動(dòng)。device:描述連接在總線上的設(shè)備./include/linux/Kobject.h中定義了隱藏在后臺(tái)的類(lèi)似于基類(lèi)的數(shù)據(jù)結(jié)構(gòu):kset:可以認(rèn)為是kobject的頂層容器類(lèi)。每個(gè)kset內(nèi)部都包含了自己的kobject.kobject:在sysfs中出現(xiàn)的每個(gè)對(duì)象都對(duì)應(yīng)一個(gè)kobject,它和內(nèi)核交互來(lái)創(chuàng)建它的可見(jiàn)表述,每一個(gè)kobject對(duì)應(yīng)文件系統(tǒng)/sys里的一個(gè)目錄,目錄的名字就是結(jié)構(gòu)體中的namedcwicoI怕吸rantlw<hiWvcldcwicoI怕吸rantlw<hiWvcl啊承0_亦Mv,mwtjumcrjihiwn:hs???L?*neJ*Yconstcnrvamesag血—怖小".ssrur!rw如0,ewne?:“fwl.Hb????■?:ii1r;【?「"u54■dfrna.mask:????■?:ii1r;【?「"u54■dfrna.mask:Pdmau6<con^enLcmi.miw.b64nsjJMS.mawrdnu」wur:nunsisneilErgijnwj)fn_of5etsirucinsi.hfiMdma.paoteromgipaQi&Cfdma)3i9i*r林初46卩9_0化C€CU^E_J>MERE町戸.?;.:ifi?tn/j?i;.<,,?<Blfuctbni^cotieten^rnmPrw.moE?We?CWirXi.O^.CMABiruclcm*xnu.orsa.rDH*r;?unG<i.-rondfsvud<w^rthamaimui.struct^ncejiodo*cf.nadc;r?訊『山厲料f??*iBlrutthwcdeJWKJto叫BD%戶li!*1門(mén),H.Q*1尸刖乃F■琴叫E£/K力EV1g8OM"y(XXL2tn?nj^nP?4?M?eROC^.W?,-Jj-2忑coraiiatiud叫心Hxa」d*述nMtchJabte.€Qn>isuuctaqiLdME」ap【pLmm<n」aM?^r^ooeiinmi^<e?o曲;qSS7?hfSli£]?frtHfifnoielHtrurtdwue'd^ei?Lx6JJLU<rJwarjnu>w*n>(4truaa餉c*?"氓iuruiKwaCcaruciaaikc-a??.曲』皿押」s.w<?4Wconr^a^mJ>ou9Aoroup8.zond'stjuctatnhuie^prou;.^如-嚴(yán)叩.]BtnxtCMS.tfpo?g,;「.dV?"XF?vun??icejuiMi^rr?■十■妙ivr己紳.0?:為-i■2?p?fcrnn.gm廠m:匕化vmPrMLg廠?cMMKaevKJEaWgeLGgd■?臨10沱5”0尸艮旳巳LZFHGsirunniu?xmuiMr先吊枝出閘號(hào)口fttsorr^inJiiHnir?r/airh?svuct<tev?pmjniDpowrsvuu供v」frukrT4ie*n-d?m?ncond^liud*pm;駆刼胭性vadrcortijunr)Corveldeme?阿5ructMQ_(ro(nainfihjjoiti■他fMef<>OMfi!G_PrK;IRLconstcnar<ian)e?crv<1r*vMMe*ownet.consiitnjctalrftjule.g!oup?wafCOOirjGW陽(yáng)皿*』"們?,?R弄&?T取加‘憑nmr?wafCOOirjGW陽(yáng)皿*』"們?,?R弄&?T取加‘憑nmrLab].H紗UEIRJ費(fèi)dv/ee^er.■huiumlutUji啊?emi.charrtuutdnu?Pev,unnQdcjTiifldoi;樺dftlWLFlwrtl"⑷W鈿wo「aeojdwXstiKlcz"?卻Hrj.hdMVywnj)re}!?VuetJ^iw?啊corsisbuctLoi'i_ns.tipjoDeut?mF&.3?卩嘰constg*d?^natrjesp^ce'JbVurideMce?deo.wt4CgrLcwnrtnhpwnrvdW"?■^r.fcuKLCM^.?g?J90mnarfMaf3U化GGNERO:.MSURO?TDMAM內(nèi)核對(duì)釦-<ss>wrm?_grom,Qmmyj內(nèi)核對(duì)釦-<ss>wrm?_grom,Qmmyjiqvp.EVuct.cfrrmi_ftiM|j?c*lDmrriu_l?PK;structicrrmu^pMhn?lcinwiwjsarjmIOMMUeomtxtiarname;BWlK”?l/WZ0y.戲wdinbi祈林slwUseHcBetsbucl.ab^p^Mrpr.stiucti?mrs,noclr*s<3;rs/indrtttofisntrvUMi吹“燉E乂MW<Cai『Q_OE9U0-旳6疋兀RELEASEBhuttB2vedjAvnrckiM^:fcntffun£g>3imsia)=jnnaicQd1TOC\o"1-5"\h\zuns>yv€-5irrtstate1;unaiywint刨附j(luò)Wd.u削剌19朝11unsijrH-5irrtHRa.nwnon^.aavcn^.Nrt1uns?j-*dimuFiencauop^ss1:”h.R-RuM《人2刃Stsru脫kl廠(hKlsQ■丿]設(shè)備IDBpriooj孫「汨」o(k(|冋“」刪£1.設(shè)rouii°審9<.戶aptwoio<oufacaifcooiortinw^d^ablfd*?toolonine?i.too>oLr?&d?af?u**di.ftticln?d(GQ^FIG>R<;H.W5_SYfKJ3f*V:GR_D6VlCg?11?u&ffldiea-FiO-APCH.kAS.svNe.oww-FOR.cPui屮U?1nSa〔CGfFg_AfKK.fSYHCJ^_ER-CFU/MItooldma.e^MrHei:“noripinl?K_tnst.Me*:structkob|ectKot?jcon?fituctmjcrt^ua^fiL^pt"e呱鄧wasl4hai?dei^nsme.Studd吹d*5?4'JMtHriMdn^Ue_tfiOul-"—."叩tatWIWLXHJ?rtvCA_fllOU(lf、」KJUD9:unstjugjtrgQjggp-如匚強(qiáng)匕車(chē)BlrudBiitir/sjfn^e*p.?*iKt哄xq"”i^ckjsyt?ooi"GljwnijOKk總線盹總線上根設(shè)備Wiwmaich^X?*?ucidokeaefc<.sinxld?nic?.dN??r■而it!?!]?-??TOB*ru:l?XKe*d**.Rixlk(xiLjM5nur*'?".円ft?忖ITHMJSIds比&曲tnfrarra^Kurucldc?)raPW.riliuH-urOKtfuttde\ie??dw|.rtroniin^xwrfnawMce丄ai"血1阿"皿伽“g)抽眾SL逢琛作trfirsusp&ntOistiucldwWd^rpin^matsaga.tstahlrefra5utnc>;rrozta?Mca■*?r?rmim_<iisuu(\iwmw*ow).reiMma^rarrtpTM畑ad**dndbus_typebus_type用以驅(qū)動(dòng)總線,具體的驅(qū)動(dòng)USB/I2C/PCI/MMC等:注冊(cè)總線,利用bus_register注冊(cè)總線,bus_unregister刪除總線。如下例子,每種總線須定義一個(gè)bus_type對(duì)象,并利用bus_register注冊(cè)總線,或bus_unregister刪除總線。/*i2c-core-base.c*/structbus_typei2c_bus_type={.name="i2c",.match=i2c_device_match,.probe=i2c_device_probe,.remove=i2c_device_remove,.shutdown=i2c_device_shutdown,};EXPORT_SYMBOL_GPL(i2c_bus_type);staticint__initi2c_init(void){intretval;retval=of_alias_get_highest_id("i2c");down_write(&__i2c_board_lock);if(retval>=__i2c_first_dynamic_bus_num)__i2c_first_dynamic_bus_num=retval+1;up_write(&__i2c_board_lock);/*注冊(cè)I2C總線*/retval=bus_register(&i2c_bus_type);訐(retval)returnretval;is_registered=true;#ifdefCONFIG_I2C_COMPATi2c_adapter_compat_class=class_compat_register("i2c-adapter");if(!i2c_adapter_compat_class){retval=-ENOMEM;gotobus_err;}#endifretval=i2c_add_driver(&dummy_driver);訐(retval)gotoclass_err;訐(IS_ENABLED(CONFIG_OF_DYNAMIC))WARN_ON(of_reconfig_notifier_register(&i2c_of_notifier));訐(IS_ENABLED(CONFIG_ACPI))WARN_ON(acpi_reconfig_notifier_register(&i2c_acpi_notifieR));return0;class_err:#ifdefCONFIG_I2C_COMPATclass_compat_unregister(i2c_adapter_compat_class);bus_err:#endifis_registered=false;/*錯(cuò)誤時(shí)刪除總線*/bus_unregister(&i2c_bus_type);returnretval;}?注冊(cè)適配器驅(qū)動(dòng)程序(USB控制器,I2C適配器等),以檢測(cè)連接的設(shè)備,并提供與設(shè)備的通信機(jī)制?圖中的match函數(shù)接口用于將驅(qū)動(dòng)程序與設(shè)備進(jìn)行匹配。match回調(diào)的目的是使總線有機(jī)會(huì)通過(guò)比較驅(qū)動(dòng)程序支持的設(shè)備ID與特定設(shè)備的設(shè)備ID來(lái)確定特定驅(qū)動(dòng)程序是否支持特定設(shè)備,而不會(huì)犧牲特定于總線的功能或類(lèi)型安全性。當(dāng)向總線注冊(cè)驅(qū)動(dòng)程序時(shí),將遍歷總線的設(shè)備列表,并為每個(gè)沒(méi)有與之關(guān)聯(lián)的驅(qū)動(dòng)程序的設(shè)備調(diào)用match回調(diào)。?提供API函數(shù)以實(shí)現(xiàn)適配器驅(qū)動(dòng)以及設(shè)備驅(qū)動(dòng)。?同時(shí)dev_pm_ops*pm實(shí)現(xiàn)對(duì)于總線的功耗管理接口抽象。對(duì)于特定總線實(shí)現(xiàn)這個(gè)操作符對(duì)應(yīng)的函數(shù)。structdev_pm_ops{int(*prepare)(structdevice*dev);void(*complete)(structdevice*dev);int(*suspend)(structdevice*dev);int(*resume)(structdevice*dev);int(*freeze)(structdevice*dev);int(*thaw)(structdevice*dev);int(*poweroff)(structdevice*dev);int(*restore)(structdevice*dev);int(*suspend_late)(structdevice*dev);int(*resume_early)(structdevice*dev);int(*freeze_late)(structdevice*dev);int(*thaw_early)(structdevice*dev);int(*poweroff_late)(structdevice*dev);int(*restore_early)(structdevice*dev);int(*suspend_noirq)(structdevice*dev);int(*resume_noirq)(structdevice*dev);int(*freeze_noirq)(structdevice*dev);int(總線屬性:bus_groups/總線屬性:bus_groups/設(shè)備屬性dev_groups/驅(qū)動(dòng)屬性drv_(*restore_noirq)(structdevice*dev);int(*runtime_suspend)(structdevice*dev);int(*runtime_resume)(structdevice*dev);int(*runtime_idle)(structdevice*dev);};?iommu_ops操作符提供總線相關(guān)的IOMMU抽象。?設(shè)備驅(qū)動(dòng)注冊(cè)到總線上時(shí),將在sysfs管理總線/設(shè)備/設(shè)備驅(qū)動(dòng)的層次關(guān)系,以PCI為例:/*在總線上注冊(cè)的驅(qū)動(dòng)程序會(huì)在總線的驅(qū)動(dòng)程序目錄中獲得一個(gè)目錄*//sys/bus/pci/I--devicesdriversI--IntelICHI--IntelICHJoystickI--agpgart'--elOO/*在該類(lèi)型的總線上發(fā)現(xiàn)的每個(gè)設(shè)備都會(huì)在總線的設(shè)備目錄中獲得到物理層次結(jié)構(gòu)中該設(shè)備目錄的符號(hào)鏈接*//sys/bus/pci/I--devicesII--00:00.0->../../../root/pci0/00:00.0II--00:01.0->../../../root/pci0/00:01.0I'--00:02.0->../../../root/pci0/00:02.0--driversbln_3ltribuEa?3trUGt?definedInncludW1Inux^yafs.hslrjctaunbuteanr,sizejsze:(_?^oid^pcivate

ssize^t(*readi(slnjelfile*■,strucrkobjectt

siiucthin_aittribuie*.char\垃£_|);ssize_1structfile\gfrucskobjeci!",sttucttun^attribuie*上h時(shí)s^ejj;a1tribLirt?_graijp?islruGl?difln^dIn.Ancluda/Hnux/sysfs.hcons:char"naTie.urTode_lt*is_Msbfea1tribLirt?_graijp?islruGl?difln^dIn.Ancluda/Hnux/sysfs.hcons:char"naTie.urTode_lt*is_Msbfe)(sfructkobjerth.structattn-bLJle\inti:urrodejii£_bin__visibl£)(structkob?clstructbin_attribute*ai;n|jsirjctannts(j[e"AatEr5strjcttinattrlbLteBBtinailrs.atEribiitB?strLtcl?dafinodin>./ineludo/lanucqn5uchar^naTts;.urTodc_imodc;wilderGON^IG^DEBUG^LOCK^ALLOCbosfcgnor^崗即gtrjcttack__class_k&'ii*k^structtock_class_kevsk?y;constchar'namecon^tch@ir'd^nanre.sfrud:d€vfci@令因_「<xrt;cnnfitsfrudiatfri!tul&_gr&u{3i^bdej^roups:1coTkStsiruttamtuld^gr^upi'"dav^groupt,—匚口rrstwtn^tattitute^grwji?^drvjgrotsps,sirudsubsysjmaee口strud:lock_c.las!s_k^ylock-keyz

boolneed_parenl_bck;rrtrmatctijistnjctdevice*dav.structdevi£€!_driver*ch<i;■nt4*ue?nrtKEtrucldevice'rav.Eiruclk-DbLuevEnnt^BflvaBnV|£nt{*probe)(structdewce"devj,rttfremoveiisiinjctcfe^ce*de/i.沁td■"shuidc^n)|slnL0:tdevice*d&v).ntl*antineMs-trLirtdexicsfcdevj;nt{*offin&)istuctdevice*dev|;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論