在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 的头文件 里面。

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)里描述的资源...相关推荐

  1. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  2. Linux 文件系统与设备文件系统 (二)—— sysfs 文件系统与Linux设备模型

    提到 sysfs 文件系统 ,必须先需要了解的是Linux设备模型,什么是Linux设备模型呢? 一.Linux 设备模型 1.设备模型概述 从2.6版本开始,Linux开发团队便为内核建立起一个统一 ...

  3. 《linux设备驱动开发详解》笔记——15 linux i2c驱动

    <linux设备驱动开发详解>笔记--15 linux i2c驱动 15.1 总体结构 如下图,i2c驱动分为如下几个重要模块 核心层core,完成i2c总线.设备.驱动模型,对用户提供s ...

  4. Linux学习(2)-命令基础背景+命令使用帮助获取

    程序的组成 程序的组成部分:二进制程序文件.库文件.配置文件.帮助文件(前两个为二进制格式,后两个为文本格式) 二进制程序文件和库文件都是可执行文件,库文件不能独立执行,只能被调用时执行 配置文件和帮 ...

  5. linux设备模型的主要功能,第 14 章 Linux 设备模型

    第 14 章 Linux 设备模型 在 2.5 开发循环中一个声明的目标是为内核创建一个统一的设备模型. 之前的内核没有单一的数据结构, 使它们可以来获取关于系统如何整合的信息. 尽管缺乏信息, 有时 ...

  6. linux内核不能识别u盘分区,一种在Linux内核中识别特定USB大容量存储设备的方法及系统与流程...

    本发明涉配usb设备识别技术领域,特别是涉及一种在linux内核中识别特定usb大容量存储设备的方法及系统. 背景技术: 在linux系统下对usb设备进行管控,一般而言有两种方法,一种是阻断新插入设 ...

  7. android 获取网卡mac_在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案...

    在安卓6.0以下的设备上,通过WifiManager.getConnectionInfo().getMacAddress()即可获取WLAN物理地址, 而在6.0及以上,以此方式获取到的MAC地址为固 ...

  8. 【嵌入式Linux应用开发】温湿度监控系统——多线程与温湿度的获取显示

    1. 概述 ​ 在前几篇的文章中,我们已经学习了LVGL界面绘制以及paho mqtt的同步客户端和异步客户端的操作,那么本篇就会综合前面的知识,加上Linux系统的多线程以及线程间通信的知识,将LV ...

  9. Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析

    一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数 ...

最新文章

  1. uart协议_UART协议简介
  2. 隔年的衣服发黄处理方法
  3. 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 函数形参设置 | 确保打开文件成功 | 统计文件大小 )
  4. mysql 线程缓存_浅析MySQL内存的使用说明(全局缓存+线程缓存)
  5. 操作系统(1) -- 计算机系统概述
  6. 现代软件工程系列 创新靠学分
  7. pip下载慢的解决方法
  8. 深入浅出 Vue 响应式原理!
  9. linux如何挂载windows下的共享文件
  10. GFW Rule list
  11. Oracle系列--基础理论
  12. 电力系统的常用仿真模块MATLAB/SIMULINK(2)
  13. ab 压力测试及结果分析
  14. 方便的支付宝第三方平台,三分钟教你搭建
  15. 富集分析:(一)概述
  16. Photoshop中曲线调整如何恢复
  17. tensorflow的regress(超详细教程)
  18. Excel-宏、VBA
  19. k8s1.18 StorageClass 使用rbd-provisioner提供ceph rbd持久化存储
  20. 打开anaconda prompt 出错 import ctypes

热门文章

  1. 9008刷机怎么刷_手机刷机怎么刷
  2. 彩色BMP转换成灰度图的原理
  3. math python 向上取整_计算机等级考试二级Python语言模拟试卷单选解答详解第1期...
  4. 初识C++之函数重载
  5. 如何使用matlab的siso,利用Matlab内建程式SISODesignTool完成系统分析(Matlab61)开启.PDF...
  6. 项目七samba服务器,Centos 7 配置Samba服务器
  7. 华为手机怎么下载linux命令,在linux命令
  8. qc成果报告范例_质量引领创新 扬子江勇夺医药行业QC“十五连冠”
  9. mysql乐观锁重试_乐观锁加重试,并发更新数据库一条记录导致:Lock wait timeout exceeded...
  10. java jdbc 操作_Java:JDBC操作