通过前面的学习,我们大概了解了驱动字符设备的过程。现在我们介绍一个兼容老版本的字符设备注册方法,之前我们注册设备号使用的是register_chrdev.随着内核文件变化升级,我们完善出了新的注册设备号的方法(使用cdev注册设备号)。
新的方法注册设备号比原来的老方法多了一步,就是向内核注册添加cdev设备。注册步骤如下:
1)注册设备号(静态:register_chrdev_region 动态:alloc_chrdev_region)
2)创建cdev对象(cdev_alloc)分配cdev对象
3)初始化cdev对象(cdev_init)
4)将cdev对象注册到内核中(cdev_add)注册字符设备驱动
5)删除设备号(cdev_del)
下面我们通过一个demo看看具体怎么实现
static int __init xxx_init(void)
{
//创建结构体指针变量led_device,分配内存给它
led_device =kmalloc(sizeof(struct rk3399_led), GFP_KERNEL);
if(led_device == NULL){
printk("kmalloc fail\n");
ret = -ENOMEM;
return ret;
}
//新方法注册设备号
ret =alloc_chrdev_region(&led_device->devno,0,1, "led-dev");
if(ret <0){
printk("alloc_chrdev_region fail!\n");
return -EBUSY;
goto err_register_chrdev;
}
led_device->major =MAJOR(led_device->devno);
printk("major = %d\n",led_device->major);
led_device->mycdev =cdev_alloc();
cdev_init(led_device->mycdev,&fops);
cdev_add (led_device->mycdev,led_device->devno, 1);
//创建设备类
//创建设备号
}
static void __exit xxx_exit(void)
{
//注销设备文件
xxxxxxxxxxxx;
//注销设备类
xxxxxxxxxxxx;
cdev_del(led_device->mycdev);
//注销设备号
unregister_chrdev_region(led_device->devno, 1);
kfree(led_device);
printk("call %s()\n",__func__);
}