《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > Linux教學——Linux設備樹基礎知識

Linux教學——Linux設備樹基礎知識

2022-08-24
作者:土豆居士 一口Linux
來源:電子技術應用專欄作家 一口Linux
關鍵詞: Linux 設備樹

  在platform_device部分有簡單說明描述設備有兩種方法:一種是使用platform_device結構體來指定;另一種是使用設備樹來描述。

  本篇筆記我們就來簡單地學習一下設備樹的一些知識。

  什么是設備樹

  微信圖片_20220824160553.png

  設備樹簡單理解就是描述設備信息(資源)的一棵樹。設備樹(Device Tree)用代碼體現如下:

  微信圖片_20220824160653.png

  這些代碼被保存在.dts/dtsi后綴文件中,也即設備樹源文件 DTS(DeviceTree Source)。

  這些源文件同我們的C代碼一樣,并不能直接使用的,而是得經過一個編譯過程生成機器可運行的二進制文件,如:

  微信圖片_20220824160919.png

  dts文件使用dtc工具編譯生成dtb文件,這個dtb文件就是內核可以使用的文件。例如我們的板子跑起來之后,我們系統使用的設備樹文件就存在目錄/boot下:

  微信圖片_20220824160931.png

  Linux為什么會引入設備樹?

  在上一個實驗:【Linux筆記】LED驅動實驗(總線設備驅動模型)中我們使用了platform_device結構體來描述led設備(硬件資源)。既然已經有了描述設備的方法了,為什么還要引入設備樹呢?

  因為Linux內核中有很多BSP(板級支持包),不同的BSP會包含著不同的描述設備的代碼(.c或.h文件)。

  隨著芯片的發展,Linux內核中就包含著越來越多這些描述設備的代碼,導致Linux內核代碼會很臃腫。

  這導致Linux之父Linus 大發雷霆:"this whole ARM thing is a f*cking pain in the ass"。

  因此引入了設備樹文件,從而可精簡一些臃腫的C代碼。除此之外,.dts編譯生成.dtb文件的過程要比.c編譯生成驅動模塊、加載驅動模塊的過程要簡單很多,也更方便我們進行開發。

  設備樹的語法

  設備樹源文件也是需要根據一定規則來編寫的,同C語言一樣,也要遵循一些語法規則。下面簡單看一下設備樹的源碼結構及語法。

  先看一個設備樹示例:

  微信圖片_20220824160948.png

  1、節點格式

  label: node-name@unit-address

  其中:

  label:標號

  node-name:節點名字

  unit-address:單元地址

  label 是標號,可以省略。label 的作用是為了方便地引用 node。比如:

  微信圖片_20220824161014.png

  可以使用下面 2 種方法來修改 uart@fe001000 這個 node:

  微信圖片_20220824161033.png

  2、屬性格式

  簡單地說, properties 就是“name=value”, value 有多種取值方式。示例:

  一個32位的數據,用尖括號包圍起來,如

  interrupts = <17 0xc>;

  一個64位數據(使用2個32位數據表示),用尖括號包圍起來,如:

  clock-frequency = <0x00000001 0x00000000>;

  有結束符的字符串,用雙引號包圍起來,如:

  compatible = "simple-bus";

  字節序列,用中括號包圍起來,如:

  local-mac-address = [00 00 12 34 56 78]; // 每個byte使用2個16進制數來表示

  local-mac-address = [000012345678];      // 每個byte使用2個16進制數來表示

  可以是各種值的組合,用逗號隔開,如:

  compatible = "ns16550", "ns8250";

  example = <0xf00f0000 19>, "a strange property format";

  3、一些標準屬性

 ?。?) compatible 屬性

  “compatible”表示“兼容”,對于某個LED,內核中可能有A、B、C三個驅動都支持它,那可以這樣寫:

  led {

  compatible = “A”, “B”, “C”;

  };

  內核啟動時,就會為這個LED按這樣的優先順序為它找到驅動程序:A、B、C。

  (2)model 屬性

  model屬性與compatible屬性有些類似,但是有差別。compatible屬性是一個字符串列表,表示可以你的硬件兼容A、B、C等驅動;model用來準確地定義這個硬件是什么。

  比如根節點中可以這樣寫:

  / {

  compatible = "samsung,smdk2440", "samsung,mini2440";

  model = "jz2440_v3";

  };

  它表示這個單板,可以兼容內核中的“smdk2440”,也兼容“mini2440”。

  從compatible屬性中可以知道它兼容哪些板,但是它到底是什么板?用model屬性來明確。

 ?。?)status 屬性

  status 屬性看名字就知道是和設備狀態有關的, status 屬性值也是字符串,字符串是設備的狀態信息,可選的狀態如下所示:

  微信圖片_20220824161158.png

  (4)#address-cells 和#size-cells 屬性

  格式:

  address-cells:address要用多少個32位數來表示;

  size-cells:size要用多少個32位數來表示。

  比如一段內存,怎么描述它的起始地址和大???

  下例中,address-cells為1,所以reg中用1個數來表示地址,即用0x80000000來表示地址;size-cells為1,所以reg中用1個數來表示大小,即用0x20000000表示大?。?/p>

  / {

  # address-cells = <1>;

  # size-cells = <1>;

  memory {

  reg = <0x80000000 0x20000000>;

  };

  };

 ?。?)reg 屬性

  reg屬性的值,是一系列的“address size”,用多少個32位的數來表示address和size,由其父節點的# address-cells、#size-cells決定。示例:

  /dts-v1/;

  / {

  # address-cells = <1>;

  # size-cells = <1>;

  memory {

  reg = <0x80000000 0x20000000>;

  };

  };

 ?。?)name 屬性

  過時了,建議不用。它的值是字符串,用來表示節點的名字。在跟platform_driver匹配時,優先級最低。compatible屬性在匹配過程中,優先級最高。

 ?。?)device_type 屬性

  過時了,建議不用。它的值是字符串,用來表示節點的類型。在跟platform_driver匹配時,優先級為中。compatible屬性在匹配過程中,優先級最高。

  3、常用的節點

 ?。?)根節點

  用 / 標識根節點,如:

  /dts-v1/;

  / {

  model = "SMDK24440";

  compatible = "samsung,smdk2440";

  # address-cells = <1>;

  # size-cells = <1>;

  };

  (2)CPU節點

  一般不需要我們設置,在 dtsi 文件中都定義好了,如:

  cpus {

  # address-cells = <1>;

  # size-cells = <0>;

  cpu0: cpu@0 {

  .......

  }

  };

  (3)memory 節點

  芯片廠家不可能事先確定你的板子使用多大的內存,所以 memory 節點需要板廠設置,比如:

  memory {

  reg = <0x80000000 0x20000000>;

  };

  (4)chosen 節點

  我們可以通過設備樹文件給內核傳入一些參數,這要在chosen節點中設置bootargs屬性:

  chosen {

  bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";

  };

  操作設備樹的函數

  Linux 內核給我們提供了一系列的函數來獲取設備樹中的節點或者屬性信息,這一系列的函數都有一個統一的前綴“of_”(“open firmware”即開放固件。),所以在很多資料里面也被叫做 OF 函數。

  1、節點相關操作函數

  Linux 內核使用 device_node 結構體來描述一個節點,此結構體定義在文件 include/linux/of.h 中,定義如下:

  微信圖片_20220824161351.png

  與查找節點有關的 OF 函數有 5 個:

  (1) of_find_node_by_name 函數

  of_find_node_by_name 函數通過節點名字查找指定的節點,函數原型如下:

  struct device_node *of_find_node_by_name(struct device_node *from,

  const char *name);

  (2) of_find_node_by_type 函數

  of_find_node_by_type 函數通過 device_type 屬性查找指定的節點,函數原型如下:

  struct device_node *of_find_node_by_type(struct device_node *from, const char *type);

  (3) of_find_compatible_node 函數

  of_find_compatible_node 函數根據 device_type 和 compatible 這兩個屬性查找指定的節點,函數原型如下:

  struct device_node *of_find_compatible_node(struct device_node *from,const char *type,

  const char *compatible);

  (4)of_find_matching_node_and_match 函數

  of_find_matching_node_and_match 函數通過 of_device_id 匹配表來查找指定的節點,函數原型如下:

  struct device_node *of_find_matching_node_and_match(struct device_node *from,const struct of_device_id *matches,const struct of_device_id **match);

  (5)of_find_node_by_path 函數

  of_find_node_by_path 函數通過路徑來查找指定的節點,函數原型如下:

  inline struct device_node *of_find_node_by_path(const char *path);

  2、提取屬性值的 OF 函數

  Linux 內核中使用結構體 property 表示屬性,此結構體同樣定義在文件 include/linux/of.h 中,內容如下:

  微信圖片_20220824161416.png

  Linux 內核也提供了提取屬性值的 OF 函數 :

  (1) of_find_property 函數

  of_find_property 函數用于查找指定的屬性,函數原型如下:

  property *of_find_property(const struct device_node *np,const char *name,int *lenp);

 ?。?)of_property_count_elems_of_size 函數

  of_property_count_elems_of_size 函數用于獲取屬性中元素的數量,比如 reg 屬性值是一個數組,那么使用此函數可以獲取到這個數組的大小,此函數原型如下:

  int of_property_count_elems_of_size(const struct device_node *np,const char *propname,int elem_size);

 ?。?)讀取 u8、 u16、 u32 和 u64 類型的數組數據

  微信圖片_20220824161433.png

  (4)讀取 u8、 u16、 u32 和 u64 類型屬性值

  微信圖片_20220824161451.png

  (5)of_property_read_string 函數

  of_property_read_string 函數用于讀取屬性中字符串值,函數原型如下:

  int of_property_read_string(struct device_node *np,const char *propname,const char **out_string)

  

 更多信息可以來這里獲取==>>電子技術應用-AET<<

微信圖片_20210517164139.jpg

微信圖片_20220701092006.jpg

電子技術應用專欄作家  一口Linux

原文鏈接:https://mp.weixin.qq.com/s/BI23d71SJkYPHnzQbFyvpQ

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          久久久综合激的五月天| 久久综合狠狠综合久久综青草| 亚洲国产91色在线| 在线观看91精品国产麻豆| 欧美精品在线免费观看| 一区在线免费观看| 欧美精彩视频一区二区三区| 国产日韩精品视频一区二区三区| 亚洲人成精品久久久久| 欧美巨乳在线| 亚洲韩国一区二区三区| 一区二区免费在线播放| 国产精品久久久久久久午夜| 在线精品观看| 国产精品video| 国产一区二区三区久久精品| 一区二区三区在线视频免费观看| 久久精品国产免费| 欧美精品三区| 久久午夜电影网| 免费欧美网站| 一本色道久久综合亚洲精品不卡| 久久久福利视频| 亚洲经典一区| 精品成人在线视频| 国产精品99久久久久久宅男| 99热这里只有精品8| 欧美视频日韩视频| 亚洲免费网站| 欧美成人国产| 久久综合九色综合久99| 久久久久久**毛片大全| 国产偷国产偷亚洲高清97cao| 国产一区二三区| 91久久国产综合久久91精品网站| 欧美成年人视频网站| 欧美日韩免费观看一区| 欧美一区二区三区四区视频| 国产视频精品网| 欧美日韩国产大片| 亚洲免费观看高清完整版在线观看| 亚洲深夜福利| 欧美日韩在线高清| 日韩视频欧美视频| 欧美不卡在线视频| 欧美精品www在线观看| 久久国产精品99久久久久久老狼| 亚洲精品乱码久久久久久黑人| 国产一区久久| 国产精品区一区二区三| 久久久久国产精品麻豆ai换脸| 亚洲性夜色噜噜噜7777| 国产精品色网| 亚洲欧美中文另类| 一区二区三区免费在线观看| 欧美日韩1234| 久久久久国产一区二区三区四区| 国产欧美一区二区三区久久人妖| 在线视频欧美日韩精品| 亚洲欧美激情四射在线日| 国产乱子伦一区二区三区国色天香| 国产在线一区二区三区四区| 午夜久久久久久久久久一区二区| 亚洲欧美精品在线观看| 欧美一区二视频| 久久久.com| 国产综合在线看| 国产一区二区三区免费不卡| 午夜精品美女自拍福到在线| 亚洲第一免费播放区| 免费在线观看一区二区| 国内精品写真在线观看| 欧美日韩免费观看一区三区| 欧美va天堂va视频va在线| 欧美日韩黄色一区二区| 久久激情视频| 狠狠操狠狠色综合网| 国产麻豆精品视频| 亚洲精品国产品国语在线app| 亚洲人久久久| 亚洲电影视频在线| 一区二区三区在线免费视频| 欧美激情一区二区三区在线视频| 欧美伊人久久久久久午夜久久久久| 国产区精品在线观看| 一区二区三区四区蜜桃| 日韩视频一区二区| 亚洲高清网站| 一区二区三区四区五区精品视频| 国产日本欧洲亚洲| 欧美一区二区成人6969| 欧美大片一区二区| 欧美高清hd18日本| 欧美精品乱人伦久久久久久| 国产视频精品va久久久久久| 最新国产成人av网站网址麻豆| 亚洲国产精品电影在线观看| 欧美极品在线观看| 国产一区二区三区奇米久涩| 欧美福利视频一区| 亚洲美女精品成人在线视频| 91久久中文字幕| 在线观看一区二区视频| 国产精品白丝jk黑袜喷水| 香蕉成人啪国产精品视频综合网| 欧美精品v国产精品v日韩精品| 欧美精品福利在线| 亚洲大胆美女视频| 一区二区三区精密机械公司| 亚洲欧美经典视频| 麻豆av福利av久久av| 欧美影院成年免费版| 亚洲精选在线| 国产一区二区欧美日韩| 欧美一区二区在线免费观看| 99精品视频网| 亚洲第一伊人| 一区二区免费看| 国产精品久久波多野结衣| 欧美天天视频| 模特精品裸拍一区| 亚洲免费小视频| 欧美好骚综合网| 国产精品自拍视频| 亚洲精品久久久久| 亚洲欧美日本国产专区一区| 亚洲欧美亚洲| 欧美午夜电影完整版| 精品999久久久| 久久亚洲春色中文字幕久久久| 久久九九国产精品| 国产一区二区成人久久免费影院| 国产精品久久久一本精品| 久久精品72免费观看| 狠狠色噜噜狠狠色综合久| 国产精品高潮呻吟| 欧美系列电影免费观看| 亚洲一区久久| 国一区二区在线观看| 黄色免费成人| 女人色偷偷aa久久天堂| 欧美伊人久久| 欧美一区二区三区在线视频| 亚洲日本中文字幕免费在线不卡| 日韩视频在线一区二区| 欧美女人交a| 欧美在线视频一区| 国产精品羞羞答答xxdd| 免费毛片一区二区三区久久久| 欧美三级午夜理伦三级中文幕| 国产精品香蕉在线观看| 午夜精品久久久久久久久久久久| 久久久在线视频| 亚洲春色另类小说| 亚洲欧美日韩国产一区二区三区| 亚洲电影网站| av不卡在线观看| 亚洲精品视频在线观看网站| 一区二区精品国产| 欧美激情 亚洲a∨综合| 欧美日韩国产成人高清视频| 欧美—级a级欧美特级ar全黄| 亚洲专区一二三| 国产亚洲成av人在线观看导航| 欧美视频观看一区| 在线日韩av永久免费观看| 亚洲愉拍自拍另类高清精品| 欧美成人激情视频免费观看| 国产一区二区中文| 先锋影院在线亚洲| 午夜精品99久久免费| 欧美日韩国产在线看| 国产亚洲aⅴaaaaaa毛片| 亚洲毛片一区二区| 在线免费观看视频一区| 亚洲激情黄色| 亚洲国产日韩一级| 久久久噜噜噜久久狠狠50岁| 国产精品久久看| 一区二区欧美国产| 久久精品在线视频| 欧美大片第1页| 国产精品成人一区二区三区吃奶| 国产亚洲成av人片在线观看桃| 亚洲国产精品免费| 欧美日本网站| 欧美激情一区二区三区在线视频观看| 亚洲精品男同| 欧美日韩亚洲一区三区| 国产午夜精品理论片a级大结局| 欧美中文字幕| 亚洲毛片一区二区| 亚洲一区二区在线播放| 久久精品欧美日韩精品| 伊人激情综合| 国产一区二区三区视频在线观看| 国产精品乱人伦一区二区| 久久国产成人| 欧美国产专区| 亚洲国产综合在线| 欧美日韩在线播放一区二区| 欧美另类在线播放| 亚洲影视综合| 欧美91大片| 亚洲高清av| 男女精品视频| 精品动漫3d一区二区三区| 日韩小视频在线观看| 国内一区二区在线视频观看| 亚洲欧美日韩在线播放| 亚洲国产日韩在线一区模特| 欧美日韩无遮挡| 久久午夜电影| 日韩亚洲视频在线| 欧美一级淫片播放口| 久久久亚洲影院你懂的| 亚洲经典三级| 久久成人av少妇免费| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲第一二三四五区| 欧美三级特黄| 久久久综合激的五月天| 国产精品一区二区久久精品| 亚洲国产岛国毛片在线| 亚洲在线免费| 性欧美办公室18xxxxhd| 国产精品扒开腿做爽爽爽视频| 麻豆成人在线| 欧美国产高潮xxxx1819| 欧美另类变人与禽xxxxx| 国产久一道中文一区| 日韩午夜电影| 欧美在线播放| 国产欧美高清| 久久在线免费视频| 国产日本欧美一区二区三区在线| 校园春色国产精品| 亚洲欧洲综合另类| 亚洲精品一区二区三区av| 亚洲欧美国产va在线影院| 欧美在线观看天堂一区二区三区| 久久精品亚洲热| 欧美人成免费网站| 亚洲无限av看| 99国产麻豆精品| 欧美极品影院| 欧美视频在线观看一区二区| 久久综合色婷婷| 亚洲免费精品| 国产精品区二区三区日本| 欧美一区二粉嫩精品国产一线天| 欧美日韩免费观看一区二区三区| 亚洲福利视频网| 性欧美暴力猛交另类hd| 久久久福利视频| 亚洲三级国产| 国产精品三级视频| 亚洲一区在线观看视频| 欧美日韩国产综合新一区| 夜夜嗨av一区二区三区| 亚洲高清精品中出| 欧美一区在线看| 国产伦精品免费视频| 亚洲国产成人tv| 韩国精品在线观看| 国内成+人亚洲| 欧美一区91| 国产一区二区三区网站| 亚洲黄一区二区三区| 欧美激情一级片一区二区| 午夜精品免费| 亚洲国产日韩一区| 亚洲国产成人精品视频| 亚洲欧美在线aaa| 国产精品入口日韩视频大尺度| 欧美日韩免费高清一区色橹橹| 欧美日韩大片一区二区三区| 免费成人黄色av| 国产日韩一区| 海角社区69精品视频| 欧美一区午夜精品| 亚洲欧洲日韩女同| 亚洲精品视频免费观看| 国产一区二区在线免费观看| 狠狠综合久久av一区二区老牛| 亚洲你懂的在线视频| 欧美午夜一区二区| 欧美综合77777色婷婷| 亚洲欧洲日本在线| 9色精品在线| 小处雏高清一区二区三区| 欧美精品123区| 欧美激情中文字幕一区二区| 蜜臀久久99精品久久久久久9| 久久久精品国产99久久精品芒果| 女女同性精品视频| 亚洲女女女同性video| 一区二区日韩精品| 欧美一区二区在线播放| 黄色一区二区在线观看| 亚洲激情国产| 欧美激情一区二区在线| 欧美美女bb生活片| 亚洲激情女人| 免费在线国产精品| 欧美在线免费视频| 国内外成人免费激情在线视频| 伊甸园精品99久久久久久| 国产一区日韩一区| 亚洲激情精品| 亚洲欧美日韩国产综合| 葵司免费一区二区三区四区五区| 亚洲黄色在线视频| 国产日产精品一区二区三区四区的观看方式| 最新亚洲电影| 亚洲人体影院| 欧美大片一区二区| 欧美夫妇交换俱乐部在线观看| 99国产精品99久久久久久| 久久免费少妇高潮久久精品99| 久久久久久高潮国产精品视| 欧美大胆成人| 免费成人av在线看| 欧美日韩中字| 欧美日韩一区二区在线| 老牛嫩草一区二区三区日本| 欧美视频一区二区三区四区| 久久久久久日产精品|