您的当前位置:首页正文

ioremap函数

2024-11-08 来源:个人技术集锦

一、 ioremap() 函数基础概念

几乎每一种外设都是通过读写设备上的相关寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:

a – I/O 映射方式(I/O-mapped)

   典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",
   CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。

b – 内存映射方式(Memory-mapped)

 RISC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址空间,外设I/O端口成为内存的一部分。
 此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。

但是,这两者在硬件实现上的差异对于软件来说是完全透明的,驱动程序开发人员可以将内存映射方式的I/O端口和外设内存统一看作是"I/O内存"资源。

1、ioremap函数

ioremap宏定义在asm/io.h内:

#define ioremap(cookie,size)   __ioremap(cookie,size,0)

__ioremap函数原型为(arm/mm/ioremap.c):

void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags);

参数:

size:要映射的空间的大小

flags:要映射的IO空间和权限有关的标志

2、iounmap函数

iounmap函数用于取消ioremap()所做的映射,原型如下:

void iounmap(void * addr);

二、 ioremap() 相关函数解析

读写I/O的函数如下所示:

a – writel()

writel()往内存映射的 I/O 空间上写数据,wirtel() I/O 上写入 32 位数据 (4字节)。

原型:void writel (unsigned char data , unsigned int addr )

b – readl()

readl() 从内存映射的 I/O 空间上读数据,readl 从 I/O 读取 32 位数据 ( 4 字节 )。

原型:unsigned char readl (unsigned int addr )

引用https://www.cnblogs.com/ggzhangxiaochao/p/12893777.html

显示全文