open () возвращает сообщение об ошибке «Нет такого устройства», но такое устройство существует (linux) - PullRequest
5 голосов
/ 23 апреля 2009

Я пытаюсь использовать несколько старый DAQ, и мне пришлось прыгнуть через несколько обручей, чтобы получить старый (около 2004 г.) драйвер устройства для его компиляции ( DTI-DT340 Linux-DAQ-PCI ).

Я дошел до того, что он компилируется, я могу загрузить модуль ядра, найти карту и создать символьные устройства, используя mknod.

Но я не могу открыть эти устройства и продолжать получать errno 19 (ENODEV) «Нет такого устройства» , когда я пытаюсь

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

но у mknod не было никаких претензий к его созданию, и оно есть:

# 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

Есть что-то, чем я пренебрегаю? В чем может быть причина открытого сбоя?

Вот скрипт, который я использую для загрузки драйвера и создания устройств.

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

Некоторая дополнительная информация:

#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

ОТВЕТ: Printk подтвердил, что -ENODEV был брошен изнутри open (). По старому стилю

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

(что устарело), ​​if(!pdev) завершается значением true и возвращает -ENODEV.

Я подхожу ближе - думаю, мне нужно проработать и обновить код pci, чтобы использовать более современные механизмы ...

Ответы [ 4 ]

8 голосов
/ 24 апреля 2009

Если устройство отображается в / proc / devices, и вы уверены, что вы правильно указали номер в mknod, то сам драйвер отказывает в открытии. Драйвер может возвратить любой код ошибки из open (), включая «нет такого устройства», что может произойти, если он обнаружит проблему с инициализацией оборудования.

1 голос
/ 23 апреля 2009

Я думаю, это проблема в драйвере, проверьте функцию открытия.

Он отображается в / proc / devices, поэтому все обычные устройства работают нормально.

0 голосов
/ 19 марта 2015

Проверьте через lspci и убедитесь, что оборудование правильно инициализировано. Если ваша система поддерживает горячее подключение, pci_find_device не будет работать. Проблема с этим является refcnt. Лучший способ разобраться и научиться - это анализировать API. БОЛ !!

0 голосов
/ 23 апреля 2009

mknod не волнует, существует ли устройство, соответствующее заданным старшим / младшим номерам. Вы уверены, что insmod устанавливает ваш модуль? Что говорит lsmod?

Я не знаю, нужно ли добавлять расширение ".ko". Это что-то особенное для вашего устройства?

...