aboutsummaryrefslogtreecommitdiff
path: root/libusb/os/haiku_usb_raw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libusb/os/haiku_usb_raw.cpp')
-rw-r--r--libusb/os/haiku_usb_raw.cpp125
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 *),