Changes in / [eb393ad:36f737a] in mainline
- Location:
- uspace
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/kbd/kbddev.c
reb393ad r36f737a 299 299 return; 300 300 } 301 301 302 unsigned i = 0; 303 302 304 /* Reset the LED data. */ 303 305 memset(kbd_dev->led_data, 0, kbd_dev->led_output_size * sizeof(int32_t)); 304 usb_log_debug("Creating output report:\n"); 305 306 usb_hid_report_field_t *field = usb_hid_report_get_sibling (hid_dev->parser, NULL, 307 kbd_dev->led_path, 308 USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY | USB_HID_PATH_COMPARE_END, 309 USB_HID_REPORT_TYPE_OUTPUT); 310 while(field != NULL) { 311 312 if((field->usage == USB_HID_LED_NUM_LOCK) && (kbd_dev->mods & KM_NUM_LOCK)){ 313 field->value = 1; 314 } 315 316 if((field->usage == USB_HID_LED_CAPS_LOCK) && (kbd_dev->mods & KM_CAPS_LOCK)){ 317 field->value = 1; 318 } 319 320 if((field->usage == USB_HID_LED_SCROLL_LOCK) && (kbd_dev->mods & KM_SCROLL_LOCK)){ 321 field->value = 1; 322 } 323 324 field = usb_hid_report_get_sibling (hid_dev->parser, field, 325 kbd_dev->led_path, 326 USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY | USB_HID_PATH_COMPARE_END, 327 USB_HID_REPORT_TYPE_OUTPUT); 328 } 329 330 int rc = usb_hid_report_output_translate(hid_dev->parser, 0, 306 307 if ((kbd_dev->mods & KM_NUM_LOCK) && (i < kbd_dev->led_output_size)) { 308 kbd_dev->led_data[i++] = USB_HID_LED_NUM_LOCK; 309 } 310 311 if ((kbd_dev->mods & KM_CAPS_LOCK) && (i < kbd_dev->led_output_size)) { 312 kbd_dev->led_data[i++] = USB_HID_LED_CAPS_LOCK; 313 } 314 315 if ((kbd_dev->mods & KM_SCROLL_LOCK) 316 && (i < kbd_dev->led_output_size)) { 317 kbd_dev->led_data[i++] = USB_HID_LED_SCROLL_LOCK; 318 } 319 320 // TODO: COMPOSE and KANA 321 322 usb_log_debug("Creating output report: "); 323 for (i = 0; i < kbd_dev->led_output_size; ++i) { 324 usb_log_debug("%d ", kbd_dev->led_data[i]); 325 } 326 usb_log_debug("\n"); 327 328 usb_hid_report_output_set_data(hid_dev->report, kbd_dev->led_path, 329 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 330 kbd_dev->led_data, kbd_dev->led_output_size); 331 int rc = usb_hid_report_output_translate(hid_dev->report, 0, 331 332 kbd_dev->output_buffer, kbd_dev->output_size); 332 333 … … 670 671 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0); 671 672 //usb_hid_report_path_set_report_id(path, 0); 672 673 uint8_t report_id; 674 int rc = usb_hid_parse_report(hid_dev->parser, buffer, actual_size, &report_id); 675 usb_hid_report_path_set_report_id (path, report_id); 676 usb_hid_report_field_t *field = usb_hid_report_get_sibling(hid_dev->parser, 677 NULL, path, USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 678 USB_HID_REPORT_TYPE_INPUT); 679 680 usb_hid_report_path_free(path); 673 674 int rc = usb_hid_parse_report(hid_dev->report, buffer, actual_size); 681 675 682 676 if (rc != EOK) { -
uspace/drv/usbhid/lgtch-ultrax/lgtch-ultrax.c
reb393ad r36f737a 81 81 usb_hid_report_path_t *path = usb_hid_report_path(); 82 82 usb_hid_report_path_append_item(path, 0xc, 0); 83 84 uint8_t report_id; 85 int rc = usb_hid_parse_report(hid_dev->parser, buffer, buffer_size, &report_id); 86 usb_hid_report_path_set_report_id(path, report_id); 83 usb_hid_report_path_set_report_id(path, 0); 84 85 int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size); 87 86 88 87 usb_hid_report_field_t *field = usb_hid_report_get_sibling(hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END , USB_HID_REPORT_TYPE_INPUT); -
uspace/drv/usbkbd/kbddev.c
reb393ad r36f737a 618 618 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0); 619 619 620 uint8_t report_id; 621 int rc = usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, &report_id); 620 int rc = usb_hid_parse_report(kbd_dev->parser, buffer, actual_size); 622 621 usb_hid_descriptor_print (kbd_dev->parser); 623 622 -
uspace/lib/usb/include/usb/classes/hidparser.h
reb393ad r36f737a 119 119 120 120 int use_report_ids; 121 uint8_t last_report_id;122 121 123 122 } usb_hid_report_t; … … 280 279 */ 281 280 /** */ 282 int usb_hid_parse_report(const usb_hid_report_t *report, const uint8_t *data, size_t size , uint8_t *report_id);281 int usb_hid_parse_report(const usb_hid_report_t *report, const uint8_t *data, size_t size); 283 282 284 283 /** */ … … 319 318 320 319 usb_hid_report_field_t *usb_hid_report_get_sibling(usb_hid_report_t *report, usb_hid_report_field_t *field, usb_hid_report_path_t *path, int flags, usb_hid_report_type_t type); 321 322 uint8_t usb_hid_report_get_report_id(usb_hid_report_t *report, uint8_t report_id, usb_hid_report_type_t type);323 324 320 325 321 /* -
uspace/lib/usb/src/hidparser.c
reb393ad r36f737a 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 );83 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data, size_t j); 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 160 159 field->usage_minimum = report_item->usage_minimum; 161 160 field->usage_maximum = report_item->usage_maximum; … … 166 165 field->usage_page = report_item->usage_page; 167 166 } 168 169 if(report_item->usages_count > 0 && ((report_item->usage_minimum = = 0) && (report_item->usage_maximum == 0))) {167 168 if(report_item->usages_count > 0 && ((report_item->usage_minimum = 0) && (report_item->usage_maximum = 0))) { 170 169 if(i < report_item->usages_count){ 171 if((report_item->usages[i] & 0xFF00) !=0){170 if((report_item->usages[i] & 0xFF00) > 0){ 172 171 field->usage_page = (report_item->usages[i] >> 16); 173 172 field->usage = (report_item->usages[i] & 0xFF); … … 180 179 field->usage = report_item->usages[report_item->usages_count - 1]; 181 180 } 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 } 181 } 193 182 194 183 field->size = report_item->size; … … 362 351 offset_output = 0; 363 352 offset_feature = 0; 364 usb_hid_report_path_set_report_id (usage_path, report_item->id);365 353 break; 366 354 … … 800 788 */ 801 789 int usb_hid_parse_report(const usb_hid_report_t *report, 802 const uint8_t *data, size_t size , uint8_t *report_id)790 const uint8_t *data, size_t size) 803 791 { 804 792 link_t *list_item; 805 793 usb_hid_report_field_t *item; 806 794 795 uint8_t report_id = 0; 807 796 usb_hid_report_description_t *report_des; 808 797 usb_hid_report_type_t type = USB_HID_REPORT_TYPE_INPUT; … … 813 802 814 803 if(report->use_report_ids != 0) { 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); 804 report_id = data[0]; 805 } 806 807 report_des = usb_hid_report_find_description(report, report_id, type); 823 808 824 809 /* read data */ … … 828 813 item = list_get_instance(list_item, usb_hid_report_field_t, link); 829 814 830 if( USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) {815 if(!USB_HID_ITEM_FLAG_CONSTANT(item->item_flags)) { 831 816 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; 817 if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) || 818 ((item->usage_minimum == 0) && (item->usage_maximum == 0))) { 819 820 // 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 } 837 827 } 838 828 else { 839 // variable item 840 item->value = usb_hid_translate_data(item, data); 841 } 829 // bitmapa 830 // TODO: overit jestli vraci hodnoty podle phy min/max 831 item->value = usb_hid_translate_data(item, data, 0); 832 } 842 833 } 843 834 list_item = list_item->next; … … 856 847 * @return Translated data 857 848 */ 858 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data )849 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data, size_t j) 859 850 { 860 851 int resolution; … … 871 862 } 872 863 873 if((item->physical_minimum == 0) && (item->physical_maximum == 0)) {864 if((item->physical_minimum == 0) && (item->physical_maximum == 0)) { 874 865 item->physical_minimum = item->logical_minimum; 875 item->physical_maximum = item->logical_maximum; 876 } 877 866 item->physical_maximum = item->logical_maximum; 867 } 878 868 879 869 if(item->physical_maximum == item->physical_minimum){ … … 886 876 } 887 877 888 offset = item->offset ;878 offset = item->offset + (j * item->size); 889 879 // FIXME 890 880 if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) { … … 924 914 value = (uint32_t)value; 925 915 } 916 926 917 927 918 return (int)(((value - item->logical_minimum) / resolution) + item->physical_minimum); … … 1251 1242 return NULL; 1252 1243 } 1253 1254 new_usage_path->report_id = usage_path->report_id;1255 1244 1256 1245 if(list_empty(&usage_path->head)){ … … 1404 1393 1405 1394 usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0)); 1406 1395 1407 1396 usb_hid_report_description_t *report_des; 1408 1397 report_des = usb_hid_report_find_description (report, report_id, USB_HID_REPORT_TYPE_OUTPUT); … … 1416 1405 report_item = list_get_instance(item, usb_hid_report_field_t, link); 1417 1406 1418 if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) { 1407 if((USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) || 1408 ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) { 1419 1409 1420 // array1410 // variable item 1421 1411 value = usb_hid_translate_data_reverse(report_item, report_item->value); 1422 1412 offset = report_item->offset; … … 1424 1414 } 1425 1415 else { 1426 // variable item1427 value 1416 //bitmap 1417 value += usb_hid_translate_data_reverse(report_item, report_item->value); 1428 1418 offset = report_item->offset; 1429 1419 length = report_item->size; … … 1472 1462 1473 1463 1474 // reset value1475 report_item->value = 0;1476 1477 1464 item = item->next; 1478 1465 } 1479 1466 1480 1467 usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0)); 1481 1468 … … 1498 1485 } 1499 1486 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 1506 1487 if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0)) { 1507 1488 1508 1489 // 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 1509 1495 if(item->physical_maximum == item->physical_minimum){ 1510 1496 resolution = 1; … … 1582 1568 if(usb_hid_report_compare_usage_path (field->collection_path, path, 1583 1569 flags) == EOK) { 1570 1584 1571 if(data_idx < data_size) { 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++; 1572 field->value = data[data_idx++]; 1593 1573 } 1594 1574 else { … … 1642 1622 while(field_it != &report_des->report_items) { 1643 1623 field = list_get_instance(field_it, usb_hid_report_field_t, link); 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 } 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){ 1651 1627 usb_hid_report_remove_last_item (field->collection_path); 1652 } 1628 usb_log_debug("....OK\n"); 1629 return field; 1630 } 1631 usb_hid_report_remove_last_item (field->collection_path); 1632 1653 1633 field_it = field_it->next; 1654 1634 } … … 1656 1636 return NULL; 1657 1637 } 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 1686 1638 /** 1687 1639 * @}
Note:
See TracChangeset
for help on using the changeset viewer.