Связь с устройством CDC ACM в Linux через USB - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть какое-то последовательное устройство, подключенное через USB-устройство CDC-ACM, поэтому с ним можно связываться через / dev / ttyACM1 с точки зрения Linux.Конечное устройство - это устройство, которое содержит RTC, что позволяет мне получать текущую дату и время от него через CDC-ACM.Он отлично работает в пользовательском пространстве.

Ниже приведен дескриптор устройства моего CDC-ACM USB-устройства:

Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            2 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0xyyyy 
  idProduct          0xzzzz 
  bcdDevice            2.00
  iManufacturer           1 xxxxxxxxxxxxxx
  iProduct                2 yyyyyyyyyyyyyy
  iSerial                 3 zzzzzzzzzzzzzz
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           67
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 
      bInterfaceSubClass      2 
      bInterfaceProtocol      1 
      iInterface              0 
      CDC Header:
        bcdCDC               1.10
      CDC Call Management:
        bmCapabilities       0x00
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x02
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             255
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Status:     0x0001
  Self Powered

Теперь - я хотел бы установить дату и время через этот CDC-АСМ соединение с использованием API ядра через USB.Я подумал, что достаточно отправить одну и ту же строку запроса для даты и времени через пакетную передачу ep1 и получить ответ через пакетную передачу ep81.Я попытался сделать это с помощью usb_bulk_msg (), и когда я отправляю строку запроса с этим proc - он возвращает 0. Далее, когда я отправляю запрос на чтение ответа с этого устройства, я получаю -110 (-ETIMEDOUT).

Похоже, ядро ​​linux правильно отправляет мой первый запрос, потому что возвращает 0, но по некоторым причинам этот запрос не получен конечным устройством, потому что он ничего не ответил, потому что истекло время ожидания (-110).

Мне интересно, не пропустил ли я что-то с моим кодом, и поэтому он не работает.Есть идеи, что может быть не так?

Достаточно ли использовать только конечные точки на входе и выходе для связи с конечным устройством, или что-либо еще нужно сделать до правильной передачи?

...