CPU通过物理地址访问DDR和外设,DDR内存称为物理内存地址空间,外设寄存器组称为I/O内存地址空间。

ARM采用统一编址,而X86采用独立编制。上一章介绍了DDR内存分配,这一章介绍I/O内存分配。

1、I/O内存分配和映射

#include <linux/ioport.h>

分配I/O内存区,失败返回NULL,所有的I/O内存分配可以通过/proc/iomem节点查询
struct resource *request_mem_region(unsigned long start, unsigned long len, char *name); 释放I/O内存区
void release_mem_region(unsigned long start, unsigned long len); #include <asm/io.h> void *ioremap(unsigned long phys_addr, unsigned long size); void *ioremap_nocache(unsigned long phys_addr, unsigned long size); void iounmap(void *addr);

2、存取I/O内存

首先使用request_mem_region分配I/O内存,然后调用ioremap重定位I/O内存到内核虚拟地址空间,接下来使用下述接口进行I/O内存存取。

I/O内存读操作:
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr); I/O内存写操作:
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr); I/O内存块操作:
void memset_io(void *addr, u8 value, unsigned int count);
void memcpy_fromio(void *dest, void *source, unsigned int count);
void memcpy_toio(void *dest, void *source, unsigned int count); 有一组旧的接口:
unsigned readb(address);
unsigned readw(address);
unsigned readl(address); void writeb(unsigned value, address);
void writew(unsigned value, address);
void writel(unsigned value, address);

最新文章

  1. ASP.NET MVC Model绑定(四)
  2. DAO实现查询
  3. mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例
  4. MyEclipse 8.5整合Git,并在Github上发布项目【转】
  5. Python脚本控制的WebDriver 常用操作 &lt;九&gt; 定位一组对象
  6. Java开发手册
  7. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第3讲(玩家发射子弹)
  8. Python猜数小游戏
  9. 博弈论初步(SG函数)
  10. MyEclipse配置默认自带的Java代码格式化
  11. linux判断日志文件大小进行清理
  12. Redis2.2.2源码学习——Server&amp;Client链接的建立以及相关Event
  13. spring util list
  14. MFC 小知识总结五
  15. centos 搭建 docker sentry
  16. HDU1160:FatMouse&#39;s Speed(最长上升子序列,不错的题)
  17. Webpack的详细配置,[Webpack中各种loader的安装配置]
  18. golang mcall
  19. UVA.11300 Spreading the Wealth (思维题 中位数模型)
  20. 判断UISrollview的滑动方向

热门文章

  1. ubuntu14 teamviewer使用
  2. 对C++拷贝构造函数的一点理解
  3. 数据库与前端与Django目录
  4. Android remote gdb
  5. winform 窗体间传值
  6. 事件流程以及dom2级事件绑定
  7. 使用css3的repeating-linear-gradient画虚线
  8. vi文本编辑器的使用
  9. C语言对传入参数的处理
  10. 接触oracle的第二天