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);
阅读(932) | 评论(0) | 转发(0) |