http://www.diybl.com/course/6_system/linux/Linuxjs/20090503/166312.html
Region的操作函数__XXX_region(),Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏:
①request_mem_region()宏,请求分配指定的I/O内存资源。
②check_ mem_region()宏,检查指定的I/O内存资源是否已被占用。
③release_ mem_region()宏,释放指定的I/O内存资源。
这三个宏的定义如下:
#define request_mem_region(start,n,name)
__request_region(&iomem_resource, (start), (n), (name))
#define check_mem_region(start,n)
__check_region(&iomem_resource, (start), (n))
#define release_mem_region(start,n)
__release_region(&iomem_resource, (start), (n))
其中,参数start是I/O内存资源的起始物理地址(是CPU的RAM物理地址空间中的物理地址),参数n指定I/O内存资源的大小。
要使用 I/O 内存首先要申请 , 然后要映射 , 而要使用 I/O 端口首先要申请 , 或者叫请求 , 对于 I/O 端口的请求意思是让内核知道你要访问这个端口 , 这样内核知道了以后它就不会再让别人也访问这个端口了 . 毕竟这个世界僧多粥少啊 . 申请 I/O 端口的函数是 request_region, 这个函数来自 include/linux/ioport.h,
/* Convenience shorthand with allocation */
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name))
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))
#define rename_region(region, newname) do { (region)->name = (newname); } while (0)
extern struct resource * __request_region(struct resource *,
resource_size_t start,
resource_size_t n, const char *name);
这里我们看到的那个 request_mem_region 是申请 I/O 内存用的 . 申请了之后 , 还需要使用 ioremap 或者 ioremap_nocache 函数来映射 .对于 request_region, 三个参数 start,n,name 表示你想使用从 start 开始的 size 为 n 的 I/O port 资源 ,name 自然就是你的名字了