00001
00040 #ifndef USB_STM32_H
00041 #define USB_STM32_H
00042
00043 #include <cfg/compiler.h>
00044 #include <drv/usb.h>
00045 #include <drv/usb_endpoint.h>
00046
00047 #define USB_BASE_ADDR 0x40005C00
00048
00049 #define USB_DM_PIN (1 << 11)
00050 #define USB_DP_PIN (1 << 12)
00051 #define USB_DISC_PIN (1 << 11)
00052
00053 #define USB_EP0_MAX_SIZE CONFIG_EP0_MAX_SIZE
00054 #define USB_XFER_MAX_SIZE 64
00055
00056 #define EP_MAX_SLOTS USB_EP_MAX
00057 #define EP_MAX_NUM (EP_MAX_SLOTS << 1)
00058
00059
00060 #define USB_PACKET_MEMORY_BASE 0x40006000
00061 #define USB_PACKET_MEMORY_SIZE 512
00062
00063
00064 #define USB_BDT_OFFSET \
00065 ((USB_PACKET_MEMORY_SIZE - (sizeof(stm32_UsbBd) * EP_MAX_NUM)) & ~7)
00066
00067 #define USB_MEM_ADDR(offset) \
00068 (USB_PACKET_MEMORY_BASE + ((offset << 1) & ~3) + (offset & 1))
00069
00070 #define EP_DTB_READ(slot, offset) \
00071 (*((uint16_t *)(USB_MEM_ADDR((USB_BDT_OFFSET + \
00072 (slot) * sizeof(stm32_UsbBd) + \
00073 (offset))))))
00074
00075 #define EP_DTB_WRITE(slot, offset, data) (EP_DTB_READ(slot, offset) = data)
00076
00077 #define ADDR_TX_OFFSET offsetof(stm32_UsbBd, AddrTx)
00078 #define COUNT_TX_OFFSET offsetof(stm32_UsbBd, CountTx)
00079 #define ADDR_RX_OFFSET offsetof(stm32_UsbBd, AddrRx)
00080 #define COUNT_RX_OFFSET offsetof(stm32_UsbBd, CountRx)
00081
00082 #define USB_CTRL_RW_MASK 0x070F
00083 #define USB_CTRL_CLEAR_ONLY_MASK 0x8080
00084 #define USB_CTRL_TOGGLE_MASK 0x7070
00085
00086
00087 #define bmCTRM 0x8000
00088 #define bmPMAOVRM 0x4000
00089 #define bmERRM 0x2000
00090 #define bmWKUPM 0x1000
00091 #define bmSUSPM 0x0800
00092 #define bmRESETM 0x0400
00093 #define bmSOFM 0x0200
00094 #define bmESOFM 0x0100
00095
00096 #define bmRESUME 0x0010
00097 #define bmFSUSP 0x0008
00098 #define bmLPMODE 0x0004
00099 #define bmPDWN 0x0002
00100 #define bmFRES 0x0001
00101
00102
00103 enum stm32_usb_error
00104 {
00105 USB_OK = 0,
00106 USB_INTR_ERROR,
00107 USB_INVAL_ERROR,
00108 USB_NODEV_ERROR,
00109 USB_MEMORY_FULL,
00110 USB_BUF_OVERFLOW,
00111 USB_EP_STALLED,
00112 USB_FATAL_ERROR,
00113 };
00114
00115
00116 enum stm32_UsbEpype
00117 {
00118 EP_BULK = 0,
00119 EP_CTRL,
00120 EP_ISO,
00121 EP_INTERRUPT,
00122
00123 EP_TYPE_MAX
00124 };
00125
00126
00127 typedef union
00128 {
00129 uint32_t status;
00130 struct {
00131 uint8_t EP_ID : 4;
00132 uint8_t DIR : 1;
00133 uint8_t : 2;
00134 uint8_t SZDPR : 1;
00135 uint8_t ESOF : 1;
00136 uint8_t SOF : 1;
00137 uint8_t RESET : 1;
00138 uint8_t SUSP : 1;
00139 uint8_t WKUP : 1;
00140 uint8_t ERR : 1;
00141 uint8_t PMAOVR : 1;
00142 uint8_t CTR : 1;
00143 };
00144 } PACKED stm32_usb_irq_status_t;
00145
00146
00147 typedef enum
00148 {
00149 EP_DISABLED = 0,
00150 EP_STALL,
00151 EP_NAK,
00152 EP_VALID
00153 } stm32_UsbEpState;
00154
00155
00156 typedef enum stm32_UsbEP
00157 {
00158 CTRL_ENP_OUT = 0, CTRL_ENP_IN,
00159 ENP1_OUT, ENP1_IN,
00160 ENP2_OUT, ENP2_IN,
00161 ENP3_OUT, ENP3_IN,
00162 ENP4_OUT, ENP4_IN,
00163 ENP5_OUT, ENP5_IN,
00164 ENP6_OUT, ENP6_IN,
00165 ENP7_OUT, ENP7_IN,
00166 ENP8_OUT, ENP8_IN,
00167 ENP9_OUT, ENP9_IN,
00168 ENP10_OUT, ENP10_IN,
00169 ENP11_OUT, ENP11_IN,
00170 ENP12_OUT, ENP12_IN,
00171 ENP13_OUT, ENP13_IN,
00172 ENP14_OUT, ENP14_IN,
00173 ENP15_OUT, ENP15_IN,
00174
00175 EP_MAX_HW_NUM
00176 } stm32_UsbEP;
00177
00178
00179 typedef struct stm32_UsbMemSlot
00180 {
00181 stm32_UsbEP ep_addr;
00182 uint16_t Start;
00183 uint16_t Size;
00184 struct stm32_UsbMemSlot *next;
00185 } stm32_UsbMemSlot;
00186
00187
00188 typedef struct stm32_UsbBd
00189 {
00190 uint16_t AddrTx;
00191 uint16_t CountTx;
00192 uint16_t AddrRx;
00193 uint16_t CountRx;
00194 } PACKED stm32_UsbBd;
00195
00196
00197 typedef enum stm32_UsbIoStatus
00198 {
00199 NOT_READY = 0,
00200 NO_SERVICED,
00201 BEGIN_SERVICED,
00202 COMPLETE,
00203 BUFFER_UNDERRUN,
00204 BUFFER_OVERRUN,
00205 SETUP_OVERWRITE,
00206 STALLED,
00207 } stm32_UsbIoStatus;
00208
00209
00210 typedef struct stm32_UsbEp
00211 {
00212 reg32_t *hw;
00213 uint8_t type;
00214 void (*complete)(int);
00215 ssize_t max_size;
00216 ssize_t offset;
00217 ssize_t size;
00218 stm32_UsbIoStatus status;
00219 union
00220 {
00221 uint8_t *read_buffer;
00222 const uint8_t *write_buffer;
00223 };
00224 int32_t avail_data;
00225 uint8_t flags;
00226 } stm32_UsbEp;
00227
00228
00229 #define STM32_USB_EP_AVAIL_DATA BV(0)
00230 #define STM32_USB_EP_ZERO_PACKET BV(1)
00231 #define STM32_USB_EP_ZERO_POSSIBLE BV(2)
00232
00233 #endif