Linux設(shè)備驅(qū)動(dòng)統(tǒng)一模型解析
soc節(jié)點(diǎn)指定了<0x0 0xe0000000 0x00100000>;此屬性值指定對(duì)于1024KB范圍的地址空間,在物理0x0處尋址的子節(jié)點(diǎn)映射到物理0xe0000000的父地址。通過(guò)這種映射,串行設(shè)備節(jié)點(diǎn)可以通過(guò)0xe0004600地址的加載或存儲(chǔ)、0x4600(在注冊(cè)表中指定)的偏移量以及范圍中指定的0xe0000000映射尋址。
dma-ranges屬性名稱dma-ranges值類型<empty>或編碼為任意數(shù)量的(子總線地址、父總線地址、長(zhǎng)度)三聯(lián)體描述dma-range屬性用于描述存儲(chǔ)器映射總線的直接存儲(chǔ)器訪問(wèn)(dma)結(jié)構(gòu),其設(shè)備樹(shù)父級(jí)可以從總線的dma操作訪問(wèn)。它提供了一種定義總線物理地址空間與總線父級(jí)物理地址空間之間映射或轉(zhuǎn)換的方法。dma-range屬性的值的格式是任意數(shù)量的(子總線地址、母線地址、長(zhǎng)度)。指定的每個(gè)三聯(lián)體描述連續(xù)DMA地址范圍。1. 子總線地址是子總線地址空間內(nèi)的物理地址。表示地址的單元格數(shù)取決于總線,可以通過(guò)該節(jié)點(diǎn)(dma-range屬性出現(xiàn)的節(jié)點(diǎn))的#address-cells地址單元格確定。2. 父總線地址是父總線地址空間中的物理地址。表示父地址的單元格數(shù)取決于總線,可以通過(guò)定義父地址空間的節(jié)點(diǎn)的#address-cells屬性確定。3. 長(zhǎng)度指定子地址空間中范圍的大小。表示大小的單元格數(shù)量可以根據(jù)該節(jié)點(diǎn)(dma-range屬性出現(xiàn)的節(jié)點(diǎn))的#size-cells確定。Name(已棄用)屬性名稱name值類型<string>描述name屬性用于記錄節(jié)點(diǎn)名字,name屬性已經(jīng)被棄用 ,不推薦使用 name屬性,一些老的設(shè)備樹(shù)文件可能會(huì)使用此屬性。device_type屬性名稱device_type值類型<string>描述由于DTS沒(méi)有FCode,因此不建議使用該屬性。只能用于在cpu節(jié)點(diǎn)和memory節(jié)點(diǎn)中,以便與IEEE 1275衍生設(shè)備兼容。1.3.4. 基本設(shè)備節(jié)點(diǎn)類型
所有設(shè)備樹(shù)文件均要包含一個(gè)根文件,并且所有設(shè)備樹(shù)文件均應(yīng)在根節(jié)點(diǎn)下存在以下節(jié)點(diǎn):
1個(gè)/cpus節(jié)點(diǎn)至少一個(gè)/memory節(jié)點(diǎn)
使用說(shuō)明:R = 必需,O = 可選,OR = 可選但推薦,SD = 參見(jiàn)定義,所有其他的標(biāo)準(zhǔn)屬性均可接受,但可選
1.3.4.1. Root node
devicetree有一個(gè)單獨(dú)的根節(jié)點(diǎn),所有其他設(shè)備節(jié)點(diǎn)都是它的后代。根節(jié)點(diǎn)的完整路徑為/。
屬性名稱使用說(shuō)明類型定義#address-cellsR<u32>root子節(jié)點(diǎn)的reg property地址格式。#size-cellsR<u32>root子節(jié)點(diǎn)的reg property大小格式。modelR<string>指定唯一標(biāo)識(shí)。系統(tǒng)板型號(hào)。推薦格式為“制造商,型號(hào)”compatibleR<stringlist>指定平臺(tái)體系結(jié)構(gòu)列表。該平臺(tái)兼容。這一建議可供操作系統(tǒng)在選擇平臺(tái)特定代碼時(shí)使用。1.3.4.2. /aliases節(jié)點(diǎn)
設(shè)備樹(shù)文件可能具有一個(gè)別名節(jié)點(diǎn)(/aliases),該節(jié)點(diǎn)定義一個(gè)或多個(gè)別名屬性。別名節(jié)點(diǎn)應(yīng)位于設(shè)備樹(shù)的根節(jié)點(diǎn),并且具有節(jié)點(diǎn)名稱/別名。/aliases節(jié)點(diǎn)的每個(gè)屬性都定義了一個(gè)別名。屬性名稱指定別名。屬性值指定設(shè)備樹(shù)中節(jié)點(diǎn)的完整路徑。例如,屬性serial0 = "/simple-bus@fe000000/serial@llc500"定義了別名serial0。別名的命名規(guī)則如下:
字符描述0-9數(shù)字a-z小寫(xiě)字母-破折號(hào)1.3.4.3. /memory節(jié)點(diǎn)
所有設(shè)備樹(shù)都需要內(nèi)存設(shè)備節(jié)點(diǎn),并描述系統(tǒng)的物理內(nèi)存布局。如果系統(tǒng)具有多個(gè)范圍的內(nèi)存,則可以創(chuàng)建多個(gè)內(nèi)存節(jié)點(diǎn),或者可以在單個(gè)內(nèi)存節(jié)點(diǎn)的reg屬性中指定范圍。
/memory節(jié)點(diǎn)的屬性要求如下:
屬性名稱使用說(shuō)明類型定義device_typeRO<string>regR<prop-encoded-array>由任意數(shù)量的地址和大小對(duì)組成,它們指定內(nèi)存范圍的物理地址和大小initial-mapped-areaO<prop-encoded-array>指定”初始映射區(qū)域”的地址和大小,是一個(gè)由三元組組成的屬性編碼數(shù)組(有效地址、物理地址、大。S行Ш臀锢淼刂肪鶓(yīng)為64位(值),大小應(yīng)為32位(值)
在xxx.dts中
memory {
reg = <0x40000000 0x10000000>; 起始地址0x40000000 長(zhǎng)度0x10000000(32MB)
};
1.3.4.4. /chosen 節(jié)點(diǎn)
/chosen 節(jié)點(diǎn)不代表系統(tǒng)中的實(shí)際設(shè)備,而是描述了在運(yùn)行時(shí)由系統(tǒng)固件選擇或指定的參數(shù)。它應(yīng)該是根節(jié)點(diǎn)的子節(jié)點(diǎn)。
屬性名稱使用說(shuō)明類型定義bootargsO<string>指定程序的啟動(dòng)參數(shù)。如果不需要引導(dǎo)參數(shù),則該值可能為空字符串stdout-pathO<string>指定到表示用于引導(dǎo)控制臺(tái)輸出的設(shè)備的節(jié)點(diǎn)的完整路徑。如果包含’:’,則它將終止路徑。該值可以是別名。stdin-pathO<string>指定到表示用于引導(dǎo)控制臺(tái)輸入的設(shè)備的節(jié)點(diǎn)的完整路徑。如果包含’:’,則它將終止路徑。該值可以是別名。
示例:
chosen {
bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
};
1.3.4.5. /cpus節(jié)點(diǎn)屬性
所有設(shè)備樹(shù)均需要/cpus/cpu節(jié)點(diǎn)。它并不代表系統(tǒng)中的真實(shí)設(shè)備,而是作為代表系統(tǒng)cpu的子cpu節(jié)點(diǎn)的容器。
屬性名稱使用說(shuō)明類型定義device_typeR<string>值應(yīng)為“cpu”regR<prop-encoded-array>它為CPU節(jié)點(diǎn)表示的CPU/線程定義了唯一的CPU/線程ID。如果CPU支持多線程,則reg是一個(gè)數(shù)組,每個(gè)線程具有一個(gè)元素。clock-frequencyR<prop-encoded-array>以Hz為單位指定CPU的當(dāng)前時(shí)鐘速度,格式可以是,或timebase-frequencyR<prop-encoded-array>指定更新時(shí)基的當(dāng)前頻率statusSD<string>此屬性應(yīng)存在于對(duì)稱多進(jìn)程(SMP)CPU的節(jié)點(diǎn)中 配置!眔kay”:CPU正在運(yùn)行;”disable”:CPU處于靜止?fàn)顟B(tài)。1.3.5. 中斷映射
在設(shè)備樹(shù)中,存在邏輯中斷樹(shù),該邏輯中斷樹(shù)表示平臺(tái)硬件中斷的層次結(jié)構(gòu)和路由。在設(shè)備樹(shù)中,使用interrupt-parent屬性表示中斷源與中斷控制器的物理連線。代表產(chǎn)生中斷的設(shè)備節(jié)點(diǎn)包含一個(gè)中斷父屬性,該屬性具有一個(gè)虛擬值,指向給設(shè)備的中斷所路由到的設(shè)備(通常是中斷控制器)。
如果產(chǎn)生中斷的設(shè)備不具有中斷父屬性,則假定其中斷父節(jié)點(diǎn)為其設(shè)備父節(jié)點(diǎn)。每個(gè)中斷產(chǎn)生設(shè)備都包含一個(gè)中斷屬性,該屬性的值描述該設(shè)備的一個(gè)或多個(gè)中斷源。每個(gè)源都用稱為中斷描述符表示。中斷描述符的格式和含義是特定于中斷域的,即,取決于中斷域根節(jié)點(diǎn)上節(jié)點(diǎn)的屬性。中斷域的根使用#interrupt-cells屬性定義對(duì)中斷描述符進(jìn)行編碼所需的值數(shù)量。
中斷域是解釋中斷描述符的上下文。中斷域的根可以是中斷控制器(interrupt controller)或中斷連接器(interrupt nexus):
中斷控制器是物理設(shè)備,需要一個(gè)驅(qū)動(dòng)程序來(lái)處理通過(guò)它路由的中斷。它還可能級(jí)聯(lián)到另一個(gè)中斷域。中斷控制器由設(shè)備樹(shù)中該節(jié)點(diǎn)上的interrupt-controller指定。中斷連接器定義了一個(gè)中斷域和另一個(gè)中斷域之間的轉(zhuǎn)換。翻譯基于特定領(lǐng)域和總線的信息。使用interrupt-map屬性在域之間進(jìn)行轉(zhuǎn)換。例如,PCI控制器設(shè)備節(jié)點(diǎn)可以是一個(gè)中斷連接器,定義從PCI中斷命名空間(INTA、INTB等)到具有中斷請(qǐng)求(IRQ)編號(hào)的中斷控制器的轉(zhuǎn)換。
1.3.5.1. Interrupts屬性名稱interrupts值類型<prop-encoded-array>編碼為任意數(shù)量的中斷描述符描述設(shè)備節(jié)點(diǎn)的中斷屬性定義設(shè)備生成的中斷。interrupts屬性的值由任意數(shù)量的中斷描述符組成。中斷描述符的格式由中斷域根定義。
示例:
interrupts = <GIC_SPI INT_DMA IRQ_TYPE_LEVEL_HIGH>;
1.3.5.2. interrupt-parent屬性名稱interrupt-parent值類型<phandle>描述由于中斷樹(shù)中節(jié)點(diǎn)的層次結(jié)構(gòu)可能與device tree不匹配,因此interrupt-parent屬性可用于明確中斷父級(jí)的定義。該值是中斷父級(jí)的phandle。如果設(shè)備缺少此屬性,則假定其中斷父級(jí)為其設(shè)備樹(shù)父級(jí)。
示例:
interrupt-parent = <&gpe>;
1.3.5.3. interrupts-extended屬性名稱interrupts-extended值類型<phandle>描述擴(kuò)展的中斷屬性列出了設(shè)備產(chǎn)生的中斷。當(dāng)設(shè)備連接到多個(gè)中斷控制器時(shí),應(yīng)該使用interrupts-extended代替interrupts,因?yàn)樗鼤?huì)在每一個(gè)中斷描述符編碼一個(gè)父代phandle
示例:
interrupts-extended = <&pic 0xA 8>, <&gic 0xda>;
1.3.5.4. #interrupt-cells屬性名稱#interrupt-cells值類型<u32>描述#interrupt-cells屬性定義對(duì)中斷域的中斷描述符進(jìn)行編碼所需的單元數(shù)量1.3.5.5. interrupt-controller屬性名稱interrupt-controller值類型<empty>描述中斷控制器屬性的存在將節(jié)點(diǎn)定義為中斷控制器節(jié)點(diǎn)。1.4.Device Tree binary格式
Devicetree Blob (DTB)格式是Devicetree數(shù)據(jù)的平面二進(jìn)制編碼。它用來(lái)在軟件程序之間交換設(shè)備數(shù)據(jù)。例如,在引導(dǎo)操作系統(tǒng)時(shí),固件將向操作系統(tǒng)內(nèi)核傳遞一個(gè)DTB。
DTB格式將devicetree數(shù)據(jù)編碼為一個(gè)單一的、線性的、無(wú)指針的數(shù)據(jù)結(jié)構(gòu)。它由一個(gè)小標(biāo)題組成,接下來(lái)是三個(gè)大小可變的部分:內(nèi)存保留塊、結(jié)構(gòu)塊和字符串塊這些應(yīng)該按照這個(gè)順序出現(xiàn)在扁平的devicetree中。
因此。當(dāng)按地址加載到內(nèi)存中時(shí),設(shè)備樹(shù)結(jié)構(gòu)作為一個(gè)整體。將類似于圖中的圖表。
1.4.1. dt_h(yuǎn)eader
設(shè)備樹(shù)的頭部是由以下C結(jié)構(gòu)體定義的。所有字段都是32位整數(shù),以big-endian格式存儲(chǔ)。
struct fdt_h(yuǎn)eader {
此字段應(yīng)包含值0xd00dfeed(big-endian)
uint32_t magic; magic word FDT_M(jìn)AGIC
此字段應(yīng)包含設(shè)備數(shù)據(jù)結(jié)構(gòu)的總大。ㄗ止(jié))。該大小應(yīng)包含結(jié)構(gòu)的所有部分:報(bào)頭、內(nèi)存預(yù)留塊、結(jié)構(gòu)塊和字符串塊,以及塊之間或最終塊之后的自由空間間隙。
uint32_t totalsize; total size of DT block
此字段應(yīng)包含結(jié)構(gòu)塊從標(biāo)題開(kāi)始的字節(jié)偏移
uint32_t off_dt_struct; offset to structure
此字段應(yīng)包含從標(biāo)題開(kāi)始的字符串塊的字節(jié)偏移量
uint32_t off_dt_strings; offset to strings
此字段應(yīng)包含從標(biāo)題開(kāi)始的內(nèi)存保留塊的字節(jié)偏移量
uint32_t off_mem_rsvmap; offset to memory reserve map
此字段應(yīng)包含設(shè)備數(shù)據(jù)結(jié)構(gòu)的版本
uint32_t version; format version
此字段應(yīng)包含設(shè)備所用版本向后兼容的最低版本數(shù)據(jù)結(jié)構(gòu)
uint32_t last_comp_version; last compatible version
version 2 fields below
此字段應(yīng)包含系統(tǒng)引導(dǎo)CPU的物理ID。它應(yīng)與設(shè)備樹(shù)中CPU節(jié)點(diǎn)的reg屬性中給定的物理ID相同
uint32_t boot_cpuid_phys; Which physical CPU id we're booting on
version 3 fields below
此字段應(yīng)包含字符串塊部分的字節(jié)長(zhǎng)度
uint32_t size_dt_strings; size of the strings block
version 17 fields below
此字段應(yīng)包含結(jié)構(gòu)塊部分的字節(jié)長(zhǎng)度
uint32_t size_dt_struct; size of the structure block
};
1.4.2. memory reservation block
內(nèi)存保留塊向客戶端程序提供物理內(nèi)存中被保留的區(qū)域的列表,這些內(nèi)存不用于一般的內(nèi)存分配,目的是保護(hù)重要的數(shù)據(jù)結(jié)構(gòu)不被客戶端程序覆蓋。這個(gè)區(qū)域包括了若干的reserve memory描述符。每個(gè)reserve memory描述符是由address和size組成。其中address和size都是用U64來(lái)描述:
struct fdt_reserve_entry {
uint64_t address;
uint64_t size;
};
1.4.3. Structure block
結(jié)構(gòu)塊描述了設(shè)備樹(shù)本身的結(jié)構(gòu)和內(nèi)容。它由若干的分片組成,每個(gè)分片開(kāi)始位置都是保存了令牌(token),以此來(lái)描述該分片的屬性和內(nèi)容。
FDT_BEGIN_NODE (0x00000001):該token描述了一個(gè)node的開(kāi)始位置,緊挨著該token的就是node name(包括unit address)FDT_END_NODE (0x00000002):該token描述了一個(gè)node的結(jié)束位置FDT_PROP (0x00000003):該token描述了一個(gè)property的開(kāi)始位置,該token之后是兩個(gè)u32的數(shù)據(jù)。它們之后就是長(zhǎng)度為len的具體的屬性值數(shù)據(jù)。struct {
uint32_t len; 表示該property value data的size。
uint32_t nameoff; 表示該屬性字符串在device tree strings block的偏移值
}
FDT_NOP (0x00000004):被解析設(shè)備樹(shù)的程序忽略,可用于覆蓋其他屬性,以刪除它FDT_END (0x00000009):標(biāo)記結(jié)構(gòu)塊的結(jié)束所以,一個(gè)DTB的結(jié)構(gòu)塊可能如下:(optionally) any number of FDT_NOP tokens
FDT_BEGIN_NODE token:
--node’s name
--paddings
For each property of the node:
--FDT_NOP(optionally)
--FDT_PROP token
--property
all child nodes in this format
(optionally) any number of FDT_NOP tokens
FDT_END_NODE token
1.4.4. Strings Block
定義了各個(gè)node中使用的屬性的字符串表。由于很多屬性會(huì)出現(xiàn)在多個(gè)node中,因此,所有的屬性字符串組成了一個(gè)string block。這樣可以壓縮DTB的size。
1.5.Linux解析設(shè)備樹(shù)
設(shè)備樹(shù)描述了設(shè)備的詳細(xì)信息,這些信息包括數(shù)字類型的、字符串類型的、數(shù)組類型的,我們?cè)诰帉?xiě)驅(qū)動(dòng)時(shí)需要去獲取這些信息。Linux內(nèi)核提供一系列以of_開(kāi)頭的函數(shù)來(lái)獲取設(shè)備樹(shù)信息,這些函數(shù)的原型都定義在include/linux/of.h中。設(shè)備以節(jié)點(diǎn)的形式掛在設(shè)備樹(shù)上,Linux內(nèi)核使用device_node結(jié)構(gòu)體來(lái)描述一個(gè)節(jié)點(diǎn),其定義在include/linux/of.h中:
struct device_node {
const char *name; device node name
const char *type; 對(duì)應(yīng)device_type的屬性
phandle phandle; 對(duì)應(yīng)該節(jié)點(diǎn)的phandle屬性
const char *full_name; 從“/”開(kāi)始的,表示該node的full path
Struct property *properties; 該節(jié)點(diǎn)的屬性列表
如果需要?jiǎng)h除某些屬性,kernel并非真的刪除,而是掛入到deadprops的列表
struct property *deadprops; removed properties
parent、child以及sibling將所有的device node連接起來(lái)
Struct device_node *parent;
Struct device_node *child;
Struct device_node *sibling;
通過(guò)該指針可以獲取相同類型的下一個(gè)node
Struct device_node *next; next device of same type
通過(guò)該指針可以獲取node global list下一個(gè)node
struct device_node *allnext; next in list of all nodes
struct kobject kobj;
unsigned long _flags;
void *data;
#if defined(CONFIG_SPARC)
const char *path_component_name;
unsigned int unique_id;
struct of_irq_controller *irq_trans;
#endif
};
1.5.1. 查找節(jié)點(diǎn)的 OF函數(shù)1.5.1.1. of_find_node_by_name
功能 :Find a node by its "name" property函數(shù)
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name)
參數(shù) :
@from:開(kāi)始查找的節(jié)點(diǎn),如果為NULL表示從根節(jié)點(diǎn)開(kāi)始查找整個(gè)設(shè)備樹(shù)。
@name::要查找的節(jié)點(diǎn)名字。
返回值: 找到的節(jié)點(diǎn),如果為NULL表示查找失敗。
1.5.1.2. of_find_node_by_path
功能 :Find a node matching a full OF path函數(shù) :
struct device_node *of_find_node_by_path(const char *path)
參數(shù) :@path: 完整的匹配路徑返回值 :找到的節(jié)點(diǎn),如果為NULL表示查找失敗。
1.5.1.3. of_find_node_by_type
功能 Find a node by its "device_type" property函數(shù)
struct device_node *of_find_node_by_type(struct device_node *from,
const char *type)
參數(shù)
@from:開(kāi)始查找的節(jié)點(diǎn),如果為NULL表示從根節(jié)點(diǎn)開(kāi)始查找整個(gè)設(shè)備樹(shù)
@type: 要查找的節(jié)點(diǎn)類型
返回值 找到的節(jié)點(diǎn),如果為NULL表示查找失敗。
1.5.1.4. of_find_compatible_node
功能 通過(guò)device_type和compatible查找指定節(jié)點(diǎn)函數(shù)
struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compatible)
參數(shù)
@from:開(kāi)始查找的節(jié)點(diǎn),如果為NULL表示從根節(jié)點(diǎn)開(kāi)始查找整個(gè)設(shè)備樹(shù)
@type: 要查找的節(jié)點(diǎn)device_type屬性
@compatible:節(jié)點(diǎn)的compatible屬性列表
返回值 找到的節(jié)點(diǎn),如果為NULL表示查找失敗。
1.5.1.5. of_find_node_with_property
功能 通過(guò)屬性名查找指定節(jié)點(diǎn)函數(shù)
struct device_node *of_find_node_with_property(struct device_node *from,const char *prop_name)
參數(shù)
@from:開(kāi)始查找的節(jié)點(diǎn),如果為NULL表示從根節(jié)點(diǎn)開(kāi)始查找整個(gè)設(shè)備樹(shù)
@type: 要查找的節(jié)點(diǎn)屬性名稱
返回值 找到的節(jié)點(diǎn),如果為NULL表示查找失敗。
1.5.2. 查找父 /子節(jié)點(diǎn)的 OF函數(shù)1.5.2.1. of_get_parent
功能 函數(shù)用于獲取指定節(jié)點(diǎn)的父節(jié)點(diǎn)(如果有父節(jié)點(diǎn)的話 )函數(shù)
struct device_node *of_get_parent(const struct device_node *node)
參數(shù)
@node:要查找父節(jié)點(diǎn)的節(jié)點(diǎn)
返回值 找到的父節(jié)點(diǎn)
1.5.2.2. of_get_next_available_child
功能 獲取子節(jié)點(diǎn),并跳過(guò)status = "disabled"的節(jié)點(diǎn)函數(shù)
struct device_node *of_get_next_available_child(const struct device_node *node,struct device_node *prev)
參數(shù)
@node: 父節(jié)點(diǎn)
@prev:當(dāng)前父節(jié)點(diǎn)的上一個(gè)子節(jié)點(diǎn), 如果為空,則獲取第一個(gè)子節(jié)點(diǎn)
返回值 找到的子節(jié)點(diǎn)
1.5.3. 提取屬性值的 OF函數(shù)
Linux內(nèi)核使用struct property來(lái)保存節(jié)點(diǎn)的屬性,其定義在/include/linux/of.h中:
struct property {
char *name; 屬性的名稱
int length; 屬性的長(zhǎng)度
void *value; 屬性的值
struct property *next; 下一個(gè)屬性
unsigned long _flags;
unsigned int unique_id;
struct bin_attribute attr;
};
1.5.3.1. of_find_property
功能 尋找指定的屬性函數(shù)
struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp)
參數(shù)
@np: 設(shè)備節(jié)點(diǎn)
@name:屬性名稱
@lenp:屬性的字節(jié)數(shù)
返回值 找到的屬性
1.5.3.2. 讀取屬性中u8、u16、u32和u64類型的數(shù)組數(shù)據(jù)
當(dāng)設(shè)置sz為1時(shí),就是讀取一個(gè)數(shù)據(jù),Linux內(nèi)核也是這么封裝的。
int of_property_read_u8_array(const struct device_node *np,
const char *propname, u8 *out_values, size_t sz)
int of_property_read_u16_array(const struct device_node *np,
const char *propname, u16 *out_values, size_t sz)
int of_property_read_u32_array(const struct device_node *np,
const char *propname, u32 *out_values,size_t sz)
int of_property_read_u64(const struct device_node *np, const char *propname,
u64 *out_value)
1.5.3.3. of_property_read_string
功能 找到并讀取屬性字符串函數(shù)
int of_property_read_string(struct device_node *np, const char *propname,const char **out_string)
參數(shù)
@np: 設(shè)備節(jié)點(diǎn)
@propname:屬性名稱
@out_string:讀取的字符串
返回值
0:讀取成功
-EINVAL:屬性不存在
-ENODATA:屬性沒(méi)有這個(gè)值
-EILSEQ:字符串不是以空字符’’結(jié)尾
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專題
- 1 【一周車話】沒(méi)有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開(kāi)啟變現(xiàn)競(jìng)速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫(xiě)人類歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市