亚洲欧洲国产欧美一区精品,激情五月亚洲色五月,最新精品国偷自产在线婷婷,欧美婷婷丁香五月天社区

      考試首頁 | 考試用書 | 培訓課程 | 模擬考場 | 考試論壇  
        當前位置:操作系統(tǒng) > Linux > 文章內(nèi)容
        

      Linux基礎(chǔ)教程:Linux設(shè)備樹(Devicetree)

       [ 2016年2月18日 ] 【

      屬性(property)

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

      和節(jié)點的名字類似,規(guī)范要求屬性名字由1到31個字符組成。和節(jié)點名字字符的種類有些區(qū)別,不允許有大寫字母,增加了問號和井號兩個字符。不清楚為什么沒有和節(jié)點名字完全保持一致,井號對于初學者容易誤解,以為是注釋。

      0-9    數(shù)字
      a-z    小寫字母
      ,    逗號
      .    句點(英)
      _    下劃線
      +    加號
      -    破折號(英)
      ?    問號
      #    井號

      為了容易區(qū)分以及避免重復,標準未定義的屬性名字應該用公司或組織名稱開頭,比如:
      fsl,channel-fifo-len
      ibm,ppc-interrupt-server#s
      linux,network-index

      屬性的值在內(nèi)存中由0個或多個字節(jié)存儲。標準定義的基本類型包括:空,u32,u64,字符串,,字符數(shù)組6種。空前邊我們已經(jīng)提到,當不需要值就可以表示節(jié)點的特性時,屬性的值可以為空。u32,u64,字符串,字符數(shù)組和c語言的定義沒有區(qū)別,注意的是規(guī)范要求都是大端表示,字符串也是以0x00結(jié)尾。是一個結(jié)構(gòu)體數(shù)組,數(shù)組的元素具體是什么根據(jù)屬性的定義確定,后邊我們講到具體的屬性時會詳細說明。規(guī)范中還有一個類型的屬性值,叫,這個類型的屬性在內(nèi)存中存儲時本質(zhì)上是u32。

      規(guī)范預定義了一些標準的屬性!癱ompatible”,“model”,"device_type"都是用來表示節(jié)點基本信息的。

      “compatible”屬性是用來匹配驅(qū)動的,他的類型是字符串數(shù)組,每個字符串表示一種設(shè)備的類型,從具體到一般。舉個例子就比較清楚了,比如某個串口控制器節(jié)點的屬性”compatible = “fsl,mpc8641-uart”, “ns16550"“。第一個字符串“fsl,mpc8641-uart”前邊部分是廠商(推測是frescale),后邊部分是控制器具體型號,這個形式也是規(guī)范建議的標準寫法。第二個字符串ns16550表示一類符合同一標準的串口控制器,比第一個字符串表示的范圍更大。內(nèi)核匹配驅(qū)動時首先看是否有匹配第一個字符串的驅(qū)動,如果沒有的話再匹配第二個(如果有更多的,依次類推,所以優(yōu)先匹配前邊的)。

      "model"屬性用來表示設(shè)備的型號,用字符串表示,不像"compatible"用多個字符串,只需一個就夠了。"device_type"屬性用來表示設(shè)備類型,用字符串表示。

      "#address-cells","#size-cells","reg","ranges","dma-ranges"屬性都是和地址有關(guān)的。

      不同的平臺,不同的總線,地址位長度可能不同,有32位地址,有64位地址,為了適應這個,規(guī)范規(guī)定一個32位的長度為一個 cell。"#address-cells"屬性用來表示總線地址需要幾個cell表示,該屬性本身是u32類型的。"#size-cells"屬性用來表示子總線地址空間的長度需要幾個cell表示,屬性本身的類型也是u32?梢赃@么理解父節(jié)點表示總線,總線上每個設(shè)備的地址長度以及地址范圍是總線的一個特性,用"#address-cells","#size-cells"屬性表示,比如總線是32位,那么"#address-cells"設(shè)置成1 就可以了。這兩個屬性不可以繼承,就是說在未定義這兩個屬性的時候,不會繼承更高一級父節(jié)點的設(shè)置,如果沒有設(shè)置的話,內(nèi)核默認認為"#address- cells"為2,"#size-cells"為1。

      "reg"屬性用來表示節(jié)點地址資源的,比如常見的就是寄存器的起始地址及大小。要想表示一塊連續(xù)地址,必須包含起始地址和空間大小兩個參數(shù),如果有多塊地址,那么就需要多組這樣的值表示。還記得前邊說過的類型的屬性吧,就是用來干這個的,他表示一個數(shù)組,每個元素的具體格式根據(jù)屬性而定,對于'reg'屬性,每個元素是一個二元組,包含起始地址和大小。還有另外一個問題,地址和大小用幾個 u32表示呢?這個就由父節(jié)點的"#address-cells","#size-cells"屬性確定。

      總線上設(shè)備在總線地址和總線本身的地址可能不同,"ranges"屬性用來表示如何轉(zhuǎn)換。和'reg'屬性類似,'ranges'屬性也是類型的屬性,不同的是'ranges'屬性的每個元素是三元組,按照前后順序分別是(子總線地址,父總線地址,大小)。子總線地址需要幾個u32表示由'ranges'屬性所在節(jié)點的'#address-cells'屬性決定,父總線地址需要幾個 u32表示由上一級節(jié)點的'#address-cells'屬性決定,大小需要幾個u32表示由當前節(jié)點的'#size-cells'屬性確定。

      'dma-ranges'屬性的結(jié)構(gòu)和定義與'ranges'屬性完全相同,唯一不同的是地址是dma使用的地址,'ranges'中的地址是cpu使用的地址。

      有的時候在一個節(jié)點中需要引用另外一個節(jié)點,比如某個外設(shè)的中斷連在哪個中斷控制器上。在講節(jié)點那一節(jié)我們說過,可以通過節(jié)點的全路徑指定是哪個節(jié)點,但這種方法非常繁瑣。'phandle'屬性是專門為方便引用節(jié)點設(shè)計的,想要引用哪個節(jié)點就在該節(jié)點下邊增加一個'phandle'屬性,設(shè)定值為一個u32,如'phandle = <1>',引用的地方直接使用數(shù)字1就可以引用該節(jié)點,如'interrupt-parent = <1>'。以上是規(guī)范中描述的方法,實際上這樣也不方便,我在實際的代碼中沒有看到這么用的。還記得節(jié)點那節(jié)說過節(jié)點名字前邊可以定義一個標簽吧,實際情況是都用標簽引用,比如節(jié)點標簽為intc1,那么用'interrupt-parent = <&intc1>'就可以引用了。

      'status'屬性用來表示節(jié)點的狀態(tài)的,其實就是硬件的狀態(tài),用字符串表示。'okay'表示硬件正常工作,“disabled”表示硬件當前不可用,“fail”表示因為出錯不可用,“fail-sss”表示因為某種原因出錯不可用,sss表示具體的出錯原因。實際中,基本只用'okay'和 'disabled'。

      將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動訪問考試網(wǎng) | 復制本頁地址,傳給QQ/MSN上的好友 | 申請鏈接 | 意見留言 TOP
      關(guān)于本站  網(wǎng)站聲明  廣告服務  聯(lián)系方式  站內(nèi)導航  考試論壇
      Copyright © 2007-2013 中華考試網(wǎng)(Examw.com) All Rights Reserved