Changeset ae3a941 in mainline for uspace/lib/usbhid
- Timestamp:
- 2018-02-26T16:51:40Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e773f58
- Parents:
- 3692678
- Location:
- uspace/lib/usbhid/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhid/src/hidparser.c
r3692678 rae3a941 52 52 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data); 53 53 54 uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item, 55 54 uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item, 55 int32_t value); 56 56 57 57 … … 76 76 * 77 77 * @param parser Opaque report parser structure 78 * @param report_id 78 * @param report_id 79 79 * @param type 80 80 * @return Number of items in specified report 81 81 */ 82 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, 83 83 usb_hid_report_type_t type) 84 84 { … … 100 100 * 101 101 * @param parser Opaque report parser structure 102 * @param report_id 102 * @param report_id 103 103 * @param type 104 104 * @return Number of items in specified report 105 105 */ 106 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, 107 107 usb_hid_report_type_t type) 108 108 { … … 117 117 return 0; 118 118 } else { 119 return ((report_des->bit_length + 7) / 8) 119 return ((report_des->bit_length + 7) / 8); 120 120 } 121 121 } … … 129 129 * @param data Data for the report. 130 130 * @return Error code. 131 */ 132 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, 133 133 size_t size, uint8_t *report_id) 134 134 { 135 135 usb_hid_report_description_t *report_des; 136 136 usb_hid_report_type_t type = USB_HID_REPORT_TYPE_INPUT; 137 137 138 138 if (report == NULL) { 139 139 return EINVAL; … … 146 146 } 147 147 148 report_des = usb_hid_report_find_description(report, *report_id, 148 report_des = usb_hid_report_find_description(report, *report_id, 149 149 type); 150 150 … … 158 158 159 159 if (USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) { 160 160 161 161 if (USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) { 162 162 /* array */ 163 item->value = 164 165 163 item->value = 164 usb_hid_translate_data(item, data); 165 166 166 item->usage = USB_HID_EXTENDED_USAGE( 167 167 item->usages[item->value - 168 168 item->physical_minimum]); 169 169 170 item->usage_page = 170 item->usage_page = 171 171 USB_HID_EXTENDED_USAGE_PAGE( 172 172 item->usages[item->value - … … 174 174 175 175 usb_hid_report_set_last_item( 176 item->collection_path, 177 USB_HID_TAG_CLASS_GLOBAL, 176 item->collection_path, 177 USB_HID_TAG_CLASS_GLOBAL, 178 178 item->usage_page); 179 179 180 180 usb_hid_report_set_last_item( 181 item->collection_path, 181 item->collection_path, 182 182 USB_HID_TAG_CLASS_LOCAL, item->usage); 183 183 } else { 184 184 /* variable item */ 185 item->value = usb_hid_translate_data(item, 185 item->value = usb_hid_translate_data(item, 186 186 data); 187 187 } 188 188 } 189 189 } 190 190 191 191 return EOK; 192 192 } … … 214 214 int resolution; 215 215 if (item->physical_maximum == item->physical_minimum) { 216 217 } else { 218 219 ((item->physical_maximum - item->physical_minimum) *220 (usb_pow(10, (item->unit_exponent))));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 221 } 222 222 … … 255 255 } 256 256 257 return (int) (((value - item->logical_minimum) / resolution) + 257 return (int) (((value - item->logical_minimum) / resolution) + 258 258 item->physical_minimum); 259 259 } … … 262 262 /* OUTPUT API */ 263 263 264 /** 264 /** 265 265 * Allocates output report buffer for output report 266 266 * … … 270 270 * @return Returns allocated output buffer for specified output 271 271 */ 272 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, 273 273 uint8_t report_id) 274 274 { … … 322 322 * @return Error code 323 323 */ 324 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, 325 325 uint8_t report_id, uint8_t *buffer, size_t size) 326 326 { … … 329 329 int length; 330 330 int32_t tmp_value; 331 331 332 332 if (report == NULL) { 333 333 return EINVAL; … … 339 339 340 340 usb_hid_report_description_t *report_des; 341 report_des = usb_hid_report_find_description(report, report_id, 341 report_des = usb_hid_report_find_description(report, report_id, 342 342 USB_HID_REPORT_TYPE_OUTPUT); 343 343 344 344 if (report_des == NULL) { 345 345 return EINVAL; … … 348 348 list_foreach(report_des->report_items, ritems_link, 349 349 usb_hid_report_field_t, report_item) { 350 value = usb_hid_translate_data_reverse(report_item, 350 value = usb_hid_translate_data_reverse(report_item, 351 351 report_item->value); 352 352 353 353 offset = report_des->bit_length - report_item->offset - 1; 354 354 length = report_item->size; 355 355 356 356 usb_log_debug("\ttranslated value: %x", value); 357 357 358 358 if ((offset / 8) == ((offset + length - 1) / 8)) { 359 if (((size_t) (offset / 8) >= size) || 359 if (((size_t) (offset / 8) >= size) || 360 360 ((size_t) (offset + length - 1) / 8) >= size) { 361 361 break; // TODO ErrorCode … … 364 364 value = value << shift; 365 365 value = value & (((1 << length) - 1) << shift); 366 366 367 367 uint8_t mask = 0; 368 368 mask = 0xff - (((1 << length) - 1) << shift); … … 376 376 if (i == (offset / 8)) { 377 377 tmp_value = value; 378 tmp_value = tmp_value & 378 tmp_value = tmp_value & 379 379 ((1 << (8 - (offset % 8))) - 1); 380 380 381 381 tmp_value = tmp_value << (offset % 8); 382 382 383 383 mask = ~(((1 << (8 - (offset % 8))) - 1) 384 384 << (offset % 8)); 385 385 386 buffer[i] = (buffer[i] & mask) | 386 buffer[i] = (buffer[i] & mask) | 387 387 tmp_value; 388 388 } else if (i == ((offset + length - 1) / 8)) { 389 390 value = value >> (length - 389 390 value = value >> (length - 391 391 ((offset + length) % 8)); 392 392 393 value = value & ((1 << (length - 393 value = value & ((1 << (length - 394 394 ((offset + length) % 8))) - 1); 395 396 mask = (1 << (length - 395 396 mask = (1 << (length - 397 397 ((offset + length) % 8))) - 1; 398 398 … … 407 407 report_item->value = 0; 408 408 } 409 409 410 410 return EOK; 411 411 } … … 418 418 * @return ranslated value 419 419 */ 420 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, 421 421 int value) 422 422 { … … 430 430 if ((item->physical_minimum == 0) && (item->physical_maximum == 0)) { 431 431 item->physical_minimum = item->logical_minimum; 432 item->physical_maximum = item->logical_maximum; 433 } 434 432 item->physical_maximum = item->logical_maximum; 433 } 434 435 435 /* variable item */ 436 436 if (item->physical_maximum == item->physical_minimum) { 437 438 } else { 439 440 ((item->physical_maximum - item->physical_minimum) *441 (usb_pow(10, (item->unit_exponent))));442 } 443 444 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) + 445 445 item->logical_minimum; 446 446 447 447 usb_log_debug("\tvalue(%x), resolution(%x), phymin(%x) logmin(%x), " 448 "ret(%x)\n", value, resolution, item->physical_minimum, 448 "ret(%x)\n", value, resolution, item->physical_minimum, 449 449 item->logical_minimum, ret); 450 450 451 451 if ((item->logical_minimum < 0) || (item->logical_maximum < 0)) { 452 452 return USB_HID_INT32_TO_UINT32(ret, item->size); … … 467 467 { 468 468 usb_hid_report_item_t *new_report_item; 469 469 470 470 if (!(new_report_item = malloc(sizeof(usb_hid_report_item_t)))) { 471 471 return NULL; 472 } 472 } 473 473 memcpy(new_report_item,item, sizeof(usb_hid_report_item_t)); 474 474 link_initialize(&(new_report_item->link)); … … 485 485 * @param field Current field. If NULL is given, the first one in the report 486 486 * is returned. Otherwise the next one i nthe list is returned. 487 * @param path Usage path specifying which fields wa are interested in. 487 * @param path Usage path specifying which fields wa are interested in. 488 488 * @param flags Flags defining mode of usage paths comparison 489 489 * @param type Type of report we search. … … 491 491 * @retval Pointer to the founded report structure when founded 492 492 */ 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, 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, 495 495 usb_hid_report_type_t type) 496 496 { 497 usb_hid_report_description_t *report_des = 497 usb_hid_report_description_t *report_des = 498 498 usb_hid_report_find_description(report, path->report_id, type); 499 499 500 500 link_t *field_it; 501 501 502 502 if (report_des == NULL) { 503 503 return NULL; … … 511 511 512 512 while (field_it != &report_des->report_items.head) { 513 field = list_get_instance(field_it, usb_hid_report_field_t, 513 field = list_get_instance(field_it, usb_hid_report_field_t, 514 514 ritems_link); 515 515 … … 553 553 usb_hid_report_description_t *report_des; 554 554 link_t *report_it; 555 555 556 556 if (report_id > 0) { 557 report_des = usb_hid_report_find_description(report, report_id, 557 report_des = usb_hid_report_find_description(report, report_id, 558 558 type); 559 559 if (report_des == NULL) { … … 561 561 } else { 562 562 report_it = report_des->reports_link.next; 563 } 563 } 564 564 } else { 565 565 report_it = report->reports.head.next; … … 567 567 568 568 while (report_it != &report->reports.head) { 569 report_des = list_get_instance(report_it, 569 report_des = list_get_instance(report_it, 570 570 usb_hid_report_description_t, reports_link); 571 571 … … 594 594 return; 595 595 } 596 596 597 597 report_item->usages_count = 0; 598 598 memset(report_item->usages, 0, USB_HID_MAX_USAGES); 599 599 600 600 report_item->extended_usage_page = 0; 601 601 report_item->usage_minimum = 0; -
uspace/lib/usbhid/src/hidpath.c
r3692678 rae3a941 73 73 * @return Error code 74 74 */ 75 errno_t usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, 76 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 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 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 { … … 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 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 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
r3692678 rae3a941 71 71 const uint8_t *d = 72 72 usb_dp_get_nested_descriptor(&parser, &parser_data, 73 73 usb_device_descriptors(dev)->full_config); 74 74 75 75 /* … … 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 { -
uspace/lib/usbhid/src/hidreq.c
r3692678 rae3a941 65 65 return EINVAL; 66 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 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 84 usb_log_debug("Sending Set Report request to the device."); 85 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 } … … 115 115 return EINVAL; 116 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 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 } … … 163 163 return EINVAL; 164 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 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 { … … 218 218 return EINVAL; 219 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 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 236 237 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, 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 { … … 269 269 return EINVAL; 270 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; 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 302 usb_log_warning("Wrong data size: %zu, expected: 1.", 303 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."); 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 366 usb_log_warning("Wrong data size: %zu, expected: 1.", 366 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.