Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127949
  • 博文数量: 75
  • 博客积分: 1485
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-11 20:57
文章分类
文章存档

2011年(1)

2010年(15)

2009年(59)

我的朋友

分类: LINUX

2009-05-31 21:32:20

   主设备号标识设备对应的驱动程序。次设备号由内核使用,用于正确确定设备文件所指的设备。
   在内何种,dev_t类型(中定义)用来保存设备编号,包括主、次设备号,它是一个32位的数,12位表示主设备号,20位表示次设备号。
   一般使用中定义的宏来获得主设备号和次设备号:
       MAJOR(dev_t dev);
       MINOR(dev_v dev);
   反之,要将主次设备号转换为dev_t类型,使用
       MKDEV(int major,int minor)
  
   在建立一个字符设备之前,驱动程序首先要做的是获得一个或多个设备编号。完成该工作的必要函数是register_chrdev_region,该函数在中声明。
 

int register_chrdev_region(dev_t first,unsigned int count,char *name); //获得设备编号

int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name); //分配主设备号

void unregister_chrdev_region(dev_t first,unsigned int count);    //释放设备编号

   分配主设备号的最佳方式是:默认采用动态分配,同时保留在加载甚至编译时指定主设备号的余地。

   下面是scull.c中用来获取主设备号的代码:

if(scull_major){
   dev=MKDEV(scull_major,scull_minor);
result=regist_chrdev_region(dev,scull_nr_devs,"scull");
}else{
result=alloc_chrdev_region(&dev,scull_minor,scull_nr_devs,"scull");
scull_major=MAJOR(dev);
}
if(result<0){
   printk(KERN_WARNING "scull:can't get major %d\n",scull_major);
   return result;
}

阅读(537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~