diff options
Diffstat (limited to 'libusb/os/haiku_usb_raw.cpp')
-rw-r--r-- | libusb/os/haiku_usb_raw.cpp | 125 |
1 files changed, 53 insertions, 72 deletions
diff --git a/libusb/os/haiku_usb_raw.cpp b/libusb/os/haiku_usb_raw.cpp index 77adbd1..bce706c 100644 --- a/libusb/os/haiku_usb_raw.cpp +++ b/libusb/os/haiku_usb_raw.cpp @@ -29,17 +29,22 @@ USBRoster gUsbRoster; int32 gInitCount = 0; +static int haiku_get_config_descriptor(struct libusb_device *, uint8_t, + void *, size_t); + static int haiku_init(struct libusb_context *ctx) { + UNUSED(ctx); if (atomic_add(&gInitCount, 1) == 0) return gUsbRoster.Start(); return LIBUSB_SUCCESS; } static void -haiku_exit(void) +haiku_exit(struct libusb_context *ctx) { + UNUSED(ctx); if (atomic_add(&gInitCount, -1) == 1) gUsbRoster.Stop(); } @@ -47,7 +52,7 @@ haiku_exit(void) static int haiku_open(struct libusb_device_handle *dev_handle) { - USBDevice *dev = *((USBDevice **)dev_handle->dev->os_priv); + USBDevice *dev = *((USBDevice **)usbi_get_device_priv(dev_handle->dev)); USBDeviceHandle *handle = new(std::nothrow) USBDeviceHandle(dev); if (handle == NULL) return LIBUSB_ERROR_NO_MEM; @@ -55,83 +60,79 @@ haiku_open(struct libusb_device_handle *dev_handle) delete handle; return LIBUSB_ERROR_NO_DEVICE; } - *((USBDeviceHandle **)dev_handle->os_priv) = handle; + *((USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle)) = handle; return LIBUSB_SUCCESS; } static void haiku_close(struct libusb_device_handle *dev_handle) { - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); + USBDeviceHandle **pHandle = (USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle); + USBDeviceHandle *handle = *pHandle; if (handle == NULL) return; delete handle; - *((USBDeviceHandle **)dev_handle->os_priv) = NULL; + *pHandle = NULL; } static int -haiku_get_device_descriptor(struct libusb_device *device, unsigned char *buffer, int *host_endian) +haiku_get_active_config_descriptor(struct libusb_device *device, void *buffer, size_t len) { - USBDevice *dev = *((USBDevice **)device->os_priv); - memcpy(buffer, dev->Descriptor(), DEVICE_DESC_LENGTH); - *host_endian = 0; - return LIBUSB_SUCCESS; -} - -static int -haiku_get_active_config_descriptor(struct libusb_device *device, unsigned char *buffer, size_t len, int *host_endian) -{ - USBDevice *dev = *((USBDevice **)device->os_priv); - const usb_configuration_descriptor *act_config = dev->ActiveConfiguration(); - if (len > act_config->total_length) - return LIBUSB_ERROR_OVERFLOW; - memcpy(buffer, act_config, len); - *host_endian = 0; - return LIBUSB_SUCCESS; + USBDevice *dev = *((USBDevice **)usbi_get_device_priv(device)); + return haiku_get_config_descriptor(device, dev->ActiveConfigurationIndex(), buffer, len); } static int -haiku_get_config_descriptor(struct libusb_device *device, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +haiku_get_config_descriptor(struct libusb_device *device, uint8_t config_index, void *buffer, size_t len) { - USBDevice *dev = *((USBDevice **)device->os_priv); + USBDevice *dev = *((USBDevice **)usbi_get_device_priv(device)); const usb_configuration_descriptor *config = dev->ConfigurationDescriptor(config_index); if (config == NULL) { usbi_err(DEVICE_CTX(device), "failed getting configuration descriptor"); - return LIBUSB_ERROR_INVALID_PARAM; + return LIBUSB_ERROR_IO; } - if (len > config->total_length) + if (len > config->total_length) { len = config->total_length; + } memcpy(buffer, config, len); - *host_endian = 0; return len; } static int haiku_set_configuration(struct libusb_device_handle *dev_handle, int config) { - USBDeviceHandle *handle= *((USBDeviceHandle **)dev_handle->os_priv); - return handle->SetConfiguration(config); + USBDeviceHandle *handle= *((USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle)); + if (config <= 0) + return LIBUSB_ERROR_NOT_SUPPORTED; // cannot unconfigure + return handle->SetConfiguration((uint8)config); } static int -haiku_claim_interface(struct libusb_device_handle *dev_handle, int interface_number) +haiku_claim_interface(struct libusb_device_handle *dev_handle, uint8_t interface_number) { - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); + USBDeviceHandle *handle = *((USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle)); return handle->ClaimInterface(interface_number); } static int -haiku_set_altsetting(struct libusb_device_handle *dev_handle, int interface_number, int altsetting) +haiku_set_altsetting(struct libusb_device_handle *dev_handle, uint8_t interface_number, uint8_t altsetting) { - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); + USBDeviceHandle *handle = *((USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle)); return handle->SetAltSetting(interface_number, altsetting); } static int -haiku_release_interface(struct libusb_device_handle *dev_handle, int interface_number) +haiku_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) { - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); - haiku_set_altsetting(dev_handle,interface_number, 0); + USBDeviceHandle *handle = *((USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle)); + return handle->ClearHalt(endpoint); +} + +static int +haiku_release_interface(struct libusb_device_handle *dev_handle, uint8_t interface_number) +{ + USBDeviceHandle *handle = *((USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle)); + haiku_set_altsetting(dev_handle, interface_number, 0); return handle->ReleaseInterface(interface_number); } @@ -139,7 +140,7 @@ static int haiku_submit_transfer(struct usbi_transfer *itransfer) { struct libusb_transfer *fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - USBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)fLibusbTransfer->dev_handle->os_priv); + USBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)usbi_get_device_handle_priv(fLibusbTransfer->dev_handle)); return fDeviceHandle->SubmitTransfer(itransfer); } @@ -147,27 +148,20 @@ static int haiku_cancel_transfer(struct usbi_transfer *itransfer) { struct libusb_transfer *fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - USBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)fLibusbTransfer->dev_handle->os_priv); - return fDeviceHandle->CancelTransfer(*((USBTransfer **)usbi_transfer_get_os_priv(itransfer))); -} - -static void -haiku_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - USBTransfer *transfer = *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)); - delete transfer; - *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL; + USBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)usbi_get_device_handle_priv(fLibusbTransfer->dev_handle)); + return fDeviceHandle->CancelTransfer(*((USBTransfer **)usbi_get_transfer_priv(itransfer))); } static int haiku_handle_transfer_completion(struct usbi_transfer *itransfer) { - USBTransfer *transfer = *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)); + USBTransfer **pTransfer = (USBTransfer **)usbi_get_transfer_priv(itransfer); + USBTransfer *transfer = *pTransfer; usbi_mutex_lock(&itransfer->lock); if (transfer->IsCancelled()) { delete transfer; - *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL; + *pTransfer = NULL; usbi_mutex_unlock(&itransfer->lock); if (itransfer->transferred < 0) itransfer->transferred = 0; @@ -180,43 +174,35 @@ haiku_handle_transfer_completion(struct usbi_transfer *itransfer) itransfer->transferred = 0; } delete transfer; - *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL; + *pTransfer = NULL; usbi_mutex_unlock(&itransfer->lock); return usbi_handle_transfer_completion(itransfer, status); } -static int -haiku_clock_gettime(int clkid, struct timespec *tp) -{ - if (clkid == USBI_CLOCK_REALTIME) - return clock_gettime(CLOCK_REALTIME, tp); - if (clkid == USBI_CLOCK_MONOTONIC) - return clock_gettime(CLOCK_MONOTONIC, tp); - return LIBUSB_ERROR_INVALID_PARAM; -} - -const struct usbi_os_backend haiku_usb_raw_backend = { +const struct usbi_os_backend usbi_backend = { /*.name =*/ "Haiku usbfs", /*.caps =*/ 0, /*.init =*/ haiku_init, /*.exit =*/ haiku_exit, + /*.set_option =*/ NULL, /*.get_device_list =*/ NULL, /*.hotplug_poll =*/ NULL, + /*.wrap_sys_device =*/ NULL, /*.open =*/ haiku_open, /*.close =*/ haiku_close, - /*.get_device_descriptor =*/ haiku_get_device_descriptor, + /*.get_active_config_descriptor =*/ haiku_get_active_config_descriptor, /*.get_config_descriptor =*/ haiku_get_config_descriptor, /*.get_config_descriptor_by_value =*/ NULL, - /*.get_configuration =*/ NULL, /*.set_configuration =*/ haiku_set_configuration, + /*.claim_interface =*/ haiku_claim_interface, /*.release_interface =*/ haiku_release_interface, - /*.set_interface_altsetting =*/ haiku_set_altsetting, - /*.clear_halt =*/ NULL, + + /*.clear_halt =*/ haiku_clear_halt, /*.reset_device =*/ NULL, /*.alloc_streams =*/ NULL, @@ -233,17 +219,12 @@ const struct usbi_os_backend haiku_usb_raw_backend = { /*.submit_transfer =*/ haiku_submit_transfer, /*.cancel_transfer =*/ haiku_cancel_transfer, - /*.clear_transfer_priv =*/ haiku_clear_transfer_priv, + /*.clear_transfer_priv =*/ NULL, /*.handle_events =*/ NULL, /*.handle_transfer_completion =*/ haiku_handle_transfer_completion, - /*.clock_gettime =*/ haiku_clock_gettime, - -#ifdef USBI_TIMERFD_AVAILABLE - /*.get_timerfd_clockid =*/ NULL, -#endif - + /*.context_priv_size =*/ 0, /*.device_priv_size =*/ sizeof(USBDevice *), /*.device_handle_priv_size =*/ sizeof(USBDeviceHandle *), /*.transfer_priv_size =*/ sizeof(USBTransfer *), |