Domanda

Sto cercando di utilizzare un DAQ un po 'vecchia, e ha dovuto saltare attraverso un paio di cerchi per ottenere un vecchio driver di periferica (circa 2004) per la sua compilazione ( DTI-DT340 Linux-DAQ PCI-).

ho ottenuto al punto in cui si compila, posso caricare il modulo del kernel, che trova la carta, e posso creare i dispositivi a caratteri utilizzando mknod.

Ma io non riesco ad aprire questi dispositivi e continuo a ricevere errno 19 (ENODEV) 'No such device' quando provo ad

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

ma mknod avuto nessuna critica da fare che lo rende, ed è 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? Ciò che potrebbe essere una ragione aperta fallisce?

Ecco lo script che uso per caricare il driver e rendere 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 per vero, e restituisce la -ENODEV.

Sono avvicinandosi sempre più - mi sa che devo lavorare attraverso e aggiornare il codice PCI di utilizzare meccanismi più moderni ...

È stato utile?

Soluzione

Se il dispositivo si presenta in / proc / devices, e sei sicuro che hai il giusto numero di mknod, poi il driver stesso si rifiuta all'aperto. Il conducente può restituire qualsiasi codice di errore da open () -. Tra cui "No such device", che potrebbe, se scoperto un problema inizializzazione dell'hardware

Altri suggerimenti

Direi che è un problema nel driver, controllare il funzionamento aperto.

Si presenta in / proc / devices, così tutta la roba generico dispositivo sembra essere ok.

mknod non importa se è presente un dispositivo corrispondente ai numeri dati maggiore / minore. Sei certo insmod sta installando il modulo? Che cosa significa lsmod dirvi?

Sono familiarità con dover aggiungere l'estensione ".ko". È che qualcosa di specifico per il driver di dispositivo?

Controlla attraverso lspci e assicurarsi che l'hardware sia correttamente inizializzato. Se il sistema supporta hotplug, pci_find_device non funzionerà. Il problema con questo è un RefCnt. Il modo migliore per affrontare e imparare è quello di sezionare l'API. BOL !!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top