Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163419
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 622
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-19 19:12
文章分类

全部博文(67)

分类: LINUX

2016-07-29 16:10:34

1、获取设备号
    设备号用dev_t来保存,dev_t是一个32位整数,高12位为主设备号,低20位为次设备号,两种方式获取并注册设备号:
  1)手动指定

    dev_t devno = MKDEV(maj,min); 传入主次设备号,传出dev_t
    register_chrdev_region(devno,count,name);
 2)动态获取    
    dev_t devno;
    alloc_chrdev_region(&devno,0,count, name);
将设备号存入devno,此处的name没啥用,/dev下生成的文件不是这个name

2、创建设备类并添加设备
    struct class *my_class = class_create(THIS_MODULE,classname)
        classname会出现在/sys/class下

    device_create(my_class,NULL,devno,devicename); 2.6.26之前也可使用class_device_create()
        devicename出现在/sys/class/classname下,且出现在/dev下,也就是说在user space要操作的是这个名字
    
class结构体是一个抽象的东西,表示一类设备,通过device_create添加具体设备
    device_create会向user space发送uevent,触发udev在/dev下自动创建设备文件,不需要再mknod手动创建。
    注意devicename参数是可变参数,可以用%s、%d等自行拼接

3、将设备与相关操作关联
    struct cdev cdev;
    struct file_operations fops = {
        .owner = THIS_MODULE,
        .open = myopen, //自行实现myopen等hansh
        .read = myread,
        .write = mywrite,
    };
    cdev_init(&cdev, &fops);
    cdev.owner = THIS_MODULE;
    cdev_add(&cdev, devno, NUMBER_OF_DEVICES);

4、注销
    cdev_del (&cdev);
    device_destroy(my_class, devno);
    class_destroy(my_class);
    unregister_chrdev_region (devno,NUMBER_OF_DEVICES);
阅读(896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~