009_设备树属性的获取-以LED为例
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.查看属性所在节点 device_node 结构体 2.如何查找结点 节点路径 节点类型(不推荐使用) 节点 ...
- TI AM5728 SDK升级之 linux设备树解析,以网口cpsw为例
如果一个结点描述的设备有地址,则应该给出@unit-address.多个相同类型设备结点的name可以一样,只要unit-address不同即可,如本例中含有cpu@0.cpu@1以及serial@1 ...
- Linux驱动_设备树下LED驱动
前言 学习完设备树基础知识后,完成设备树下LED驱动实验 一.修改设备树文件 在设备书根/节点下添加子节点led信息: alphaled {status = "okay";comp ...
- 设备树下字符设备驱动
设备树下字符设备驱动 一.在设备树里添加自己的节点 二.驱动代码 三.makefile 四.应用层代码 运行测试 总结 一.在设备树里添加自己的节点 alphaled { 2 #address-cel ...
- 驱动程序开发:无设备树和有设备树的platform驱动
1.Linux 驱动的分离与分层 对与对IO进行最简单的读写操作,无需考虑太多的怎么使它重用性强,而像I2C. SPI.LCD 等这些复杂外设的驱动,Linux 系统要考虑到驱动的可重用性,因此提 ...
- Linux驱动之设备树
14.设备树 1.什么是设备树? 设备树是一种描述硬件资源的数据结构, 它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立. 2.设备树的由来 要想了解为什么会有设备树, ...
- Linux设备树的概念
一.设备树概念以及作用 1.设备树概念 设备树(Device Tree),将这个词分开就是"设备"和"树",描述设备树的文件叫做 DTS(DeviceTree ...
- 设备树解析 i2c设备模型
目录 1.基础概念 1.总线 2.手机启动流程 1.MTK启动流程 2.高通启动流程的差别 3.设备树解析 1.设备树相关 2.设备树解析 4. i2c 设备初始化流程 1.基础概念 1.总线 总线是 ...
- Linux设备树详解
Linux设备树详解 设备树小故事 设备树文件 使用设备树 修改设备树文件 编译设备树 异常处理 编写驱动文件 参考资料 设备树小故事 设备树(Device Tree),将这个词分开就是"设 ...
- RK3399 驱动开发 _ 04 - Android系统中通过fdt文件系统反编译查看设备中真实生效的设备树配置信息
文章目录 前言 一.设备树保存在文件系哪里? 二.文件系统设备树dts编译与反编译 2.1 设备树原始 dtb 格式 2.2 从设备中获取目标文件fdt 2.3 在ubuntu系统中将fdt反编译成d ...
最新文章
- 计算机为什么找不到c盘d盘,电脑不显示是什么盘?是C盘还是D盘?怎么才能显示出来呢?...
- python的深拷贝与浅拷贝
- P5020-货币系统【背包】
- 这群程序员疯了!他们想成为IT界最会带货的男人
- cstring移除指定字符串_从String中移除空白字符的多种方式!?差别竟然这么大!...
- python多进程内存共享_Python—并发编程04多进程内存共享,python,间,的
- [转] Linux应用层的定时器Timer
- 【大云制造】大云运营管理平台V1.4发布——不忘初心,砥砺前行,为了创造无限的价值!...
- microhard PICO900(P900)电台配置
- c语言计算三棱柱体积,三棱柱的体积
- Topcoder参赛入门
- 疯狂ios讲义之疯狂打飞机(2)
- POI读取Excel(兼容Excel2003、Excel2007)
- Apple Logic Pro X 10.7 For MacOS 苹果音乐制作宿主软件
- JavaScript设计模式 -发布订阅者模式
- mysql 编码错误_【分享】MySQl操作系统提示错误编码
- Unity3D之Navigation导航系统学习及案例讲解(适合初学者)
- Windows10数字权利
- 酒店电视方案 酒店iptv电视解决方案找哪里
- 操作系统原理_田丽华(7)死锁
热门文章
- 计算机怎么取消用户密码,怎么取消电脑开机密码界面
- 恍恍惚惚,哈哈,35. Search Insert Position
- html有形状导航栏制作,div css制作导航栏
- Linux 与 Python编程2021 Python面向对象编程实训 educoder实训
- php 虚线怎么画,ps画虚线最详细教程
- 宽带拨号连接失败,代码651
- window7系统搭建FTP服务端,使用FileZilla FTP客户端测试
- python对导入文件数据进行(查看、分析、解题思路、流程)做详细分析(适用于python初学者)
- 需求与商业模式创新-4-战略
- 独孤求败 —— 什么才是一个完整机器学习项目流程? 适合九成以上的场景