make how c linux linux-kernel linux-device-driver kernel-module

how - linux device drivers



open() regresa con el error "No such device", pero existe tal dispositivo(linux) (4)

Intento usar un DAQ algo antiguo, y tuve que saltar unos pocos aros para obtener un controlador de dispositivo viejo (circa 2004) para que compilara ( DTI-DT340 Linux-DAQ-PCI ).

He llegado al punto en que se compila, puedo cargar el módulo kernel, encuentra la tarjeta y puedo crear los dispositivos de caracteres usando mknod.

Pero parece que no puedo abrir estos dispositivos y seguir obteniendo errno 19 (ENODEV) ''No such device'' cuando intento

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

pero mknod no tenía quejas sobre cómo hacerlo, y está ahí:

# 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

¿Hay algo que estoy descuidando hacer? ¿Qué podría ser un motivo abierto?

Aquí está el script que uso para cargar el controlador y hacer los dispositivos.

#!/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]

Alguna información adicional:

#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

RESPUESTA: Un printk confirmó que el -ENODEV se lanzó desde el interior de open (). Siguiendo un viejo estilo

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

(que está en desuso), if(!pdev) termina en verdadero y devuelve el valor -ENODEV.

Estoy cada vez más cerca, creo que tengo que trabajar y actualizar el código pci para usar mecanismos más modernos ...


A mknod no le importa si hay un dispositivo que corresponda a los números mayores / menores dados. ¿Estás seguro de que Insmod está instalando tu módulo? ¿Qué te dice lsmod?

No estoy familiarizado con tener que agregar la extensión ".ko". ¿Es eso algo específico para el controlador de tu dispositivo?


Si el dispositivo aparece en / proc / devices, y está seguro de que tiene el número correcto en mknod, entonces el propio controlador rechaza la apertura. El controlador puede devolver cualquier código de error de open (), incluido "sin dicho dispositivo", lo que podría ocurrir si descubriera un problema al inicializar el hardware.


Supongo que es un problema en el controlador, verifica la función de abrir.

Se muestra en / proc / devices, por lo que todo el dispositivo genérico parece estar bien.


Compruebe a través de lspci y asegúrese de que el hardware esté inicializado correctamente. Si su sistema es compatible con hotplug, pci_find_device no funcionará. El problema con esto es un refcnt. La mejor forma de tratar y aprender es diseccionar la API. BOL !!