linux驱动中request_mem_region()相关函数

 

 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 自然就是你的名字了

你可能感兴趣的:(linux驱动中request_mem_region()相关函数)