struct device_node *of_find_node_by_name(struct device_node *from, const char *name);
通過節(jié)點(diǎn)名字查找指定的節(jié)點(diǎn)
from
:要開始查找的節(jié)點(diǎn)name
:節(jié)點(diǎn)名字通過 device_type 屬性查找指定的節(jié)點(diǎn),函數(shù)原型如下:
struct device_node *of_find_node_by_type(struct device_node *from,
const char *type);
函數(shù)參數(shù)和返回值含義如下:
from:
開始查找的節(jié)點(diǎn),如果為 NULL 表示從根節(jié)點(diǎn)開始查找整個(gè)設(shè)備樹。
type:
要查找的節(jié)點(diǎn)對應(yīng)的 type 字符串,也就是 device_type 屬性值。
返回值:
找到的節(jié)點(diǎn),如果為 NULL 表示查找失敗。
根據(jù) device_type 和 compatible 這兩個(gè)屬性查找指定的節(jié)點(diǎn),函數(shù)原型如下:
struct device_node *of_find_compatible_node(struct device_node *from,
const char *type,
const char *compatible);
函數(shù)參數(shù)和返回值含義如下:
from:
開始查找的節(jié)點(diǎn),如果為 NULL 表示從根節(jié)點(diǎn)開始查找整個(gè)設(shè)備樹。
type:
要查找的節(jié)點(diǎn)對應(yīng)的 type 字符串,也就是 device_type 屬性值,可以為 NULL,表示忽略掉 device_type 屬性。
compatible:
要查找的節(jié)點(diǎn)所對應(yīng)的 compatible 屬性列表。
返回值:
找到的節(jié)點(diǎn),如果為 NULL 表示查找失敗
通過 of_device_id 匹配表來查找指定的節(jié)點(diǎn),函數(shù)原型如下:
struct device_node *of_find_matching_node_and_match(struct device_node *from,
const struct of_device_id *matches,
const struct of_device_id `match);
函數(shù)參數(shù)和返回值含義如下:
from:
開始查找的節(jié)點(diǎn),如果為 NULL 表示從根節(jié)點(diǎn)開始查找整個(gè)設(shè)備樹。matches:
of_device_id 匹配表,也就是在此匹配表里面查找節(jié)點(diǎn)。match:
找到的匹配的 of_device_id。返回值:
找到的節(jié)點(diǎn),如果為 NULL 表示查找失敗過路徑來查找指定的節(jié)點(diǎn),函數(shù)原型如下:
inline struct device_node *of_find_node_by_path(const char *path);
函數(shù)參數(shù)和返回值含義如下:
path:
帶有全路徑的節(jié)點(diǎn)名,可以使用節(jié)點(diǎn)的別名,比如“/backlight”就是 backlight 這個(gè)節(jié)點(diǎn)的全路徑。返回值:
找到的節(jié)點(diǎn),如果為 NULL 表示查找失敗用于獲取指定節(jié)點(diǎn)的父節(jié)點(diǎn),原型如下:
struct device_node *of_get_parent(const struct device_node *node);
函數(shù)參數(shù)和返回值含義如下:
node:
需要查找父節(jié)點(diǎn)的子節(jié)點(diǎn);返回值:
返回父節(jié)點(diǎn);用迭代的查找子節(jié)點(diǎn),函數(shù)原型如下:
struct device_node *of_get_next_child(const struct device_node *node,
struct device_node *prev);
函數(shù)參數(shù)和返回值含義如下:
node:
父節(jié)點(diǎn);prev:
前一個(gè)子節(jié)點(diǎn),也就是從哪一個(gè)子節(jié)點(diǎn)開始迭代的查找下一個(gè)子節(jié)點(diǎn)。可以設(shè)置為NULL,表示從第一個(gè)子節(jié)點(diǎn)開始。返回值:
找到的下一個(gè)子節(jié)點(diǎn)。用于查找指定的屬性,函數(shù)原型如下:
property *of_find_property(const struct device_node *np,
const char *name,
int *lenp);
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn);name:
屬性名字;lenp:
屬性值的字節(jié)數(shù);返回值:
找到的屬性。
用于獲取屬性中元素的數(shù)量,比如 reg 屬性值是一個(gè)數(shù)組,那么使用此函數(shù)可以獲取到這個(gè)數(shù)組的大小,此函數(shù)原型如下:
int of_property_count_elems_of_size(const struct device_node *np,
const char *propname,
int elem_size);
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn)。proname:
需要統(tǒng)計(jì)元素?cái)?shù)量的屬性名字。elem_size:
元素長度。返回值:
得到的屬性元素?cái)?shù)量。
從屬性中查找并讀取 u8 數(shù)組,此函數(shù)原型如下:
int of_property_read_u8_array(const struct device_node *np,
const char *propname, u8 *out_values, size_t sz)
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn);proname:
要讀取的屬性名字;out_values:
指向返回值的指針,僅當(dāng)返回值為 0 時(shí)才修改;sz:
要讀取的數(shù)組元素?cái)?shù);返回值:
0 讀取成功,負(fù)值,讀取失敗, -EINVAL 表示屬性不存在。-ENODATA 表示沒有要讀取的數(shù)據(jù), -EOVERFLOW 表示屬性值列表太小。
讀取 u8類型屬性值,函數(shù)原型如下:
int of_property_read_u8(const struct device_node *np,
const char *propname,
u8 *out_value)
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn)。proname:
要讀取的屬性名字。out_value:
讀取到的數(shù)組值。返回值:
0,讀取成功,負(fù)值,讀取失敗, -EINVAL 表示屬性不存在, -ENODATA 表示沒有要讀取的數(shù)據(jù), -EOVERFLOW 表示屬性值列表太小。
用于讀取屬性中字符串值,函數(shù)原型如下:
int of_property_read_string(struct device_node *np,
const char *propname,
const char `out_string);
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn)。proname:
要讀取的屬性名字。out_string:
讀取到的字符串值。返回值:
0,讀取成功,負(fù)值,讀取失敗。
用于獲取 #address-cells
屬性值,函數(shù)原型如下:
int of_n_addr_cells(struct device_node *np);
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn)。返回值:
獲取到的#address-cells 屬性值。用于獲取 #size-cells
屬性值,函數(shù)原型如下:
int of_n_size_cells(struct device_node *np);
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn)。返回值:
獲取到的#size-cells 屬性值。
用于獲取地址相關(guān)屬性,主要是“reg”或者“assigned-addresses”屬性 值,函數(shù)屬性如下:
const __be32 *of_get_address(struct device_node *dev,
int index,
u64 *size,
unsigned int *flags);
函數(shù)參數(shù)和返回值含義如下:
dev:
設(shè)備節(jié)點(diǎn)。index:
要讀取的地址標(biāo)號。size:
地址長度。flags:
參數(shù),比如 IORESOURCE_IO、 IORESOURCE_MEM 等返回值:
讀取到的地址數(shù)據(jù)首地址,為 NULL 的話表示讀取失敗。
負(fù)責(zé)將從設(shè)備樹讀取到的地址轉(zhuǎn)換為物理地址,函數(shù)原型如下:
u64 of_translate_address(struct device_node *dev,
const __be32 *in_addr);
函數(shù)參數(shù)和返回值含義如下:
dev:
設(shè)備節(jié)點(diǎn)。in_addr:
要轉(zhuǎn)換的地址。返回值:
得到的物理地址,如果為 OF_BAD_ADDR 的話表示轉(zhuǎn)換失敗。
從設(shè)備樹里面提取資源值,但是本質(zhì)上就是將 reg 屬性值,然后將其轉(zhuǎn)換為 resource 結(jié)構(gòu)體類型,函數(shù)原型如下所示:
int of_address_to_resource(struct device_node *dev,
int index,
struct resource *r);
函數(shù)參數(shù)和返回值含義如下:
dev:
設(shè)備節(jié)點(diǎn)。index:
地址資源標(biāo)號。r:
得到的 resource 類型的資源值。返回值:
0,成功;負(fù)值,失敗。
用于直接內(nèi)存映射,以前我們會通過 ioremap
來完成物理地址到虛擬地址的映射,采用設(shè)備樹以后就可以直接通過 of_iomap
來獲取內(nèi)存地址所對應(yīng)的虛擬地址,不需要使用 ioremap了。該函數(shù)的原型如下:
void __iomem *of_iomap(struct device_node *np,
int index);
函數(shù)參數(shù)和返回值含義如下:
np:
設(shè)備節(jié)點(diǎn)。
index:
reg 屬性中要完成內(nèi)存映射的段,如果 reg 屬性只有一段的話 index 就設(shè)置為 0。
返回值:
經(jīng)過內(nèi)存映射后的虛擬內(nèi)存首地址,如果為 NULL 的話表示內(nèi)存映射失敗。
申請一個(gè)GPIO
int gpio_request(unsigned gpio, const char *label)
gpio
:管腳號;
label
:管腳名,可以為空(NULL)
返回值
:成功返回0,失敗返回錯(cuò)誤碼
釋放注冊的GPIO
void gpio_free(unsigned gpio)
gpio
:管腳號
設(shè)置GPIO為輸入,函數(shù)原型如下:
int gpio_direction_input(unsigned gpio)
gpio
:管腳號
返回值
:成功返回0,失敗返回錯(cuò)誤碼
獲取GPIO輸入值,函數(shù)原型如下:
int gpio_get_value(unsigned gpio)
gpio
:管腳號
返回值
:0或1
設(shè)置GPIO控制值,函數(shù)原型如下:
void gpio_set_value(unsigned gpio, int value)
gpio
:管腳號;
value
:控制值,0或1
用于獲取設(shè)備樹某個(gè)屬性里面定義了幾個(gè) GPIO 信息,函數(shù)原型如下:
int of_gpio_named_count(struct device_node *np, const char *propname)
np
:設(shè)備節(jié)點(diǎn)
propname
:要統(tǒng)計(jì)的gpio屬性
返回值
:正確返回統(tǒng)計(jì)的gpio數(shù)量,錯(cuò)誤返回負(fù)數(shù)
用于統(tǒng)計(jì)gpios 這個(gè)屬性的 GPIO 數(shù)量,函數(shù)原型如下:
int of_gpio_count(struct device_node *np)
np
:設(shè)備節(jié)點(diǎn)
返回值
:正確返回統(tǒng)計(jì)的gpio數(shù)量,錯(cuò)誤返回負(fù)數(shù)
用于獲取 GPIO 編號,函數(shù)原型如下:
int of_get_named_gpio(struct device_node *np, const char *propname, int index)
np
:設(shè)備節(jié)點(diǎn)
propname
:包含要獲取 GPIO 信息的屬性名
index
:GPIO 索引
返回值
:正確返回獲取到的GPIO編號,錯(cuò)誤返回負(fù)數(shù)
用于獲取時(shí)鐘源,函數(shù)原型如下:
struct clk *devm_clk_get(struct device *dev, const char *id);
dev
:device設(shè)備
id
:時(shí)鐘源名字,可以為NULL
返回值
:正確返回struct clk指針,錯(cuò)誤返回NULL
用于釋放時(shí)鐘源,函數(shù)原型如下:
void devm_clk_put(struct device * dev, struct clk * clk);
dev
:device設(shè)備
id
:時(shí)鐘源名字
先申請,后映射物理內(nèi)存,函數(shù)原型如下:
void __iomem *devm_ioremap_resource(struct device *dev,
const struct resource *res);
dev
:device設(shè)備
res
:resource資源
返回值
:成功返回虛擬地址指針,識別返回錯(cuò)誤碼
釋放之前映射的地址,函數(shù)原型如下:
void devm_iounmap(struct device *dev, void __iomem *addr);
dev
:device設(shè)備
addr
:要釋放的虛擬地址
用于注冊中斷服務(wù)函數(shù),函數(shù)原型如下:
int devm_request_irq(struct device *dev, unsigned int irq, irq_handle_t handle,
unsigned int flags, const char *name, void* dev_id);
dev
:device設(shè)備
irq
:中斷號,可以通過platform_get_irq獲得
handle
:中斷處理函數(shù)
flags
:中斷觸發(fā)方式,上升沿/下降沿等
name
:中斷名稱
dev_id
:中斷共享時(shí)用到,一般設(shè)置為結(jié)構(gòu)體或NULL
用于釋放devm_request_irq注冊的中斷,函數(shù)原型如下:
void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id)
dev
:device設(shè)備
irq
:中斷號,與devm_request_irq注冊的對應(yīng)
dev_id
:與devm_request_irq注冊的對應(yīng)
分配的內(nèi)存物理上連續(xù)(虛擬上也連續(xù)),只能在低端內(nèi)存分配(直接內(nèi)存映射區(qū)),函數(shù)原型如下:
void *kmalloc(size_t size, gfp_t gfp);
size
:分配的大小
gfp
:申請內(nèi)存的類型標(biāo)志
與devm_kmalloc類似,只不過devm_kzalloc會對申請到的內(nèi)存內(nèi)容清零,函數(shù)原型如下:
void * devm_kzalloc (struct device * dev, size_t size, gfp_t gfp);
dev
:device設(shè)備
size
:申請內(nèi)存的大小
gfp
:申請內(nèi)存的類型標(biāo)志
devm_kmalloc()
和devm_kzalloc()
申請的內(nèi)存必須調(diào)用devm_kfree()
釋放,函數(shù)原型如下:
void devm_kfree(struct device *dev, void *p);
dev
:device設(shè)備
p
:內(nèi)存指針
用于獲取pin操作句柄,函數(shù)原型如下:
struct pinctrl * devm_pinctrl_get(struct device *dev);
dev
:device設(shè)備
返回值
:pinctrl句柄
用于釋放pin操作句柄,函數(shù)原型如下:
void devm_pinctrl_put(struct pinctrl *p);
p
:pinctrl句柄
以上就是比較常用的一些接口,當(dāng)然像devm的接口還有很多,這里只列舉clock、mem等會經(jīng)常用到的接口。
來源:嵌入式Linux充電站
聯(lián)系客服