linux下的每一个字符设备都有一个struct cdev 结构体,所以编写字符设备驱动就是把这个结构体填好。
该结构体如下:
linux-2.6.22/include/linux/cdev.h
struct cdev {
struct kobject kobj; // 每个 cdev 都是一个kobject
struct module *owner; // 指向实现驱动的模块
const struct file_operations *ops; // 操纵这个字符设备文件的方法
struct list_head list; // 与 cdev 对应的字符设备文件的inode->i_devices 的链表头
dev_t dev; // 起始设备编号
unsigned int count; // 设备范围号大小
};
一般过程:
注册一个字符设备:
| Register_chrdev_region/alloc_chrdev_region |
| cdev_init,cdev.owner,cdev_ops |
| cdev_add(); |
| kmalloc |
| mem_devp.data = kmalloc(); |
卸载一个字符设备:
注销设备 | cdev_del(&cdev); |
释放设备结构体 | kfree(mem_devp); |
释放设备号 | unregister_chrdev_region |