Linux核心 裝置樹操作常用API

2021-09-25 05:14:22 字數 4914 閱讀 9521

核心中用下面的這個結構描述裝置樹中的乙個節點,後面的api都需要乙個device_node物件作為引數傳入。

//include/of.h

struct device_node ;

struct device_node

--47-->節點名

--48-->裝置型別

--50-->全路徑節點名

--54-->父節點指標

--55-->子節點指標

/**

* of_find_compatible_node - 通過compatible屬性查詢指定節點

* @from - 指向開始路徑的節點,如果為null,則從根節點開始

* @type - device_type裝置型別,可以為null

* @compat - 指向節點的compatible屬性的值(字串)的首位址

*/struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compat);

/**

* of_find_matching_node - 通過compatible屬性查詢指定節點

* @from - 指向開始路徑的節點,如果為null,則從根節點開始

* @matches - 指向裝置id表,注意id表必須以null結束

* 範例: const struct of_device_id mydemo_of_match = ,

{}};

*/struct device_node *of_find_matching_node(struct device_node *from,const struct of_device_id *matches);

/**

* of_find_node_by_path - 通過路徑查詢指定節點

* @path - 帶全路徑的節點名,也可以是節點的別名

*/struct device_node *of_find_node_by_path(const char *path);

/**

* of_find_node_by_name - 通過節點名查詢指定節點

* @from - 開始查詢節點,如果為null,則從根節點開始

* @name- 節點名

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

/** 

* of_find_property - 提取指定屬性的值

* @np - 裝置節點指標

* @name - 屬性名稱

* @lenp - 屬性值的位元組數

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

/**

* of_property_count_elems_of_size - 得到屬性值中資料的數量

* @np - 裝置節點指標

* @propname - 屬性名稱

* @elem_size - 每個資料的單位(位元組數)

* 成功:屬性值的資料個數;失敗:負數,絕對值是錯誤碼

*/int of_property_count_elems_of_size(const struct device_node *np,const char *propname, int elem_size);

/** 

* of_property_read_u32_index - 得到屬性值中指定標號的32位資料值

* @np - 裝置節點指標

* @propname - 屬性名稱

* @index - 屬性值中指定資料的標號

* @out_value - 輸出引數,得到指定資料的值

* 成功:0;失敗:負數,絕對值是錯誤碼

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

/**

* of_property_read_string - 提取字串(屬性值)

* @np - 裝置節點指標

* @propname - 屬性名稱

* @out_string - 輸出引數,指向字串(屬性值)

* 成功:0;失敗:負數,絕對值是錯誤碼

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

/**

* of_n_addr_cells - 提取預設屬性「#address-cells」的值

* @np - 裝置節點指標

*/int of_n_addr_cells(struct device_node *np);

/**

* of_n_size_cells - 提取預設屬性「#size-cells」的值

* @np - 裝置節點指標

*/int of_n_size_cells(struct device_node *np);

/**

* of_get_address - 提取i/o口位址

* @np - 裝置節點指標

* @index - 位址的標號

* @size - 輸出引數,i/o口位址的長度

* @flags - 輸出引數,型別(ioresource_io、ioresource_mem)

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

/**

* of_translate_address - 從裝置樹中提取i/o口位址轉換成實體地址

* @np - 裝置節點指標

* @in_addr - 裝置樹提取的i/o位址

*/u64 of_translate_address(struct device_node *dev, const __be32 *in_addr);

/**

* of_iomap - 提取i/o口位址並對映成虛擬位址

* @np - 裝置節點指標

* @index - i/o位址的標號

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

/**

* @np - 裝置節點指標

* @index - i/o位址的標號

* @name - 裝置名,申請i/o位址時使用

*/void __iomem *of_io_request_and_map(struct device_node *np, int index, const char *name);

/** 

* of_address_to_resource - 從裝置樹中提取資源resource(i/o位址)

* @np - 裝置節點指標

* @index - i/o位址資源的標號

* @r - 輸出引數,指向資源resource(i/o位址)

* 成功:0;失敗:負數,絕對值是錯誤碼

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

/**

* include/of_gpio.h

* of_get_named_gpio - 從裝置樹中提取gpio口

* @np - 裝置節點指標

* @propname - 屬性名

* @index - gpio口引腳標號

* 成功:得到gpio口編號;失敗:負數,絕對值是錯誤碼

*/int of_get_named_gpio(struct device_node *np, const char *propname, int index);

/**

* of_irq_count從裝置樹中提取中斷的數量

* @np - 裝置節點指標

* 成功:大於等於0,實際中斷數量,0則表示沒有中斷

*/int of_irq_count(struct device_node *dev);

/**

* of_irq_get - 從裝置樹中提取中斷號

* @np - 裝置節點指標

* @index - 要提取的中斷號的標號

* 成功:中斷號;失敗:負數,其絕對值是錯誤碼

int of_irq_get(struct device_node *dev, int index);

/** 

* of_get_mac_address - 從裝置樹中提取mac位址

* @np - 裝置節點指標

*/void *of_get_mac_address(struct device_node *np);

3 7核心中裝置樹的操作函式

include linux 目錄下有很多of開頭的標頭檔案 dtb device node platform device 核心中開放出來的介面函式的宣告大多在include linux 下面,關於裝置樹的都是以of h形式命名 這裡介紹一下各個標頭檔案中是關於那些的函式 a.處理dtb of fd...

linux核心字元裝置驅動之讀操作

char rbuf 1024 分配緩衝區,儲存讀取的資料 ret read fd,rbuf,1024 讀裝置,將從裝置讀取的資料儲存在rbuf緩衝區中,要讀1024位元組 ret儲存實際讀取的位元組數 struct file operations read介面作用 用於讀取裝置,並且將讀取的資料上報...

linux裝置樹(裝置驅動)

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