Linux裝置樹詳解

2021-08-15 05:44:07 字數 1991 閱讀 1722

arm linux社群為什麼要引入裝置樹

linux之父linus torvalds閒來無事,在翻看arm linux**的時候,有一天終於忍不住了。他在2023年3月17日的arm linux郵件列表中說道:「this whole arm thing is a f*cking pain in the ass」。這句話迫使arm linux社群引入了裝置樹。

linus torvalds為什麼會發飆呢?而arm linux社群的牛人為什麼又乖乖地聽話了?你得首先理解linux裝置驅動框架中乙個非常好的設計:裝置資訊和驅動分離。

為了什麼說明裝置資訊和驅動分離的概念,先來看乙個簡單的模擬**例項:

【例-1】實現乙個**,把要使用的資訊簡單寫死在**中:

int add() /*模擬驅動***/

優點:簡單

缺點:一旦加數和被加數發生變化就得改**

改進設計如下:

【例-2】實現乙個**,把要使用的資訊和操作**分離開來:

struct dev; /*模擬裝置資訊結構*/

strcut drv; /*模擬驅動結構*/

int add(struct dev *info) /*模擬驅動***/

struct drv drv = ;

/*模擬裝置資訊*/

struct dev dev = ;

/*模擬匯流排初始化匹配裝置資訊和驅動***/

int bus()

...}

優點:不管加數和被加數怎麼變化,不需要修改**,僅需要修改資訊

缺點:結構比較複雜

那這個裝置資訊和驅動分離的設計跟驅動有什麼關係呢?熟悉硬體程式設計的同學都知道,硬體一般的構成可以使用下圖簡單表述:

操作外設的驅動**邏輯,只要硬體是一樣的,就不會變化。但是外設掛到不同的主機上,可能會存在i/o位址的變化,如果有中斷也是一樣的,中斷號也可能不同。這些i/o位址和中斷號就是裝置資訊,使用這些資訊來操作控制硬體的**就是驅動。

如果採用【例-1】的設計方式,那麼同乙個硬體外設接到不同的主機,或是換了位址線/中斷線,裝置資訊就變化了,得去修改驅動。但是採用【例-2】的方式進行設計,問題就迎刃而解:不管同樣的外設硬體接到**或是那個平台,其驅動**邏輯並不需要改動,而僅僅需要改變下裝置資訊,主要的就是i/o位址和中斷號。

說了這麼半天,跟引入裝置樹有什麼關係呢?華清教學使用的開發板(a8/a9)都使用dm9000網絡卡晶元。dm9000驅動是開源的,在主線核心原始碼中就有。我們每次基於a8/a9板子移植的時候,dm9000驅動並沒有修改過,僅僅是選配了下,主要的工作是在板級檔案中新增了裝置資訊。dm9000驅動使用的是platform框架,所以新增了乙份dm9000網絡卡晶元的platform_device資訊。問題來了,如果使用c**的形式來描述裝置資訊,則在核心原始碼中,將會有多份dm9000的platform_device裝置資訊,造成了核心**冗餘。

解決這個問題的辦法就是引入裝置樹,改造【例-2】來說明裝置樹的作用。

【例-3】實現乙個**,不僅把要使用的資訊和操作**分離開來,而且資訊不是c**編寫的,而是文字配置檔案儲存的:

struct dev; /*模擬裝置資訊結構*/

strcut drv; /*模擬驅動結構*/

int add(struct dev *info) /*模擬驅動***/

struct drv drv = ;

/*模擬裝置樹-乙個特殊的配置檔案,***.dtbs的文字檔案*/

/;......

};/*模擬匯流排初始化匹配裝置資訊和驅動***/

int bus()

...}

如果像【例-3】這樣,就可以解決大量裝置資訊的**冗餘問題。

推而廣之,系統的軟硬體資訊都可以使用裝置樹來描述。這樣的話,arm linux社群就不會因為支援板子和驅動越來越多造成核心原始碼中出現很多冗餘**(主要是板級檔案),僅僅需要移植者,把系統的軟硬體資訊通過裝置樹提供出來,選配一下核心**,就可以了。

裝置樹詳解

在linux3.x版本後,arch arm plat 和arch arm mach 中,描述板級細節的 比如platform device i2c board info等 被大量取消,取而代之的是裝置樹,其目錄位於arch arm boot dts 1個dts檔案 n個dtsi檔案,它們編譯而成的d...

裝置樹詳解

在linux3.x版本後,arch arm plat 和arch arm mach 中,描述板級細節的 比如platform device i2c board info等 被大量取消,取而代之的是裝置樹,其目錄位於arch arm boot dts 1個dts檔案 n個dtsi檔案,它們編譯而成的d...

裝置樹詳解

在linux3.x版本後,arch arm plat 和arch arm mach 中,描述板級細節的 比如platform device i2c board info等 被大量取消,取而代之的是裝置樹,其目錄位於arch arm boot dts 1個dts檔案 n個dtsi檔案,它們編譯而成的d...