HIDAPI в Linux, похоже, не распознает дескрипторы - PullRequest
0 голосов
/ 24 ноября 2018

Получил устройство, сообщенное в dmesg как:

[ 7679.312788] hid-generic 0003:16D0:0E70.0012: hiddev0,hidraw0: USB HID v1.01 Device [.de.nonchip TinyStick HIDSTM1640] on usb-0000:00:13.0-3/input0

Фактический дескриптор HID (как я положил его в прошивке устройства, не прослушивается + декодируется) выглядит следующим образом:

PROGMEM const char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {    /* USB report descriptor */
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x08,                    //   REPORT_COUNT (8)
    0x09, 0x00,                    //   USAGE (Undefined)  
    0x82, 0x02, 0x01,              //   INPUT (Data,Var,Abs,Buf)
    0x95, 32, //   REPORT_COUNT (32)
    0x09, 0x00,                    //   USAGE (Undefined)        
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)
    0xc0                           // END_COLLECTION
};

строковые дескрипторы определены как:

#define USB_CFG_VENDOR_NAME     '.','d','e','.','n','o','n','c','h','i','p'
#define USB_CFG_VENDOR_NAME_LEN 11
#define USB_CFG_DEVICE_NAME     'T','i','n','y','S','t','i','c','k',' ','H','I','D','S','T','M','1','6','4','0'
#define USB_CFG_DEVICE_NAME_LEN 20

Я использую следующий код в hidapi, чтобы (попытаться) найти его:

#define HIDSERIAL_VENDOR_ID 0x16d0
#define HIDSERIAL_PRODUCT_ID 0x0E70
#define HIDSERIAL_MANUFACTURER_STRING L".de.nonchip"
#define HIDSERIAL_PRODUCT_STRING L"TinyStick HIDSTM1640"

hid_device* hidserial_find_device(void){
  hid_device *handle = NULL;

  hid_init();
  // Enumerate and print the HID devices on the system
  struct hid_device_info *devs, *cur_dev;

  devs = hid_enumerate(HIDSERIAL_VENDOR_ID, HIDSERIAL_PRODUCT_ID);
  cur_dev = devs; 
  while (cur_dev) {
    wprintf(L"%ls %ls\n", cur_dev->manufacturer_string, cur_dev->product_string); // <------ DEBUG
    if( cur_dev->manufacturer_string!=NULL && cur_dev->product_string!=NULL &&
        0==wcscmp(HIDSERIAL_MANUFACTURER_STRING,cur_dev->manufacturer_string) &&
        0==wcscmp(HIDSERIAL_PRODUCT_STRING,cur_dev->product_string)){
      handle = hid_open_path(cur_dev->path);
      break;
    }
    cur_dev = cur_dev->next;
  }
  hid_free_enumeration(devs);

  return handle;
}

Моя проблема в том, что устройство, в то время как сообщается ядром, не найдено.выходные данные отладки показывают единственную строку (null) (null), которая указывает, что устройство было перечислено его парой VID: PID, но строки внезапно становятся пустыми.Я не получаю никаких ошибок (можно ожидать что-то вроде «Отказано в доступе», но ничего не сообщается, и даже запуск его с правами root не помогает) ...

...