Changes in / [11658b64:82122f3] in mainline


Ignore:
Location:
uspace
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbkbd/Makefile

    r11658b64 r82122f3  
    3333
    3434SOURCES = \
    35         main.c
     35        main.c \
     36        descparser.c
    3637
    3738include $(USPACE_PREFIX)/Makefile.common
  • uspace/drv/usbkbd/main.c

    r11658b64 r82122f3  
    3535#include <usb/devreq.h>
    3636#include <usb/descriptor.h>
     37#include "descparser.h"
    3738
    3839#define BUFFER_SIZE 32
     
    4748                                    void *arg)
    4849{
    49 
     50        printf("Got keys: ");
     51        unsigned i;
     52        for (i = 0; i < count; ++i) {
     53                printf("%d ", key_codes[i]);
     54        }
     55        printf("\n");
    5056}
    5157
     
    5359 * Kbd functions
    5460 */
    55 static int usbkbd_parse_descriptors(usb_hid_dev_kbd_t *kbd_dev,
    56                                     const uint8_t *data, size_t size)
    57 {
    58 //      const uint8_t *pos = data;
    59        
    60 //      // get the configuration descriptor (should be first)
    61 //      if (*pos != sizeof(usb_standard_configuration_descriptor_t)
    62 //          || *(pos + 1) != USB_DESCTYPE_CONFIGURATION) {
    63 //              fprintf(stderr, "Wrong format of configuration descriptor");
    64 //              return EINVAL;
    65 //      }
    66        
    67 //      usb_standard_configuration_descriptor_t config_descriptor;
    68 //      memcpy(&config_descriptor, pos,
    69 //          sizeof(usb_standard_configuration_descriptor_t));
    70 //      pos += sizeof(usb_standard_configuration_descriptor_t);
    71        
    72 //      // parse other descriptors
    73 //      while (pos - data < size) {
    74 //              //uint8_t desc_size = *pos;
    75 //              uint8_t desc_type = *(pos + 1);
    76 //              switch (desc_type) {
    77 //              case USB_DESCTYPE_INTERFACE:
    78 //                      break;
    79 //              case USB_DESCTYPE_ENDPOINT:
    80 //                      break;
    81 //              case USB_DESCTYPE_HID:
    82 //                      break;
    83 //              case USB_DESCTYPE_HID_REPORT:
    84 //                      break;
    85 //              case USB_DESCTYPE_HID_PHYSICAL:
    86 //                      break;
    87 //              }
    88 //      }
    89        
    90         return EOK;
    91 }
    92 
    93 static int usbkbd_get_descriptors(usb_hid_dev_kbd_t *kbd_dev)
    94 {
    95         // get the first configuration descriptor (TODO: or some other??)
     61static int usbkbd_process_descriptors(usb_hid_dev_kbd_t *kbd_dev)
     62{
     63        // get the first configuration descriptor (TODO: parse also other!)
    9664        usb_standard_configuration_descriptor_t config_desc;
    9765       
     
    12290        }
    12391       
    124         rc = usbkbd_parse_descriptors(kbd_dev, descriptors, transferred);
     92        kbd_dev->conf = (usb_hid_configuration_t *)calloc(1,
     93            sizeof(usb_hid_configuration_t));
     94        if (kbd_dev->conf == NULL) {
     95                free(descriptors);
     96                return ENOMEM;
     97        }
     98       
     99        rc = usbkbd_parse_descriptors(descriptors, transferred, kbd_dev->conf);
    125100        free(descriptors);
    126101       
     
    130105static usb_hid_dev_kbd_t *usbkbd_init_device(device_t *dev)
    131106{
    132         usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)malloc(
    133                         sizeof(usb_hid_dev_kbd_t));
     107        usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)calloc(1,
     108            sizeof(usb_hid_dev_kbd_t));
    134109
    135110        if (kbd_dev == NULL) {
     
    164139         */
    165140
    166         // TODO: get descriptors
    167         usbkbd_get_descriptors(kbd_dev);
    168         // TODO: parse descriptors and save endpoints
     141        // TODO: get descriptors, parse descriptors and save endpoints
     142        usbkbd_process_descriptors(kbd_dev);
    169143
    170144        return kbd_dev;
  • uspace/lib/usb/include/usb/classes/hid.h

    r11658b64 r82122f3  
    3939#include <driver.h>
    4040#include <usb/classes/hidparser.h>
     41#include <usb/descriptor.h>
    4142
    4243/** USB/HID device requests. */
     
    6364 */
    6465typedef struct {
    65         /** Type of class descriptor (Report or Physical). */
    66         uint8_t class_descriptor_type;
    67         /** Length of class descriptor. */
    68         uint16_t class_descriptor_length;
    69 } __attribute__ ((packed)) usb_standard_hid_descriptor_class_item_t;
     66        /** Type of class-specific descriptor (Report or Physical). */
     67        uint8_t type;
     68        /** Length of class-specific descriptor in bytes. */
     69        uint16_t length;
     70} __attribute__ ((packed)) usb_standard_hid_class_descriptor_info_t;
    7071
    7172/** Standard USB HID descriptor.
     
    7374 * (See HID Specification, p.22)
    7475 *
    75  * It is actually only the "header" of the descriptor, as it may have arbitrary
    76  * length if more than one class descritor is provided.
     76 * It is actually only the "header" of the descriptor, it does not contain
     77 * the last two mandatory fields (type and length of the first class-specific
     78 * descriptor).
    7779 */
    7880typedef struct {
    79         /** Size of this descriptor in bytes. */
     81        /** Total size of this descriptor in bytes.
     82         *
     83         * This includes all class-specific descriptor info - type + length
     84         * for each descriptor.
     85         */
    8086        uint8_t length;
    8187        /** Descriptor type (USB_DESCTYPE_HID). */
     
    8591        /** Country code of localized hardware. */
    8692        uint8_t country_code;
    87         /** Total number of class (i.e. Report and Physical) descriptors. */
    88         uint8_t class_count;
    89         /** First mandatory class descriptor info. */
    90         usb_standard_hid_descriptor_class_item_t class_descriptor;
     93        /** Total number of class-specific (i.e. Report and Physical)
     94         * descriptors.
     95         */
     96        uint8_t class_desc_count;
     97//      /** First mandatory class descriptor info. */
     98//      usb_standard_hid_descriptor_class_item_t class_descriptor;
    9199} __attribute__ ((packed)) usb_standard_hid_descriptor_t;
    92100
     101/**
     102 *
     103 */
     104typedef struct {
     105        usb_standard_interface_descriptor_t iface_desc;
     106        usb_standard_endpoint_descriptor_t *endpoints;
     107        usb_standard_hid_descriptor_t hid_desc;
     108        usb_standard_hid_class_descriptor_info_t *class_desc_info;
     109        uint8_t **class_descs;
     110} usb_hid_iface_t;
     111
     112/**
     113 *
     114 */
     115typedef struct {
     116        usb_standard_configuration_descriptor_t config_descriptor;
     117        usb_hid_iface_t *interfaces;
     118} usb_hid_configuration_t;
    93119
    94120/**
     
    99125typedef struct {
    100126        device_t *device;
     127        usb_hid_configuration_t *conf;
    101128        usb_address_t address;
    102129        usb_endpoint_t poll_endpoint;
Note: See TracChangeset for help on using the changeset viewer.