chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

倩倩 ? 來(lái)源:一口Linux ? 作者:一口Linux ? 2022-09-09 15:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


	

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

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

什么是設(shè)備樹(shù)

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

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

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

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

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

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

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

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

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

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

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

隨著芯片的發(fā)展,Linux內(nèi)核中就包含著越來(lá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è)備樹(shù)文件,從而可精簡(jiǎn)一些臃腫的C代碼。除此之外,.dts編譯生成.dtb文件的過(guò)程要比.c編譯生成驅(qū)動(dòng)模塊、加載驅(qū)動(dòng)模塊的過(guò)程要簡(jiǎn)單很多,也更方便我們進(jìn)行開(kāi)發(fā)。

設(shè)備樹(shù)的語(yǔ)法

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

先看一個(gè)設(shè)備樹(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 種方法來(lái)修改 uart@fe001000 這個(gè) node:

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

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

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

interrupts=<170xc>;

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

clock-frequency=<0x000000010x00000000>;

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

compatible="simple-bus";

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

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

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

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)都支持它,那可以這樣寫(xiě):

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

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

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

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

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

(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ù)來(lái)表示;
size-cells:size要用多少個(gè)32位數(shù)來(lái)表示。

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

下例中,address-cells為1,所以reg中用1個(gè)數(shù)來(lái)表示地址,即用0x80000000來(lái)表示地址;size-cells為1,所以reg中用1個(gè)數(shù)來(lái)表示大小,即用0x20000000表示大?。?/p>

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

(5)reg 屬性

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

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

(7)name 屬性

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

(8)device_type 屬性

過(guò)時(shí)了,建議不用。它的值是字符串,用來(lái)表示節(jié)點(diǎn)的類(lèi)型。在跟platform_driver匹配時(shí),優(yōu)先級(jí)為中。compatible屬性在匹配過(guò)程中,優(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)

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

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

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

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

1、節(jié)點(diǎn)相關(guān)操作函數(shù) Linux 內(nèi)核使用 device_node 結(jié)構(gòu)體來(lái)描述一個(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ù)通過(guò)節(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ù)通過(guò) 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ù)通過(guò) of_device_id 匹配表來(lái)查找指定的節(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ù)通過(guò)路徑來(lái)查找指定的節(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 類(lèi)型的數(shù)組數(shù)據(jù)

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

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

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

    關(guān)注

    88

    文章

    11628

    瀏覽量

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

    關(guān)注

    30

    文章

    4942

    瀏覽量

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

    關(guān)注

    0

    文章

    40

    瀏覽量

    3528

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    關(guān)于六類(lèi)網(wǎng)線(xiàn)一些問(wèn)題的解答

    今天我們就圍繞網(wǎng)友一些常見(jiàn)的關(guān)于六類(lèi)網(wǎng)線(xiàn)的問(wèn)題進(jìn)行一下匯總式解答: 問(wèn) 六類(lèi)網(wǎng)線(xiàn)可以當(dāng)電源用嗎? 答 六類(lèi)網(wǎng)線(xiàn)并不是設(shè)計(jì)用于傳輸電力的電纜,因此般不建議將其用于電源傳輸。 盡管六類(lèi)網(wǎng)線(xiàn)的線(xiàn)芯可以
    的頭像 發(fā)表于 12-09 11:13 ?85次閱讀

    貼片電容精度J±5%的一些詳細(xì)知識(shí)

    貼片電容精度J±5%表示電容的實(shí)際值與標(biāo)稱(chēng)值之間的偏差范圍在±5%以?xún)?nèi) ,以下是關(guān)于貼片電容精度J±5%的一些詳細(xì)知識(shí)、精度等級(jí)含義 J±5% :字母“J”在貼片電容的標(biāo)識(shí)中通常表示標(biāo)稱(chēng)精度
    的頭像 發(fā)表于 11-20 14:38 ?164次閱讀
    貼片電容精度J±5%的<b class='flag-5'>一些</b>詳細(xì)<b class='flag-5'>知識(shí)</b>

    國(guó)民技術(shù)MCU芯片護(hù)航支付寶碰一下設(shè)備創(chuàng)新

    近日,全球頂尖金融科技盛會(huì)Money20/20公布首屆創(chuàng)新大獎(jiǎng)The Money Awards結(jié)果,“支付寶碰一下”從眾多參賽企業(yè)中脫穎而出,憑借創(chuàng)新的解決方案和極致的用戶(hù)體驗(yàn)摘得“支付”類(lèi)別大獎(jiǎng),成為該類(lèi)別中唯的中國(guó)企業(yè)。
    的頭像 發(fā)表于 11-06 10:15 ?815次閱讀

    ARM入門(mén)學(xué)習(xí)方法分享

    的關(guān)鍵。旦你掌握了ARM的基本概念和匯編語(yǔ)言,你可以開(kāi)始進(jìn)行一些簡(jiǎn)單的ARM項(xiàng)目。你可以嘗試編寫(xiě)一些簡(jiǎn)單的程序,如LED閃爍、按鍵輸入等,
    發(fā)表于 07-23 10:21

    極海APM32F407 uc/os3學(xué)習(xí)筆記之任務(wù)管理介紹

    最近了解了uc/os3這個(gè)操作系統(tǒng),上篇介紹了uc/os3如何正確移植到APM32F407開(kāi)發(fā)板上,根據(jù)我最近學(xué)到的一些知識(shí),這篇文章主要介紹一下uc/os3中的一些
    的頭像 發(fā)表于 05-24 14:37 ?802次閱讀
    極海APM32F407 uc/os3<b class='flag-5'>學(xué)習(xí)</b>筆記之任務(wù)管理介紹

    Debian和Ubuntu哪個(gè)好一些?

    兼容性對(duì)比Debian和Ubuntu哪個(gè)好一些,并為您揭示如何通過(guò)RAKsmart服務(wù)器釋放Linux系統(tǒng)的最大潛能。
    的頭像 發(fā)表于 05-07 10:58 ?867次閱讀

    收藏的一些庫(kù)存,直流無(wú)刷技術(shù)+源碼+論文(建議打包)

    這也是我網(wǎng)絡(luò)上淘過(guò)來(lái)收藏的一些資料,免費(fèi)跟大家起分享一下,建議下載哦,收藏不易
    發(fā)表于 03-17 20:17

    請(qǐng)問(wèn)stm32mp257如何修改設(shè)備樹(shù)并加載驅(qū)動(dòng)?

    1、重新編譯kernel容易報(bào)錯(cuò),重新編譯設(shè)備樹(shù)也會(huì)報(bào)錯(cuò)。 2、加載驅(qū)動(dòng),編譯環(huán)境應(yīng)該對(duì)應(yīng),加載不成功。 3、想知道整體比方說(shuō),修改下IO,修改下設(shè)備樹(shù),加入
    發(fā)表于 03-07 08:05

    如何構(gòu)建個(gè)次充電可以運(yùn)行數(shù)月的嵌入式設(shè)備?

    想象一下設(shè)計(jì)個(gè)寵物GPS追蹤器,它需要跟蹤時(shí)間、安排任務(wù)和節(jié)約電力,但保持MCU和GPS全天候活躍將消耗數(shù)小時(shí)的電池。 你如何解決這個(gè)問(wèn)題? ? 僅在必要時(shí)使用RTC喚醒MCU。 ??使用系統(tǒng)
    的頭像 發(fā)表于 03-04 11:25 ?646次閱讀
    如何構(gòu)建<b class='flag-5'>一</b>個(gè)<b class='flag-5'>一</b>次充電可以運(yùn)行數(shù)月的嵌入式<b class='flag-5'>設(shè)備</b>?

    求解答,設(shè)備樹(shù)問(wèn)題

    請(qǐng)問(wèn),rk3588j要再提取個(gè)USB3.0接口設(shè)備樹(shù)怎么改
    發(fā)表于 02-20 11:22

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

    導(dǎo)讀在嵌入式開(kāi)發(fā)和物聯(lián)網(wǎng)應(yīng)用中,Linux系統(tǒng)的串口通信至關(guān)重要。本文將簡(jiǎn)單介紹Linux串口設(shè)備的命名規(guī)則和termios結(jié)構(gòu)體,并解析終端的三種工作模式,幫助開(kāi)發(fā)者更好地掌握Linux串口編程
    的頭像 發(fā)表于 02-06 13:26 ?622次閱讀
    為什么你的串口總是丟<b class='flag-5'>一些</b>特殊字符?

    樹(shù)科技在物聯(lián)網(wǎng)方面

    樹(shù)科技在物聯(lián)網(wǎng)領(lǐng)域有多方面的涉及和發(fā)展,以下是一些具體信息: 傳感器技術(shù)合作 與傳感器公司合作:宇樹(shù)科技與一些傳感器技術(shù)公司有合作,例如奧比中光為宇
    發(fā)表于 02-04 06:48

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹(shù)設(shè)備樹(shù)組成和結(jié)構(gòu)

    前邊講解了內(nèi)核編譯選項(xiàng)的配置,這節(jié)我們?cè)敿?xì)講一下設(shè)備樹(shù)。設(shè)備樹(shù)知識(shí)是Linux驅(qū)動(dòng)開(kāi)發(fā)人員必
    發(fā)表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹(shù)設(shè)備樹(shù)組成和結(jié)構(gòu)

    前邊講解了內(nèi)核編譯選項(xiàng)的配置,這節(jié)我們?cè)敿?xì)講一下設(shè)備樹(shù)。設(shè)備樹(shù)知識(shí)是Linux驅(qū)動(dòng)開(kāi)發(fā)人員必
    發(fā)表于 01-07 09:16

    “碰一下”支付背后的4G技術(shù)

    不知道你是否有留意,近期,在線(xiàn)下支付場(chǎng)景中,多了個(gè)支付寶“碰一下”支付的設(shè)備,只需要“解鎖手機(jī)—碰一下—確認(rèn)”即可完成支付,對(duì)比打開(kāi)付款碼支付,步驟確實(shí)更加簡(jiǎn)潔。
    的頭像 發(fā)表于 01-03 16:27 ?5016次閱讀