11

我最近在工作中继承了一些代码,这是旧的 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);
}
4

3 回答 3

13

这是TTY 驱动程序在创建时将权限设置为 0666 的方法:

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;
}

devnode 属性struct class有一个参数指针mode,允许您设置权限。

当心,mode可能是NULL当设备被破坏时。

于 2016-03-02T15:03:03.033 回答
4

尝试这个: #include <sys/stat.h>

int chmod(const char *path, mode_t mode); 或者 int fchmod(int fd, mode_t mode);

来源: man -s 2 chmod

于 2012-08-07T14:15:11.733 回答
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

于 2012-08-07T14:17:57.377 回答