Changeset df6ded8 in mainline for uspace/lib/usbhid/src
- Timestamp:
- 2018-02-28T16:37:50Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1b20da0
- Parents:
- f5e5f73 (diff), b2dca8de (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. - git-author:
- Jakub Jermar <jakub@…> (2018-02-28 16:06:42)
- git-committer:
- Jakub Jermar <jakub@…> (2018-02-28 16:37:50)
- Location:
- uspace/lib/usbhid/src
- Files:
-
- 5 edited
-
hiddescriptor.c (modified) (6 diffs)
-
hidparser.c (modified) (32 diffs)
-
hidpath.c (modified) (20 diffs)
-
hidreport.c (modified) (8 diffs)
-
hidreq.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhid/src/hiddescriptor.c
rf5e5f73 rdf6ded8 1 1 /* 2 2 * Copyright (c) 2011 Matej Klonfar 3 * Copyright (c) 2018 Ondrej Hlavaty 3 4 * All rights reserved. 4 5 * … … 176 177 177 178 if(report_item->usages_count > 0){ 178 usages = malloc(sizeof( int32_t) * report_item->usages_count);179 usages = malloc(sizeof(uint32_t) * report_item->usages_count); 179 180 memcpy(usages, report_item->usages, sizeof(int32_t) * 180 181 report_item->usages_count); … … 247 248 field->size = report_item->size; 248 249 249 if(report_item->type == USB_HID_REPORT_TYPE_INPUT) { 250 int offset = report_item->offset + report_item->size * i; 251 int field_offset = (offset/8)*8 + (offset/8 + 1) * 8 - 252 offset - report_item->size; 253 if(field_offset < 0) { 254 field->offset = 0; 255 } 256 else { 257 field->offset = field_offset; 258 } 259 } 260 else { 261 field->offset = report_item->offset + (i * report_item->size); 262 } 263 250 field->offset = report_item->offset + (i * report_item->size); 264 251 265 252 if(report->use_report_ids != 0) { … … 896 883 { 897 884 if(list == NULL || list_empty(list)) { 898 usb_log_debug("\tempty \n");885 usb_log_debug("\tempty"); 899 886 return; 900 887 } … … 902 889 list_foreach(*list, ritems_link, usb_hid_report_field_t, 903 890 report_item) { 904 usb_log_debug("\t\tOFFSET: % X\n", report_item->offset);905 usb_log_debug("\t\tSIZE: %zu \n", report_item->size);906 usb_log_debug("\t\tLOGMIN: %d \n",891 usb_log_debug("\t\tOFFSET: %u", report_item->offset); 892 usb_log_debug("\t\tSIZE: %zu", report_item->size); 893 usb_log_debug("\t\tLOGMIN: %d", 907 894 report_item->logical_minimum); 908 usb_log_debug("\t\tLOGMAX: %d \n",895 usb_log_debug("\t\tLOGMAX: %d", 909 896 report_item->logical_maximum); 910 usb_log_debug("\t\tPHYMIN: %d \n",897 usb_log_debug("\t\tPHYMIN: %d", 911 898 report_item->physical_minimum); 912 usb_log_debug("\t\tPHYMAX: %d \n",899 usb_log_debug("\t\tPHYMAX: %d", 913 900 report_item->physical_maximum); 914 usb_log_debug("\t\ttUSAGEMIN: %X \n",901 usb_log_debug("\t\ttUSAGEMIN: %X", 915 902 report_item->usage_minimum); 916 usb_log_debug("\t\tUSAGEMAX: %X \n",903 usb_log_debug("\t\tUSAGEMAX: %X", 917 904 report_item->usage_maximum); 918 usb_log_debug("\t\tUSAGES COUNT: %zu \n",905 usb_log_debug("\t\tUSAGES COUNT: %zu", 919 906 report_item->usages_count); 920 907 921 usb_log_debug("\t\tVALUE: %X \n", report_item->value);922 usb_log_debug("\t\ttUSAGE: %X \n", report_item->usage);923 usb_log_debug("\t\tUSAGE PAGE: %X \n", report_item->usage_page);908 usb_log_debug("\t\tVALUE: %X", report_item->value); 909 usb_log_debug("\t\ttUSAGE: %X", report_item->usage); 910 usb_log_debug("\t\tUSAGE PAGE: %X", report_item->usage_page); 924 911 925 912 usb_hid_print_usage_path(report_item->collection_path); 926 927 usb_log_debug("\n");928 913 } 929 914 } … … 943 928 list_foreach(report->reports, reports_link, 944 929 usb_hid_report_description_t, report_des) { 945 usb_log_debug("Report ID: %d \n", report_des->report_id);946 usb_log_debug("\tType: %d \n", report_des->type);947 usb_log_debug("\tLength: %zu \n", report_des->bit_length);948 usb_log_debug("\tB Size: %zu \n",930 usb_log_debug("Report ID: %d", report_des->report_id); 931 usb_log_debug("\tType: %d", report_des->type); 932 usb_log_debug("\tLength: %zu", report_des->bit_length); 933 usb_log_debug("\tB Size: %zu", 949 934 usb_hid_report_byte_size(report, 950 935 report_des->report_id, 951 936 report_des->type)); 952 usb_log_debug("\tItems: %zu \n", report_des->item_length);937 usb_log_debug("\tItems: %zu", report_des->item_length); 953 938 954 939 usb_hid_descriptor_print_list(&report_des->report_items); -
uspace/lib/usbhid/src/hidparser.c
rf5e5f73 rdf6ded8 1 1 /* 2 2 * Copyright (c) 2011 Matej Klonfar 3 * Copyright (c) 2018 Ondrej Hlavaty 3 4 * All rights reserved. 4 5 * … … 40 41 #include <usb/debug.h> 41 42 #include <assert.h> 43 #include <bitops.h> 44 #include <macros.h> 42 45 43 46 … … 49 52 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data); 50 53 51 uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item, 52 int32_t value);54 uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item, 55 int32_t value); 53 56 54 57 … … 73 76 * 74 77 * @param parser Opaque report parser structure 75 * @param report_id 78 * @param report_id 76 79 * @param type 77 80 * @return Number of items in specified report 78 81 */ 79 size_t usb_hid_report_size(usb_hid_report_t *report, uint8_t report_id, 82 size_t usb_hid_report_size(usb_hid_report_t *report, uint8_t report_id, 80 83 usb_hid_report_type_t type) 81 84 { … … 97 100 * 98 101 * @param parser Opaque report parser structure 99 * @param report_id 102 * @param report_id 100 103 * @param type 101 104 * @return Number of items in specified report 102 105 */ 103 size_t usb_hid_report_byte_size(usb_hid_report_t *report, uint8_t report_id, 106 size_t usb_hid_report_byte_size(usb_hid_report_t *report, uint8_t report_id, 104 107 usb_hid_report_type_t type) 105 108 { … … 114 117 return 0; 115 118 } else { 116 return ((report_des->bit_length + 7) / 8) ;119 return ((report_des->bit_length + 7) / 8); 117 120 } 118 121 } … … 126 129 * @param data Data for the report. 127 130 * @return Error code. 128 */ 129 errno_t usb_hid_parse_report(const usb_hid_report_t *report, const uint8_t *data, 131 */ 132 errno_t usb_hid_parse_report(const usb_hid_report_t *report, const uint8_t *data, 130 133 size_t size, uint8_t *report_id) 131 134 { 132 135 usb_hid_report_description_t *report_des; 133 136 usb_hid_report_type_t type = USB_HID_REPORT_TYPE_INPUT; 134 137 135 138 if (report == NULL) { 136 139 return EINVAL; … … 143 146 } 144 147 145 report_des = usb_hid_report_find_description(report, *report_id, 148 report_des = usb_hid_report_find_description(report, *report_id, 146 149 type); 147 150 … … 155 158 156 159 if (USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) { 157 160 158 161 if (USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) { 159 162 /* array */ 160 item->value = 161 usb_hid_translate_data(item, data);162 163 item->value = 164 usb_hid_translate_data(item, data); 165 163 166 item->usage = USB_HID_EXTENDED_USAGE( 164 167 item->usages[item->value - 165 168 item->physical_minimum]); 166 169 167 item->usage_page = 170 item->usage_page = 168 171 USB_HID_EXTENDED_USAGE_PAGE( 169 172 item->usages[item->value - … … 171 174 172 175 usb_hid_report_set_last_item( 173 item->collection_path, 174 USB_HID_TAG_CLASS_GLOBAL, 176 item->collection_path, 177 USB_HID_TAG_CLASS_GLOBAL, 175 178 item->usage_page); 176 179 177 180 usb_hid_report_set_last_item( 178 item->collection_path, 181 item->collection_path, 179 182 USB_HID_TAG_CLASS_LOCAL, item->usage); 180 183 } else { 181 184 /* variable item */ 182 item->value = usb_hid_translate_data(item, 185 item->value = usb_hid_translate_data(item, 183 186 data); 184 187 } 185 188 } 186 189 } 187 190 188 191 return EOK; 189 192 } … … 199 202 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data) 200 203 { 201 int resolution;202 int offset;203 int part_size;204 205 int32_t value = 0;206 int32_t mask = 0;207 const uint8_t *foo = 0;208 209 204 /* now only short tags are allowed */ 210 205 if (item->size > 32) { … … 214 209 if ((item->physical_minimum == 0) && (item->physical_maximum == 0)) { 215 210 item->physical_minimum = item->logical_minimum; 216 item->physical_maximum = item->logical_maximum; 217 } 218 219 211 item->physical_maximum = item->logical_maximum; 212 } 213 214 int resolution; 220 215 if (item->physical_maximum == item->physical_minimum) { 221 resolution = 1; 222 } else { 223 resolution = (item->logical_maximum - item->logical_minimum) / 224 ((item->physical_maximum - item->physical_minimum) * 225 (usb_pow(10, (item->unit_exponent)))); 226 } 227 228 offset = item->offset; 229 // FIXME 230 if ((size_t) (offset / 8) != (size_t) ((offset+item->size - 1) / 8)) { 231 232 part_size = 0; 233 234 size_t i = 0; 235 for (i = (size_t) (offset / 8); 236 i <= (size_t) (offset + item->size - 1) / 8; i++) { 237 if (i == (size_t) (offset / 8)) { 238 /* the higher one */ 239 part_size = 8 - (offset % 8); 240 foo = data + i; 241 mask = ((1 << (item->size - part_size)) - 1); 242 value = (*foo & mask); 243 } else if (i == ((offset + item->size - 1) / 8)) { 244 /* the lower one */ 245 foo = data + i; 246 mask = ((1 << (item->size - part_size)) - 1) << 247 (8 - (item->size - part_size)); 248 249 value = (((*foo & mask) >> (8 - 250 (item->size - part_size))) << part_size) + 251 value; 252 } else { 253 value = (*(data + 1) << (part_size + 8)) + 254 value; 255 part_size += 8; 256 } 257 } 258 } else { 259 foo = data + (offset / 8); 260 mask = ((1 << item->size) - 1) << 261 (8 - ((offset % 8) + item->size)); 262 value = (*foo & mask) >> (8 - ((offset % 8) + item->size)); 216 resolution = 1; 217 } else { 218 resolution = (item->logical_maximum - item->logical_minimum) / 219 ((item->physical_maximum - item->physical_minimum) * 220 (usb_pow(10, (item->unit_exponent)))); 221 } 222 223 int32_t value = 0; 224 225 /* First, skip all bytes we don't care */ 226 data += item->offset / 8; 227 228 int bits = item->size; 229 int taken = 0; 230 231 /* Than we take the higher bits from the LSB */ 232 const unsigned bit_offset = item->offset % 8; 233 const int lsb_bits = min(bits, 8); 234 235 value |= (*data >> bit_offset) & BIT_RRANGE(uint8_t, lsb_bits); 236 bits -= lsb_bits; 237 taken += lsb_bits; 238 data++; 239 240 /* Then there may be bytes, which we take as a whole. */ 241 while (bits > 8) { 242 value |= *data << taken; 243 taken += 8; 244 bits -= 8; 245 data++; 246 } 247 248 /* And, finally, lower bits from HSB. */ 249 if (bits > 0) { 250 value |= (*data & BIT_RRANGE(uint8_t, bits)) << taken; 263 251 } 264 252 … … 267 255 } 268 256 269 return (int) (((value - item->logical_minimum) / resolution) + 257 return (int) (((value - item->logical_minimum) / resolution) + 270 258 item->physical_minimum); 271 259 } … … 274 262 /* OUTPUT API */ 275 263 276 /** 264 /** 277 265 * Allocates output report buffer for output report 278 266 * … … 282 270 * @return Returns allocated output buffer for specified output 283 271 */ 284 uint8_t *usb_hid_report_output(usb_hid_report_t *report, size_t *size, 272 uint8_t *usb_hid_report_output(usb_hid_report_t *report, size_t *size, 285 273 uint8_t report_id) 286 274 { … … 334 322 * @return Error code 335 323 */ 336 errno_t usb_hid_report_output_translate(usb_hid_report_t *report, 324 errno_t usb_hid_report_output_translate(usb_hid_report_t *report, 337 325 uint8_t report_id, uint8_t *buffer, size_t size) 338 326 { … … 341 329 int length; 342 330 int32_t tmp_value; 343 331 344 332 if (report == NULL) { 345 333 return EINVAL; … … 351 339 352 340 usb_hid_report_description_t *report_des; 353 report_des = usb_hid_report_find_description(report, report_id, 341 report_des = usb_hid_report_find_description(report, report_id, 354 342 USB_HID_REPORT_TYPE_OUTPUT); 355 343 356 344 if (report_des == NULL) { 357 345 return EINVAL; … … 360 348 list_foreach(report_des->report_items, ritems_link, 361 349 usb_hid_report_field_t, report_item) { 362 value = usb_hid_translate_data_reverse(report_item, 350 value = usb_hid_translate_data_reverse(report_item, 363 351 report_item->value); 364 352 365 353 offset = report_des->bit_length - report_item->offset - 1; 366 354 length = report_item->size; 367 368 usb_log_debug("\ttranslated value: %x \n", value);355 356 usb_log_debug("\ttranslated value: %x", value); 369 357 370 358 if ((offset / 8) == ((offset + length - 1) / 8)) { 371 if (((size_t) (offset / 8) >= size) || 359 if (((size_t) (offset / 8) >= size) || 372 360 ((size_t) (offset + length - 1) / 8) >= size) { 373 361 break; // TODO ErrorCode … … 376 364 value = value << shift; 377 365 value = value & (((1 << length) - 1) << shift); 378 366 379 367 uint8_t mask = 0; 380 368 mask = 0xff - (((1 << length) - 1) << shift); … … 388 376 if (i == (offset / 8)) { 389 377 tmp_value = value; 390 tmp_value = tmp_value & 378 tmp_value = tmp_value & 391 379 ((1 << (8 - (offset % 8))) - 1); 392 380 393 381 tmp_value = tmp_value << (offset % 8); 394 382 395 383 mask = ~(((1 << (8 - (offset % 8))) - 1) 396 384 << (offset % 8)); 397 385 398 buffer[i] = (buffer[i] & mask) | 386 buffer[i] = (buffer[i] & mask) | 399 387 tmp_value; 400 388 } else if (i == ((offset + length - 1) / 8)) { 401 402 value = value >> (length - 389 390 value = value >> (length - 403 391 ((offset + length) % 8)); 404 392 405 value = value & ((1 << (length - 393 value = value & ((1 << (length - 406 394 ((offset + length) % 8))) - 1); 407 408 mask = (1 << (length - 395 396 mask = (1 << (length - 409 397 ((offset + length) % 8))) - 1; 410 398 … … 419 407 report_item->value = 0; 420 408 } 421 409 422 410 return EOK; 423 411 } … … 430 418 * @return ranslated value 431 419 */ 432 uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item, 420 uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item, 433 421 int value) 434 422 { … … 437 425 438 426 if (USB_HID_ITEM_FLAG_CONSTANT(item->item_flags)) { 439 ret =item->logical_minimum;427 return item->logical_minimum; 440 428 } 441 429 442 430 if ((item->physical_minimum == 0) && (item->physical_maximum == 0)) { 443 431 item->physical_minimum = item->logical_minimum; 444 item->physical_maximum = item->logical_maximum; 445 } 446 432 item->physical_maximum = item->logical_maximum; 433 } 434 447 435 /* variable item */ 448 436 if (item->physical_maximum == item->physical_minimum) { 449 resolution = 1;450 } else { 451 resolution = (item->logical_maximum - item->logical_minimum) /452 ((item->physical_maximum - item->physical_minimum) *453 (usb_pow(10, (item->unit_exponent))));454 } 455 456 ret = ((value - item->physical_minimum) * resolution) + 437 resolution = 1; 438 } else { 439 resolution = (item->logical_maximum - item->logical_minimum) / 440 ((item->physical_maximum - item->physical_minimum) * 441 (usb_pow(10, (item->unit_exponent)))); 442 } 443 444 ret = ((value - item->physical_minimum) * resolution) + 457 445 item->logical_minimum; 458 446 459 447 usb_log_debug("\tvalue(%x), resolution(%x), phymin(%x) logmin(%x), " 460 "ret(%x)\n", value, resolution, item->physical_minimum, 448 "ret(%x)\n", value, resolution, item->physical_minimum, 461 449 item->logical_minimum, ret); 462 450 463 451 if ((item->logical_minimum < 0) || (item->logical_maximum < 0)) { 464 452 return USB_HID_INT32_TO_UINT32(ret, item->size); … … 479 467 { 480 468 usb_hid_report_item_t *new_report_item; 481 469 482 470 if (!(new_report_item = malloc(sizeof(usb_hid_report_item_t)))) { 483 471 return NULL; 484 } 472 } 485 473 memcpy(new_report_item,item, sizeof(usb_hid_report_item_t)); 486 474 link_initialize(&(new_report_item->link)); … … 497 485 * @param field Current field. If NULL is given, the first one in the report 498 486 * is returned. Otherwise the next one i nthe list is returned. 499 * @param path Usage path specifying which fields wa are interested in. 487 * @param path Usage path specifying which fields wa are interested in. 500 488 * @param flags Flags defining mode of usage paths comparison 501 489 * @param type Type of report we search. … … 503 491 * @retval Pointer to the founded report structure when founded 504 492 */ 505 usb_hid_report_field_t *usb_hid_report_get_sibling(usb_hid_report_t *report, 506 usb_hid_report_field_t *field, usb_hid_report_path_t *path, int flags, 493 usb_hid_report_field_t *usb_hid_report_get_sibling(usb_hid_report_t *report, 494 usb_hid_report_field_t *field, usb_hid_report_path_t *path, int flags, 507 495 usb_hid_report_type_t type) 508 496 { 509 usb_hid_report_description_t *report_des = 497 usb_hid_report_description_t *report_des = 510 498 usb_hid_report_find_description(report, path->report_id, type); 511 499 512 500 link_t *field_it; 513 501 514 502 if (report_des == NULL) { 515 503 return NULL; … … 523 511 524 512 while (field_it != &report_des->report_items.head) { 525 field = list_get_instance(field_it, usb_hid_report_field_t, 513 field = list_get_instance(field_it, usb_hid_report_field_t, 526 514 ritems_link); 527 515 … … 565 553 usb_hid_report_description_t *report_des; 566 554 link_t *report_it; 567 555 568 556 if (report_id > 0) { 569 report_des = usb_hid_report_find_description(report, report_id, 557 report_des = usb_hid_report_find_description(report, report_id, 570 558 type); 571 559 if (report_des == NULL) { … … 573 561 } else { 574 562 report_it = report_des->reports_link.next; 575 } 563 } 576 564 } else { 577 565 report_it = report->reports.head.next; … … 579 567 580 568 while (report_it != &report->reports.head) { 581 report_des = list_get_instance(report_it, 569 report_des = list_get_instance(report_it, 582 570 usb_hid_report_description_t, reports_link); 583 571 … … 606 594 return; 607 595 } 608 596 609 597 report_item->usages_count = 0; 610 598 memset(report_item->usages, 0, USB_HID_MAX_USAGES); 611 599 612 600 report_item->extended_usage_page = 0; 613 601 report_item->usage_minimum = 0; -
uspace/lib/usbhid/src/hidpath.c
rf5e5f73 rdf6ded8 73 73 * @return Error code 74 74 */ 75 errno_t usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, 76 int32_t usage_page, int32_t usage)77 { 78 usb_hid_report_usage_path_t *item 79 =malloc(sizeof(usb_hid_report_usage_path_t));75 errno_t usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, 76 int32_t usage_page, int32_t usage) 77 { 78 usb_hid_report_usage_path_t *item = 79 malloc(sizeof(usb_hid_report_usage_path_t)); 80 80 81 81 if (item == NULL) { … … 87 87 item->usage_page = usage_page; 88 88 item->flags = 0; 89 89 90 90 list_append (&item->rpath_items_link, &usage_path->items); 91 91 usage_path->depth++; … … 96 96 /** 97 97 * Removes last item from the usage path structure 98 * @param usage_path 98 * @param usage_path 99 99 * @return void 100 100 */ … … 103 103 link_t *item_link; 104 104 usb_hid_report_usage_path_t *item; 105 106 if (!list_empty(&usage_path->items)){105 106 if (!list_empty(&usage_path->items)) { 107 107 item_link = list_last(&usage_path->items); 108 108 item = list_get_instance(item_link, … … 124 124 { 125 125 usb_hid_report_usage_path_t *item; 126 127 if (!list_empty(&usage_path->items)){126 127 if (!list_empty(&usage_path->items)) { 128 128 item = list_get_instance(list_last(&usage_path->items), 129 usb_hid_report_usage_path_t, rpath_items_link);129 usb_hid_report_usage_path_t, rpath_items_link); 130 130 131 131 memset(item, 0, sizeof(usb_hid_report_usage_path_t)); … … 143 143 * @return void 144 144 */ 145 void usb_hid_report_set_last_item(usb_hid_report_path_t *usage_path, 146 int32_t tag, int32_t data)145 void usb_hid_report_set_last_item(usb_hid_report_path_t *usage_path, 146 int32_t tag, int32_t data) 147 147 { 148 148 usb_hid_report_usage_path_t *item; 149 150 if (!list_empty(&usage_path->items)){149 150 if (!list_empty(&usage_path->items)) { 151 151 item = list_get_instance(list_last(&usage_path->items), 152 152 usb_hid_report_usage_path_t, rpath_items_link); 153 153 154 switch(tag) { 155 case USB_HID_TAG_CLASS_GLOBAL: 156 item->usage_page = data; 157 break; 158 case USB_HID_TAG_CLASS_LOCAL: 159 item->usage = data; 160 break; 161 } 162 } 163 164 } 165 166 167 /** 168 * 169 * 170 * 171 * 172 */ 154 switch (tag) { 155 case USB_HID_TAG_CLASS_GLOBAL: 156 item->usage_page = data; 157 break; 158 case USB_HID_TAG_CLASS_LOCAL: 159 item->usage = data; 160 break; 161 } 162 } 163 } 164 173 165 void usb_hid_print_usage_path(usb_hid_report_path_t *path) 174 166 { 175 usb_log_debug("USAGE_PATH FOR RId(%d): \n", path->report_id);176 usb_log_debug("\tLENGTH: %d \n", path->depth);167 usb_log_debug("USAGE_PATH FOR RId(%d):", path->report_id); 168 usb_log_debug("\tLENGTH: %d", path->depth); 177 169 178 170 list_foreach(path->items, rpath_items_link, 179 171 usb_hid_report_usage_path_t, path_item) { 180 172 181 usb_log_debug("\tUSAGE_PAGE: %X \n", path_item->usage_page);182 usb_log_debug("\tUSAGE: %X \n", path_item->usage);183 usb_log_debug("\tFLAGS: %d \n", path_item->flags);173 usb_log_debug("\tUSAGE_PAGE: %X", path_item->usage_page); 174 usb_log_debug("\tUSAGE: %X", path_item->usage); 175 usb_log_debug("\tFLAGS: %d", path_item->flags); 184 176 } 185 177 } … … 199 191 usb_hid_report_usage_path_t *report_item; 200 192 usb_hid_report_usage_path_t *path_item; 201 193 202 194 link_t *report_link; 203 195 link_t *path_link; 204 196 205 197 int only_page; 206 198 207 199 if (report_path->report_id != path->report_id) { 208 200 if (path->report_id != 0) { … … 210 202 } 211 203 } 212 204 213 205 // Empty path match all others 214 206 if (path->depth == 0) { 215 207 return 0; 216 208 } 217 209 218 210 if ((only_page = flags & USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY) != 0) { 219 211 flags -= USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY; 220 212 } 221 213 222 214 switch (flags) { 223 215 /* Path is somewhere in report_path */ … … 226 218 return 1; 227 219 } 228 220 229 221 path_link = list_first(&path->items); 230 222 path_item = list_get_instance(path_link, 231 223 usb_hid_report_usage_path_t, rpath_items_link); 232 224 233 225 list_foreach(report_path->items, rpath_items_link, 234 226 usb_hid_report_usage_path_t, report_item) { 235 227 if (USB_HID_SAME_USAGE_PAGE(report_item->usage_page, 236 228 path_item->usage_page)) { 237 229 238 230 if (only_page == 0) { 239 231 if (USB_HID_SAME_USAGE(report_item->usage, … … 245 237 } 246 238 } 247 239 248 240 return 1; 249 241 break; 250 242 251 243 /* The paths must be identical */ 252 244 case USB_HID_PATH_COMPARE_STRICT: … … 255 247 } 256 248 /* Fallthrough */ 257 249 258 250 /* Path is prefix of the report_path */ 259 251 case USB_HID_PATH_COMPARE_BEGIN: 260 252 report_link = report_path->items.head.next; 261 253 path_link = path->items.head.next; 262 254 263 255 while ((report_link != &report_path->items.head) && 264 256 (path_link != &path->items.head)) { 265 257 266 258 report_item = list_get_instance(report_link, 267 259 usb_hid_report_usage_path_t, rpath_items_link); 268 260 269 261 path_item = list_get_instance(path_link, 270 262 usb_hid_report_usage_path_t, rpath_items_link); 271 263 272 264 if (!USB_HID_SAME_USAGE_PAGE(report_item->usage_page, 273 265 path_item->usage_page) || ((only_page == 0) && … … 280 272 } 281 273 } 282 274 283 275 if ((((flags & USB_HID_PATH_COMPARE_BEGIN) != 0) && 284 276 (path_link == &path->items.head)) || … … 290 282 } 291 283 break; 292 284 293 285 /* Path is suffix of report_path */ 294 286 case USB_HID_PATH_COMPARE_END: 295 287 report_link = report_path->items.head.prev; 296 288 path_link = path->items.head.prev; 297 289 298 290 if (list_empty(&path->items)) { 299 291 return 0; 300 292 } 301 293 302 294 while ((report_link != &report_path->items.head) && 303 295 (path_link != &path->items.head)) { 304 296 report_item = list_get_instance(report_link, 305 297 usb_hid_report_usage_path_t, rpath_items_link); 306 298 307 299 path_item = list_get_instance(path_link, 308 300 usb_hid_report_usage_path_t, rpath_items_link); 309 301 310 302 if (!USB_HID_SAME_USAGE_PAGE(report_item->usage_page, 311 303 path_item->usage_page) || ((only_page == 0) && … … 318 310 } 319 311 } 320 312 321 313 if (path_link == &path->items.head) { 322 314 return 0; … … 325 317 } 326 318 break; 327 319 328 320 default: 329 321 return -1; … … 340 332 usb_hid_report_path_t *path; 341 333 path = malloc(sizeof(usb_hid_report_path_t)); 342 if (path == NULL){334 if (path == NULL) { 343 335 return NULL; 344 336 } … … 363 355 if (path == NULL) 364 356 return; 365 while (!list_empty(&path->items)){357 while (!list_empty(&path->items)) { 366 358 usb_hid_report_remove_last_item(path); 367 359 } … … 379 371 */ 380 372 usb_hid_report_path_t *usb_hid_report_path_clone( 381 usb_hid_report_path_t *usage_path)373 usb_hid_report_path_t *usage_path) 382 374 { 383 375 usb_hid_report_usage_path_t *new_path_item; 384 376 usb_hid_report_path_t *new_usage_path = usb_hid_report_path (); 385 377 386 if (new_usage_path == NULL){378 if (new_usage_path == NULL) { 387 379 return NULL; 388 380 } 389 381 390 382 new_usage_path->report_id = usage_path->report_id; 391 392 if (list_empty(&usage_path->items)){383 384 if (list_empty(&usage_path->items)) { 393 385 return new_usage_path; 394 386 } … … 398 390 399 391 new_path_item = malloc(sizeof(usb_hid_report_usage_path_t)); 400 if (new_path_item == NULL) {392 if (new_path_item == NULL) { 401 393 return NULL; 402 394 } 403 395 404 396 link_initialize(&new_path_item->rpath_items_link); 405 397 new_path_item->usage_page = path_item->usage_page; 406 new_path_item->usage = path_item->usage; 407 new_path_item->flags = path_item->flags; 408 398 new_path_item->usage = path_item->usage; 399 new_path_item->flags = path_item->flags; 400 409 401 list_append(&new_path_item->rpath_items_link, 410 402 &new_usage_path->items); … … 423 415 * @return Error code 424 416 */ 425 errno_t usb_hid_report_path_set_report_id(usb_hid_report_path_t *path, 426 uint8_t report_id)427 { 428 if (path == NULL){417 errno_t usb_hid_report_path_set_report_id(usb_hid_report_path_t *path, 418 uint8_t report_id) 419 { 420 if (path == NULL) { 429 421 return EINVAL; 430 422 } -
uspace/lib/usbhid/src/hidreport.c
rf5e5f73 rdf6ded8 71 71 const uint8_t *d = 72 72 usb_dp_get_nested_descriptor(&parser, &parser_data, 73 usb_device_descriptors(dev)->full_config);73 usb_device_descriptors(dev)->full_config); 74 74 75 75 /* … … 84 84 85 85 if (d == NULL) { 86 usb_log_error("The %d. interface descriptor not found! \n",86 usb_log_error("The %d. interface descriptor not found!", 87 87 usb_device_get_iface_number(dev)); 88 88 return ENOENT; … … 104 104 105 105 if (d == NULL) { 106 usb_log_fatal("No HID descriptor found! \n");106 usb_log_fatal("No HID descriptor found!"); 107 107 return ENOENT; 108 108 } … … 130 130 } 131 131 132 usb_log_debug("Getting Report descriptor, expected size: %u \n", length);132 usb_log_debug("Getting Report descriptor, expected size: %u", length); 133 133 134 134 /* … … 156 156 *size = length; 157 157 158 usb_log_debug("Done. \n");158 usb_log_debug("Done."); 159 159 160 160 return EOK; … … 163 163 164 164 165 errno_t usb_hid_process_report_descriptor(usb_device_t *dev, 165 errno_t usb_hid_process_report_descriptor(usb_device_t *dev, 166 166 usb_hid_report_t *report, uint8_t **report_desc, size_t *report_size) 167 167 { … … 178 178 179 179 if (rc != EOK) { 180 usb_log_error("Problem with getting Report descriptor: %s. \n",180 usb_log_error("Problem with getting Report descriptor: %s.", 181 181 str_error(rc)); 182 182 if (*report_desc != NULL) { … … 191 191 rc = usb_hid_parse_report_descriptor(report, *report_desc, *report_size); 192 192 if (rc != EOK) { 193 usb_log_error("Problem parsing Report descriptor: %s. \n",193 usb_log_error("Problem parsing Report descriptor: %s.", 194 194 str_error(rc)); 195 195 free(*report_desc); -
uspace/lib/usbhid/src/hidreq.c
rf5e5f73 rdf6ded8 62 62 { 63 63 if (ctrl_pipe == NULL) { 64 usb_log_warning("usbhid_req_set_report(): no pipe given. \n");65 return EINVAL; 66 } 67 68 if (iface_no < 0) { 69 usb_log_warning("usbhid_req_set_report(): no interface given." 70 "\n"); 71 return EINVAL; 72 } 73 74 /* 75 * No need for checking other parameters, as they are checked in 76 * the called function (usb_control_request_set()). 77 */ 78 79 errno_t rc; 80 64 usb_log_warning("usbhid_req_set_report(): no pipe given."); 65 return EINVAL; 66 } 67 68 if (iface_no < 0) { 69 usb_log_warning("usbhid_req_set_report(): no interface given." 70 "\n"); 71 return EINVAL; 72 } 73 74 /* 75 * No need for checking other parameters, as they are checked in 76 * the called function (usb_control_request_set()). 77 */ 78 79 errno_t rc; 80 81 81 uint16_t value = 0; 82 82 value |= (type << 8); 83 83 84 usb_log_debug("Sending Set Report request to the device. \n");85 84 usb_log_debug("Sending Set Report request to the device."); 85 86 86 rc = usb_control_request_set(ctrl_pipe, 87 87 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, … … 93 93 return rc; 94 94 } 95 95 96 96 return EOK; 97 97 } … … 112 112 { 113 113 if (ctrl_pipe == NULL) { 114 usb_log_warning("usbhid_req_set_report(): no pipe given. \n");115 return EINVAL; 116 } 117 118 if (iface_no < 0) { 119 usb_log_warning("usbhid_req_set_report(): no interface given." 120 "\n"); 121 return EINVAL; 122 } 123 124 /* 125 * No need for checking other parameters, as they are checked in 126 * the called function (usb_control_request_set()). 127 */ 128 114 usb_log_warning("usbhid_req_set_report(): no pipe given."); 115 return EINVAL; 116 } 117 118 if (iface_no < 0) { 119 usb_log_warning("usbhid_req_set_report(): no interface given." 120 "\n"); 121 return EINVAL; 122 } 123 124 /* 125 * No need for checking other parameters, as they are checked in 126 * the called function (usb_control_request_set()). 127 */ 128 129 129 errno_t rc; 130 130 131 131 usb_log_debug("Sending Set Protocol request to the device (" 132 132 "protocol: %d, iface: %d).\n", protocol, iface_no); 133 134 rc = usb_control_request_set(ctrl_pipe, 135 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 133 134 rc = usb_control_request_set(ctrl_pipe, 135 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 136 136 USB_HIDREQ_SET_PROTOCOL, protocol, iface_no, NULL, 0); 137 137 … … 141 141 return rc; 142 142 } 143 143 144 144 return EOK; 145 145 } … … 160 160 { 161 161 if (ctrl_pipe == NULL) { 162 usb_log_warning("usbhid_req_set_report(): no pipe given. \n");163 return EINVAL; 164 } 165 166 if (iface_no < 0) { 167 usb_log_warning("usbhid_req_set_report(): no interface given." 168 "\n"); 169 return EINVAL; 170 } 171 172 /* 173 * No need for checking other parameters, as they are checked in 174 * the called function (usb_control_request_set()). 175 */ 176 162 usb_log_warning("usbhid_req_set_report(): no pipe given."); 163 return EINVAL; 164 } 165 166 if (iface_no < 0) { 167 usb_log_warning("usbhid_req_set_report(): no interface given." 168 "\n"); 169 return EINVAL; 170 } 171 172 /* 173 * No need for checking other parameters, as they are checked in 174 * the called function (usb_control_request_set()). 175 */ 176 177 177 errno_t rc; 178 178 179 179 usb_log_debug("Sending Set Idle request to the device (" 180 180 "duration: %u, iface: %d).\n", duration, iface_no); 181 181 182 182 uint16_t value = duration << 8; 183 183 184 184 rc = usb_control_request_set(ctrl_pipe, 185 185 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, … … 191 191 return rc; 192 192 } 193 193 194 194 return EOK; 195 195 } … … 203 203 * @param[in][out] buffer Buffer for the report data. 204 204 * @param[in] buf_size Size of the buffer (in bytes). 205 * @param[out] actual_size Actual size of report received from the device 205 * @param[out] actual_size Actual size of report received from the device 206 206 * (in bytes). 207 207 * … … 210 210 * @return Other value inherited from function usb_control_request_set(). 211 211 */ 212 errno_t usbhid_req_get_report(usb_pipe_t *ctrl_pipe, int iface_no, 213 usb_hid_report_type_t type, uint8_t *buffer, size_t buf_size, 212 errno_t usbhid_req_get_report(usb_pipe_t *ctrl_pipe, int iface_no, 213 usb_hid_report_type_t type, uint8_t *buffer, size_t buf_size, 214 214 size_t *actual_size) 215 215 { 216 216 if (ctrl_pipe == NULL) { 217 usb_log_warning("usbhid_req_set_report(): no pipe given. \n");218 return EINVAL; 219 } 220 221 if (iface_no < 0) { 222 usb_log_warning("usbhid_req_set_report(): no interface given." 223 "\n"); 224 return EINVAL; 225 } 226 227 /* 228 * No need for checking other parameters, as they are checked in 229 * the called function (usb_control_request_set()). 230 */ 231 217 usb_log_warning("usbhid_req_set_report(): no pipe given."); 218 return EINVAL; 219 } 220 221 if (iface_no < 0) { 222 usb_log_warning("usbhid_req_set_report(): no interface given." 223 "\n"); 224 return EINVAL; 225 } 226 227 /* 228 * No need for checking other parameters, as they are checked in 229 * the called function (usb_control_request_set()). 230 */ 231 232 232 errno_t rc; 233 233 234 234 uint16_t value = 0; 235 235 value |= (type << 8); 236 237 usb_log_debug("Sending Get Report request to the device. \n");238 239 rc = usb_control_request_get(ctrl_pipe, 240 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 236 237 usb_log_debug("Sending Get Report request to the device."); 238 239 rc = usb_control_request_get(ctrl_pipe, 240 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 241 241 USB_HIDREQ_GET_REPORT, value, iface_no, buffer, buf_size, 242 242 actual_size); … … 247 247 return rc; 248 248 } 249 249 250 250 return EOK; 251 251 } … … 262 262 * @return Other value inherited from function usb_control_request_set(). 263 263 */ 264 errno_t usbhid_req_get_protocol(usb_pipe_t *ctrl_pipe, int iface_no, 264 errno_t usbhid_req_get_protocol(usb_pipe_t *ctrl_pipe, int iface_no, 265 265 usb_hid_protocol_t *protocol) 266 266 { 267 267 if (ctrl_pipe == NULL) { 268 usb_log_warning("usbhid_req_set_report(): no pipe given. \n");269 return EINVAL; 270 } 271 272 if (iface_no < 0) { 273 usb_log_warning("usbhid_req_set_report(): no interface given." 274 "\n"); 275 return EINVAL; 276 } 277 278 /* 279 * No need for checking other parameters, as they are checked in 280 * the called function (usb_control_request_set()). 281 */ 282 283 errno_t rc; 268 usb_log_warning("usbhid_req_set_report(): no pipe given."); 269 return EINVAL; 270 } 271 272 if (iface_no < 0) { 273 usb_log_warning("usbhid_req_set_report(): no interface given." 274 "\n"); 275 return EINVAL; 276 } 277 278 /* 279 * No need for checking other parameters, as they are checked in 280 * the called function (usb_control_request_set()). 281 */ 282 283 errno_t rc; 284 284 285 285 usb_log_debug("Sending Get Protocol request to the device (" 286 286 "iface: %d).\n", iface_no); 287 287 288 288 uint8_t buffer[1]; 289 289 size_t actual_size = 0; 290 291 rc = usb_control_request_get(ctrl_pipe, 292 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 290 291 rc = usb_control_request_get(ctrl_pipe, 292 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 293 293 USB_HIDREQ_GET_PROTOCOL, 0, iface_no, buffer, 1, &actual_size); 294 294 … … 298 298 return rc; 299 299 } 300 300 301 301 if (actual_size != 1) { 302 usb_log_warning("Wrong data size: %zu, expected: 1. \n",303 actual_size);302 usb_log_warning("Wrong data size: %zu, expected: 1.", 303 actual_size); 304 304 return ELIMIT; 305 305 } 306 306 307 307 *protocol = buffer[0]; 308 308 309 309 return EOK; 310 310 } … … 320 320 * @retval EOK if successful. 321 321 * @retval EINVAL if no HID device is given. 322 * @return Other value inherited from one of functions 322 * @return Other value inherited from one of functions 323 323 * usb_pipe_start_session(), usb_pipe_end_session(), 324 324 * usb_control_request_set(). 325 325 */ 326 errno_t usbhid_req_get_idle(usb_pipe_t *ctrl_pipe, int iface_no, uint8_t *duration) 327 { 328 if (ctrl_pipe == NULL) { 329 usb_log_warning("usbhid_req_set_report(): no pipe given.\n"); 330 return EINVAL; 331 } 332 333 if (iface_no < 0) { 334 usb_log_warning("usbhid_req_set_report(): no interface given." 335 "\n"); 336 return EINVAL; 337 } 338 339 /* 340 * No need for checking other parameters, as they are checked in 341 * the called function (usb_control_request_set()). 342 */ 343 326 errno_t usbhid_req_get_idle(usb_pipe_t *ctrl_pipe, int iface_no, 327 uint8_t *duration) 328 { 329 if (ctrl_pipe == NULL) { 330 usb_log_warning("usbhid_req_set_report(): no pipe given."); 331 return EINVAL; 332 } 333 334 if (iface_no < 0) { 335 usb_log_warning("usbhid_req_set_report(): no interface given." 336 "\n"); 337 return EINVAL; 338 } 339 340 /* 341 * No need for checking other parameters, as they are checked in 342 * the called function (usb_control_request_set()). 343 */ 344 344 345 errno_t rc; 345 346 346 347 usb_log_debug("Sending Get Idle request to the device (" 347 348 "iface: %d).\n", iface_no); 348 349 349 350 uint16_t value = 0; 350 351 uint8_t buffer[1]; 351 352 size_t actual_size = 0; 352 353 rc = usb_control_request_get(ctrl_pipe, 354 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 355 USB_HIDREQ_GET_IDLE, value, iface_no, buffer, 1, 353 354 rc = usb_control_request_get(ctrl_pipe, 355 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 356 USB_HIDREQ_GET_IDLE, value, iface_no, buffer, 1, 356 357 &actual_size); 357 358 … … 361 362 return rc; 362 363 } 363 364 364 365 if (actual_size != 1) { 365 usb_log_warning("Wrong data size: %zu, expected: 1. \n",366 actual_size);366 usb_log_warning("Wrong data size: %zu, expected: 1.", 367 actual_size); 367 368 return ELIMIT; 368 369 } 369 370 370 371 *duration = buffer[0]; 371 372 372 373 return EOK; 373 374 }
Note:
See TracChangeset
for help on using the changeset viewer.
