認識裝置樹(一) 概述

2021-10-09 17:24:05 字數 1854 閱讀 1308

3 認識裝置樹

如何去描述裝置這一定是裝置驅動需要考慮的重要問題。早先,linux中arm架構使用原始檔中的巨集、結構等去描述裝置,不過現在已全面轉向裝置樹。使用文本來描述裝置,肉眼可見的方便。本文就是本人學習裝置樹的筆記,即是對自己學習的知識做個總結和整理,也為方便後來人。

在微控制器程式設計中,通常不存在複雜的驅動框架,所有關於裝置本身以及使用裝置的程式都混雜在一起。比如使用晶元at24c08,通常的做法是建立乙個名為at24c08.c的原始檔以及at24c08.h的標頭檔案,然後在上述兩個c語言檔案中定義晶元使用的管腳、占用的中斷、驅動程式等。

假如另外乙個專案也用到了該晶元,那麼我們直接把相應的標頭檔案、原始檔複製過來就可以了嗎?當然不是,最起碼,晶元使用的引腳可能變化了,因此要修改定義的相應硬體資訊。經過簡單的修改似乎就能使用了,看起來也挺方便的。果真方便麼?有技術大牛說過,複製貼上往往伴隨著壞味道。現在考慮壞在**,通過這種方式管理外設,則當存在很多使用at24c02的專案存在時,那麼就相應存在著多份有細微差別但大部分重複的at24c08.cat24c08.h,如果驅動本身沒問題還好,如果有bug,那麼bug也被複製了,維護起來絕對讓人頭疼,一次維護要囊括多份,使它們僅保持部分硬體資訊的差異。否則,有些bug修復了,有些bug沒有修復,時間一長,天知道哪份是靠譜的。

linux支援眾多的硬體,應用廣泛,肯定不能靠複製來支援不同板子上的同一外設。linux採取的措施是盡可能抽象出共同的部分,僅保留差異的部分,比如外設的引腳占用的不同。不妨把差異(易變)的部分叫裝置資訊,而對同一型晶元的驅動往往是相同的。對比裝置和驅動混雜,這是一種進步:

將易變的裝置資訊和不易變的驅動資訊分離之後,僅維護乙份驅動,而針對多個專案維護多份記錄裝置資訊的原始檔,如此一來,修改驅動後所有專案都可以使用到新的驅動。不過問題還是存在,以原始檔來記錄易變的裝置資訊,每當裝置資訊改變時,原始檔就會改變,也就意味著要重新編譯核心,挺不方便的。能否找到一種不用重新編譯核心的方法呢,即實現乙份核心映象支援多種板子。當然是可以的,這就是裝置樹要做的事情。

修改原始檔肯定要重新編譯,但如果我們根本就不用原始檔來記錄裝置資訊,就不需要重新編譯了。具體的,使用某種特定格式的文字檔案來描述裝置資訊,然後將該文字檔案轉化為乙個按照某種特定格式組織的二進位制檔案(直接解析文字檔案較複雜,不適合核心來做),之後將二進位制檔案傳遞給核心(就像u-boot傳參那樣),由核心根據二進位制檔案的資訊來動態構建並註冊相應的裝置結構。至此,終於擺脫了原始檔。上述文字檔案即為dts檔案,上述二進位制檔案即為dtb檔案:

上文簡單介紹了裝置樹的意義,接下來要做的就是進一步的認識裝置樹,以期能夠熟練的應用它。如何進一步認識裝置樹呢?

首先,我們需要知道裝置樹檔案的格式,即搞清楚在文字檔案中到底怎麼用文字描述裝置,在二進位制檔案中,裝置資訊又是怎麼組織的:認識裝置樹(二)——裝置樹檔案的格式。

再者,要搞清楚裝置樹是如何被傳遞給核心的:認識裝置樹(三)——u-boot對裝置樹的支援。

接下來,核心拿到裝置樹以後會如何處理裝置資訊,這也是我們關心的:認識裝置樹(四)——核心對dtb檔案的解析。

最後,學習是為了應用,有了關於裝置樹的基礎知識後,最該關注的就是裝置樹的實際使用:認識裝置樹(五)——裝置樹使用的一些示例。

型別庫(一) 概述

乙個使用者指南是一本書,一些書的集合就叫做庫了.在ole中,許多元素 物件,介面等等 型別資訊的集合就叫做型別庫 ole的型別資訊服務真正的是乙個建立和操作它包含的型別庫資訊的服務 庫本身只有少量自己的資訊,它主要關心儲存和取出在它內部的元素的型別資訊 所以,在極大程度上,型別庫充當圖書管理員的角色...

ios 開發(一)概述

由於ios本質就是乙個嵌入式的平台,所以相對與一般的pc他就有很多限制 1.只允許有乙個active的程式,當然ios5以後也允許在特定的情況下在後台執行一些東西,但是和一般的應用還是有很大的差距。2.只有乙個視窗而且是佔滿了整個螢幕的視窗。3.不可以無條件的訪問所有的系統裡的內容,為了安全只能訪問...

Java事務 一 概述

一.什麼是事務 所謂事務,就是針對資料庫的一組操作 多條sql 位於同乙個事務的操作具備同步的特點,也就是要麼都成功,要麼都失敗 二.事務的作用 在實際中,我們的很多操作都是需要由多條sql來共同完成的,例如,a賬戶給b賬戶轉賬就會對應兩條sql update account set money m...