【问题标题】:Linux: device appears in /dev but cannot be accessedLinux:设备出现在 /dev 中但无法访问
【发布时间】:2015-02-04 11:06:49
【问题描述】:

我已经创建了一个 Linux 设备驱动程序并且可以将它添加到system (insmod, mknod)。当我查看/dev 时,我看到它列为camerax

ls -l /dev/camerax
crw-r--r--    1 root     root      245,   0 Jun 27 17:19

即便如此,我也无法访问它。无论我做什么,都会出错。

例如:

int fd = open("/dev/camerax", O_RDONLY);

printf("%d [%s]\n", fd, strerror(errno));

生成:

-1 [No such device or address]

我以超级用户身份运行。有什么建议吗?

【问题讨论】:

    标签: linux driver device


    【解决方案1】:

    您的模块未链接到您提到的特殊文件,因此它给出了错误。

    如果您的模块成功插入,请使用 cat 命令验证 /proc/devices

    cat /proc/devices.

    在路径 /dev/____ 中使用 mknod 创建的文件只是对您的驱动程序的参考

    主要和次要编号应与您插入的设备匹配。

    【讨论】:

    • 我很难理解你的回答。您提到的“特殊文件”是什么?设备出现在 /proc/devices 中,并且主次编号匹配。
    • 特殊文件是设备驱动程序的接口,出现在文件系统中,也称为设备文件。
    • 你写“你的模块没有链接到特殊文件......”这不是“insmod Camera.ko”后面跟着“mknod /dev/camerax c 245 0”吗?从 /proc/devices 确认 245。如果模块不存在,它怎么会出现在 /dev 中?如果我误解了,请更明确地说“未链接”是什么意思。
    • 供您参考:mknod /dev/camerax c 245 0 只会创建一个文件来访问您的驱动程序。
    • 如果您的驱动程序正确插入内核,则使用 mknod 创建的文件将成为设备驱动程序的引用点,并引用主要和次要编号。
    【解决方案2】:

    我已经解决了这个问题。

    我现在没有像文档中描述的那样动态创建主要设备编号,而是将其显式设置为 61。现在一切正常。

    我能看到的工作版本和非工作版本之间的唯一区别是主设备号(是的,我更改了任何使用设备号的东西,所以我总是使用适当的那个)。

    这在我不断增加的列表中添加了系统的另一个奇异功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多