从源代码看devm_ioremap_resource多了

 if (!devm_request_mem_region(dev, res->start, size, name)) {dev_err(dev, "can't request region for resource %pR\n", res);return IOMEM_ERR_PTR(-EBUSY);}

从driver 代码中可以看到有时间用devm_ioremap_resource, 而有时直接用devm_ioremap


#define devm_request_mem_region(dev,start,n,name) \__devm_request_region(dev, &iomem_resource, (start), (n), (name))struct resource * __devm_request_region(struct device *dev,struct resource *parent, resource_size_t start,resource_size_t n, const char *name)
{struct region_devres *dr = NULL;struct resource *res;dr = devres_alloc(devm_region_release, sizeof(struct region_devres),GFP_KERNEL);if (!dr)return NULL;dr->parent = parent;dr->start = start;dr->n = n;res = __request_region(parent, start, n, name, 0);if (res)devres_add(dev, dr);elsedevres_free(dr);return res;
}
EXPORT_SYMBOL(__devm_request_region);

总结来说,devm_ioremap 就是直接映射, devm_ioremap_resource 是先申请,后映射。

比如
cat /proc/iomem
40300000-5fffffff : /soc/qcom,pcie@1c08000
  40300000-405fffff : PCI Bus 0001:01
    40300000-40301fff : 0001:01:00.0
    40302000-403020ff : 0001:01:00.0
    40302100-403021ff : 0001:01:00.0
  40600000-407fffff : PCI Bus 0001:01
  40800000-40800fff : 0001:00:00.0

这些就是已经申请并映射的device resource. 在使用时直接devm_ioremap 就可以。

但要是直接devm_ioremap,应该也可以,但没有 devm_request_mem_region, 应该在/proc/iomem 查不到。这个我没做实验。

但如果一个device resource 已经申请过了,在调用devm_request_mem_region就会出现下面错误
can't request region for resource ...

因为这个device resource 已经申请过了。

devm_ioremap_resource devm_ioremap 区别相关推荐

  1. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  2. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  3. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  4. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  5. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  6. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  7. python二进制打开(rb)和文本格式打开(r)什么区别?

    使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...

  8. python中__dict__与dir()区别

    前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...

  9. java和C#面向对象的区别

    问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...

最新文章

  1. boost::gil::bit_aligned_pixel_reference用法的测试程序
  2. Android常用开源框架
  3. Android开发之自定义菊花进度条对话框
  4. 6.安装使用vue-quill-editor
  5. python教程1003无标题_OSError:[WinError 10038]试图对非s的对象执行操作
  6. python自带的shell、其性能优于ipython吗_根据强化的性质和目的可以分成()。 A.自然强化物和人为的近似强化物B.积极强化和消极...
  7. vim保存文件时,生成.un~文件
  8. DynamicFusion: Reconstruction and Tracking of Non-rigid scenes in real-time
  9. Twisted入门教程(10)
  10. 软件工程 第五章 详细设计
  11. 思科CCNA电子教程
  12. 儒豹手机搜索发布2008年各频道关键词排行榜
  13. 联想服务器修改显存,如何调整用于显卡的共享内存
  14. apa引用要在文中吗_如何在研究论文中引用文献
  15. 倾斜摄影数据转cesium 3dtile(详细步骤)
  16. 二进制(二):十进制转二进制的两种方法
  17. python egg_python egg 简介
  18. CSS 文字装饰 text-decoration amp; text-emphasis
  19. 在html中 常见的块级元素有哪些,常见的css块级元素有哪些
  20. H3C交换机配置链路聚合

热门文章

  1. WPS文字绿色版下载 WPS Office 2010 中文绿色版
  2. 不看OCJP考题你永远不知道自己的JAVA基础有多差(一)
  3. php-tanita,♥【停更】 ♥【 鉴于有些人把分享了的二次分享到别的论坛在此停更】♥♥【Tanitas8专贴】♥♥...
  4. Eclipse中同时打开多个控制台(Console)
  5. caffe安装详细完整过程(Ubuntu16.04、Ubuntu18.04系统)
  6. java-net-php-python-ssm巴音学院本科部校园网站计算机毕业设计程序
  7. js实现纯前端截屏(可以对iframe的内容进行截取)
  8. 商业数据分析的典型方法
  9. Python数据库篇
  10. [11]JDK9新特性