Changeset 1d7a74e in mainline
- Timestamp:
- 2011-01-14T14:31:58Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 192466bc, b65ca41d
- Parents:
- 2f60e57d (diff), 0a9ea4a (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. - Location:
- uspace
- Files:
-
- 4 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/virtusbkbd/virtusbkbd.c
r2f60e57d r1d7a74e 271 271 printf("%s: Simulating keyboard events...\n", NAME); 272 272 fibril_sleep(10); 273 while (1) {273 //while (1) { 274 274 kb_process_events(&status, keyboard_events, keyboard_events_count, 275 275 on_keyboard_change); 276 }276 //} 277 277 278 278 printf("%s: Terminating...\n", NAME); -
uspace/drv/usbhub/usbhub.c
r2f60e57d r1d7a74e 462 462 target.address = hub_info->usb_device->address; 463 463 target.endpoint = 1;/// \TODO get from endpoint descriptor 464 dprintf(1,"[usb_hub] checking changes for hub at addr %d",465 target.address); 464 /*dprintf(1,"[usb_hub] checking changes for hub at addr %d", 465 target.address);*/ 466 466 467 467 size_t port_count = hub_info->port_count; -
uspace/drv/usbkbd/Makefile
r2f60e57d r1d7a74e 33 33 34 34 SOURCES = \ 35 main.c 35 main.c \ 36 descparser.c \ 37 descdump.c 36 38 37 39 include $(USPACE_PREFIX)/Makefile.common -
uspace/drv/usbkbd/main.c
r2f60e57d r1d7a74e 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 … … 88 90 * Callbacks for parser 89 91 */ 90 static void usbkbd_process_keycodes(const uint16_t *key_codes, size_t count, 91 void *arg) 92 { 93 92 static void usbkbd_process_keycodes(const uint8_t *key_codes, size_t count, 93 uint8_t modifiers, void *arg) 94 { 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 /* 194 * TODO: 195 * 1) select one configuration (lets say the first) 196 * 2) how many interfaces?? how to select one?? 197 * ("The default setting for an interface is always alternate setting zero.") 198 * 3) find endpoint which is IN and INTERRUPT (parse), save its number 199 * as the endpoint for polling 200 */ 201 202 return EOK; 172 203 } 173 204 174 205 static usb_hid_dev_kbd_t *usbkbd_init_device(device_t *dev) 175 206 { 176 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *) malloc(177 207 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)calloc(1, 208 sizeof(usb_hid_dev_kbd_t)); 178 209 179 210 if (kbd_dev == NULL) { … … 186 217 // get phone to my HC and save it as my parent's phone 187 218 // TODO: maybe not a good idea if DDF will use parent_phone 188 kbd_dev->device->parent_phone = usb_drv_hc_connect_auto(dev, 0); 189 190 kbd_dev->address = usb_drv_get_my_address(dev->parent_phone, 191 dev); 219 int rc = kbd_dev->device->parent_phone = usb_drv_hc_connect_auto(dev, 0); 220 if (rc < 0) { 221 printf("Problem setting phone to HC.\n"); 222 free(kbd_dev); 223 return NULL; 224 } 225 226 rc = kbd_dev->address = usb_drv_get_my_address(dev->parent_phone, dev); 227 if (rc < 0) { 228 printf("Problem getting address of the device.\n"); 229 free(kbd_dev); 230 return NULL; 231 } 192 232 193 233 // doesn't matter now that we have no address … … 208 248 */ 209 249 210 // TODO: get descriptors 211 usbkbd_get_descriptors(kbd_dev); 212 // TODO: parse descriptors and save endpoints 250 // TODO: get descriptors, parse descriptors and save endpoints 251 usbkbd_process_descriptors(kbd_dev); 213 252 214 253 return kbd_dev; … … 218 257 uint8_t *buffer, size_t actual_size) 219 258 { 220 /*221 * here, the parser will be called, probably with some callbacks222 * now only take last 6 bytes and process, i.e. send to kbd223 */224 225 259 usb_hid_report_in_callbacks_t *callbacks = 226 260 (usb_hid_report_in_callbacks_t *)malloc( … … 228 262 callbacks->keyboard = usbkbd_process_keycodes; 229 263 230 usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks, 231 NULL); 264 //usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks, 265 // NULL); 266 printf("Calling usb_hid_boot_keyboard_input_report()...\n)"); 267 usb_hid_boot_keyboard_input_report(buffer, actual_size, callbacks, NULL); 232 268 } 233 269 234 270 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev) 235 271 { 272 return; 273 236 274 int rc; 237 275 usb_handle_t handle; -
uspace/drv/vhc/hcd.c
r2f60e57d r1d7a74e 116 116 sleep(5); 117 117 118 usb_dprintf_enable(NAME, 0);118 usb_dprintf_enable(NAME, -1); 119 119 120 120 printf(NAME ": virtual USB host controller driver.\n"); -
uspace/lib/usb/include/usb/classes/hid.h
r2f60e57d r1d7a74e 39 39 #include <driver.h> 40 40 #include <usb/classes/hidparser.h> 41 #include <usb/descriptor.h> 41 42 42 43 /** USB/HID device requests. */ … … 63 64 */ 64 65 typedef 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; 70 71 71 72 /** Standard USB HID descriptor. … … 73 74 * (See HID Specification, p.22) 74 75 * 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). 77 79 */ 78 80 typedef 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 */ 80 86 uint8_t length; 81 87 /** Descriptor type (USB_DESCTYPE_HID). */ … … 85 91 /** Country code of localized hardware. */ 86 92 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 * @note There is always only one Report descriptor. 97 */ 98 uint8_t class_desc_count; 99 /** First mandatory class descriptor (Report) info. */ 100 usb_standard_hid_class_descriptor_info_t report_desc_info; 91 101 } __attribute__ ((packed)) usb_standard_hid_descriptor_t; 92 102 103 /** 104 * 105 */ 106 typedef struct { 107 usb_standard_interface_descriptor_t iface_desc; 108 usb_standard_endpoint_descriptor_t *endpoints; 109 usb_standard_hid_descriptor_t hid_desc; 110 uint8_t *report_desc; 111 //usb_standard_hid_class_descriptor_info_t *class_desc_info; 112 //uint8_t **class_descs; 113 } usb_hid_iface_t; 114 115 /** 116 * 117 */ 118 typedef struct { 119 usb_standard_configuration_descriptor_t config_descriptor; 120 usb_hid_iface_t *interfaces; 121 } usb_hid_configuration_t; 93 122 94 123 /** … … 99 128 typedef struct { 100 129 device_t *device; 130 usb_hid_configuration_t *conf; 101 131 usb_address_t address; 102 132 usb_endpoint_t poll_endpoint; … … 104 134 } usb_hid_dev_kbd_t; 105 135 136 // TODO: more configurations! 137 106 138 #endif 107 139 /** -
uspace/srv/devman/main.c
r2f60e57d r1d7a74e 479 479 } 480 480 481 printf(NAME ": devman_forward: forward connection to device %s to "482 "driver %s.\n", dev->pathname, driver->name);481 // printf(NAME ": devman_forward: forward connection to device %s to " 482 // "driver %s.\n", dev->pathname, driver->name); 483 483 ipc_forward_fast(iid, driver->phone, method, dev->handle, 0, IPC_FF_NONE); 484 484 }
Note:
See TracChangeset
for help on using the changeset viewer.