Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhid/src/hiddescriptor.c

    ra1732929 r3ca4ae9  
    3636#include <errno.h>
    3737#include <stdio.h>
    38 #include <malloc.h>
    3938#include <mem.h>
    4039#include <usb/debug.h>
    4140#include <assert.h>
     41#include <stdlib.h>
    4242
    4343
     
    7575#define USB_HID_RESET_OFFSET    3
    7676
     77#define USB_HID_INVALID                 -98
    7778/** Unknown tag was founded in report descriptor data*/
    7879#define USB_HID_UNKNOWN_TAG             -99
     
    103104               
    104105                if(usb_hid_report_compare_usage_path(path, cmp_path,
    105                                         USB_HID_PATH_COMPARE_STRICT) == EOK){
     106                                        USB_HID_PATH_COMPARE_STRICT) == 0){
    106107                        break;
    107108                }
     
    175176
    176177        if(report_item->usages_count > 0){
    177                 usages = malloc(sizeof(uint32_t) * report_item->usages_count);
     178                usages = malloc(sizeof(int32_t) * report_item->usages_count);
    178179                memcpy(usages, report_item->usages, sizeof(int32_t) *
    179180                                report_item->usages_count);
     
    246247                field->size = report_item->size;
    247248
    248                 field->offset = report_item->offset + (i * report_item->size);
     249                if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
     250                        int offset = report_item->offset + report_item->size * i;
     251                        int field_offset = (offset/8)*8 + (offset/8 + 1) * 8 -
     252                                offset - report_item->size;
     253                        if(field_offset < 0) {
     254                                field->offset = 0;
     255                        }
     256                        else {
     257                                field->offset = field_offset;
     258                        }
     259                }
     260                else {
     261                        field->offset = report_item->offset + (i * report_item->size);
     262                }
     263
    249264
    250265                if(report->use_report_ids != 0) {
     
    539554
    540555                if((ret=usb_hid_report_parse_main_tag(tag, data, item_size,
    541                         report_item, usage_path)) == EOK) {
     556                        report_item, usage_path)) == 0) {
    542557
    543558                        return USB_HID_NEW_REPORT_ITEM;
     
    570585 * @param Length of data buffer
    571586 * @param Current state table
    572  * @return Error code
     587 * @return 0 or USB_HID_ code
    573588 */
    574589
     
    585600        case USB_HID_REPORT_TAG_FEATURE:
    586601                report_item->item_flags = *data;                       
    587                 return EOK;                     
     602                return 0;                       
    588603                break;
    589604                       
     
    625640        }
    626641
    627         return EOK;
     642        return 0;
    628643}
    629644
     
    635650 * @param Length of data buffer
    636651 * @param Current state table
    637  * @return Error code
     652 * @return 0 or USB_HID_ code
    638653 */
    639654int usb_hid_report_parse_global_tag(uint8_t tag, const uint8_t *data,
     
    711726        }
    712727
    713         return EOK;
     728        return 0;
    714729}
    715730
     
    721736 * @param Length of data buffer
    722737 * @param Current state table
    723  * @return Error code
     738 * @return 0 or USB_HID_ code
    724739 */
    725740int usb_hid_report_parse_local_tag(uint8_t tag, const uint8_t *data,
     
    777792                            USB_HID_EXTENDED_USAGE_PAGE(
    778793                            usb_hid_report_tag_data_uint32(data, item_size))) {
    779                                 return EINVAL;
     794                                return USB_HID_INVALID;
    780795                        }
    781796                       
     
    848863        }
    849864       
    850         return EOK;
     865        return 0;
    851866}
    852867
     
    881896{
    882897        if(list == NULL || list_empty(list)) {
    883             usb_log_debug("\tempty");
     898            usb_log_debug("\tempty\n");
    884899            return;
    885900        }
     
    887902        list_foreach(*list, ritems_link, usb_hid_report_field_t,
    888903            report_item) {
    889                 usb_log_debug("\t\tOFFSET: %u", report_item->offset);
    890                 usb_log_debug("\t\tSIZE: %zu", report_item->size);
    891                 usb_log_debug("\t\tLOGMIN: %d",
     904                usb_log_debug("\t\tOFFSET: %X\n", report_item->offset);
     905                usb_log_debug("\t\tSIZE: %zu\n", report_item->size);
     906                usb_log_debug("\t\tLOGMIN: %d\n",
    892907                        report_item->logical_minimum);
    893                 usb_log_debug("\t\tLOGMAX: %d",
     908                usb_log_debug("\t\tLOGMAX: %d\n",
    894909                        report_item->logical_maximum);
    895                 usb_log_debug("\t\tPHYMIN: %d",
     910                usb_log_debug("\t\tPHYMIN: %d\n",
    896911                        report_item->physical_minimum);
    897                 usb_log_debug("\t\tPHYMAX: %d",
     912                usb_log_debug("\t\tPHYMAX: %d\n",
    898913                        report_item->physical_maximum);
    899                 usb_log_debug("\t\ttUSAGEMIN: %X",
     914                usb_log_debug("\t\ttUSAGEMIN: %X\n",
    900915                        report_item->usage_minimum);
    901                 usb_log_debug("\t\tUSAGEMAX: %X",
     916                usb_log_debug("\t\tUSAGEMAX: %X\n",
    902917                               report_item->usage_maximum);
    903                 usb_log_debug("\t\tUSAGES COUNT: %zu",
     918                usb_log_debug("\t\tUSAGES COUNT: %zu\n",
    904919                        report_item->usages_count);
    905920
    906                 usb_log_debug("\t\tVALUE: %X", report_item->value);
    907                 usb_log_debug("\t\ttUSAGE: %X", report_item->usage);
    908                 usb_log_debug("\t\tUSAGE PAGE: %X", report_item->usage_page);
     921                usb_log_debug("\t\tVALUE: %X\n", report_item->value);
     922                usb_log_debug("\t\ttUSAGE: %X\n", report_item->usage);
     923                usb_log_debug("\t\tUSAGE PAGE: %X\n", report_item->usage_page);
    909924
    910925                usb_hid_print_usage_path(report_item->collection_path);
     926
     927                usb_log_debug("\n");
    911928        }
    912929}
     
    926943        list_foreach(report->reports, reports_link,
    927944            usb_hid_report_description_t, report_des) {
    928                 usb_log_debug("Report ID: %d", report_des->report_id);
    929                 usb_log_debug("\tType: %d", report_des->type);
    930                 usb_log_debug("\tLength: %zu", report_des->bit_length);
    931                 usb_log_debug("\tB Size: %zu",
     945                usb_log_debug("Report ID: %d\n", report_des->report_id);
     946                usb_log_debug("\tType: %d\n", report_des->type);
     947                usb_log_debug("\tLength: %zu\n", report_des->bit_length);
     948                usb_log_debug("\tB Size: %zu\n",
    932949                        usb_hid_report_byte_size(report,
    933950                                report_des->report_id,
    934951                                report_des->type));
    935                 usb_log_debug("\tItems: %zu", report_des->item_length);
     952                usb_log_debug("\tItems: %zu\n", report_des->item_length);
    936953
    937954                usb_hid_descriptor_print_list(&report_des->report_items);
Note: See TracChangeset for help on using the changeset viewer.