Pergunta

Eu estou tentando usar um DAQ um pouco velho, e teve que saltar através de algumas aros para obter um driver antigo dispositivo (circa 2004) para ele para compilar ( DTI-DT340 Linux-DAQ-PCI ).

Eu comecei ao ponto onde ele compila, eu posso carregar o módulo do kernel, ele encontra o cartão, e eu posso criar os dispositivos de caracteres usando mknod.

Mas eu não consigo abrir esses dispositivos e continuo recebendo errno 19 (ENODEV) 'Sem tal dispositivo' quando tento

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

mas mknod não tive queixas sobre como fazer isso, e ele 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

Existe algo que eu estou deixando de fazer? O que poderia ser uma aberta razão falhar?

Aqui está o script que eu uso para carregar o driver e fazer os 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]

Algumas informações adicionais:

#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

RESPOSTA: A printk confirmou que o -ENODEV foi jogado de dentro open (). Após uma oldstyle

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

(que é obsoleto), extremidades if(!pdev) até verdadeiro, e retorna o -ENODEV.

Estou se aproximando - Eu acho que eu tenho que trabalhar e atualizar o código pci usar mecanismos mais modernos ...

Foi útil?

Solução

Se os shows dispositivo para cima na / proc / dispositivos, e você está certo de que você tem o direito número na mknod, em seguida, o motorista em si está se recusando a céu aberto. O motorista pode retornar qualquer código de erro de open () -. Incluindo "nenhum tal dispositivo", que pode se descobriu um problema inicializar o hardware

Outras dicas

Eu acho que é um problema no driver, verifique o funcionamento aberto.

Ele aparece em / proc / dispositivos, por isso todo o material de dispositivo genérico parece ser ok.

mknod não se importa se há um dispositivo correspondente aos dados principais números / menores. Tem certeza insmod é instalar seu módulo? O que lsmod dizer?

Eu estou familiarizado com a necessidade de adicionar a extensão ".ko". É que algo específico para o seu driver de dispositivo?

Verificar através lspci e certifique-se de hardware é inicializado corretamente. Se os seus suportes do sistema hotplug, pci_find_device não vai funcionar. O problema com este é um refcnt. A melhor maneira de lidar e aprender é dissecar o API. BOL !!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top