背景

讲完设备树的有关概念以及语法以后,我们接下来就让 我们的驱动 使用 设备树。

ref : 《内核学习笔记14:内核设备树学习》《u-boot对设备树的支持》

测试代码

本文使用的设备树节点如下:

// 专门用于测试dts的示例,没实例用途
// 名称可以有“,”、“-”,如“ll,i2c-enable”
myfoo {
compatible = "ll,jimkent-foo";
status = "okay"; // string
enable; // bool,无须值
myvalue = <250>; // 默认是32位,如果使用8位读取,结果为0
value = /bits/ 8 <88>; // 8位单独赋值
value16 = /bits/ 16 <166>; // 16位单独赋值
a-cell = <1 2 3 4 5>; // 数组
// 子节点
foo {
label = "foo";
note = "this is foo";
};
bar {
label = "bar";
note = "this is bar";
};
}; // 其中compatible与驱动使用的名称必须一致(这样才能匹配上)。其它内容比较简单,分别是字符串、布尔类型、不同位数的数值、数组、子节点。

驱动实例如下:

/**
* @file foo_drv.c
* @author Late Lee <latelee@163.com>
* @date Wed Jun 7 22:21:19 2019
*
* @brief 测试dts示例
*
* @note 读取dts的值,学习dts。代码有部分警告,不影响
*/ #include <linux/module.h>
#include <linux/kernel.h> /**< printk() */
#include <linux/init.h> #include <linux/types.h> /**< size_t */
#include <linux/errno.h> /**< error codes */
#include <linux/string.h> #include <linux/of.h>
#include <linux/of_device.h> static int foo_remove(struct platform_device *dev)
{
printk(KERN_NOTICE "remove...\n"); return 0;
} static int foo_probe(struct platform_device *dev)
{
int ret = 0;
struct device_node* np = dev->dev.of_node;
struct device_node* child = NULL;
const char* str = NULL;
bool enable = false;
u8 value = 0;
u16 value16 = 0;
u32 value32 = 0; // 测试dts读取API
if(np == NULL)
{
pr_info("of_node is NULL\n");
return 0;
} of_property_read_string(np, "status", &str); // 读字符串 enable = of_property_read_bool(np, "enable"); // bool类型,可判断某字段存在不存在
of_property_read_u32(np, "myvalue", &value32); // 一般地,都使用u32读取数值
of_property_read_u8(np, "value", &value);
of_property_read_u16(np, "value16", &value16); u32 data[3] = {0};
u32 tag = 0;
// a-cell是一个数组,默认读第1个。
of_property_read_u32(np, "a-cell", &tag);
// 也可以读取指定大小的数组(不一定是全部的)
of_property_read_u32_array(np, "a-cell", data, ARRAY_SIZE(data)); printk("of read status: %s enable: %d value: %d %d %d\n", str, enable, value, value16, value32);
printk("of read tag: %d data: %d %d %d\n", tag, data[0], data[1], data[2]); // 获取子节点个数
int count = of_get_available_child_count(np); // 遍历所有子节点,按格式读取属性
int index = 0;
for_each_available_child_of_node(np,child)
{
const char* label = of_get_property(child,"label",NULL) ? : child->name;
const char* note = of_get_property(child,"note",NULL) ? : child->name;
printk("of read: label: %s note: %s\n", label, note);
}
return ret;
} static struct of_device_id foo_of_match[] = {
{ .compatible = "ll,jimkent-foo", },
{ /* sentinel */ }
}; static struct platform_driver foo_driver = {
.driver = {
.name = "foo",
.of_match_table = of_match_ptr(foo_of_match),
},
.probe = foo_probe,
.remove = foo_remove,
}; static int __init foo_drv_init(void)
{
int ret = 0; ret = platform_driver_register(&foo_driver);
if (ret)
{
pr_info("platform_driver_register failed!\n");
return ret;
} pr_info("Init OK!\n"); return ret;
} static void __exit foo_drv_exit(void)
{
platform_driver_unregister(&foo_driver);
} module_init(foo_drv_init);
module_exit(foo_drv_exit); MODULE_AUTHOR("Late Lee");
MODULE_DESCRIPTION("Simple platform driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:foo");

示例的代码是一个简单的模板,除了学习dts外,没什么用处。但是可以以此展开复杂的、有实际用途的驱动。

与以前的platform驱动不同,platform_driver中指定of_match_tablefoo_of_match结构体的.compatible必须与设备树的compatible一致。

本驱动涉及到的读取设备树节点信息的函数如下,更多函数,参考内核源码的include/linux/of.h头文件:

of_property_read_string // 读取字符串
of_property_read_bool // 判断某个字段是否存在,无须赋值
of_property_read_u8 // 读取8比特
of_property_read_u16 // 读取16比特
of_property_read_u32 // 读取32比特

如果存在多个子节点,用of_get_available_child_count获取个数(可用于开辟内存),然后调用for_each_available_child_of_node遍历所有子节点,注意,of_get_propertyof_property_read_string有相同效果。只是用法不同而已。

设备树DTS 学习:4-编写实战的更多相关文章

  1. 设备树DTS 学习:2-设备树语法

    背景 通过上一讲了解完设备树DTS有关概念,我们这一讲就来基于设备树例程,学习设备树的语法规则. 参考:设备树详解dts.设备树语法详解.设备树使用总结 设备树框架 1个dts文件 + n个dtsi文 ...

  2. 设备树DTS 学习:1-有关概念

    背景 设备树在Linux驱动开发中是一种比较常用的架构. 参考:<设备树DTS使用总结> .<linux内核设备树及编译> Linux设备树 介绍 在Linux 2.6中,ar ...

  3. 设备树DTS 学习:Linux DTS文件加载过程

    背景 了解机制有利于对内核有更深的认识. wget https://mirrors.aliyun.com/linux-kernel/v3.x/linux-3.2.61.tar.xz 内核 在drive ...

  4. 设备树DTS 学习:3-常用的DTS 函数

    Linux内核中目前DTS相关的函数都是以of_前缀开头的,它们的实现位于内核源码的drivers/of下面 void __iomem*of_iomap(struct device_node *nod ...

  5. 设备树DTS 学习: uboot 传递 dtb 给 内核

    背景 得到 dtb 文件以后,我们需要想办法下载到 板子中,并给 Linux 内核使用. (高级版本的 uboot也有了 自己使用设备树支持,我们这里不讨论 uboot 使用的设备树) Linux 内 ...

  6. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

  7. Linux 设备树 dts

    1. dtb反编译成dts文件命令:./kernel-4.4/scripts/dtc/dtc_overlay -I dtb -O dts out/target/product/m863ur100_p0 ...

  8. Linux dts 设备树详解(一) 基础知识

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...

  9. Android驱动之设备树简介

    目录 一.    设备树简介    2 1.    问题一:为什么需要设备树?    2 ①名词解释:    2 ②DT详细介绍:    2 ③DTS是DT的源文件,描述Device Tree中的设备 ...

随机推荐

  1. 树莓派4B踩坑指南 - (8)安装GO语言

    下载 191129最新版本为go1.13.4.linux-armv6l.tar.gz go官网(点此访问)国内访问似乎不是很稳定,但下载速度还挺快,下载地址:(点此访问) 安装 解压后是一个名为go的 ...

  2. UDP通讯代码

    UDP客户端代码: import socket # 创建套接字 socket.AF_INET:IPV4 socket.SOCK_DGRAM:UDP协议 udp_client=socket.socket ...

  3. unity 热更方案对比

    现在一般使用的方案有:tulua&ulua.xlua.ILRuntime 对比: tulua&ulua 方案成熟,稳定第三方库支持 xlua 之前是为了热更修复线上bug的,腾讯发起的 ...

  4. 计算机网络历史与基本概念&分层与参考模型(TCP/IP与OSI)&通信过程

    Definition: 计算机网络:使用单一技术相互连接的自主计算机的互联集合. 单台计算机独立自主(不受制于其他计算机),连接介质可以使光纤.铜线也可以是微波.红外.卫星. 互联网络(Interne ...

  5. 【转】spring IOC和AOP的理解

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...

  6. java.lang.ClassCastException: android.app.Application cannot be cast to

    出这个异常的原因是在项目中添加了新lication类(public class Application extends lication)之后,没有在AndroidManifest.xml中添加该类的 ...

  7. Linux引导过程!(重点)

    1.开机自检:服务器开机后,将根据主板BIOS (基本输入系统),中的设置对CPU .内存.显卡.键盘等设备进行初步检测,并初始化部分硬件. 2.MBR 引导:当从本机硬盘中启动系统时,首先根据硬盘中 ...

  8. Linux进程管理(一)

    目录 Linux进程管理(一) 参考 pstree命令 pidof命令 pmap命令 pwdx命令 ps命令 nice调优 发送信号 Linux进程管理(一)

  9. redis集群命令及常规操作

    集群命令 [root@redis06 etc]# redis-cli --cluster help Cluster Manager Commands: create host1:port1 ... h ...

  10. 题解 JSOI2010 找零钱的洁癖

    题解 JSOI2010 找零钱的洁癖 题面 BZOJ 个人体会 van全没有思路... 只能去看题解... 还是个bfs+贪心 不管怎样竟然乱搞过了... 听M_sea小姐姐说她有更正经的做法(线性规 ...