通过USB与Linux上的CDC ACM设备通信

时间:2018-12-13 09:54:14

标签: c linux-kernel linux-device-driver

我已经通过CDC-ACM USB设备连接了一些串行设备,因此从Linux的角度来看,可以通过/ dev / ttyACM1与之通信。 终端设备是包含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

现在-我想使用USB内核API通过此CDC-ACM连接设置日期和时间。我认为通过批量输出ep1发送相同的日期和时间请求字符串并通过批量输入ep81接收响应就足够了。我尝试使用usb_bulk_msg()进行操作,当我使用此proc发送请求字符串时-它返回0。接下来,当我发送请求以从该设备读取响应时,我得到-110(-ETIMEDOUT)。

似乎linux内核正在正确发送我的第一个请求,因为它返回0,但是由于某些原因,由于超时(-110)发生,它没有任何响应,因此最终设备未收到该请求。

我想知道我的代码是否没有遗漏任何东西,这就是为什么它不起作用的原因。有什么想法可能是错误的吗?

仅使用大容量输入和大容量输出端点与终端设备进行通信是否足够,还是在正确传输之前应该执行其他任何操作?

0 个答案:

没有答案