วิธีกำหนดไดรเวอร์ USB ให้กับอุปกรณ์


30

คำถามนี้เป็นสองเท่า:

ขั้นแรกให้คุณถอดไดรฟ์เวอร์จากอุปกรณ์ USB ด้วยตนเองและต่อกับไดรฟเวอร์อื่นได้อย่างไร ตัวอย่างเช่นฉันมีอุปกรณ์ที่เมื่อเชื่อมต่อโดยอัตโนมัติจะใช้ไดรเวอร์เก็บข้อมูล usb

เอาท์พุท usbview

Vendor Id: xxxx
Product Id: xxxx
...
    Number of Interfaces: 2
    Interface Number: 0
        Name: usb-storage
        Number of Endpoints: 2
        ...
    Interface Number: 1
        Name: (none)
        Number of Endpoints: 2
        ...

ฉันไม่ต้องการใช้ไดรเวอร์เก็บข้อมูล usb ดังนั้นในแอปพลิเคชันของฉันฉันใช้libusbห้องสมุดเพื่อถอดไดรเวอร์เก็บข้อมูล usb จากนั้นฉันอ้างสิทธิ์อินเทอร์เฟซ ฉันสามารถส่งข้อมูลไปยังและจากแอปพลิเคชันที่ทำงานบนอุปกรณ์ USB ของฉันและบนระบบโฮสต์ Linux ของฉัน

คุณถอดไดรเวอร์ออกด้วยตนเองนอกแอพพลิเคชั่นอย่างไร


ประการที่สองฉันจะกำหนดโปรแกรมควบคุมให้แนบกับปลั๊กอินอุปกรณ์โดยอัตโนมัติได้อย่างไร ขณะนี้ฉันมีการตั้งค่ากฎ udev เพื่อตั้งค่าการอนุญาตอุปกรณ์โดยอัตโนมัติ:

SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"

ฉันสามารถใช้กฎ udev เพื่อกำหนดไดรเวอร์ให้กับอินเทอร์เฟซเฉพาะบนอุปกรณ์ USB ได้หรือไม่? ตัวอย่างเช่นถ้าฉันต้องการให้โมดูล usbnet ใช้งานโดยอัตโนมัติบนอินเตอร์เฟส 0 แทนที่จะเป็นที่เก็บข้อมูล usb เป็นไปได้ไหมที่ udev


1
หากส่วนหนึ่งของปัญหากำลังโหลดโมดูลที่ถูกต้องโปรดดูเว็บแคมในAngström
Gilles 'ดังนั้นหยุดความชั่วร้าย'

1
คุณต้องการโมดูลเก็บข้อมูล usb หรือไม่? เพราะถ้าไม่ใช่คุณสามารถใส่มันในบัญชีดำและมันจะไม่โหลดเลย
Hanan N.

@Gilles ฉันสามารถโหลด LKM ได้สำเร็จ คำถามของฉันคือฉันจะแนบด้วยตนเองกับอุปกรณ์ได้อย่างไร
linsek

@ Hanan ปัจจุบันฉันไม่ได้ใช้โมดูลเก็บข้อมูล usb ฉันอาจต้องลงบัญชีดำเพื่อติดตั้งโมดูลที่ถูกต้องโดยอัตโนมัติ แต่ก่อนอื่นฉันต้องรู้วิธีแนบ usbnet
linsek

1
@njozwiak โมดูลusbnetจะไม่โหลดอัตโนมัติเนื่องจากไม่มีข้อมูลเกี่ยวกับฮาร์ดแวร์ซึ่งสามารถใช้งานได้ modinfo kalmiaพยายามที่จะหาคนขับรถที่เหมาะสมและการใช้งานตัวอย่างเช่น ในaliasสายคุณจะเห็น xxxx ผู้ขาย ID usb:vxxxxpyyyyและรหัสสินค้าเป็นปปปป หรือคุณสามารถแก้ไขไฟล์ /lib/modules/kernel_version/modules.usbmap และสำหรับ HW ของคุณคุณสามารถลบบรรทัดได้ซึ่งสำหรับโมดูล HW ที่เก็บข้อมูล USB ของคุณหรือเปลี่ยน usbstorage พร้อมไดรเวอร์สุทธิที่เหมาะสม แต่หลังจากdepmod -aการเปลี่ยนแปลงนี้จะหายไป ...
Marek

คำตอบ:


20

ในส่วนแรกของคำถามฉันได้ค้นหาและไม่สามารถหาวิธีที่ดีกว่าในการแยกไดรเวอร์ USB ออกจากสิ่งที่คุณทำกับ libusb

ในส่วนที่สองของคำถาม udev สามารถตอบสนองต่อการโหลดไดรเวอร์ แต่ไม่บังคับให้มีการกำหนดไดรเวอร์เฉพาะให้กับอุปกรณ์

ไดรเวอร์ทุกตัวในเคอร์เนล Linux รับผิดชอบอุปกรณ์หนึ่งตัวหรือมากกว่า ไดรเวอร์นั้นเลือกอุปกรณ์ที่รองรับ มันทำสิ่งนี้โดยทางโปรแกรมคือโดยการตรวจสอบผู้จำหน่ายและรหัสผลิตภัณฑ์หรือหากไม่พร้อมใช้งาน (เช่นอุปกรณ์เก่า) ทำการตรวจสอบฮิวริสติกและการตรวจสุขภาพ เมื่อไดรเวอร์มั่นใจว่าพบอุปกรณ์ที่รองรับจะแนบตัวเองเข้ากับมัน ในระยะสั้นคุณมักจะไม่สามารถบังคับให้คนขับรถคนใดคนหนึ่งใช้อุปกรณ์บางอย่างได้ อย่างไรก็ตามในบางครั้งไดรเวอร์อุปกรณ์นั้นใจกว้างกับสิ่งที่ยอมรับได้และอุปกรณ์สามารถทำงานได้โดยไม่รู้ตัว ไมล์สะสมของคุณจะแตกต่างกันไป! ก่อนหน้านี้ฉันต้องเพิ่มอุปกรณ์ PCI / รหัสผู้จำหน่ายแปลก ๆ ให้กับไดรเวอร์ที่ควรให้การสนับสนุนพวกเขาด้วยความสำเร็จที่หลากหลายและความผิดพลาดของเคอร์เนลที่น่าขบขัน

ตอนนี้ในกรณีของโมดูลมีขั้นตอนพิเศษ ตัวโหลดโมดูลจะถูกปลุกโดยเคอร์เนลเมื่อตรวจพบอุปกรณ์ใหม่ มันผ่านสตริง 'modalias' ซึ่งระบุอุปกรณ์และมีลักษณะดังนี้สำหรับอุปกรณ์ USB:

usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00

สตริงนี้มีคลาสอุปกรณ์ ( usb) และข้อมูลเฉพาะของคลาส (ผู้จำหน่าย / อุปกรณ์ / หมายเลขซีเรียล, คลาสอุปกรณ์ ฯลฯ ) เคอร์เนลไดรเวอร์แต่ละตัวมีบรรทัดเช่น:

MODULE_ALIAS("usb:...")

ซึ่งต้องตรงกับ usbalias (wildcard ใช้เพื่อจับคู่อุปกรณ์หลายเครื่อง) หากmodaliasตรงกับที่ไดรเวอร์รองรับไดรเวอร์นี้จะถูกโหลด (หรือแจ้งเตือนของอุปกรณ์ใหม่ถ้ามันมีอยู่แล้ว)

คุณสามารถดูอุปกรณ์ที่รองรับ (โดย modalias) และโมดูลที่เกี่ยวข้องด้วย

less /lib/modules/`uname -r`/modules.alias

หากคุณ grep สำหรับไดรเวอร์อุปกรณ์เก็บข้อมูล usb คุณจะเห็นว่ามีอุปกรณ์เฉพาะบางอย่างที่ผู้ผลิตและ ID อุปกรณ์สนับสนุนและจะพยายามสนับสนุนอุปกรณ์ใด ๆ ที่มีคลาส (พื้นที่เก็บข้อมูล) ที่เหมาะสมไม่ว่าผู้ขาย / อุปกรณ์จะเป็นใคร .

คุณสามารถควบคุมสิ่งนี้ได้โดยใช้กลไกผู้ใช้บนระบบปฏิบัติการของคุณ ( /etc/modprobe.d/บน Debian และเพื่อน) คุณสามารถขึ้นบัญชีดำโมดูลหรือคุณสามารถระบุโมดูลที่จะโหลดโดย modalias เช่นเดียวกับmodules.aliasไฟล์ (และใช้ไวยากรณ์เดียวกัน) depmod -aจะสร้างรูปแบบของโหลดเดอร์โมดูลใหม่

อย่างไรก็ตามแม้ว่าคุณสามารถนำม้าตัวนี้ลงน้ำ แต่คุณไม่สามารถทำให้เขาดื่มได้ หากไดรเวอร์ไม่รองรับอุปกรณ์ของคุณก็ควรเพิกเฉย

นี่คือทฤษฎีในกรณีทั่วไป

ในทางปฏิบัติและในกรณีของ USB ฉันเห็นว่าอุปกรณ์ของคุณมีอินเตอร์เฟซสองตัวซึ่งเป็นที่เก็บข้อมูลหนึ่ง เคอร์เนลจะเชื่อมต่อกับส่วนต่อประสานการจัดเก็บของอุปกรณ์โดยรวม หากอินเทอร์เฟซอื่นมีระดับที่เหมาะสมusbnetไดรเวอร์สามารถแนบได้ ได้คุณสามารถมีไดรเวอร์หลายตัวต่ออยู่กับอุปกรณ์ทางกายภาพเดียวกันเนื่องจากอุปกรณ์ USB ส่งออกหลายอินเตอร์เฟส (เช่นคีย์บอร์ด Logitech G15 ของฉันส่งออกสองเพราะมันมีอุปกรณ์แป้นพิมพ์และหน้าจอ LCD ซึ่งแต่ละไดรเวอร์ถูกจัดการโดยไดรเวอร์แยกต่างหาก) .

ข้อเท็จจริงที่ว่าอินเทอร์เฟซที่สองของอุปกรณ์ USB ของคุณไม่ถูกตรวจพบนั้นบ่งชี้ว่าขาดการสนับสนุนในเคอร์เนล ไม่ว่าในกรณีใดคุณสามารถแสดงรายการอินเตอร์เฟสอุปกรณ์ / จุดสิ้นสุดในรายละเอียดที่น่าตื่นเต้นโดยใช้lsusb -v | lessจากนั้นเลื่อนลงไปที่อุปกรณ์เฉพาะของคุณ (คุณสามารถ จำกัด เอาต์พุตตามอุปกรณ์: ID ผู้ขายหรือเส้นทาง USB หากคุณต้องการ)

โปรดทราบ: ฉันกำลังขยายส่วนเกินที่นี่เล็กน้อยเกี่ยวกับโครงสร้างตรรกะของอุปกรณ์ USB ตำหนิกลุ่ม USB :)


4
มีอยู่static struct usb_device_id id_table [] = { { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, { }, }; MODULE_DEVICE_TABLE (usb, id_table);ในรหัสแล้วมันซ้ำซ้อนกับ modalias หรือไม่?
โทมัส

ในกรณีของฉันบรรทัดเหล่านั้นถูกสร้างอัตโนมัติโดยเวทมนตร์ Makefile ที่ใดก็ได้ภายในไดรเวอร์ นั่นเป็นเหตุผลที่ฉันเพิ่มสามครั้งบรรทัดสำหรับ MODULE_ALIAS แต่มันไม่เคยได้รับการจดทะเบียน อย่างไรก็ตามขอขอบคุณ lsusb -v เมื่อฉันสามารถตรวจสอบและค้นหาข้อบกพร่องในความคิดของฉัน จากนั้นฉันจะ grep แหล่งที่มาของตัวระบุที่รู้จักและพบอาร์เรย์ที่มีรายการที่ฉันต้องจัดการ
JackGrinningCat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.