您的位置:首页 > 运维架构 > Linux

linux驱动开发常用函数及函数

2011-05-16 10:04 197 查看
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内存资源的大小。

Linux内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里。该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下

static struct char_device_struct {

struct char_device_struct *next; // 指向散列冲突链表中的下一个元素的指针

unsigned int major; // 主设备号

unsigned int baseminor; // 起始次设备号

int minorct; // 设备编号的范围大小

char name[64]; // 处理该设备编号范围内的设备驱动的名称

struct file_operations *fops; // 没有使用

struct cdev *cdev; // 指向字符设备驱动程序描述符的指针

} *

注意,内核并不是为每一个字符设备编号定义一个 char_device_struct 结构,而是为一组对应同一个字符设备驱动的设备编号范围定义一个 char_device_struct 结构。chrdevs 散列表的大小是 255,散列算法是把每组字符设备编号范围的主设备号以 255 取模插入相应的散列桶中。www.linuxidc.com同一个散列桶中的字符设备编号范围是按起始次设备号递增排序的。

注册
内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。这三个函数都会调用一个共用的 __register_chrdev_region() 函数来注册一组设备编号范围(即一个 char_device_struct 结构)。

内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。其中,register_chrdev_region()是为提前知道 设备的主次设备号的设备分配设备编号。alloc_chrdev_region() 是动态分配主次设备号。register_chrdev()。是老版本的设备号注册方式,他只分配主设备号。从设备号在mknod的时候指定 ioremap_nocache 把内存映射到CPU空间 void __iomem * ioremap_nocache (unsigned long phys_addr, unsigned long size); phys_addr 要映射的物理地址 size 要映射资源的大小 ioremap_nocache进行一系列平台相关的操作使得CPU可以通过readb/readw/readl/writeb/writew/writel等IO函数进行访问。在译者的使用过程种并没有出现不能作为虚拟地址直接访问的情况,可能是某些平台下的不可以吧。译者的使用平台是x86和ixp425] 这个版本的ioremap确保这些内存在CPU是不可缓冲的,如同PCI总线上现存的缓冲规则一样。注:此时在很多总线上仍有其他的缓冲和缓存。在某些特殊的驱动中,作者应当在PCI写的时候进行读取。这对于一些控制寄存器在这种不希望复合写或者缓冲读的区域内时是非常有用的返回的映射地址必须使用iounmap来释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: