1.修改设备树,添加子节点
在根节点“/”下创建一个名为“alphaled”的子节点,打开 imx6ull-alientek-emmc.dts 文件, 在根节点“/”最后加入一个alphaled子节点
属性#address-cells 和#size-cells 都为 1,表示 reg 属性中起始地址占用一个字长 (cell),地址长度也占用一个字长(cell)。
属性 compatbile 设置 alphaled 节点兼容性为“atkalpha-led”
属性 status 设置状态为“okay”。
reg 属性非常重要!reg 属性设置了驱动里面所要使用的寄存器物理地址,比 如“0X020C406C 0X04”表示 I.MX6ULL 的 CCM_CCGR1 寄存器,其中寄存器首地 址为 0X020C406C,长度为 4 个字节。
子节点如下:
alphaled {
#address-cells = <1>;
#size-cells = <1>;
compatible = "atkalpha-led";
status = "okay";
reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE */
0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */
0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */
0X0209C000 0X04 /* GPIO1_DR_BASE */
0X0209C004 0X04 >; /* GPIO1_GDIR_BASE */
};
编译设备树,用命令make dts,将重新编译的dtb文件拷贝进tftpboot目录内 ,重新启动linux内核,用cd /proc/device-tree;ls命令查看。发先新增加的设备树节点alphaled,修改设备树成功。
==============================
2.of函数进行访问设备树
设备都是以节点的形式“挂”到设备树上的,因此要想获取这个设备的其他属性信息,必须先获取到这个设备的节点。Linux 内核使用 device_node 结构体来描述一个节点,此结构体定 义在文件 include/linux/of.h 中,定义如下:
of_find_node_by_name 函数
of_find_node_by_name 函数通过节点名字查找指定的节点,函数原型如下:
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
//参数说明:
from :开始查找的节点,如果为 NULL, 表示从根节点开始查找整个设备树。
name :要查找的节点名字。
返回值: 找到的节点,如果为 NULL 表示查找失败。
of_find_node_by_type 函数
of_find_node_by_type 函数通过 device_type 属性查找指定的节点,函数原型如下:
struct device_node *of_find_node_by_type(struct device_node *from,
const char *type);
//参数说明:
from :开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。
type :要查找的节点对应的 type 字符串,也就是 device_type 属性值。
返回值: 找到的节点,如果为 NULL 表示查找失败。
of_find_compatible_node 函数
of_find_compatible_node 函数根据 device_type 和 compatible 这两个属性查找指定的节点, 函数原型如下:
struct device_node *of_find_compatible_node(struct device_node *from,
const char *type,
const char *compatible)
of_find_matching_node_and_match 函数
of_find_matching_node_and_match 函数通过 of_device_id 匹配表来查找指定的节点,函数原
型如下: