Linux引入设备树,把硬件分到设备树文件中,驱动中仍然需要硬件信息。
所以必须将设备树中的硬件信息传到驱动中。



一、设备树最重要的结构体

设备树属性获取函数头文件:include/linux/of.h

设备树中使用 device_node 结构体描述节点,of.h中的API需要device_node作为参数传入。

struct device_node {const char *name;        //节点名称const char *type;     //设备类型phandle phandle;const char *full_name;    //全路径节点struct fwnode_handle fwnode;struct  property *properties;struct  property *deadprops;    /* removed properties */struct  device_node *parent;        //父节点指针struct  device_node *child;          //子节点指针struct  device_node *sibling;struct  kobject kobj;unsigned long _flags;void    *data;
#if defined(CONFIG_SPARC)const char *path_component_name;unsigned int unique_id;struct of_irq_controller *irq_trans;
#endif
};

如果我们想要获取设备树中的属性(数据),必须先获取device_node,这个节点会在probe初始化的时候传入。

驱动中获取device_node方法:

  struct device_node *node = pdev->dev.of_node


二、 节点中属性的结构体property,定义了属性常用的值

struct property {char    *name;int     length;void    *value;struct property *next;unsigned long _flags;unsigned int unique_id;struct bin_attribute attr;
};

获取属性参数的函数

     根据属性名称,提取属性值struct property *of_find_property(const struct device_node *np, const char *name, int *lenp);/** * of_find_property - 提取指定属性的值* @np - 设备树节点指针* @name - 属性名称* @lenp - 属性值的字节数* 返回值:成功,属性值的首地址;失败:NULL*/


三、驱动测试源码

itop4412_of_get_info.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_gpio.h>MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("SKYFALL");
MODULE_DESCRIPTION("itop4412_of_get_info");#define DRIVER_NAME "seedling"static int leds_probe(struct platform_device * pdev)
{struct device_node *node = pdev->dev.of_node;printk("node name is %s!\n",node->name);printk("node fullname is %s!\n",node->full_name);struct property *comprop = NULL; comprop = of_find_property(node,"compatible",NULL);printk("comprop name is %s!\n",comprop->name);printk("comprop value is %s!\n",comprop->value);comprop = of_find_property(node,"status",NULL);printk("comprop name is %s!\n",comprop->name);printk("comprop value is %s!\n",comprop->value);printk(KERN_ALERT "probe init\n");return 0;
}static int leds_remove(struct platform_device * pdev)
{printk(KERN_ALERT "Goodbye, curel world, this is remove\n");return 0;
}static const struct of_device_id of_leds_dt_match[] = {{.compatible = DRIVER_NAME},{},
};MODULE_DEVICE_TABLE(of,of_leds_dt_match);static struct platform_driver leds_driver = {.probe  = leds_probe,.remove = leds_remove,.driver = {.name = DRIVER_NAME,.owner = THIS_MODULE,.of_match_table = of_leds_dt_match,},
};static int __init leds_init(void)
{printk(KERN_ALERT "leds_init!\n");printk("%s,%d\n",__func__,__LINE__);platform_driver_register(&leds_driver);return 0;
}static void __exit leds_exit(void)
{printk(KERN_ALERT "leds_exit!\n");printk("%s,%d\n",__func__,__LINE__);platform_driver_unregister(&leds_driver);return ;
}module_init(leds_init);
module_exit(leds_exit);


四、Makefile

#!/bin/bash
$(warning KERNELRELEASE = $(KERNELRELEASE))ifeq ($(KERNELRELEASE),)#内核的源码路径, ?= 条件赋值, uname -r 得到内核版本号
KERNELDIR ?=  /home/mint/itop/linux_4.14
#KERNELDIR ?=
# := 立即赋值, 得到当前的绝对路径
PWD := $(shell pwd)# -C 切换工作路径, $(MAKE) =  make
modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*.PHONY: modules cleanelse# 生成模块obj-m := itop4412_of_get_info.o endif


五、测试

1、加载驱动

2、获取信息


3、卸载驱动

网上关于linux驱动的资料中,看到设备节点,可能有三种意思:

设备树节点;
平台文件的设备节点;
/dev下的设备节点。



009_设备树属性的获取-以LED为例相关推荐

  1. 第五十三讲 获取设备树属性

    第五十三讲 获取设备树属性 文章目录 第五十三讲 获取设备树属性 一.获取设备树属性信息 1.查看属性所在节点 device_node 结构体 2.如何查找结点 节点路径 节点类型(不推荐使用) 节点 ...

  2. TI AM5728 SDK升级之 linux设备树解析,以网口cpsw为例

    如果一个结点描述的设备有地址,则应该给出@unit-address.多个相同类型设备结点的name可以一样,只要unit-address不同即可,如本例中含有cpu@0.cpu@1以及serial@1 ...

  3. Linux驱动_设备树下LED驱动

    前言 学习完设备树基础知识后,完成设备树下LED驱动实验 一.修改设备树文件 在设备书根/节点下添加子节点led信息: alphaled {status = "okay";comp ...

  4. 设备树下字符设备驱动

    设备树下字符设备驱动 一.在设备树里添加自己的节点 二.驱动代码 三.makefile 四.应用层代码 运行测试 总结 一.在设备树里添加自己的节点 alphaled { 2 #address-cel ...

  5. 驱动程序开发:无设备树和有设备树的platform驱动

    1.Linux 驱动的分离与分层   对与对IO进行最简单的读写操作,无需考虑太多的怎么使它重用性强,而像I2C. SPI.LCD 等这些复杂外设的驱动,Linux 系统要考虑到驱动的可重用性,因此提 ...

  6. Linux驱动之设备树

    14.设备树 1.什么是设备树? ​ 设备树是一种描述硬件资源的数据结构, 它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立. 2.设备树的由来 要想了解为什么会有设备树, ...

  7. Linux设备树的概念

    一.设备树概念以及作用 1.设备树概念 设备树(Device Tree),将这个词分开就是"设备"和"树",描述设备树的文件叫做 DTS(DeviceTree ...

  8. 设备树解析 i2c设备模型

    目录 1.基础概念 1.总线 2.手机启动流程 1.MTK启动流程 2.高通启动流程的差别 3.设备树解析 1.设备树相关 2.设备树解析 4. i2c 设备初始化流程 1.基础概念 1.总线 总线是 ...

  9. Linux设备树详解

    Linux设备树详解 设备树小故事 设备树文件 使用设备树 修改设备树文件 编译设备树 异常处理 编写驱动文件 参考资料 设备树小故事 设备树(Device Tree),将这个词分开就是"设 ...

  10. RK3399 驱动开发 _ 04 - Android系统中通过fdt文件系统反编译查看设备中真实生效的设备树配置信息

    文章目录 前言 一.设备树保存在文件系哪里? 二.文件系统设备树dts编译与反编译 2.1 设备树原始 dtb 格式 2.2 从设备中获取目标文件fdt 2.3 在ubuntu系统中将fdt反编译成d ...

最新文章

  1. 计算机为什么找不到c盘d盘,电脑不显示是什么盘?是C盘还是D盘?怎么才能显示出来呢?...
  2. python的深拷贝与浅拷贝
  3. P5020-货币系统【背包】
  4. 这群程序员疯了!他们想成为IT界最会带货的男人
  5. cstring移除指定字符串_从String中移除空白字符的多种方式!?差别竟然这么大!...
  6. python多进程内存共享_Python—并发编程04多进程内存共享,python,间,的
  7. [转] Linux应用层的定时器Timer
  8. 【大云制造】大云运营管理平台V1.4发布——不忘初心,砥砺前行,为了创造无限的价值!...
  9. microhard PICO900(P900)电台配置
  10. c语言计算三棱柱体积,三棱柱的体积
  11. Topcoder参赛入门
  12. 疯狂ios讲义之疯狂打飞机(2)
  13. POI读取Excel(兼容Excel2003、Excel2007)
  14. Apple Logic Pro X 10.7 For MacOS 苹果音乐制作宿主软件
  15. JavaScript设计模式 -发布订阅者模式
  16. mysql 编码错误_【分享】MySQl操作系统提示错误编码
  17. Unity3D之Navigation导航系统学习及案例讲解(适合初学者)
  18. Windows10数字权利
  19. 酒店电视方案 酒店iptv电视解决方案找哪里
  20. 操作系统原理_田丽华(7)死锁

热门文章

  1. 计算机怎么取消用户密码,怎么取消电脑开机密码界面
  2. 恍恍惚惚,哈哈,35. Search Insert Position
  3. html有形状导航栏制作,div css制作导航栏
  4. Linux 与 Python编程2021 Python面向对象编程实训 educoder实训
  5. php 虚线怎么画,ps画虚线最详细教程
  6. 宽带拨号连接失败,代码651
  7. window7系统搭建FTP服务端,使用FileZilla FTP客户端测试
  8. python对导入文件数据进行(查看、分析、解题思路、流程)做详细分析(适用于python初学者)
  9. 需求与商业模式创新-4-战略
  10. 独孤求败 —— 什么才是一个完整机器学习项目流程? 适合九成以上的场景