下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
linux內(nèi)核學(xué)習(xí)---總線,設(shè)備,驅(qū)動(dòng)Linux設(shè)備模型中三個(gè)很重要的概念就是總線,設(shè)備,驅(qū)動(dòng).即bus,device,driver,而實(shí)際上內(nèi)核中也定義了這么一些數(shù)據(jù)結(jié)構(gòu),他們是structbus_type,structdevice,structdevice_driver,這三個(gè)重要的數(shù)據(jù)結(jié)構(gòu)都來(lái)自一個(gè)地方,include/linux/device.h.我們知道總線有很多種,pci總線,scsi總線,usb總線,所以我們會(huì)看到Linux內(nèi)核代碼中出現(xiàn)pci_bus_type,scsi_bus_type,usb_bus_type,他們都是structbus_type類型的變量.而structbus_type結(jié)構(gòu)中兩個(gè)非常重要的成員就是structksetdrivers和structksetdevices。kset和另一個(gè)叫做kobject正是LinuxKernel2.6中設(shè)備模型的基本元素。這里我們只需要知道,drivers和devices的存在,讓structbus_type與兩個(gè)鏈表聯(lián)系了起來(lái),一個(gè)是devices的鏈表,一個(gè)是drivers的鏈表,也就是說(shuō),知道一條總線所對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),就可以找到這條總線所關(guān)聯(lián)的設(shè)備有哪些,又有哪些支持這類設(shè)備的驅(qū)動(dòng)程序.而要實(shí)現(xiàn)這些,就要求每次出現(xiàn)一個(gè)設(shè)備就要向總線匯報(bào),或者說(shuō)注冊(cè),每次出現(xiàn)一個(gè)驅(qū)動(dòng),也要向總線匯報(bào),或者說(shuō)注冊(cè).比如系統(tǒng)初始化的時(shí)候,會(huì)掃描連接了哪些設(shè)備,并為每一個(gè)設(shè)備建立起一個(gè)structdevice的變量,每一次有一個(gè)驅(qū)動(dòng)程序,就要準(zhǔn)備一個(gè)structdevice_driver結(jié)構(gòu)的變量.把這些變量統(tǒng)統(tǒng)加入相應(yīng)的鏈表,device插入devices鏈表,driver插入drivers鏈表.這樣通過(guò)總線就能找到每一個(gè)設(shè)備,每一個(gè)驅(qū)動(dòng)。structbus_type中為devices和drivers準(zhǔn)備了兩個(gè)鏈表,而代表device的結(jié)構(gòu)體structdevice中又有兩個(gè)成員,structbus_type*bus和structdevice_driver*driver。同樣,代表driver的結(jié)構(gòu)體structdevice_driver同樣有兩個(gè)成員,structbus_type*bus和structlist_headdevices。structdevice和structdevice_driver的定義和structbus_type一樣,在include/linux/device.h中。憑一種男人的直覺,可以知曉,structdevice中的bus記錄的是這個(gè)設(shè)備連在哪條總線上,driver記錄的是這個(gè)設(shè)備用的是哪個(gè)驅(qū)動(dòng),反過(guò)來(lái),structdevice_driver中的bus代表的也是這個(gè)驅(qū)動(dòng)屬于哪條總線,devices記錄的是這個(gè)驅(qū)動(dòng)支持的那些設(shè)備,沒(méi)錯(cuò),是devices(復(fù)數(shù)),而不是device(單數(shù)),因?yàn)橐粋€(gè)驅(qū)動(dòng)程序可以支持一個(gè)或多個(gè)設(shè)備,反過(guò)來(lái)一個(gè)設(shè)備則只會(huì)綁定給一個(gè)驅(qū)動(dòng)程序。上面是理論知識(shí),下面我們具體以展訊平臺(tái)的I2C設(shè)備重力加速度傳感器MC3XXX驅(qū)動(dòng)為例進(jìn)行實(shí)例分析:1.首先在Board-sp7715ga.c文件中通過(guò)sc8810_add_i2c_devices函數(shù)(其實(shí)是i2c_register_board_info函數(shù))將指定的I2C設(shè)備(MC3XXX_ACC_I2C_NAME,MC3XXX_ACC_I2C_ADDR---包括設(shè)備名和設(shè)備地址)申請(qǐng)一個(gè)I2Cstructdevice結(jié)構(gòu),并且掛入I2C總線中的devices鏈表中來(lái)。注意:該device掛入devices鏈表的操作會(huì)先于I2C設(shè)備驅(qū)動(dòng)加載的操作被執(zhí)行。i2c_register_board_info函數(shù)對(duì)此進(jìn)行了特別說(shuō)明:/*SystemsusingtheLinuxI2Cdriverstackcandeclaretablesofboardinfowhiletheyinitialize.Thisshouldbedoneinboard-specificinitcodeneararch_initcall()time,orequivalent,beforeanyI2Cadapterdriverisregistered.Forexample,mainboardinitcodecoulddefineseveraldevices,ascouldtheinitcodeforeachdaughtercardinaboardstack.**TheI2Cdeviceswillbecreatedlater,aftertheadapterfortherelevantbushasbeenregistered.Afterthatmoment,standarddrivermodeltoolsareusedtobind"newstyle"I2Cdriverstothedevices.Thebusnumberforanydevicedeclaredusingthisroutineisnotavailablefordynamicallocation.*/2.具體的驅(qū)動(dòng)程序在Mc3xxx.c文件中。module_init(mc3xxx_i2c_init)被稱為驅(qū)動(dòng)程序的初始化入口(driverinitializationentrypoint)。當(dāng)我們使用insmod這個(gè)命令去安裝的時(shí)候(內(nèi)核配置該模塊為M)或者程序啟動(dòng)運(yùn)行到該模塊的時(shí)候(內(nèi)核配置為Y,該模塊編譯入內(nèi)核),module_init()注冊(cè)的函數(shù)mc3xxx_i2c_init將會(huì)被執(zhí)行。3.mc3xxx_i2c_init函數(shù)調(diào)用了i2c_add_driver(&mc3xxx_driver)命令,開始注冊(cè)其structdevice_driver結(jié)構(gòu),然后它去I2C總線的devices鏈表(注意:該鏈表在步驟1中已被更新入mc3xxx設(shè)備)中去尋找(遍歷),去尋找每一個(gè)還沒(méi)有綁定driver的設(shè)備,即structdevice中的structdevice_driver指針仍為空的設(shè)備,然后它會(huì)去觀察這種設(shè)備的特征(mc3xxx_driver驅(qū)動(dòng)中的id_table表,第4點(diǎn)對(duì)此進(jìn)行專門的說(shuō)明),看是否是他所支持的設(shè)備,如果是,那么調(diào)用一個(gè)叫做device_bind_driver的函數(shù),將設(shè)備與驅(qū)動(dòng)進(jìn)行綁定.換句話說(shuō),把structdevice中的structdevice_driverdriver指向這個(gè)mc3xxx_driver,而structdevice_drivermc3xxx_driver把structdevice加入他的那張structlist_headdevices鏈表中來(lái).就這樣,bus,device,和driver,這三者之間或者說(shuō)他們中的兩兩之間,就給聯(lián)系上了.4.一個(gè)driver可以支持多個(gè)device,一個(gè)linux系統(tǒng)里也有不同的device和driver。那么當(dāng)發(fā)現(xiàn)一個(gè)device的時(shí)候,如何知道哪個(gè)driver才是她的Mr.Right呢?這就是id_table的用處,讓structmc3xxx_driver準(zhǔn)備一張表,里邊注明該driver支持哪些設(shè)備,這總可以了吧.如果你這個(gè)設(shè)備屬于這張表里的,那么ok,綁定吧。實(shí)際上id_table這個(gè)結(jié)構(gòu)體對(duì)每一個(gè)設(shè)備來(lái)說(shuō),就相當(dāng)于是她的身份證,記錄了她的一些基本信息,通常我們的身份證上會(huì)記錄我們的姓名,性別,出生年月,戶口地址等等,而linux各種設(shè)備她也有她需要記錄的信息,以區(qū)分她和別的linux設(shè)備,比如Vendor-廠家,Product-產(chǎn)品,以及其他一些比如產(chǎn)品編號(hào),產(chǎn)品的類別,遵循的協(xié)議等。于是我們知道,一個(gè)I2Cdriver會(huì)把它的這張id表去和每一個(gè)I2C設(shè)備的實(shí)際情況進(jìn)行比較,如果該設(shè)備的實(shí)際情況和這張表里的某一個(gè)id相同,準(zhǔn)確地說(shuō),只有這許多特征都吻合,才能夠把一個(gè)I2Cdevice和這個(gè)I2Cdriver進(jìn)行綁定,這些特征哪怕差一點(diǎn)也不行。附:mc3xxx驅(qū)動(dòng)結(jié)構(gòu)體staticstructi2c_drivermc3xxx_driver={.driver={.name=MC3XXX_DEV_NAME,.owner=THIS_MODULE,},.probe=mc3xxx_i2c_probe,.remove=mc3xxx_i2c_remove,.suspend=mc3xxx_i2c_sus
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 灌渠施工方案
- 2024年專項(xiàng)安全管理制度
- 2024年中國(guó)生物柴油行業(yè)概覽(精簡(jiǎn)版) -頭豹
- 畢業(yè)答辯報(bào)告-心臟疾病研究模板
- 2025年電動(dòng)車銷售與租賃服務(wù)合同范本2篇
- 2025年個(gè)人貨運(yùn)車輛運(yùn)輸合同環(huán)保要求及執(zhí)行標(biāo)準(zhǔn)4篇
- 計(jì)算機(jī)及應(yīng)用課程設(shè)計(jì)
- 談數(shù)學(xué)課程設(shè)計(jì)
- 鉆銑夾具課程設(shè)計(jì)
- 2024年學(xué)校安全的工作匯報(bào)
- DB33T 2570-2023 營(yíng)商環(huán)境無(wú)感監(jiān)測(cè)規(guī)范 指標(biāo)體系
- 上海市2024年中考英語(yǔ)試題及答案
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳海報(bào)
- 垃圾車駕駛員聘用合同
- 2025年道路運(yùn)輸企業(yè)客運(yùn)駕駛員安全教育培訓(xùn)計(jì)劃
- 南京工業(yè)大學(xué)浦江學(xué)院《線性代數(shù)(理工)》2022-2023學(xué)年第一學(xué)期期末試卷
- 2024版機(jī)床維護(hù)保養(yǎng)服務(wù)合同3篇
- 《論拒不執(zhí)行判決、裁定罪“執(zhí)行能力”之認(rèn)定》
- 工程融資分紅合同范例
- 2024國(guó)家安全員資格考試題庫(kù)加解析答案
- 通信工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文匯編(2023版)-定額質(zhì)監(jiān)中心
評(píng)論
0/150
提交評(píng)論