usb: fixup comments, allow custom bInterfaceClass etc in usbComms

This commit is contained in:
Michael Scire 2018-10-06 16:23:27 -07:00
parent d6e270854d
commit 6fb6bdb6de
3 changed files with 49 additions and 32 deletions

View File

@ -8,10 +8,17 @@
#pragma once
#include "../../types.h"
typedef struct {
u8 bInterfaceClass;
u8 bInterfaceSubClass;
u8 bInterfaceProtocol;
} UsbCommsInterfaceInfo;
/// Initializes usbComms with the default number of interfaces (1)
Result usbCommsInitialize(void);
Result usbCommsInitialize(const UsbCommsInterfaceInfo *info);
/// Initializes usbComms with a specific number of interfaces.
Result usbCommsInitializeEx(u32 num_interfaces);
Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos);
/// Exits usbComms.
void usbCommsExit(void);

View File

@ -25,8 +25,8 @@
/// Imported from libusb, with some adjustments.
struct usb_endpoint_descriptor {
uint8_t bLength;
uint8_t bDescriptorType; /// Must match USB_DT_ENDPOINT.
uint8_t bEndpointAddress; /// Should be one of the usb_endpoint_direction values, the endpoint-number is automatically allocated.
uint8_t bDescriptorType; ///< Must match USB_DT_ENDPOINT.
uint8_t bEndpointAddress; ///< Should be one of the usb_endpoint_direction values, the endpoint-number is automatically allocated.
uint8_t bmAttributes;
uint16_t wMaxPacketSize;
uint8_t bInterval;
@ -35,20 +35,20 @@ struct usb_endpoint_descriptor {
/// Imported from libusb, with some adjustments.
struct usb_interface_descriptor {
uint8_t bLength;
uint8_t bDescriptorType; /// Must match USB_DT_INTERFACE.
uint8_t bInterfaceNumber; /// See also USBDS_DEFAULT_InterfaceNumber.
uint8_t bAlternateSetting; /// Must match 0.
uint8_t bDescriptorType; ///< Must match USB_DT_INTERFACE.
uint8_t bInterfaceNumber; ///< See also USBDS_DEFAULT_InterfaceNumber.
uint8_t bAlternateSetting; ///< Must match 0.
uint8_t bNumEndpoints;
uint8_t bInterfaceClass;
uint8_t bInterfaceSubClass;
uint8_t bInterfaceProtocol;
uint8_t iInterface; /// Ignored.
uint8_t iInterface; ///< Ignored.
};
/// Imported from libusb, with some adjustments.
struct usb_device_descriptor {
uint8_t bLength;
uint8_t bDescriptorType; /// Must match USB_DT_Device.
uint8_t bDescriptorType; ///< Must match USB_DT_Device.
uint16_t bcdUSB;
uint8_t bDeviceClass;
uint8_t bDeviceSubClass;
@ -66,7 +66,7 @@ struct usb_device_descriptor {
/// Imported from libusb, with some adjustments.
struct usb_ss_endpoint_companion_descriptor {
uint8_t bLength;
uint8_t bDescriptorType; /// Must match USB_DT_SS_ENDPOINT_COMPANION.
uint8_t bDescriptorType; ///< Must match USB_DT_SS_ENDPOINT_COMPANION.
uint8_t bMaxBurst;
uint8_t bmAttributes;
uint16_t wBytesPerInterval;
@ -75,13 +75,13 @@ struct usb_ss_endpoint_companion_descriptor {
/// Imported from libusb, with some adjustments.
struct usb_string_descriptor {
uint8_t bLength;
uint8_t bDescriptorType; /// Must match USB_DT_STRING.
uint8_t bDescriptorType; ///< Must match USB_DT_STRING.
uint16_t wData[0x40];
};
typedef struct {
u16 idVendor; /// VID
u16 idProduct; /// PID
u16 idVendor; ///< VID
u16 idProduct; ///< PID
u16 bcdDevice;
char Manufacturer[0x20];
char Product[0x20];
@ -89,7 +89,7 @@ typedef struct {
} UsbDsDeviceInfo;
typedef struct {
u32 id; /// urbId from post-buffer cmds
u32 id; ///< urbId from post-buffer cmds
u32 requestedSize;
u32 transferredSize;
u32 urb_status;

View File

@ -26,13 +26,21 @@ static usbCommsInterface g_usbCommsInterfaces[TOTAL_INTERFACES];
static RwLock g_usbCommsLock;
static Result _usbCommsInterfaceInit1x(u32 intf_ind);
static Result _usbCommsInterfaceInit5x(u32 intf_ind);
static Result _usbCommsInterfaceInit(u32 intf_ind);
static Result _usbCommsInterfaceInit1x(u32 intf_ind, const UsbCommsInterfaceInfo *info);
static Result _usbCommsInterfaceInit5x(u32 intf_ind, const UsbCommsInterfaceInfo *info);
static Result _usbCommsInterfaceInit(u32 intf_ind, const UsbCommsInterfaceInfo *info);
static Result _usbCommsWrite(usbCommsInterface *interface, const void* buffer, size_t size, size_t *transferredSize);
Result usbCommsInitializeEx(u32 num_interfaces)
static void _usbCommsUpdateInterfaceDescriptor(struct usb_interface_descriptor *desc, const UsbCommsInterfaceInfo *info) {
if (info != NULL) {
desc->bInterfaceClass = info->bInterfaceClass;
desc->bInterfaceSubClass = info->bInterfaceSubClass;
desc->bInterfaceProtocol = info->bInterfaceProtocol;
}
}
Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos)
{
Result rc = 0;
rwlockWriteLock(&g_usbCommsLock);
@ -115,7 +123,7 @@ Result usbCommsInitializeEx(u32 num_interfaces)
rwlockWriteLock(&intf->lock);
rwlockWriteLock(&intf->lock_in);
rwlockWriteLock(&intf->lock_out);
rc = _usbCommsInterfaceInit(i);
rc = _usbCommsInterfaceInit(i, infos + i);
rwlockWriteUnlock(&intf->lock_out);
rwlockWriteUnlock(&intf->lock_in);
rwlockWriteUnlock(&intf->lock);
@ -141,9 +149,9 @@ Result usbCommsInitializeEx(u32 num_interfaces)
return rc;
}
Result usbCommsInitialize(void)
Result usbCommsInitialize(const UsbCommsInterfaceInfo *info)
{
return usbCommsInitializeEx(1);
return usbCommsInitializeEx(1, info);
}
static void _usbCommsInterfaceFree(usbCommsInterface *interface)
@ -192,16 +200,16 @@ void usbCommsExit(void)
}
}
static Result _usbCommsInterfaceInit(u32 intf_ind)
static Result _usbCommsInterfaceInit(u32 intf_ind, const UsbCommsInterfaceInfo *info)
{
if (kernelAbove500()) {
return _usbCommsInterfaceInit5x(intf_ind);
return _usbCommsInterfaceInit5x(intf_ind, info);
} else {
return _usbCommsInterfaceInit1x(intf_ind);
return _usbCommsInterfaceInit1x(intf_ind, info);
}
}
static Result _usbCommsInterfaceInit5x(u32 intf_ind)
static Result _usbCommsInterfaceInit5x(u32 intf_ind, const UsbCommsInterfaceInfo *info)
{
Result rc = 0;
u32 ep_num = intf_ind + 1;
@ -212,10 +220,11 @@ static Result _usbCommsInterfaceInit5x(u32 intf_ind)
.bDescriptorType = USB_DT_INTERFACE,
.bInterfaceNumber = intf_ind,
.bNumEndpoints = 2,
.bInterfaceClass = 0xFF,
.bInterfaceSubClass = 0xFF,
.bInterfaceProtocol = 0xFF,
.bInterfaceClass = USB_CLASS_VENDOR_SPEC,
.bInterfaceSubClass = USB_CLASS_VENDOR_SPEC,
.bInterfaceProtocol = USB_CLASS_VENDOR_SPEC,
};
_usbCommsUpdateInterfaceDescriptor(&interface_descriptor, info);
struct usb_endpoint_descriptor endpoint_descriptor_in = {
.bLength = USB_DT_ENDPOINT_SIZE,
@ -308,7 +317,7 @@ static Result _usbCommsInterfaceInit5x(u32 intf_ind)
}
static Result _usbCommsInterfaceInit1x(u32 intf_ind)
static Result _usbCommsInterfaceInit1x(u32 intf_ind, const UsbCommsInterfaceInfo *info)
{
Result rc = 0;
u32 ep_num = intf_ind + 1;
@ -318,10 +327,11 @@ static Result _usbCommsInterfaceInit1x(u32 intf_ind)
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
.bInterfaceNumber = intf_ind,
.bInterfaceClass = 0xFF,
.bInterfaceSubClass = 0xFF,
.bInterfaceProtocol = 0xFF,
.bInterfaceClass = USB_CLASS_VENDOR_SPEC,
.bInterfaceSubClass = USB_CLASS_VENDOR_SPEC,
.bInterfaceProtocol = USB_CLASS_VENDOR_SPEC,
};
_usbCommsUpdateInterfaceDescriptor(&interface_descriptor, info);
struct usb_endpoint_descriptor endpoint_descriptor_in = {
.bLength = USB_DT_ENDPOINT_SIZE,