Eu quero que meu dispositivo ARM embarcado 3.10 de destino para Linux receba e envie comandos para um PC HOST via USB HID. O PC do HOST terá uma interface gráfica que se comunica via USB HID para o dispositivo de destino do Linux. Normalmente eu usaria um driver não-HID para esse tipo de coisa, mas isso não é uma opção agora. No lado do alvo eu criei uma plataforma struct hidg_func_descriptor para o driver "hidg". O ID do relatório é 5, que eu uso para o primeiro byte dos DATA. Eu criei "/ dev / hidg0". Eu posso escrever de volta para o PC HOST com o write () para hidg0. Chega como uma interrupção com dados no analisador. Mas eu preciso ler () o HID_SET_REPORT do PC HOST USB. Atualmente, o read () simplesmente trava, não importa o que o HOST envia. No analisador USB, vejo que ele envia o USB_REQ_SET_CONFIGURATION (0x9) no nível do UDC. Em seguida, os dados vão para o hidg_setup (HID_REQ_SET_REPORT) e faz um goto stall.
Q1. O hidg0 foi projetado para manipular HID_SET / GET_REPORTs como um alvo?
Q2. Como dispositivo de destino, devo usar um / dev / xxx diferente para esse tipo de operação?
Q3. É melhor usar / dev / hidraw0 para esta plataforma HID personalizada.
platform configuration:
static struct hidg_func_descriptor hcr4_usb_hid_data = {
.subclass = 0,
.protocol = 0,
.report_length = 64,
.report_desc_length = 41,
.report_desc = {
0x06, 0x20, 0xFF, // Usage Page (Vendor Defined 0xFF20)
0x09, 0x01, // Usage (0x01)
0xA1, 0x01, // Collection (Application)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x85, 0x05, // Report ID (5)
0x09, 0x05, // Usage (0x05)
0x95, 0x3F, // Report Count (63)
0xB2, 0x02, 0x01, // Feature ()
0x85, 0x02, // Report ID (2)
0x09, 0x20, // Usage (0x20)
0x95, 0x3F, // Report Count (63)
0x82, 0x02, 0x01, // Input ()
0x85, 0x03, // Report ID (3)
0x09, 0x21, // Usage (0x21)
0x95, 0x05, // Report Count (5)
0x91, 0x02, // Output ()
0xC0, // End Collection
},
};