172
172
VHC_DATA(vhc, fun);
174
endpoint_t *ep = usb_endpoint_manager_get_ep(&vhc->ep_manager,
175
address, endpoint, direction, NULL);
180
174
int rc = usb_endpoint_manager_unregister_ep(&vhc->ep_manager,
181
175
address, endpoint, direction);
186
180
/** Schedule interrupt out transfer.
188
182
* The callback is supposed to be called once the transfer (on the wire) is
410
static int usb_read(ddf_fun_t *fun, usb_target_t target, uint64_t setup_buffer,
411
uint8_t *data_buffer, size_t data_buffer_size,
412
usbhc_iface_transfer_in_callback_t callback, void *arg)
416
endpoint_t *ep = usb_endpoint_manager_get_ep(&vhc->ep_manager,
417
target.address, target.endpoint, USB_DIRECTION_IN, NULL);
421
const usb_transfer_type_t transfer_type = ep->transfer_type;
424
vhc_transfer_t *transfer = vhc_transfer_create(target.address,
425
target.endpoint, USB_DIRECTION_IN, transfer_type,
427
if (transfer == NULL) {
430
if (transfer_type == USB_TRANSFER_CONTROL) {
431
transfer->setup_buffer = malloc(sizeof(uint64_t));
432
assert(transfer->setup_buffer);
433
memcpy(transfer->setup_buffer, &setup_buffer, sizeof(uint64_t));
434
transfer->setup_buffer_size = sizeof(uint64_t);
436
transfer->data_buffer = data_buffer;
437
transfer->data_buffer_size = data_buffer_size;
438
transfer->callback_in = callback;
440
int rc = vhc_virtdev_add_transfer(vhc, transfer);
442
if (transfer->setup_buffer != NULL) {
443
free(transfer->setup_buffer);
452
static int usb_write(ddf_fun_t *fun, usb_target_t target, uint64_t setup_buffer,
453
const uint8_t *data_buffer, size_t data_buffer_size,
454
usbhc_iface_transfer_out_callback_t callback, void *arg)
458
endpoint_t *ep = usb_endpoint_manager_get_ep(&vhc->ep_manager,
459
target.address, target.endpoint, USB_DIRECTION_OUT, NULL);
463
const usb_transfer_type_t transfer_type = ep->transfer_type;
466
vhc_transfer_t *transfer = vhc_transfer_create(target.address,
467
target.endpoint, USB_DIRECTION_OUT, transfer_type,
469
if (transfer == NULL) {
472
if (transfer_type == USB_TRANSFER_CONTROL) {
473
transfer->setup_buffer = malloc(sizeof(uint64_t));
474
assert(transfer->setup_buffer);
475
memcpy(transfer->setup_buffer, &setup_buffer, sizeof(uint64_t));
476
transfer->setup_buffer_size = sizeof(uint64_t);
478
transfer->data_buffer = (void*)data_buffer;
479
transfer->data_buffer_size = data_buffer_size;
480
transfer->callback_out = callback;
482
int rc = vhc_virtdev_add_transfer(vhc, transfer);
484
free(transfer->setup_buffer);
416
492
static int tell_address(ddf_fun_t *fun, devman_handle_t handle,
417
493
usb_address_t *address)
459
535
.register_endpoint = register_endpoint,
460
536
.unregister_endpoint = unregister_endpoint,
462
.interrupt_out = interrupt_out,
463
.interrupt_in = interrupt_in,
466
.bulk_out = bulk_out,
468
.control_write = control_write,
469
.control_read = control_read
472
542
usb_iface_t vhc_usb_iface = {