2009-04-23 8 views
5

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 ...

+0

Stai usando udev o il vecchio stile dev? Questo può avere un impatto ... –

+0

L'unico impatto sarebbe quello di richiedere l'ulteriore domanda "perché stai creando manualmente il nodo del dispositivo?"; altrimenti, non fa differenza. – ephemient

+0

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 –

risposta

8

Se il dispositivo viene visualizzato in/proc/devices e si è certi di aver ottenuto il numero corretto in mknod, il driver stesso rifiuta l'apertura. Il driver può restituire qualsiasi codice di errore da open() - incluso "nessun dispositivo di questo tipo", che potrebbe verificarsi se rileva un problema durante l'inizializzazione dell'hardware.

0

mknod non importa se c'è un dispositivo che corrisponde alla data maggiore/numeri minori Sei sicuro che insmod sta installando il tuo modulo? Cosa ti dice lsmod?

Non ho familiarità con l'aggiunta dell'estensione ".ko". È qualcosa di specifico per il tuo driver di dispositivo?

+0

Aggiunte le informazioni lsmod sopra - Penso che non lo farei Ho ottenuto quel numero maggiore da/proc/devices se non è stato caricato. Sto usando l'estensione .ko perché sto caricando il modulo sul posto in cui l'ho costruito - non è in uno dei luoghi standard da cui i moduli vengono caricati. –

+0

.ko è l'estensione generalmente utilizzata dai driver di Linux dal 2.4 - kernel più vecchi utilizzati. Ma questo ha causato confusione con altri file oggetto che non erano oggetti del kernel. – MarkR

+0

Beh, ho scritto per l'ultima volta un modulo del kernel nel 1993, quindi cosa ne so? –

1

Direi che è un problema nel driver, controllare la funzione di apertura.

Si presenta in/proc/devices, quindi tutto il materiale generico del dispositivo sembra essere ok.

0

Controllare tramite lspci e assicurarsi che l'hardware sia inizializzato correttamente. Se il tuo sistema supporta hotplug, pci_find_device non funzionerà. Il problema con questo è un refcnt. Il modo migliore per trattare e imparare è quello di analizzare l'API. BOL !!

Problemi correlati