讀取節點屬性的函式 常用OF API

2021-07-05 20:03:56 字數 4822 閱讀 2348

在linux的bsp和驅動**中,還經常會使用到linux中一組device tree的api,這些api通常被冠以of_字首,它們的實現**位於核心的drivers/of目錄。這些常用的api包括:

一、

int of_device_is_compatible(const struct device_node *device,const char *compat);

判斷裝置結點的compatible 屬性是否包含compat指定的字串。當乙個驅動支援2個或多個裝置的時候,這些不同.dts檔案中裝置的compatible 屬性都會進入驅動 of匹配表。因此驅動可以透過bootloader傳遞給核心的device tree中的真正結點的compatible 屬性以確定究竟是哪一種裝置,從而根據不同的裝置型別進行不同的處理。如drivers/pinctrl/pinctrl-sirf.c即相容於"sirf,prima2-pinctrl",又相容於"sirf,prima2-pinctrl",在驅動中就有相應分支處理:

[cpp]view plain

copy

1682 

if(of_device_is_compatible(np, 

"sirf,marco-pinctrl"

))  

1683      is_marco = 1;  

二。

struct device_node *of_find_compatible_node(struct device_node *from,

const char *type, const char *compatible);

根據compatible屬性,獲得裝置結點。遍歷device tree中所有的裝置結點,看看哪個結點的型別、compatible屬性與本函式的輸入引數匹配,大多數情況下,from、type為null。 三。

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);

讀取裝置結點np的屬性名為propname,型別為8、16、32、64位整型陣列的屬性。對於32位處理器來講,最常用的是of_property_read_u32_array()。如在arch/arm/mm/cache-l2x0.c中,透過如下語句讀取l2 cache的"arm,data-latency"屬性:

[cpp]view plain

copy

534         of_property_read_u32_array(np, 

"arm,data-latency"

,  535                                    data, array_size(data));  

在arch/arm/boot/dts/vexpress-v2p-ca9.dts中,含有"arm,data-latency"屬性的l2 cache結點如下:

[cpp]view plain

copy

137         l2: cache-controller@1e00a000   

有些情況下,整形屬性的長度可能為1,於是核心為了方便呼叫者,又在上述api的基礎上封裝出了更加簡單的讀單一整形屬性的api,它們為int of_property_read_u8()、of_property_read_u16()等,實現於include/linux/of.h:

[cpp]view plain

copy

513 

static

inline

intof_property_read_u8(

const

struct

device_node *np,  

514                                        const

char

*propname,  

515                                        u8 *out_value)  

516   

519  

520 static

inline

intof_property_read_u16(

const

struct

device_node *np,  

521                                        const

char

*propname,  

522                                        u16 *out_value)  

523   

526  

527 static

inline

intof_property_read_u32(

const

struct

device_node *np,  

528                                        const

char

*propname,  

529                                        u32 *out_value)  

530   

四。

int of_property_read_string(struct device_node *np, const char

*propname, const char **out_string);

int of_property_read_string_index(struct device_node *np, const char

*propname, int index, const char **output);

前者讀取字串屬性,後者讀取字串陣列屬性中的第index個字串。如drivers/clk/clk.c中的of_clk_get_parent_name()透過of_property_read_string_index()遍歷clkspec結點的所有"clock-output-names"字串陣列屬性。

[cpp]view plain

copy

1759 

const

char

*of_clk_get_parent_name(

struct

device_node *np, 

intindex)  

1760   

1781 export_symbol_gpl(of_clk_get_parent_name);  

五。

static inline bool of_property_read_bool(const struct device_node *np,

const char *propname);

如果裝置結點np含有propname屬性,則返回true,否則返回false。一般用於檢查空屬性是否存在。

六。

void __iomem *of_iomap(struct device_node *node, int index);

通過裝置結點直接進行裝置記憶體區間的 ioremap(),index是記憶體段的索引。若裝置結點的reg屬性有多段,可通過index標示要ioremap的是哪一段,只有1段的情況,index為0。採用device tree後,大量的裝置驅動通過of_iomap()進行對映,而不再通過傳統的ioremap。

七。

unsigned int irq_of_parse_and_map(struct device_node *dev, int index);

透過device tree或者裝置的中斷號,實際上是從.dts中的interrupts屬性解析出中斷號。若裝置使用了多個中斷,index指定中斷的索引號。

還有一些of api,這裡不一一枚舉,具體可參考include/linux/of.h標頭檔案。

js 常用的節點和屬性

childnodes 獲取所有的子節點 children 獲取所有的元素子節點 parentnode 獲取父親節點 previoussibling 獲取上乙個哥哥節點 nextsibling 獲取下乙個弟弟節點 firstchild 獲取所有的子節點中的第乙個 lastchild 獲取所有子節點中的...

節點物件的屬性

1.取得某節點下的某屬性 element root document.getrootelement 屬性名name attribute attribute root.attribute size 2.取得屬性的文字 string text attribute.gettext 3.刪除某屬性 attr...

JavaScript 節點的屬性

節點的屬性 序號屬性名稱 功能childnodes 得到節點的所有子節點,已陣列的形式儲存 firstchild 得到節點的第乙個子節點 等價於 childnodes 0 lastchild 得到節點的最後乙個子節點 parentnode 得到節點的父節點 nextsibling 得到後乙個兄弟節點...