1. 程式人生 > >Linux裝置樹的用法

Linux裝置樹的用法

本文通過為一個新machine寫一個裝置樹來介紹裝置樹相關的概念,以及如何來描述一個machine。 關於裝置樹的技術細節描述,需要參考ePAPR文件,ePAPR文件中包含了大量的基礎語法之外的細節,如果你需要了解更多本文之外的裝置樹細節,請參考ePAPR文件。 基本資料格式 裝置樹是一個由節點及屬性組成的簡單樹結構。屬性是基於key-value對的,節點則可以包含子節點以及屬性。 如,下面這個樹就是一個典型結構:
/ {     node1 {         a-string-property = "A string";         a-string-list-property = "first string", "second string";         a-byte-data-property = [0x01 0x23 0x34 0x56];         child-node1 {             first-child-property;             second-child-property = <1>;             a-string-property = "Hello, world";         };         child-node2 {         };     };     node2 {         an-empty-property;         a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */         child-node1 {         };     }; };
這顆樹顯然沒什麼實際用途,因為它沒有描述任何有意義的內容,但是,我們通過它可以瞭解什麼是屬性,什麼是節點。這顆樹可以解讀如下:
  • 一個根節點: "/"
  • 兩個子節點: "node1" 和 "node2"
  • node1下面又有兩個子節點:"child-node1" 和 "child-node2"
  • 一堆的屬性分散與整顆樹的各個節點上
譯者注:可以這麼簡單理解:節點就是樹枝,屬性就是樹葉;樹枝上可以有再長樹枝也可以長樹葉,而樹葉上則不會再長樹枝。 屬性是基於key-value結構的,value可以為空或者特定格式的字串內容。由於資料型別並不被編碼到最終的資料結構中,裝置樹原始碼中僅能支援有限的幾種基本資料型別。
  • text string
    (以null結束),以雙引號括起來,如:
    • string-property = "a string"
  • cells 是32位無符號整形數,以尖括號括起來,如
    • cell-property = <0xbeef 123 0xabcd1234>
  • binary data 以方括號括起來,如:
    • binary-property = [0x01 0x23 0x45 0x67];
  • 不同型別資料可以在同一個屬性中存在,以逗號分格,如:
    • mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
  • 多個字串組成的列表也使用逗號分格,如:
    • string-list = "red fish","blue fish";
基本概念 為了搞清楚裝置樹該如何使用,我們將一步一步的為一個Sample Machine建立一顆裝置樹。 Sample Machine 姑且想象有這麼一臺機器,它由"Acme"出產,名為"Coyote's Revenge", 配置如下:
  • 32bit ARM CPU
  • 處理器的本地記憶體匯流排連線如下裝置:串列埠,SPI匯流排控制器,I2C控制器,終端控制器以及外部匯流排橋
  • 256MB SDRAM 位於地址:0x0
  • 兩個串列埠,位於地址:0x101F1000 及 0x101F2000
  • GPIO控制器位於地址:0x101F3000
  • SPI控制器位於地址:0x10170000,在它下面連線瞭如下裝置:
    • MMC卡槽,其SS腳連線了GPIO1
  • 外部匯流排橋上接瞭如下裝置:
    • SMC91111 乙太網控制器,位於地址:0x10100000
    • I2C控制器,位於地址:0x10160000,在它下面連線瞭如下裝置:
      • Maxim DS1338實時時鐘,I2C地址為0x58
    • 64MB NOR flash 位於地址:0x30000000
初始結構 第一步是要建立一個基本結構來使得這顆裝置樹能描述對應的Machine
/ {     compatible = "acme,coyotes-revenge"; };
compatible這個屬性用於執行系統名,通常它是以 "廠商,型號" 這樣的字串形式存在。它能準確的描述對應的裝置的特徵。 CPU描述 下一部就是描述每一個CPU了。在cpus節點中,每個CPU就是一個子節點。這種情況在多核的ARM Cortex A9系統中很常見。
/ {     compatible = "acme,coyotes-revenge";     cpus {         [email protected] {             compatible = "arm,cortex-a9";         };         [email protected] {             compatible = "arm,cortex-a9";         };     }; };
每個cpu的子節點中有個compatible屬性,它描述了CPU的具體型號,形式通常也是 "廠商,型號"  當然,CPU的細節不是這麼一個compatible屬效能描述清楚的,後面我們會再逐步加入。 節點名 有必要為節點的命名講幾句。每個節點的名字都應該是這樣的形式: <name>[@<unit-address>] 尖括號是必須的,方括號是可選的。 <name> 是一個ASCII字串,長度不超過31個字元。通常,節點名都是與裝置的型別有關聯的。比如,3com的乙太網卡,通常節點名就叫 ethernet 而不叫 3com509 <unit-address>被作為節點名的一部分時,用來描述裝置的地址。通常,unit-address就是裝置的暫存器地址,這個地址是被列舉在節點的reg屬性中的。在後文中我們會介紹reg屬性的內容。 同級別的兄弟節點的節點名必須唯一(不可重名),但如果name一致而address不一致則是正常情況(比如,[email protected][email protected])。 關於節點的命名規則細節,請參考ePAPR文件的2.2.1節。 裝置 系統中的每個裝置都對應著裝置樹中的一個節點。好了,下一步我們就是為每個裝置都加上對應的節點。 目前,我們僅為每個裝置增加一個空節點,待後面介紹了中斷號及地址範圍的概念後再行補充。
/ {     compatible = "acme,coyotes-revenge";     cpus {         [email protected] {             compatible = "arm,cortex-a9";         };         [email protected] {             compatible = "arm,cortex-a9";         };     };     [email protected] {         compatible = "arm,pl011";     };     [email protected] {         compatible = "arm,pl011";     };     [email protected] {         compatible = "arm,pl061";     };     [email protected] {         compatible = "arm,pl190";     };     [email protected] {         compatible = "arm,pl022";     };     external-bus {         [email protected],0 {             compatible = "smc,smc91c111";         };         [email protected],0 {             compatible = "acme,a1234-i2c-bus";             [email protected] {                 compatible = "maxim,ds1338";             };         };         [email protected],0 {             compatible = "samsung,k8f1315ebm", "cfi-flash";         };     }; };
上面這棵樹中,系統中的每個裝置都被添加了一個節點,而且節點的結構真實反應了裝置是如何掛載在系統上的。比如,ethernet,i2c等節點是external-bus的子節點,rtc裝置是i2c匯流排下的子節點。通常,裝置樹的結構都是以CPU的視角來反應出來的。 上面這棵樹還有幾點不足,它缺少了裝置的關鍵資訊。這些資訊將在後文中逐步新增上去。 關於上面這顆樹,我們還需要注意:
  • 每個裝置節點都都一個compatible屬性
  • flash這個節點的compatible屬性有兩個字串,下面一節將介紹為什麼這麼寫。
  • 在前文中曾提到:節點名反應的是裝置型別而非裝置型號。請參考ePAPR的2.2.2節中列出的常用節點名。
理解compatible屬性 每個裝置節點都需要一個compatible屬性。compatible屬性是系統賴以查詢對應的裝置驅動程式的一個關鍵值,系統就是根據它的值來查詢這個裝置應該使用哪一個驅動的。 compatible屬性的值是一個字串表。第一個字串以"廠商,型號"的形式描述了準確的裝置資訊。後面一個字串則表示與它相容的其他裝置。 比如,Freescale MPC8349有一個串列埠裝置是由National Semiconductor ns16550暫存器介面來實現的。所以對MPC8349的串列埠裝置,它的compatible屬性我們就可以這樣寫:compatible = "fsl,mpc8349-uart", "ns16550",對於這樣的情況,fsl,mpc8349-uart準確描述了這個裝置,而ns16550則說明了這個裝置是與National Semiconductor ns16550暫存器介面相容的。 注:ns16550它沒有廠商名這個資訊,這是由於歷史原因。但所有新建立的compatible屬性都應該有廠商名這個字首。 compatible屬性的這一特性,使得我們可以讓新裝置使用系統中已有的舊驅動。 警告:不要在compatible屬性中使用萬用字元,如 "fsl,mpc83xx-uart" 或類似的。因為半導體廠商會不定期的更新他們的設計這會破壞你的萬用字元規則。選擇具有更好相容性的方案才是正途。 地址是怎麼工作的 可定址裝置是通過使用以下屬性來將地址資訊編碼到裝置樹中的:
  • reg
  • #address-cells
  • #size-cells
可定址裝置通過reg屬性來獲取暫存器相關的地址資訊列表,reg屬性的形式如下: reg = <address1 length1 [address2 length2] [address3 length3] ... > 每一組address length對應了裝置所使用的一個地址區域。 address是一個list,其中包含一個或多個32位整數,我們把它叫做 cells。同理,length也是一個list,可以是多個cell或為空。 由於address和length的長度都是不固定的,所以有了#address-cells#size-cells這兩個屬性。這兩個屬性被放到父節點中用於描述每個區域有幾個cell。簡單的說,就是reg屬性需要配合父節點的#address-cells#size-cells來配合使用。為了弄明白它們是怎麼工作的,下面我們就來為這個裝置加上地址相關的屬性,先從CPU開始。 CPU地址 CPU節點的地址用法是最簡單的。每個CPU被分配了唯一的ID號,而且這個沒有size。
    cpus {         #address-cells = <1>;         #size-cells = <0>;         [email protected] {             compatible = "arm,cortex-a9";             reg = <0>;         };         [email protected] {             compatible = "arm,cortex-a9";             reg = <1>;         };     };
在上面的cpus節點中,#address-cells被設為了1,#size-cells則被設為了0,這就表示它的子節點中的reg屬性是一個32位整數的address,而且沒有size部分。 在上面的例子中,你可能注意到了節點名中的暫存器地址與reg數值一樣。 約定俗成的做法是,如果一個節點有reg屬性,則節點名中也需要包含unit-address這個部分,而unit-address的數值則是reg屬性的第一個address值。 記憶體對映裝置 與cpu節點中的這種單地址不同,記憶體對映裝置所分配的是一個地址範圍,而這個地址範圍則是由#size-cells和節點中的reg屬性的size區域來決定的。下面這個例子中,每個address是1個cell(32bit),且每個長度值也是一個cell。在32位系統中#size-cells通常就是這樣設定為1的。而早64位系統中,#address-cells#size-cells則通常設定為2。
/ {     #address-cells = <1>;     #size-cells = <1>;     ...     [email protected] {         compatible = "arm,pl011";         reg = <0x101f0000 0x1000 >;     };     [email protected] {         compatible = "arm,pl011";         reg = <0x101f2000 0x1000 >;     };     [email protected] {         compatible = "arm,pl061";         reg = <0x101f3000 0x1000                0x101f4000 0x0010>;     };     [email protected] {         compatible = "arm,pl190";         reg = <0x10140000 0x1000 >;     };     [email protected] {         compatible = "arm,pl022";         reg = <0x10115000 0x1000 >;     };     ... };
每個裝置被分配了一個基地址以及一個size。上面的例子中,gpio裝置被分配了兩個地址段: 0x101f3000~0x1013fff 以及 0x101f4000~0x101f4fff。 有些裝置在系統總線上的地址不連續。比如,一個裝置可能通過不連續的片選線連線在外部總線上。 通過在父節點設定合適的#address-cells和#size-cells,地址對映機制可以準確的描述記憶體對映關係。下面的程式碼中展示了一個不同片選資訊在是如何使用的。
    external-bus {         #address-cells = <2>         #size-cells = <1>;         [email protected],0 {             compatible = "smc,smc91c111";             reg = <0 0 0x1000>;         };         [email protected],0 {             compatible = "acme,a1234-i2c-bus";             reg = <1 0 0x1000>;             [email protected] {                 compatible = "maxim,ds1338";             };         };         [email protected],0 {             compatible = "samsung,k8f1315ebm", "cfi-flash";             reg = <2 0 0x4000000>;         };     };
上面的例子中,external-bus使用了兩個cell來描述address;一個表示片選號,另一個表示與片選基地址間的偏移量。length區域則用了一個cell來描述。在這個例子中,每個reg節點包含3個cell,分別是:片選號,偏移量,長度 非記憶體對映裝置 還有一些裝置在總線上並不是不是記憶體對映型的。他們可以有地址空間,但他們沒有通過CPU直接訪問地址空間的能力。取而代之的是他們的父裝置驅動擁有間接訪問記憶體空間的能力。 以I2C裝置(不是I2C匯流排哦)為例子,每個裝置被分配了一個地址,沒有length這個欄位。看起來實際上與cpu的地址分配很相似。
        [email protected],0 {             compatible = "acme,a1234-i2c-bus";             #address-cells = <1>;             #size-cells = <0>;             reg = <1 0 0x1000>;             [email protected] {                 compatible = "maxim,ds1338";                 reg = <58>;             };         };
Ranges(地址變換) 上文已經討論過了我們如何分配地址給裝置,但是這個所謂的地址僅僅是在裝置節點中的本地地址。它無法描述該如何將這些本地的地址對映到CPU能訪問的地址空間中。 根節點中一定有描述CPU的地址空間。子節點所用的地址空間就來自與CPU的地址空間,所以不需要進行額外的地址對映。 如:[email protected] 就是直接分配的地址0x101f0000。 如果一個節點它不是跟節點下的子節點,那麼它就不能用CPU的地址空間。為了能將一個地址空間的地址對映到另一個地址空間,range屬性被創造出來了。 下面是在一個簡單的裝置樹中增加range屬性。
/ {     compatible = "acme,coyotes-revenge";     #address-cells = <1>;     #size-cells = <1>;     ...     external-bus {         #address-cells = <2>         #size-cells = <1>;         ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet                   1 0  0x10160000   0x10000     // Chipselect 2, i2c controller                   2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash         [email protected],0 {             compatible = "smc,smc91c111";             reg = <0 0 0x1000>;         };         [email protected],0 {             compatible = "acme,a1234-i2c-bus";             #address-cells = <1>;             #size-cells = <0>;             reg = <1 0 0x1000>;             [email protected] {                 compatible = "maxim,ds1338";                 reg = <58>;             };         };         [email protected],0 {             compatible = "samsung,k8f1315ebm", "cfi-flash";             reg = <2 0 0x4000000>;         };     }; };
上面的例子中,ranges屬性就定義了一個地址轉換規格。在這個表中的每個節點表示一個地址轉換關係。 ranges屬性中每個欄位的大小取決於當前節點的#address-cells,父節點的#address-cells以及當前節點的#size-cells。 比如上面的例子中,external-bus節點的地址長度是2,它的父節點的地址長度是1,size長度是1。所以ranges中的三個地址規則可以這樣解讀:
  • CS0,偏移量為0的本地地址被對映到父節點地址空間的 0x10100000~0x1010ffff
  • CS1,偏移量為1的本地地址被對映到父節點地址空間的 0x10160000~0x1016ffff
  • CS2,偏移量為0的本地地址被對映到父節點地址空間的 0x30000000~0x31000000
更方便的是,如果父節點與子節點的地址空間完全匹配,則子節點可以只定義一個空的ranges屬性。 空ranges屬性所表示的意思就是子節點的地址空間與父節點地址空間是1:1的對映關係。 你可能會問:為什麼上面會寫1:1的對映關係?有些匯流排結構(如PCI匯流排)擁有自己獨立的地址空間,但需要向作業系統開放。還有些裝置有DMA引擎,這就需要知道總線上的實際地址。還有些時候幾個裝置因為使用同樣的實體地址空間而需要組合在一起。在硬體設計以及作業系統的大量特性上決定了地址對映是不是1:1的對映關係。 也可能還注意到了上文中的[email protected],0節點中沒有ranges屬性。原因是I2C匯流排不像外部匯流排,它的地址空間並沒有對映到CPU的地址空間中去。實際上,CPU對[email protected]的訪問是通過[email protected],0這個裝置來間接達成的。沒有ranges屬性正表明了這個裝置是不能直接訪問除父節點外的任何裝置的特性。 中斷是怎樣工作的 不想地址空間對映表那樣是遵循裝置樹的自然結構的(父傳子),中斷訊號可以被machine中的任何裝置產生或終止。終端訊號獨立與裝置樹將各個節點關聯起來。描述一箇中斷需要4個屬性:
  • interrupt-controller 這個屬性沒有值,他表示這個節點是一個接收中斷訊號的裝置
  • #interrupt-cells 這個屬性是一個interrupt-controller節點的屬性,他說明了這個 interrupt-controller的每個中斷說明符(interrupt specifier)有幾個cells,類似#address-cells 與 #size-cells的作用
  • interrupt-parent 這是一個裝置節點的屬性,用於表明當前裝置的中斷是屬於哪一個interrupt-controller的,如果沒有這個屬性,則繼承其父節點的interrupt-parent屬性
  • interrupts 這是一個裝置節點的屬性,他是 中斷說明符 列表,每一個 中斷說明符 表示此裝置的一箇中斷訊號輸出。
中斷說明符是由一個或多個cell資料(#interrupt-cells )來描述一個裝置是與哪一個終端訊號輸入裝置相連線的。多數裝置都只有一箇中斷訊號輸出,如下面的例子,但也有可能存在一個裝置有多個終端訊號輸出的情況。中斷說明符的含義與具體的終端控制器( interrupt-controller)有關。每個終端控制器都可以決定它的輸入訊號的中斷說明符有幾個cell資料。 下面的程式碼中為我們的Coyote's Revenge添加了中斷連線:
/ {     compatible = "acme,coyotes-revenge";     #address-cells = <1>;     #size-cells = <1>;     interrupt-parent = <&intc>;     cpus {         #address-cells = <1>;         #size-cells = <0>;         [email protected] {             compatible = "arm,cortex-a9";             reg = <0>;         };         [email protected] {             compatible = "arm,cortex-a9";             reg = <1>;         };     };     [email protected] {         compatible = "arm,pl011";         reg = <0x101f0000 0x1000 >;         interrupts = < 1 0 >;     };     [email protected] {         compatible = "arm,pl011";         reg = <0x101f2000 0x1000 >;         interrupts = < 2 0 >;     };     [email protected] {         compatible = "arm,pl061";         reg = <0x101f3000 0x1000                0x101f4000 0x0010>;         interrupts = < 3 0 >;     };     intc: [email protected] {         compatible = "arm,pl190";         reg = <0x10140000 0x1000 >;         interrupt-controller;         #interrupt-cells = <2>;     };     [email protected] {         compatible = "arm,pl022";         reg = <0x10115000 0x1000 >;         interrupts = < 4 0 >;     };     external-bus {         #address-cells = <2>         #size-cells = <1>;         ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet                   1 0  0x10160000   0x10000     // Chipselect 2, i2c controller                   2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash         [email protected],0 {             compatible = "smc,smc91c111";             reg = <0 0 0x1000>;             interrupts = < 5 2 >;         };         [email protected],0 {             compatible = "acme,a1234-i2c-bus";             #address-cells = <1>;             #size-cells = <0>;             reg = <1 0 0x1000>;             interrupts = < 6 2 >;             [email protected] {                 compatible = "maxim,ds1338";                 reg = <58>;                 interrupts = < 7 3 >;             };         };         [email protected],0 {             compatible = "samsung,k8f1315ebm", "cfi-flash";             reg = <2 0 0x4000000>;         };     }; };
有些細節需要各位注意:
  • 此machine僅有一箇中斷控制器:[email protected]
  • 標籤"intc:"被加到了中斷控制器的節點上,這個標籤在父節點上建立了一個phandle,這個phandle就是父節點的interrupt-parent。所以這個中斷控制器就成了系統所有子節點的預設終端控制器,只有當子節點明確的聲明瞭其interrupt-parent才會被覆蓋。
  • 每個裝置使用interrupt屬性來區分不同的終端輸入線。
  • #interrupt-cells(在[email protected]節點中)的值是2,所以,每個中斷說明符由兩個cell資料組成。這個例子中用的是最常見的 中斷說明符 形式,第一個cell表示中斷線的序號,第二個cell表示終端型別的flag(表示高有效,低有效。。。),對於不同的終端控制器,需要閱讀對應的binding document來得知其 中斷說明符 的格式。
裝置特定資料 在常用的屬性之外,我們還能為一個節點自行新增屬性及子節點。只要是系統需要的任何資料都能被我們按特定的規則來新增。 首先,新裝置特定的屬性名需要使用 廠商字首,這樣能避免與系統已有的標準屬性名稱衝突。 第二,每個屬性都應該在某個binding文件中有相關的說明,這樣驅動作者才能知道如何使用這些屬性資料。 第三,將新的binding資料在[email protected]中post出來,大家對binding的程式碼審查將能規避大部分常識性錯誤。 特殊節點 aliases 節點 這個特殊節點用來引用一個長路徑,比如/external-bus/[email protected],0,它是長路徑的縮寫或叫別名。比如:
    aliases {         ethernet0 = &eth0;         serial0 = &serial0;     };
使用別名來標識一個裝置是備受作業系統歡迎的做法。 chosen節點 chosen節點並不代表一個真正的裝置,而是用來在Firmware與作業系統間傳遞資料,如啟動引數。 通常chosen節點在dts中被置空。 在我們這個例子中,被添加了如下的啟動引數:

相關推薦

Linux裝置用法

本文通過為一個新machine寫一個裝置樹來介紹裝置樹相關的概念,以及如何來描述一個machine。 關於裝置樹的技術細節描述,需要參考ePAPR文件,ePAPR文件中包含了大量的基礎語法之外的細節,如果你需要了解更多本文之外的裝置樹細節,請參考ePAPR文件。 基本資料

ARM Linux裝置

1 ARM裝置樹 DT: Device Tree FDT: Flattened DeviceTree OF: Open Firmware(開啟韌體,這個字首在後面的api中會用到) DTS : device tree souke DTSI: device tree sourc

Linux裝置語法詳解【轉】

轉自:https://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux核心從3.x開始引入裝置樹的概念,用於實現驅動程式碼與裝置資訊相分離。在裝置樹出現以前,所有關於裝置的具體資訊都要寫在驅動裡,一旦外圍裝置變化,驅動程式碼就要重寫。引入了裝置樹之

04-Linux裝置系列-GPIO驅動實踐

1. 前言 GPIO驅動開發可能算是Linux核心裝置驅動開發中最為簡單、最常見的一個方向,對於開發板的按鍵、LED、蜂鳴器、電源控制等模組,可能都是使用GPIO實現的。Linux核心的GPIO子系統在核心不斷的演進過程中進行了多次的重構,本文的第二

Linux裝置語法詳解

概念 Linux核心從3.x開始引入裝置樹的概念,用於實現驅動程式碼與裝置資訊相分離。在裝置樹出現以前,所有關於裝置的具體資訊都要寫在驅動裡,一旦外圍裝置變化,驅動程式碼就要重寫。引入了裝置樹之後,驅動程式碼只負責處理驅動的邏輯,而關於裝置的具體資訊存放到裝置樹檔案中,

Linux裝置使用

本頁面介紹瞭如何為新machine編寫裝置樹檔案。它旨在提供裝置樹概念的概述以及它們如何用於描述machine。 有關裝置樹資料格式的完整技術說明,請參閱ePAPR v1.1規範。ePAPR規範比本頁面介紹的基本主題包含更多詳細資訊,請參閱此頁面以獲取本頁未涵蓋的更高階用法

(最新核心3.4)Linux 裝置載入I2C client adapter 的流程(核心3.4 高通)

BLSP(BAM Low-Speed Peripheral) , 每一個BLSP含有兩個QUP, 每一個QUP可以被配置為I2C, SPI, UART, UIM介面, BLSP是高通對於低速介面的一種管理方式。 [email protec

linux裝置筆記__基於msm8x10的基本分析

由文章,linux裝置樹筆記__dts基本概念及語法,我們知道了基本概念,知道了大概的裝置樹節點及其屬性,而節點下的屬性大多是自定義,除了保留的幾個屬性,大多從.dts是無法知道其用途的,這個就需要看驅動是如何解析屬性值的了,這點也可作技術細節的部分隱藏。 在原始碼的ms

linux裝置

1.    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux郵件列表宣稱“this whole ARM thing is a f*cking pain in the ass”,引發ARM Linux社群的地震,隨

第18章 ARM Linux裝置之四(常用的OF API)

18.4 常用的OF API除了前文介紹的of_machine_is_compatible()、of_device_is_compatible()等常用函式以外,在Linux的BSP和驅動程式碼中,經常會使用到一些Linux中其他裝置樹的API,這些API通常被冠以of_字首

linux裝置中pinctrl的配置(上)

最近在移植linux,用到kernel版本為3.18.22和4.1.3,在高版本的核心原始碼中用到了裝置樹(device-tree),裝置樹中用到pinctrl的配置,記錄一下。 1、普通設定 在配置串列埠時,pinctrl的配置資訊如下所示: <span st

linux裝置中pinctrl的配置(下)

上一篇記錄了裝置樹檔案中管腳普通配置的查詢與確定,這篇介紹一下特殊的配置。 首先還是先看程式碼,看看到底特殊到哪裡。 <span style="font-size:14px;"> pi

Linux 裝置(Device Tree)簡介

DTS (device tree source)   .dts檔案是一種ASCII 文字格式的Device Tree描述,此文字格式非常人性化,適合人類的閱讀習慣。基本上,在ARM Linux在,一個

linux 裝置及節點引用

說了這麼半天,跟引入裝置樹有什麼關係呢?華清教學使用的開發板(A8/A9)都使用DM9000網絡卡晶片。DM9000驅動是開源的,在主線核心原始碼中就有。我們每次基於A8/A9板子移植的時候,DM9000驅動並沒有修改過,僅僅是選配了下,主要的工作是在板級檔案中添加了裝置資訊。DM9000驅動使用的是plat

linux裝置詳解-韋東山-專題視訊課程

linux裝置樹詳解—150人已學習 課程介紹        現在的linux核心(Linux3.X)都已支援裝置樹機制(dts),不管你是玩核心還是玩驅動,一定會碰到裝置樹,而網上雖然有很多部落格,但都講的不夠清晰,看了還是不懂,半桶水,學員急需一套講解裝置樹比較透徹的課程

linux裝置中的dts與dtsi

1.    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux郵件列表宣稱“this whole ARM thing is a f*cking pain in the ass”,引發ARM Linux社群的地震

Linux裝置學習日記(一)裝置簡單介紹

一、linux裝置樹簡介1.    裝置樹是一種描述硬體的資料結構,它起源於openfirmware,採用裝置樹後,許多硬體的細節可以直接通過它傳遞給linux,而不需要在核心中進行大量冗餘編碼。2.    裝置樹由一系列被命名的節點(Node)和屬性(property)組成

Linux驅動】Linux裝置語法詳解

1 概念Linux核心從3.x開始引入裝置樹的概念,用於實現驅動程式碼與裝置資訊相分離。在裝置樹出現以前,所有關於裝置的具體資訊都要寫在驅動裡,一旦外圍裝置變化,驅動程式碼就要重寫。引入了裝置樹之後,驅動程式碼只負責處理驅動的邏輯,而關於裝置的具體資訊存放到裝置樹檔案中,這樣,如果只是硬體介面資訊的變化而沒有

我眼中的Linux裝置(三 屬性)

三 屬性(property)device_type = "memory"就是一個屬性,等號前邊是屬性,後邊是值。節點是一個邏輯上相對獨立的實體,屬性是用來描述節點特性的,根據需要一個節點由0個,1個或多個屬性表示節點的特性。一個屬性由名字和值兩部分組成。和節點的名字類似,規範

第二課:linux裝置的規範(dts和dtb)

轉載請註明文章地址 http://wiki.100ask.org/Linux_devicetree 第01節_DTS格式 dts檔案通過編譯生成dtb格式檔案 屬性的定義 value取值型別 屬性名=值只有三種取值 第一種 <1 0x3