Changes in uspace/drv/hid/usbhid/usbhid.c [be01eb3:b7fd2a0] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/hid/usbhid/usbhid.c
rbe01eb3 rb7fd2a0 134 134 usb_hid_report_path_t *usage_path = usb_hid_report_path(); 135 135 if (usage_path == NULL) { 136 usb_log_debug("Failed to create usage path. ");136 usb_log_debug("Failed to create usage path.\n"); 137 137 return false; 138 138 } … … 143 143 mapping->usage_path[i].usage_page, 144 144 mapping->usage_path[i].usage) != EOK) { 145 usb_log_debug("Failed to append to usage path. ");145 usb_log_debug("Failed to append to usage path.\n"); 146 146 usb_hid_report_path_free(usage_path); 147 147 return false; … … 149 149 } 150 150 151 usb_log_debug("Compare flags: %d ", mapping->compare);151 usb_log_debug("Compare flags: %d\n", mapping->compare); 152 152 153 153 bool matches = false; … … 155 155 156 156 do { 157 usb_log_debug("Trying report id %u ", report_id);157 usb_log_debug("Trying report id %u\n", report_id); 158 158 if (report_id != 0) { 159 159 usb_hid_report_path_set_report_id(usage_path, … … 166 166 USB_HID_REPORT_TYPE_INPUT); 167 167 168 usb_log_debug("Field: %p ", field);168 usb_log_debug("Field: %p\n", field); 169 169 170 170 if (field != NULL) { … … 243 243 mapping->product_id); 244 244 if (usb_hid_ids_match(hid_dev, mapping)) { 245 usb_log_debug("IDs matched. ");245 usb_log_debug("IDs matched.\n"); 246 246 matched = true; 247 247 } … … 250 250 /* Check usage match. */ 251 251 if (mapping->usage_path != NULL) { 252 usb_log_debug("Comparing device against usage path. ");252 usb_log_debug("Comparing device against usage path.\n"); 253 253 if (usb_hid_path_matches(hid_dev, mapping)) { 254 254 /* Does not matter if IDs were matched. */ … … 258 258 259 259 if (matched) { 260 usb_log_debug("Subdriver matched. ");260 usb_log_debug("Subdriver matched.\n"); 261 261 subdrivers[count++] = &mapping->subdriver; 262 262 } … … 285 285 usb_device_get_mapped_ep_desc(dev, endpoints[i].desc); 286 286 if (epm && epm->present) { 287 usb_log_debug("Found: %s. ", endpoints[i].description);287 usb_log_debug("Found: %s.\n", endpoints[i].description); 288 288 hid_dev->poll_pipe_mapping = epm; 289 289 return EOK; … … 301 301 302 302 do { 303 usb_log_debug("Getting size of the report. ");303 usb_log_debug("Getting size of the report.\n"); 304 304 const size_t size = 305 305 usb_hid_report_byte_size(&hid_dev->report, report_id, 306 306 USB_HID_REPORT_TYPE_INPUT); 307 usb_log_debug("Report ID: %u, size: %zu ", report_id, size);307 usb_log_debug("Report ID: %u, size: %zu\n", report_id, size); 308 308 max_size = (size > max_size) ? size : max_size; 309 usb_log_debug("Getting next report ID ");309 usb_log_debug("Getting next report ID\n"); 310 310 report_id = usb_hid_get_next_report_id(&hid_dev->report, 311 311 report_id, USB_HID_REPORT_TYPE_INPUT); 312 312 } while (report_id != 0); 313 313 314 usb_log_debug("Max size of input report: %zu ", max_size);314 usb_log_debug("Max size of input report: %zu\n", max_size); 315 315 316 316 assert(hid_dev->input_report == NULL); … … 323 323 324 324 return EOK; 325 }326 327 static bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer,328 size_t buffer_size, void *arg)329 {330 if (dev == NULL || arg == NULL || buffer == NULL) {331 usb_log_error("Missing arguments to polling callback.");332 return false;333 }334 usb_hid_dev_t *hid_dev = arg;335 336 assert(hid_dev->input_report != NULL);337 338 usb_log_debug("New data [%zu/%zu]: %s", buffer_size,339 hid_dev->max_input_report_size,340 usb_debug_str_buffer(buffer, buffer_size, 0));341 342 if (hid_dev->max_input_report_size >= buffer_size) {343 /*! @todo This should probably be atomic. */344 memcpy(hid_dev->input_report, buffer, buffer_size);345 hid_dev->input_report_size = buffer_size;346 usb_hid_new_report(hid_dev);347 }348 349 /* Parse the input report */350 const errno_t rc = usb_hid_parse_report(351 &hid_dev->report, buffer, buffer_size, &hid_dev->report_id);352 if (rc != EOK) {353 usb_log_warning("Failure in usb_hid_parse_report():"354 "%s\n", str_error(rc));355 }356 357 bool cont = false;358 /* Continue if at least one of the subdrivers want to continue */359 for (unsigned i = 0; i < hid_dev->subdriver_count; ++i) {360 if (hid_dev->subdrivers[i].poll != NULL) {361 cont = cont || hid_dev->subdrivers[i].poll(362 hid_dev, hid_dev->subdrivers[i].data);363 }364 }365 366 return cont;367 }368 369 static bool usb_hid_polling_error_callback(usb_device_t *dev, errno_t err_code, void *arg)370 {371 assert(dev);372 assert(arg);373 usb_hid_dev_t *hid_dev = arg;374 375 usb_log_error("Device %s polling error: %s", usb_device_get_name(dev),376 str_error(err_code));377 378 /* Continue polling until the device is about to be removed. */379 return hid_dev->running;380 }381 382 static void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, void *arg)383 {384 assert(dev);385 assert(arg);386 387 usb_hid_dev_t *hid_dev = arg;388 389 for (unsigned i = 0; i < hid_dev->subdriver_count; ++i) {390 if (hid_dev->subdrivers[i].poll_end != NULL) {391 hid_dev->subdrivers[i].poll_end(392 hid_dev, hid_dev->subdrivers[i].data, reason);393 }394 }395 396 hid_dev->running = false;397 325 } 398 326 … … 404 332 * During initialization, the keyboard is switched into boot protocol, the idle 405 333 * rate is set to 0 (infinity), resulting in the keyboard only reporting event 406 * when a key is pressed or released. Finally, the LED lights are turned on 334 * when a key is pressed or released. Finally, the LED lights are turned on 407 335 * according to the default setup of lock keys. 408 336 * 409 * @note By default, the keyboards is initialized with Num Lock turned on and 337 * @note By default, the keyboards is initialized with Num Lock turned on and 410 338 * other locks turned off. 411 339 * … … 419 347 assert(dev); 420 348 421 usb_log_debug("Initializing HID structure... ");349 usb_log_debug("Initializing HID structure...\n"); 422 350 423 351 usb_hid_report_init(&hid_dev->report); … … 441 369 usb_hid_find_subdrivers(hid_dev); 442 370 } else { 443 usb_log_error("Failed to parse report descriptor: fallback. ");371 usb_log_error("Failed to parse report descriptor: fallback.\n"); 444 372 hid_dev->subdrivers = NULL; 445 373 hid_dev->subdriver_count = 0; 446 374 } 447 375 448 usb_log_debug("Subdriver count(before trying boot protocol): %d ",376 usb_log_debug("Subdriver count(before trying boot protocol): %d\n", 449 377 hid_dev->subdriver_count); 450 378 … … 457 385 switch (hid_dev->poll_pipe_mapping->interface->interface_protocol) { 458 386 case USB_HID_PROTOCOL_KEYBOARD: 459 usb_log_info("Falling back to kbd boot protocol. ");387 usb_log_info("Falling back to kbd boot protocol.\n"); 460 388 rc = usb_kbd_set_boot_protocol(hid_dev); 461 389 if (rc == EOK) { … … 464 392 break; 465 393 case USB_HID_PROTOCOL_MOUSE: 466 usb_log_info("Falling back to mouse boot protocol. ");394 usb_log_info("Falling back to mouse boot protocol.\n"); 467 395 rc = usb_mouse_set_boot_protocol(hid_dev); 468 396 if (rc == EOK) { … … 471 399 break; 472 400 default: 473 usb_log_info("Falling back to generic HID driver. ");401 usb_log_info("Falling back to generic HID driver.\n"); 474 402 usb_hid_set_generic_hid_subdriver(hid_dev); 475 403 } 476 404 } 477 405 478 usb_log_debug("Subdriver count(after trying boot protocol): %d ",406 usb_log_debug("Subdriver count(after trying boot protocol): %d\n", 479 407 hid_dev->subdriver_count); 480 408 … … 491 419 for (unsigned i = 0; i < hid_dev->subdriver_count; ++i) { 492 420 if (hid_dev->subdrivers[i].init != NULL) { 493 usb_log_debug("Initializing subdriver %d. ",i);421 usb_log_debug("Initializing subdriver %d.\n",i); 494 422 const errno_t pret = hid_dev->subdrivers[i].init(hid_dev, 495 423 &hid_dev->subdrivers[i].data); … … 514 442 rc = usb_hid_init_report(hid_dev); 515 443 if (rc != EOK) { 516 usb_log_error("Failed to initialize input report buffer: %s", str_error(rc)); 517 // FIXME: What happens now? 518 } 519 520 usb_polling_t *polling = &hid_dev->polling; 521 if ((rc = usb_polling_init(polling))) { 522 usb_log_error("Failed to initialize polling: %s", str_error(rc)); 523 // FIXME: What happens now? 524 } 525 526 polling->device = hid_dev->usb_dev; 527 polling->ep_mapping = hid_dev->poll_pipe_mapping; 528 polling->request_size = hid_dev->poll_pipe_mapping->pipe.desc.max_transfer_size; 529 polling->buffer = malloc(polling->request_size); 530 polling->on_data = usb_hid_polling_callback; 531 polling->on_polling_end = usb_hid_polling_ended_callback; 532 polling->on_error = usb_hid_polling_error_callback; 533 polling->arg = hid_dev; 444 usb_log_error("Failed to initialize input report buffer" 445 ".\n"); 446 } 534 447 } 535 448 536 449 return rc; 450 } 451 452 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 453 size_t buffer_size, void *arg) 454 { 455 if (dev == NULL || arg == NULL || buffer == NULL) { 456 usb_log_error("Missing arguments to polling callback.\n"); 457 return false; 458 } 459 usb_hid_dev_t *hid_dev = arg; 460 461 assert(hid_dev->input_report != NULL); 462 463 usb_log_debug("New data [%zu/%zu]: %s\n", buffer_size, 464 hid_dev->max_input_report_size, 465 usb_debug_str_buffer(buffer, buffer_size, 0)); 466 467 if (hid_dev->max_input_report_size >= buffer_size) { 468 /*! @todo This should probably be atomic. */ 469 memcpy(hid_dev->input_report, buffer, buffer_size); 470 hid_dev->input_report_size = buffer_size; 471 usb_hid_new_report(hid_dev); 472 } 473 474 /* Parse the input report */ 475 const errno_t rc = usb_hid_parse_report( 476 &hid_dev->report, buffer, buffer_size, &hid_dev->report_id); 477 if (rc != EOK) { 478 usb_log_warning("Failure in usb_hid_parse_report():" 479 "%s\n", str_error(rc)); 480 } 481 482 bool cont = false; 483 /* Continue if at least one of the subdrivers want to continue */ 484 for (unsigned i = 0; i < hid_dev->subdriver_count; ++i) { 485 if (hid_dev->subdrivers[i].poll != NULL) { 486 cont = cont || hid_dev->subdrivers[i].poll( 487 hid_dev, hid_dev->subdrivers[i].data); 488 } 489 } 490 491 return cont; 492 } 493 494 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, void *arg) 495 { 496 assert(dev); 497 assert(arg); 498 499 usb_hid_dev_t *hid_dev = arg; 500 501 for (unsigned i = 0; i < hid_dev->subdriver_count; ++i) { 502 if (hid_dev->subdrivers[i].poll_end != NULL) { 503 hid_dev->subdrivers[i].poll_end( 504 hid_dev, hid_dev->subdrivers[i].data, reason); 505 } 506 } 507 508 hid_dev->running = false; 537 509 } 538 510 … … 552 524 assert(hid_dev->subdrivers != NULL || hid_dev->subdriver_count == 0); 553 525 554 free(hid_dev->polling.buffer); 555 usb_polling_fini(&hid_dev->polling); 556 557 usb_log_debug("Subdrivers: %p, subdriver count: %d", 526 527 usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 558 528 hid_dev->subdrivers, hid_dev->subdriver_count); 559 529 … … 571 541 /* Destroy the parser */ 572 542 usb_hid_report_deinit(&hid_dev->report); 543 573 544 } 574 545
Note:
See TracChangeset
for help on using the changeset viewer.