Changes in uspace/drv/hid/usbhid/usbhid.c [53b9f2c:a1732929] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/hid/usbhid/usbhid.c
r53b9f2c ra1732929 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. \n");136 usb_log_debug("Failed to create usage path."); 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. \n");145 usb_log_debug("Failed to append to usage path."); 146 146 usb_hid_report_path_free(usage_path); 147 147 return false; … … 149 149 } 150 150 151 usb_log_debug("Compare flags: %d \n", mapping->compare);151 usb_log_debug("Compare flags: %d", mapping->compare); 152 152 153 153 bool matches = false; … … 155 155 156 156 do { 157 usb_log_debug("Trying report id %u \n", report_id);157 usb_log_debug("Trying report id %u", 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 \n", field);168 usb_log_debug("Field: %p", 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. \n");245 usb_log_debug("IDs matched."); 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. \n");252 usb_log_debug("Comparing device against usage path."); 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. \n");260 usb_log_debug("Subdriver matched."); 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. \n", endpoints[i].description);287 usb_log_debug("Found: %s.", 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. \n");303 usb_log_debug("Getting size of the report."); 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 \n", report_id, size);307 usb_log_debug("Report ID: %u, size: %zu", report_id, size); 308 308 max_size = (size > max_size) ? size : max_size; 309 usb_log_debug("Getting next report ID \n");309 usb_log_debug("Getting next report ID"); 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 \n", max_size);314 usb_log_debug("Max size of input report: %zu", 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 int 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, int 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; 325 397 } 326 398 … … 332 404 * During initialization, the keyboard is switched into boot protocol, the idle 333 405 * rate is set to 0 (infinity), resulting in the keyboard only reporting event 334 * when a key is pressed or released. Finally, the LED lights are turned on 406 * when a key is pressed or released. Finally, the LED lights are turned on 335 407 * according to the default setup of lock keys. 336 408 * 337 * @note By default, the keyboards is initialized with Num Lock turned on and 409 * @note By default, the keyboards is initialized with Num Lock turned on and 338 410 * other locks turned off. 339 411 * … … 347 419 assert(dev); 348 420 349 usb_log_debug("Initializing HID structure... \n");421 usb_log_debug("Initializing HID structure..."); 350 422 351 423 usb_hid_report_init(&hid_dev->report); … … 369 441 usb_hid_find_subdrivers(hid_dev); 370 442 } else { 371 usb_log_error("Failed to parse report descriptor: fallback. \n");443 usb_log_error("Failed to parse report descriptor: fallback."); 372 444 hid_dev->subdrivers = NULL; 373 445 hid_dev->subdriver_count = 0; 374 446 } 375 447 376 usb_log_debug("Subdriver count(before trying boot protocol): %d \n",448 usb_log_debug("Subdriver count(before trying boot protocol): %d", 377 449 hid_dev->subdriver_count); 378 450 … … 385 457 switch (hid_dev->poll_pipe_mapping->interface->interface_protocol) { 386 458 case USB_HID_PROTOCOL_KEYBOARD: 387 usb_log_info("Falling back to kbd boot protocol. \n");459 usb_log_info("Falling back to kbd boot protocol."); 388 460 rc = usb_kbd_set_boot_protocol(hid_dev); 389 461 if (rc == EOK) { … … 392 464 break; 393 465 case USB_HID_PROTOCOL_MOUSE: 394 usb_log_info("Falling back to mouse boot protocol. \n");466 usb_log_info("Falling back to mouse boot protocol."); 395 467 rc = usb_mouse_set_boot_protocol(hid_dev); 396 468 if (rc == EOK) { … … 399 471 break; 400 472 default: 401 usb_log_info("Falling back to generic HID driver. \n");473 usb_log_info("Falling back to generic HID driver."); 402 474 usb_hid_set_generic_hid_subdriver(hid_dev); 403 475 } 404 476 } 405 477 406 usb_log_debug("Subdriver count(after trying boot protocol): %d \n",478 usb_log_debug("Subdriver count(after trying boot protocol): %d", 407 479 hid_dev->subdriver_count); 408 480 … … 419 491 for (unsigned i = 0; i < hid_dev->subdriver_count; ++i) { 420 492 if (hid_dev->subdrivers[i].init != NULL) { 421 usb_log_debug("Initializing subdriver %d. \n",i);493 usb_log_debug("Initializing subdriver %d.",i); 422 494 const int pret = hid_dev->subdrivers[i].init(hid_dev, 423 495 &hid_dev->subdrivers[i].data); … … 442 514 rc = usb_hid_init_report(hid_dev); 443 515 if (rc != EOK) { 444 usb_log_error("Failed to initialize input report buffer" 445 ".\n"); 446 } 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; 447 534 } 448 535 449 536 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 int 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;509 537 } 510 538 … … 524 552 assert(hid_dev->subdrivers != NULL || hid_dev->subdriver_count == 0); 525 553 526 527 usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 554 free(hid_dev->polling.buffer); 555 usb_polling_fini(&hid_dev->polling); 556 557 usb_log_debug("Subdrivers: %p, subdriver count: %d", 528 558 hid_dev->subdrivers, hid_dev->subdriver_count); 529 559 … … 541 571 /* Destroy the parser */ 542 572 usb_hid_report_deinit(&hid_dev->report); 543 544 573 } 545 574
Note:
See TracChangeset
for help on using the changeset viewer.