문제

나는 다소 오래된 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

답변 : 인쇄물은 -enodev가 Open () 내부에서 던져 졌음을 확인했습니다. 구식을 따라

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

(더 이상 사용되지 않음), if(!pdev) 끝나고 -enodev를 반환합니다.

더 가까이 가고 있습니다. 더 현대적인 메커니즘을 사용하기 위해 PCI 코드를 업데이트하고 업데이트해야한다고 생각합니다 ...

도움이 되었습니까?

해결책

장치가 /Proc /Devices에 표시되고 Mknod에 숫자가 있다고 확신하면 드라이버 자체가 오픈을 거부합니다. 드라이버는 "그러한 장치 없음"을 포함하여 Open ()의 오류 코드를 반환 할 수 있습니다. "해당 장치 없음"을 포함하여 하드웨어를 초기화하는 문제가 발견 될 수 있습니다.

다른 팁

드라이버의 문제라고 생각합니다. 열린 기능을 확인하십시오.

/Proc /Devices에 표시되므로 모든 일반 장치가 괜찮은 것 같습니다.

MKNOD는 주어진 전공/경량에 해당하는 장치가 있는지 신경 쓰지 않습니다. Insmod가 모듈을 설치하고 있다고 확신합니까? LSMOD는 무엇을 말합니까?

".ko"확장자를 추가 해야하는 것은 익숙하지 않습니다. 장치 드라이버에 특정한 것이 있습니까?

LSPCI를 확인하고 하드웨어가 올바르게 초기화되어 있는지 확인하십시오. 시스템이 HotPlug를 지원하는 경우 PCI_FIND_DEVICE가 작동하지 않습니다. 이것의 문제는 refcnt입니다. 다루고 배우는 가장 좋은 방법은 API를 해부하는 것입니다. 볼 !!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top