open() は「そのようなデバイスはありません」というエラーを返しますが、そのようなデバイスは存在します (Linux)
-
13-09-2019 - |
質問
私はやや古い DAQ を使用しようとしているのですが、それをコンパイルするために古い (2004 年頃の) デバイス ドライバーを入手するために、いくつかの困難を乗り越える必要がありました (DTI-DT340 Linux-DAQ-PCI).
コンパイルが完了し、カーネル モジュールをロードしてカードを検出し、mknod を使用してキャラクター デバイスを作成できるところまで到達しました。
しかし、これらのデバイスを開けることができないようで、引き続き次のメッセージが表示されます。 エラー番号 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 コードを検討して更新する必要があると思います...
解決
デバイスが /proc/devices に表示され、mknod に正しい番号があると確信している場合は、ドライバー自体がオープンを拒否しています。ドライバーは、open() から任意のエラー コードを返すことができます。これには、ハードウェアの初期化中に問題が検出された場合に返される可能性のある「そのようなデバイスはありません」などのエラー コードが含まれます。
他のヒント
ドライバーに問題があると思いますので、open関数を確認してください。
/proc/devices に表示されるので、一般的なデバイスに関するものはすべて問題ないようです。
mknod は、指定されたメジャー/マイナー番号に対応するデバイスがあるかどうかを気にしません。insmod がモジュールをインストールしていると確信していますか?lsmod は何を教えてくれますか?
「.ko」拡張子を追加する必要があることに慣れていません。それはデバイスドライバーに固有のものですか?
lspci をチェックして、ハードウェアが適切に初期化されていることを確認してください。システムがホットプラグをサポートしている場合、pci_find_device は機能しません。これに関する問題はrefntです。対処して学習するための最良の方法は、API を分析することです。ボル!!