Linux

從一個物理 USB 設備創建的 ttyACM0 和 sdb

  • June 21, 2016

我有一個基於 Nordic Semiconductors nRF51 SoC 的 USB 設備。一旦我將它插入我的 Ubuntu 機器,它就會觸發/dev/ttyACM1/dev/sdb. 到目前為止,我認為它/dev/ttyACM1是一個 UART 串​​行設備。我不知道該怎麼做。沒有添加自定義 udev 規則。

輸出lsusb -v

Bus 002 Device 022: ID 1366:1015 SEGGER 
Device Descriptor:
 bLength                18
 bDescriptorType         1
 bcdUSB               2.00
 bDeviceClass          239 Miscellaneous Device
 bDeviceSubClass         2 ?
 bDeviceProtocol         1 Interface Association
 bMaxPacketSize0        64
 idVendor           0x1366 SEGGER
 idProduct          0x1015 
 bcdDevice            1.00
 iManufacturer           1 SEGGER
 iProduct                2 J-Link
 iSerial                 3 000680636054
 bNumConfigurations      1
 Configuration Descriptor:
   bLength                 9
   bDescriptorType         2
   wTotalLength          121
   bNumInterfaces          4
   bConfigurationValue     1
   iConfiguration          4 Configuration
   bmAttributes         0x80
     (Bus Powered)
   MaxPower              100mA
   Interface Association:
     bLength                 8
     bDescriptorType        11
     bFirstInterface         0
     bInterfaceCount         2
     bFunctionClass          2 Communications
     bFunctionSubClass       0 
     bFunctionProtocol       0 
     iFunction               0 
   Interface Descriptor:
     bLength                 9
     bDescriptorType         4
     bInterfaceNumber        0
     bAlternateSetting       0
     bNumEndpoints           1
     bInterfaceClass         2 Communications
     bInterfaceSubClass      2 Abstract (modem)
     bInterfaceProtocol      1 AT-commands (v.25ter)
     iInterface              5 CDC ACM
     CDC Header:
       bcdCDC               1.10
     CDC Call Management:
       bmCapabilities       0x03
         call management
         use DataInterface
       bDataInterface          1
     CDC ACM:
       bmCapabilities       0x06
         sends break
         line coding and serial state
     CDC Union:
       bMasterInterface        0
       bSlaveInterface         1 
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x87  EP 7 IN
       bmAttributes            3
         Transfer Type            Interrupt
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0008  1x 8 bytes
       bInterval               8
   Interface Descriptor:
     bLength                 9
     bDescriptorType         4
     bInterfaceNumber        1
     bAlternateSetting       0
     bNumEndpoints           2
     bInterfaceClass        10 CDC Data
     bInterfaceSubClass      0 Unused
     bInterfaceProtocol      0 
     iInterface              6 CDC DATA
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x83  EP 3 IN
       bmAttributes            2
         Transfer Type            Bulk
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0040  1x 64 bytes
       bInterval               1
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x04  EP 4 OUT
       bmAttributes            2
         Transfer Type            Bulk
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0040  1x 64 bytes
       bInterval               1
   Interface Descriptor:
     bLength                 9
     bDescriptorType         4
     bInterfaceNumber        2
     bAlternateSetting       0
     bNumEndpoints           2
     bInterfaceClass       255 Vendor Specific Class
     bInterfaceSubClass    255 Vendor Specific Subclass
     bInterfaceProtocol    255 Vendor Specific Protocol
     iInterface              7 J-Link
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x81  EP 1 IN
       bmAttributes            2
         Transfer Type            Bulk
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0200  1x 512 bytes
       bInterval               1
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x02  EP 2 OUT
       bmAttributes            2
         Transfer Type            Bulk
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0200  1x 512 bytes
       bInterval               1
   Interface Descriptor:
     bLength                 9
     bDescriptorType         4
     bInterfaceNumber        3
     bAlternateSetting       0
     bNumEndpoints           2
     bInterfaceClass         8 Mass Storage
     bInterfaceSubClass      6 SCSI
     bInterfaceProtocol     80 Bulk-Only
     iInterface              8 MSD
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x85  EP 5 IN
       bmAttributes            2
         Transfer Type            Bulk
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0200  1x 512 bytes
       bInterval               1
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x06  EP 6 OUT
       bmAttributes            2
         Transfer Type            Bulk
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0200  1x 512 bytes
       bInterval               1
Device Qualifier (for other device speed):
 bLength                10
 bDescriptorType         6
 bcdUSB               2.00
 bDeviceClass          239 Miscellaneous Device
 bDeviceSubClass         2 ?
 bDeviceProtocol         1 Interface Association
 bMaxPacketSize0        64
 bNumConfigurations      1
Device Status:     0x0000
 (Bus Powered)

什麼機制會觸發 attyACM1被辨識為ttyACM1/dev/sdb

USB 設備可以有多個介面(例如帶有控制按鈕的揚聲器)。每個介面都是獨立的,儘管可以有一個描述符說它們應該聯合工作。如果介面使用 Linux 支持的設備類,則將使用類驅動程序使其可用。有通信設備類大容量儲存的類驅動程序。在您的情況下,串列埠可能用於發送命令,而大容量儲存器用於寫入快閃記憶體。查看lsusb -v您設備的輸出以了解有關介面的詳細資訊。

引用自:https://unix.stackexchange.com/questions/290926