افتح () إرجاع الخطأ "لا يوجد مثل هذا الجهاز"، ولكن يوجد مثل هذا الجهاز (Linux)

StackOverflow https://stackoverflow.com/questions/783030

سؤال

أحاول استخدام DAQ قديم إلى حد ما، واضطر إلى القفز من خلال عدد قليل من الأطواق للحصول على برنامج تشغيل جهاز قديم (Circa 2004) لتجميعه (DTI-DT340 Linux-DAQ-PCI).

لقد حصلت على النقطة التي يجمع فيها، يمكنني تحميل وحدة kernel، وتجد البطاقة، ويمكنني إنشاء أجهزة الأحرف باستخدام 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 تم إلقاؤه من الداخل مفتوح (). بعد oldstyle.

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

(الذي تم إهماله)، if(!pdev) ينتهي صحيح، وإرجاع -enodev.

أنا بوصة أقرب - أعتقد أنني يجب أن أعمل من خلال وتحديث رمز PCI لاستخدام المزيد من الآليات الحديثة ...

هل كانت مفيدة؟

المحلول

إذا كان الجهاز يظهر في / بروك / أجهزة، وأنت متأكد من أنك قد حصلت على الرقم الصحيح في MKNOD، فإن السائق نفسه يرفض المفتاح. يمكن للسائق إرجاع أي رمز خطأ من فتح () - بما في ذلك "لا يوجد مثل هذا الجهاز"، والذي قد يكون إذا اكتشف مشكلة تهيئة الأجهزة.

نصائح أخرى

أعتقد أنها مشكلة في برنامج التشغيل، تحقق من الوظيفة المفتوحة.

يظهر في / بروك / الأجهزة، لذلك يبدو أن جميع الأشياء العامة على ما يرام.

لا يهتم MKNOD إذا كان هناك جهاز يتوافق مع الأرقام الرئيسية / الطفيفة المحددة. هل أنت متأكد من أن Insmod تقوم بتثبيت الوحدة النمطية الخاصة بك؟ ماذا يخبرك lsmod؟

أنا غير مألوف مع الاضطرار إلى إضافة تمديد ".ko". هل هذا شيء محدد لسائق جهازك؟

تحقق من خلال LSPCI وتأكد من تهيئة الأجهزة بشكل صحيح. إذا كان نظامك يدعم Hotplug، فلن يعمل PCI_FIND_DEVICE. المشكلة مع هذا هو refcnt. أفضل طريقة للتعامل والتعلم هي تشريح API. بول !!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top