blob: b3dc709f81aa10cfccd37e7bfca3bf980cc05561 [file]
/*
* BRLTTY - A background process providing access to the console screen (when in
* text mode) for a blind person using a refreshable braille display.
*
* Copyright (C) 1995-2023 by The BRLTTY Developers.
*
* BRLTTY comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
#ifndef BRLTTY_INCLUDED_USB_TYPES
#define BRLTTY_INCLUDED_USB_TYPES
#include "serial_types.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Descriptor types. */
typedef enum {
UsbDescriptorType_Device = 0X01,
UsbDescriptorType_Configuration = 0X02,
UsbDescriptorType_String = 0X03,
UsbDescriptorType_Interface = 0X04,
UsbDescriptorType_Endpoint = 0X05,
UsbDescriptorType_HID = 0X21,
UsbDescriptorType_Report = 0X22
} UsbDescriptorType;
/* Descriptor sizes. */
typedef enum {
UsbDescriptorSize_Device = 18,
UsbDescriptorSize_Configuration = 9,
UsbDescriptorSize_String = 2,
UsbDescriptorSize_Interface = 9,
UsbDescriptorSize_Endpoint = 7,
UsbDescriptorSize_HID = 6,
UsbDescriptorSize_Class = 3
} UsbDescriptorSize;
typedef enum {
UsbSpecificationVersion_1_0 = 0X0100,
UsbSpecificationVersion_1_1 = 0X0110,
UsbSpecificationVersion_2_0 = 0X0200,
UsbSpecificationVersion_3_0 = 0X0300
} UsbSpecificationVersion;
/* Configuration attributes (bmAttributes). */
typedef enum {
UsbConfigurationAttribute_BusPowered = 0X80,
UsbConfigurationAttribute_SelfPowered = 0X40,
UsbConfigurationAttribute_RemoteWakeup = 0X20
} UsbConfigurationAttribute;
/* Device and interface classes (bDeviceClass, bInterfaceClass). */
typedef enum {
UsbClass_PerInterface = 0X00,
UsbClass_Audio = 0X01,
UsbClass_Comm = 0X02,
UsbClass_Hid = 0X03,
UsbClass_Physical = 0X05,
UsbClass_Printer = 0X07,
UsbClass_MassStorage = 0X08,
UsbClass_Hub = 0X09,
UsbClass_Data = 0X0A,
UsbClass_AppSpec = 0XFE,
UsbClass_VendorSpec = 0XFF
} UsbClass;
/* Endpoint numbers (bEndpointAddress). */
typedef enum {
UsbEndpointNumber_Mask = 0X0F
} UsbEndpointNumber;
#define USB_ENDPOINT_NUMBER(descriptor) ((descriptor)->bEndpointAddress & UsbEndpointNumber_Mask)
/* Endpoint directions (bEndpointAddress). */
typedef enum {
UsbEndpointDirection_Output = 0X00,
UsbEndpointDirection_Input = 0X80,
UsbEndpointDirection_Mask = 0X80
} UsbEndpointDirection;
#define USB_ENDPOINT_DIRECTION(descriptor) ((descriptor)->bEndpointAddress & UsbEndpointDirection_Mask)
/* Endpoint transfer types (bmAttributes). */
typedef enum {
UsbEndpointTransfer_Control = 0X00,
UsbEndpointTransfer_Isochronous = 0X01,
UsbEndpointTransfer_Bulk = 0X02,
UsbEndpointTransfer_Interrupt = 0X03,
UsbEndpointTransfer_Mask = 0X03
} UsbEndpointTransfer;
#define USB_ENDPOINT_TRANSFER(descriptor) ((descriptor)->bmAttributes & UsbEndpointTransfer_Mask)
/* Endpoint isochronous types (bmAttributes). */
typedef enum {
UsbEndpointIsochronous_Asynchronous = 0X04,
UsbEndpointIsochronous_Adaptable = 0X08,
UsbEndpointIsochronous_Synchronous = 0X0C,
UsbEndpointIsochronous_Mask = 0X0C
} UsbEndpointIsochronous;
#define USB_ENDPOINT_ISOCHRONOUS(descriptor) ((descriptor)->bmAttributes & UsbEndpointIsochronous_Mask)
/* Control transfer recipients. */
typedef enum {
UsbControlRecipient_Device = 0X00,
UsbControlRecipient_Interface = 0X01,
UsbControlRecipient_Endpoint = 0X02,
UsbControlRecipient_Other = 0X03,
UsbControlRecipient_Mask = 0X1F
} UsbControlRecipient;
/* Control transfer types. */
typedef enum {
UsbControlType_Standard = 0X00,
UsbControlType_Class = 0X20,
UsbControlType_Vendor = 0X40,
UsbControlType_Reserved = 0X60,
UsbControlType_Mask = 0X60
} UsbControlType;
/* Transfer directions. */
typedef enum {
UsbControlDirection_Output = 0X00,
UsbControlDirection_Input = 0X80,
UsbControlDirection_Mask = 0X80
} UsbControlDirection;
/* Standard control requests. */
typedef enum {
UsbStandardRequest_GetStatus = 0X00,
UsbStandardRequest_ClearFeature = 0X01,
UsbStandardRequest_GetState = 0X02,
UsbStandardRequest_SetFeature = 0X03,
UsbStandardRequest_SetAddress = 0X05,
UsbStandardRequest_GetDescriptor = 0X06,
UsbStandardRequest_SetDescriptor = 0X07,
UsbStandardRequest_GetConfiguration = 0X08,
UsbStandardRequest_SetConfiguration = 0X09,
UsbStandardRequest_GetInterface = 0X0A,
UsbStandardRequest_SetInterface = 0X0B,
UsbStandardRequest_SynchFrame = 0X0C
} UsbStandardRequest;
/* Standard features. */
typedef enum {
UsbFeature_Endpoint_Stall = 0X00,
UsbFeature_Device_RemoteWakeup = 0X01
} UsbFeature;
typedef struct {
uint8_t bLength; /* Descriptor size in bytes. */
uint8_t bDescriptorType; /* Descriptor type. */
} PACKED UsbDescriptorHeader;
typedef struct {
uint8_t bLength; /* Descriptor size in bytes (18). */
uint8_t bDescriptorType; /* Descriptor type (1 == device). */
uint16_t bcdUSB; /* USB revision number. */
uint8_t bDeviceClass; /* Device class. */
uint8_t bDeviceSubClass; /* Device subclass. */
uint8_t bDeviceProtocol; /* Device protocol. */
uint8_t bMaxPacketSize0; /* Maximum packet size in bytes for endpoint 0. */
uint16_t idVendor; /* Vendor identifier. */
uint16_t idProduct; /* Product identifier. */
uint16_t bcdDevice; /* Product revision number. */
uint8_t iManufacturer; /* String index for manufacturer name. */
uint8_t iProduct; /* String index for product description. */
uint8_t iSerialNumber; /* String index for serial number. */
uint8_t bNumConfigurations; /* Number of configurations. */
} PACKED UsbDeviceDescriptor;
typedef struct {
uint8_t bLength; /* Descriptor size in bytes (9). */
uint8_t bDescriptorType; /* Descriptor type (2 == configuration). */
uint16_t wTotalLength; /* Block size in bytes for all descriptors. */
uint8_t bNumInterfaces; /* Number of interfaces. */
uint8_t bConfigurationValue; /* Configuration number. */
uint8_t iConfiguration; /* String index for configuration description. */
uint8_t bmAttributes; /* Configuration attributes. */
uint8_t bMaxPower; /* Maximum power in 2 milliamp units. */
} PACKED UsbConfigurationDescriptor;
typedef struct {
uint8_t bLength; /* Descriptor size in bytes (2 + numchars/2). */
uint8_t bDescriptorType; /* Descriptor type (3 == string). */
uint16_t wData[127]; /* 16-bit characters. */
} PACKED UsbStringDescriptor;
typedef struct {
uint8_t bLength; /* Descriptor size in bytes (9). */
uint8_t bDescriptorType; /* Descriptor type (4 == interface). */
uint8_t bInterfaceNumber; /* Interface number. */
uint8_t bAlternateSetting; /* Interface alternative. */
uint8_t bNumEndpoints; /* Number of endpoints. */
uint8_t bInterfaceClass; /* Interface class. */
uint8_t bInterfaceSubClass; /* Interface subclass. */
uint8_t bInterfaceProtocol; /* Interface protocol. */
uint8_t iInterface; /* String index for interface description. */
} PACKED UsbInterfaceDescriptor;
typedef struct {
uint8_t bLength; /* Descriptor size in bytes (7, 9 for audio). */
uint8_t bDescriptorType; /* Descriptor type (5 == endpoint). */
uint8_t bEndpointAddress; /* Endpoint number (ored with 0X80 if input. */
uint8_t bmAttributes; /* Endpoint type and attributes. */
uint16_t wMaxPacketSize; /* Maximum packet size in bytes. */
uint8_t bInterval; /* Maximum interval in milliseconds between transfers. */
uint8_t bRefresh;
uint8_t bSynchAddress;
} PACKED UsbEndpointDescriptor;
typedef struct {
uint8_t bDescriptorType;
uint16_t wDescriptorLength;
} PACKED UsbClassDescriptor;
typedef struct {
uint8_t bLength; /* Descriptor size in bytes (6). */
uint8_t bDescriptorType; /* Descriptor type (33 == HID). */
uint16_t bcdHID;
uint8_t bCountryCode;
uint8_t bNumDescriptors;
UsbClassDescriptor descriptors[(0XFF - UsbDescriptorSize_HID) / UsbDescriptorSize_Class];
} PACKED UsbHidDescriptor;
typedef union {
UsbDescriptorHeader header;
UsbDeviceDescriptor device;
UsbConfigurationDescriptor configuration;
UsbStringDescriptor string;
UsbInterfaceDescriptor interface;
UsbEndpointDescriptor endpoint;
UsbHidDescriptor hid;
unsigned char bytes[0XFF];
} UsbDescriptor;
typedef struct {
uint8_t bRequestType; /* Recipient, direction, and type. */
uint8_t bRequest; /* Request code. */
uint16_t wValue; /* Request value. */
uint16_t wIndex; /* Recipient number (language for strings). */
uint16_t wLength; /* Data length in bytes. */
} PACKED UsbSetupPacket;
#define BEGIN_USB_STRING_LIST(name) static const char *const name[] = {
#define END_USB_STRING_LIST NULL};
typedef struct {
const void *data;
const SerialParameters *serial;
const char *const *manufacturers;
const char *const *products;
uint16_t version;
uint16_t vendor;
uint16_t product;
uint16_t parentVendor;
uint16_t parentProduct;
unsigned char configuration;
unsigned char interface;
unsigned char alternative;
unsigned char inputEndpoint;
unsigned char outputEndpoint;
unsigned char disableAutosuspend:1;
unsigned char disableEndpointReset:1;
unsigned char verifyInterface:1;
unsigned char resetDevice:1;
} UsbChannelDefinition;
#define BEGIN_USB_CHANNEL_DEFINITIONS static const UsbChannelDefinition usbChannelDefinitions[] = {
#define END_USB_CHANNEL_DEFINITIONS { .vendor=0 } };
typedef struct UsbDeviceStruct UsbDevice;
typedef struct UsbChooseChannelDataStruct UsbChooseChannelData;
typedef int UsbDeviceChooser (UsbDevice *device, UsbChooseChannelData *data);
typedef struct {
void *const buffer;
const size_t size;
ssize_t length;
} UsbInputFilterData;
typedef struct UsbSerialDataStruct UsbSerialData;
typedef int UsbInputFilter (UsbInputFilterData *data);
typedef struct {
const char *name;
int (*enableAdapter) (UsbDevice *device);
void (*disableAdapter) (UsbDevice *device);
int (*makeData) (UsbDevice *device, UsbSerialData **serialData);
void (*destroyData) (UsbSerialData *usd);
int (*setLineConfiguration) (UsbDevice *device, unsigned int baud, unsigned int dataBits, SerialStopBits stopBits, SerialParity parity, SerialFlowControl flowControl);
int (*setLineProperties) (UsbDevice *device, unsigned int baud, unsigned int dataBits, SerialStopBits stopBits, SerialParity parity);
int (*setBaud) (UsbDevice *device, unsigned int baud);
int (*setDataFormat) (UsbDevice *device, unsigned int dataBits, SerialStopBits stopBits, SerialParity parity);
int (*setFlowControl) (UsbDevice *device, SerialFlowControl flow);
int (*setDtrState) (UsbDevice *device, int state);
int (*setRtsState) (UsbDevice *device, int state);
UsbInputFilter *inputFilter;
ssize_t (*writeData) (UsbDevice *device, const void *data, size_t size);
} UsbSerialOperations;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* BRLTTY_INCLUDED_USB_TYPES */