diff options
author | Pete Batard <pbatard@gmail.com> | 2010-01-18 20:32:38 +0000 |
---|---|---|
committer | Pete Batard <pbatard@gmail.com> | 2010-01-18 20:32:38 +0000 |
commit | 7a8f7d1826c754aed2a4ae5f369b8882cc4cb884 (patch) | |
tree | 95e4b7cfe4bc9999d196974eb4f23d5ce9f4b1bd /libusb/os/windows_usb.h | |
parent | 2012ca7b23b2199022c51e84ca1d82838a9a570c (diff) | |
download | libusb-7a8f7d1826c754aed2a4ae5f369b8882cc4cb884.tar.gz |
r89: extended API support
- composite devices as a separate backend API
- mutidriver support in composite devices interface
- HID: device interface path, open/close (WIP)
- added HID test in xusb.c
- fixed Windows version and DDK support
- smaller fixes
Diffstat (limited to 'libusb/os/windows_usb.h')
-rw-r--r-- | libusb/os/windows_usb.h | 84 |
1 files changed, 73 insertions, 11 deletions
diff --git a/libusb/os/windows_usb.h b/libusb/os/windows_usb.h index 692d2d2..63f89cd 100644 --- a/libusb/os/windows_usb.h +++ b/libusb/os/windows_usb.h @@ -75,10 +75,15 @@ void inline upperize(char* str) { #define wchar_to_utf8_ms(wstr, str, strlen) WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, strlen, NULL, NULL) #define ERRNO GetLastError() -// This is used to support multiple kernel drivers in Windows. -struct windows_driver_backend { - const char *name; // A human-readable name for your backend, e.g. "WinUSB" +// This is used to support multiple kernel drivers and USB APIs in Windows. +struct windows_usb_api_backend { + const char *name; // A human-readable name for your backend, e.g. "WinUSB" + const char *driver_name; // Driver's name, without .sys, e.g. "usbccgp" + const uint8_t id; + int (*init)(struct libusb_context *ctx); + int (*exit)(void); int (*open)(struct libusb_device_handle *dev_handle); + void (*close)(struct libusb_device_handle *dev_handle); int (*claim_interface)(struct libusb_device_handle *dev_handle, int iface); int (*set_interface_altsetting)(struct libusb_device_handle *dev_handle, int iface, int altsetting); int (*release_interface)(struct libusb_device_handle *dev_handle, int iface); @@ -90,8 +95,13 @@ struct windows_driver_backend { int (*abort_control)(struct usbi_transfer *itransfer); int (*abort_transfers)(struct usbi_transfer *itransfer); }; -extern const struct windows_driver_backend windows_template_backend; -extern const struct windows_driver_backend windows_winusb_backend; + +#define USB_API_TEMPLATE 0 +#define USB_API_COMPOSITE 1 +#define USB_API_WINUSB 2 +#define USB_API_HID 3 +#define USB_API_MAX 4 +extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; #define PRINT_UNSUPPORTED_API(fname) \ usbi_dbg("unsupported API call for '" \ @@ -131,12 +141,13 @@ struct windows_device_priv { ULONG connection_index; // also required for some usermode ops char *path; // path used by Windows to reference the USB node struct { - char *path; // each interface has a path as well + char *path; // each interface needs a Windows device interface path, + struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support), int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS) uint8_t *endpoint; } usb_interface[USB_MAXINTERFACES]; - char *driver; // driver name (eg WinUSB, USBSTOR, HidUsb, etc) - struct windows_driver_backend const *apib; + struct windows_usb_api_backend const *apib; + uint8_t composite_api_flags; uint8_t active_config; USB_DEVICE_DESCRIPTOR dev_descriptor; unsigned char **config_descriptor; // list of pointers to the cached config descriptors @@ -147,13 +158,14 @@ static inline void windows_device_priv_init(struct windows_device_priv* p) { p->parent_dev = NULL; p->connection_index = 0; p->path = NULL; - p->driver = NULL; - p->apib = &windows_template_backend; + p->apib = &usb_api_backend[USB_API_TEMPLATE]; + p->composite_api_flags = 0; p->active_config = 0; p->config_descriptor = NULL; memset(&(p->dev_descriptor), 0, sizeof(USB_DEVICE_DESCRIPTOR)); for (i=0; i<USB_MAXINTERFACES; i++) { p->usb_interface[i].path = NULL; + p->usb_interface[i].apib = &usb_api_backend[USB_API_TEMPLATE]; p->usb_interface[i].nb_endpoints = 0; p->usb_interface[i].endpoint = NULL; } @@ -162,7 +174,6 @@ static inline void windows_device_priv_init(struct windows_device_priv* p) { static inline void windows_device_priv_release(struct windows_device_priv* p, int num_configurations) { int i; safe_free(p->path); - safe_free(p->driver); if ((num_configurations > 0) && (p->config_descriptor != NULL)) { for (i=0; i < num_configurations; i++) safe_free(p->config_descriptor[i]); @@ -197,6 +208,7 @@ static inline struct windows_device_handle_priv *__device_handle_priv( // used for async polling functions struct windows_transfer_priv { struct winfd pollable_fd; + uint8_t interface_number; }; @@ -380,3 +392,53 @@ DLL_DECLARE(WINAPI, BOOL, WinUsb_AbortPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); DLL_DECLARE(WINAPI, BOOL, WinUsb_FlushPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); + +/* hid.dll interface */ + +#pragma pack(1) +typedef struct { + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; +} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; +#pragma pack() + +typedef USHORT USAGE; +typedef struct { + USAGE Usage; + USAGE UsagePage; + USHORT InputReportByteLength; + USHORT OutputReportByteLength; + USHORT FeatureReportByteLength; + USHORT Reserved[17]; + USHORT NumberLinkCollectionNodes; + USHORT NumberInputButtonCaps; + USHORT NumberInputValueCaps; + USHORT NumberInputDataIndices; + USHORT NumberOutputButtonCaps; + USHORT NumberOutputValueCaps; + USHORT NumberOutputDataIndices; + USHORT NumberFeatureButtonCaps; + USHORT NumberFeatureValueCaps; + USHORT NumberFeatureDataIndices; +} HIDP_CAPS, *PHIDP_CAPS; + +typedef void* PHIDP_PREPARSED_DATA; +DLL_DECLARE(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES)); +DLL_DECLARE(WINAPI, VOID, HidD_GetHidGuid, (LPGUID)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetPreparsedData, + (HANDLE, PHIDP_PREPARSED_DATA *)); +DLL_DECLARE(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, NTSTATUS, HidP_GetCaps, + (PHIDP_PREPARSED_DATA, PHIDP_CAPS)); +DLL_DECLARE(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG)); + |