裝置樹介面

2021-09-28 21:06:14 字數 4874 閱讀 4280

裝置樹of的api介面

① kernel入口處獲取到uboot傳過來的.dtb映象的基位址

② 通過early_init_dt_scan()函式來獲取kernel初始化時需要的bootargs和cmd_line等系統引導引數。

③ 呼叫unflatten_device_tree函式來解析dtb檔案,構建乙個由device_node結構連線而成的單向鍊錶,並使用全域性變數of_allnodes儲存這個鍊錶的頭指標。

④ 核心呼叫of的api介面,獲取of_allnodes鍊錶資訊來初始化核心其他子系統、裝置等。

of的介面

函式在/drivers/of/目錄下,有of_i2c.c、of_mdio.c、of_mtd.c、adress.c等等

這裡將列出幾個常用的api介面。

用來查詢在dtb中的根節點

unsigned long __init of_get_flat_dt_root(void)

根據deice_node結構的full_name引數,在全域性鍊錶of_allnodes中,查詢合適的device_node

struct device_node *of_find_node_by_path(const char *path)

例如:struct device_node *cpus;

cpus=of_find_node_by_path("/cpus");

若from=null,則在全域性鍊錶of_allnodes中根據name查詢合適的device_node

struct device_node *of_find_node_by_name(struct device_node *from,const char *name)

例如:struct device_node *np;

np = of_find_node_by_name(null,「firewire」);

根據裝置型別查詢相應的device_node

struct device_node *of_find_node_by_type(struct device_node *from,const char *type)

例如:struct device_node *tsi_pci;

tsi_pci= of_find_node_by_type(null,「pci」);

根據compatible字串查詢device_node

struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compatible)

根據節點屬性的name查詢device_node

struct device_node *of_find_node_with_property(struct device_node *from,const char *prop_name)

根據phandle查詢device_node

struct device_node *of_find_node_by_phandle(phandle handle)

根據alias的name獲得裝置id號

int of_alias_get_id(struct device_node *np, const char *stem)

device node計數增加/減少

struct device_node *of_node_get(struct device_node *node)

void of_node_put(struct device_node *node)

根據property結構的name引數,在指定的device node中查詢合適的property

struct property *of_find_property(const struct device_node *np,const char *name,int *lenp)

根據property結構的name引數,返回該屬性的屬性值

const void *of_get_property(const struct device_node *np, const char *name,int *lenp)

根據compat引數與device node的compatible匹配,返回匹配度

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

獲得父節點的device node

struct device_node *of_get_parent(const struct device_node *node)

將matches陣列中of_device_id結構的name和type與device node的compatible和type匹配,返回匹配度最高的of_device_id結構

const struct of_device_id *of_match_node(const struct of_device_id *matches,const struct device_node *node)

根據屬性名propname,讀出屬性值中的第index個u32數值給out_value

int of_property_read_u32_index(const struct device_node *np,const char *propname,u32 index, u32 *out_value)

根據屬性名propname,讀出該屬性的陣列中sz個屬性值給out_values

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)

根據屬性名propname,讀出該屬性的u64屬性值

int of_property_read_u64(const struct device_node *np, const char *propname,u64 *out_value)

根據屬性名propname,讀出該屬性的字串屬性值

int of_property_read_string(struct device_node *np, const char *propname,const char **out_string)

根據屬性名propname,讀出該字串屬性值陣列中的第index個字串

int of_property_read_string_index(struct device_node *np, const char *propname,int index, const char **output)

讀取屬性名propname中,字串屬性值的個數

int of_property_count_strings(struct device_node *np, const char *propname)

讀取該裝置的第index個irq號

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

讀取該裝置的第index個irq號,並填充乙個irq資源結構體

int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)

獲取該裝置的irq個數

int of_irq_count(struct device_node *dev)

獲取裝置暫存器位址,並填充暫存器資源結構體

int of_address_to_resource(struct device_node *dev, int index,struct resource *r)

const __be32 *of_get_address(struct device_node *dev, int index, u64 *size,unsigned int *flags)

獲取經過對映的暫存器虛擬位址

void __iomem *of_iomap(struct device_node *np, int index)

根據device_node查詢返回該裝置對應的platform_device結構

struct platform_device *of_find_device_by_node(struct device_node *np)

根據device node,bus id以及父節點建立該裝置的platform_device結構

struct platform_device *of_device_alloc(struct device_node *np,const char *bus_id,struct device *parent)

static struct platform_device *of_platform_device_create_pdata(struct device_node *np,const char *bus_id,

void *platform_data,struct device *parent)

遍歷of_allnodes中的節點掛接到of_platform_bus_type匯流排上,由於此時of_platform_bus_type匯流排上還沒有驅動,所以此時不進行匹配

int of_platform_bus_probe(struct device_node *root,const struct of_device_id *matches,struct device *parent)

參考:

linux裝置樹(裝置驅動)

一 裝置樹的簡單概念 裝置樹 由一系列的節點,屬性組成,節點本身包含子節點 屬性 成對出現的名稱和值 裝置樹可描述的資訊 原先大多數被編碼在核心中 它是電路板上cpu,匯流排,裝置組成的樹,bootloader會將這棵樹傳遞給核心,並根據它展開linux核心中的platform device等裝置。...

裝置樹學習(二)(裝置樹的規範)

dts v1 memory reservations 格式為 memreserve 從上面檔案布局我們能看到大概分為以下幾部分,我們依次介紹 1 dts v1 表示dts檔案的版本 2 memory reservations 格式為 memreserve 表示留給自己使用的記憶體。即核心不能使用這部...

裝置樹詳解

在linux3.x版本後,arch arm plat 和arch arm mach 中,描述板級細節的 比如platform device i2c board info等 被大量取消,取而代之的是裝置樹,其目錄位於arch arm boot dts 1個dts檔案 n個dtsi檔案,它們編譯而成的d...