open()返回“没有这样的设备”错误,但是有这样的设备(linux)

时间:2009-04-23 18:48:42

标签: c linux linux-kernel linux-device-driver kernel-module

我正在尝试使用一个有点旧的DAQ,并且不得不跳过一些箍来获得一个旧的(大约2004年)设备驱动程序来编译它(DTI-DT340 Linux-DAQ-PCI)。

我已经达到了编译的程度,我可以加载内核模块,找到卡片,然后我可以使用mknod创建角色设备。

但我似乎无法打开这些设备,并且当我尝试

时继续 errno 19(ENODEV)'没有这样的设备'
open("/dev/dt340/0",O_RDWR);

但是mknod没有关于制作它的抱怨,它就在那里:

# ls -l /dev/dt340/
total 0
crw-rw-r-- 1 root staff 250, 0 2009-04-23 11:02 0
crw-rw-r-- 1 root staff 250, 1 2009-04-23 11:02 1
crw-rw-r-- 1 root staff 250, 2 2009-04-23 11:02 2
crw-rw-r-- 1 root staff 250, 3 2009-04-23 11:02 3

有什么我忽略的事吗?可能是什么原因导致失败?

这是我用来加载驱动程序和制作设备的脚本。

#!/bin/bash
module="dt340"
device="dt340"
mode="664"

# invoke modprobe with all arguments we were passed
#/sbin/modprobe -t misc -lroot -f -s $module.o $* || exit 1
insmod $module.ko

# remove stale nodes
rm -f /dev/${device}/[0-3]

major=`awk "\\$2==\"$module\" {print \\$1}" /proc/devices`
mkdir -p /dev/${device}
mknod /dev/${device}/0 c $major 0
mknod /dev/${device}/1 c $major 1
mknod /dev/${device}/2 c $major 2
mknod /dev/${device}/3 c $major 3

# give appropriate group/permissions, and change the group
# not all distributions have staff; some have "users" instead
group="staff"
grep '^staff:' /etc/group > /dev/null || group="users"

chgrp $group /dev/${device}/[0-3]
chmod $mode  /dev/${device}/[0-3]

其他一些信息:

#grep dt340 /proc/devices 
250 dt340
# lsmod | grep dt340
dt340                  21516  0 
# tail /var/log/messages
Apr 23 11:59:26 ve kernel: [  412.862139] dt340 0000:03:01.0: PCI INT A -> GSI 22 (level, low) -> IRQ 22
Apr 23 11:59:26 ve kernel: [  412.862362] dt340: In function dt340_init_one:
Apr 23 11:59:26 ve kernel: [  412.862363] Device DT340 Rev 0x0 detected at address 0xfebf0000
#lspci | grep 340
03:01.0 Multimedia controller: Data Translation DT340

答案:printk确认-ENODEV是从open()内部抛出的。追随旧式

while ((pdev = pci_find_device(PCI_VENDOR_ID_DTI, PCI_ANY_ID, pdev)))

(已弃用),if(!pdev)结束为true,并返回-ENODEV。

我正在靠近 - 我想我必须完成并更新pci代码以使用更现代的机制......

4 个答案:

答案 0 :(得分:8)

如果设备显示在/ proc / devices中,并且您确定在mknod中有正确的数字,则驱动程序本身拒绝打开。驱动程序可以从open()返回任何错误代码 - 包括“没有这样的设备”,如果它发现初始化硬件时可能会出错。

答案 1 :(得分:1)

我猜这是驱动程序中的一个问题,请检查打开的功能。

它显示在/ proc / devices中,因此所有通用设备的东西似乎都没问题。

答案 2 :(得分:0)

mknod并不关心是否存在与给定的主要/次要号码相对应的设备。你确定insmod正在安装你的模块吗? lsmod告诉你什么?

我不熟悉必须添加“.ko”扩展名。这是特定于您的设备驱动程序的东西吗?

答案 3 :(得分:0)

检查lspci并确保硬件已正确初始化。如果您的系统支持hotplug,则pci_find_device无法正常工作。这个问题是一个refcnt。处理和学习的最佳方式是剖析API。好吧!!

相关问题