背景

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

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

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

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

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

device_node

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

  1. //include/of.h
  2. 46 struct device_node {
  3. 47 const char *name;
  4. 48 const char *type;
  5. 49 phandle phandle;
  6. 50 const char *full_name;
  7. 51
  8. 52 struct property *properties;
  9. 53 struct property *deadprops; /* removed properties */
  10. 54 struct device_node *parent;
  11. 55 struct device_node *child;
  12. 56 struct device_node *sibling;
  13. 57 struct device_node *next; /* next device of same type */
  14. 58 struct device_node *allnext; /* next in list of all nodes */
  15. 59 struct proc_dir_entry *pde; /* this node's proc directory */
  16. 60 struct kref kref;
  17. 61 unsigned long _flags;
  18. 62 void *data;
  19. 63 #if defined(CONFIG_SPARC)
  20. 64 const char *path_component_name;
  21. 65 unsigned int unique_id;
  22. 66 struct of_irq_controller *irq_trans;
  23. 67 #endif
  24. 68 };

struct device_node

--47-->节点名

--48-->设备类型

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

--54-->父节点指针

--55-->子节点指针

查找节点API

  1. /**
  2. * of_find_compatible_node - 通过compatible属性查找指定节点
  3. * @from - 指向开始路径的节点,如果为NULL,则从根节点开始
  4. * @type - device_type设备类型,可以为NULL
  5. * @compat - 指向节点的compatible属性的值(字符串)的首地址
  6. * 成功:得到节点的首地址;失败:NULL
  7. */
  8. struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compat);
  9. /**
  10. * of_find_matching_node - 通过compatible属性查找指定节点
  11. * @from - 指向开始路径的节点,如果为NULL,则从根节点开始
  12. * @matches - 指向设备ID表,注意ID表必须以NULL结束
  13. * 范例: const struct of_device_id mydemo_of_match[] = {
  14. { .compatible = "fs4412,mydemo", },
  15. {}
  16. };
  17. * 成功:得到节点的首地址;失败:NULL
  18. */
  19. struct device_node *of_find_matching_node(struct device_node *from,const struct of_device_id *matches);
  20. /**
  21. * of_find_node_by_path - 通过路径查找指定节点
  22. * @path - 带全路径的节点名,也可以是节点的别名
  23. * 成功:得到节点的首地址;失败:NULL
  24. */
  25. struct device_node *of_find_node_by_path(const char *path);
  26. /**
  27. * of_find_node_by_name - 通过节点名查找指定节点
  28. * @from - 开始查找节点,如果为NULL,则从根节点开始
  29. * @name- 节点名
  30. * 成功:得到节点的首地址;失败:NULL
  31. */
  32. struct device_node *of_find_node_by_name(struct device_node *from,const char *name);

提取通用属性API

  1. /**
  2. * of_find_property - 提取指定属性的值
  3. * @np - 设备节点指针
  4. * @name - 属性名称
  5. * @lenp - 属性值的字节数
  6. * 成功:属性值的首地址;失败:NULL
  7. */
  8. struct property *of_find_property(const struct device_node *np, const char *name, int *lenp);
  9. /**
  10. * of_property_count_elems_of_size - 得到属性值中数据的数量
  11. * @np - 设备节点指针
  12. * @propname - 属性名称
  13. * @elem_size - 每个数据的单位(字节数)
  14. * 成功:属性值的数据个数;失败:负数,绝对值是错误码
  15. */
  16. int of_property_count_elems_of_size(const struct device_node *np,const char *propname, int elem_size);
  17. /**
  18. * of_property_read_u32_index - 得到属性值中指定标号的32位数据值
  19. * @np - 设备节点指针
  20. * @propname - 属性名称
  21. * @index - 属性值中指定数据的标号
  22. * @out_value - 输出参数,得到指定数据的值
  23. * 成功:0;失败:负数,绝对值是错误码
  24. */
  25. int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value);
  26. /**
  27. * of_property_read_string - 提取字符串(属性值)
  28. * @np - 设备节点指针
  29. * @propname - 属性名称
  30. * @out_string - 输出参数,指向字符串(属性值)
  31. * 成功:0;失败:负数,绝对值是错误码
  32. */
  33. int of_property_read_string(struct device_node *np, const char *propname, const char **out_string);

提取addr属性API

  1. /**
  2. * of_n_addr_cells - 提取默认属性“#address-cells”的值
  3. * @np - 设备节点指针
  4. * 成功:地址的数量;失败:负数,绝对值是错误码
  5. */
  6. int of_n_addr_cells(struct device_node *np);
  7. /**
  8. * of_n_size_cells - 提取默认属性“#size-cells”的值
  9. * @np - 设备节点指针
  10. * 成功:地址长度的数量;失败:负数,绝对值是错误码
  11. */
  12. int of_n_size_cells(struct device_node *np);
  13. /**
  14. * of_get_address - 提取I/O口地址
  15. * @np - 设备节点指针
  16. * @index - 地址的标号
  17. * @size - 输出参数,I/O口地址的长度
  18. * @flags - 输出参数,类型(IORESOURCE_IO、IORESOURCE_MEM)
  19. * 成功:I/O口地址的首地址;失败:NULL
  20. */
  21. __be32 *of_get_address(struct device_node *dev, int index, u64 *size, unsigned int *flags);
  22. /**
  23. * of_translate_address - 从设备树中提取I/O口地址转换成物理地址
  24. * @np - 设备节点指针
  25. * @in_addr - 设备树提取的I/O地址
  26. * 成功:物理地址;失败:OF_BAD_ADDR
  27. */
  28. u64 of_translate_address(struct device_node *dev, const __be32 *in_addr);
  29. /**
  30. * of_iomap - 提取I/O口地址并映射成虚拟地址
  31. * @np - 设备节点指针
  32. * @index - I/O地址的标号
  33. * 成功:映射好虚拟地址;失败:NULL
  34. */
  35. void __iomem *of_iomap(struct device_node *np, int index);
  36. /**
  37. * 功能:提取I/O口地址并申请I/O资源及映射成虚拟地址
  38. * @np - 设备节点指针
  39. * @index - I/O地址的标号
  40. * @name - 设备名,申请I/O地址时使用
  41. * 成功:映射好虚拟地址;失败:NULL
  42. */
  43. void __iomem *of_io_request_and_map(struct device_node *np, int index, const char *name);

提取resource属性API

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

提取GPIO属性API

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

提取irq属性API

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

提取其他属性API

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

设备树DTS 学习:3-常用的DTS 函数的更多相关文章

  1. 05 python学习笔记-常用内置函数(五)

    1.sorted() 函数对所有可迭代的对象进行排序(默认升序)操作 sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. l ...

  2. Python学习笔记-常用内置函数

    输出:print() 功能:输出打印 语法:print(*objects, sep=' ', end='\n', file=sys.stdout) 参数:objects----复数,表示可以一次输出多 ...

  3. 设备树(device tree)学习笔记

    作者信息 作者:彭东林 邮箱:pengdonglin137@163.com 1.反编译设备树 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助.这里我们 ...

  4. 设备树(device tree)学习笔记【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/4495056.html 阅读目录(Content) 1.反编译设备树 2.分析工具fdtdump 3.Linu ...

  5. Linux设备树学习

    1.概念 设备树用于实现驱动代码与设备信息相分离.驱动代码只负责处理驱动的逻辑而关于设备的具体信息存放到设备树文件中.(dts文件,编译后为dtb文件).一个dts文件对应一个ARM的machine, ...

  6. Linux设备树语法详解

    概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代 ...

  7. Linux设备树语法详解【转】

    转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...

  8. 【ARM-Linux开发】内核3.x版本之后设备树机制

    内核3.x版本之后设备树机制 Based  on  Linux  3.10.24  source  code  参考/documentation/devicetree/Booting-without- ...

  9. 【linux】驱动-8-一文解决设备树

    目录 前言 8. Linux设备树 8.1 设备树简介 8.2 设备树框架 8.2.1 设备树格式 8.2.1.1 DTS 文件布局 8.2.1.2 node 格式 8.2.1.3 propertie ...

  10. imx6设备树pinctrl解析【转】

    转自:http://blog.csdn.net/michaelcao1980/article/details/50730421 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在移植linu ...

随机推荐

  1. 【JavaWeb】导入Excel并进行校验

    一.需要实现的目标 1.界面编写 2.导入表读取表名,进行校验,后台匹配(判断此表的名称是否能够模糊匹配上) 3.确定表存在,读取其中的数据,暂存 4.正则表达式数据校验(判断是否已存在,数据是否符合 ...

  2. 如何安装部署和优化Tomcat?(Tomcat部署和优化与压测,虚拟主机配置,Tomcat处理请求的过程)

    文章目录 前言 一:Tomcat安装部署 1.1:Tomcat简介 1.2:Tomcat核心组件 1.3:Tomcat处理请求的过程 1.3.1:请求过程基本解释 1.3.2:请求过程详细解释 1.4 ...

  3. extractvalue报错注入

    查看源码 $uagent = $_SERVER['HTTP_USER_AGENT']; ………… $uname = check_input($_POST['uname']); $passwd = ch ...

  4. Re库的基本使用

    # Re库的主要功能函数 """ re.search() 在一个字符串中搜索匹配正则表达式的第一个位置, 返回match对象 re.match() 在一个字符串的开始位置 ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:设置浮动和偏移

    <!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...

  6. cin和cout输⼊输出

    写再最前面:摘录于柳神的笔记:  就如同 scanf 和 printf 在 stdio.h 头⽂件中⼀样, cin 和 cout 在头⽂件 iostream ⾥⾯,看名字就知 道, io 是输⼊输出 ...

  7. PostgreSQL存取jsonb

    从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型,也就是和varchar.int一样,我们表里的一个字段的类型可以为json了. 与此同时,postgres还提供了j ...

  8. Go语言的map

    map一般是以库的方式提供,在C++和C#和JAVA中都需要引用相应的库而Go语言不需要引入库,可以直接方便使用 定义:map是一堆键值对的未排序集合.无序 1.声明变量: map的声明基本上没有多余 ...

  9. Vue源码(下篇)

    上一篇是mount之前的添加一些方法,包括全局方法gloal-api,XXXMixin,initXXX,然后一切准备就绪,来到了mount阶段,这个阶段主要是 解析template 创建watcher ...

  10. spark广播变量定时更新

    广播变量 先来简单介绍下spark中的广播变量: 广播变量允许程序员缓存一个只读的变量在每台机器上面,而不是每个任务保存一份拷贝.例如,利用广播变量,我们能够以一种更有效率的方式将一个大数据量输入集合 ...