在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 得到後乙個兄弟節點...