ioremap_nocache() 函数的使用
2017-01-31 11:03
453 查看
本篇文章主要是在ioremap_nocache函数说明的基础上进行整理,加入该函数的用法简介。
调用
应用程序常用
函数原型
void __iomem * ioremap_nocache (unsigned long offset, unsigned long size); /* * ioremap - map bus memory into CPU space * @offset: bus address of the memory * @size: size of the resource to map * * ioremap performs a platform specific sequence of operations to * make bus memory CPU accessible via the readb/readw/readl/writeb/ * writew/writel functions and the other mmio helpers. The returned * address is not guaranteed to be usable directly as a virtual * address. */
调用
ioremap_nocache()函数之后,返回一个线性地址,此时CPU 可以访问设备的内存(已经将其映射到了线性地址空间中了),此时CPU可以使用访问内存的指令访问设备的内存空间,此时我们就可以像访问内存一样来访问设备的内存(寄存器)。
ioremap是为一段高端的物理内存建立映射(即增加相关的页表内容),驱动常用
mmap为可能不连续的一系列逻辑上相关的(如整体是一个文件)物理内存段建立映射,并呈现一个连续的虚拟地址空间。
应用程序常用
mmap是系统调用,只能应用程序用。
ioremap是kernel提供的函数,只能在kernel里用。
用法
以下示例以读写基地址为0x9C016000,offset为0x100的寄存器为例。// 全局定义两个变量 static void __iomem *vaddr_base; volatile u32 rw32; // 从物理地址 0x9C016000 开始映射 0x200 大小给虚拟地址 vaddr_base // 只执行一次 vaddr_base = ioremap_nocache(0x9C016000, 0x200); // 读写0x9C016000+0x100寄存器bit24~bit27为0001 rw32 = *(volatile u32*)(vaddr_base + 0x100); // 读 printk("Reg0x%x = 0x%x\n", 0x9C016000 + 0x100, rw32); rw32 &= 0xf0ffffff; rw32 |= 0x01000000; *(volatile u32*)(vaddr_base + 0x100) = rw32; // 写 iounmap(vaddr_base);
相关文章推荐
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
- 小明的烦恼
- Android中事件处理机制之——ViewGroup的事件传递详解(一)
- python的Tqdm模块
- Rust 变量与函数
- SDL 显示bmp图片
- Cookie、Session 与 application
- leetcode - 33. Search in Rotated Sorted Array
- 直接拷贝数据文件实现Oracle数据迁移
- 数据结构颓废计划III-基础线段树
- POJ 3608 Bridge Across Islands [旋转卡壳]
- 2路归并排序
- 小幸福
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
- Untitled
- go语言快速入门:第一个HelloWorld(2)
- android_107_ProgressBar旋转
- mysql 协议的statistics命令包及解析
- python之简单主机批量管理工具
- 企业级财富库socket开发和设计