以IO内存资源为例:

platform_get_resource(pdev, IORESOURCE_MEM, 0);

即可得到一个IO内存资源节点指针, 包括了地址的开始,结束地址等, 该IO内存的长度可用 resource_size() 来获取, 但这段资源只是一个描述, 想真正使用这段IO内存, 还要经过先申请, 再映射的过程。例如可使用devm_request_mem_region()申请出使用这段IO内存, 再使用ioremap() 将其映射出来, 供用户空间使用。

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()来获取指定的资源类型。

在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

谈内核资源申请platform_get_resource、devm_request_mem_region、devm_ioremap相关推荐

  1. 【操作系统】浅谈OS内核

    公众号「码农小奎」操作系统-内核篇 实际上,计算机体系在经过几十年的迭代更新之后,操作系统的内核离我们已经很遥远了. 无论是对普通用户还是上层软件开发者来说,内核之中有什么已经不太重要了,而用户更关心 ...

  2. 陈老师Linux内核概述导学

    <Linux内核分析与应用>第一章 : 概述 Are you ready? Linux内核像一座金山,又像一片茂密的森林,出发的入口在哪里?仅仅只有C基础和数据结构知识,也想感受Linux ...

  3. ARMv8架构下修改Linux内核并打开kvm硬件虚拟化支持(平台Firefly-rk3568)

    前言 在做的一个项目需要使用ARMv8的硬件虚拟化支持,而购买的Firefly-3568默认的操作系统内核没有打开kvm虚拟化支持,所以尝试重新编译了一下内核开启虚拟化支持,并将遇到的问题和一些解决方 ...

  4. Windows高级编程学习笔记(一)

    写在前面的话 之前学的Windows编程都是界面啊.网络编程啊之类的纯应用层面的东西,总是感觉而自己没有达到自己期望中的水平.什么水平呢?如果让你编写监控系统资源的工具,或者DLL注入相关软件,或者底 ...

  5. 一道面试题:遇到大规模Oracle坏块该怎么处理?

    最近一两个月,一直有场景化运维.场景化大数据分析的声音围绕在耳畔,以Gdevops全球敏捷运维峰会杭州站上新炬网络执行副总裁程永新的"一切没有场景驱动的运维平台建设都是假大空!"最 ...

  6. Android Weekly - 40 :国庆不知道学什么?这份 Android 优秀技术文章清单请收下

    技术文章 Performance improvement opportunities in the open source C++ standard libraries https://llvm.or ...

  7. 浅谈linux - 内核时间的处理

    概述 对于嵌入式开发,经常会遇到一些定时.延时以及周期调度的情况,所以定时器是必不可少的一种资源. 相对于裸机开发,我们使用定时器只需先选择时钟源,然后设置分频系数和计数值,配置好中断后,就可以静静的 ...

  8. Linux内核之浅谈内存寻址

    Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...

  9. 谈华为鸿蒙内核和操作系统,谈华为鸿蒙内核和操作系统

    作者 | 陆首群 谈到华为自研鸿蒙内核和操作系统,从华为透漏出来的信息来看,有点自相矛盾.扑朔迷离!我曾说过:真真假假,虚虚实实!这里有技术原因,也有外部原因. 一开始(大概是 2016 年左右),华 ...

最新文章

  1. pytorch 查看模型参数,查看模型特定层输入输出,模型结构图绘制总结
  2. Fedora安装Samba与windows共享文件
  3. 控制反转---依赖注入理解
  4. bat面试题 python 单链表反转排序
  5. servlet web.xml配置详解
  6. 【Android 界面效果22】Android的Tab与TabHost
  7. android 弹窗圆角,Android 自定义底部圆角弹窗的实现
  8. CVPR 2021 involution:超越convolution和self-attention的神经网络新算子
  9. 《R语言数据挖掘》----1.15 结果可视化
  10. java request获取文件_request获取路径方式
  11. Hadoop数据分析实例:P2P借款人信用风险实时监控模型设计
  12. python之web框架(3):WSGI之web应用完善
  13. 2017软件构造3.3
  14. 用c语言写财务软件,财务软件,您选对了吗?T+/T+C、T3深度实测对比
  15. x265的sao优化思考
  16. 大众点评有多少用户2019_据说2019年度大众点评排名第一
  17. win10键锁定计算机,win10笔记本键盘win键被锁怎么解锁
  18. 华为P7开启USB调试方法
  19. 测试开发工作者日记:2020.6.10-6.11
  20. OpenGL学习---高级光照---法线贴图

热门文章

  1. maya多边形顶点变形批量传递方法
  2. 基于Servlet+Jsp实现的酒店客房预定管理系统分前后台
  3. 蓝桥杯 回文素数 Java
  4. vue3+ Micro App (一)
  5. 我们要了解我们国家常识--一个中国人必须知道
  6. 项目Beta冲刺(团队)——用户试用调查报告
  7. 打印冻结窗格怎么保证每页都有_EXCEL固定表头_冻结窗口以及打印的应用方法
  8. 单片机寄存器的位操作
  9. 弘辽科技:新店铺新链接如何入池。
  10. day02 linux常用命令