open() retourne avec “No such device” erreur, mais il y a un tel appareil (linux)

Je suis en train d'utiliser un peu ancien DAQ, et a dû sauter à travers quelques cerceaux pour obtenir un vieux (vers 2004) pilote de périphérique pour compiler (DTI-DT340 Linux-DAQ-PCI).

J'ai obtenu au point où il compile, je peux charger le module du noyau, il trouve la carte, et je peux créer le personnage de périphériques à l'aide de mknod.

Mais je n'arrive pas à ouvrir ces appareils et reçois errno 19 (ENODEV) " rien de tel dispositif quand j'essaie de

open("/dev/dt340/0",O_RDWR);

mais mknod avait pas de plaintes au sujet de le faire, et c'est là:

# 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

Il ya quelque chose que je néglige de le faire? Ce qui pourrait être une raison ouverte échoue?

Voici le script que j'utilise pour charger le pilote et de rendre les dispositifs.

#!/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 "\\\==\"$module\" {print \\\}" /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]

Quelques informations supplémentaires:

#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

RÉPONSE: UN printk a confirmé que l'-ENODEV a été générée à partir de l'intérieur de open(). À la suite d'une oldstyle

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

(ce qui est déconseillé), if(!pdev) finit vrai, et renvoie le -ENODEV.

Je suis inching rapproche - je suppose que je dois travailler à travers et mise à jour de la carte pci code à utiliser plus moderne des mécanismes...

Êtes-vous à l'aide de udev ou le style ancien dev? Cela peut avoir un impact...
Le seul effet serait d'inciter à la question "pourquoi êtes-vous créer le nœud de périphérique manuellement?"; sinon, il ne fait aucune différence.
le pilote est à l'aide de vieux-style dev - c'est ma première fois de plonger dans les pilotes de périphériques, donc je suis juste essayer d'utiliser au maximum de ce qui était déjà possible

OriginalL'auteur Paul Ivanov | 2009-04-23