Changes in / [f50f722:7b6f116] in mainline
- Location:
- uspace
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/kbd/kbddev.c
rf50f722 r7b6f116 700 700 701 701 while (field != NULL) { 702 //usb_log_debug2("FIELD (%p) - VALUE(%d) USAGE(%u)\n",703 //field, field->value, field->usage);702 usb_log_debug2("FIELD (%p) - VALUE(%d) USAGE(%u)\n", 703 field, field->value, field->usage); 704 704 705 705 assert(i < kbd_dev->key_count); … … 865 865 usb_hid_report_path_set_report_id(path, 0); 866 866 867 kbd_dev->key_count = usb_hid_report_size( 868 hid_dev->report, 0, USB_HID_REPORT_TYPE_INPUT); 867 kbd_dev->key_count = usb_hid_report_input_length( 868 hid_dev->report, path, 869 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY); 869 870 usb_hid_report_path_free(path); 870 871 … … 907 908 kbd_dev->led_path, USB_HIDUT_PAGE_LED, 0); 908 909 909 kbd_dev->led_output_size = usb_hid_report_size(hid_dev->report, 0, 910 USB_HID_REPORT_TYPE_OUTPUT); 910 kbd_dev->led_output_size = usb_hid_report_output_size(hid_dev->report, 911 kbd_dev->led_path, 912 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY); 911 913 912 914 usb_log_debug("Output report size (in items): %zu\n", -
uspace/drv/usbhid/lgtch-ultrax/lgtch-ultrax.c
rf50f722 r7b6f116 300 300 usb_hid_report_path_set_report_id(path, 1); 301 301 302 lgtch_dev->key_count = usb_hid_report_ size(hid_dev->report, 1,303 USB_HID_REPORT_TYPE_INPUT);304 302 lgtch_dev->key_count = usb_hid_report_input_length( 303 hid_dev->report, path, 304 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY); 305 305 usb_hid_report_path_free(path); 306 306 -
uspace/drv/usbhid/usbhid.c
rf50f722 r7b6f116 203 203 204 204 usb_log_debug("Compare flags: %d\n", mapping->compare); 205 size_t size = usb_hid_report_ size(hid_dev->report, mapping->report_id,206 USB_HID_REPORT_TYPE_INPUT);205 size_t size = usb_hid_report_input_length(hid_dev->report, usage_path, 206 mapping->compare); 207 207 usb_log_debug("Size of the input report: %zuB\n", size); 208 208 -
uspace/drv/usbkbd/kbddev.c
rf50f722 r7b6f116 771 771 usb_hid_report_path_set_report_id(path, 0); 772 772 773 kbd_dev->key_count = usb_hid_report_ size(774 kbd_dev->parser, 0, USB_HID_REPORT_TYPE_INPUT);773 kbd_dev->key_count = usb_hid_report_input_length( 774 kbd_dev->parser, path, USB_HID_PATH_COMPARE_END); 775 775 usb_hid_report_path_free (path); 776 776 … … 803 803 usb_hid_report_path_set_report_id(kbd_dev->led_path, 0x00); 804 804 805 kbd_dev->led_output_size = usb_hid_report_size(kbd_dev->parser, 0, 806 USB_HID_REPORT_TYPE_OUTPUT); 805 kbd_dev->led_output_size = usb_hid_report_output_size(kbd_dev->parser, 806 kbd_dev->led_path, 807 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY); 807 808 808 809 usb_log_debug("Output report size (in items): %zu\n", -
uspace/lib/usb/include/usb/classes/hid_report_items.h
rf50f722 r7b6f116 46 46 #define USB_HID_ITEM_IS_LONG(data) (data == 0xFE) 47 47 48 49 /**50 * Extended usage macros51 */52 #define USB_HID_IS_EXTENDED_USAGE(usage) ((usage & 0xFFFF0000) != 0)53 #define USB_HID_EXTENDED_USAGE_PAGE(usage) ((usage & 0xFFFF0000) >> 16)54 #define USB_HID_EXTENDED_USAGE(usage) (usage & 0xFFFF)55 48 56 49 /** -
uspace/lib/usb/include/usb/classes/hidparser.h
rf50f722 r7b6f116 51 51 size_t size, uint8_t *report_id); 52 52 53 /** */ 54 size_t usb_hid_report_input_length(const usb_hid_report_t *report, 55 usb_hid_report_path_t *path, int flags); 56 53 57 /* 54 58 * Output report parser functions … … 61 65 void usb_hid_report_output_free(uint8_t *output); 62 66 63 /** Returns size of report in items*/64 size_t usb_hid_report_ size(usb_hid_report_t *report, uint8_t report_id,65 usb_hid_report_type_t type);67 /** Returns size of output for given usage path */ 68 size_t usb_hid_report_output_size(usb_hid_report_t *report, 69 usb_hid_report_path_t *path, int flags); 66 70 67 71 /** Makes the output report buffer by translated given data */ -
uspace/lib/usb/include/usb/classes/hidtypes.h
rf50f722 r7b6f116 39 39 #include <adt/list.h> 40 40 41 #define USB_HID_MAX_USAGES 0xffff41 #define USB_HID_MAX_USAGES 20 42 42 43 43 #define USB_HID_UINT32_TO_INT32(x, size) ((((x) & (1 << ((size) - 1))) != 0) ? -(~(x - 1) & ((1 << size) - 1)) : (x)) //(-(~((x) - 1))) … … 92 92 int32_t physical_minimum; 93 93 int32_t physical_maximum; 94 int32_t usage_minimum;95 int32_t usage_maximum;94 uint32_t usage_minimum; 95 uint32_t usage_maximum; 96 96 uint32_t unit; 97 97 uint32_t unit_exponent; 98 99 uint32_t *usages; 100 size_t usages_count; 98 101 99 102 100 int32_t value; … … 123 121 124 122 /** */ 125 int32_t usage_minimum;126 /** */ 127 int32_t usage_maximum;123 uint32_t usage_minimum; 124 /** */ 125 uint32_t usage_maximum; 128 126 /** */ 129 127 int32_t logical_minimum; -
uspace/lib/usb/src/hiddescriptor.c
rf50f722 r7b6f116 64 64 { 65 65 /* find or append current collection path to the list */ 66 //link_t *path_it = report->collection_paths.next; 67 link_t *path_it = report->collection_paths.prev->next; 66 link_t *path_it = report->collection_paths.next; 68 67 usb_hid_report_path_t *path = NULL; 69 70 71 68 while(path_it != &report->collection_paths) { 72 69 path = list_get_instance(path_it, usb_hid_report_path_t, link); … … 119 116 int i; 120 117 121 uint32_t *usages; 122 int usages_used=0; 123 if(report_item->usages_count > 0){ 124 usages = malloc(sizeof(int32_t) * report_item->usages_count); 125 memcpy(usages, report_item->usages, sizeof(int32_t) * report_item->usages_count); 126 } 127 else { 128 usages = NULL; 129 } 130 118 for(i=0; i<report_item->usages_count; i++){ 119 usb_log_debug("usages (%d) - %x\n", i, report_item->usages[i]); 120 } 121 131 122 usb_hid_report_path_t *path = report_item->usage_path; 132 123 for(i=0; i<report_item->count; i++){ … … 142 133 field->physical_maximum = report_item->physical_maximum; 143 134 144 if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0){ 145 /* 146 Store usage array. The Correct Usage Page and Usage is depending 147 on data in report and will be filled later 148 */ 149 field->usage = 0; 150 field->usage_page = 0; //report_item->usage_page; 151 152 field->usages_count = report_item->usages_count; 153 field->usages = usages; 154 usages_used = 1; 135 field->usage_minimum = report_item->usage_minimum; 136 field->usage_maximum = report_item->usage_maximum; 137 if(report_item->extended_usage_page != 0){ 138 field->usage_page = report_item->extended_usage_page; 155 139 } 156 140 else { 157 /* Fill the correct Usage and Usage Page */ 158 int32_t usage; 159 if(i < report_item->usages_count) { 141 field->usage_page = report_item->usage_page; 142 } 143 144 if(report_item->usages_count > 0 && ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) { 145 uint32_t usage; 146 if(i < report_item->usages_count){ 160 147 usage = report_item->usages[i]; 161 148 } … … 164 151 } 165 152 166 if(USB_HID_IS_EXTENDED_USAGE(usage)){ 167 field->usage = USB_HID_EXTENDED_USAGE(usage); 168 field->usage_page = USB_HID_EXTENDED_USAGE_PAGE(usage); 153 154 if((usage & 0xFFFF0000) != 0){ 155 field->usage_page = (usage >> 16); 156 field->usage = (usage & 0xFFFF); 169 157 } 170 158 else { 171 // should not occur172 159 field->usage = usage; 173 field->usage_page = report_item->usage_page; 174 } 160 } 161 162 163 } 164 165 if((USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) != 0) && (!((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0)))) { 166 field->usage = report_item->usage_minimum + i; 175 167 } 176 168 … … 217 209 } 218 210 219 // free only when not used!!!220 if(usages && usages_used == 0) {221 free(usages);222 }223 211 224 212 return EOK; … … 467 455 468 456 // set last item 469 usb_hid_report_set_last_item(usage_path, 470 USB_HID_TAG_CLASS_GLOBAL, 471 USB_HID_EXTENDED_USAGE_PAGE(report_item->usages[report_item->usages_count-1])); 472 usb_hid_report_set_last_item(usage_path, 473 USB_HID_TAG_CLASS_LOCAL, 474 USB_HID_EXTENDED_USAGE(report_item->usages[report_item->usages_count-1])); 457 usb_hid_report_set_last_item(usage_path, USB_HID_TAG_CLASS_GLOBAL, report_item->usage_page); 458 usb_hid_report_set_last_item(usage_path, USB_HID_TAG_CLASS_LOCAL, report_item->usages[report_item->usages_count-1]); 475 459 476 460 // append the new one which will be set by common … … 567 551 usb_hid_report_item_t *report_item, usb_hid_report_path_t *usage_path) 568 552 { 569 int32_t extended_usage;570 571 553 switch(tag) { 572 554 case USB_HID_REPORT_TAG_USAGE: … … 578 560 report_item->in_delimiter = INSIDE_DELIMITER_SET; 579 561 case OUTSIDE_DELIMITER_SET: 580 extended_usage = ((report_item->usage_page) << 16); 581 extended_usage += usb_hid_report_tag_data_uint32(data,item_size); 582 report_item->usages[report_item->usages_count] = extended_usage; 562 report_item->usages[report_item->usages_count] = usb_hid_report_tag_data_uint32(data,item_size); 583 563 report_item->usages_count++; 584 564 break; 585 565 } 586 566 break; 587 case USB_HID_REPORT_TAG_USAGE_MINIMUM: 567 case USB_HID_REPORT_TAG_USAGE_MINIMUM: 588 568 if (item_size == 3) { 589 569 // usage extended usages … … 597 577 case USB_HID_REPORT_TAG_USAGE_MAXIMUM: 598 578 if (item_size == 3) { 599 600 if(report_item->extended_usage_page != ((usb_hid_report_tag_data_uint32(data,item_size) & 0xFF00) >> 16)) {601 return EINVAL;602 }603 604 579 // usage extended usages 605 580 report_item->extended_usage_page = (usb_hid_report_tag_data_uint32(data,item_size) & 0xFF00) >> 16; … … 609 584 report_item->usage_maximum = usb_hid_report_tag_data_uint32(data,item_size); 610 585 } 611 612 // vlozit zaznamy do pole usages613 int32_t i;614 for(i=report_item->usage_minimum; i<=report_item->usage_maximum; i++) {615 if(report_item->extended_usage_page) {616 report_item->usages[report_item->usages_count++] = (report_item->extended_usage_page << 16) + i;617 }618 else {619 620 report_item->usages[report_item->usages_count++] = (report_item->usage_page << 16) + i;621 }622 }623 report_item->extended_usage_page = 0;624 625 586 break; 626 587 case USB_HID_REPORT_TAG_DESIGNATOR_INDEX: … … 702 663 usb_log_debug("\t\ttUSAGEMIN: %X\n", report_item->usage_minimum); 703 664 usb_log_debug("\t\tUSAGEMAX: %X\n", report_item->usage_maximum); 704 usb_log_debug("\t\tUSAGES COUNT: %zu\n", report_item->usages_count);705 665 706 666 usb_log_debug("\t\tVALUE: %X\n", report_item->value); … … 708 668 usb_log_debug("\t\tUSAGE PAGE: %X\n", report_item->usage_page); 709 669 710 usb_hid_print_usage_path(report_item->collection_path);670 //usb_hid_print_usage_path(report_item->collection_path); 711 671 712 672 usb_log_debug("\n"); … … 740 700 usb_hid_descriptor_print_list(&report_des->report_items); 741 701 742 /* 702 743 703 link_t *path_it = report->collection_paths.next; 744 704 while(path_it != &report->collection_paths) { … … 746 706 path_it = path_it->next; 747 707 } 748 */708 749 709 report_it = report_it->next; 750 710 } -
uspace/lib/usb/src/hidparser.c
rf50f722 r7b6f116 69 69 70 70 71 /** Returns size of report of specified report id and type in items72 *73 * @param parser Opaque report parser structure74 * @param report_id75 * @param type76 * @return Number of items in specified report77 */78 size_t usb_hid_report_size(usb_hid_report_t *report, uint8_t report_id,79 usb_hid_report_type_t type)80 {81 usb_hid_report_description_t *report_des;82 83 if(report == NULL) {84 return 0;85 }86 87 report_des = usb_hid_report_find_description (report, report_id, type);88 if(report_des == NULL){89 return 0;90 }91 else {92 return report_des->item_length;93 }94 }95 71 96 72 … … 111 87 usb_hid_report_description_t *report_des; 112 88 usb_hid_report_type_t type = USB_HID_REPORT_TYPE_INPUT; 113 89 114 90 if(report == NULL) { 115 91 return EINVAL; … … 138 114 // array 139 115 item->value = usb_hid_translate_data(item, data); 140 141 item->usage = USB_HID_EXTENDED_USAGE(item->usages[item->value - item->physical_minimum]); 142 item->usage_page = USB_HID_EXTENDED_USAGE_PAGE(item->usages[item->value - item->physical_minimum]); 143 144 usb_hid_report_set_last_item (item->collection_path, 145 USB_HID_TAG_CLASS_GLOBAL, 146 item->usage_page); 147 usb_hid_report_set_last_item (item->collection_path, 148 USB_HID_TAG_CLASS_LOCAL, 149 item->usage); 150 116 item->usage = (item->value - item->physical_minimum) + item->usage_minimum; 151 117 } 152 118 else { … … 157 123 list_item = list_item->next; 158 124 } 159 125 160 126 return EOK; 161 127 … … 240 206 } 241 207 208 /** 209 * Returns number of items in input report which are accessible by given usage path 210 * 211 * @param parser Opaque report descriptor structure 212 * @param path Usage path specification 213 * @param flags Usage path comparison flags 214 * @return Number of items in input report 215 */ 216 size_t usb_hid_report_input_length(const usb_hid_report_t *report, 217 usb_hid_report_path_t *path, int flags) 218 { 219 220 size_t ret = 0; 221 222 if(report == NULL) { 223 return 0; 224 } 225 226 usb_hid_report_description_t *report_des; 227 report_des = usb_hid_report_find_description (report, path->report_id, USB_HID_REPORT_TYPE_INPUT); 228 if(report_des == NULL) { 229 return 0; 230 } 231 232 link_t *field_it = report_des->report_items.next; 233 usb_hid_report_field_t *field; 234 while(field_it != &report_des->report_items) { 235 236 field = list_get_instance(field_it, usb_hid_report_field_t, link); 237 if(USB_HID_ITEM_FLAG_CONSTANT(field->item_flags) == 0) { 238 239 usb_hid_report_path_append_item (field->collection_path, field->usage_page, field->usage); 240 if(usb_hid_report_compare_usage_path (field->collection_path, path, flags) == EOK) { 241 ret++; 242 } 243 usb_hid_report_remove_last_item (field->collection_path); 244 } 245 246 field_it = field_it->next; 247 } 248 249 return ret; 250 } 251 242 252 /*** OUTPUT API **/ 243 253 … … 292 302 free (output); 293 303 } 304 } 305 306 /** Returns size of output for given usage path 307 * 308 * @param parser Opaque report parser structure 309 * @param path Usage path specified which items will be thought for the output 310 * @param flags Flags of usage path structure comparison 311 * @return Number of items matching the given usage path 312 */ 313 size_t usb_hid_report_output_size(usb_hid_report_t *report, 314 usb_hid_report_path_t *path, int flags) 315 { 316 size_t ret = 0; 317 usb_hid_report_description_t *report_des; 318 319 if(report == NULL) { 320 return 0; 321 } 322 323 report_des = usb_hid_report_find_description (report, path->report_id, USB_HID_REPORT_TYPE_OUTPUT); 324 if(report_des == NULL){ 325 return 0; 326 } 327 328 link_t *field_it = report_des->report_items.next; 329 usb_hid_report_field_t *field; 330 while(field_it != &report_des->report_items) { 331 332 field = list_get_instance(field_it, usb_hid_report_field_t, link); 333 if(USB_HID_ITEM_FLAG_CONSTANT(field->item_flags) == 0){ 334 usb_hid_report_path_append_item (field->collection_path, field->usage_page, field->usage); 335 if(usb_hid_report_compare_usage_path (field->collection_path, path, flags) == EOK) { 336 ret++; 337 } 338 usb_hid_report_remove_last_item (field->collection_path); 339 } 340 341 field_it = field_it->next; 342 } 343 344 return ret; 345 294 346 } 295 347 -
uspace/lib/usb/src/hidpath.c
rf50f722 r7b6f116 42 42 43 43 44 #define USB_HID_SAME_USAGE(usage1, usage2) ((usage1 == usage2) || (usage1 == 0) || (usage2 == 0))45 #define USB_HID_SAME_USAGE_PAGE(page1, page2) ((page1 == page2) || (page1 == 0) || (page2 == 0))46 47 44 /** 48 45 * Appends one item (couple of usage_path and usage) into the usage path … … 206 203 while(report_link != &report_path->head) { 207 204 report_item = list_get_instance(report_link, usb_hid_report_usage_path_t, link); 208 if( USB_HID_SAME_USAGE_PAGE(report_item->usage_page, path_item->usage_page)){205 if(report_item->usage_page == path_item->usage_page){ 209 206 if(only_page == 0){ 210 if( USB_HID_SAME_USAGE(report_item->usage, path_item->usage)) {207 if(report_item->usage == path_item->usage) { 211 208 return EOK; 212 209 } … … 245 242 link); 246 243 247 if( !USB_HID_SAME_USAGE_PAGE(report_item->usage_page,path_item->usage_page) ||244 if((report_item->usage_page != path_item->usage_page) || 248 245 ((only_page == 0) && 249 !USB_HID_SAME_USAGE(report_item->usage,path_item->usage))) {246 (report_item->usage != path_item->usage))) { 250 247 251 248 return 1; … … 285 282 usb_hid_report_usage_path_t, 286 283 link); 287 288 if( !USB_HID_SAME_USAGE_PAGE(report_item->usage_page,path_item->usage_page) ||284 285 if((report_item->usage_page != path_item->usage_page) || 289 286 ((only_page == 0) && 290 !USB_HID_SAME_USAGE(report_item->usage,path_item->usage))) {291 287 (report_item->usage != path_item->usage))) { 288 return 1; 292 289 } else { 293 290 report_link = report_link->prev;
Note:
See TracChangeset
for help on using the changeset viewer.