背景

本章的内容是为了实现在驱动中的开发,通过调用有关的api来寻找设备树节点熟悉,从而达到使用设备树进行驱动开发的目的。

参考:Linux内核 设备树操作常用API

Linux设备树语法详解一文中介绍了设备树的语法,这里主要

"include/of.h"介绍内核中提供的操作设备树的API

drivers/of.h是内核源码中关于设备树的内部实现。

device_node

内核中用下面的这个结构描述设备树中的一个节点,后面的API都需要一个device_node对象作为参数传入。

//include/of.h
46 struct device_node {
47 const char *name;
48 const char *type;
49 phandle phandle;
50 const char *full_name;
51
52 struct property *properties;
53 struct property *deadprops; /* removed properties */
54 struct device_node *parent;
55 struct device_node *child;
56 struct device_node *sibling;
57 struct device_node *next; /* next device of same type */
58 struct device_node *allnext; /* next in list of all nodes */
59 struct proc_dir_entry *pde; /* this node's proc directory */
60 struct kref kref;
61 unsigned long _flags;
62 void *data;
63 #if defined(CONFIG_SPARC)
64 const char *path_component_name;
65 unsigned int unique_id;
66 struct of_irq_controller *irq_trans;
67 #endif
68 };

struct device_node

--47-->节点名

--48-->设备类型

--50-->全路径节点名

--54-->父节点指针

--55-->子节点指针

查找节点API

/**
* of_find_compatible_node - 通过compatible属性查找指定节点
* @from - 指向开始路径的节点,如果为NULL,则从根节点开始
* @type - device_type设备类型,可以为NULL
* @compat - 指向节点的compatible属性的值(字符串)的首地址
* 成功:得到节点的首地址;失败:NULL
*/
struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compat);
/**
* of_find_matching_node - 通过compatible属性查找指定节点
* @from - 指向开始路径的节点,如果为NULL,则从根节点开始
* @matches - 指向设备ID表,注意ID表必须以NULL结束
* 范例: const struct of_device_id mydemo_of_match[] = {
{ .compatible = "fs4412,mydemo", },
{}
};
* 成功:得到节点的首地址;失败:NULL
*/
struct device_node *of_find_matching_node(struct device_node *from,const struct of_device_id *matches);
/**
* of_find_node_by_path - 通过路径查找指定节点
* @path - 带全路径的节点名,也可以是节点的别名
* 成功:得到节点的首地址;失败:NULL
*/
struct device_node *of_find_node_by_path(const char *path);
/**
* of_find_node_by_name - 通过节点名查找指定节点
* @from - 开始查找节点,如果为NULL,则从根节点开始
* @name- 节点名
* 成功:得到节点的首地址;失败:NULL
*/
struct device_node *of_find_node_by_name(struct device_node *from,const char *name);

提取通用属性API

/**
* of_find_property - 提取指定属性的值
* @np - 设备节点指针
* @name - 属性名称
* @lenp - 属性值的字节数
* 成功:属性值的首地址;失败:NULL
*/
struct property *of_find_property(const struct device_node *np, const char *name, int *lenp);
/**
* of_property_count_elems_of_size - 得到属性值中数据的数量
* @np - 设备节点指针
* @propname - 属性名称
* @elem_size - 每个数据的单位(字节数)
* 成功:属性值的数据个数;失败:负数,绝对值是错误码
*/
int of_property_count_elems_of_size(const struct device_node *np,const char *propname, int elem_size);
/**
* of_property_read_u32_index - 得到属性值中指定标号的32位数据值
* @np - 设备节点指针
* @propname - 属性名称
* @index - 属性值中指定数据的标号
* @out_value - 输出参数,得到指定数据的值
* 成功:0;失败:负数,绝对值是错误码
*/
int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value);
/**
* of_property_read_string - 提取字符串(属性值)
* @np - 设备节点指针
* @propname - 属性名称
* @out_string - 输出参数,指向字符串(属性值)
* 成功:0;失败:负数,绝对值是错误码
*/
int of_property_read_string(struct device_node *np, const char *propname, const char **out_string);

提取addr属性API

/**
* of_n_addr_cells - 提取默认属性“#address-cells”的值
* @np - 设备节点指针
* 成功:地址的数量;失败:负数,绝对值是错误码
*/
int of_n_addr_cells(struct device_node *np);
/**
* of_n_size_cells - 提取默认属性“#size-cells”的值
* @np - 设备节点指针
* 成功:地址长度的数量;失败:负数,绝对值是错误码
*/
int of_n_size_cells(struct device_node *np);
/**
* of_get_address - 提取I/O口地址
* @np - 设备节点指针
* @index - 地址的标号
* @size - 输出参数,I/O口地址的长度
* @flags - 输出参数,类型(IORESOURCE_IO、IORESOURCE_MEM)
* 成功:I/O口地址的首地址;失败:NULL
*/
__be32 *of_get_address(struct device_node *dev, int index, u64 *size, unsigned int *flags);
/**
* of_translate_address - 从设备树中提取I/O口地址转换成物理地址
* @np - 设备节点指针
* @in_addr - 设备树提取的I/O地址
* 成功:物理地址;失败:OF_BAD_ADDR
*/
u64 of_translate_address(struct device_node *dev, const __be32 *in_addr);
/**
* of_iomap - 提取I/O口地址并映射成虚拟地址
* @np - 设备节点指针
* @index - I/O地址的标号
* 成功:映射好虚拟地址;失败:NULL
*/
void __iomem *of_iomap(struct device_node *np, int index);
/**
* 功能:提取I/O口地址并申请I/O资源及映射成虚拟地址
* @np - 设备节点指针
* @index - I/O地址的标号
* @name - 设备名,申请I/O地址时使用
* 成功:映射好虚拟地址;失败:NULL
*/
void __iomem *of_io_request_and_map(struct device_node *np, int index, const char *name);

提取resource属性API

/**
* of_address_to_resource - 从设备树中提取资源resource(I/O地址)
* @np - 设备节点指针
* @index - I/O地址资源的标号
* @r - 输出参数,指向资源resource(I/O地址)
* 成功:0;失败:负数,绝对值是错误码
*/
int of_address_to_resource(struct device_node *dev, int index, struct resource *r);

提取GPIO属性API

/**
* include/of_gpio.h
* of_get_named_gpio - 从设备树中提取gpio口
* @np - 设备节点指针
* @propname - 属性名
* @index - gpio口引脚标号
* 成功:得到GPIO口编号;失败:负数,绝对值是错误码
*/
int of_get_named_gpio(struct device_node *np, const char *propname, int index);

提取irq属性API

/**
* of_irq_count从设备树中提取中断的数量
* @np - 设备节点指针
* 成功:大于等于0,实际中断数量,0则表示没有中断
*/
int of_irq_count(struct device_node *dev);
/**
* of_irq_get - 从设备树中提取中断号
* @np - 设备节点指针
* @index - 要提取的中断号的标号
* 成功:中断号;失败:负数,其绝对值是错误码
int of_irq_get(struct device_node *dev, int index);

提取其他属性API

/**
* of_get_mac_address - 从设备树中提取MAC地址
* @np - 设备节点指针
* @成功:MAC(6字节)的首地址;失败:NULL
*/
void *of_get_mac_address(struct device_node *np);

设备树DTS 学习:3-驱动开发中常用的 DTS api的更多相关文章

  1. Linux内核(17) - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

  2. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  3. .net开发中常用的第三方组件

    .net开发中常用的第三方组件 2013-05-09 09:33:32|  分类: dotnet |举报 |字号 订阅     下载LOFTER 我的照片书  |   RSS.NET.dll RSS. ...

  4. 依赖注入及AOP简述(十)——Web开发中常用Scope简介 .

    1.2.    Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l        第一个比较常用的就是Application级Scope,通常我们会将一 ...

  5. spring注解开发中常用注解以及简单配置

    一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...

  6. 2019-2-20C#开发中常用加密解密方法解析

    C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...

  7. 开发中常用的es6知识

    结合实际开发,开发中常用的es6的知识: 1.新增let和const命令: ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效: cons ...

  8. Android开发中常用的库总结(持续更新)

    这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...

  9. iOS开发中常用的数学函数

    iOS开发中常用的数学函数 /*---- 常用数学公式 ----*/ //指数运算 3^2 3^3 NSLog(,)); //result 9 NSLog(,)); //result 27 //开平方 ...

  10. Struts2页面开发中常用标签使用说明

    1. Struts2页面开发中常用标签使用说明 1.1.往action里传值的使用方式: <input name="userName" type="text&quo ...

随机推荐

  1. 建立成功平台工程的关键:自助式 IaC

    从技术上讲,云一直都是自助式服务,但由于其在实践中的复杂性,许多开发人员并不喜欢.随着公司采用现代架构(云原生.无服务器等)和新的提供商(多云.SaaS 应用程序),以及云提供商发布更多服务,云变得更 ...

  2. ABAP 7.58 中支持任意精度算术的新类

    1. 引言 通常,有两种对编程语言的改进.第一种是让困难的事情变得简单,第二种是让不可能的事情变为可能.本文介绍的是任意精度算术,它属于第二类:使在ABAP中原本不可能的事情成为可能. 过去已经可以在 ...

  3. 微分流形Loring Tu 习题21.2解答

    今天的作业,随手写到博客吧. \(Proof.\)对于任意的\(p \in M\),有p附近的坐标卡\((U,x^{1},\ldots,x^{n})\), 由引理\(21.4\),$$dx^{1}\w ...

  4. Surge DHCP设置

    关于DNS配置 对于中国用户,推荐的 DNS 配置如下: 如果经常使用的网络没有 DNS 劫持问题:配置为使用系统 DNS 配置并追加 223.5.5.5 和 114.114.114.114 作为冗余 ...

  5. P3193 [HNOI2008] GT考试 题解

    之前学矩阵乘的时候做的题,当时因为不会\(kmp\)搜索一稀里糊涂过去了,现在填个坑. 头图 是\(Logos\)! P3193 [HNOI2008] GT考试 题链:洛谷 题库 题目大意: 求有多少 ...

  6. 密码学—DES加密的IP置换Python程序

    文章目录 IP初始置换与逆置换 编程想法 转二进制过程中的提取一些数据 64为一组 IP置换 IP逆置换 DES发明人 美国IBM公司W. Tuchman 和 C. Meyer1971-1972年研制 ...

  7. 5GC 关键技术之 SBA(基于服务的软件架构)

    目录 文章目录 目录 前文列表 5GC 的关键技术 SBA(基于服务的软件架构) 微服务架构 NF 的模块化 NF Service 的服务化 前文列表 <简述移动通信网络的演进之路> &l ...

  8. 基于FPGA的电子琴设计(按键和蜂鸣器)----第一版

    欢迎各位朋友关注"郝旭帅电子设计团队",本篇为各位朋友介绍基于FPGA的电子琴设计(按键和蜂鸣器)----第一版. 功能说明: 外部输入七个按键,分别对应音符的"1.2. ...

  9. 5款.NET开源、免费、功能强大的图表库

    LiveCharts2 LiveCharts2是一个.NET开源(MIT License).简单.灵活.交互式且功能强大的.NET图表.地图和仪表,现在几乎可以在任何地方运行如:Maui.Uno Pl ...

  10. 超详细--redis在Linux环境搭建主从复制

    引言Redis是一个高性能的缓存中间件,一个Redis服务器可以支撑很多的并发请求.但是在一些超高的并发场景下,虽然Redis读写速度很快,但也会产生读写压力过大,服务器负载过高的情况.为了分担读写的 ...