日期:2014-05-16  浏览次数:20837 次

《linux设备驱动程序III》学习---第三章

 

1,这本书是以scull 为例子来介绍字符设备驱动程序的编写的。

  scull是一个操作内存区域的字符设备驱动程序。

2,注册设备号的获取、注销及注册

  @获取dev_t 类型设备号

   设备在内核中以dev_t 类型保存主次设备号的。用MKDEV(major,minor) 来获得dev_t 类型的设备号,相反,用MAJOR(dev_t  dev) 转换主设备号,MINOR(dev_t dev) 转换出次设备号。

  @内核分配设备号

  int register_chrdev_region(dev_t dev,1,char *name);

   @自动分配

   int alloc_chrdev_region(dev_t *dev ,0,1,char *name);

   @注销

   void unregister_chrdev_region(dev,1);

   @注册模板

static void key_setup_cdev(struct cdev *dev,int major,struct file_operations *fops)

{

   int err,devno=MKDEV(dev,0);

   cdev_init(dev,fops);

   dev->owner = THIS_MODULE;

   dev->ops     = fops;

   err=cdev_add(dev,devno,1); //向内核中添加

   if (err)
                printk (KERN_NOTICE "Error %d adding key%d", err, minor);

}

-------------

获得设备号的模板

static int __init userkey_init(void)

{

    int result;

  dev_t dev=MKDEV(major,o);

  char dev_name[]="key";

  if(key_major)

        result=register_chrdev_region(major,1,dev_name);//分配设备号

else{

   result=alloc_chrdev_region(*dev,0,1,dev_name);//自动分配

  key_major=MAJOR(dev);//将dev_t 类型转换成主设备号

}

if (result < 0) {
                printk(KERN_WARNING "key: unable to get major %d\n", key_major);
                return result;
        }

 if (key_major == 0)