背景

本章的内容是为了实现在驱动中的开发,通过调用有关的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. Radash库使用说明——数组方法篇(全)

    写在前面 tips:点赞 + 收藏 = 学会! 本文包含radash中数组相关的所有方法说明 + 使用示例 + 思维导图查看 这边会整理出一份数组相关方法的使用大纲(不含源码解析),方便大家查阅使用: ...

  2. Mybatis的逆向工程(generator)

    Tips:Mybatis generator官网 http://www.mybatis.org/generator/configreference/commentGenerator.html Myba ...

  3. XPRA: SAP传输后自动运行程序

    今天了解到一个功能,允许TR导入后自动运行指定程序.比如使用VOFM创建新的例程后,需要运行RV80HGEN来重新生成程序.可以在TR中包含以下对象,则TR导入完成后,会自动运行RV80HGEN. P ...

  4. Go pprof 认知到实践

    快速开始 测试环境:go version go1.22.2 windows/amd64,源代码开源在 https://github.com/oldme-git/teach-study/tree/mas ...

  5. gin框架对接快递100 查询快递跟踪记录 Golang实现快递查询

    参考ui效果: https://www.kuaidi100.com/?from=openv gin框架: 请求地址 http://localhost:8822/kd100/auto_com_num?n ...

  6. Ajax 请求总共有八种 Callback

    1)onSuccess 2)onFailure 3)onUninitialized 4)onLoading 5)onLoaded 6)onInteractive 7)onComplete 8)onEx ...

  7. Asp .Net Core 系列:集成 CAP + RabbitMQ + MySQL(含幂等性)

    简介 官网:https://cap.dotnetcore.xyz/ CAP 是什么? 是一个 EventBus,同时也是一个在微服务或者 SOA 系统中解决分布式事务问题的一个框架.它有助于创建可扩展 ...

  8. springboot 整合mail 发送邮件

    springboot 整合mail 发送邮件 pom.xml <properties> <java.version>1.8</java.version> <p ...

  9. ABP邮件发送

    ABP  Vnext发邮件要使用AbpMailKitModule的实现IEmailSender,要检查添加了Volo.Abp.MailKit,其dependon 要添加typeof() 它使用Sett ...

  10. Azkaban快速入门

    先说一些废话 因为之前自己工作中有用过Azkaban作为自动化任务调度工具,所以想参考自己之前的使用经验,总结一下关于Azkaban的使用,方便大家使用Azkaban快速实现企业级自动化任务 如何选择 ...