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...
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
Vous devez vous connecter pour publier un commentaire.
Si l'appareil s'affiche dans /proc/devices, et vous êtes sûr que vous avez le droit de nombre de mknod, puis le pilote lui-même, qui refuse de l'ouvrir. Le conducteur peut renvoyer n'importe quel code d'erreur de open() - y compris les "no such device", dont elle pourrait, si elle a découvert un problème d'initialisation du matériel.
OriginalL'auteur MarkR
J'avais suppose que c'est un problème dans le pilote, vérifiez la fonction open.
Il montre dans /proc/devices, de sorte que tous les instruments génériques genre de choses semble être ok.
OriginalL'auteur starblue
mknod ne se soucie pas si il y a un appareil correspondant à la donnée majeure/mineure numéros. Êtes-vous sûr insmod est l'installation de votre module? Ce n'lsmod vous dire?
Je suis familier avec avoir à ajouter de l' ".ko" extension. C'est que quelque chose de spécifique pour votre pilote de périphérique?
.ko est l'extension qui est généralement utilisé par des pilotes pour Linux depuis la 2.4 - les anciens noyaux utilisés .o mais cela a causé de la confusion avec d'autres fichiers objets qui n'étaient pas les objets du noyau.
Eh bien, j'ai écrit un module du noyau, en 1993, de sorte que sais-je?
2.4 utilise encore .o modules; le .ko extension a été introduit avec 2.5.51 (Dec 10, 2002)
OriginalL'auteur Paul Tomblin
Vérifier par lspci et assurez-vous que le matériel est correctement initialisé. Si votre système prend en charge la connexion à chaud, pci_find_device ne fonctionne pas. Le problème avec ceci est un refcnt. La meilleure façon de faire face et d'apprendre est de disséquer les API. BOL !!
OriginalL'auteur Manish