devm_ioremap_resource devm_ioremap 区别
从源代码看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 区别相关推荐
- RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别
1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...
- C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...
- gcc 和 g++ 的联系和区别,使用 gcc 编译 c++
GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...
- Python2 与 Python3 区别
Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...
- Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别
Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...
- HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)
TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...
- python二进制打开(rb)和文本格式打开(r)什么区别?
使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...
- python中__dict__与dir()区别
前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...
- java和C#面向对象的区别
问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...
最新文章
- boost::gil::bit_aligned_pixel_reference用法的测试程序
- Android常用开源框架
- Android开发之自定义菊花进度条对话框
- 6.安装使用vue-quill-editor
- python教程1003无标题_OSError:[WinError 10038]试图对非s的对象执行操作
- python自带的shell、其性能优于ipython吗_根据强化的性质和目的可以分成()。 A.自然强化物和人为的近似强化物B.积极强化和消极...
- vim保存文件时,生成.un~文件
- DynamicFusion: Reconstruction and Tracking of Non-rigid scenes in real-time
- Twisted入门教程(10)
- 软件工程 第五章 详细设计
- 思科CCNA电子教程
- 儒豹手机搜索发布2008年各频道关键词排行榜
- 联想服务器修改显存,如何调整用于显卡的共享内存
- apa引用要在文中吗_如何在研究论文中引用文献
- 倾斜摄影数据转cesium 3dtile(详细步骤)
- 二进制(二):十进制转二进制的两种方法
- python egg_python egg 简介
- CSS 文字装饰 text-decoration amp; text-emphasis
- 在html中 常见的块级元素有哪些,常见的css块级元素有哪些
- H3C交换机配置链路聚合
热门文章
- WPS文字绿色版下载 WPS Office 2010 中文绿色版
- 不看OCJP考题你永远不知道自己的JAVA基础有多差(一)
- php-tanita,♥【停更】 ♥【 鉴于有些人把分享了的二次分享到别的论坛在此停更】♥♥【Tanitas8专贴】♥♥...
- Eclipse中同时打开多个控制台(Console)
- caffe安装详细完整过程(Ubuntu16.04、Ubuntu18.04系统)
- java-net-php-python-ssm巴音学院本科部校园网站计算机毕业设计程序
- js实现纯前端截屏(可以对iframe的内容进行截取)
- 商业数据分析的典型方法
- Python数据库篇
- [11]JDK9新特性