Ignore:
File:
1 edited

Legend:

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

    rac8285d r2f593872  
    3838#include <str_error.h>
    3939#include <fibril.h>
     40#include <stdio.h>
    4041
    4142#include <io/keycode.h>
     
    6263static const size_t BOOTP_BUFFER_SIZE = 8;
    6364static const size_t BOOTP_BUFFER_OUT_SIZE = 1;
     65static const uint8_t BOOTP_ERROR_ROLLOVER = 1;
     66static const uint8_t IDLE_RATE = 0;
    6467
    6568/** Keyboard polling endpoint description for boot protocol class. */
     
    149152        uint8_t buffer[BOOTP_BUFFER_OUT_SIZE];
    150153        int rc= 0;
    151         unsigned i;
    152154       
    153155        memset(buffer, 0, BOOTP_BUFFER_OUT_SIZE);
     
    177179        }
    178180       
    179         // TODO: REFACTOR!!!
    180        
    181         usb_log_debug("Output report buffer: ");
    182         for (i = 0; i < BOOTP_BUFFER_OUT_SIZE; ++i) {
    183                 usb_log_debug("0x%x ", buffer[i]);
    184         }
    185         usb_log_debug("\n");
    186        
    187         uint16_t value = 0;
    188         value |= (USB_HID_REPORT_TYPE_OUTPUT << 8);
    189 
     181        usb_log_debug("Output report buffer: %s\n",
     182            usb_debug_str_buffer(buffer, BOOTP_BUFFER_OUT_SIZE, 0));
     183       
    190184        assert(kbd_dev->hid_dev != NULL);
    191185        assert(kbd_dev->hid_dev->initialized);
    192         usbhid_req_set_report(kbd_dev->hid_dev, value, buffer,
    193             BOOTP_BUFFER_OUT_SIZE);
     186        usbhid_req_set_report(kbd_dev->hid_dev, USB_HID_REPORT_TYPE_OUTPUT,
     187            buffer, BOOTP_BUFFER_OUT_SIZE);
    194188}
    195189
     
    228222
    229223        if (mod_mask != 0) {
    230                 usb_log_debug2("\n\nChanging mods and lock keys\n");
    231                 usb_log_debug2("\nmods before: 0x%x\n", kbd_dev->mods);
    232                 usb_log_debug2("\nLock keys before:0x%x\n\n",
    233                     kbd_dev->lock_keys);
    234                
    235224                if (type == KEY_PRESS) {
    236                         usb_log_debug2("\nKey pressed.\n");
    237225                        /*
    238226                         * Only change lock state on transition from released
     
    247235                        usbhid_kbd_set_led(kbd_dev);
    248236                } else {
    249                         usb_log_debug2("\nKey released.\n");
    250237                        kbd_dev->lock_keys = kbd_dev->lock_keys & ~mod_mask;
    251238                }
    252239        }
    253240
    254         usb_log_debug2("\n\nmods after: 0x%x\n", kbd_dev->mods);
    255         usb_log_debug2("\nLock keys after: 0x%x\n\n", kbd_dev->lock_keys);
    256        
    257241        if (key == KC_CAPS_LOCK || key == KC_NUM_LOCK || key == KC_SCROLL_LOCK) {
    258242                // do not send anything to the console, this is our business
     
    281265        ev.key = key;
    282266        ev.mods = kbd_dev->mods;
    283        
    284         if (ev.mods & KM_NUM_LOCK) {
    285                 usb_log_debug("\n\nNum Lock turned on.\n\n");
    286         }
    287267
    288268        ev.c = layout[active_layout]->parse_ev(&ev);
    289269
    290270        usb_log_debug2("Sending key %d to the console\n", ev.key);
    291         assert(kbd_dev->console_phone != -1);
     271        if (kbd_dev->console_phone < 0) {
     272                usb_log_warning(
     273                    "Connection to console not ready, key discarded.\n");
     274                return;
     275        }
    292276       
    293277        async_msg_4(kbd_dev->console_phone, KBD_EVENT, ev.type, ev.key,
     
    336320    const uint8_t *key_codes)
    337321{
    338         // TODO: phantom state!!
    339        
    340322        unsigned int key;
    341323        unsigned int i, j;
     324       
     325        /*
     326         * First of all, check if the kbd have reported phantom state.
     327         */
     328        i = 0;
     329        // all fields should report Error Rollover
     330        while (i < kbd_dev->keycode_count &&
     331            key_codes[i] == BOOTP_ERROR_ROLLOVER) {
     332                ++i;
     333        }
     334        if (i == kbd_dev->keycode_count) {
     335                usb_log_debug("Phantom state occured.\n");
     336                // phantom state, do nothing
     337                return;
     338        }
    342339       
    343340        // TODO: quite dummy right now, think of better implementation
     
    358355                        key = usbhid_parse_scancode(kbd_dev->keycodes[j]);
    359356                        usbhid_kbd_push_ev(kbd_dev, KEY_RELEASE, key);
    360                         usb_log_debug2("\nKey released: %d\n", key);
     357                        usb_log_debug2("Key released: %d\n", key);
    361358                } else {
    362359                        // found, nothing happens
     
    378375                        // not found, i.e. new key pressed
    379376                        key = usbhid_parse_scancode(key_codes[i]);
    380                         usb_log_debug2("\nKey pressed: %d (keycode: %d)\n", key,
     377                        usb_log_debug2("Key pressed: %d (keycode: %d)\n", key,
    381378                            key_codes[i]);
    382379                        usbhid_kbd_push_ev(kbd_dev, KEY_PRESS, key);
     
    385382                }
    386383        }
     384//      // report all currently pressed keys
     385//      for (i = 0; i < kbd_dev->keycode_count; ++i) {
     386//              if (key_codes[i] != 0) {
     387//                      key = usbhid_parse_scancode(key_codes[i]);
     388//                      usb_log_debug2("Key pressed: %d (keycode: %d)\n", key,
     389//                          key_codes[i]);
     390//                      usbhid_kbd_push_ev(kbd_dev, KEY_PRESS, key);
     391//              }
     392//      }
    387393       
    388394        memcpy(kbd_dev->keycodes, key_codes, kbd_dev->keycode_count);
    389        
    390         usb_log_debug2("\nNew stored keycodes: ");
    391         for (i = 0; i < kbd_dev->keycode_count; ++i) {
    392                 usb_log_debug2("%d ", kbd_dev->keycodes[i]);
    393         }
     395
     396        usb_log_debug("New stored keycodes: %s\n",
     397            usb_debug_str_buffer(kbd_dev->keycodes, kbd_dev->keycode_count, 0));
    394398}
    395399
     
    406410                return;
    407411        }
    408 
    409         usb_log_debug2("Got keys from parser: ");
    410         unsigned i;
    411         for (i = 0; i < count; ++i) {
    412                 usb_log_debug2("%d ", key_codes[i]);
    413         }
    414         usb_log_debug2("\n");
    415412       
    416413        usbhid_kbd_t *kbd_dev = (usbhid_kbd_t *)arg;
    417414        assert(kbd_dev != NULL);
     415
     416        usb_log_debug("Got keys from parser: %s\n",
     417            usb_debug_str_buffer(key_codes, kbd_dev->keycode_count, 0));
    418418       
    419419        if (count != kbd_dev->keycode_count) {
     
    440440        callbacks->keyboard = usbhid_kbd_process_keycodes;
    441441
    442         //usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks,
    443         //    NULL);
    444         /*usb_log_debug2("Calling usb_hid_boot_keyboard_input_report() with size"
    445             " %zu\n", actual_size);*/
    446         //dump_buffer("bufffer: ", buffer, actual_size);
    447        
    448         int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size,
    449             callbacks, kbd_dev);
     442        usb_log_debug("Calling usb_hid_parse_report() with "
     443            "buffer %s\n", usb_debug_str_buffer(buffer, actual_size, 0));
     444       
     445//      int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size,
     446//          callbacks, kbd_dev);
     447        int rc = usb_hid_parse_report(kbd_dev->hid_dev->parser, buffer,
     448            actual_size, callbacks, kbd_dev);
    450449       
    451450        if (rc != EOK) {
     
    499498        }
    500499       
     500        usb_hid_free_report_parser((*kbd_dev)->parser);
     501       
    501502        free(*kbd_dev);
    502503        *kbd_dev = NULL;
     
    555556         * Set boot protocol.
    556557         * Set LEDs according to initial setup.
     558         * Set Idle rate
    557559         */
    558560        assert(kbd_dev->hid_dev != NULL);
    559561        assert(kbd_dev->hid_dev->initialized);
    560         usbhid_req_set_protocol(kbd_dev->hid_dev, USB_HID_PROTOCOL_BOOT);
     562        //usbhid_req_set_protocol(kbd_dev->hid_dev, USB_HID_PROTOCOL_BOOT);
    561563       
    562564        usbhid_kbd_set_led(kbd_dev);
     565       
     566        usbhid_req_set_idle(kbd_dev->hid_dev, IDLE_RATE);
    563567       
    564568        kbd_dev->initialized = 1;
     
    589593
    590594        while (true) {
    591                 async_usleep(1000 * 10);
    592 
    593595                sess_rc = usb_endpoint_pipe_start_session(
    594596                    &kbd_dev->hid_dev->poll_pipe);
     
    631633                usb_log_debug("Calling usbhid_kbd_process_data()\n");
    632634                usbhid_kbd_process_data(kbd_dev, buffer, actual_size);
     635               
     636                // disabled for now, no reason to sleep
     637                //async_usleep(kbd_dev->hid_dev->poll_interval);
    633638        }
    634639
Note: See TracChangeset for help on using the changeset viewer.