Changes in / [cf2ccd4:1775ebc] in mainline


Ignore:
File:
1 edited

Legend:

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

    rcf2ccd4 r1775ebc  
    7373void usb_hid_print_usage_path(usb_hid_report_path_t *path);
    7474void usb_hid_descriptor_print_list(link_t *head);
    75 void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item);
     75int usb_hid_report_reset_local_items();
    7676void usb_hid_free_report_list(link_t *head);
    7777usb_hid_report_item_t *usb_hid_report_item_clone(const usb_hid_report_item_t *item);
     
    7979 * Data translation private functions
    8080 */
    81 uint32_t usb_hid_report_tag_data_uint32(const uint8_t *data, size_t size);
     81int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size);
    8282inline size_t usb_hid_count_item_offset(usb_hid_report_item_t * report_item, size_t offset);
    8383int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data);
     
    8585int usb_pow(int a, int b);
    8686
    87 #define USB_HID_UINT32_TO_INT32(x, size)        ((((x) & (1 << ((size) - 1))) != 0) ? -(~(x - 1) & ((1 << size) - 1)) : (x)) //(-(~((x) - 1)))
    88 #define USB_HID_INT32_TO_UINT32(x, size)        (((x) < 0 ) ? ((1 << (size)) + (x)) : (x))
    8987// TODO: tohle ma bejt asi jinde
    9088int usb_pow(int a, int b)
     
    144142                list_append(&path->link, &report->collection_paths);                                   
    145143                report->collection_paths_count++;
    146         }
    147 
    148         for(i=0; i<report_item->usages_count; i++){
    149                 usb_log_debug("usages (%d) - %x\n", i, report_item->usages[i]);
    150144        }
    151145
     
    174168
    175169                if(report_item->usages_count > 0 && ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) {
    176                         uint32_t usage;
    177                         if(report_item->type != USB_HID_REPORT_TYPE_INPUT) {
    178                                 if(i < report_item->usages_count){
    179                                         usage = report_item->usages[i];
     170                        if(i < report_item->usages_count){
     171                                if((report_item->usages[i] & 0xFF00) != 0){
     172                                        field->usage_page = (report_item->usages[i] >> 16);                                     
     173                                        field->usage = (report_item->usages[i] & 0xFF);
    180174                                }
    181175                                else {
    182                                         usage = report_item->usages[report_item->usages_count - 1];
     176                                        field->usage = report_item->usages[i];
    183177                                }
    184178                        }
    185179                        else {
    186                                 if((report_item->count - i - 1) < report_item->usages_count){
    187                                         usage = report_item->usages[(report_item->count - i - 1)];
    188                                 }
    189                                 else {
    190                                         usage = report_item->usages[report_item->usages_count - 1];
    191                                 }
    192                         }
    193 
    194                                                
    195                         if((usage & 0xFF00) != 0){
    196                                 field->usage_page = (usage >> 16);                                     
    197                                 field->usage = (usage & 0xFF);
    198                         }
    199                         else {
    200                                 field->usage = usage;
    201                         }
    202 
    203                        
     180                                field->usage = report_item->usages[report_item->usages_count - 1];
     181                        }
    204182                }       
    205183
     
    364342
    365343                                        /* reset local items */
    366                                         usb_hid_report_reset_local_items (report_item);
     344                                        while(report_item->usages_count > 0){
     345                                                report_item->usages[--(report_item->usages_count)] = 0;
     346                                        }
     347
     348                                        report_item->extended_usage_page = 0;
     349                                        report_item->usage_minimum = 0;
     350                                        report_item->usage_maximum = 0;
     351                                        report_item->designator_index = 0;
     352                                        report_item->designator_minimum = 0;
     353                                        report_item->designator_maximum = 0;
     354                                        report_item->string_index = 0;
     355                                        report_item->string_minimum = 0;
     356                                        report_item->string_maximum = 0;
    367357
    368358                                        break;
     
    486476                        // TODO usage_path->flags = *data;
    487477                        usb_hid_report_path_append_item(usage_path, report_item->usage_page, report_item->usages[report_item->usages_count-1]);                                         
    488                         usb_hid_report_reset_local_items (report_item);
    489478                        return USB_HID_NO_ACTION;
    490479                        break;
     
    517506        {
    518507                case USB_HID_REPORT_TAG_USAGE_PAGE:
    519                         report_item->usage_page = usb_hid_report_tag_data_uint32(data, item_size);
     508                        report_item->usage_page = usb_hid_report_tag_data_int32(data, item_size);
    520509                        break;
    521510                case USB_HID_REPORT_TAG_LOGICAL_MINIMUM:
    522                         report_item->logical_minimum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
     511                        report_item->logical_minimum = usb_hid_report_tag_data_int32(data,item_size);
    523512                        break;
    524513                case USB_HID_REPORT_TAG_LOGICAL_MAXIMUM:
    525                         report_item->logical_maximum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
     514                        report_item->logical_maximum = usb_hid_report_tag_data_int32(data,item_size);
    526515                        break;
    527516                case USB_HID_REPORT_TAG_PHYSICAL_MINIMUM:
    528                         report_item->physical_minimum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
     517                        report_item->physical_minimum = usb_hid_report_tag_data_int32(data,item_size);
    529518                        break;                 
    530519                case USB_HID_REPORT_TAG_PHYSICAL_MAXIMUM:
    531                         report_item->physical_maximum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
    532 
     520                        report_item->physical_maximum = usb_hid_report_tag_data_int32(data,item_size);
    533521                        break;
    534522                case USB_HID_REPORT_TAG_UNIT_EXPONENT:
    535                         report_item->unit_exponent = usb_hid_report_tag_data_uint32(data,item_size);
     523                        report_item->unit_exponent = usb_hid_report_tag_data_int32(data,item_size);
    536524                        break;
    537525                case USB_HID_REPORT_TAG_UNIT:
    538                         report_item->unit = usb_hid_report_tag_data_uint32(data,item_size);
     526                        report_item->unit = usb_hid_report_tag_data_int32(data,item_size);
    539527                        break;
    540528                case USB_HID_REPORT_TAG_REPORT_SIZE:
    541                         report_item->size = usb_hid_report_tag_data_uint32(data,item_size);
     529                        report_item->size = usb_hid_report_tag_data_int32(data,item_size);
    542530                        break;
    543531                case USB_HID_REPORT_TAG_REPORT_COUNT:
    544                         report_item->count = usb_hid_report_tag_data_uint32(data,item_size);
     532                        report_item->count = usb_hid_report_tag_data_int32(data,item_size);
    545533                        break;
    546534                case USB_HID_REPORT_TAG_REPORT_ID:
    547                         report_item->id = usb_hid_report_tag_data_uint32(data,item_size);
     535                        report_item->id = usb_hid_report_tag_data_int32(data,item_size);
    548536                        return USB_HID_RESET_OFFSET;
    549537                        break;
     
    560548                        return USB_HID_NO_ACTION;
    561549        }
    562 
     550       
    563551        return EOK;
    564552}
     
    579567        {
    580568                case USB_HID_REPORT_TAG_USAGE:
    581                         report_item->usages[report_item->usages_count] = usb_hid_report_tag_data_uint32(data,item_size);
    582                         report_item->usages_count++;
     569                        report_item->usages[report_item->usages_count++] = usb_hid_report_tag_data_int32(data,item_size);
    583570                        break;
    584571                case USB_HID_REPORT_TAG_USAGE_MINIMUM:
    585572                        if (item_size == 3) {
    586573                                // usage extended usages
    587                                 report_item->extended_usage_page = (usb_hid_report_tag_data_uint32(data,item_size) & 0xFF00) >> 16;
    588                                 report_item->usage_minimum = usb_hid_report_tag_data_uint32(data,item_size) & 0xFF;
     574                                report_item->extended_usage_page = (usb_hid_report_tag_data_int32(data,item_size) & 0xFF00) >> 16;
     575                                report_item->usage_minimum = usb_hid_report_tag_data_int32(data,item_size) & 0xFF;
    589576                        }
    590577                        else {
    591                                 report_item->usage_minimum = usb_hid_report_tag_data_uint32(data,item_size);
     578                                report_item->usage_minimum = usb_hid_report_tag_data_int32(data,item_size);
    592579                        }
    593580                        break;
     
    595582                        if (item_size == 3) {
    596583                                // usage extended usages
    597                                 report_item->extended_usage_page = (usb_hid_report_tag_data_uint32(data,item_size) & 0xFF00) >> 16;
    598                                 report_item->usage_maximum = usb_hid_report_tag_data_uint32(data,item_size) & 0xFF;
     584                                report_item->extended_usage_page = (usb_hid_report_tag_data_int32(data,item_size) & 0xFF00) >> 16;
     585                                report_item->usage_maximum = usb_hid_report_tag_data_int32(data,item_size) & 0xFF;
    599586                        }
    600587                        else {
    601                                 report_item->usage_maximum = usb_hid_report_tag_data_uint32(data,item_size);
     588                                report_item->usage_maximum = usb_hid_report_tag_data_int32(data,item_size);
    602589                        }
    603590                        break;
    604591                case USB_HID_REPORT_TAG_DESIGNATOR_INDEX:
    605                         report_item->designator_index = usb_hid_report_tag_data_uint32(data,item_size);
     592                        report_item->designator_index = usb_hid_report_tag_data_int32(data,item_size);
    606593                        break;
    607594                case USB_HID_REPORT_TAG_DESIGNATOR_MINIMUM:
    608                         report_item->designator_minimum = usb_hid_report_tag_data_uint32(data,item_size);
     595                        report_item->designator_minimum = usb_hid_report_tag_data_int32(data,item_size);
    609596                        break;
    610597                case USB_HID_REPORT_TAG_DESIGNATOR_MAXIMUM:
    611                         report_item->designator_maximum = usb_hid_report_tag_data_uint32(data,item_size);
     598                        report_item->designator_maximum = usb_hid_report_tag_data_int32(data,item_size);
    612599                        break;
    613600                case USB_HID_REPORT_TAG_STRING_INDEX:
    614                         report_item->string_index = usb_hid_report_tag_data_uint32(data,item_size);
     601                        report_item->string_index = usb_hid_report_tag_data_int32(data,item_size);
    615602                        break;
    616603                case USB_HID_REPORT_TAG_STRING_MINIMUM:
    617                         report_item->string_minimum = usb_hid_report_tag_data_uint32(data,item_size);
     604                        report_item->string_minimum = usb_hid_report_tag_data_int32(data,item_size);
    618605                        break;
    619606                case USB_HID_REPORT_TAG_STRING_MAXIMUM:
    620                         report_item->string_maximum = usb_hid_report_tag_data_uint32(data,item_size);
     607                        report_item->string_maximum = usb_hid_report_tag_data_int32(data,item_size);
    621608                        break;                 
    622609                case USB_HID_REPORT_TAG_DELIMITER:
    623                         //report_item->delimiter = usb_hid_report_tag_data_uint32(data,item_size);
     610                        //report_item->delimiter = usb_hid_report_tag_data_int32(data,item_size);
    624611                        //TODO:
    625612                        //      DELIMITER STUFF
     
    634621
    635622/**
    636  * Converts raw data to uint32 (thats the maximum length of short item data)
     623 * Converts raw data to int32 (thats the maximum length of short item data)
    637624 *
    638625 * @param Data buffer
     
    640627 * @return Converted int32 number
    641628 */
    642 uint32_t usb_hid_report_tag_data_uint32(const uint8_t *data, size_t size)
     629int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size)
    643630{
    644631        unsigned int i;
    645         uint32_t result;
     632        int32_t result;
    646633
    647634        result = 0;
     
    652639        return result;
    653640}
     641
     642
    654643
    655644/**
     
    676665                usb_log_debug("\t\tOFFSET: %X\n", report_item->offset);
    677666                usb_log_debug("\t\tSIZE: %X\n", report_item->size);                             
    678                 usb_log_debug("\t\tLOGMIN: %d\n", report_item->logical_minimum);
    679                 usb_log_debug("\t\tLOGMAX: %d\n", report_item->logical_maximum);               
    680                 usb_log_debug("\t\tPHYMIN: %d\n", report_item->physical_minimum);               
    681                 usb_log_debug("\t\tPHYMAX: %d\n", report_item->physical_maximum);                               
     667                usb_log_debug("\t\tLOGMIN: %X\n", report_item->logical_minimum);
     668                usb_log_debug("\t\tLOGMAX: %X\n", report_item->logical_maximum);               
     669                usb_log_debug("\t\tPHYMIN: %X\n", report_item->physical_minimum);               
     670                usb_log_debug("\t\tPHYMAX: %X\n", report_item->physical_maximum);                               
    682671                usb_log_debug("\t\ttUSAGEMIN: %X\n", report_item->usage_minimum);
    683672                usb_log_debug("\t\tUSAGEMAX: %X\n", report_item->usage_maximum);
     
    929918        }
    930919
    931         if((item->logical_minimum < 0) || (item->logical_maximum < 0)){
    932                 value = USB_HID_UINT32_TO_INT32(value, item->size);
     920        if(!(item->logical_minimum >= 0 && item->logical_maximum >= 0)){
     921                value = (int32_t)value;
     922        }
     923        else {
     924                value = (uint32_t)value;
    933925        }
    934926
     
    15371529        }
    15381530
    1539         if((item->logical_minimum < 0) || (item->logical_maximum < 0)){
    1540                 return USB_HID_INT32_TO_UINT32(ret, item->size);
    1541         }
    1542         return (int32_t)ret;
     1531
     1532        return (uint32_t)ret;
    15431533}
    15441534
     
    16931683}
    16941684
    1695 void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item)
    1696 {
    1697         if(report_item == NULL) {
    1698                 return;
    1699         }
    1700        
    1701         report_item->usages_count = 0;
    1702         memset(report_item->usages, 0, USB_HID_MAX_USAGES);
    1703        
    1704         report_item->extended_usage_page = 0;
    1705         report_item->usage_minimum = 0;
    1706         report_item->usage_maximum = 0;
    1707         report_item->designator_index = 0;
    1708         report_item->designator_minimum = 0;
    1709         report_item->designator_maximum = 0;
    1710         report_item->string_index = 0;
    1711         report_item->string_minimum = 0;
    1712         report_item->string_maximum = 0;
    1713 
    1714         return;
    1715 }
     1685
    17161686/**
    17171687 * @}
Note: See TracChangeset for help on using the changeset viewer.