Changeset 74d6e90 in mainline for uspace/drv
- Timestamp:
- 2011-02-04T13:07:32Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 97e87de
- Parents:
- 621afdb (diff), ff244e6 (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/drv
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/descdump.h
r621afdb r74d6e90 37 37 #define USBHID_DESCDUMP_H_ 38 38 39 #include <usb/classes/hid.h>39 #include "hid.h" 40 40 41 41 void dump_standard_configuration_descriptor( -
uspace/drv/usbhid/descparser.h
r621afdb r74d6e90 37 37 #define USBHID_DESCPARSER_H_ 38 38 39 #include <usb/classes/hid.h>39 #include "hid.h" 40 40 41 41 int usbkbd_parse_descriptors(const uint8_t *data, size_t size, -
uspace/drv/usbhid/main.c
r621afdb r74d6e90 43 43 #include <io/console.h> 44 44 #include <errno.h> 45 #include <str_error.h> 45 46 #include <fibril.h> 46 47 #include <usb/classes/hid.h> … … 49 50 #include <usb/descriptor.h> 50 51 #include <io/console.h> 52 #include "hid.h" 51 53 #include "descparser.h" 52 54 #include "descdump.h" … … 379 381 if (rc < 0) { 380 382 printf("Problem setting phone to HC.\n"); 381 free(kbd_dev); 382 return NULL; 383 goto error_leave; 383 384 } 384 385 … … 386 387 if (rc < 0) { 387 388 printf("Problem getting address of the device.\n"); 388 free(kbd_dev); 389 return NULL; 389 goto error_leave; 390 390 } 391 391 … … 397 397 // } 398 398 399 // default endpoint400 kbd_dev->poll_endpoint = GUESSED_POLL_ENDPOINT;401 402 399 /* 403 400 * will need all descriptors: … … 410 407 usbkbd_process_descriptors(kbd_dev); 411 408 409 410 411 /* 412 * Initialize the backing connection to the host controller. 413 */ 414 rc = usb_device_connection_initialize_from_device(&kbd_dev->wire, dev); 415 if (rc != EOK) { 416 printf("Problem initializing connection to device: %s.\n", 417 str_error(rc)); 418 goto error_leave; 419 } 420 421 /* 422 * Initialize device pipes. 423 */ 424 rc = usb_endpoint_pipe_initialize(&kbd_dev->poll_pipe, &kbd_dev->wire, 425 GUESSED_POLL_ENDPOINT, USB_TRANSFER_INTERRUPT, USB_DIRECTION_IN); 426 if (rc != EOK) { 427 printf("Failed to initialize interrupt in pipe: %s.\n", 428 str_error(rc)); 429 goto error_leave; 430 } 431 432 412 433 return kbd_dev; 434 435 error_leave: 436 free(kbd_dev); 437 return NULL; 413 438 } 414 439 … … 435 460 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev) 436 461 { 437 int rc; 438 usb_handle_t handle; 462 int rc, sess_rc; 439 463 uint8_t buffer[BUFFER_SIZE]; 440 464 size_t actual_size; 441 //usb_endpoint_t poll_endpoint = 1;442 443 // usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone,444 // dev);445 // if (my_address < 0) {446 // return;447 // }448 449 usb_target_t poll_target = {450 .address = kbd_dev->address,451 .endpoint = kbd_dev->poll_endpoint452 };453 465 454 466 printf("Polling keyboard...\n"); … … 456 468 while (true) { 457 469 async_usleep(1000 * 1000 * 2); 458 rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone, 459 poll_target, buffer, BUFFER_SIZE, &actual_size, &handle); 470 471 sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->poll_pipe); 472 if (sess_rc != EOK) { 473 printf("Failed to start a session: %s.\n", 474 str_error(sess_rc)); 475 continue; 476 } 477 478 rc = usb_endpoint_pipe_read(&kbd_dev->poll_pipe, buffer, 479 BUFFER_SIZE, &actual_size); 480 sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->poll_pipe); 460 481 461 482 if (rc != EOK) { 462 printf("Error in usb_drv_async_interrupt_in(): %d\n", rc); 483 printf("Error polling the keyboard: %s.\n", 484 str_error(rc)); 463 485 continue; 464 486 } 465 487 466 rc = usb_drv_async_wait_for(handle);467 if (rc != EOK) {468 printf("Error in usb_drv_async_wait_for(): %d\n", rc);488 if (sess_rc != EOK) { 489 printf("Error closing session: %s.\n", 490 str_error(sess_rc)); 469 491 continue; 470 492 } -
uspace/drv/vhc/connhost.c
r621afdb r74d6e90 42 42 #include "hc.h" 43 43 44 44 45 typedef struct { 45 46 usb_direction_t direction; … … 47 48 usbhc_iface_transfer_in_callback_t in_callback; 48 49 device_t *dev; 50 size_t reported_size; 49 51 void *arg; 50 52 } transfer_info_t; 51 53 54 typedef struct { 55 usb_direction_t direction; 56 usb_target_t target; 57 usbhc_iface_transfer_out_callback_t out_callback; 58 usbhc_iface_transfer_in_callback_t in_callback; 59 device_t *dev; 60 void *arg; 61 void *data_buffer; 62 size_t data_buffer_size; 63 } control_transfer_info_t; 64 52 65 static void universal_callback(void *buffer, size_t size, 53 66 usb_transaction_outcome_t outcome, void *arg) 54 67 { 55 68 transfer_info_t *transfer = (transfer_info_t *) arg; 69 70 if (transfer->reported_size != (size_t) -1) { 71 size = transfer->reported_size; 72 } 56 73 57 74 switch (transfer->direction) { … … 84 101 transfer->arg = arg; 85 102 transfer->dev = dev; 103 transfer->reported_size = (size_t) -1; 104 105 return transfer; 106 } 107 108 static void control_abort_prematurely(control_transfer_info_t *transfer, 109 size_t size, usb_transaction_outcome_t outcome) 110 { 111 switch (transfer->direction) { 112 case USB_DIRECTION_IN: 113 transfer->in_callback(transfer->dev, 114 outcome, size, 115 transfer->arg); 116 break; 117 case USB_DIRECTION_OUT: 118 transfer->out_callback(transfer->dev, 119 outcome, 120 transfer->arg); 121 break; 122 default: 123 assert(false && "unreachable"); 124 break; 125 } 126 } 127 128 static void control_callback_two(void *buffer, size_t size, 129 usb_transaction_outcome_t outcome, void *arg) 130 { 131 control_transfer_info_t *ctrl_transfer = (control_transfer_info_t *) arg; 132 133 if (outcome != USB_OUTCOME_OK) { 134 control_abort_prematurely(ctrl_transfer, outcome, size); 135 free(ctrl_transfer); 136 return; 137 } 138 139 transfer_info_t *transfer = create_transfer_info(ctrl_transfer->dev, 140 ctrl_transfer->direction, ctrl_transfer->arg); 141 transfer->out_callback = ctrl_transfer->out_callback; 142 transfer->in_callback = ctrl_transfer->in_callback; 143 transfer->reported_size = size; 144 145 switch (ctrl_transfer->direction) { 146 case USB_DIRECTION_IN: 147 hc_add_transaction_to_device(false, ctrl_transfer->target, 148 USB_TRANSFER_CONTROL, 149 NULL, 0, 150 universal_callback, transfer); 151 break; 152 case USB_DIRECTION_OUT: 153 hc_add_transaction_from_device(ctrl_transfer->target, 154 USB_TRANSFER_CONTROL, 155 NULL, 0, 156 universal_callback, transfer); 157 break; 158 default: 159 assert(false && "unreachable"); 160 break; 161 } 162 163 free(ctrl_transfer); 164 } 165 166 static void control_callback_one(void *buffer, size_t size, 167 usb_transaction_outcome_t outcome, void *arg) 168 { 169 control_transfer_info_t *transfer = (control_transfer_info_t *) arg; 170 171 if (outcome != USB_OUTCOME_OK) { 172 control_abort_prematurely(transfer, outcome, size); 173 free(transfer); 174 return; 175 } 176 177 switch (transfer->direction) { 178 case USB_DIRECTION_IN: 179 hc_add_transaction_from_device(transfer->target, 180 USB_TRANSFER_CONTROL, 181 transfer->data_buffer, transfer->data_buffer_size, 182 control_callback_two, transfer); 183 break; 184 case USB_DIRECTION_OUT: 185 hc_add_transaction_to_device(false, transfer->target, 186 USB_TRANSFER_CONTROL, 187 transfer->data_buffer, transfer->data_buffer_size, 188 control_callback_two, transfer); 189 break; 190 default: 191 assert(false && "unreachable"); 192 break; 193 } 194 } 195 196 static control_transfer_info_t *create_control_transfer_info(device_t *dev, 197 usb_direction_t direction, usb_target_t target, 198 void *data_buffer, size_t data_buffer_size, 199 void *arg) 200 { 201 control_transfer_info_t *transfer 202 = malloc(sizeof(control_transfer_info_t)); 203 204 transfer->direction = direction; 205 transfer->target = target; 206 transfer->in_callback = NULL; 207 transfer->out_callback = NULL; 208 transfer->arg = arg; 209 transfer->dev = dev; 210 transfer->data_buffer = data_buffer; 211 transfer->data_buffer_size = data_buffer_size; 86 212 87 213 return transfer; … … 193 319 } 194 320 321 static int control_write(device_t *dev, usb_target_t target, 322 void *setup_packet, size_t setup_packet_size, 323 void *data, size_t data_size, 324 usbhc_iface_transfer_out_callback_t callback, void *arg) 325 { 326 control_transfer_info_t *transfer 327 = create_control_transfer_info(dev, USB_DIRECTION_OUT, target, 328 data, data_size, arg); 329 transfer->out_callback = callback; 330 331 hc_add_transaction_to_device(true, target, USB_TRANSFER_CONTROL, 332 setup_packet, setup_packet_size, 333 control_callback_one, transfer); 334 335 return EOK; 336 } 337 195 338 static int control_read_setup(device_t *dev, usb_target_t target, 196 339 void *data, size_t size, … … 217 360 NULL, 0, 218 361 callback, arg); 362 } 363 364 static int control_read(device_t *dev, usb_target_t target, 365 void *setup_packet, size_t setup_packet_size, 366 void *data, size_t data_size, 367 usbhc_iface_transfer_in_callback_t callback, void *arg) 368 { 369 control_transfer_info_t *transfer 370 = create_control_transfer_info(dev, USB_DIRECTION_IN, target, 371 data, data_size, arg); 372 transfer->in_callback = callback; 373 374 hc_add_transaction_to_device(true, target, USB_TRANSFER_CONTROL, 375 setup_packet, setup_packet_size, 376 control_callback_one, transfer); 377 378 return EOK; 219 379 } 220 380 … … 290 450 .control_write_status = control_write_status, 291 451 452 .control_write = control_write, 453 292 454 .control_read_setup = control_read_setup, 293 455 .control_read_data = control_read_data, 294 .control_read_status = control_read_status 456 .control_read_status = control_read_status, 457 458 .control_read = control_read 295 459 }; 296 460
Note:
See TracChangeset
for help on using the changeset viewer.