设备树OF函数操作实验

发布时间:2024年01月13日

一.? 简介

前面几篇文章学习了设备树常用的 OF操作函数,这些函数的作用是,在驱动开发工作时,读取设备树文件中设备节点信息。

本文通过一个读取一个设备节点的信息,以了解一下一些 OF函数的简单使用。

读取 设备树文件 imx6ull-14x14-evk.dts 中一个设备节点的信息。这里读取 backlight设备节点的属性值:读取字符串类型的 compatile属性值。

注意:这里所使用的开发板是 正点原子的 nand-Flash版 ALPHA开发板。

二.? 设备树OF函数操作实验

1.? 创建 vscode工程

打开 ubuntu系统,进入 /home/wangtian/zhengdian_Linux/Linux_Drivers 目录。输入如下命令,在该目录下创建 4_dtsof 文件夹:

mkdir 4_dtsof

进入 4_dtsof工程目录下,创建 dtsof.c文件:

touch dtsof.c

将 前面工程 3_newchrled中 .vscode目录及其下文件都拷贝到 4_dtsof 工程目录下:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/4_dtsof$ cp ../3_newchrled/Makefile ./ -f

注意: 因为 .vscode目录下的文件中,设置了 所调用的 Linux内核源码的路径(这里使用的是 NXP官方提供的 Linux内核源码)。

将 前面工程 3_newchrled中 Makefile文件拷贝到 4_dtsof 工程目录下:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/4_dtsof$ cp ../3_newchrled/.vscode/ ./ -rf

更改 Makefile中的编译目标名,更改为如下:

obj-m := dtsof.o

2.? 代码实现

这里所使用的开发板为正点原子的 nand-Flash版 ALPHA开发板。 所以,开发板所使用的设备树文件为前面创建的 imx6ull-alientek-nand.dts。

而 imx6ull-alientek-nand.dts 设备树文件调用了 imx6ull-14x14-evk-gpmi-weim.dts文件,而 imx6ull-14x14-evk-gpmi-weim.dts 设备树文件又调用了 如下文件:

imx6ull-14x14-evk.dts

基于以上因素,所以,可以通过 OF操作函数读取 imx6ull-14x14-evk.dts文件中 backlight这个设备节点信息,来学习一下 OF函数操作。

注意:设备树操作函数 OF函数的调用方法(例如,传参,错误返回值的处理),可以参考 Linux内核源码中。这里参考 NXP官方提供的 Linux 内核源码。

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";
	};

编写读取 backlight节点中 compatible属性值代码

dts.c文件的代码实现如下:

#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;
    //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);			 
					 
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");

三.? 编译与模块加载

1.? 编译程序

2. 驱动加载

文章来源:https://blog.csdn.net/wojiaxiaohuang2014/article/details/135542057
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。