Changeset 1d1bb0f in mainline for uspace/drv/usbhid/kbd/kbddev.c


Ignore:
Timestamp:
2011-06-19T13:38:37Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
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.
Message:

Merge from https://code.launchpad.net/~vojtech-horky/helenos/usb

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbhid/kbd/kbddev.c

    radfdbd5 r1d1bb0f  
    4646#include <fibril.h>
    4747#include <fibril_synch.h>
     48
     49#include <ddf/log.h>
    4850
    4951#include <usb/usb.h>
     
    317319}
    318320
     321static 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
    319332/*----------------------------------------------------------------------------*/
    320333/**
     
    337350{
    338351        unsigned int key;
    339         unsigned int i, j;
     352        size_t i;
    340353       
    341354        /*
     
    347360         * whole input report.
    348361         */
    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");
    356366                return;
    357367        }
    358368       
    359369        /*
    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);
    373380                        if (!usb_kbd_is_lock(key)) {
    374381                                usb_kbd_repeat_stop(kbd_dev, key);
    375382                        }
    376383                        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
    385391         */
    386392        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) {
    396399                        key = usbhid_parse_scancode(kbd_dev->keys[i]);
    397                         usb_log_debug2("Key pressed: %d (keycode: %d)\n", key,
    398                             kbd_dev->keys[i]);
    399400                        if (!usb_kbd_is_lock(key)) {
    400401                                usb_kbd_repeat_start(kbd_dev, key);
    401402                        }
    402403                        usb_kbd_push_ev(hid_dev, kbd_dev, KEY_PRESS, key);
    403                 } else {
    404                         // found, nothing happens
     404                        usb_log_debug2("Key pressed: %u "
     405                            "(USB code %" PRIu32 ")\n", key, new_key);
    405406                }
    406407        }
     
    408409        memcpy(kbd_dev->keys_old, kbd_dev->keys, kbd_dev->key_count * 4);
    409410       
    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);
    415415}
    416416
     
    434434 *     usb_hid_parse_report().
    435435 */
    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)
     436static void usb_kbd_process_data(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev)
    438437{
    439438        assert(hid_dev->report != NULL);
    440439        assert(hid_dev != NULL);
    441440        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));
    445441       
    446442        usb_hid_report_path_t *path = usb_hid_report_path();
    447443        usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0);
    448444
    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);
    459446       
    460447        // fill in the currently pressed keys
     
    756743/*----------------------------------------------------------------------------*/
    757744
    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) {
     745bool usb_kbd_polling_callback(usb_hid_dev_t *hid_dev, void *data)
     746{
     747        if (hid_dev == NULL/* || buffer == NULL*/ || data == NULL) {
    762748                // do not continue polling (???)
    763749                return false;
     
    768754       
    769755        // 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);
    771757       
    772758        return true;
     
    804790        if ((*kbd_dev)->repeat_mtx != NULL) {
    805791                //assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx));
     792                // FIXME - the fibril_mutex_is_locked may not cause
     793                // fibril scheduling
    806794                while (fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)) {}
    807795                free((*kbd_dev)->repeat_mtx);
Note: See TracChangeset for help on using the changeset viewer.