那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單地學習一下設備樹的一些知識

倩倩 ? 來源:一口Linux ? 作者:一口Linux ? 2022-09-09 15:29 ? 次閱讀

	

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

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

什么是設備樹

a676b120-2fcf-11ed-ba43-dac502259ad0.png

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

a682d180-2fcf-11ed-ba43-dac502259ad0.png

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

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

a68f9168-2fcf-11ed-ba43-dac502259ad0.png

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

a69b3b12-2fcf-11ed-ba43-dac502259ad0.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語言一樣,也要遵循一些語法規則。下面簡單看一下設備樹的源碼結構及語法。

先看一個設備樹示例:

a6b00128-2fcf-11ed-ba43-dac502259ad0.png

1、節點格式

label:node-name@unit-address

其中:

label:標號

node-name:節點名字

unit-address:單元地址

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

a6bccfde-2fcf-11ed-ba43-dac502259ad0.png

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

a6cc16ce-2fcf-11ed-ba43-dac502259ad0.png

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

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

interrupts=<170xc>;

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

clock-frequency=<0x000000010x00000000>;

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

compatible="simple-bus";

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

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

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

compatible="ns16550","ns8250";
example=<0xf00f000019>,"astrangepropertyformat";

3、一些標準屬性(1) 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屬性來明確。

(3)status 屬性

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

a6d98a0c-2fcf-11ed-ba43-dac502259ad0.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=<0x800000000x20000000>;
};
};

(5)reg 屬性

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

/dts-v1/;
/{
#address-cells=<1>;
#size-cells=<1>;
memory{
reg=<0x800000000x20000000>;
};
};

(7)name 屬性

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

(8)device_type 屬性

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

3、常用的節點(1)根節點

用 / 標識根節點,如:

/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=<0x800000000x20000000>;
};

(4)chosen 節點

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

chosen{
bootargs="noinitrdroot=/dev/mtdblock4rwinit=/linuxrcconsole=ttySAC0,115200";
};

操作設備樹的函數

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

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

a6f4f274-2fcf-11ed-ba43-dac502259ad0.png

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

(1) of_find_node_by_name 函數

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

structdevice_node*of_find_node_by_name(structdevice_node*from,
constchar*name);

(2) of_find_node_by_type 函數

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

structdevice_node*of_find_node_by_type(structdevice_node*from,constchar*type);

(3) of_find_compatible_node 函數

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

structdevice_node*of_find_compatible_node(structdevice_node*from,constchar*type,
constchar*compatible);

(4)of_find_matching_node_and_match 函數

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

structdevice_node*of_find_matching_node_and_match(structdevice_node*from,conststructof_device_id*matches,conststructof_device_id**match);

(5)of_find_node_by_path 函數

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

inlinestructdevice_node*of_find_node_by_path(constchar*path);

2、提取屬性值的 OF 函數 Linux 內核中使用結構體 property 表示屬性,此結構體同樣定義在文件 include/linux/of.h 中,內容如下:

a7036b42-2fcf-11ed-ba43-dac502259ad0.png

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

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

property*of_find_property(conststructdevice_node*np,constchar*name,int*lenp);

(2)of_property_count_elems_of_size 函數

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

intof_property_count_elems_of_size(conststructdevice_node*np,constchar*propname,intelem_size);

(3)讀取 u8、 u16、 u32 和 u64 類型的數組數據

a713b09c-2fcf-11ed-ba43-dac502259ad0.png

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

a735718c-2fcf-11ed-ba43-dac502259ad0.png

(5)of_property_read_string 函數

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

intof_property_read_string(structdevice_node*np,constchar*propname,constchar**out_string)

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210406
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69058
  • 設備樹
    +關注

    關注

    0

    文章

    39

    瀏覽量

    3163

原文標題:整理了一份Linux設備樹基礎知識,建議收藏!

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    為什么你的串口總是丟一些特殊字符?

    導讀在嵌入式開發和物聯網應用中,Linux系統的串口通信至關重要。本文將簡單介紹Linux串口設備的命名規則和termios結構體,并解析終端的三種工作模式,幫助開發者更好地掌握Linux串口編程
    的頭像 發表于 02-06 13:26 ?16次閱讀
    為什么你的串口總是丟<b class='flag-5'>一些</b>特殊字符?

    科技在物聯網方面

    科技在物聯網領域有多方面的涉及和發展,以下是一些具體信息: 傳感器技術合作 與傳感器公司合作:宇科技與一些傳感器技術公司有合作,例如奧比中光為宇
    發表于 02-04 06:48

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-初識設備設備組成和結構

    前邊講解了內核編譯選項的配置,這節我們詳細講一下設備。設備知識是Linux驅動開發人員必
    發表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識設備設備組成和結構

    前邊講解了內核編譯選項的配置,這節我們詳細講一下設備。設備知識是Linux驅動開發人員必
    發表于 01-07 09:16

    “碰一下”支付背后的4G技術

    不知道你是否有留意,近期,在線下支付場景中,多了個支付寶“碰一下”支付的設備,只需要“解鎖手機—碰一下—確認”即可完成支付,對比打開付款碼支付,步驟確實更加簡潔。
    的頭像 發表于 01-03 16:27 ?494次閱讀

    FOC電路學習路上的一些硬件坑

    記錄一下驅動直流無刷電機走過的坑。我是和是室友起在玩FOC,電路方面也是借鑒了他的。我倆共同的個心得就是,電路這個東西直接抄要么你就要原封不動的復刻下來,要么你就要搞懂電路中的每個電阻電容都起到
    的頭像 發表于 12-07 10:14 ?392次閱讀
    FOC電路<b class='flag-5'>學習</b>路上的<b class='flag-5'>一些</b>硬件坑

    一些常見的動態電路

    無論是模電還是數電,理論知識相對來說還是比較枯燥,各種電路原理理解清楚不算容易,換種生動形象的方式或許會增加一些趣味性,也更容易理解這些知識。下面整理了
    的頭像 發表于 11-16 09:26 ?498次閱讀
    <b class='flag-5'>一些</b>常見的動態電路

    分享一些常見的電路

    理解模電和數電的電路原理對于初學者來說可能比較困難,但通過一些生動的教學方法和資源,可以有效地提高學習興趣和理解能力。 下面整理了一些常見的電路,以動態圖形的方式展示。 整流電路 單相橋式整流
    的頭像 發表于 11-13 09:28 ?423次閱讀
    分享<b class='flag-5'>一些</b>常見的電路

    請問一下TPA3118和TPA3116的截止頻率是多少,是不是需要一些管腳配置?

    請問一下TPA3118和TPA3116的截止頻率是多少,是不是需要一些管腳配置?比如說我需要用TPA3118做低音炮功放芯片的話會不會他的截止頻率太高?還有如果我用TPA3118右聲道推個低音喇叭,左聲道推
    發表于 10-15 06:25

    如何學習ARM?

    ARM 處理器的程序。此外,還需要了解一些常用的開發工具和調試工具,如交叉編譯器、調試器等。 4.實踐項目: 在學習的過程中進行一些實踐項目是很有幫助的。你可以嘗試使用開發板或模擬器進行
    發表于 10-11 10:42

    有朋友愿意業余時間教我一下瑞薩編程嗎?付費的

    本人要用到瑞薩單片機,但是引腳設置,編程等都不熟,如果有朋友幫助學習,愿意付費!就是一些簡單的入門知識。謝了
    發表于 08-20 22:47

    如何成為名嵌入式C語言高手?

    相關教材、參加在線課程或者參考編程書籍來系統地學習C語言的基礎知識,并通過編寫簡單的程序進行實踐。 二、深入了解嵌入式系統的硬件架構和工作原理嵌入式系統通常包含微控制器或微處理器等硬件設備
    發表于 04-07 16:03

    細談SolidWorks教育版的一些基礎知識

    SolidWorks教育版是款廣泛應用于工程設計和教育領域的三維建模軟件。它具備直觀易用的操作界面和強大的設計功能,為學生提供了學習和實踐的平臺。在本文中,我們將詳細探討SolidWorks教育版的
    的頭像 發表于 04-01 14:35 ?394次閱讀

    如何成為名嵌入式C語言高手?

    相關教材、參加在線課程或者參考編程書籍來系統地學習C語言的基礎知識,并通過編寫簡單的程序進行實踐。 二、深入了解嵌入式系統的硬件架構和工作原理嵌入式系統通常包含微控制器或微處理器等硬件設備
    發表于 03-25 14:12

    晶振電路中電容電阻的一些基本原理和作用解析

    晶振電路中的電容和電阻是調整和維持晶振振蕩穩定性的關鍵元件。KOAN凱擎小妹帶大家了解一下晶振電路中電容電阻的一些基本原理和作用。
    的頭像 發表于 02-20 16:22 ?1881次閱讀
    晶振電路中電容電阻的<b class='flag-5'>一些</b>基本原理和作用解析
    百家乐官网怎么对冲打| 免费百家乐官网缩水| 下载百家乐棋牌大厅| bet365娱乐场| 怎样玩百家乐官网看路| 百家乐最新庄闲投注法| 棋牌平台| 网上百家乐官网是真的| 百家乐现金游戏注册送彩金| 东方夏威夷娱乐| 赌场百家乐官网的玩法技巧和规则| 伟易博百家乐的玩法技巧和规则 | 丘北县| 百家乐和抽水官网| 泸溪县| 高科技百家乐牌具| 百家乐官网平台那家好| 金域百家乐的玩法技巧和规则| 赌博百家乐官网的乐趣| 注册百家乐送彩金| 网上百家乐真坑人| 澳门百家乐官网怎么看小路| 海南太阳城大酒店| 德晋百家乐官网的玩法技巧和规则| 娱乐城注册送奖金| 免费百家乐在线| 大佬百家乐官网现金网| 新东泰百家乐的玩法技巧和规则| 狮威百家乐官网娱乐场| 博e百娱乐城怎么样| 百家乐官网园蒙特卡罗| 利来国际| 做生意风水知识| 兴安县| 百家乐买闲打法| 百家乐官网视频游戏中心| 中骏百家乐的玩法技巧和规则| 百家乐官网跟路技巧| 大发888官方 论坛| 做生意用的 风水上最好的尺寸有| 连州市|