1 /*************************************************************************** 2 * Copyright (C) 2011 by Martin Schmoelzer * 3 * <martin.schmoelzer@student.tuwien.ac.at> * 4 * * 5 * This program is free software; you can redistribute it and/or modify * 6 * it under the terms of the GNU General Public License as published by * 7 * the Free Software Foundation; either version 2 of the License, or * 8 * (at your option) any later version. * 9 * * 10 * This program is distributed in the hope that it will be useful, * 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 13 * GNU General Public License for more details. * 14 * * 15 * You should have received a copy of the GNU General Public License * 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. * 17 ***************************************************************************/ 18 19 #ifndef __USB_H 20 #define __USB_H 21 22 #include "reg_ezusb.h" 23 24 #include <stdint.h> 25 #include <stdbool.h> 26 27 #define NULL (void *)0; 28 29 /* High and Low byte of a word (uint16_t) */ 30 #define HI8(word) (uint8_t)(((uint16_t)word >> 8) & 0xff) 31 #define LO8(word) (uint8_t)((uint16_t)word & 0xff) 32 33 /* Convenience functions */ 34 #define STALL_EP0() (EP0CS |= EP0STALL) 35 #define CLEAR_IRQ() (EXIF &= ~USBINT) 36 37 /*********** USB descriptors. See section 9.5 of the USB 1.1 spec **********/ 38 39 /* USB Descriptor Types. See USB 1.1 spec, page 187, table 9-5 */ 40 #define DESCRIPTOR_TYPE_DEVICE 0x01 41 #define DESCRIPTOR_TYPE_CONFIGURATION 0x02 42 #define DESCRIPTOR_TYPE_STRING 0x03 43 #define DESCRIPTOR_TYPE_INTERFACE 0x04 44 #define DESCRIPTOR_TYPE_ENDPOINT 0x05 45 46 #define STR_DESCR(len, ...) { len * 2 + 2, DESCRIPTOR_TYPE_STRING, { __VA_ARGS__ } } 47 48 /** USB Device Descriptor. See USB 1.1 spec, pp. 196 - 198 */ 49 struct usb_device_descriptor { 50 uint8_t bLength; /**< Size of this descriptor in bytes. */ 51 uint8_t bDescriptorType; /**< DEVICE Descriptor Type. */ 52 uint16_t bcdUSB; /**< USB specification release number (BCD). */ 53 uint8_t bDeviceClass; /**< Class code. */ 54 uint8_t bDeviceSubClass; /**< Subclass code. */ 55 uint8_t bDeviceProtocol; /**< Protocol code. */ 56 uint8_t bMaxPacketSize0; /**< Maximum packet size for EP0 (8, 16, 32, 64). */ 57 uint16_t idVendor; /**< USB Vendor ID. */ 58 uint16_t idProduct; /**< USB Product ID. */ 59 uint16_t bcdDevice; /**< Device Release Number (BCD). */ 60 uint8_t iManufacturer; /**< Index of manufacturer string descriptor. */ 61 uint8_t iProduct; /**< Index of product string descriptor. */ 62 uint8_t iSerialNumber; /**< Index of string descriptor containing serial #. */ 63 uint8_t bNumConfigurations; /**< Number of possible configurations. */ 64 }; 65 66 /** USB Configuration Descriptor. See USB 1.1 spec, pp. 199 - 200 */ 67 struct usb_config_descriptor { 68 uint8_t bLength; /**< Size of this descriptor in bytes. */ 69 uint8_t bDescriptorType; /**< CONFIGURATION descriptor type. */ 70 uint16_t wTotalLength; /**< Combined total length of all descriptors. */ 71 uint8_t bNumInterfaces; /**< Number of interfaces in this configuration. */ 72 uint8_t bConfigurationValue; /**< Value used to select this configuration. */ 73 uint8_t iConfiguration; /**< Index of configuration string descriptor. */ 74 uint8_t bmAttributes; /**< Configuration characteristics. */ 75 uint8_t MaxPower; /**< Maximum power consumption in 2 mA units. */ 76 }; 77 78 /** USB Interface Descriptor. See USB 1.1 spec, pp. 201 - 203 */ 79 struct usb_interface_descriptor { 80 uint8_t bLength; /**< Size of this descriptor in bytes. */ 81 uint8_t bDescriptorType; /**< INTERFACE descriptor type. */ 82 uint8_t bInterfaceNumber; /**< Interface number. */ 83 uint8_t bAlternateSetting; /**< Value used to select alternate setting. */ 84 uint8_t bNumEndpoints; /**< Number of endpoints used by this interface. */ 85 uint8_t bInterfaceClass; /**< Class code. */ 86 uint8_t bInterfaceSubclass; /**< Subclass code. */ 87 uint8_t bInterfaceProtocol; /**< Protocol code. */ 88 uint8_t iInterface; /**< Index of interface string descriptor. */ 89 }; 90 91 /** USB Endpoint Descriptor. See USB 1.1 spec, pp. 203 - 204 */ 92 struct usb_endpoint_descriptor { 93 uint8_t bLength; /**< Size of this descriptor in bytes. */ 94 uint8_t bDescriptorType; /**< ENDPOINT descriptor type. */ 95 uint8_t bEndpointAddress; /**< Endpoint Address: USB 1.1 spec, table 9-10. */ 96 uint8_t bmAttributes; /**< Endpoint Attributes: USB 1.1 spec, table 9-10. */ 97 uint16_t wMaxPacketSize; /**< Maximum packet size for this endpoint. */ 98 uint8_t bInterval; /**< Polling interval (in ms) for this endpoint. */ 99 }; 100 101 /** USB Language Descriptor. See USB 1.1 spec, pp. 204 - 205 */ 102 struct usb_language_descriptor { 103 uint8_t bLength; /**< Size of this descriptor in bytes. */ 104 uint8_t bDescriptorType; /**< STRING descriptor type. */ 105 uint16_t wLANGID[]; /**< LANGID codes. */ 106 }; 107 108 /** USB String Descriptor. See USB 1.1 spec, pp. 204 - 205 */ 109 struct usb_string_descriptor { 110 uint8_t bLength; /**< Size of this descriptor in bytes. */ 111 uint8_t bDescriptorType; /**< STRING descriptor type. */ 112 uint16_t bString[]; /**< UNICODE encoded string. */ 113 }; 114 115 /********************** USB Control Endpoint 0 related *********************/ 116 117 /** USB Control Setup Data. See USB 1.1 spec, pp. 183 - 185 */ 118 struct setup_data { 119 uint8_t bmRequestType; /**< Characteristics of a request. */ 120 uint8_t bRequest; /**< Specific request. */ 121 uint16_t wValue; /**< Field that varies according to request. */ 122 uint16_t wIndex; /**< Field that varies according to request. */ 123 uint16_t wLength; /**< Number of bytes to transfer in data stage. */ 124 }; 125 126 /* External declarations for variables that need to be accessed outside of 127 * the USB module */ 128 extern volatile bool EP2_out; 129 extern volatile bool EP2_in; 130 extern volatile __xdata __at 0x7FE8 struct setup_data setup_data; 131 132 /* 133 * USB Request Types (bmRequestType): See USB 1.1 spec, page 183, table 9-2 134 * 135 * Bit 7: Data transfer direction 136 * 0 = Host-to-device 137 * 1 = Device-to-host 138 * Bit 6...5: Type 139 * 0 = Standard 140 * 1 = Class 141 * 2 = Vendor 142 * 3 = Reserved 143 * Bit 4...0: Recipient 144 * 0 = Device 145 * 1 = Interface 146 * 2 = Endpoint 147 * 3 = Other 148 * 4...31 = Reserved 149 */ 150 151 #define USB_DIR_OUT 0x00 152 #define USB_DIR_IN 0x80 153 154 #define USB_REQ_TYPE_STANDARD (0x00 << 5) 155 #define USB_REQ_TYPE_CLASS (0x01 << 5) 156 #define USB_REQ_TYPE_VENDOR (0x02 << 5) 157 #define USB_REQ_TYPE_RESERVED (0x03 << 5) 158 159 #define USB_RECIP_DEVICE 0x00 160 #define USB_RECIP_INTERFACE 0x01 161 #define USB_RECIP_ENDPOINT 0x02 162 #define USB_RECIP_OTHER 0x03 163 164 /* bmRequestType for USB Standard Requests */ 165 166 /* Clear Interface Request */ 167 #define CF_DEVICE (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_DEVICE) 168 #define CF_INTERFACE (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_INTERFACE) 169 #define CF_ENDPOINT (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_ENDPOINT) 170 171 /* Get Configuration Request */ 172 #define GC_DEVICE (USB_DIR_IN | USB_REQ_TYPE_STANDARD | USB_RECIP_DEVICE) 173 174 /* Get Descriptor Request */ 175 #define GD_DEVICE (USB_DIR_IN | USB_REQ_TYPE_STANDARD | USB_RECIP_DEVICE) 176 177 /* Get Interface Request */ 178 #define GI_INTERFACE (USB_DIR_IN | USB_REQ_TYPE_STANDARD | USB_RECIP_INTERFACE) 179 180 /* Get Status Request: See USB 1.1 spec, page 190 */ 181 #define GS_DEVICE (USB_DIR_IN | USB_REQ_TYPE_STANDARD | USB_RECIP_DEVICE) 182 #define GS_INTERFACE (USB_DIR_IN | USB_REQ_TYPE_STANDARD | USB_RECIP_INTERFACE) 183 #define GS_ENDPOINT (USB_DIR_IN | USB_REQ_TYPE_STANDARD | USB_RECIP_ENDPOINT) 184 185 /* Set Address Request is handled by EZ-USB core */ 186 187 /* Set Configuration Request */ 188 #define SC_DEVICE (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_DEVICE) 189 190 /* Set Descriptor Request */ 191 #define SD_DEVICE (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_DEVICE) 192 193 /* Set Feature Request */ 194 #define SF_DEVICE (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_DEVICE) 195 #define SF_INTERFACE (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_INTERFACE) 196 #define SF_ENDPOINT (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_ENDPOINT) 197 198 /* Set Interface Request */ 199 #define SI_INTERFACE (USB_DIR_OUT | USB_REQ_TYPE_STANDARD | USB_RECIP_INTERFACE) 200 201 /* Synch Frame Request */ 202 #define SY_ENDPOINT (USB_DIR_IN | USB_REQ_TYPE_STANDARD | USB_RECIP_ENDPOINT) 203 204 /* USB Requests (bRequest): See USB 1.1 spec, table 9-4 on page 187 */ 205 #define GET_STATUS 0 206 #define CLEAR_FEATURE 1 207 /* Value '2' is reserved for future use */ 208 #define SET_FEATURE 3 209 /* Value '4' is reserved for future use */ 210 #define SET_ADDRESS 5 211 #define GET_DESCRIPTOR 6 212 #define SET_DESCRIPTOR 7 213 #define GET_CONFIGURATION 8 214 #define SET_CONFIGURATION 9 215 #define GET_INTERFACE 10 216 #define SET_INTERFACE 11 217 #define SYNCH_FRAME 12 218 219 /* Standard Feature Selectors: See USB 1.1 spec, table 9-6 on page 188 */ 220 #define DEVICE_REMOTE_WAKEUP 1 221 #define ENDPOINT_HALT 0 222 223 /************************** EZ-USB specific stuff **************************/ 224 225 /** USB Interrupts. See AN2131-TRM, page 9-4 for details */ 226 enum usb_isr { 227 SUDAV_ISR = 13, 228 SOF_ISR, 229 SUTOK_ISR, 230 SUSPEND_ISR, 231 USBRESET_ISR, 232 IBN_ISR, 233 EP0IN_ISR, 234 EP0OUT_ISR, 235 EP1IN_ISR, 236 EP1OUT_ISR, 237 EP2IN_ISR, 238 EP2OUT_ISR, 239 EP3IN_ISR, 240 EP3OUT_ISR, 241 EP4IN_ISR, 242 EP4OUT_ISR, 243 EP5IN_ISR, 244 EP5OUT_ISR, 245 EP6IN_ISR, 246 EP6OUT_ISR, 247 EP7IN_ISR, 248 EP7OUT_ISR 249 }; 250 251 /*************************** Function Prototypes ***************************/ 252 253 __xdata uint8_t *usb_get_endpoint_cs_reg(uint8_t ep); 254 void usb_reset_data_toggle(uint8_t ep); 255 256 bool usb_handle_get_status(void); 257 bool usb_handle_clear_feature(void); 258 bool usb_handle_set_feature(void); 259 bool usb_handle_get_descriptor(void); 260 void usb_handle_set_interface(void); 261 262 void usb_handle_setup_data(void); 263 void usb_init(void); 264 265 #endif 266