我最近在工作中继承了一些代码,这是旧的2.4.X linux内核驱动程序,我的任务是让他们使用更新的内核2.6或更高版本。我正在运行带有3.1.10内核的OpenSUSE 12.1。
我已经从register_chrdev()更新原始代码以使用class_create()/ device_create()调用,我可以看到我的设备正确显示在/ dev中。我目前的问题是我的设备的权限仅为用户设置为r / w:
crw------- 1 root root 244, 0 Aug 7 07:57 gcanain
我知道我可以通过命令行“chmod”该文件,或者我可以设置udev权限......但无论如何都要以编程方式执行此操作,这样当我发出insmod命令时,dev将被挂载已经有正确的规则吗?
我是否可以调用任何API来执行此操作,我在其中一个创建API中缺少任何选项?
为了澄清,我不想使用udev规则的部分原因是我不知道设备驱动程序的名称。设备驱动程序是在循环中生成的,因此名称后面附有数字,nNumDevs几乎可以是任何东西:
for (i = 0; i < nNumDevs; i++) {
strcpy(Modname,GC_ANAIN_MODULE_NAME);
strcat(Modname,"%d");
device_create(c1, NULL, MKDEV(nMajor, GC_ANAIN_MINOR_VERSION+i), NULL, Modname, i);
}
答案 0 :(得分:6)
这是使用by the TTY driver在创建时设置0666权限的方法:
{React.createElement(brandingConfig.svgs.Add)}
struct class
中的devnode属性有一个参数指针static char *tty_devnode(struct device *dev, umode_t *mode)
{
if (!mode)
return NULL;
if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) ||
dev->devt == MKDEV(TTYAUX_MAJOR, 2))
*mode = 0666;
return NULL;
}
static int __init tty_class_init(void)
{
tty_class = class_create(THIS_MODULE, "tty");
if (IS_ERR(tty_class))
return PTR_ERR(tty_class);
tty_class->devnode = tty_devnode;
return 0;
}
,允许您设置权限。
请注意,当设备被销毁时,mode
可能是mode
。
答案 1 :(得分:3)
试试这个:
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
要么
int fchmod(int fd, mode_t mode);
来源:man -s 2 chmod
答案 2 :(得分:1)
udev有权限规则,您需要在/etc/udev/rules.d
首先尝试这个:
在文件/etc/udev/udev.conf
中,添加以下行:
# My default permissions
default_mode="0660"
如果这不起作用,请在/etc/udev/rules.d中添加规则,详情请点击此处:http://www.reactivated.net/writing_udev_rules.html