Linux 获取设备树源文件(DTS)里描述的资源
Linux 获取设备树源文件(DTS)里的资源
韩大卫@吉林师范大学
在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 platform_driver 的probe() 里面知道设备的中断号, 内存地址等资源。
这些资源的描述信息存放在 resource 数据结构中, 相同的资源存放在一个树形树形数据结构中, 通过父节点, 兄弟节点, 子节点相连。 比如中断资源, IO端口资源, IO内存资源, DMA资源有不同资源树。
Linux使用 struct resource 来描述一个resouce
struct resource {
resource_size_t start; //资源范围的开始
resource_size_t end; //资源范围的结束
const char *name; //资源拥有者名
unsigned long flags; //资源属性标识
struct resource *parent, *sibling, *child; //资源树的父节点, 兄弟节点, 字节点指针
};
resource_size_t 由系统决定 为uint32_t 或uint64_t 。
在platform机制里, 使用platform_get_resource()来获取指定的资源类型。
比如获取想获取中断号,
irq = platform_get_irq(pdev, 0);
int platform_get_irq(struct platform_device *dev, unsigned int num)
{
struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);
return r ? r->start : -ENXIO;
}
EXPORT_SYMBOL_GPL(platform_get_irq);
platform_get_irq() 会返回一个start, 即可用的中断号。
之后便可使用request_irq() 来注册中断服务函数。
再比如想要获取IO内存资源:
struct resource *res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
即可得到一个IO内存资源节点指针, 包括了地址的开始,结束地址等, 该IO内存的长度可用 resource_size() 来获取, 但这段资源只是一个描述, 想真正使用这段IO内存, 还要经过先申请, 再映射的过程。例如可使用devm_request_mem_region()申请出使用这段IO内存, 再使用ioremap() 将其映射出来, 供用户空间使用。
devm_request_mem_region(&pdev->dev, res_mem->start, resource_size(res_mem),
res_mem->name))
addr_start = ioremap(res_mem->start, resource_size(res_mem));
ioremap() 的返回值即为该资源的虚拟地址。
IO内存的资源是在设备树源(Device Tree Source)文件(以.dts结尾)里给出的,.dts文件就是用来描述目标板硬件信息的, 在uboot启动后, 使用uboot提供的特定API将其获取出来, 如fdt_getprop(), fdt_path_offset(), 这些API包含在uboot 的头文件<libfdt.h> 里面。
uboot将.dts文件里的描述解析出来, 再对相应寄存器赋值, 在linux启动后, 使用 platform_get_resource() 即可获取到这些给定的资源, 在驱动里使用。
例如一个在.dts文件中关于gpio资源的描述:
gpio: gpio-controller@1070000000800 {
#gpio-cells = <2>;
compatible = "cavium,octeon-3860-gpio";
reg = <0x10700 0x00000800 0x0 0x100>;
gpio-controller;
…
根据其描述, 可知道gpio控制器的IO内存起始地址为:0x107900000800, 长度为0x100.
即从 0x107900000800 到 0x1079000008ff.
在目标板里使用 cat /proc/iomem 可以看到:
1070000000800-10700000008ff : /soc@0/gpio-controller@1070000000800
关于i2c 的描述:
twsi0: i2c@1180000001000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "cavium,octeon-3860-twsi";
reg = <0x11800 0x00001000 0x0 0x200>;
interrupts = <0 45>;
clock-rate = <100000>;
IO内存起始地址为: 0x118000001000, 长度为0x200.
从 0x118000001000 到 0x1180000011ff.
在目标板里使用 cat /proc/iomem 可以看到:
1180000001000-11800000011ff : /soc@0/i2c@1180000001000
Linux 获取设备树源文件(DTS)里描述的资源的更多相关文章
- Linux 获取设备树源文件(DTS)里的资源【转】
本文转载自:http://blog.csdn.net/keleming1/article/details/51036000 http://www.cnblogs.com/dyllove98/archi ...
- Linux 获取设备树源文件(DTS)里描述的资源【转】
转自:http://www.linuxidc.com/Linux/2013-07/86839.htm 转自:http://blog.sina.com.cn/s/blog_636a55070101mce ...
- linux驱动之获取设备树信息
上一篇文章学习了字符设备的注册,操作过的小伙伴都知道上一篇文章中测试驱动时是通过手动创建设备节点的,现在开始学习怎么自动挂载设备节点和设备树信息的获取,这篇文章中的源码将会是我以后编写字符驱动的模板. ...
- 芯灵思Sinlinx A64 linux 通过设备树写LED驱动(附参考代码,未测试)
开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 全志A64设备树结构体 #inc ...
- Linux内核 设备树操作常用API【转】
转自:https://www.linuxidc.com/Linux/2017-02/140818.htm 一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在&qu ...
- Linux内核 设备树操作常用API
Linux设备树语法详解一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在"include/of.h"中声明. device_node 内核中 ...
- 设备树DTS 学习:1-有关概念
背景 设备树在Linux驱动开发中是一种比较常用的架构. 参考:<设备树DTS使用总结> .<linux内核设备树及编译> Linux设备树 介绍 在Linux 2.6中,ar ...
- Linux设备树使用(二)
一.设备树与驱动的匹配1.设备树会被/scripts中的dtc可执行程序编译成二进制.dtb文件,之前设备树中的节点信息会以单链表的形式存储在这个.dtb文件中:驱动与设备树中compatible属性 ...
- 设备树DTS 学习:2-设备树语法
背景 通过上一讲了解完设备树DTS有关概念,我们这一讲就来基于设备树例程,学习设备树的语法规则. 参考:设备树详解dts.设备树语法详解.设备树使用总结 设备树框架 1个dts文件 + n个dtsi文 ...
随机推荐
- OCJP(1Z0-851) 模拟题分析(七)-->214
Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...
- java 杂物间 (二) Spring Web
需要明确记住的继承关系
- hdu 4389 数位dp
求区间内满足x%fx==0的数的个数,fx为该数各个位数上的数字之和Sample Input21 1011 20 Sample OutputCase 1: 10Case 2: 3 大小不是你想开,想开 ...
- [荐]js模版引擎handlebars.js
[官方介绍:http://handlebarsjs.com/] Handlebars provides the power necessary to let you build semantic te ...
- Android 第3方控件一览表
1 UnSlideListView 解决在ScrollView的无法正常显示的问题 例子在“真好项目”中“NGDetailActivity”.“HKcfqjActivity”.
- loj 1038(dp求期望)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25915 题意:求一个数不断地除以他的因子,直到变成1的时候 除的次 ...
- Quick-Cocos2dx 快速了解
set_dev_envirment // */ // ]]> Cocos2dx快速了解 1. Quick-Cocos2dx 开发环境搭建 1.1. 官网: 1.2. Github: 1.3. s ...
- nginx日志中文变成类似\xE9\xA6\x96\xE9\xA1\xB5-\xE6\x8E\xA8\xE8\x8D\x90的东西,治本方案
这里:https://groups.google.com/forum/#!topic/openresty/NcRSb5gTmVU 主要是: 这与 ngx_lua 无关,是较新的 nginx 核心引入的 ...
- SU Demos-07NMO
本例还不完善,不足之处,欢迎批评指正 先看readme 第1个脚本,显示速度模型 脚本#2,生成数据 脚本#3,显示合成数据 脚本#4,进行速度分析 脚本#5,动校叠加
- Color the ball(线段树)
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...