首页 > 解决方案 > 如何设置字符设备驱动的默认权限?

问题描述

我创建了一个字符设备驱动程序,我想将设备驱动程序文件(/dev/cnunsr)权限更改为 crw-rw-rw-(0666)。但默认权限是 crw------- (0600),所以它不会改变。

我的字符驱动程序代码是...

static int cnunsr_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
{
    add_uevent_var(env, "DEVMODE=%#o", 0666);
    return 0;
}

static char *cnunsr_dev_devnode(struct device *dev, umode_t *mode)
{
    printk("\n\n****%s: %d\n\n",__func__,__LINE__);
    if (mode != NULL)
        *mode = 0666;
    return kasprintf(GFP_KERNEL, "%s", dev_name(dev));;
}

int cnunsr_dev_init(void)  
{  
    int ret;  
    
    ret = alloc_chrdev_region( &id, 0, 1, DEVICE_NAME );  
    if ( ret ){  
        printk( "alloc_chrdev_region error %d\n", ret );  
        return ret;  
    }  
    else printk( "cnunsr alloc_chrdev_region");
    
    cdev_init( &cdev, &simple_fops );  
    cdev.owner = THIS_MODULE;  
    
    ret = cdev_add( &cdev, id, 1 );  
    if (ret){  
        printk( "cdev_add error %d\n", ret );  
        unregister_chrdev_region( id, 1 );  
        return ret;  
    }  
    else printk( "cnunsr cdev_add");
    
    class = class_create( THIS_MODULE, DEVICE_NAME );  
    if ( IS_ERR(class)){  
        ret = PTR_ERR( class );  
        printk( "class_create error %d\n", ret );  
    
        cdev_del( &cdev );  
        unregister_chrdev_region( id, 1 );  
        return ret;  
    }  
    else printk( "cnunsr class_create");
    
    class->dev_uevent = cnunsr_dev_uevent;
    class->devnode = cnunsr_dev_devnode;

    dev = device_create( class, NULL, id, NULL, DEVICE_NAME );  
    if ( IS_ERR(dev) ){  
        ret = PTR_ERR(dev);  
        printk( "device_create error %d\n", ret );  
    
        class_destroy(class);  
        cdev_del( &cdev );  
        unregister_chrdev_region( id, 1 );  
        return ret;  
    }  
    else printk( "cnunsr device_create");
    
    return 0;  
}  

如您所见,即使您设置了 dev_uevent 或类的 devnode,它也是 0600。

我也试过修改system/core/rootdir/init.rc中的代码,结果是一样的。

...
chmod 0666 /dev/cnunsr

我的开发板是juno board,我加载的是android。而且我在 Juno 板上找不到 /etc/udev/rules.d。因此,更改 rules.d 对我没有帮助。

我用内置的(obj-y += cnunsr.o in /linux/driver/Makefile)编译了我的字符设备驱动程序。

来人帮帮我 :(

标签: androidlinux-kernellinux-device-driver

解决方案


推荐阅读