linux学习-设备树教程
设备树
一,格式
label:node-name@unit-address
二,标准属性
1.compatible属性
格式:“manufacturer,model”厂商,驱动名字
根节点的compatible属性是为了匹配linux内核是否支持此设备
2.model属性
model也是一个字符串,描述设备模块信息
exp:model=“wm8960-audio”
3.status属性
也是字符串,表示设备的状态
值描述okay可操作设备disabled不可操作,但可变可操作fail不可操作fail-sss与上面相同,sss为检测到错误内容
4.#address-cells和#size-cells属性
\#address-cells表示该节点的地址
\#size-cells表示该节点所占的地址长度
//此为.dts文件
//example 1
/ {
#address-cells = <0x1>;
//在 root node下使用1个u32来代表address。
#size-cells = <0x0>;
// 在root node下使用0个u32来代表size。
...
...
memory {
// memory device
...
reg = <0x90000000>;
// 0x90000000是存取memory的address
...
};
...
...
}
/ {
#address-cells = <0x1>;
//在root node下使用1个u32来代表address。
#size-cells = <0x1>;
//在root node下使用1个u32来代表size。
...
...
memory {
// memory device
...
reg = <0x90000000 0x800000>;
// 0x90000000 是存取 memory 的 address
// 0x800000 是 memory 的 size。
...
};
...
...
}
/ {
#address-cells = <0x2>;
// 在root node下使用2个u32来代表address。
#size-cells = <0x1>;
// 在root node下使用1个u32来代表size。
...
...
memory {
// memory device
...
reg = <0x90000000 00000000 0x800000>;
// 0x90000000 00000000 是存取memory的address
// 0x800000 是memory的size。
...
};
...
...
}
/ {
#address-cells = <0x2>;
// 在root node下使用2个u32来代表address。
#size-cells = <0x2>;
// 在root node下使用2个u32来代表size。
...
...
memory {
// memory device
...
reg = <0x90000000 00000000 0x800000 00000000>;
// 0x90000000 00000000 是存取memory的address
// 0x800000 00000000 是memory的size。
...
};
...
...
}
**reg格式:reg=
注意:reg格式与csdn例子有些不一样还需深究!!!
5.reg属性
主要描述节点的设备地址空间资源信息!
6.ranges属性
格式:ranges=<child-bus-add,parent-bus-add,length>
三.特殊节点
1.aliases子节点
aliases:别名
通常使用label:&label来方便访问节点
2.chosen子节点
功能:传递
四.驱动获取设备树操作函数
**这些函数都有个统一的前缀of\_,所以统称为OF函数
1.查找节点的OF函数
of\_find\_node\_by\_name函数
原型:struct device\_node *of\_find\_node\_by\_name( struct device\_node *from const char *name)
from:起始节点;name:寻找节点;
从from节点开始递归查找相应的name,如果from为NULL,则从根节点开始
of\_find\_node\_by\_type函数
原型:struct device\_node *of\_find\_node\_by\_type( struct device\_node *from const char *type)
from:起始节点;type:寻找type字符串;
of\_find\_node\_by\_compatible函数
原型:struct device\_node *of\_find\_node\_by\_compatible( struct device\_node *from const char *type const char *compatible)
from:起始节点;type:寻找type字符串;; compatible:对于的compatible属性列表
of\_find\_node\_by\_path
原型:inline struct device\_node *of\_find\_node\_by\_path(const char *path)
2.查找父/子节点的OF函数
struct device\_node *of\_get\_parent(const struct device\_node *node)
struct device\_node *of\_get\_next\_child(
const struct device\_node *node,
struct device\_node *prev)
3.提取属性值的OF函数
property *of\_find\_property(const struct device\_node *np,
const char *name,int *lenp)
np:设备节点;name:属性名字;lenp:属性值的字节数
return: 找到的属性
int of\_property\_count\_elems\_of\_size(const struct device\_node *np,const char *propname,int elem\_size)
**exp:获取属性中元素数量,比如reg属性值是个数组,即该函数返回数组的大小。
**
np:设备节点;proname:需要统计属性名字;elem\_size:元素长度
int of\_property\_read\_u32\_index(const struct device\_node *np
,const char *proname, u32 index,u32 *out\_value)
index:读取值的标号;out\_value:读取到的值
**同样地,也有相似的函数:
1.of\_property\_read\_u8\_array(const struct device\_node *np,const char *proname,u8 *out\_values,size\_t sz)
2.of\_property\_read\_u16\_array(…)
3.of\_property\_read\_u32\_array(…)
4.of\_property\_read\_u64\_array(…)
5.of\_property\_read\_string(struct device\_node *np,
const char *proname,const char ****out\_string)
6.of\_n\_addr\_cells(struct device\_node *np)
7.of\_n\_size\_cells(struct device\_node *np)