Что содержится во втором байте моего USB Report_buf?

Я работаю с чипом STM32f042, использую библиотеки STM32 и пример проекта для пользовательского устройства HID. Я довольно новичок в USB в целом, поэтому я все еще пытаюсь понять, что все значит и делает.

Мой дескриптор отчета HID настроен так:

const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
{
  0x06, 0x00, 0xFF,    // Global  Usage page = 0xFF00 (Vendor-defined pages are in the range 0xFF00 through 0xFFFF)
  0x09, 0x01,          // Local   Usage (vendor usage 1)
  0xA1, 0x01,          // Main    Collection (application) begin
  0x15, 0x00,          // Global  Logical minimum (0) applies to each byte
  0x26, 0xFF, 0x00,    // Global  Logical maximum (255)
  0x75, 0x08,          // Global  Report Size (8 bits)
  // 14 bytes 

  // Output message 1 (sent from host to device)
  0x85, 0x01,          // Global  Report ID (cannot be 0)
  0x98, 0xff,          // Global  Report Count (number of Report Size fields, in this case 64 bytes)
  0x19, 0x01,          // Local   Usage Minimum (each Report Count must be associated with a Usage)
  0x19, 0x40,          // Local   Usage Maximum
  0x91, 0x02,          // Main    Output (data, array, absolute)
  // 24 bytes 

  // Input message 1 (sent from device to host)
  0x85, 0x01,          // Global  Report ID (cannot be 0)
  0x98, 0xff,          // Global  Report Count (number of Report Size fields)
  0x19, 0x01,          // Local   Usage Minimum (each Report Count must be associated with a Usage)
  0x19, 0x40,          // Local   Usage Maximum
  0x81, 0x02,          // Main    Input (data, array, absolute)
  // 34 bytes

  0xc0                 // END_COLLECTION
  // 35 bytes
};

Моя мысль состоит в том, чтобы взять какой-то байт от пользователя, а затем сделать что-то соответственно, а также иметь потенциал для отправки данных назад.

Мой скрипт Py, который отправляет байты, настроен так и будет писать b'x\00'b'x\01' или т.п

def connect(self):
    self.dev = usb.core.find(idVendor=self.VID, idProduct=self.PID)
    if self.dev is None:
        raise ValueError('Device not found')

    self.reattach = False
    if self.dev.is_kernel_driver_active(0):
        reattach = True
        self.dev.detach_kernel_driver(0)

    self.endpoint_in = self.dev[0][(0,0)][0]
    self.endpoint_out = self.dev[0][(0,0)][1]

def set(self, data):
    self.endpoint_out.write(data)

В конечном итоге они заканчиваются здесь, и я могу разобрать их, посмотрев на Report_buf[0]

uint8_t  USBD_HID_DataOut (void  *pdev, 
                                  uint8_t epnum)
{
  // BitAction Led_State;
  if (epnum == 1) {
    if (Report_buf[0] == 0x01) {
      foo();
    }
    else if (Report_buf[0] == 0x10) {
      foo();
    }
    else if (Report_buf[0] == 0x11) {
      foo();
    }    
    else if (Report_buf[0] == 0xff) {
      foo();
    }
    else {
      foo(); 
    }
  }

  DCD_EP_PrepareRx(pdev,HID_IN_EP,Report_buf,2);

  return USBD_OK;
}

У меня вопрос: когда я смотрю на Report_buf в gdb, появляется второй байт, который, насколько я знаю, не устанавливается. Этот второй байт последовательно сопоставляется с первым байтом, но он не уникален и, насколько я могу судить, не исходит из того, что я посылаю. Может кто-нибудь помочь мне понять, что это такое?

(gdb) p/x Report_buf 
$1 = {0x11, 0x80}

(gdb) p/x Report_buf 
$2 = {0x10, 0x41}

(gdb) p/x Report_buf 
$4 = {0x1, 0x81}

(gdb) p/x Report_buf 
$5 = {0x0, 0x40}

(gdb) p/x Report_buf 
$7 = {0x4, 0x41}

(gdb) p/x Report_buf 
$8 = {0x3, 0x0}

(gdb) p/x Report_buf 
$9 = {0x2, 0xc1}

0 ответов

Другие вопросы по тегам