本文学习使用 设备树操作函数,读取设备节点的一个字符串类型的属性值。
读取设备树文件 imx6ull-14x14-evk.dts 中一个设备节点的信息。这里读取 backlight设备节点的属性值:读取字符串类型的 status属性。
?
imx6ull-14x14-evk.dts文件中 backlight设备节点信息如下:
backlight {
compatible = "pwm-backlight";
pwms = <&pwm1 0 5000000>;
brightness-levels = <0 4 8 16 32 64 128 255>;
default-brightness-level = <6>;
status = "okay";
};
这里准备读取 imx6ull-14x14-evk.dts 设备树文件中 status属性。
主要调用的函数如下:
struct device_node *of_find_node_by_path(const char *path)
int of_property_read_string(struct device_node *np, const char *propname,
const char **out_string);
读取 imx6ull-14x14-evk.dts 设备树文件中 status属性。代码实现如下:
#include <linux/module.h>
#include <linux/of.h>
/*模块入口*/
static int __init dtsof_init(void)
{
int ret = 0;
struct device_node * dev_node = NULL;
// struct property * dev_property = NULL;
const char* str = NULL;
//1. 读取设备节点
dev_node = of_find_node_by_path("/backlight");
if(NULL == dev_node)
{
ret = -EINVAL;
goto find_dev_node_failed;
}
/*
//2. 读取 compatile属性
dev_property = of_find_property(dev_node, "compatible", NULL);
if(NULL == dev_property)
{
ret = -EINVAL;
goto find_dev_property;
}
printk("dev_property->value: %s\r\n", (char*)dev_property->value);
*/
ret = of_property_read_string(dev_node, "status", &str);
if(ret != 0)
{
ret = -EINVAL;
goto find_dev_property;
}
printk("status: %s\r\n", str);
find_dev_property:
find_dev_node_failed:
return ret;
}
/*模块出口*/
static void __exit dtsof_exit(void)
{
}
/*模块入口与出口*/
module_init(dtsof_init);
module_exit(dtsof_exit);
/*模块 Licence*/
MODULE_LICENSE("GPL");
/*模块作者*/
MODULE_AUTHOR("LingXueWu");
ubuntu 终端进入 4_dtsof工程根目录下编译工程:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/4_dtsof$ make
编译后,生成驱动文件 dtsof.ko。
将 dtsof.ko拷贝到开发板系统下 /lib/modules/4.1.15/目录下:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/4_dtsof$ sudo cp dtsof.ko /home/wangtian/linux/nfs_File/rootfs/lib/modules/4.1.15/ -f
这里不需要先运行 depmod命令。因为前面已经运行过一次。
开发板上电进入系统 /lib/modules/4.1.15/目录下,加载 dtsof.ko 驱动模块:
/lib/modules/4.1.15 # modprobe dtsof.ko
status: okay