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