Changeset eb393ad in mainline for uspace/lib/usb/src/hidparser.c
- Timestamp:
- 2011-04-21T20:57:21Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6513110
- Parents:
- 36f737a (diff), c7c0984a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/hidparser.c
r36f737a reb393ad 81 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 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data , size_t j);83 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data); 84 84 uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item, int32_t value); 85 85 int usb_pow(int a, int b); … … 151 151 list_initialize(&field->link); 152 152 153 /* fill the attributes */ 153 /* fill the attributes */ 154 154 field->collection_path = path; 155 155 field->logical_minimum = report_item->logical_minimum; … … 157 157 field->physical_minimum = report_item->physical_minimum; 158 158 field->physical_maximum = report_item->physical_maximum; 159 159 160 field->usage_minimum = report_item->usage_minimum; 160 161 field->usage_maximum = report_item->usage_maximum; … … 165 166 field->usage_page = report_item->usage_page; 166 167 } 167 168 if(report_item->usages_count > 0 && ((report_item->usage_minimum = 0) && (report_item->usage_maximum= 0))) {168 169 if(report_item->usages_count > 0 && ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) { 169 170 if(i < report_item->usages_count){ 170 if((report_item->usages[i] & 0xFF00) >0){171 if((report_item->usages[i] & 0xFF00) != 0){ 171 172 field->usage_page = (report_item->usages[i] >> 16); 172 173 field->usage = (report_item->usages[i] & 0xFF); … … 179 180 field->usage = report_item->usages[report_item->usages_count - 1]; 180 181 } 181 } 182 } 183 184 if((USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) != 0) && (!((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0)))) { 185 if(report_item->type == USB_HID_REPORT_TYPE_INPUT) { 186 field->usage = report_item->usage_maximum - i; 187 } 188 else { 189 field->usage = report_item->usage_minimum + i; 190 } 191 192 } 182 193 183 194 field->size = report_item->size; … … 351 362 offset_output = 0; 352 363 offset_feature = 0; 364 usb_hid_report_path_set_report_id (usage_path, report_item->id); 353 365 break; 354 366 … … 788 800 */ 789 801 int usb_hid_parse_report(const usb_hid_report_t *report, 790 const uint8_t *data, size_t size )802 const uint8_t *data, size_t size, uint8_t *report_id) 791 803 { 792 804 link_t *list_item; 793 805 usb_hid_report_field_t *item; 794 806 795 uint8_t report_id = 0;796 807 usb_hid_report_description_t *report_des; 797 808 usb_hid_report_type_t type = USB_HID_REPORT_TYPE_INPUT; … … 802 813 803 814 if(report->use_report_ids != 0) { 804 report_id = data[0]; 805 } 806 807 report_des = usb_hid_report_find_description(report, report_id, type); 815 *report_id = data[0]; 816 } 817 else { 818 *report_id = 0; 819 } 820 821 822 report_des = usb_hid_report_find_description(report, *report_id, type); 808 823 809 824 /* read data */ … … 813 828 item = list_get_instance(list_item, usb_hid_report_field_t, link); 814 829 815 if( !USB_HID_ITEM_FLAG_CONSTANT(item->item_flags)) {830 if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) { 816 831 817 if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) || 818 ((item->usage_minimum == 0) && (item->usage_maximum == 0))) { 819 832 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) { 833 834 // array 835 item->value = usb_hid_translate_data(item, data); 836 item->usage = (item->value - item->physical_minimum) + item->usage_minimum; 837 } 838 else { 820 839 // variable item 821 item->value = usb_hid_translate_data(item, data,0); 822 823 // array item ??? 824 if(!((item->usage_minimum == 0) && (item->usage_maximum == 0))) { 825 item->usage = item->value + item->usage_minimum; 826 } 827 } 828 else { 829 // bitmapa 830 // TODO: overit jestli vraci hodnoty podle phy min/max 831 item->value = usb_hid_translate_data(item, data, 0); 832 } 840 item->value = usb_hid_translate_data(item, data); 841 } 833 842 } 834 843 list_item = list_item->next; … … 847 856 * @return Translated data 848 857 */ 849 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data , size_t j)858 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data) 850 859 { 851 860 int resolution; … … 862 871 } 863 872 864 if((item->physical_minimum == 0) && (item->physical_maximum == 0)) 873 if((item->physical_minimum == 0) && (item->physical_maximum == 0)){ 865 874 item->physical_minimum = item->logical_minimum; 866 item->physical_maximum = item->logical_maximum; 867 } 875 item->physical_maximum = item->logical_maximum; 876 } 877 868 878 869 879 if(item->physical_maximum == item->physical_minimum){ … … 876 886 } 877 887 878 offset = item->offset + (j * item->size);888 offset = item->offset; 879 889 // FIXME 880 890 if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) { … … 914 924 value = (uint32_t)value; 915 925 } 916 917 926 918 927 return (int)(((value - item->logical_minimum) / resolution) + item->physical_minimum); … … 1242 1251 return NULL; 1243 1252 } 1253 1254 new_usage_path->report_id = usage_path->report_id; 1244 1255 1245 1256 if(list_empty(&usage_path->head)){ … … 1393 1404 1394 1405 usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0)); 1395 1406 1396 1407 usb_hid_report_description_t *report_des; 1397 1408 report_des = usb_hid_report_find_description (report, report_id, USB_HID_REPORT_TYPE_OUTPUT); … … 1405 1416 report_item = list_get_instance(item, usb_hid_report_field_t, link); 1406 1417 1407 if((USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) || 1408 ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) { 1418 if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) { 1409 1419 1410 // variable item1420 // array 1411 1421 value = usb_hid_translate_data_reverse(report_item, report_item->value); 1412 1422 offset = report_item->offset; … … 1414 1424 } 1415 1425 else { 1416 // bitmap1417 value += usb_hid_translate_data_reverse(report_item, report_item->value);1426 // variable item 1427 value = usb_hid_translate_data_reverse(report_item, report_item->value); 1418 1428 offset = report_item->offset; 1419 1429 length = report_item->size; … … 1462 1472 1463 1473 1474 // reset value 1475 report_item->value = 0; 1476 1464 1477 item = item->next; 1465 1478 } 1466 1479 1467 1480 usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0)); 1468 1481 … … 1485 1498 } 1486 1499 1500 if((item->physical_minimum == 0) && (item->physical_maximum == 0)){ 1501 item->physical_minimum = item->logical_minimum; 1502 item->physical_maximum = item->logical_maximum; 1503 } 1504 1505 1487 1506 if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0)) { 1488 1507 1489 1508 // variable item 1490 if((item->physical_minimum == 0) && (item->physical_maximum == 0)) {1491 item->physical_minimum = item->logical_minimum;1492 item->physical_maximum = item->logical_maximum;1493 }1494 1495 1509 if(item->physical_maximum == item->physical_minimum){ 1496 1510 resolution = 1; … … 1568 1582 if(usb_hid_report_compare_usage_path (field->collection_path, path, 1569 1583 flags) == EOK) { 1570 1571 1584 if(data_idx < data_size) { 1572 field->value = data[data_idx++]; 1585 if((data[data_idx] >= field->physical_minimum) && (data[data_idx] >= field->physical_minimum)) { 1586 field->value = data[data_idx]; 1587 } 1588 else { 1589 return ERANGE; 1590 } 1591 1592 data_idx++; 1573 1593 } 1574 1594 else { … … 1622 1642 while(field_it != &report_des->report_items) { 1623 1643 field = list_get_instance(field_it, usb_hid_report_field_t, link); 1624 1625 usb_hid_report_path_append_item (field->collection_path, field->usage_page, field->usage); 1626 if(usb_hid_report_compare_usage_path (field->collection_path, path, flags) == EOK){ 1644 1645 if(USB_HID_ITEM_FLAG_CONSTANT(field->item_flags) == 0) { 1646 usb_hid_report_path_append_item (field->collection_path, field->usage_page, field->usage); 1647 if(usb_hid_report_compare_usage_path (field->collection_path, path, flags) == EOK){ 1648 usb_hid_report_remove_last_item (field->collection_path); 1649 return field; 1650 } 1627 1651 usb_hid_report_remove_last_item (field->collection_path); 1628 usb_log_debug("....OK\n"); 1629 return field; 1630 } 1631 usb_hid_report_remove_last_item (field->collection_path); 1632 1652 } 1633 1653 field_it = field_it->next; 1634 1654 } … … 1636 1656 return NULL; 1637 1657 } 1658 1659 uint8_t usb_hid_report_get_report_id(usb_hid_report_t *report, uint8_t report_id, usb_hid_report_type_t type) 1660 { 1661 if(report == NULL){ 1662 return 0; 1663 } 1664 1665 usb_hid_report_description_t *report_des; 1666 link_t *report_it; 1667 1668 if(report_id == 0) { 1669 report_it = usb_hid_report_find_description (report, report_id, type)->link.next; 1670 } 1671 else { 1672 report_it = report->reports.next; 1673 } 1674 1675 while(report_it != &report->reports) { 1676 report_des = list_get_instance(report_it, usb_hid_report_description_t, link); 1677 if(report_des->type == type){ 1678 return report_des->report_id; 1679 } 1680 } 1681 1682 return 0; 1683 } 1684 1685 1638 1686 /** 1639 1687 * @}
Note:
See TracChangeset
for help on using the changeset viewer.