diff --git a/usbDesc.h b/usbDesc.h new file mode 100644 index 0000000..5cc2140 --- /dev/null +++ b/usbDesc.h @@ -0,0 +1,116 @@ + +enum USB_PID { + // Token Packets + OUT_TOKEN = 0b0001, + IN_TOKEN = 0b1001, + SOF_TOKEN = 0b0101, + SETUP_TOKEN = 0b1101, + + // Data Packets + DATA0_DATA = 0b0011, + DATA1_DATA = 0b1011, + DATA2_DATA = 0b0111, + MDATA_DATA = 0b1111, + + // Handshake Packets + ACK_HANDSHAKE = 0b0010, + NAK_HANDSHAKE = 0b1010, + STALL_HANDSHAKE = 0b1110, + NYET_HANDSHAKE = 0b0110, + + // Special & Other Packets + PRE_SPECIAL = 0b1100, // PREamble shares value with ERR + ERR_SPECIAL = 0b1100, + SPLIT_SPECIAL = 0b1000, + PING_SPECIAL = 0b0100 +}; + + +enum Configuration_bmAttributes{ + USB_BUS_POWERED = (1 << 7), + SELF_POWERED = (1 << 6), + REMOTE_WAKEUP = (1 << 5), +}; + + +enum Endpoint_bmAttributes { + // Bits 1..0: Transfer Type + TRANSFER_TYPE_MASK = 0b00000011, + TRANSFER_CONTROL = 0b00000000, + TRANSFER_ISOCHRONOUS = 0b00000001, + TRANSFER_BULK = 0b00000010, + TRANSFER_INTERRUPT = 0b00000011, + + // Bits 3..2: Synchronization Type (Isochronous Mode only) + SYNC_TYPE_MASK = 0b00001100, + SYNC_NOSYNC = (0b00 << 2), // No Synchronization + SYNC_ASYNC = (0b01 << 2), // Asynchronous + SYNC_ADAPTIVE = (0b10 << 2), // Adaptive + SYNC_SYNCHRONOUS = (0b11 << 2), // Synchronous + + // Bits 5..4: Usage Type (Isochronous Mode only) + USAGE_TYPE_MASK = 0b00110000, + USAGE_DATA = (0b00 << 4), // Data Endpoint + USAGE_FEEDBACK = (0b01 << 4), // Feedback Endpoint + USAGE_EXPLICIT_FEEDBACK = (0b10 << 4), // Explicit Feedback Data Endpoint + USAGE_RESERVED = (0b11 << 4) // Reserved +}; + +enum Setup_bmRequestType { + // Bit 7: Data Phase Transfer Direction + DIR_MASK = (1 << 7), + HOST_TO_DEVICE = (0 << 7), + DEVICE_TO_HOST = (1 << 7), + + // Bits 6..5: Type + TYPE_MASK = (0b11 << 5), + TYPE_STANDARD = (0b00 << 5), + TYPE_CLASS = (0b01 << 5), + TYPE_VENDOR = (0b10 << 5), + TYPE_RESERVED = (0b11 << 5), + + // Bits 4..0: Recipient + RECIPIENT_MASK = 0b11111, + RECIPIENT_DEVICE = 0, + RECIPIENT_INTERFACE = 1, + RECIPIENT_ENDPOINT = 2, + RECIPIENT_OTHER = 3 +}; + + +enum Standard__Device_Requests { + GET_STATUS = 0x00, + /** + * GET_STATUS will reuturn a 16bit word. + * D0 is "Self Powered" bit, if D0 == 0, then the device is powered by the bus + * D1 is the "Remote Wakeup" bit, if D1 == 1, then the host can wake up this device from suspend + */ + + CLEAR_FEATURE = 0x01, + SET_FEATURE = 0x03, + SET_ADDRESS = 0x05, + GET_DESCRIPTOR = 0x06, + SET_DESCRIPTOR = 0x07, + GET_CONFIGURATION = 0x08, + SET_CONFIGURATION = 0x09 +}; + +enum Standard_Interface_Requests { + GET_STATUS = 0x00, + CLEAR_FEATURE = 0x01, + SET_FEATURE = 0x03, + GET_INTERFACE = 0x0A, + SET_INTERFACE = 0x11, +}; + +enum Standard_Endpoint_Requests { + GET_STATUS = 0x00, + CLEAR_FEATURE = 0x01, + SET_FEATURE = 0x03, + /** + * Clear Feature and Set Feature are used to set Endpoint Features. + * The standard currently defines one endpoint feature selector, + * ENDPOINT_HALT (0x00) which allows the host to stall and clear an endpoint. + */ + SYNCH_FRAME = 0x12, +}; \ No newline at end of file