Changes in uspace/drv/usbkbd/main.c [38c5dfa:45019865] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbkbd/main.c
r38c5dfa r45019865 38 38 #include <usb/devreq.h> 39 39 #include <usb/descriptor.h> 40 #include "descparser.h" 41 #include "descdump.h" 40 42 41 43 #define BUFFER_SIZE 32 … … 91 93 void *arg) 92 94 { 93 95 printf("Got keys: "); 96 unsigned i; 97 for (i = 0; i < count; ++i) { 98 printf("%d ", key_codes[i]); 99 } 100 printf("\n"); 94 101 } 95 102 … … 97 104 * Kbd functions 98 105 */ 99 static int usbkbd_parse_descriptors(usb_hid_dev_kbd_t *kbd_dev, 100 const uint8_t *data, size_t size) 101 { 102 // const uint8_t *pos = data; 103 104 // // get the configuration descriptor (should be first) 105 // if (*pos != sizeof(usb_standard_configuration_descriptor_t) 106 // || *(pos + 1) != USB_DESCTYPE_CONFIGURATION) { 107 // fprintf(stderr, "Wrong format of configuration descriptor"); 108 // return EINVAL; 109 // } 110 111 // usb_standard_configuration_descriptor_t config_descriptor; 112 // memcpy(&config_descriptor, pos, 113 // sizeof(usb_standard_configuration_descriptor_t)); 114 // pos += sizeof(usb_standard_configuration_descriptor_t); 115 116 // // parse other descriptors 117 // while (pos - data < size) { 118 // //uint8_t desc_size = *pos; 119 // uint8_t desc_type = *(pos + 1); 120 // switch (desc_type) { 121 // case USB_DESCTYPE_INTERFACE: 122 // break; 123 // case USB_DESCTYPE_ENDPOINT: 124 // break; 125 // case USB_DESCTYPE_HID: 126 // break; 127 // case USB_DESCTYPE_HID_REPORT: 128 // break; 129 // case USB_DESCTYPE_HID_PHYSICAL: 130 // break; 131 // } 132 // } 133 106 static int usbkbd_get_report_descriptor(usb_hid_dev_kbd_t *kbd_dev) 107 { 108 // iterate over all configurations and interfaces 109 // TODO: more configurations!! 110 unsigned i; 111 for (i = 0; i < kbd_dev->conf->config_descriptor.interface_count; ++i) { 112 // TODO: endianness 113 uint16_t length = 114 kbd_dev->conf->interfaces[i].hid_desc.report_desc_info.length; 115 size_t actual_size = 0; 116 117 // allocate space for the report descriptor 118 kbd_dev->conf->interfaces[i].report_desc = (uint8_t *)malloc(length); 119 120 // get the descriptor from the device 121 int rc = usb_drv_req_get_descriptor(kbd_dev->device->parent_phone, 122 kbd_dev->address, USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT, 123 0, i, kbd_dev->conf->interfaces[i].report_desc, length, 124 &actual_size); 125 126 if (rc != EOK) { 127 return rc; 128 } 129 130 assert(actual_size == length); 131 132 dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT, 133 kbd_dev->conf->interfaces[i].report_desc, length); 134 } 135 134 136 return EOK; 135 137 } 136 138 137 static int usbkbd_ get_descriptors(usb_hid_dev_kbd_t *kbd_dev)138 { 139 // get the first configuration descriptor (TODO: or some other??)139 static int usbkbd_process_descriptors(usb_hid_dev_kbd_t *kbd_dev) 140 { 141 // get the first configuration descriptor (TODO: parse also other!) 140 142 usb_standard_configuration_descriptor_t config_desc; 141 143 … … 166 168 } 167 169 168 rc = usbkbd_parse_descriptors(kbd_dev, descriptors, transferred); 170 kbd_dev->conf = (usb_hid_configuration_t *)calloc(1, 171 sizeof(usb_hid_configuration_t)); 172 if (kbd_dev->conf == NULL) { 173 free(descriptors); 174 return ENOMEM; 175 } 176 177 rc = usbkbd_parse_descriptors(descriptors, transferred, kbd_dev->conf); 169 178 free(descriptors); 170 171 return rc; 179 if (rc != EOK) { 180 printf("Problem with parsing standard descriptors.\n"); 181 return rc; 182 } 183 184 // get and report descriptors 185 rc = usbkbd_get_report_descriptor(kbd_dev); 186 if (rc != EOK) { 187 printf("Problem with parsing HID REPORT descriptor.\n"); 188 return rc; 189 } 190 191 usbkbd_print_config(kbd_dev->conf); 192 193 return EOK; 172 194 } 173 195 174 196 static usb_hid_dev_kbd_t *usbkbd_init_device(device_t *dev) 175 197 { 176 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *) malloc(177 198 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)calloc(1, 199 sizeof(usb_hid_dev_kbd_t)); 178 200 179 201 if (kbd_dev == NULL) { … … 208 230 */ 209 231 210 // TODO: get descriptors 211 usbkbd_get_descriptors(kbd_dev); 212 // TODO: parse descriptors and save endpoints 232 // TODO: get descriptors, parse descriptors and save endpoints 233 usbkbd_process_descriptors(kbd_dev); 213 234 214 235 return kbd_dev; … … 234 255 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev) 235 256 { 257 return; 258 236 259 int rc; 237 260 usb_handle_t handle;
Note:
See TracChangeset
for help on using the changeset viewer.