一. 简介
本文学习使用设备树操作 OF函数,读取设备节点的整型的属性值。
读取设备树文件 imx6ull-14x14-evk.dts 中一个设备节点的信息。这里读取 backlight设备节点的属性值:读取整型的属性。
注意:这里的整型数据都是 32位的数据。而非 8位的数据!!
二. 读取设备节点backlight的整型属性值
1. backlight设备节点信息
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 设备树文件中 default-brightness-level属性的值。
主要使用到两个OF函数:
struct device_node *of_find_node_by_path(const char *path); //获取设备节点
static inline int of_property_read_u32(const struct device_node *np,const char *propname,u32 *out_value); //读取 32位整型的属性
2. 代码实现
代码实现如下:
#include <linux/module.h>
#include <linux/of.h>/*模块入口*/
static int __init dtsof_init(void)
{int ret = 0;struct device_node * dev_node = NULL;u32 value = 0;//1. 读取设备节点dev_node = of_find_node_by_path("/backlight");if(NULL == dev_node){ret = -EINVAL;goto find_dev_node_failed;}//2. 读取整形类型的属性值ret = of_property_read_u32(dev_node, "default-brightness-level", &value);if(ret != 0){ret = -EINVAL;goto read_property_failed;} printk("default-brightness-level: %d\r\n", value); read_property_failed:
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");
三. 编译驱动与加载
1. 编译程序
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
2. 加载驱动
这里不需要先运行 depmod命令。因为前面已经运行过一次。
开发板上电进入系统 /lib/modules/4.1.15/目录下,加载 dtsof.ko 驱动模块:
/ # cd /lib/modules/4.1.15/
/lib/modules/4.1.15 # modprobe dtsof.ko
default-brightness-level: 6
测试结束后,卸载驱动模块,输入如下命令:
/lib/modules/4.1.15 # rmmod dtsof.ko