Usb
缺少 USB“輸出”端點?
我正在嘗試與作為雷射控制器的 USB 設備通信。該設備有一個 Windows 控制器,它既可以寫入(打開或關閉雷射),也可以讀取(獲取雷射的狀態,打開或關閉)。現在我想使用 Python 在 Linux 機器上複製它。我能夠成功地從設備讀取,但由於某種原因我無法寫入它(有關更多詳細資訊,請參閱此 SO 問題)。
我對USB通信沒有太多經驗,但是我在某處看到
IN
端點用於讀取而OUT
端點用於寫入,並且我注意到當lsusb -v -d <my_device>
我得到一個IN
端點但沒有OUT
端點時,所以這可能成為我問題的原因。它看起來像一個“只讀設備”(我可能錯了)。我現在的問題是:在 Linux 中,是否有可能
OUT
由於缺少驅動程序或某些配置而看不到端點?這是的輸出
lsusb -v -d <my_device>
:Bus 002 Device 010: ID c251:2201 Keil Software, Inc. LASER Driver IJS Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0xc251 Keil Software, Inc. idProduct 0x2201 bcdDevice 1.00 iManufacturer 1 LASER Driver iProduct 2 LASER Driver IJS iSerial 3 0001A0000000 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0022 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Self Powered MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 4 HID HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.00 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 33 Report Descriptor: (length is 33) Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 (null) Item(Local ): Usage, data= [ 0x01 ] 1 (null) Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x40 ] 64 Item(Local ): Usage, data= [ 0x10 ] 16 (null) Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x40 ] 64 Item(Local ): Usage, data= [ 0x10 ] 16 (null) Item(Main ): Output, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x01 ] 1 Item(Local ): Usage, data= [ 0x01 ] 1 (null) Item(Main ): Feature, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 can't get device qualifier: Resource temporarily unavailable can't get debug descriptor: Resource temporarily unavailable Device Status: 0x0001 Self Powered
每個 USB 設備都會在預設端點(即端點 #0)中接受控制命令。這也是配置 USB 匯流排的基本要求,所以端點描述符中不必提及,因為端點 #0 必須始終存在。預設端點也是雙向的,因此單個控制傳輸可以包括從電腦到設備的命令和設備的響應。
您的雷射控制器很可能使用端點 #0 將電腦命令發送到雷射控制器。端點 #1 是一個中斷端點,因此控制器可能使用它來報告雷射器狀態的任何變化,或必須及時響應的錯誤情況(例如“雷射器過熱”)。
雷射控制器的 USB 介面使用 HID 介面類,因為 HID 類的規範包括用於雜項和供應商特定控制的設施。
設備的介面描述符具有
bNumEndpoints
as1
,因此它確認除了始終存在的控制端點 #0 之外應該只有一個端點,並且您沒有遺漏任何東西。