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


Ignore:
Timestamp:
2011-04-21T20:24:14Z (13 years ago)
Author:
Matej Klonfar <maklf@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c7c0984a
Parents:
e50cd7f
Message:

new hid report structure bug fixes

File:
1 edited

Legend:

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

    re50cd7f rcfbbe1d3  
    299299                return;
    300300        }
    301        
    302         unsigned i = 0;
    303        
     301               
    304302        /* Reset the LED data. */
    305303        memset(kbd_dev->led_data, 0, kbd_dev->led_output_size * sizeof(int32_t));
    306        
    307         if ((kbd_dev->mods & KM_NUM_LOCK) && (i < kbd_dev->led_output_size)) {
    308                 kbd_dev->led_data[i++] = USB_HID_LED_NUM_LOCK;
    309         }
    310        
    311         if ((kbd_dev->mods & KM_CAPS_LOCK) && (i < kbd_dev->led_output_size)) {
    312                 kbd_dev->led_data[i++] = USB_HID_LED_CAPS_LOCK;
    313         }
    314        
    315         if ((kbd_dev->mods & KM_SCROLL_LOCK)
    316             && (i < kbd_dev->led_output_size)) {
    317                 kbd_dev->led_data[i++] = USB_HID_LED_SCROLL_LOCK;
    318         }
    319 
    320         // TODO: COMPOSE and KANA
    321        
    322         usb_log_debug("Creating output report: %s\n", usb_debug_str_buffer ((uint8_t *)kbd_dev->led_data, kbd_dev->led_output_size * 4, 0));
    323 
    324         usb_hid_report_output_set_data(hid_dev->parser, kbd_dev->led_path,
    325                                        USB_HID_PATH_COMPARE_END , kbd_dev->led_data,
    326                                        kbd_dev->led_output_size);
     304        usb_log_debug("Creating output report:\n");
     305
     306        usb_hid_report_field_t *field = usb_hid_report_get_sibling (hid_dev->parser, NULL,
     307                kbd_dev->led_path,
     308                                USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY | USB_HID_PATH_COMPARE_END,
     309                                USB_HID_REPORT_TYPE_OUTPUT);
     310        while(field != NULL) {
     311
     312                if((field->usage == USB_HID_LED_NUM_LOCK) && (kbd_dev->mods & KM_NUM_LOCK)){
     313                        field->value = 1;
     314                }
     315
     316                if((field->usage == USB_HID_LED_CAPS_LOCK) && (kbd_dev->mods & KM_CAPS_LOCK)){
     317                        field->value = 1;
     318                }
     319
     320                if((field->usage == USB_HID_LED_SCROLL_LOCK) && (kbd_dev->mods & KM_SCROLL_LOCK)){
     321                        field->value = 1;
     322                }
     323               
     324                field = usb_hid_report_get_sibling (hid_dev->parser, field,
     325                kbd_dev->led_path,
     326                                USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY | USB_HID_PATH_COMPARE_END,
     327                                USB_HID_REPORT_TYPE_OUTPUT);
     328        }
     329               
    327330        int rc = usb_hid_report_output_translate(hid_dev->parser, 0,
    328331            kbd_dev->output_buffer, kbd_dev->output_size);
     
    648651        usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0);
    649652        //usb_hid_report_path_set_report_id(path, 0);
    650        
    651         int rc = usb_hid_parse_report(hid_dev->parser, buffer, actual_size);   
     653
     654        uint8_t report_id;
     655        int rc = usb_hid_parse_report(hid_dev->parser, buffer, actual_size, &report_id);       
     656        usb_hid_report_path_set_report_id (path, report_id);
    652657        usb_hid_report_field_t *field = usb_hid_report_get_sibling(hid_dev->parser,
    653658                            NULL, path, USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
    654659                                                USB_HID_REPORT_TYPE_INPUT);
    655        
     660
     661        unsigned i=0;
     662        usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data;
     663
     664        memset(kbd_dev->keys, 0, kbd_dev->key_count);
    656665        while(field != NULL) {
    657                 usb_log_debug("FIELD (%X) - VALUE(%X) USAGE(%X)\n", field, field->value, field->usage);
     666                if((i < kbd_dev->key_count) && (field->value != 0)){
     667                        kbd_dev->keys[i++] = (uint8_t)field->usage;
     668                }
    658669                field = usb_hid_report_get_sibling(hid_dev->parser, field, path,
    659670                                                   USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
    660671                                                   USB_HID_REPORT_TYPE_INPUT);
    661672        }
    662                
     673        usb_kbd_process_keycodes(kbd_dev->keys, kbd_dev->key_count, report_id, hid_dev);
    663674       
    664675        usb_hid_report_path_free(path);
Note: See TracChangeset for help on using the changeset viewer.