我在Linux字符設(shè)備驅(qū)動框架一文中簡單介紹了Linux字符設(shè)備編程模型,在那個(gè)模型中,只要應(yīng)用程序open()了相應(yīng)的設(shè)備文件,就可以使用ioctl通過驅(qū)動程序來控制我們的硬件,這種模型直觀,但是從軟件設(shè)計(jì)的角度看,卻是一種十分糟糕的方式,它有一個(gè)致命的問題,就是設(shè)備信息和驅(qū)動代碼冗余在一起,一旦硬件信息發(fā)生改變甚至設(shè)備已經(jīng)不在了,就必須要修改驅(qū)動源碼,非常的麻煩,為了解決這種驅(qū)動代碼和設(shè)備信息耦合的問題,Linux提出了platform bus(平臺總線)的概念,即使用虛擬總線將設(shè)備信息和驅(qū)動程序進(jìn)行分離,設(shè)備樹的提出就是進(jìn)一步深化這種思想,將設(shè)備信息進(jìn)行更好的整理。平臺總線會維護(hù)兩條鏈表,分別管理設(shè)備和驅(qū)動,當(dāng)一個(gè)設(shè)備被注冊到總線上的時(shí)候,總線會根據(jù)其名字搜索對應(yīng)的驅(qū)動,如果找到就將設(shè)備信息導(dǎo)入驅(qū)動程序并執(zhí)行驅(qū)動;當(dāng)一個(gè)驅(qū)動被注冊到平臺總線的時(shí)候,總線也會搜索設(shè)備。總之,平臺總線負(fù)責(zé)將設(shè)備信息和驅(qū)動代碼匹配,這樣就可以做到驅(qū)動和設(shè)備信息的分離。
在設(shè)備樹出現(xiàn)之前,設(shè)備信息只能使用C語言的方式進(jìn)行編寫,在3.0之后,設(shè)備信息就開始同時(shí)支持兩種編寫方式——設(shè)備樹、C語言,如果用設(shè)備樹,手動將設(shè)備信息寫到設(shè)備樹中之后,內(nèi)核就可以自動從設(shè)備樹中提取相應(yīng)的設(shè)備信息并將其封裝成相應(yīng)的platform_device對象,i2c_device對象并注冊到相應(yīng)的總線中,如果使用設(shè)備樹,我們就不需要對設(shè)備信息再進(jìn)行編碼。如果使用C語言,顯然,我們需要將使用內(nèi)核提供的結(jié)構(gòu)將設(shè)備信息進(jìn)行手動封裝,這種封裝又分為兩種形式,一種是使用平臺文件(靜態(tài)),將整個(gè)板子的所有設(shè)備都寫在一個(gè)文件中并編譯進(jìn)內(nèi)核。另一種是使用模塊(動態(tài)),將我們需要的設(shè)備信息編譯成模塊在insmod進(jìn)內(nèi)核。對于ARM平臺,使用設(shè)備樹封裝設(shè)備信息是將來的趨勢,但是由于歷史原因,當(dāng)下的內(nèi)核中這三種方式并存。封裝好后再創(chuàng)建相應(yīng)的xxx_device實(shí)例最后注冊到總線中。針對平臺總線的設(shè)備信息,我在Linux設(shè)備樹語法詳解一文中已經(jīng)討論了設(shè)備樹的寫法,所以,本文主要討論4個(gè)問題:
如何使用C語言封裝設(shè)備信息?
設(shè)備樹的設(shè)備信息和C語言的設(shè)備信息如何轉(zhuǎn)換?
如何將C語言設(shè)備信息封裝到platform_device結(jié)構(gòu)中?
如何將封裝好的platform_device結(jié)構(gòu)注冊到平臺總線中?
何為資源?
所謂的設(shè)備信