Sto provando a usare un DAQ un po 'vecchio, e ho dovuto saltare attraverso alcuni cerchi per ottenere un vecchio (circa 2004) driver di dispositivo per la compilazione (DTI-DT340 Linux-DAQ-PCI).open() restituisce con errore "No such device", ma c'è un tale dispositivo (linux)
Sono arrivato al punto in cui viene compilato, posso caricare il modulo del kernel, trova la scheda e posso creare i dispositivi di carattere usando mknod.
Ma io non riesco ad aprire questi dispositivi e continuo a ricevere errno 19 (ENODEV) 'No such device' quando provo a
open("/dev/dt340/0",O_RDWR);
ma mknod avuto lamentele circa rendendolo, e è 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
C'è qualcosa che sto trascurando di fare? Quale potrebbe essere una ragione aperta fallisce?
Ecco lo script che utilizzo per caricare il driver e realizzare i dispositivi.
#!/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]
Alcune informazioni aggiuntive:
#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
RISPOSTA: A printk ha confermato che il -ENODEV è stato gettato da dentro open(). A seguito di un oldstyle
while ((pdev = pci_find_device(PCI_VENDOR_ID_DTI, PCI_ANY_ID, pdev)))
(che è deprecato), if(!pdev)
finisce vero, e restituisce il -ENODEV.
sto avvicinandosi sempre più - mi sa che devo lavorare attraverso e aggiornare il codice PCI da utilizzare meccanismi più moderni ...
Stai usando udev o il vecchio stile dev? Questo può avere un impatto ... –
L'unico impatto sarebbe quello di richiedere l'ulteriore domanda "perché stai creando manualmente il nodo del dispositivo?"; altrimenti, non fa differenza. – ephemient
il driver usa dev vecchio stile - questa è la prima volta che mi immergo nei driver di dispositivo, quindi sto solo provando a utilizzare quanto più possibile già possibile –