在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)單地學(xué)習(xí)一下設(shè)備樹的一些知識(shí)

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

	

在platform_device部分有簡(jiǎn)單說明描述設(shè)備有兩種方法:一種是使用platform_device結(jié)構(gòu)體來指定;另一種是使用設(shè)備樹來描述。

本篇筆記我們就來簡(jiǎn)單地學(xué)習(xí)一下設(shè)備樹的一些知識(shí)。

什么是設(shè)備樹

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

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

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

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

這些源文件同我們的C代碼一樣,并不能直接使用的,而是得經(jīng)過一個(gè)編譯過程生成機(jī)器可運(yùn)行的二進(jìn)制文件,如:

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

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

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

Linux為什么會(huì)引入設(shè)備樹?

在上一個(gè)實(shí)驗(yàn):【Linux筆記】LED驅(qū)動(dòng)實(shí)驗(yàn)(總線設(shè)備驅(qū)動(dòng)模型)中我們使用了platform_device結(jié)構(gòu)體來描述led設(shè)備(硬件資源)。既然已經(jīng)有了描述設(shè)備的方法了,為什么還要引入設(shè)備樹呢?

因?yàn)長inux內(nèi)核中有很多BSP(板級(jí)支持包),不同的BSP會(huì)包含著不同的描述設(shè)備的代碼(.c或.h文件)。

隨著芯片的發(fā)展,Linux內(nèi)核中就包含著越來越多這些描述設(shè)備的代碼,導(dǎo)致Linux內(nèi)核代碼會(huì)很臃腫。

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

因此引入了設(shè)備樹文件,從而可精簡(jiǎn)一些臃腫的C代碼。除此之外,.dts編譯生成.dtb文件的過程要比.c編譯生成驅(qū)動(dòng)模塊、加載驅(qū)動(dòng)模塊的過程要簡(jiǎn)單很多,也更方便我們進(jìn)行開發(fā)。

設(shè)備樹的語法

設(shè)備樹源文件也是需要根據(jù)一定規(guī)則來編寫的,同C語言一樣,也要遵循一些語法規(guī)則。下面簡(jiǎn)單看一下設(shè)備樹的源碼結(jié)構(gòu)及語法。

先看一個(gè)設(shè)備樹示例:

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

1、節(jié)點(diǎn)格式

label:node-name@unit-address

其中:

label:標(biāo)號(hào)

node-name:節(jié)點(diǎn)名字

unit-address:?jiǎn)卧刂?/p>

label 是標(biāo)號(hào),可以省略。label 的作用是為了方便地引用 node。比如:

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

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

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

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

  • 一個(gè)32位的數(shù)據(jù),用尖括號(hào)包圍起來,如

interrupts=<170xc>;

  • 一個(gè)64位數(shù)據(jù)(使用2個(gè)32位數(shù)據(jù)表示),用尖括號(hào)包圍起來,如:

clock-frequency=<0x000000010x00000000>;

  • 有結(jié)束符的字符串,用雙引號(hào)包圍起來,如:

compatible="simple-bus";

  • 字節(jié)序列,用中括號(hào)包圍起來,如:

local-mac-address=[000012345678];//每個(gè)byte使用2個(gè)16進(jìn)制數(shù)來表示
local-mac-address=[000012345678];//每個(gè)byte使用2個(gè)16進(jìn)制數(shù)來表示

  • 可以是各種值的組合,用逗號(hào)隔開,如:

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

3、一些標(biāo)準(zhǔn)屬性(1) compatible 屬性

“compatible”表示“兼容”,對(duì)于某個(gè)LED,內(nèi)核中可能有A、B、C三個(gè)驅(qū)動(dòng)都支持它,那可以這樣寫:

led{
compatible=“A”,“B”,“C”;
};

內(nèi)核啟動(dòng)時(shí),就會(huì)為這個(gè)LED按這樣的優(yōu)先順序?yàn)樗业津?qū)動(dòng)程序:A、B、C。

(2)model 屬性

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

比如根節(jié)點(diǎn)中可以這樣寫:

/{
compatible="samsung,smdk2440","samsung,mini2440";
model="jz2440_v3";
};

它表示這個(gè)單板,可以兼容內(nèi)核中的“smdk2440”,也兼容“mini2440”。

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

(3)status 屬性

status 屬性看名字就知道是和設(shè)備狀態(tài)有關(guān)的, status 屬性值也是字符串,字符串是設(shè)備的狀態(tài)信息,可選的狀態(tài)如下所示:

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

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

格式:

address-cells:address要用多少個(gè)32位數(shù)來表示;
size-cells:size要用多少個(gè)32位數(shù)來表示。

比如一段內(nèi)存,怎么描述它的起始地址和大小?

下例中,address-cells為1,所以reg中用1個(gè)數(shù)來表示地址,即用0x80000000來表示地址;size-cells為1,所以reg中用1個(gè)數(shù)來表示大小,即用0x20000000表示大小:

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

(5)reg 屬性

reg屬性的值,是一系列的“address size”,用多少個(gè)32位的數(shù)來表示address和size,由其父節(jié)點(diǎn)的# address-cells、#size-cells決定。示例:

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

(7)name 屬性

過時(shí)了,建議不用。它的值是字符串,用來表示節(jié)點(diǎn)的名字。在跟platform_driver匹配時(shí),優(yōu)先級(jí)最低。compatible屬性在匹配過程中,優(yōu)先級(jí)最高。

(8)device_type 屬性

過時(shí)了,建議不用。它的值是字符串,用來表示節(jié)點(diǎn)的類型。在跟platform_driver匹配時(shí),優(yōu)先級(jí)為中。compatible屬性在匹配過程中,優(yōu)先級(jí)最高。

3、常用的節(jié)點(diǎn)(1)根節(jié)點(diǎn)

用 / 標(biāo)識(shí)根節(jié)點(diǎn),如:

/dts-v1/;
/{
model="SMDK24440";
compatible="samsung,smdk2440";

#address-cells=<1>;
#size-cells=<1>;
};

(2)CPU節(jié)點(diǎn)

一般不需要我們?cè)O(shè)置,在 dtsi 文件中都定義好了,如:

cpus{
#address-cells=<1>;
#size-cells=<0>;

cpu0:cpu@0{
.......
}
};

(3)memory 節(jié)點(diǎn)

芯片廠家不可能事先確定你的板子使用多大的內(nèi)存,所以 memory 節(jié)點(diǎn)需要板廠設(shè)置,比如:

memory{
reg=<0x800000000x20000000>;
};

(4)chosen 節(jié)點(diǎn)

我們可以通過設(shè)備樹文件給內(nèi)核傳入一些參數(shù),這要在chosen節(jié)點(diǎn)中設(shè)置bootargs屬性:

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

操作設(shè)備樹的函數(shù)

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

1、節(jié)點(diǎn)相關(guān)操作函數(shù) Linux 內(nèi)核使用 device_node 結(jié)構(gòu)體來描述一個(gè)節(jié)點(diǎn),此結(jié)構(gòu)體定義在文件 include/linux/of.h 中,定義如下:

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

與查找節(jié)點(diǎn)有關(guān)的 OF 函數(shù)有 5 個(gè):

(1) of_find_node_by_name 函數(shù)

of_find_node_by_name 函數(shù)通過節(jié)點(diǎn)名字查找指定的節(jié)點(diǎn),函數(shù)原型如下:

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

(2) of_find_node_by_type 函數(shù)

of_find_node_by_type 函數(shù)通過 device_type 屬性查找指定的節(jié)點(diǎn),函數(shù)原型如下:

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

(3) of_find_compatible_node 函數(shù)

of_find_compatible_node 函數(shù)根據(jù) device_type 和 compatible 這兩個(gè)屬性查找指定的節(jié)點(diǎn),函數(shù)原型如下:

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

(4)of_find_matching_node_and_match 函數(shù)

of_find_matching_node_and_match 函數(shù)通過 of_device_id 匹配表來查找指定的節(jié)點(diǎn),函數(shù)原型如下:

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 函數(shù)

of_find_node_by_path 函數(shù)通過路徑來查找指定的節(jié)點(diǎn),函數(shù)原型如下:

inlinestructdevice_node*of_find_node_by_path(constchar*path);

2、提取屬性值的 OF 函數(shù) Linux 內(nèi)核中使用結(jié)構(gòu)體 property 表示屬性,此結(jié)構(gòu)體同樣定義在文件 include/linux/of.h 中,內(nèi)容如下:

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

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

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

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

(2)of_property_count_elems_of_size 函數(shù)

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

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

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

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

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

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

(5)of_property_read_string 函數(shù)

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

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209497
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68612
  • 設(shè)備樹
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    3124

原文標(biāo)題:整理了一份Linux設(shè)備樹基礎(chǔ)知識(shí),建議收藏!

文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FOC電路學(xué)習(xí)路上的一些硬件坑

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

    繼電器測(cè)試的培訓(xùn)和學(xué)習(xí)資源有哪些推薦?

    繼電器是電氣控制設(shè)備中常見的種元件,用于實(shí)現(xiàn)電路的開關(guān)控制和保護(hù)功能。對(duì)于從事電氣相關(guān)工作的人員來說,掌握繼電器的測(cè)試技能是非常重要的。以下是一些推薦的繼電器測(cè)試培訓(xùn)和學(xué)習(xí)資源: 在
    發(fā)表于 12-04 16:35

    一些常見的動(dòng)態(tài)電路

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

    分享一些常見的電路

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

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

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

    如何學(xué)習(xí)ARM?

    ARM 處理器的程序。此外,還需要了解一些常用的開發(fā)工具和調(diào)試工具,如交叉編譯器、調(diào)試器等。 4.實(shí)踐項(xiàng)目: 在學(xué)習(xí)的過程中進(jìn)行一些實(shí)踐項(xiàng)目是很有幫助的。你可以嘗試使用開發(fā)板或模擬器進(jìn)行簡(jiǎn)
    發(fā)表于 10-11 10:42

    LED驅(qū)動(dòng)器應(yīng)用的一些指南和技巧

    電子發(fā)燒友網(wǎng)站提供《LED驅(qū)動(dòng)器應(yīng)用的一些指南和技巧.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 11:35 ?0次下載
    LED驅(qū)動(dòng)器應(yīng)用的<b class='flag-5'>一些</b>指南和技巧

    有朋友愿意業(yè)余時(shí)間教我一下瑞薩編程嗎?付費(fèi)的

    本人要用到瑞薩單片機(jī),但是引腳設(shè)置,編程等都不熟,如果有朋友幫助學(xué)習(xí),愿意付費(fèi)!就是一些簡(jiǎn)單的入門知識(shí)。謝了
    發(fā)表于 08-20 22:47

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

    相關(guān)教材、參加在線課程或者參考編程書籍來系統(tǒng)地學(xué)習(xí)C語言的基礎(chǔ)知識(shí),并通過編寫簡(jiǎn)單的程序進(jìn)行實(shí)踐。 二、深入了解嵌入式系統(tǒng)的硬件架構(gòu)和工作原理嵌入式系統(tǒng)通常包含微控制器或微處理器等硬件設(shè)備
    發(fā)表于 04-07 16:03

    細(xì)談SolidWorks教育版的一些基礎(chǔ)知識(shí)

    SolidWorks教育版是款廣泛應(yīng)用于工程設(shè)計(jì)和教育領(lǐng)域的三維建模軟件。它具備直觀易用的操作界面和強(qiáng)大的設(shè)計(jì)功能,為學(xué)生提供了個(gè)學(xué)習(xí)和實(shí)踐的平臺(tái)。在本文中,我們將詳細(xì)探討SolidWorks教育版的
    的頭像 發(fā)表于 04-01 14:35 ?341次閱讀

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

    相關(guān)教材、參加在線課程或者參考編程書籍來系統(tǒng)地學(xué)習(xí)C語言的基礎(chǔ)知識(shí),并通過編寫簡(jiǎn)單的程序進(jìn)行實(shí)踐。 二、深入了解嵌入式系統(tǒng)的硬件架構(gòu)和工作原理嵌入式系統(tǒng)通常包含微控制器或微處理器等硬件設(shè)備
    發(fā)表于 03-25 14:12

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

    晶振電路中的電容和電阻是調(diào)整和維持晶振振蕩穩(wěn)定性的關(guān)鍵元件。KOAN凱擎小妹帶大家了解一下晶振電路中電容電阻的一些基本原理和作用。
    的頭像 發(fā)表于 02-20 16:22 ?1744次閱讀
    晶振電路中電容電阻的<b class='flag-5'>一些</b>基本原理和作用解析

    簡(jiǎn)單介紹一下電源紋波與電容嘯叫

    簡(jiǎn)單介紹一下電源紋波與電容嘯叫? 電源紋波與電容嘯叫是在電源系統(tǒng)中常見的兩種問題,它們會(huì)影響電子設(shè)備的性能和穩(wěn)定性。本篇文章將詳細(xì)介紹電源紋波和電容嘯叫的定義、原因、對(duì)設(shè)備的影響以及常
    的頭像 發(fā)表于 02-04 09:42 ?1027次閱讀

    QT串口通信的簡(jiǎn)單使用

    QT串口通信是上位機(jī)和下位機(jī)通信常用的通信方式, 也是學(xué)習(xí)QT必須學(xué)會(huì)的基礎(chǔ)知識(shí), 這篇就簡(jiǎn)單介紹一下QT串口通信的簡(jiǎn)單使用.
    的頭像 發(fā)表于 01-15 09:27 ?2023次閱讀
    QT串口通信的<b class='flag-5'>簡(jiǎn)單</b>使用

    免費(fèi)學(xué)習(xí)鴻蒙(HarmonyOS)開發(fā),一些地址分享

    課|應(yīng)用開發(fā)視頻教程學(xué)習(xí)|HarmonyOS應(yīng)用開發(fā)官網(wǎng) 官網(wǎng)是一些比較基礎(chǔ)性的東西,學(xué)起來可能沒那么好理解。下面再推薦個(gè)B站博主:HarmonyOS天天分享;里面有鴻蒙4.0的基礎(chǔ)到高階的
    發(fā)表于 01-12 20:48
    主站蜘蛛池模板: 欧美啊片| 视频在线观看网站免费| 欧美在线专区| 永久在线观看www免费视频| 人人射人人澡| 97午夜| 欲色啪| 午夜五月天| 国产婷婷综合丁香亚洲欧洲| 久久久久九九精品影院| 免费伦费一区二区三区四区| 欧美天堂在线观看| 天天色综合2| 天天躁狠狠躁夜夜躁2021| 日本成人免费在线视频| 午夜精品久久久久久久99| baoyu777永久免费视频| 色94色欧美一区| 夜夜夜操| 亚洲一区二区三区影院| 欧美午夜性| 日本精品视频一视频高清| 久久国产热| 黄 色 免 费 网站在线观看| 国产精品久久久久影院免费| 亚洲 欧美 丝袜 制服 在线| 成人国产日本亚洲精品| 国产男人搡女人免费视频| 日本特黄特黄刺激大片免费| 天天色天天做| 99精品久久99久久久久久| 久久激情五月| 2021国产成人午夜精品| 色你懂的| 天天操天天射天天爽| 久久婷婷激情| 国产乱码精品一区二区三区四川人| 91精品日本久久久久久牛牛| 色多多视频在线观看免费大全| 天天操天天操天天操香蕉| 一级毛片q片|