Changeset 1d1bb0f in mainline for uspace/drv/usbhid/kbd/kbddev.c
- Timestamp:
- 2011-06-19T13:38:37Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b72efe8
- Parents:
- adfdbd5 (diff), 9724d7f (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/kbd/kbddev.c
radfdbd5 r1d1bb0f 46 46 #include <fibril.h> 47 47 #include <fibril_synch.h> 48 49 #include <ddf/log.h> 48 50 49 51 #include <usb/usb.h> … … 317 319 } 318 320 321 static size_t find_in_array_int32(int32_t val, int32_t *arr, size_t arr_size) 322 { 323 for (size_t i = 0; i < arr_size; i++) { 324 if (arr[i] == val) { 325 return i; 326 } 327 } 328 329 return (size_t) -1; 330 } 331 319 332 /*----------------------------------------------------------------------------*/ 320 333 /** … … 337 350 { 338 351 unsigned int key; 339 unsigned int i, j;352 size_t i; 340 353 341 354 /* … … 347 360 * whole input report. 348 361 */ 349 i = 0; 350 while (i < kbd_dev->key_count && kbd_dev->keys[i] != ERROR_ROLLOVER) { 351 ++i; 352 } 353 if (i != kbd_dev->key_count) { 354 usb_log_debug("Phantom state occured.\n"); 355 // phantom state, do nothing 362 i = find_in_array_int32(ERROR_ROLLOVER, kbd_dev->keys, 363 kbd_dev->key_count); 364 if (i != (size_t) -1) { 365 usb_log_debug("Detected phantom state.\n"); 356 366 return; 357 367 } 358 368 359 369 /* 360 * 1) Key releases 361 */ 362 for (j = 0; j < kbd_dev->key_count; ++j) { 363 // try to find the old key in the new key list 364 i = 0; 365 while (i < kbd_dev->key_count 366 && kbd_dev->keys[i] != kbd_dev->keys_old[j]) { 367 ++i; 368 } 369 370 if (i == kbd_dev->key_count) { 371 // not found, i.e. the key was released 372 key = usbhid_parse_scancode(kbd_dev->keys_old[j]); 370 * Key releases 371 */ 372 for (i = 0; i < kbd_dev->key_count; i++) { 373 int32_t old_key = kbd_dev->keys_old[i]; 374 /* Find the old key among currently pressed keys. */ 375 size_t pos = find_in_array_int32(old_key, kbd_dev->keys, 376 kbd_dev->key_count); 377 /* If the key was not found, we need to signal release. */ 378 if (pos == (size_t) -1) { 379 key = usbhid_parse_scancode(old_key); 373 380 if (!usb_kbd_is_lock(key)) { 374 381 usb_kbd_repeat_stop(kbd_dev, key); 375 382 } 376 383 usb_kbd_push_ev(hid_dev, kbd_dev, KEY_RELEASE, key); 377 usb_log_debug2("Key released: %d\n", key); 378 } else { 379 // found, nothing happens 380 } 381 } 382 383 /* 384 * 1) Key presses 384 usb_log_debug2("Key released: %u " 385 "(USB code %" PRIu32 ")\n", key, old_key); 386 } 387 } 388 389 /* 390 * Key presses 385 391 */ 386 392 for (i = 0; i < kbd_dev->key_count; ++i) { 387 // try to find the new key in the old key list 388 j = 0; 389 while (j < kbd_dev->key_count 390 && kbd_dev->keys_old[j] != kbd_dev->keys[i]) { 391 ++j; 392 } 393 394 if (j == kbd_dev->key_count) { 395 // not found, i.e. new key pressed 393 int32_t new_key = kbd_dev->keys[i]; 394 /* Find the new key among already pressed keys. */ 395 size_t pos = find_in_array_int32(new_key, kbd_dev->keys_old, 396 kbd_dev->key_count); 397 /* If the key was not found, we need to signal press. */ 398 if (pos == (size_t) -1) { 396 399 key = usbhid_parse_scancode(kbd_dev->keys[i]); 397 usb_log_debug2("Key pressed: %d (keycode: %d)\n", key,398 kbd_dev->keys[i]);399 400 if (!usb_kbd_is_lock(key)) { 400 401 usb_kbd_repeat_start(kbd_dev, key); 401 402 } 402 403 usb_kbd_push_ev(hid_dev, kbd_dev, KEY_PRESS, key); 403 } else {404 // found, nothing happens404 usb_log_debug2("Key pressed: %u " 405 "(USB code %" PRIu32 ")\n", key, new_key); 405 406 } 406 407 } … … 408 409 memcpy(kbd_dev->keys_old, kbd_dev->keys, kbd_dev->key_count * 4); 409 410 410 usb_log_debug2("New stored keys: "); 411 for (i = 0; i < kbd_dev->key_count; ++i) { 412 usb_log_debug2("%d ", kbd_dev->keys_old[i]); 413 } 414 usb_log_debug2("\n"); 411 char key_buffer[512]; 412 ddf_dump_buffer(key_buffer, 512, 413 kbd_dev->keys_old, 4, kbd_dev->key_count, 0); 414 usb_log_debug2("Stored keys %s.\n", key_buffer); 415 415 } 416 416 … … 434 434 * usb_hid_parse_report(). 435 435 */ 436 static void usb_kbd_process_data(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev, 437 uint8_t *buffer, size_t actual_size) 436 static void usb_kbd_process_data(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev) 438 437 { 439 438 assert(hid_dev->report != NULL); 440 439 assert(hid_dev != NULL); 441 440 assert(kbd_dev != NULL); 442 443 usb_log_debug("Calling usb_hid_parse_report() with "444 "buffer %s\n", usb_debug_str_buffer(buffer, actual_size, 0));445 441 446 442 usb_hid_report_path_t *path = usb_hid_report_path(); 447 443 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0); 448 444 449 uint8_t report_id; 450 int rc = usb_hid_parse_report(hid_dev->report, buffer, actual_size, 451 &report_id); 452 453 if (rc != EOK) { 454 usb_log_warning("Error in usb_hid_parse_report():" 455 "%s\n", str_error(rc)); 456 } 457 458 usb_hid_report_path_set_report_id (path, report_id); 445 usb_hid_report_path_set_report_id (path, hid_dev->report_id); 459 446 460 447 // fill in the currently pressed keys … … 756 743 /*----------------------------------------------------------------------------*/ 757 744 758 bool usb_kbd_polling_callback(usb_hid_dev_t *hid_dev, void *data, 759 uint8_t *buffer, size_t buffer_size) 760 { 761 if (hid_dev == NULL || buffer == NULL || data == NULL) { 745 bool usb_kbd_polling_callback(usb_hid_dev_t *hid_dev, void *data) 746 { 747 if (hid_dev == NULL/* || buffer == NULL*/ || data == NULL) { 762 748 // do not continue polling (???) 763 749 return false; … … 768 754 769 755 // TODO: add return value from this function 770 usb_kbd_process_data(hid_dev, kbd_dev , buffer, buffer_size);756 usb_kbd_process_data(hid_dev, kbd_dev); 771 757 772 758 return true; … … 804 790 if ((*kbd_dev)->repeat_mtx != NULL) { 805 791 //assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)); 792 // FIXME - the fibril_mutex_is_locked may not cause 793 // fibril scheduling 806 794 while (fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)) {} 807 795 free((*kbd_dev)->repeat_mtx);
Note:
See TracChangeset
for help on using the changeset viewer.