Changes in uspace/drv/bus/usb/usbhid/mouse/mousedev.c [5f6e25e:e3c78efc] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhid/mouse/mousedev.c
r5f6e25e re3c78efc 42 42 #include <errno.h> 43 43 #include <async.h> 44 #include <async_obsolete.h>45 44 #include <str_error.h> 46 45 #include <ipc/mouseev.h> … … 56 55 #define ARROWS_PER_SINGLE_WHEEL 3 57 56 58 // FIXME: remove this header59 #include <abi/ipc/methods.h>60 61 57 #define NAME "mouse" 62 58 63 59 /*----------------------------------------------------------------------------*/ 64 60 65 usb_endpoint_description_t usb_hid_mouse_poll_endpoint_description = {61 const usb_endpoint_description_t usb_hid_mouse_poll_endpoint_description = { 66 62 .transfer_type = USB_TRANSFER_INTERRUPT, 67 63 .direction = USB_DIRECTION_IN, … … 79 75 /** Default idle rate for mouses. */ 80 76 static const uint8_t IDLE_RATE = 0; 81 static const size_t USB_MOUSE_BUTTON_COUNT = 3; 82 83 /*----------------------------------------------------------------------------*/ 84 85 enum { 86 USB_MOUSE_BOOT_REPORT_DESCRIPTOR_SIZE = 63 87 }; 88 89 static const uint8_t USB_MOUSE_BOOT_REPORT_DESCRIPTOR[ 90 USB_MOUSE_BOOT_REPORT_DESCRIPTOR_SIZE] = { 77 78 /*----------------------------------------------------------------------------*/ 79 static const uint8_t USB_MOUSE_BOOT_REPORT_DESCRIPTOR[] = { 91 80 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 92 81 0x09, 0x02, // USAGE (Mouse) … … 128 117 ipc_callid_t icallid, ipc_call_t *icall) 129 118 { 130 sysarg_t method = IPC_GET_IMETHOD(*icall); 131 132 usb_mouse_t *mouse_dev = (usb_mouse_t *)fun->driver_data; 133 119 usb_mouse_t *mouse_dev = fun->driver_data; 120 134 121 if (mouse_dev == NULL) { 135 usb_log_debug("default_connection_handler: Missing " 136 "parameters.\n"); 122 usb_log_debug("%s: Missing parameters.\n", __FUNCTION__); 137 123 async_answer_0(icallid, EINVAL); 138 124 return; 139 125 } 140 141 usb_log_debug("default_connection_handler: fun->name: %s\n", 142 fun->name); 143 usb_log_debug("default_connection_handler: mouse_phone: %d, wheel " 144 "phone: %d\n", mouse_dev->mouse_phone, mouse_dev->wheel_phone); 145 146 int *phone = (str_cmp(fun->name, HID_MOUSE_FUN_NAME) == 0) 147 ? &mouse_dev->mouse_phone : &mouse_dev->wheel_phone; 148 149 if (method == IPC_M_CONNECT_TO_ME) { 150 int callback = IPC_GET_ARG5(*icall); 151 152 if (*phone != -1) { 153 usb_log_debug("default_connection_handler: Console " 154 "phone to mouse already set.\n"); 126 127 usb_log_debug("%s: fun->name: %s\n", __FUNCTION__, fun->name); 128 usb_log_debug("%s: mouse_sess: %p, wheel_sess: %p\n", 129 __FUNCTION__, mouse_dev->mouse_sess, mouse_dev->wheel_sess); 130 131 async_sess_t **sess_ptr = (fun == mouse_dev->mouse_fun) ? 132 &mouse_dev->mouse_sess : &mouse_dev->wheel_sess; 133 134 async_sess_t *sess = 135 async_callback_receive_start(EXCHANGE_SERIALIZE, icall); 136 if (sess != NULL) { 137 if (*sess_ptr == NULL) { 138 *sess_ptr = sess; 139 usb_log_debug("Console session to %s set ok (%p).\n", 140 fun->name, sess); 141 async_answer_0(icallid, EOK); 142 } else { 143 usb_log_error("Console session to %s already set.\n", 144 fun->name); 155 145 async_answer_0(icallid, ELIMIT); 156 return;157 146 } 158 159 *phone = callback; 160 usb_log_debug("Console phone to mouse set ok (%d).\n", *phone); 161 async_answer_0(icallid, EOK); 162 return; 163 } 164 165 usb_log_debug("default_connection_handler: Invalid function.\n"); 166 async_answer_0(icallid, EINVAL); 167 } 168 169 /*----------------------------------------------------------------------------*/ 170 171 static usb_mouse_t *usb_mouse_new(void) 172 { 173 usb_mouse_t *mouse = calloc(1, sizeof(usb_mouse_t)); 174 if (mouse == NULL) { 175 return NULL; 176 } 177 mouse->mouse_phone = -1; 178 mouse->wheel_phone = -1; 179 180 return mouse; 181 } 182 183 /*----------------------------------------------------------------------------*/ 184 185 static void usb_mouse_destroy(usb_mouse_t *mouse_dev) 186 { 187 assert(mouse_dev != NULL); 188 189 // hangup phone to the console 190 if (mouse_dev->mouse_phone >= 0) { 191 async_obsolete_hangup(mouse_dev->mouse_phone); 192 } 193 194 if (mouse_dev->wheel_phone >= 0) { 195 async_obsolete_hangup(mouse_dev->wheel_phone); 147 } else { 148 usb_log_debug("%s: Invalid function.\n", __FUNCTION__); 149 async_answer_0(icallid, EINVAL); 196 150 } 197 151 } … … 203 157 unsigned int key = (wheel > 0) ? KC_UP : KC_DOWN; 204 158 205 if (mouse_dev->wheel_ phone < 0) {159 if (mouse_dev->wheel_sess == NULL) { 206 160 usb_log_warning( 207 161 "Connection to console not ready, wheel roll discarded.\n"); 208 162 return; 209 163 } 210 211 int count = ((wheel < 0) ? -wheel : wheel) * ARROWS_PER_SINGLE_WHEEL; 212 int i; 213 214 for (i = 0; i < count; i++) { 164 165 const unsigned count = 166 ((wheel < 0) ? -wheel : wheel) * ARROWS_PER_SINGLE_WHEEL; 167 for (unsigned i = 0; i < count; i++) { 215 168 /* Send arrow press and release. */ 216 169 usb_log_debug2("Sending key %d to the console\n", key); 217 async_obsolete_msg_4(mouse_dev->wheel_phone, KBDEV_EVENT, 218 KEY_PRESS, key, 0, 0); 219 async_obsolete_msg_4(mouse_dev->wheel_phone, KBDEV_EVENT, 220 KEY_RELEASE, key, 0, 0); 170 171 async_exch_t *exch = async_exchange_begin(mouse_dev->wheel_sess); 172 173 async_msg_4(exch, KBDEV_EVENT, KEY_PRESS, key, 0, 0); 174 async_msg_4(exch, KBDEV_EVENT, KEY_RELEASE, key, 0, 0); 175 176 async_exchange_end(exch); 221 177 } 222 178 } … … 252 208 { 253 209 assert(mouse_dev != NULL); 254 255 if (mouse_dev->mouse_ phone < 0) {256 usb_log_warning(NAME " No console phone.\n");210 211 if (mouse_dev->mouse_sess == NULL) { 212 usb_log_warning(NAME " No console session.\n"); 257 213 return true; 258 214 } 259 215 260 int shift_x = get_mouse_axis_move_value(hid_dev->report_id,261 hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_X);262 int shift_y = get_mouse_axis_move_value(hid_dev->report_id,263 hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_Y);264 int wheel = get_mouse_axis_move_value(hid_dev->report_id,265 hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL);216 const int shift_x = get_mouse_axis_move_value(hid_dev->report_id, 217 &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_X); 218 const int shift_y = get_mouse_axis_move_value(hid_dev->report_id, 219 &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_Y); 220 const int wheel = get_mouse_axis_move_value(hid_dev->report_id, 221 &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL); 266 222 267 223 if ((shift_x != 0) || (shift_y != 0)) { 268 async_obsolete_req_2_0(mouse_dev->mouse_phone, 269 MOUSEEV_MOVE_EVENT, shift_x, shift_y); 270 } 271 272 if (wheel != 0) { 224 async_exch_t *exch = 225 async_exchange_begin(mouse_dev->mouse_sess); 226 if (exch != NULL) { 227 async_req_2_0(exch, MOUSEEV_MOVE_EVENT, shift_x, shift_y); 228 async_exchange_end(exch); 229 } 230 } 231 232 if (wheel != 0) 273 233 usb_mouse_send_wheel(mouse_dev, wheel); 274 } 275 276 /* 277 * Buttons 278 */ 234 235 /* Buttons */ 279 236 usb_hid_report_path_t *path = usb_hid_report_path(); 280 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_BUTTON, 0); 237 if (path == NULL) { 238 usb_log_warning("Failed to create USB HID report path.\n"); 239 return true; 240 } 241 int ret = 242 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_BUTTON, 0); 243 if (ret != EOK) { 244 usb_hid_report_path_free(path); 245 usb_log_warning("Failed to add buttons to report path.\n"); 246 return true; 247 } 281 248 usb_hid_report_path_set_report_id(path, hid_dev->report_id); 282 249 283 250 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 284 hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 285 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 286 USB_HID_REPORT_TYPE_INPUT); 251 &hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 252 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, USB_HID_REPORT_TYPE_INPUT); 287 253 288 254 while (field != NULL) { 289 255 usb_log_debug2(NAME " VALUE(%X) USAGE(%X)\n", field->value, 290 256 field->usage); 291 292 if (mouse_dev->buttons[field->usage - field->usage_minimum] == 0 293 && field->value != 0) { 294 async_obsolete_req_2_0(mouse_dev->mouse_phone, 295 MOUSEEV_BUTTON_EVENT, field->usage, 1); 296 mouse_dev->buttons[field->usage - field->usage_minimum] 297 = field->value; 298 } else if (mouse_dev->buttons[field->usage - field->usage_minimum] != 0 299 && field->value == 0) { 300 async_obsolete_req_2_0(mouse_dev->mouse_phone, 301 MOUSEEV_BUTTON_EVENT, field->usage, 0); 302 mouse_dev->buttons[field->usage - field->usage_minimum] = 303 field->value; 257 assert(field->usage > field->usage_minimum); 258 const unsigned index = field->usage - field->usage_minimum; 259 assert(index < mouse_dev->buttons_count); 260 261 if (mouse_dev->buttons[index] == 0 && field->value != 0) { 262 async_exch_t *exch = 263 async_exchange_begin(mouse_dev->mouse_sess); 264 if (exch != NULL) { 265 async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, 266 field->usage, 1); 267 async_exchange_end(exch); 268 mouse_dev->buttons[index] = field->value; 269 } 270 271 } else if (mouse_dev->buttons[index] != 0 && field->value == 0) { 272 async_exch_t *exch = 273 async_exchange_begin(mouse_dev->mouse_sess); 274 if (exch != NULL) { 275 async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, 276 field->usage, 0); 277 async_exchange_end(exch); 278 mouse_dev->buttons[index] = field->value; 279 } 304 280 } 305 281 306 282 field = usb_hid_report_get_sibling( 307 hid_dev->report, field, path, USB_HID_PATH_COMPARE_END308 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 283 &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END 284 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 309 285 USB_HID_REPORT_TYPE_INPUT); 310 286 } 311 287 312 288 usb_hid_report_path_free(path); 313 289 314 290 return true; 315 291 } 316 317 /*----------------------------------------------------------------------------*/ 318 292 /*----------------------------------------------------------------------------*/ 293 #define FUN_UNBIND_DESTROY(fun) \ 294 if (fun) { \ 295 if (ddf_fun_unbind((fun)) == EOK) { \ 296 (fun)->driver_data = NULL; \ 297 ddf_fun_destroy((fun)); \ 298 } else { \ 299 usb_log_error("Could not unbind function `%s', it " \ 300 "will not be destroyed.\n", (fun)->name); \ 301 } \ 302 } else (void)0 303 /*----------------------------------------------------------------------------*/ 319 304 static int usb_mouse_create_function(usb_hid_dev_t *hid_dev, usb_mouse_t *mouse) 320 305 { 321 306 assert(hid_dev != NULL); 322 307 assert(mouse != NULL); 323 308 324 309 /* Create the exposed function. */ 325 310 usb_log_debug("Creating DDF function %s...\n", HID_MOUSE_FUN_NAME); 326 ddf_fun_t *fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed, 311 ddf_fun_t *fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed, 327 312 HID_MOUSE_FUN_NAME); 328 313 if (fun == NULL) { 329 usb_log_error("Could not create DDF function node.\n"); 314 usb_log_error("Could not create DDF function node `%s'.\n", 315 HID_MOUSE_FUN_NAME); 330 316 return ENOMEM; 331 317 } 332 318 333 319 fun->ops = &mouse->ops; 334 320 fun->driver_data = mouse; … … 336 322 int rc = ddf_fun_bind(fun); 337 323 if (rc != EOK) { 338 usb_log_error("Could not bind DDF function: %s.\n", 339 str_error(rc)); 324 usb_log_error("Could not bind DDF function `%s': %s.\n", 325 fun->name, str_error(rc)); 326 fun->driver_data = NULL; 340 327 ddf_fun_destroy(fun); 341 328 return rc; 342 329 } 343 344 usb_log_debug("Adding DDF function to category %s...\n",345 HID_MOUSE_CATEGORY);330 331 usb_log_debug("Adding DDF function `%s' to category %s...\n", 332 fun->name, HID_MOUSE_CATEGORY); 346 333 rc = ddf_fun_add_to_category(fun, HID_MOUSE_CATEGORY); 347 334 if (rc != EOK) { … … 349 336 "Could not add DDF function to category %s: %s.\n", 350 337 HID_MOUSE_CATEGORY, str_error(rc)); 351 ddf_fun_destroy(fun); 352 return rc; 353 } 354 338 FUN_UNBIND_DESTROY(fun); 339 return rc; 340 } 341 mouse->mouse_fun = fun; 342 355 343 /* 356 344 * Special function for acting as keyboard (wheel) 357 345 */ 358 usb_log_debug("Creating DDF function %s...\n", 346 usb_log_debug("Creating DDF function %s...\n", 359 347 HID_MOUSE_WHEEL_FUN_NAME); 360 fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed, 348 fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed, 361 349 HID_MOUSE_WHEEL_FUN_NAME); 362 350 if (fun == NULL) { 363 usb_log_error("Could not create DDF function node.\n"); 351 usb_log_error("Could not create DDF function node `%s'.\n", 352 HID_MOUSE_WHEEL_FUN_NAME); 353 FUN_UNBIND_DESTROY(mouse->mouse_fun); 354 mouse->mouse_fun = NULL; 364 355 return ENOMEM; 365 356 } 366 357 367 358 /* 368 359 * Store the initialized HID device and HID ops … … 374 365 rc = ddf_fun_bind(fun); 375 366 if (rc != EOK) { 376 usb_log_error("Could not bind DDF function: %s.\n", 377 str_error(rc)); 367 usb_log_error("Could not bind DDF function `%s': %s.\n", 368 fun->name, str_error(rc)); 369 FUN_UNBIND_DESTROY(mouse->mouse_fun); 370 mouse->mouse_fun = NULL; 371 372 fun->driver_data = NULL; 378 373 ddf_fun_destroy(fun); 379 374 return rc; 380 375 } 381 376 382 377 usb_log_debug("Adding DDF function to category %s...\n", 383 378 HID_MOUSE_WHEEL_CATEGORY); … … 387 382 "Could not add DDF function to category %s: %s.\n", 388 383 HID_MOUSE_WHEEL_CATEGORY, str_error(rc)); 389 ddf_fun_destroy(fun); 390 return rc; 391 } 392 384 385 FUN_UNBIND_DESTROY(mouse->mouse_fun); 386 mouse->mouse_fun = NULL; 387 FUN_UNBIND_DESTROY(fun); 388 return rc; 389 } 390 mouse->wheel_fun = fun; 391 393 392 return EOK; 394 393 } … … 396 395 /*----------------------------------------------------------------------------*/ 397 396 397 /** Get highest index of a button mentioned in given report. 398 * 399 * @param report HID report. 400 * @param report_id Report id we are interested in. 401 * @return Highest button mentioned in the report. 402 * @retval 1 No button was mentioned. 403 * 404 */ 405 static size_t usb_mouse_get_highest_button(usb_hid_report_t *report, uint8_t report_id) 406 { 407 size_t highest_button = 0; 408 409 usb_hid_report_path_t *path = usb_hid_report_path(); 410 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_BUTTON, 0); 411 usb_hid_report_path_set_report_id(path, report_id); 412 413 usb_hid_report_field_t *field = NULL; 414 415 /* Break from within. */ 416 while (1) { 417 field = usb_hid_report_get_sibling( 418 report, field, path, 419 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 420 USB_HID_REPORT_TYPE_INPUT); 421 /* No more buttons? */ 422 if (field == NULL) { 423 break; 424 } 425 426 size_t current_button = field->usage - field->usage_minimum; 427 if (current_button > highest_button) { 428 highest_button = current_button; 429 } 430 } 431 432 usb_hid_report_path_free(path); 433 434 return highest_button; 435 } 436 /*----------------------------------------------------------------------------*/ 398 437 int usb_mouse_init(usb_hid_dev_t *hid_dev, void **data) 399 438 { 400 439 usb_log_debug("Initializing HID/Mouse structure...\n"); 401 440 402 441 if (hid_dev == NULL) { 403 442 usb_log_error("Failed to init keyboard structure: no structure" … … 405 444 return EINVAL; 406 445 } 407 408 usb_mouse_t *mouse_dev = usb_mouse_new();446 447 usb_mouse_t *mouse_dev = calloc(1, sizeof(usb_mouse_t)); 409 448 if (mouse_dev == NULL) { 410 449 usb_log_error("Error while creating USB/HID Mouse device " … … 412 451 return ENOMEM; 413 452 } 414 415 mouse_dev->buttons = (int32_t *)calloc(USB_MOUSE_BUTTON_COUNT, 416 sizeof(int32_t)); 417 453 454 // FIXME: This may not be optimal since stupid hardware vendor may 455 // use buttons 1, 2, 3 and 6000 and we would allocate array of 456 // 6001*4B and use only 4 items in it. 457 // Since I doubt that hardware producers would do that, I think 458 // that the current solution is good enough. 459 /* Adding 1 because we will be accessing buttons[highest]. */ 460 mouse_dev->buttons_count = 1 + usb_mouse_get_highest_button( 461 &hid_dev->report, hid_dev->report_id); 462 mouse_dev->buttons = calloc(mouse_dev->buttons_count, sizeof(int32_t)); 463 418 464 if (mouse_dev->buttons == NULL) { 419 usb_log_ fatal("No memory!\n");465 usb_log_error(NAME ": out of memory, giving up on device!\n"); 420 466 free(mouse_dev); 421 467 return ENOMEM; 422 468 } 423 424 // save the Mouse device structure into the HID device structure 425 *data = mouse_dev; 426 469 427 470 // set handler for incoming calls 428 471 mouse_dev->ops.default_handler = default_connection_handler; 429 472 430 473 // TODO: how to know if the device supports the request??? 431 usbhid_req_set_idle(&hid_dev->usb_dev->ctrl_pipe, 474 usbhid_req_set_idle(&hid_dev->usb_dev->ctrl_pipe, 432 475 hid_dev->usb_dev->interface_no, IDLE_RATE); 433 476 434 477 int rc = usb_mouse_create_function(hid_dev, mouse_dev); 435 478 if (rc != EOK) { 436 usb_mouse_destroy(mouse_dev); 437 return rc; 438 } 439 479 free(mouse_dev->buttons); 480 free(mouse_dev); 481 return rc; 482 } 483 484 /* Save the Mouse device structure into the HID device structure. */ 485 *data = mouse_dev; 486 440 487 return EOK; 441 488 } 442 443 /*----------------------------------------------------------------------------*/ 444 489 /*----------------------------------------------------------------------------*/ 445 490 bool usb_mouse_polling_callback(usb_hid_dev_t *hid_dev, void *data) 446 491 { 447 492 if (hid_dev == NULL || data == NULL) { 448 usb_log_error( "Missing argument to the mouse polling callback."449 " \n");493 usb_log_error( 494 "Missing argument to the mouse polling callback.\n"); 450 495 return false; 451 496 } 452 453 usb_mouse_t *mouse_dev = (usb_mouse_t *)data;454 497 498 usb_mouse_t *mouse_dev = data; 499 455 500 return usb_mouse_process_report(hid_dev, mouse_dev); 456 501 } 457 458 /*----------------------------------------------------------------------------*/ 459 502 /*----------------------------------------------------------------------------*/ 460 503 void usb_mouse_deinit(usb_hid_dev_t *hid_dev, void *data) 461 504 { 462 if (data != NULL) { 463 usb_mouse_destroy((usb_mouse_t *)data); 464 } 465 } 466 467 /*----------------------------------------------------------------------------*/ 468 505 if (data == NULL) 506 return; 507 508 usb_mouse_t *mouse_dev = data; 509 510 /* Hangup session to the console */ 511 if (mouse_dev->mouse_sess != NULL) { 512 const int ret = async_hangup(mouse_dev->mouse_sess); 513 if (ret != EOK) 514 usb_log_warning("Failed to hang up mouse session: " 515 "%p, %s.\n", mouse_dev->mouse_sess, str_error(ret)); 516 } 517 518 if (mouse_dev->wheel_sess != NULL) { 519 const int ret = async_hangup(mouse_dev->wheel_sess); 520 if (ret != EOK) 521 usb_log_warning("Failed to hang up wheel session: " 522 "%p, %s.\n", mouse_dev->wheel_sess, str_error(ret)); 523 } 524 525 FUN_UNBIND_DESTROY(mouse_dev->mouse_fun); 526 FUN_UNBIND_DESTROY(mouse_dev->wheel_fun); 527 528 free(mouse_dev->buttons); 529 free(mouse_dev); 530 } 531 /*----------------------------------------------------------------------------*/ 469 532 int usb_mouse_set_boot_protocol(usb_hid_dev_t *hid_dev) 470 533 { 471 int rc = usb_hid_parse_report_descriptor( hid_dev->report,472 USB_MOUSE_BOOT_REPORT_DESCRIPTOR,473 USB_MOUSE_BOOT_REPORT_DESCRIPTOR_SIZE);474 534 int rc = usb_hid_parse_report_descriptor( 535 &hid_dev->report, USB_MOUSE_BOOT_REPORT_DESCRIPTOR, 536 sizeof(USB_MOUSE_BOOT_REPORT_DESCRIPTOR)); 537 475 538 if (rc != EOK) { 476 539 usb_log_error("Failed to parse boot report descriptor: %s\n", … … 478 541 return rc; 479 542 } 480 481 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 543 544 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 482 545 hid_dev->usb_dev->interface_no, USB_HID_PROTOCOL_BOOT); 483 546 484 547 if (rc != EOK) { 485 548 usb_log_warning("Failed to set boot protocol to the device: " … … 487 550 return rc; 488 551 } 489 552 490 553 return EOK; 491 554 }
Note:
See TracChangeset
for help on using the changeset viewer.