diff options
Diffstat (limited to 'src/libs/usb/proto.h')
| -rw-r--r-- | src/libs/usb/proto.h | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/src/libs/usb/proto.h b/src/libs/usb/proto.h new file mode 100644 index 0000000..d313cb5 --- /dev/null +++ b/src/libs/usb/proto.h @@ -0,0 +1,227 @@ +#ifndef __PROTO_H__ +#define __PROTO_H__ + +#include "../types.h" + +// ---------- USB Protocol ---------- +#define USB_DATA typedef struct __attribute__((__packed__)) + +// USB token PIDs +#define USB_PID_OUT 0b0001 +#define USB_PID_IN 0b1001 +#define USB_PID_SOF 0b0101 +#define USB_PID_SETUP 0b1101 + +// USB data PIDs +#define USB_PID_DATA0 0b0011 +#define USB_PID_DATA1 0b1011 +#define USB_PID_DATA2 0b0111 +#define USB_PID_MDATA 0b1111 + +// Standard Requests Code (bRequest) +#define USB_REQUEST_CODE_GET_STATUS 0 +#define USB_REQUEST_CODE_CLEAR_FEATURE 1 +#define USB_REQUEST_CODE_SET_FEATURE 3 +#define USB_REQUEST_CODE_SET_ADDRESS 5 +#define USB_REQUEST_CODE_GET_DESCRIPTOR 6 +#define USB_REQUEST_CODE_SET_DESCRIPTOR 7 +#define USB_REQUEST_CODE_GET_CONFIGURATION 8 +#define USB_REQUEST_CODE_SET_CONFIGURATION 9 +#define USB_REQUEST_CODE_GET_INTERFACE 10 +#define USB_REQUEST_CODE_SET_INTERFACE 11 +#define USB_REQUEST_CODE_SYNCH_FRAME 12 + +// Descriptor Types (wValue) +#define USB_DESCRIPTOR_TYPE_DEVICE 1 +#define USB_DESCRIPTOR_TYPE_CONFIGURATION 2 +#define USB_DESCRIPTOR_TYPE_STRING 3 +#define USB_DESCRIPTOR_TYPE_INTERFACE 4 +#define USB_DESCRIPTOR_TYPE_ENDPOINT 5 +#define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION 7 +#define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 8 + +// Feature Selector (wvalue) +#define USB_FEATURE_SELECTOR_DEVICE_REMOTE_WAKEUP 1 +#define USB_FEATURE_SELECTOR_ENDPOINT_HALT 0 +#define USB_FEATURE_SELECTOR_TEST_MODE 2 + +// Device class code https://developerhelp.microchip.com/xwiki/bin/view/applications/usb/how-it-works/device-classes/ +#define USB_DEVICE_CLASS_DEVICE 0x00 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define USB_DEVICE_CLASS_CDC 0x02 +#define USB_DEVICE_CLASS_HID 0x03 +#define USB_DEVICE_CLASS_PHYSICAL 0x05 + +#define USB_TRANSFERT_TYPE_CONTROL 0b00 +#define USB_TRANSFERT_TYPE_ISOCHRONOUS 0b01 +#define USB_TRANSFERT_TYPE_BULK 0b10 +#define USB_TRANSFERT_TYPE_INTERRUPT 0b11 + +#define USB_DIRECTION_OUT 0x00 +#define USB_DIRECTION_IN 0x80 + +// Supported languages http://www.baiheee.com/Documents/090518/090518112619/USB_LANGIDs.pdf +#define USB_LANG_ENGLISH_US 0x0409 +#define USB_LANG_ENGLISH_UNITED_KINGDOM 0x0809 + +#define B_ENDPOINT_ADDRESS(NUM, DIR) ((NUM)&0xF | (DIR)) +#define BM_REQUEST_TYPE_DIR_BIT (USB_DIRECTION_IN) + +#define USB_INTERFACE_CLASS_COMMUNICATION 0x02 // Communication interface class +#define USB_INTERFACE_CLASS_DATA 0x0a // Data interface class +#define USB_INTERFACE_SUBCLASS_ACM 0x02 // Abstract Control Mode +#define USB_INTERFACE_COMMUNICATION_PROTOCOL_NOPROTO 0x00 // No protocol + +USB_DATA { // P250 + u8 bmRequestType; + u8 bRequest; + u16 wValue; + u16 wIndex; + u16 wLength; +} UD_SETUP; + +// ----- Descriptors ----- + +USB_DATA { // P262 + u8 bLength; + u8 bDescriptorType; + u16 bcdUSB; + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocol; + u8 bMaxPacketSize0; + u16 idVendor; + u16 idProduct; + u16 bcdDevice; + u8 iManufacturer; + u8 iProduct; + u8 iSerialNumber; + u8 bNumConfigurations; +} USB_DEVICE_DESCRIPTOR; + + +USB_DATA { // P264 (may not be used in this code) + u8 bLength; + u8 bDescriptorType; + u16 bcdUSB; + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocol; + u8 bMaxPacketSize0; + u8 bNumConfigurations; + u8 bReserved; +} USB_DEVICE_QUALIFIER_DESCRIPTOR; + +USB_DATA { // P265 + u8 bLength; + u8 bDescriptorType; + u16 wTotalLength; + u8 bNumInterfaces; + u8 bConfigurationValue; + u8 iConfiguration; + u8 bmAttributes; + u8 bMaxPower; +} USB_CONFIGURATION_DESCRIPTOR; + +USB_DATA { + u8 bLength; + u8 bDescriptorType; + u16 wTotalLength; + u8 bNumInterfaces; + u8 bConfigurationValue; + u8 iConfiguration; + u8 bmAttributes; + u8 bMaxPower; +} USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR; + +USB_DATA { + u8 bLength; + u8 bDescriptorType; + u8 bInterfaceNumber; + u8 bAlternateSetting; + u8 bNumEndpoints; + u8 bInterfaceClass; + u8 bInterfaceSubClass; + u8 bInterfaceProtocol; + u8 iInterface; +} USB_INTERFACE_DESCRIPTOR; + +USB_DATA { + u8 bLength; + u8 bDescriptorType; + u8 bEndpointAddress; + u8 bmAttributes; + u16 wMaxPacketSize; + u8 bInterval; +} USB_ENDPOINT_DESCRIPTOR; + +USB_DATA { + u8 bLength; + u8 bDescriptorType; + u16 wLANGID0; + // Can be more wLANGIDX but stop here! +} USB_STRING_DESCRIPTOR_ZERO; + +USB_DATA { + u8 bLength; + u8 bDescriptorType; + // You add your unicode string there +} USB_UNICODE_STRING_DESCRIPTOR; + + + + +// ----- CDC Device Class ----- +// p10 PSTN120.pdf in CDC Specification +// p10-.. CDC120-20101103-track.pdf +// p10-.. usbcdc11.pdf +#define USB_INTERFACE_CLASS_COMMUNICATION 0x02 // Communication interface class +#define USB_INTERFACE_CLASS_DATA 0x0a // Data interface class +#define USB_INTERFACE_SUBCLASS_ACM 0x02 // Abstract Control Mode +#define USB_INTERFACE_COMMUNICATION_PROTOCOL_NOPROTO 0x00 // No protocol + +#define USB_RS232_BMCAPABILITIES 0b10 + +#define USB_REQUEST_CODE_SET_LINE_CODING 0x20 +#define USB_REQUEST_CODE_SET_CONTROL_LINE_STATE 0x22 +#define USB_REQUEST_CODE_SEND_BREAK 0x23 + +// p34 +USB_DATA { + u8 bFunctionLength; + u8 bDescriptorType; + u8 bDescriptorSubtype; + u16 bcdCDC; +} USB_CDC_HEADER_FUNCTIONAL_DESCRIPTOR; + +// p35 +USB_DATA { + u8 bFunctionLength; + u8 bDescriptorType; + u8 bDescriptorSubtype; + u8 bmCapabilities; +} USB_ACM_FUNCTIONAL_DESCRIPTOR; + +// p40 +USB_DATA { + u8 bFunctionLength; + u8 bDescriptorType; + u8 bDescriptorSubtype; + u8 bMasterInterface; + u8 bSlaveInterface0; + // Can be more! I guess for RS-232 it is enough +} USB_UNION_INTERFACE_DESCRIPTOR; + + +// SEE p49!!!! it is all there it seems +// the last descriptor on that page is the "Call management functional +// descriptor" (p34). It seems not required according to chatgpt for rs-232 +USB_DATA { + USB_CDC_HEADER_FUNCTIONAL_DESCRIPTOR header_descriptor; + USB_ACM_FUNCTIONAL_DESCRIPTOR acm_descriptor; + USB_UNION_INTERFACE_DESCRIPTOR union_descriptor; +} USB_CDC_ACM_FUNCTIONAL_DESCRIPTOR; + + +#endif |
