Что содержится во втором байте моего 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}