我在Linux字符設(shè)備驅(qū)動(dòng)框架一文中簡(jiǎn)單介紹了Linux字符設(shè)備編程模型,在那個(gè)模型中,只要應(yīng)用程序open()了相應(yīng)的設(shè)備文件,就可以使用ioctl通過(guò)驅(qū)動(dòng)程序來(lái)控制我們的硬件,這種模型直觀,但是從軟件設(shè)計(jì)的角度看,卻是一種十分糟糕的方式,它有一個(gè)致命的問(wèn)題,就是設(shè)備信息和驅(qū)動(dòng)代碼冗余在一起,一旦硬件信息發(fā)生改變甚至設(shè)備已經(jīng)不在了,就必須要修改驅(qū)動(dòng)源碼,非常的麻煩,為了解決這種驅(qū)動(dòng)代碼和設(shè)備信息耦合的問(wèn)題,Linux提出了platform bus(平臺(tái)總線)的概念,即使用虛擬總線將設(shè)備信息和驅(qū)動(dòng)程序進(jìn)行分離,設(shè)備樹(shù)的提出就是進(jìn)一步深化這種思想,將設(shè)備信息進(jìn)行更好的整理。平臺(tái)總線會(huì)維護(hù)兩條鏈表,分別管理設(shè)備和驅(qū)動(dòng),當(dāng)一個(gè)設(shè)備被注冊(cè)到總線上的時(shí)候,總線會(huì)根據(jù)其名字搜索對(duì)應(yīng)的驅(qū)動(dòng),如果找到就將設(shè)備信息導(dǎo)入驅(qū)動(dòng)程序并執(zhí)行驅(qū)動(dòng);當(dāng)一個(gè)驅(qū)動(dòng)被注冊(cè)到平臺(tái)總線的時(shí)候,總線也會(huì)搜索設(shè)備。總之,平臺(tái)總線負(fù)責(zé)將設(shè)備信息和驅(qū)動(dòng)代碼匹配,這樣就可以做到驅(qū)動(dòng)和設(shè)備信息的分離。
平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

在設(shè)備樹(shù)出現(xiàn)之前,設(shè)備信息只能使用C語(yǔ)言的方式進(jìn)行編寫(xiě),在3.0之后,設(shè)備信息就開(kāi)始同時(shí)支持兩種編寫(xiě)方式——設(shè)備樹(shù)、C語(yǔ)言,如果用設(shè)備樹(shù),手動(dòng)將設(shè)備信息寫(xiě)到設(shè)備樹(shù)中之后,內(nèi)核就可以自動(dòng)從設(shè)備樹(shù)中提取相應(yīng)的設(shè)備信息并將其封裝成相應(yīng)的platform_device對(duì)象,i2c_device對(duì)象并注冊(cè)到相應(yīng)的總線中,如果使用設(shè)備樹(shù),我們就不需要對(duì)設(shè)備信息再進(jìn)行編碼。如果使用C語(yǔ)言,顯然,我們需要將使用內(nèi)核提供的結(jié)構(gòu)將設(shè)備信息進(jìn)行手動(dòng)封裝,這種封裝又分為兩種形式,一種是使用平臺(tái)文件(靜態(tài)),將整個(gè)板子的所有設(shè)備都寫(xiě)在一個(gè)文件中并編譯進(jìn)內(nèi)核。另一種是使用模塊(動(dòng)態(tài)),將我們需要的設(shè)備信息編譯成模塊在insmod進(jìn)內(nèi)核。對(duì)于ARM平臺(tái),使用設(shè)備樹(shù)封裝設(shè)備信息是將來(lái)的趨勢(shì),但是由于歷史原因,當(dāng)下的內(nèi)核中這三種方式并存。封裝好后再創(chuàng)建相應(yīng)的xxx_device實(shí)例最后注冊(cè)到總線中。針對(duì)平臺(tái)總線的設(shè)備信息,我在Linux設(shè)備樹(shù)語(yǔ)法詳解一文中已經(jīng)討論了設(shè)備樹(shù)的寫(xiě)法,所以,本文主要討論4個(gè)問(wèn)題:

  1. 如何使用C語(yǔ)言封裝設(shè)備信息?

  2. 設(shè)備樹(shù)的設(shè)備信息和C語(yǔ)言的設(shè)備信息如何轉(zhuǎn)換?

  3. 如何將C語(yǔ)言設(shè)備信息封裝到platform_device結(jié)構(gòu)中?

  4. 如何將封裝好的platform_device結(jié)構(gòu)注冊(cè)到平臺(tái)總線中?

何為資源?

所謂的設(shè)備信