Ignore:
File:
1 edited

Legend:

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

    r0a494fe r3b5d5b9d  
    5656#define USB_HID_UNKNOWN_TAG             -99
    5757
    58 
    59 /**
    60  * Initialize the report descriptor parser structure
    61  *
    62  * @param parser Report descriptor parser structure
    63  * @return Error code
    64  */
    65 int usb_hid_report_init(usb_hid_report_t *report)
    66 {
    67         if(report == NULL) {
    68                 return EINVAL;
    69         }
    70 
    71         memset(report, 0, sizeof(usb_hid_report_t));
    72         list_initialize(&report->reports);
    73         list_initialize(&report->collection_paths);
    74 
    75         report->use_report_ids = 0;
    76     return EOK;   
    77 }
    78 
    79 int usb_hid_report_append_fields(usb_hid_report_t *report, usb_hid_report_item_t *report_item)
    80 {
    81         usb_hid_report_field_t *field;
    82         int i;
    83 
    84 
     58usb_hid_report_path_t *usb_hid_report_path_try_insert(usb_hid_report_t *report, usb_hid_report_path_t *cmp_path)
     59{
    8560        /* find or append current collection path to the list */
    8661        link_t *path_it = report->collection_paths.next;
     
    8964                path = list_get_instance(path_it, usb_hid_report_path_t, link);
    9065               
    91                 if(usb_hid_report_compare_usage_path(path, report_item->usage_path, USB_HID_PATH_COMPARE_STRICT) == EOK){
     66                if(usb_hid_report_compare_usage_path(path, cmp_path, USB_HID_PATH_COMPARE_STRICT) == EOK){
    9267                        break;
    9368                }                       
     
    9570        }
    9671        if(path_it == &report->collection_paths) {
    97                 path = usb_hid_report_path_clone(report_item->usage_path);                     
     72                path = usb_hid_report_path_clone(cmp_path);                     
    9873                list_append(&path->link, &report->collection_paths);                                   
    9974                report->collection_paths_count++;
    100         }
     75
     76                return path;
     77        }
     78        else {
     79                return list_get_instance(path_it, usb_hid_report_path_t, link);
     80        }
     81}
     82
     83/**
     84 * Initialize the report descriptor parser structure
     85 *
     86 * @param parser Report descriptor parser structure
     87 * @return Error code
     88 */
     89int usb_hid_report_init(usb_hid_report_t *report)
     90{
     91        if(report == NULL) {
     92                return EINVAL;
     93        }
     94
     95        memset(report, 0, sizeof(usb_hid_report_t));
     96        list_initialize(&report->reports);
     97        list_initialize(&report->collection_paths);
     98
     99        report->use_report_ids = 0;
     100    return EOK;   
     101}
     102
     103
     104/*
     105 *
     106 *
     107 */
     108int usb_hid_report_append_fields(usb_hid_report_t *report, usb_hid_report_item_t *report_item)
     109{
     110        usb_hid_report_field_t *field;
     111        int i;
    101112
    102113        for(i=0; i<report_item->usages_count; i++){
     
    104115        }
    105116
    106        
     117        usb_hid_report_path_t *path = report_item->usage_path; 
    107118        for(i=0; i<report_item->count; i++){
    108119
     
    112123
    113124                /* fill the attributes */               
    114                 field->collection_path = path;
    115125                field->logical_minimum = report_item->logical_minimum;
    116126                field->logical_maximum = report_item->logical_maximum;
     
    129139                if(report_item->usages_count > 0 && ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) {
    130140                        uint32_t usage;
    131                         if(report_item->type != USB_HID_REPORT_TYPE_OUTPUT) {
    132                                 if(i < report_item->usages_count){
    133                                         usage = report_item->usages[i];
    134                                 }
    135                                 else {
    136                                         usage = report_item->usages[report_item->usages_count - 1];
    137                                 }
     141                        if(i < report_item->usages_count){
     142                                usage = report_item->usages[i];
    138143                        }
    139144                        else {
    140                                 if((report_item->count - i - 1) < report_item->usages_count){
    141                                         usage = report_item->usages[(report_item->count - i - 1)];
    142                                 }
    143                                 else {
    144                                         usage = report_item->usages[report_item->usages_count - 1];
    145                                 }
     145                                usage = report_item->usages[report_item->usages_count - 1];
    146146                        }
    147147
     
    159159
    160160                if((USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) != 0) && (!((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0)))) {
    161                         if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
    162                                 field->usage = report_item->usage_maximum - i;
    163                         }
    164                         else {
    165                                 field->usage = report_item->usage_minimum + i;                                 
    166                         }
    167 
    168                 }
    169                
     161                        field->usage = report_item->usage_minimum + i;                                 
     162                }
     163               
     164                usb_hid_report_set_last_item(path, USB_HID_TAG_CLASS_GLOBAL, field->usage_page);
     165                usb_hid_report_set_last_item(path, USB_HID_TAG_CLASS_LOCAL, field->usage);
     166
     167                field->collection_path = usb_hid_report_path_try_insert(report, path);
     168
    170169                field->size = report_item->size;
    171                 field->offset = report_item->offset + (i * report_item->size);
     170               
     171                size_t offset_byte = (report_item->offset + (i * report_item->size)) / 8;
     172                size_t offset_bit = 8 - ((report_item->offset + (i * report_item->size)) % 8) - report_item->size;
     173
     174                field->offset = 8 * offset_byte + offset_bit;
    172175                if(report_item->id != 0) {
    173176                        field->offset += 8;
     
    349352                                        tmp_usage_path = list_get_instance(report_item->usage_path->link.prev, usb_hid_report_usage_path_t, link);
    350353                                       
    351                                         usb_hid_report_set_last_item(usage_path, tmp_usage_path->usage_page, tmp_usage_path->usage);
     354                                        usb_hid_report_set_last_item(usage_path, USB_HID_TAG_CLASS_GLOBAL, tmp_usage_path->usage_page);
     355                                        usb_hid_report_set_last_item(usage_path, USB_HID_TAG_CLASS_LOCAL, tmp_usage_path->usage);
    352356
    353357                                        usb_hid_report_path_free(report_item->usage_path);
     
    629633
    630634                usb_log_debug("\t\tOFFSET: %X\n", report_item->offset);
    631                 usb_log_debug("\t\tSIZE: %zu\n", report_item->size);
     635                usb_log_debug("\t\tSIZE: %X\n", report_item->size);                             
    632636                usb_log_debug("\t\tLOGMIN: %d\n", report_item->logical_minimum);
    633637                usb_log_debug("\t\tLOGMAX: %d\n", report_item->logical_maximum);               
     
    640644                usb_log_debug("\t\ttUSAGE: %X\n", report_item->usage);
    641645                usb_log_debug("\t\tUSAGE PAGE: %X\n", report_item->usage_page);
    642                                                
    643 //              usb_log_debug("\n");           
     646               
     647                //usb_hid_print_usage_path(report_item->collection_path);
     648
     649                usb_log_debug("\n");           
    644650
    645651        }
     
    666672                usb_log_debug("Report ID: %d\n", report_des->report_id);
    667673                usb_log_debug("\tType: %d\n", report_des->type);
    668                 usb_log_debug("\tLength: %zu\n", report_des->bit_length);
    669                 usb_log_debug("\tItems: %zu\n", report_des->item_length);
     674                usb_log_debug("\tLength: %d\n", report_des->bit_length);               
     675                usb_log_debug("\tItems: %d\n", report_des->item_length);               
    670676
    671677                usb_hid_descriptor_print_list(&report_des->report_items);
Note: See TracChangeset for help on using the changeset viewer.