Changes in / [cf2ccd4:1775ebc] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/hidparser.c
rcf2ccd4 r1775ebc 73 73 void usb_hid_print_usage_path(usb_hid_report_path_t *path); 74 74 void usb_hid_descriptor_print_list(link_t *head); 75 void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item);75 int usb_hid_report_reset_local_items(); 76 76 void usb_hid_free_report_list(link_t *head); 77 77 usb_hid_report_item_t *usb_hid_report_item_clone(const usb_hid_report_item_t *item); … … 79 79 * Data translation private functions 80 80 */ 81 uint32_t usb_hid_report_tag_data_uint32(const uint8_t *data, size_t size);81 int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size); 82 82 inline size_t usb_hid_count_item_offset(usb_hid_report_item_t * report_item, size_t offset); 83 83 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data); … … 85 85 int usb_pow(int a, int b); 86 86 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))89 87 // TODO: tohle ma bejt asi jinde 90 88 int usb_pow(int a, int b) … … 144 142 list_append(&path->link, &report->collection_paths); 145 143 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]);150 144 } 151 145 … … 174 168 175 169 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); 180 174 } 181 175 else { 182 usage = report_item->usages[report_item->usages_count - 1];176 field->usage = report_item->usages[i]; 183 177 } 184 178 } 185 179 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 } 204 182 } 205 183 … … 364 342 365 343 /* 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; 367 357 368 358 break; … … 486 476 // TODO usage_path->flags = *data; 487 477 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);489 478 return USB_HID_NO_ACTION; 490 479 break; … … 517 506 { 518 507 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); 520 509 break; 521 510 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); 523 512 break; 524 513 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); 526 515 break; 527 516 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); 529 518 break; 530 519 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); 533 521 break; 534 522 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); 536 524 break; 537 525 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); 539 527 break; 540 528 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); 542 530 break; 543 531 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); 545 533 break; 546 534 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); 548 536 return USB_HID_RESET_OFFSET; 549 537 break; … … 560 548 return USB_HID_NO_ACTION; 561 549 } 562 550 563 551 return EOK; 564 552 } … … 579 567 { 580 568 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); 583 570 break; 584 571 case USB_HID_REPORT_TAG_USAGE_MINIMUM: 585 572 if (item_size == 3) { 586 573 // 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; 589 576 } 590 577 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); 592 579 } 593 580 break; … … 595 582 if (item_size == 3) { 596 583 // 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; 599 586 } 600 587 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); 602 589 } 603 590 break; 604 591 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); 606 593 break; 607 594 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); 609 596 break; 610 597 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); 612 599 break; 613 600 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); 615 602 break; 616 603 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); 618 605 break; 619 606 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); 621 608 break; 622 609 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); 624 611 //TODO: 625 612 // DELIMITER STUFF … … 634 621 635 622 /** 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) 637 624 * 638 625 * @param Data buffer … … 640 627 * @return Converted int32 number 641 628 */ 642 uint32_t usb_hid_report_tag_data_uint32(const uint8_t *data, size_t size)629 int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size) 643 630 { 644 631 unsigned int i; 645 uint32_t result;632 int32_t result; 646 633 647 634 result = 0; … … 652 639 return result; 653 640 } 641 642 654 643 655 644 /** … … 676 665 usb_log_debug("\t\tOFFSET: %X\n", report_item->offset); 677 666 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); 682 671 usb_log_debug("\t\ttUSAGEMIN: %X\n", report_item->usage_minimum); 683 672 usb_log_debug("\t\tUSAGEMAX: %X\n", report_item->usage_maximum); … … 929 918 } 930 919 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; 933 925 } 934 926 … … 1537 1529 } 1538 1530 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; 1543 1533 } 1544 1534 … … 1693 1683 } 1694 1684 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 1716 1686 /** 1717 1687 * @}
Note:
See TracChangeset
for help on using the changeset viewer.