Работа с USB-HID под Linux (проблема с report)

Модератор: Модераторы разделов

GSMD
Сообщения: 19

Работа с USB-HID под Linux

Сообщение GSMD »

Для чтения данных с hid-устройства используется следующий фрагмент кода.

Код: Выделить всё

struct hiddev_report_info rinfo;
struct hiddev_field_info finfo;
struct hiddev_usage_ref uref;
int i, j, ret, count;
while (1){
    rinfo.report_type = HID_REPORT_TYPE_INPUT;
    rinfo.report_id = HID_REPORT_ID_FIRST;
    ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);

    // Get Reports
    while (ret >= 0&&rinfo.num_fields>0&&rinfo.num_fields<64){

        // Get Fields
        for (i = 0; i < rinfo.num_fields; i++){
            finfo.report_type = rinfo.report_type;
            finfo.report_id   = rinfo.report_id;
            finfo.field_index = i;
            ioctl(fd, HIDIOCGFIELDINFO, &finfo);


            // Get usages
            for (j = 0; j < count+1; j++){
                uref.report_type = finfo.report_type;
                uref.report_id   = finfo.report_id;
                uref.field_index = i;
                uref.usage_index = j;
                ioctl(fd, HIDIOCGUCODE, &uref);
                ioctl(fd, HIDIOCGUSAGE, &uref);

                printf("0x%X ",uref.value);

                // First output usage: grab it.
                if(uref.report_type == HID_REPORT_TYPE_OUTPUT && j==0) {
                    memcpy(&uref_out, &uref, sizeof(uref));
                }

            }
            for (; j < finfo.maxusage; j++){
                uref.report_type = finfo.report_type;
                uref.report_id   = finfo.report_id;
                uref.field_index = i;
                uref.usage_index = j;
                ioctl(fd, HIDIOCGUCODE, &uref);
                ioctl(fd, HIDIOCGUSAGE, &uref);
            }
        }
        printf("\n");

        rinfo.report_id = HID_REPORT_ID_NEXT;
        ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);

    }
    usleep(1000000);
}
}

В результате получаю лишь последний report из серии.
При попытке вместо

Код: Выделить всё

ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);

использовать

Код: Выделить всё

ret = ioctl(fd, HIDIOCGREPORT &rinfo);

вообще никакой разумной информации получить не удалось.
Попытки использовать вместо

Код: Выделить всё

rinfo.report_id = HID_REPORT_ID_FIRST;

что-либо другое, не привели ни к чему (полное отсутствие разумной информации).

Reports к устройству доходят и доходят без искажений (видно из того, что устройство правильно на них отвечает). Отправка репортов происходит при помощи

Код: Выделить всё

ret = ioctl(fd, HIDIOSGREPORT &rinfo);


Подскажите пожалуйста, что я делаю не так?
Премного благодарен.
Спасибо сказали: