USB device stack - Added support for the logo/windows key to USB keyboard.

Dependents:   randomSearch

Fork of USBDevice by mbed official

Committer:
mbed_official
Date:
Thu Nov 06 14:00:36 2014 +0000
Revision:
36:4d3e7f3d5211
Parent:
35:a8484e16c2f3
Child:
40:3b1c43ac045c
Synchronized with git revision 142ad22a2f984ef06fda17529a2ddc72016b7e1f

Full URL: https://github.com/mbedmicro/mbed/commit/142ad22a2f984ef06fda17529a2ddc72016b7e1f/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 35:a8484e16c2f3 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
mbed_official 35:a8484e16c2f3 2 *
mbed_official 35:a8484e16c2f3 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
mbed_official 35:a8484e16c2f3 4 * and associated documentation files (the "Software"), to deal in the Software without
mbed_official 35:a8484e16c2f3 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
mbed_official 35:a8484e16c2f3 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
mbed_official 35:a8484e16c2f3 7 * Software is furnished to do so, subject to the following conditions:
mbed_official 35:a8484e16c2f3 8 *
mbed_official 35:a8484e16c2f3 9 * The above copyright notice and this permission notice shall be included in all copies or
mbed_official 35:a8484e16c2f3 10 * substantial portions of the Software.
mbed_official 35:a8484e16c2f3 11 *
mbed_official 35:a8484e16c2f3 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
mbed_official 35:a8484e16c2f3 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
mbed_official 35:a8484e16c2f3 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
mbed_official 35:a8484e16c2f3 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mbed_official 35:a8484e16c2f3 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
mbed_official 35:a8484e16c2f3 17 */
mbed_official 35:a8484e16c2f3 18
mbed_official 35:a8484e16c2f3 19 #if defined(TARGET_RZ_A1H)
mbed_official 35:a8484e16c2f3 20
mbed_official 35:a8484e16c2f3 21 /*
mbed_official 35:a8484e16c2f3 22 This class can use the pipe1, pipe3 and pipe6 only. You should
mbed_official 35:a8484e16c2f3 23 re-program this class if you wanted to use other pipe.
mbed_official 35:a8484e16c2f3 24 */
mbed_official 35:a8484e16c2f3 25
mbed_official 35:a8484e16c2f3 26 /*************************************************************************/
mbed_official 35:a8484e16c2f3 27 extern "C"
mbed_official 35:a8484e16c2f3 28 {
mbed_official 35:a8484e16c2f3 29 #include "r_typedefs.h"
mbed_official 35:a8484e16c2f3 30 #include "iodefine.h"
mbed_official 35:a8484e16c2f3 31 }
mbed_official 35:a8484e16c2f3 32 #include "USBHAL.h"
mbed_official 35:a8484e16c2f3 33 #include "devdrv_usb_function_api.h"
mbed_official 35:a8484e16c2f3 34 #include "usb0_function.h"
mbed_official 36:4d3e7f3d5211 35 #include "usb_iobitmask.h"
mbed_official 35:a8484e16c2f3 36 #include "rza_io_regrw.h"
mbed_official 35:a8484e16c2f3 37 #include "USBDevice_Types.h"
mbed_official 35:a8484e16c2f3 38
mbed_official 35:a8484e16c2f3 39
mbed_official 35:a8484e16c2f3 40 /*************************************************************************/
mbed_official 35:a8484e16c2f3 41 /* constants */
mbed_official 35:a8484e16c2f3 42 const struct PIPECFGREC {
mbed_official 35:a8484e16c2f3 43 uint16_t endpoint;
mbed_official 35:a8484e16c2f3 44 uint16_t pipesel;
mbed_official 35:a8484e16c2f3 45 uint16_t pipecfg;
mbed_official 35:a8484e16c2f3 46 uint16_t pipebuf;
mbed_official 35:a8484e16c2f3 47 uint16_t pipemaxp;
mbed_official 35:a8484e16c2f3 48 uint16_t pipeperi;
mbed_official 35:a8484e16c2f3 49 } def_pipecfg[] = {
mbed_official 35:a8484e16c2f3 50 /*EP0OUT and EP0IN are configured by USB IP*/
mbed_official 35:a8484e16c2f3 51 {
mbed_official 35:a8484e16c2f3 52 EP1OUT, /*EP1: Host -> Func, INT*/
mbed_official 35:a8484e16c2f3 53 6 | USB_FUNCTION_D0FIFO_USE,
mbed_official 35:a8484e16c2f3 54 USB_FUNCTION_INTERRUPT |
mbed_official 35:a8484e16c2f3 55 USB_FUNCTION_BFREOFF |
mbed_official 35:a8484e16c2f3 56 USB_FUNCTION_DBLBOFF |
mbed_official 35:a8484e16c2f3 57 USB_FUNCTION_CNTMDON |
mbed_official 35:a8484e16c2f3 58 USB_FUNCTION_SHTNAKOFF |
mbed_official 35:a8484e16c2f3 59 USB_FUNCTION_DIR_P_OUT |
mbed_official 35:a8484e16c2f3 60 USB_FUNCTION_EP1,
mbed_official 35:a8484e16c2f3 61 ( ( ( 64) / 64 - 1 ) << 10 ) | 0x04u,
mbed_official 35:a8484e16c2f3 62 64,
mbed_official 35:a8484e16c2f3 63 DEVDRV_USBF_OFF | 0,
mbed_official 35:a8484e16c2f3 64 },
mbed_official 35:a8484e16c2f3 65 {
mbed_official 35:a8484e16c2f3 66 EP1IN, /*EP1: Host <- Func, INT*/
mbed_official 35:a8484e16c2f3 67 7 | USB_FUNCTION_D1FIFO_USE,
mbed_official 35:a8484e16c2f3 68 USB_FUNCTION_INTERRUPT |
mbed_official 35:a8484e16c2f3 69 USB_FUNCTION_BFREOFF |
mbed_official 35:a8484e16c2f3 70 USB_FUNCTION_DBLBOFF |
mbed_official 35:a8484e16c2f3 71 USB_FUNCTION_CNTMDOFF |
mbed_official 35:a8484e16c2f3 72 USB_FUNCTION_SHTNAKOFF |
mbed_official 35:a8484e16c2f3 73 USB_FUNCTION_DIR_P_IN |
mbed_official 35:a8484e16c2f3 74 USB_FUNCTION_EP1,
mbed_official 35:a8484e16c2f3 75 ( ( ( 64) / 64 - 1 ) << 10 ) | 0x05u,
mbed_official 35:a8484e16c2f3 76 64,
mbed_official 35:a8484e16c2f3 77 DEVDRV_USBF_OFF | 0,
mbed_official 35:a8484e16c2f3 78 },
mbed_official 35:a8484e16c2f3 79 {
mbed_official 35:a8484e16c2f3 80 EP2OUT, /*EP2: Host -> Func, BULK*/
mbed_official 35:a8484e16c2f3 81 3 | USB_FUNCTION_D0FIFO_USE,
mbed_official 35:a8484e16c2f3 82 USB_FUNCTION_BULK |
mbed_official 35:a8484e16c2f3 83 USB_FUNCTION_BFREOFF |
mbed_official 35:a8484e16c2f3 84 USB_FUNCTION_DBLBON |
mbed_official 35:a8484e16c2f3 85 USB_FUNCTION_CNTMDON |
mbed_official 35:a8484e16c2f3 86 USB_FUNCTION_SHTNAKON |
mbed_official 35:a8484e16c2f3 87 USB_FUNCTION_DIR_P_OUT |
mbed_official 35:a8484e16c2f3 88 USB_FUNCTION_EP2,
mbed_official 35:a8484e16c2f3 89 ( ( (2048) / 64 - 1 ) << 10 ) | 0x30u,
mbed_official 35:a8484e16c2f3 90 512,
mbed_official 35:a8484e16c2f3 91 DEVDRV_USBF_OFF | 0,
mbed_official 35:a8484e16c2f3 92 },
mbed_official 35:a8484e16c2f3 93 {
mbed_official 35:a8484e16c2f3 94 EP2IN, /*EP2: Host <- Func, BULK*/
mbed_official 35:a8484e16c2f3 95 4 | USB_FUNCTION_D1FIFO_USE,
mbed_official 35:a8484e16c2f3 96 USB_FUNCTION_BULK |
mbed_official 35:a8484e16c2f3 97 USB_FUNCTION_BFREOFF |
mbed_official 35:a8484e16c2f3 98 USB_FUNCTION_DBLBOFF |
mbed_official 35:a8484e16c2f3 99 USB_FUNCTION_CNTMDON |
mbed_official 35:a8484e16c2f3 100 USB_FUNCTION_SHTNAKOFF |
mbed_official 35:a8484e16c2f3 101 USB_FUNCTION_DIR_P_IN |
mbed_official 35:a8484e16c2f3 102 USB_FUNCTION_EP2,
mbed_official 35:a8484e16c2f3 103 ( ( (2048) / 64 - 1 ) << 10 ) | 0x50u,
mbed_official 35:a8484e16c2f3 104 512,
mbed_official 35:a8484e16c2f3 105 DEVDRV_USBF_OFF | 0,
mbed_official 35:a8484e16c2f3 106 },
mbed_official 35:a8484e16c2f3 107 {
mbed_official 35:a8484e16c2f3 108 EP3OUT, /*EP3: Host -> Func, ISO*/
mbed_official 35:a8484e16c2f3 109 1 | USB_FUNCTION_D0FIFO_USE,
mbed_official 35:a8484e16c2f3 110 USB_FUNCTION_ISO |
mbed_official 35:a8484e16c2f3 111 USB_FUNCTION_BFREOFF |
mbed_official 35:a8484e16c2f3 112 USB_FUNCTION_DBLBON |
mbed_official 35:a8484e16c2f3 113 USB_FUNCTION_CNTMDON |
mbed_official 35:a8484e16c2f3 114 USB_FUNCTION_SHTNAKON |
mbed_official 35:a8484e16c2f3 115 USB_FUNCTION_DIR_P_OUT |
mbed_official 35:a8484e16c2f3 116 USB_FUNCTION_EP3,
mbed_official 35:a8484e16c2f3 117 ( ( (1024) / 64 - 1 ) << 10 ) | 0x10u,
mbed_official 35:a8484e16c2f3 118 192,
mbed_official 35:a8484e16c2f3 119 DEVDRV_USBF_OFF | 1,
mbed_official 35:a8484e16c2f3 120 },
mbed_official 35:a8484e16c2f3 121 {
mbed_official 35:a8484e16c2f3 122 EP3IN, /*EP3: Host <- Func, ISO*/
mbed_official 35:a8484e16c2f3 123 2 | USB_FUNCTION_D1FIFO_USE,
mbed_official 35:a8484e16c2f3 124 USB_FUNCTION_ISO |
mbed_official 35:a8484e16c2f3 125 USB_FUNCTION_BFREOFF |
mbed_official 35:a8484e16c2f3 126 USB_FUNCTION_DBLBON |
mbed_official 35:a8484e16c2f3 127 USB_FUNCTION_CNTMDON |
mbed_official 35:a8484e16c2f3 128 USB_FUNCTION_SHTNAKOFF |
mbed_official 35:a8484e16c2f3 129 USB_FUNCTION_DIR_P_IN |
mbed_official 35:a8484e16c2f3 130 USB_FUNCTION_EP3,
mbed_official 35:a8484e16c2f3 131 ( ( (1024) / 64 - 1 ) << 10 ) | 0x20u,
mbed_official 35:a8484e16c2f3 132 192,
mbed_official 35:a8484e16c2f3 133 DEVDRV_USBF_OFF | 1,
mbed_official 35:a8484e16c2f3 134 },
mbed_official 35:a8484e16c2f3 135 { /*terminator*/
mbed_official 35:a8484e16c2f3 136 0, 0, 0, 0, 0,
mbed_official 35:a8484e16c2f3 137 },
mbed_official 35:a8484e16c2f3 138 };
mbed_official 35:a8484e16c2f3 139
mbed_official 35:a8484e16c2f3 140
mbed_official 35:a8484e16c2f3 141 /*************************************************************************/
mbed_official 35:a8484e16c2f3 142 /* workareas */
mbed_official 35:a8484e16c2f3 143 USBHAL * USBHAL::instance;
mbed_official 35:a8484e16c2f3 144
mbed_official 35:a8484e16c2f3 145
mbed_official 35:a8484e16c2f3 146 static IRQn_Type int_id; /* interrupt ID */
mbed_official 35:a8484e16c2f3 147 static uint16_t int_level; /* initerrupt level */
mbed_official 35:a8484e16c2f3 148 static uint16_t clock_mode; /* input clock selector */
mbed_official 35:a8484e16c2f3 149 static uint16_t mode; /* USB speed (HIGH/FULL) */
mbed_official 35:a8484e16c2f3 150
mbed_official 35:a8484e16c2f3 151 static DigitalOut *usb0_en;
mbed_official 35:a8484e16c2f3 152
mbed_official 35:a8484e16c2f3 153 static uint16_t EP0_read_status;
mbed_official 35:a8484e16c2f3 154 static uint16_t EPx_read_status;
mbed_official 35:a8484e16c2f3 155
mbed_official 35:a8484e16c2f3 156 static uint16_t setup_buffer[MAX_PACKET_SIZE_EP0 / 2];
mbed_official 35:a8484e16c2f3 157
mbed_official 35:a8484e16c2f3 158 /* 0: not used / other: a pipe number to use recv_buffer*/
mbed_official 35:a8484e16c2f3 159 static uint8_t recv_buffer[MAX_PACKET_SIZE_EPBULK];
mbed_official 35:a8484e16c2f3 160 volatile static uint16_t recv_error;
mbed_official 35:a8484e16c2f3 161
mbed_official 35:a8484e16c2f3 162
mbed_official 35:a8484e16c2f3 163
mbed_official 35:a8484e16c2f3 164 /*************************************************************************/
mbed_official 35:a8484e16c2f3 165 /* prototypes for C */
mbed_official 35:a8484e16c2f3 166
mbed_official 35:a8484e16c2f3 167 /* This C++ functions changed to macro functions.
mbed_official 35:a8484e16c2f3 168 static uint32_t EP2PIPE(uint8_t endpoint);
mbed_official 35:a8484e16c2f3 169 static void usb0_function_save_request(void);
mbed_official 35:a8484e16c2f3 170 void usb0_function_BRDYInterrupt(uint16_t status, uint16_t intenb);
mbed_official 35:a8484e16c2f3 171 void usb0_function_NRDYInterrupt (uint16_t status, uint16_t intenb);
mbed_official 35:a8484e16c2f3 172 void usb0_function_BEMPInterrupt (uint16_t status, uint16_t intenb);
mbed_official 35:a8484e16c2f3 173 */
mbed_official 35:a8484e16c2f3 174
mbed_official 35:a8484e16c2f3 175 /*************************************************************************/
mbed_official 35:a8484e16c2f3 176 /* macros */
mbed_official 35:a8484e16c2f3 177
mbed_official 35:a8484e16c2f3 178 /******************************************************************************
mbed_official 35:a8484e16c2f3 179 * Function Name: usb0_function_BRDYInterruptPIPE0
mbed_official 35:a8484e16c2f3 180 * Description : Executes BRDY interrupt for pipe0.
mbed_official 35:a8484e16c2f3 181 * Arguments : uint16_t status ; BRDYSTS Register Value
mbed_official 35:a8484e16c2f3 182 * : uint16_t intenb ; BRDYENB Register Value
mbed_official 35:a8484e16c2f3 183 * Return Value : none
mbed_official 35:a8484e16c2f3 184 *****************************************************************************/
mbed_official 35:a8484e16c2f3 185 #define usb0_function_BRDYInterruptPIPE0(status, intenb) \
mbed_official 35:a8484e16c2f3 186 { \
mbed_official 35:a8484e16c2f3 187 volatile uint16_t dumy_sts; \
mbed_official 35:a8484e16c2f3 188 uint16_t read_status; \
mbed_official 35:a8484e16c2f3 189 \
mbed_official 35:a8484e16c2f3 190 USB200.BRDYSTS = \
mbed_official 35:a8484e16c2f3 191 (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0]; \
mbed_official 35:a8484e16c2f3 192 RZA_IO_RegWrite_16( \
mbed_official 35:a8484e16c2f3 193 &USB200.CFIFOSEL, USB_FUNCTION_PIPE0, \
mbed_official 35:a8484e16c2f3 194 USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE); \
mbed_official 35:a8484e16c2f3 195 \
mbed_official 35:a8484e16c2f3 196 g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0] = \
mbed_official 35:a8484e16c2f3 197 g_usb0_function_data_count[USB_FUNCTION_PIPE0]; \
mbed_official 35:a8484e16c2f3 198 \
mbed_official 35:a8484e16c2f3 199 read_status = usb0_function_read_buffer_c(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 200 \
mbed_official 35:a8484e16c2f3 201 g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0] -= \
mbed_official 35:a8484e16c2f3 202 g_usb0_function_data_count[USB_FUNCTION_PIPE0]; \
mbed_official 35:a8484e16c2f3 203 \
mbed_official 35:a8484e16c2f3 204 switch (read_status) { \
mbed_official 35:a8484e16c2f3 205 case USB_FUNCTION_READING: /* Continue of data read */ \
mbed_official 35:a8484e16c2f3 206 case USB_FUNCTION_READEND: /* End of data read */ \
mbed_official 35:a8484e16c2f3 207 /* PID = BUF */ \
mbed_official 35:a8484e16c2f3 208 usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 209 \
mbed_official 35:a8484e16c2f3 210 /*callback*/ \
mbed_official 35:a8484e16c2f3 211 EP0out(); \
mbed_official 35:a8484e16c2f3 212 break; \
mbed_official 35:a8484e16c2f3 213 \
mbed_official 35:a8484e16c2f3 214 case USB_FUNCTION_READSHRT: /* End of data read */ \
mbed_official 35:a8484e16c2f3 215 usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 216 /* PID = BUF */ \
mbed_official 35:a8484e16c2f3 217 usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 218 \
mbed_official 35:a8484e16c2f3 219 /*callback*/ \
mbed_official 35:a8484e16c2f3 220 EP0out(); \
mbed_official 35:a8484e16c2f3 221 break; \
mbed_official 35:a8484e16c2f3 222 \
mbed_official 35:a8484e16c2f3 223 case USB_FUNCTION_READOVER: /* FIFO access error */ \
mbed_official 35:a8484e16c2f3 224 /* Buffer Clear */ \
mbed_official 35:a8484e16c2f3 225 USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; \
mbed_official 35:a8484e16c2f3 226 usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 227 /* Req Error */ \
mbed_official 35:a8484e16c2f3 228 usb0_function_set_pid_stall(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 229 \
mbed_official 35:a8484e16c2f3 230 /*callback*/ \
mbed_official 35:a8484e16c2f3 231 EP0out(); \
mbed_official 35:a8484e16c2f3 232 break; \
mbed_official 35:a8484e16c2f3 233 \
mbed_official 35:a8484e16c2f3 234 case DEVDRV_USBF_FIFOERROR: /* FIFO access error */ \
mbed_official 35:a8484e16c2f3 235 default: \
mbed_official 35:a8484e16c2f3 236 usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 237 /* Req Error */ \
mbed_official 35:a8484e16c2f3 238 usb0_function_set_pid_stall(USB_FUNCTION_PIPE0); \
mbed_official 35:a8484e16c2f3 239 break; \
mbed_official 35:a8484e16c2f3 240 } \
mbed_official 35:a8484e16c2f3 241 /* Three dummy reads for clearing interrupt requests */ \
mbed_official 35:a8484e16c2f3 242 dumy_sts = USB200.BRDYSTS; \
mbed_official 35:a8484e16c2f3 243 }
mbed_official 35:a8484e16c2f3 244
mbed_official 35:a8484e16c2f3 245
mbed_official 35:a8484e16c2f3 246
mbed_official 35:a8484e16c2f3 247 /******************************************************************************
mbed_official 35:a8484e16c2f3 248 * Function Name: usb0_function_BRDYInterrupt
mbed_official 35:a8484e16c2f3 249 * Description : Executes BRDY interrupt uxclude pipe0.
mbed_official 35:a8484e16c2f3 250 * Arguments : uint16_t status ; BRDYSTS Register Value
mbed_official 35:a8484e16c2f3 251 * : uint16_t intenb ; BRDYENB Register Value
mbed_official 35:a8484e16c2f3 252 * Return Value : none
mbed_official 35:a8484e16c2f3 253 *****************************************************************************/
mbed_official 35:a8484e16c2f3 254 #define usb0_function_BRDYInterrupt(status, intenb) \
mbed_official 35:a8484e16c2f3 255 { \
mbed_official 35:a8484e16c2f3 256 volatile uint16_t dumy_sts; \
mbed_official 35:a8484e16c2f3 257 \
mbed_official 35:a8484e16c2f3 258 /************************************************************** \
mbed_official 35:a8484e16c2f3 259 * Function Name: usb0_function_brdy_int \
mbed_official 35:a8484e16c2f3 260 * Description : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9). \
mbed_official 35:a8484e16c2f3 261 * : According to the pipe that interrupt is generated in, \
mbed_official 35:a8484e16c2f3 262 * : reads/writes buffer allocated in the pipe. \
mbed_official 35:a8484e16c2f3 263 * : This function is executed in the BRDY \
mbed_official 35:a8484e16c2f3 264 * : interrupt handler. This function \
mbed_official 35:a8484e16c2f3 265 * : clears BRDY interrupt status and BEMP \
mbed_official 35:a8484e16c2f3 266 * : interrupt status. \
mbed_official 35:a8484e16c2f3 267 * Arguments : uint16_t Status ; BRDYSTS Register Value \
mbed_official 35:a8484e16c2f3 268 * : uint16_t Int_enbl ; BRDYENB Register Value \
mbed_official 35:a8484e16c2f3 269 * Return Value : none \
mbed_official 35:a8484e16c2f3 270 *************************************************************/ \
mbed_official 35:a8484e16c2f3 271 /* copied from usb0_function_intrn.c */ \
mbed_official 35:a8484e16c2f3 272 uint32_t int_sense = 0; \
mbed_official 35:a8484e16c2f3 273 uint16_t pipe; \
mbed_official 35:a8484e16c2f3 274 uint16_t pipebit; \
mbed_official 35:a8484e16c2f3 275 uint16_t ep; \
mbed_official 35:a8484e16c2f3 276 \
mbed_official 35:a8484e16c2f3 277 for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) { \
mbed_official 35:a8484e16c2f3 278 pipebit = g_usb0_function_bit_set[pipe]; \
mbed_official 35:a8484e16c2f3 279 \
mbed_official 35:a8484e16c2f3 280 if ((status & pipebit) && (intenb & pipebit)) { \
mbed_official 35:a8484e16c2f3 281 USB200.BRDYSTS = (uint16_t)~pipebit; \
mbed_official 35:a8484e16c2f3 282 USB200.BEMPSTS = (uint16_t)~pipebit; \
mbed_official 35:a8484e16c2f3 283 \
mbed_official 35:a8484e16c2f3 284 switch (g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) { \
mbed_official 35:a8484e16c2f3 285 case USB_FUNCTION_D0FIFO_DMA: \
mbed_official 35:a8484e16c2f3 286 if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) { \
mbed_official 35:a8484e16c2f3 287 /*now, DMA is not supported*/ \
mbed_official 35:a8484e16c2f3 288 usb0_function_dma_interrupt_d0fifo(int_sense); \
mbed_official 35:a8484e16c2f3 289 } \
mbed_official 35:a8484e16c2f3 290 \
mbed_official 35:a8484e16c2f3 291 if (RZA_IO_RegRead_16( \
mbed_official 35:a8484e16c2f3 292 &g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) { \
mbed_official 35:a8484e16c2f3 293 /*now, DMA is not supported*/ \
mbed_official 35:a8484e16c2f3 294 usb0_function_read_dma(pipe); \
mbed_official 35:a8484e16c2f3 295 usb0_function_disable_brdy_int(pipe); \
mbed_official 35:a8484e16c2f3 296 } else { \
mbed_official 35:a8484e16c2f3 297 USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; \
mbed_official 35:a8484e16c2f3 298 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; \
mbed_official 35:a8484e16c2f3 299 } \
mbed_official 35:a8484e16c2f3 300 break; \
mbed_official 35:a8484e16c2f3 301 \
mbed_official 35:a8484e16c2f3 302 case USB_FUNCTION_D1FIFO_DMA: \
mbed_official 35:a8484e16c2f3 303 if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) { \
mbed_official 35:a8484e16c2f3 304 /*now, DMA is not supported*/ \
mbed_official 35:a8484e16c2f3 305 usb0_function_dma_interrupt_d1fifo(int_sense); \
mbed_official 35:a8484e16c2f3 306 } \
mbed_official 35:a8484e16c2f3 307 \
mbed_official 35:a8484e16c2f3 308 if (RZA_IO_RegRead_16( \
mbed_official 35:a8484e16c2f3 309 &g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) { \
mbed_official 35:a8484e16c2f3 310 /*now, DMA is not supported*/ \
mbed_official 35:a8484e16c2f3 311 usb0_function_read_dma(pipe); \
mbed_official 35:a8484e16c2f3 312 usb0_function_disable_brdy_int(pipe); \
mbed_official 35:a8484e16c2f3 313 } else { \
mbed_official 35:a8484e16c2f3 314 USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; \
mbed_official 35:a8484e16c2f3 315 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; \
mbed_official 35:a8484e16c2f3 316 } \
mbed_official 35:a8484e16c2f3 317 break; \
mbed_official 35:a8484e16c2f3 318 \
mbed_official 35:a8484e16c2f3 319 default: \
mbed_official 35:a8484e16c2f3 320 ep = (g_usb0_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT; \
mbed_official 35:a8484e16c2f3 321 ep <<= 1; \
mbed_official 35:a8484e16c2f3 322 ep += (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0)? \
mbed_official 35:a8484e16c2f3 323 (0): (1); \
mbed_official 35:a8484e16c2f3 324 EPx_read_status = DEVDRV_USBF_PIPE_WAIT; \
mbed_official 35:a8484e16c2f3 325 (instance->*(epCallback[ep - 2])) (); \
mbed_official 35:a8484e16c2f3 326 EPx_read_status = DEVDRV_USBF_PIPE_DONE; \
mbed_official 35:a8484e16c2f3 327 } \
mbed_official 35:a8484e16c2f3 328 } \
mbed_official 35:a8484e16c2f3 329 } \
mbed_official 35:a8484e16c2f3 330 /* Three dummy reads for clearing interrupt requests */ \
mbed_official 35:a8484e16c2f3 331 dumy_sts = USB200.BRDYSTS; \
mbed_official 35:a8484e16c2f3 332 }
mbed_official 35:a8484e16c2f3 333
mbed_official 35:a8484e16c2f3 334
mbed_official 35:a8484e16c2f3 335 /******************************************************************************
mbed_official 35:a8484e16c2f3 336 * Function Name: usb0_function_NRDYInterruptPIPE0
mbed_official 35:a8484e16c2f3 337 * Description : Executes NRDY interrupt for pipe0.
mbed_official 35:a8484e16c2f3 338 * Arguments : uint16_t status ; NRDYSTS Register Value
mbed_official 35:a8484e16c2f3 339 * : uint16_t intenb ; NRDYENB Register Value
mbed_official 35:a8484e16c2f3 340 * Return Value : none
mbed_official 35:a8484e16c2f3 341 *****************************************************************************/
mbed_official 35:a8484e16c2f3 342 #define usb0_function_NRDYInterruptPIPE0(status, intenb) \
mbed_official 35:a8484e16c2f3 343 { \
mbed_official 35:a8484e16c2f3 344 volatile uint16_t dumy_sts; \
mbed_official 35:a8484e16c2f3 345 \
mbed_official 35:a8484e16c2f3 346 USB200.NRDYSTS = \
mbed_official 35:a8484e16c2f3 347 (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0]; \
mbed_official 35:a8484e16c2f3 348 \
mbed_official 35:a8484e16c2f3 349 /* Three dummy reads for clearing interrupt requests */ \
mbed_official 35:a8484e16c2f3 350 dumy_sts = USB200.NRDYSTS; \
mbed_official 35:a8484e16c2f3 351 }
mbed_official 35:a8484e16c2f3 352
mbed_official 35:a8484e16c2f3 353 /******************************************************************************
mbed_official 35:a8484e16c2f3 354 * Function Name: usb0_function_NRDYInterrupt
mbed_official 35:a8484e16c2f3 355 * Description : Executes NRDY interrupt exclude pipe0.
mbed_official 35:a8484e16c2f3 356 * Arguments : uint16_t status ; NRDYSTS Register Value
mbed_official 35:a8484e16c2f3 357 * : uint16_t intenb ; NRDYENB Register Value
mbed_official 35:a8484e16c2f3 358 * Return Value : none
mbed_official 35:a8484e16c2f3 359 *****************************************************************************/
mbed_official 35:a8484e16c2f3 360 #define usb0_function_NRDYInterrupt(status, intenb) \
mbed_official 35:a8484e16c2f3 361 { \
mbed_official 35:a8484e16c2f3 362 volatile uint16_t dumy_sts; \
mbed_official 35:a8484e16c2f3 363 \
mbed_official 35:a8484e16c2f3 364 usb0_function_nrdy_int(status, intenb); \
mbed_official 35:a8484e16c2f3 365 \
mbed_official 35:a8484e16c2f3 366 /* Three dummy reads for clearing interrupt requests */ \
mbed_official 35:a8484e16c2f3 367 dumy_sts = USB200.NRDYSTS; \
mbed_official 35:a8484e16c2f3 368 }
mbed_official 35:a8484e16c2f3 369
mbed_official 35:a8484e16c2f3 370
mbed_official 35:a8484e16c2f3 371 /******************************************************************************
mbed_official 35:a8484e16c2f3 372 * Function Name: usb0_function_BEMPInterruptPIPE0
mbed_official 35:a8484e16c2f3 373 * Description : Executes BEMP interrupt for pipe0.
mbed_official 35:a8484e16c2f3 374 * Arguments : uint16_t status ; BEMPSTS Register Value
mbed_official 35:a8484e16c2f3 375 * : uint16_t intenb ; BEMPENB Register Value
mbed_official 35:a8484e16c2f3 376 * Return Value : none
mbed_official 35:a8484e16c2f3 377 *****************************************************************************/
mbed_official 35:a8484e16c2f3 378 #define usb0_function_BEMPInterruptPIPE0(status, intenb) \
mbed_official 35:a8484e16c2f3 379 { \
mbed_official 35:a8484e16c2f3 380 volatile uint16_t dumy_sts; \
mbed_official 35:a8484e16c2f3 381 \
mbed_official 35:a8484e16c2f3 382 USB200.BEMPSTS = \
mbed_official 35:a8484e16c2f3 383 (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0]; \
mbed_official 35:a8484e16c2f3 384 RZA_IO_RegWrite_16( \
mbed_official 35:a8484e16c2f3 385 &USB200.CFIFOSEL, USB_FUNCTION_PIPE0, \
mbed_official 35:a8484e16c2f3 386 USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE); \
mbed_official 35:a8484e16c2f3 387 \
mbed_official 35:a8484e16c2f3 388 /*usb0_function_write_buffer_c(USB_FUNCTION_PIPE0);*/ \
mbed_official 35:a8484e16c2f3 389 EP0in(); \
mbed_official 35:a8484e16c2f3 390 \
mbed_official 35:a8484e16c2f3 391 /* Three dummy reads for clearing interrupt requests */ \
mbed_official 35:a8484e16c2f3 392 dumy_sts = USB200.BEMPSTS; \
mbed_official 35:a8484e16c2f3 393 }
mbed_official 35:a8484e16c2f3 394
mbed_official 35:a8484e16c2f3 395
mbed_official 35:a8484e16c2f3 396 /******************************************************************************
mbed_official 35:a8484e16c2f3 397 * Function Name: usb0_function_BEMPInterrupt
mbed_official 35:a8484e16c2f3 398 * Description : Executes BEMP interrupt exclude pipe0.
mbed_official 35:a8484e16c2f3 399 * Arguments : uint16_t status ; BEMPSTS Register Value
mbed_official 35:a8484e16c2f3 400 * : uint16_t intenb ; BEMPENB Register Value
mbed_official 35:a8484e16c2f3 401 * Return Value : none
mbed_official 35:a8484e16c2f3 402 *****************************************************************************/
mbed_official 35:a8484e16c2f3 403 #define usb0_function_BEMPInterrupt(status, intenb) \
mbed_official 35:a8484e16c2f3 404 { \
mbed_official 35:a8484e16c2f3 405 volatile uint16_t dumy_sts; \
mbed_official 35:a8484e16c2f3 406 \
mbed_official 35:a8484e16c2f3 407 usb0_function_bemp_int(status, intenb); \
mbed_official 35:a8484e16c2f3 408 \
mbed_official 35:a8484e16c2f3 409 /* Three dummy reads for clearing interrupt requests */ \
mbed_official 35:a8484e16c2f3 410 dumy_sts = USB200.BEMPSTS; \
mbed_official 35:a8484e16c2f3 411 }
mbed_official 35:a8484e16c2f3 412
mbed_official 35:a8484e16c2f3 413
mbed_official 35:a8484e16c2f3 414 /******************************************************************************
mbed_official 35:a8484e16c2f3 415 * Function Name: EP2PIPE
mbed_official 35:a8484e16c2f3 416 * Description : Converts from endpoint to pipe
mbed_official 35:a8484e16c2f3 417 * Arguments : number of endpoint
mbed_official 35:a8484e16c2f3 418 * Return Value : number of pipe
mbed_official 35:a8484e16c2f3 419 *****************************************************************************/
mbed_official 35:a8484e16c2f3 420 /*EP2PIPE converter is for pipe1, pipe3 and pipe6 only.*/
mbed_official 35:a8484e16c2f3 421 #define EP2PIPE(endpoint) ((uint32_t)usb0_function_EpToPipe(endpoint))
mbed_official 35:a8484e16c2f3 422
mbed_official 35:a8484e16c2f3 423
mbed_official 35:a8484e16c2f3 424 /******************************************************************************
mbed_official 35:a8484e16c2f3 425 * Function Name: usb0_function_save_request
mbed_official 35:a8484e16c2f3 426 * Description : Retains the USB request information in variables.
mbed_official 35:a8484e16c2f3 427 * Arguments : none
mbed_official 35:a8484e16c2f3 428 * Return Value : none
mbed_official 35:a8484e16c2f3 429 *****************************************************************************/
mbed_official 35:a8484e16c2f3 430 #define usb0_function_save_request() \
mbed_official 35:a8484e16c2f3 431 { \
mbed_official 35:a8484e16c2f3 432 uint16_t *bufO = &setup_buffer[0]; \
mbed_official 35:a8484e16c2f3 433 \
mbed_official 35:a8484e16c2f3 434 USB200.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVALID; \
mbed_official 35:a8484e16c2f3 435 /*data[0] <= bmRequest, data[1] <= bmRequestType */ \
mbed_official 35:a8484e16c2f3 436 *bufO++ = USB200.USBREQ; \
mbed_official 35:a8484e16c2f3 437 /*data[2] data[3] <= wValue*/ \
mbed_official 35:a8484e16c2f3 438 *bufO++ = USB200.USBVAL; \
mbed_official 35:a8484e16c2f3 439 /*data[4] data[5] <= wIndex*/ \
mbed_official 35:a8484e16c2f3 440 *bufO++ = USB200.USBINDX; \
mbed_official 35:a8484e16c2f3 441 /*data[6] data[6] <= wIndex*/ \
mbed_official 35:a8484e16c2f3 442 *bufO++ = USB200.USBLENG; \
mbed_official 35:a8484e16c2f3 443 }
mbed_official 35:a8484e16c2f3 444
mbed_official 35:a8484e16c2f3 445
mbed_official 35:a8484e16c2f3 446 /*************************************************************************/
mbed_official 35:a8484e16c2f3 447 /*************************************************************************/
mbed_official 35:a8484e16c2f3 448 /*************************************************************************/
mbed_official 35:a8484e16c2f3 449
mbed_official 35:a8484e16c2f3 450 /*************************************************************************/
mbed_official 35:a8484e16c2f3 451 /* constructor */
mbed_official 35:a8484e16c2f3 452 USBHAL::USBHAL(void)
mbed_official 35:a8484e16c2f3 453 {
mbed_official 35:a8484e16c2f3 454 /* ---- P4_1 : P4_1 (USB0_EN for GR-PEACH) ---- */
mbed_official 35:a8484e16c2f3 455 usb0_en = new DigitalOut(P4_1, 1);
mbed_official 35:a8484e16c2f3 456
mbed_official 35:a8484e16c2f3 457 /* some constants */
mbed_official 35:a8484e16c2f3 458 int_id = USBI0_IRQn;
mbed_official 35:a8484e16c2f3 459 int_level = ( 2 << 3 );
mbed_official 35:a8484e16c2f3 460 clock_mode = USBFCLOCK_X1_48MHZ;
mbed_official 35:a8484e16c2f3 461 mode = USB_FUNCTION_HIGH_SPEED;
mbed_official 35:a8484e16c2f3 462 EP0_read_status = DEVDRV_USBF_WRITEEND;
mbed_official 35:a8484e16c2f3 463 EPx_read_status = DEVDRV_USBF_PIPE_DONE;
mbed_official 35:a8484e16c2f3 464
mbed_official 35:a8484e16c2f3 465 /* Disables interrupt for usb */
mbed_official 35:a8484e16c2f3 466 GIC_DisableIRQ(int_id);
mbed_official 35:a8484e16c2f3 467
mbed_official 35:a8484e16c2f3 468 /* Setup the end point */
mbed_official 35:a8484e16c2f3 469 epCallback[ 0] = &USBHAL::EP1_OUT_callback;
mbed_official 35:a8484e16c2f3 470 epCallback[ 1] = &USBHAL::EP1_IN_callback;
mbed_official 35:a8484e16c2f3 471 epCallback[ 2] = &USBHAL::EP2_OUT_callback;
mbed_official 35:a8484e16c2f3 472 epCallback[ 3] = &USBHAL::EP2_IN_callback;
mbed_official 35:a8484e16c2f3 473 epCallback[ 4] = &USBHAL::EP3_OUT_callback;
mbed_official 35:a8484e16c2f3 474 epCallback[ 5] = &USBHAL::EP3_IN_callback;
mbed_official 35:a8484e16c2f3 475 epCallback[ 6] = &USBHAL::EP4_OUT_callback;
mbed_official 35:a8484e16c2f3 476 epCallback[ 7] = &USBHAL::EP4_IN_callback;
mbed_official 35:a8484e16c2f3 477 epCallback[ 8] = &USBHAL::EP5_OUT_callback;
mbed_official 35:a8484e16c2f3 478 epCallback[ 9] = &USBHAL::EP5_IN_callback;
mbed_official 35:a8484e16c2f3 479 epCallback[10] = &USBHAL::EP6_OUT_callback;
mbed_official 35:a8484e16c2f3 480 epCallback[11] = &USBHAL::EP6_IN_callback;
mbed_official 35:a8484e16c2f3 481 epCallback[12] = &USBHAL::EP7_OUT_callback;
mbed_official 35:a8484e16c2f3 482 epCallback[13] = &USBHAL::EP7_IN_callback;
mbed_official 35:a8484e16c2f3 483 epCallback[14] = &USBHAL::EP8_OUT_callback;
mbed_official 35:a8484e16c2f3 484 epCallback[15] = &USBHAL::EP8_IN_callback;
mbed_official 35:a8484e16c2f3 485 epCallback[16] = &USBHAL::EP9_OUT_callback;
mbed_official 35:a8484e16c2f3 486 epCallback[17] = &USBHAL::EP9_IN_callback;
mbed_official 35:a8484e16c2f3 487 epCallback[18] = &USBHAL::EP10_OUT_callback;
mbed_official 35:a8484e16c2f3 488 epCallback[19] = &USBHAL::EP10_IN_callback;
mbed_official 35:a8484e16c2f3 489 epCallback[20] = &USBHAL::EP11_OUT_callback;
mbed_official 35:a8484e16c2f3 490 epCallback[21] = &USBHAL::EP11_IN_callback;
mbed_official 35:a8484e16c2f3 491 epCallback[22] = &USBHAL::EP12_OUT_callback;
mbed_official 35:a8484e16c2f3 492 epCallback[23] = &USBHAL::EP12_IN_callback;
mbed_official 35:a8484e16c2f3 493 epCallback[24] = &USBHAL::EP13_OUT_callback;
mbed_official 35:a8484e16c2f3 494 epCallback[25] = &USBHAL::EP13_IN_callback;
mbed_official 35:a8484e16c2f3 495 epCallback[26] = &USBHAL::EP14_OUT_callback;
mbed_official 35:a8484e16c2f3 496 epCallback[27] = &USBHAL::EP14_IN_callback;
mbed_official 35:a8484e16c2f3 497 epCallback[28] = &USBHAL::EP15_OUT_callback;
mbed_official 35:a8484e16c2f3 498 epCallback[29] = &USBHAL::EP15_IN_callback;
mbed_official 35:a8484e16c2f3 499
mbed_official 35:a8484e16c2f3 500 /* registers me */
mbed_official 35:a8484e16c2f3 501 instance = this;
mbed_official 35:a8484e16c2f3 502
mbed_official 35:a8484e16c2f3 503 /* Clear pipe table */
mbed_official 35:a8484e16c2f3 504 usb0_function_clear_pipe_tbl();
mbed_official 35:a8484e16c2f3 505
mbed_official 35:a8484e16c2f3 506 /******************************************************************************
mbed_official 35:a8484e16c2f3 507 * Function Name: usb0_api_function_init
mbed_official 35:a8484e16c2f3 508 * Description : Initializes the USB module in the USB function mode.
mbed_official 35:a8484e16c2f3 509 *****************************************************************************/
mbed_official 35:a8484e16c2f3 510 /* The clock of USB0 modules is permitted */
mbed_official 35:a8484e16c2f3 511 CPG.STBCR7 &= ~(CPG_STBCR7_MSTP71);
mbed_official 35:a8484e16c2f3 512 volatile uint8_t dummy8;
mbed_official 35:a8484e16c2f3 513 dummy8 = CPG.STBCR7;
mbed_official 35:a8484e16c2f3 514
mbed_official 35:a8484e16c2f3 515 {
mbed_official 35:a8484e16c2f3 516 /******************************************************************************
mbed_official 35:a8484e16c2f3 517 * Function Name: usb0_function_setting_interrupt
mbed_official 35:a8484e16c2f3 518 * Description : Sets the USB module interrupt level.
mbed_official 35:a8484e16c2f3 519 *****************************************************************************/
mbed_official 35:a8484e16c2f3 520 #if 0 /*DMA is not supported*/
mbed_official 35:a8484e16c2f3 521 IRQn_Type d0fifo_dmaintid;
mbed_official 35:a8484e16c2f3 522 IRQn_Type d1fifo_dmaintid;
mbed_official 35:a8484e16c2f3 523 #endif
mbed_official 35:a8484e16c2f3 524
mbed_official 35:a8484e16c2f3 525 InterruptHandlerRegister(int_id, &_usbisr);
mbed_official 35:a8484e16c2f3 526 GIC_SetPriority(int_id, int_level);
mbed_official 35:a8484e16c2f3 527 GIC_EnableIRQ(int_id);
mbed_official 35:a8484e16c2f3 528
mbed_official 35:a8484e16c2f3 529 #if 0 /*DMA is not supported*/
mbed_official 35:a8484e16c2f3 530 d0fifo_dmaintid = Userdef_USB_usb0_function_d0fifo_dmaintid();
mbed_official 35:a8484e16c2f3 531 if (d0fifo_dmaintid != 0xFFFF) {
mbed_official 35:a8484e16c2f3 532 InterruptHandlerRegister(d0fifo_dmaintid, usb0_function_dma_interrupt_d0fifo);
mbed_official 35:a8484e16c2f3 533 GIC_SetPriority(d0fifo_dmaintid, int_level);
mbed_official 35:a8484e16c2f3 534 GIC_EnableIRQ(d0fifo_dmaintid);
mbed_official 35:a8484e16c2f3 535 }
mbed_official 35:a8484e16c2f3 536 #endif
mbed_official 35:a8484e16c2f3 537
mbed_official 35:a8484e16c2f3 538 #if 0 /*DMA is not supported*/
mbed_official 35:a8484e16c2f3 539 d1fifo_dmaintid = Userdef_USB_usb0_function_d1fifo_dmaintid();
mbed_official 35:a8484e16c2f3 540 if (d1fifo_dmaintid != 0xFFFF) {
mbed_official 35:a8484e16c2f3 541 InterruptHandlerRegister(d1fifo_dmaintid, usb0_function_dma_interrupt_d1fifo);
mbed_official 35:a8484e16c2f3 542 GIC_SetPriority(d1fifo_dmaintid, int_level);
mbed_official 35:a8484e16c2f3 543 GIC_EnableIRQ(d1fifo_dmaintid);
mbed_official 35:a8484e16c2f3 544 }
mbed_official 35:a8484e16c2f3 545 #endif
mbed_official 35:a8484e16c2f3 546 /*****************************************************************************/
mbed_official 35:a8484e16c2f3 547 }
mbed_official 35:a8484e16c2f3 548
mbed_official 35:a8484e16c2f3 549 /* reset USB module with setting tranciever and HSE=1 */
mbed_official 35:a8484e16c2f3 550 usb0_function_reset_module(clock_mode);
mbed_official 35:a8484e16c2f3 551
mbed_official 35:a8484e16c2f3 552 /* clear variables */
mbed_official 35:a8484e16c2f3 553 usb0_function_init_status();
mbed_official 35:a8484e16c2f3 554
mbed_official 35:a8484e16c2f3 555 /* select USB Function and Interrupt Enable */
mbed_official 35:a8484e16c2f3 556 /* Detect USB Device to attach or detach */
mbed_official 35:a8484e16c2f3 557 usb0_function_InitModule(mode);
mbed_official 35:a8484e16c2f3 558
mbed_official 35:a8484e16c2f3 559 {
mbed_official 35:a8484e16c2f3 560 uint16_t buf;
mbed_official 35:a8484e16c2f3 561 buf = USB200.INTENB0;
mbed_official 35:a8484e16c2f3 562 buf |= USB_INTENB0_SOFE;
mbed_official 35:a8484e16c2f3 563 USB200.INTENB0 = buf;
mbed_official 35:a8484e16c2f3 564 }
mbed_official 35:a8484e16c2f3 565 }
mbed_official 35:a8484e16c2f3 566
mbed_official 35:a8484e16c2f3 567 /*************************************************************************/
mbed_official 35:a8484e16c2f3 568 USBHAL::~USBHAL(void)
mbed_official 35:a8484e16c2f3 569 {
mbed_official 35:a8484e16c2f3 570 /* Disables interrupt for usb */
mbed_official 35:a8484e16c2f3 571 GIC_DisableIRQ( int_id );
mbed_official 35:a8484e16c2f3 572 /* Unregisters interrupt function and priority */
mbed_official 35:a8484e16c2f3 573 InterruptHandlerRegister( int_id, (uint32_t)NULL );
mbed_official 35:a8484e16c2f3 574
mbed_official 35:a8484e16c2f3 575 usb0_en = NULL;
mbed_official 35:a8484e16c2f3 576 instance = NULL;
mbed_official 35:a8484e16c2f3 577 }
mbed_official 35:a8484e16c2f3 578
mbed_official 35:a8484e16c2f3 579 /*************************************************************************/
mbed_official 35:a8484e16c2f3 580 void USBHAL::connect(void)
mbed_official 35:a8484e16c2f3 581 {
mbed_official 35:a8484e16c2f3 582 /* Activates USB0_EN */
mbed_official 35:a8484e16c2f3 583 (*usb0_en) = 0;
mbed_official 35:a8484e16c2f3 584 }
mbed_official 35:a8484e16c2f3 585
mbed_official 35:a8484e16c2f3 586
mbed_official 35:a8484e16c2f3 587 /*************************************************************************/
mbed_official 35:a8484e16c2f3 588 void USBHAL::disconnect(void)
mbed_official 35:a8484e16c2f3 589 {
mbed_official 35:a8484e16c2f3 590 /* Deactivates USB0_EN */
mbed_official 35:a8484e16c2f3 591 (*usb0_en) = 1;
mbed_official 35:a8484e16c2f3 592 }
mbed_official 35:a8484e16c2f3 593
mbed_official 35:a8484e16c2f3 594
mbed_official 35:a8484e16c2f3 595 /*************************************************************************/
mbed_official 35:a8484e16c2f3 596 void USBHAL::configureDevice(void)
mbed_official 35:a8484e16c2f3 597 {
mbed_official 35:a8484e16c2f3 598 /*The pipes set up in USBHAL::realiseEndpoint*/
mbed_official 35:a8484e16c2f3 599 /*usb0_function_clear_alt();*/ /* Alternate setting clear */
mbed_official 35:a8484e16c2f3 600 /*usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);*/
mbed_official 35:a8484e16c2f3 601 }
mbed_official 35:a8484e16c2f3 602
mbed_official 35:a8484e16c2f3 603
mbed_official 35:a8484e16c2f3 604 /*************************************************************************/
mbed_official 35:a8484e16c2f3 605 void USBHAL::unconfigureDevice(void)
mbed_official 35:a8484e16c2f3 606 {
mbed_official 35:a8484e16c2f3 607 /* The Interface would be managed by USBDevice */
mbed_official 35:a8484e16c2f3 608 /*usb0_function_clear_alt();*/ /* Alternate setting clear */
mbed_official 35:a8484e16c2f3 609 /*usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);*/
mbed_official 35:a8484e16c2f3 610 }
mbed_official 35:a8484e16c2f3 611
mbed_official 35:a8484e16c2f3 612
mbed_official 35:a8484e16c2f3 613 /*************************************************************************/
mbed_official 35:a8484e16c2f3 614 void USBHAL::setAddress(uint8_t address)
mbed_official 35:a8484e16c2f3 615 {
mbed_official 35:a8484e16c2f3 616 if (address <= 127) {
mbed_official 35:a8484e16c2f3 617 usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); /* OK */
mbed_official 35:a8484e16c2f3 618 } else {
mbed_official 35:a8484e16c2f3 619 usb0_function_set_pid_stall(USB_FUNCTION_PIPE0); /* Not Spec */
mbed_official 35:a8484e16c2f3 620 }
mbed_official 35:a8484e16c2f3 621 }
mbed_official 35:a8484e16c2f3 622
mbed_official 35:a8484e16c2f3 623
mbed_official 35:a8484e16c2f3 624 /*************************************************************************/
mbed_official 35:a8484e16c2f3 625 bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags)
mbed_official 35:a8484e16c2f3 626 {
mbed_official 35:a8484e16c2f3 627 const struct PIPECFGREC *cfg;
mbed_official 35:a8484e16c2f3 628 uint16_t pipe;
mbed_official 35:a8484e16c2f3 629 uint16_t buf;
mbed_official 35:a8484e16c2f3 630
mbed_official 35:a8484e16c2f3 631 if ( (EP0OUT == endpoint) || (EP0IN == endpoint) ) {
mbed_official 35:a8484e16c2f3 632 return true;
mbed_official 35:a8484e16c2f3 633 }
mbed_official 35:a8484e16c2f3 634
mbed_official 35:a8484e16c2f3 635 for (cfg = &def_pipecfg[0]; cfg->pipesel != 0; cfg++) {
mbed_official 35:a8484e16c2f3 636 if (cfg->endpoint == endpoint) {
mbed_official 35:a8484e16c2f3 637 break;
mbed_official 35:a8484e16c2f3 638 }
mbed_official 35:a8484e16c2f3 639 }
mbed_official 35:a8484e16c2f3 640 if (cfg->pipesel == 0) {
mbed_official 35:a8484e16c2f3 641 return false;
mbed_official 35:a8484e16c2f3 642 }
mbed_official 35:a8484e16c2f3 643
mbed_official 35:a8484e16c2f3 644 pipe = ((cfg->pipesel & USB_PIPESEL_PIPESEL) >> USB_PIPESEL_PIPESEL_SHIFT);
mbed_official 35:a8484e16c2f3 645
mbed_official 35:a8484e16c2f3 646 g_usb0_function_PipeTbl[ pipe ] = (uint16_t)(endpoint | ((cfg->pipesel & USB_FUNCTION_FIFO_USE) << 0));
mbed_official 35:a8484e16c2f3 647
mbed_official 35:a8484e16c2f3 648 /* There are maintenance routine of SHTNAK and BFRE bits
mbed_official 35:a8484e16c2f3 649 * in original sample program. This sample is not
mbed_official 35:a8484e16c2f3 650 * programmed. Do maintenance the "def_pipecfg" array if
mbed_official 35:a8484e16c2f3 651 * you want it. */
mbed_official 35:a8484e16c2f3 652
mbed_official 35:a8484e16c2f3 653 /* Interrupt Disable */
mbed_official 35:a8484e16c2f3 654 buf = USB200.BRDYENB;
mbed_official 35:a8484e16c2f3 655 buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
mbed_official 35:a8484e16c2f3 656 USB200.BRDYENB = buf;
mbed_official 35:a8484e16c2f3 657 buf = USB200.NRDYENB;
mbed_official 35:a8484e16c2f3 658 buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
mbed_official 35:a8484e16c2f3 659 USB200.NRDYENB = buf;
mbed_official 35:a8484e16c2f3 660 buf = USB200.BEMPENB;
mbed_official 35:a8484e16c2f3 661 buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
mbed_official 35:a8484e16c2f3 662 USB200.BEMPENB = buf;
mbed_official 35:a8484e16c2f3 663
mbed_official 35:a8484e16c2f3 664 usb0_function_set_pid_nak(pipe);
mbed_official 35:a8484e16c2f3 665
mbed_official 35:a8484e16c2f3 666 /* CurrentPIPE Clear */
mbed_official 35:a8484e16c2f3 667 if (RZA_IO_RegRead_16(&USB200.CFIFOSEL, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE) == pipe) {
mbed_official 35:a8484e16c2f3 668 RZA_IO_RegWrite_16(&USB200.CFIFOSEL, 0, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
mbed_official 35:a8484e16c2f3 669 }
mbed_official 35:a8484e16c2f3 670
mbed_official 35:a8484e16c2f3 671 if (RZA_IO_RegRead_16(&USB200.D0FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) {
mbed_official 35:a8484e16c2f3 672 RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE);
mbed_official 35:a8484e16c2f3 673 }
mbed_official 35:a8484e16c2f3 674
mbed_official 35:a8484e16c2f3 675 if (RZA_IO_RegRead_16(&USB200.D1FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) {
mbed_official 35:a8484e16c2f3 676 RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE);
mbed_official 35:a8484e16c2f3 677 }
mbed_official 35:a8484e16c2f3 678
mbed_official 35:a8484e16c2f3 679 /* PIPE Configuration */
mbed_official 35:a8484e16c2f3 680 USB200.PIPESEL = pipe;
mbed_official 35:a8484e16c2f3 681 USB200.PIPECFG = cfg->pipecfg;
mbed_official 35:a8484e16c2f3 682 USB200.PIPEBUF = cfg->pipebuf;
mbed_official 35:a8484e16c2f3 683 USB200.PIPEMAXP = cfg->pipemaxp;
mbed_official 35:a8484e16c2f3 684 USB200.PIPEPERI = cfg->pipeperi;
mbed_official 35:a8484e16c2f3 685
mbed_official 35:a8484e16c2f3 686 g_usb0_function_pipecfg[pipe] = cfg->pipecfg;
mbed_official 35:a8484e16c2f3 687 g_usb0_function_pipebuf[pipe] = cfg->pipebuf;
mbed_official 35:a8484e16c2f3 688 g_usb0_function_pipemaxp[pipe] = cfg->pipemaxp;
mbed_official 35:a8484e16c2f3 689 g_usb0_function_pipeperi[pipe] = cfg->pipeperi;
mbed_official 35:a8484e16c2f3 690
mbed_official 35:a8484e16c2f3 691 /* Buffer Clear */
mbed_official 35:a8484e16c2f3 692 usb0_function_set_sqclr(pipe);
mbed_official 35:a8484e16c2f3 693 usb0_function_aclrm(pipe);
mbed_official 35:a8484e16c2f3 694
mbed_official 35:a8484e16c2f3 695 /* init Global */
mbed_official 35:a8484e16c2f3 696 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
mbed_official 35:a8484e16c2f3 697 g_usb0_function_PipeDataSize[pipe] = 0;
mbed_official 35:a8484e16c2f3 698
mbed_official 35:a8484e16c2f3 699 return true;
mbed_official 35:a8484e16c2f3 700 }
mbed_official 35:a8484e16c2f3 701
mbed_official 35:a8484e16c2f3 702
mbed_official 35:a8484e16c2f3 703 /*************************************************************************/
mbed_official 35:a8484e16c2f3 704 // read setup packet
mbed_official 35:a8484e16c2f3 705 void USBHAL::EP0setup(uint8_t *buffer)
mbed_official 35:a8484e16c2f3 706 {
mbed_official 35:a8484e16c2f3 707 memcpy(buffer, setup_buffer, MAX_PACKET_SIZE_EP0);
mbed_official 35:a8484e16c2f3 708 }
mbed_official 35:a8484e16c2f3 709
mbed_official 35:a8484e16c2f3 710
mbed_official 35:a8484e16c2f3 711 /*************************************************************************/
mbed_official 35:a8484e16c2f3 712 void USBHAL::EP0readStage(void)
mbed_official 35:a8484e16c2f3 713 {
mbed_official 35:a8484e16c2f3 714 // No implements
mbed_official 35:a8484e16c2f3 715 }
mbed_official 35:a8484e16c2f3 716
mbed_official 35:a8484e16c2f3 717
mbed_official 35:a8484e16c2f3 718 /*************************************************************************/
mbed_official 35:a8484e16c2f3 719 void USBHAL::EP0read(void)
mbed_official 35:a8484e16c2f3 720 {
mbed_official 35:a8484e16c2f3 721 uint8_t *buffer;
mbed_official 35:a8484e16c2f3 722 uint32_t size;
mbed_official 35:a8484e16c2f3 723
mbed_official 35:a8484e16c2f3 724 /* remain of last writing */
mbed_official 35:a8484e16c2f3 725 while (EP0_read_status != DEVDRV_USBF_WRITEEND) {
mbed_official 35:a8484e16c2f3 726 static uint8_t bbb[2] = { 255, 255 };
mbed_official 35:a8484e16c2f3 727 EP0write(&bbb[0], 0);
mbed_official 35:a8484e16c2f3 728 }
mbed_official 35:a8484e16c2f3 729
mbed_official 35:a8484e16c2f3 730 buffer = (uint8_t*)(&setup_buffer[4]);
mbed_official 35:a8484e16c2f3 731 size = (MAX_PACKET_SIZE_EP0 / 2) - 8;
mbed_official 35:a8484e16c2f3 732 usb0_api_function_CtrlWriteStart(size, buffer);
mbed_official 35:a8484e16c2f3 733 }
mbed_official 35:a8484e16c2f3 734
mbed_official 35:a8484e16c2f3 735
mbed_official 35:a8484e16c2f3 736 /*************************************************************************/
mbed_official 35:a8484e16c2f3 737 uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
mbed_official 35:a8484e16c2f3 738 {
mbed_official 35:a8484e16c2f3 739 memcpy(buffer, (uint8_t*)(&setup_buffer[4]), g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0]);
mbed_official 35:a8484e16c2f3 740
mbed_official 35:a8484e16c2f3 741 return g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0];
mbed_official 35:a8484e16c2f3 742 }
mbed_official 35:a8484e16c2f3 743
mbed_official 35:a8484e16c2f3 744
mbed_official 35:a8484e16c2f3 745 /*************************************************************************/
mbed_official 35:a8484e16c2f3 746 void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
mbed_official 35:a8484e16c2f3 747 {
mbed_official 35:a8484e16c2f3 748 /* zero byte writing */
mbed_official 35:a8484e16c2f3 749 if ( (size == 0) && (EP0_read_status == DEVDRV_USBF_WRITEEND) ) {
mbed_official 35:a8484e16c2f3 750 return;
mbed_official 35:a8484e16c2f3 751 }
mbed_official 35:a8484e16c2f3 752
mbed_official 35:a8484e16c2f3 753 if (EP0_read_status == DEVDRV_USBF_WRITEEND) {
mbed_official 35:a8484e16c2f3 754 /*1st block*/
mbed_official 35:a8484e16c2f3 755 EP0_read_status = usb0_api_function_CtrlReadStart(size, buffer);
mbed_official 35:a8484e16c2f3 756 } else {
mbed_official 35:a8484e16c2f3 757 /* waits the last transmission */
mbed_official 35:a8484e16c2f3 758 /*other blocks*/
mbed_official 35:a8484e16c2f3 759 g_usb0_function_data_count[ USB_FUNCTION_PIPE0 ] = size;
mbed_official 35:a8484e16c2f3 760 g_usb0_function_data_pointer [ USB_FUNCTION_PIPE0 ] = buffer;
mbed_official 35:a8484e16c2f3 761 EP0_read_status = usb0_function_write_buffer_c(USB_FUNCTION_PIPE0);
mbed_official 35:a8484e16c2f3 762 }
mbed_official 35:a8484e16c2f3 763 /*max size may be deblocking outside*/
mbed_official 35:a8484e16c2f3 764 if (size == MAX_PACKET_SIZE_EP0) {
mbed_official 35:a8484e16c2f3 765 EP0_read_status = DEVDRV_USBF_WRITING;
mbed_official 35:a8484e16c2f3 766 }
mbed_official 35:a8484e16c2f3 767 }
mbed_official 35:a8484e16c2f3 768
mbed_official 35:a8484e16c2f3 769
mbed_official 35:a8484e16c2f3 770 /*************************************************************************/
mbed_official 35:a8484e16c2f3 771 #if 0 // No implements
mbed_official 35:a8484e16c2f3 772 void USBHAL::EP0getWriteResult(void)
mbed_official 35:a8484e16c2f3 773 {
mbed_official 35:a8484e16c2f3 774 }
mbed_official 35:a8484e16c2f3 775 #endif
mbed_official 35:a8484e16c2f3 776
mbed_official 35:a8484e16c2f3 777 /*************************************************************************/
mbed_official 35:a8484e16c2f3 778 void USBHAL::EP0stall(void)
mbed_official 35:a8484e16c2f3 779 {
mbed_official 35:a8484e16c2f3 780 stallEndpoint( 0 );
mbed_official 35:a8484e16c2f3 781 }
mbed_official 35:a8484e16c2f3 782
mbed_official 35:a8484e16c2f3 783
mbed_official 35:a8484e16c2f3 784 /*************************************************************************/
mbed_official 35:a8484e16c2f3 785 EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t max_size)
mbed_official 35:a8484e16c2f3 786 {
mbed_official 35:a8484e16c2f3 787 uint32_t pipe = EP2PIPE(endpoint);
mbed_official 35:a8484e16c2f3 788 uint32_t pipe_size;
mbed_official 35:a8484e16c2f3 789 uint16_t pipe_status;
mbed_official 35:a8484e16c2f3 790 EP_STATUS status = EP_COMPLETED;
mbed_official 35:a8484e16c2f3 791
mbed_official 35:a8484e16c2f3 792 pipe_status = usb0_api_function_check_pipe_status(pipe, &pipe_size);
mbed_official 35:a8484e16c2f3 793 pipe_size = (max_size < pipe_size)? (max_size): (pipe_size);
mbed_official 35:a8484e16c2f3 794
mbed_official 35:a8484e16c2f3 795 if (pipe_status == DEVDRV_USBF_PIPE_IDLE) {
mbed_official 35:a8484e16c2f3 796 usb0_api_function_set_pid_nak(pipe);
mbed_official 35:a8484e16c2f3 797 usb0_api_function_clear_pipe_status(pipe);
mbed_official 35:a8484e16c2f3 798
mbed_official 35:a8484e16c2f3 799 usb0_api_function_start_receive_transfer(pipe, pipe_size, recv_buffer);
mbed_official 35:a8484e16c2f3 800 } else {
mbed_official 35:a8484e16c2f3 801 status = EP_PENDING;
mbed_official 35:a8484e16c2f3 802 }
mbed_official 35:a8484e16c2f3 803
mbed_official 35:a8484e16c2f3 804 return status;
mbed_official 35:a8484e16c2f3 805 }
mbed_official 35:a8484e16c2f3 806
mbed_official 35:a8484e16c2f3 807
mbed_official 35:a8484e16c2f3 808 /*************************************************************************/
mbed_official 35:a8484e16c2f3 809 EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *buffer, uint32_t *bytes_read )
mbed_official 35:a8484e16c2f3 810 {
mbed_official 35:a8484e16c2f3 811 uint32_t pipe = EP2PIPE(endpoint);
mbed_official 35:a8484e16c2f3 812 uint16_t pipe_status;
mbed_official 35:a8484e16c2f3 813 uint16_t err;
mbed_official 35:a8484e16c2f3 814 EP_STATUS status = EP_PENDING;
mbed_official 35:a8484e16c2f3 815
mbed_official 35:a8484e16c2f3 816
mbed_official 35:a8484e16c2f3 817 if (EPx_read_status != DEVDRV_USBF_PIPE_WAIT) {
mbed_official 35:a8484e16c2f3 818 return status;
mbed_official 35:a8484e16c2f3 819 }
mbed_official 35:a8484e16c2f3 820
mbed_official 35:a8484e16c2f3 821 pipe_status = usb0_api_function_check_pipe_status(pipe, bytes_read);
mbed_official 35:a8484e16c2f3 822 if (pipe_status == DEVDRV_USBF_PIPE_IDLE) {
mbed_official 35:a8484e16c2f3 823 return EP_COMPLETED;
mbed_official 35:a8484e16c2f3 824 }
mbed_official 35:a8484e16c2f3 825 if (pipe_status == DEVDRV_USBF_PIPE_DONE) {
mbed_official 35:a8484e16c2f3 826 return EP_COMPLETED;
mbed_official 35:a8484e16c2f3 827 }
mbed_official 35:a8484e16c2f3 828 if (pipe_status != DEVDRV_USBF_PIPE_WAIT) {
mbed_official 35:a8484e16c2f3 829 return status;
mbed_official 35:a8484e16c2f3 830 }
mbed_official 35:a8484e16c2f3 831
mbed_official 35:a8484e16c2f3 832 /* sets the output buffer and size */
mbed_official 35:a8484e16c2f3 833 g_usb0_function_data_pointer[pipe] = buffer;
mbed_official 35:a8484e16c2f3 834
mbed_official 35:a8484e16c2f3 835 /* receives data from pipe */
mbed_official 35:a8484e16c2f3 836 err = usb0_function_read_buffer(pipe);
mbed_official 35:a8484e16c2f3 837 recv_error = err;
mbed_official 35:a8484e16c2f3 838
mbed_official 35:a8484e16c2f3 839 pipe_status = usb0_api_function_check_pipe_status(pipe, bytes_read);
mbed_official 35:a8484e16c2f3 840 if (pipe_status == DEVDRV_USBF_PIPE_DONE) {
mbed_official 35:a8484e16c2f3 841 status = EP_COMPLETED;
mbed_official 35:a8484e16c2f3 842 }
mbed_official 35:a8484e16c2f3 843
mbed_official 35:a8484e16c2f3 844 return status;
mbed_official 35:a8484e16c2f3 845 }
mbed_official 35:a8484e16c2f3 846
mbed_official 35:a8484e16c2f3 847
mbed_official 35:a8484e16c2f3 848 /*************************************************************************/
mbed_official 35:a8484e16c2f3 849 EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
mbed_official 35:a8484e16c2f3 850 {
mbed_official 35:a8484e16c2f3 851 uint32_t pipe = EP2PIPE(endpoint);
mbed_official 35:a8484e16c2f3 852 uint32_t pipe_size;
mbed_official 35:a8484e16c2f3 853 uint16_t pipe_status;
mbed_official 35:a8484e16c2f3 854 uint16_t err;
mbed_official 35:a8484e16c2f3 855 uint16_t count;
mbed_official 35:a8484e16c2f3 856 EP_STATUS status = EP_PENDING;
mbed_official 35:a8484e16c2f3 857
mbed_official 35:a8484e16c2f3 858 pipe_status = usb0_api_function_check_pipe_status(pipe, &pipe_size);
mbed_official 35:a8484e16c2f3 859
mbed_official 35:a8484e16c2f3 860 /* waits the last transmission */
mbed_official 35:a8484e16c2f3 861 count = 30000;
mbed_official 35:a8484e16c2f3 862 while ((pipe_status == DEVDRV_USBF_PIPE_WAIT) || (pipe_status == DEVDRV_USBF_PIPE_DONE)) {
mbed_official 35:a8484e16c2f3 863 pipe_status = usb0_api_function_check_pipe_status(pipe, &pipe_size);
mbed_official 35:a8484e16c2f3 864 if( --count == 0 ) {
mbed_official 35:a8484e16c2f3 865 pipe_status = DEVDRV_USBF_PIPE_STALL;
mbed_official 35:a8484e16c2f3 866 break;
mbed_official 35:a8484e16c2f3 867 }
mbed_official 35:a8484e16c2f3 868 }
mbed_official 35:a8484e16c2f3 869
mbed_official 35:a8484e16c2f3 870 switch (pipe_status) {
mbed_official 35:a8484e16c2f3 871 case DEVDRV_USBF_PIPE_IDLE:
mbed_official 35:a8484e16c2f3 872 err = usb0_api_function_start_send_transfer(pipe, size, data);
mbed_official 35:a8484e16c2f3 873
mbed_official 35:a8484e16c2f3 874 switch (err) {
mbed_official 35:a8484e16c2f3 875 /* finish to write */
mbed_official 35:a8484e16c2f3 876 case DEVDRV_USBF_WRITEEND:
mbed_official 35:a8484e16c2f3 877 /* finish to write, but data is short */
mbed_official 35:a8484e16c2f3 878 case DEVDRV_USBF_WRITESHRT:
mbed_official 35:a8484e16c2f3 879 /* continue to write */
mbed_official 35:a8484e16c2f3 880 case DEVDRV_USBF_WRITING:
mbed_official 35:a8484e16c2f3 881 /* use DMA */
mbed_official 35:a8484e16c2f3 882 case DEVDRV_USBF_WRITEDMA:
mbed_official 35:a8484e16c2f3 883 /* error */
mbed_official 35:a8484e16c2f3 884 case DEVDRV_USBF_FIFOERROR:
mbed_official 35:a8484e16c2f3 885 status = EP_PENDING;
mbed_official 35:a8484e16c2f3 886 break;
mbed_official 35:a8484e16c2f3 887 }
mbed_official 35:a8484e16c2f3 888 break;
mbed_official 35:a8484e16c2f3 889
mbed_official 35:a8484e16c2f3 890 case DEVDRV_USBF_PIPE_WAIT:
mbed_official 35:a8484e16c2f3 891 case DEVDRV_USBF_PIPE_DONE:
mbed_official 35:a8484e16c2f3 892 status = EP_PENDING;
mbed_official 35:a8484e16c2f3 893 break;
mbed_official 35:a8484e16c2f3 894
mbed_official 35:a8484e16c2f3 895 case DEVDRV_USBF_PIPE_NORES:
mbed_official 35:a8484e16c2f3 896 case DEVDRV_USBF_PIPE_STALL:
mbed_official 35:a8484e16c2f3 897 default:
mbed_official 35:a8484e16c2f3 898 status = EP_STALLED;
mbed_official 35:a8484e16c2f3 899 break;
mbed_official 35:a8484e16c2f3 900 }
mbed_official 35:a8484e16c2f3 901
mbed_official 35:a8484e16c2f3 902 return status;
mbed_official 35:a8484e16c2f3 903 }
mbed_official 35:a8484e16c2f3 904
mbed_official 35:a8484e16c2f3 905
mbed_official 35:a8484e16c2f3 906 /*************************************************************************/
mbed_official 35:a8484e16c2f3 907 EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
mbed_official 35:a8484e16c2f3 908 {
mbed_official 35:a8484e16c2f3 909 uint32_t pipe = EP2PIPE(endpoint);
mbed_official 35:a8484e16c2f3 910 uint32_t pipe_size;
mbed_official 35:a8484e16c2f3 911 uint16_t pipe_status;
mbed_official 35:a8484e16c2f3 912 EP_STATUS status = EP_PENDING;
mbed_official 35:a8484e16c2f3 913
mbed_official 35:a8484e16c2f3 914 pipe_status = usb0_api_function_check_pipe_status(pipe, &pipe_size);
mbed_official 35:a8484e16c2f3 915
mbed_official 35:a8484e16c2f3 916 switch (pipe_status) {
mbed_official 35:a8484e16c2f3 917 case DEVDRV_USBF_PIPE_IDLE:
mbed_official 35:a8484e16c2f3 918 status = EP_COMPLETED;
mbed_official 35:a8484e16c2f3 919 break;
mbed_official 35:a8484e16c2f3 920
mbed_official 35:a8484e16c2f3 921 case DEVDRV_USBF_PIPE_WAIT:
mbed_official 35:a8484e16c2f3 922 status = EP_PENDING;
mbed_official 35:a8484e16c2f3 923 break;
mbed_official 35:a8484e16c2f3 924
mbed_official 35:a8484e16c2f3 925 case DEVDRV_USBF_PIPE_DONE:
mbed_official 35:a8484e16c2f3 926 usb0_function_stop_transfer(pipe);
mbed_official 35:a8484e16c2f3 927 status = EP_COMPLETED;
mbed_official 35:a8484e16c2f3 928 break;
mbed_official 35:a8484e16c2f3 929
mbed_official 35:a8484e16c2f3 930 case DEVDRV_USBF_PIPE_NORES:
mbed_official 35:a8484e16c2f3 931 status = EP_STALLED;
mbed_official 35:a8484e16c2f3 932 break;
mbed_official 35:a8484e16c2f3 933
mbed_official 35:a8484e16c2f3 934 case DEVDRV_USBF_PIPE_STALL:
mbed_official 35:a8484e16c2f3 935 status = EP_STALLED;
mbed_official 35:a8484e16c2f3 936 break;
mbed_official 35:a8484e16c2f3 937
mbed_official 35:a8484e16c2f3 938 default:
mbed_official 35:a8484e16c2f3 939 status = EP_PENDING;
mbed_official 35:a8484e16c2f3 940 }
mbed_official 35:a8484e16c2f3 941
mbed_official 35:a8484e16c2f3 942 return status;
mbed_official 35:a8484e16c2f3 943 }
mbed_official 35:a8484e16c2f3 944
mbed_official 35:a8484e16c2f3 945
mbed_official 35:a8484e16c2f3 946 /*************************************************************************/
mbed_official 35:a8484e16c2f3 947 void USBHAL::stallEndpoint(uint8_t endpoint)
mbed_official 35:a8484e16c2f3 948 {
mbed_official 35:a8484e16c2f3 949 uint32_t pipe = EP2PIPE(endpoint);
mbed_official 35:a8484e16c2f3 950
mbed_official 35:a8484e16c2f3 951 usb0_function_clear_pid_stall(pipe);
mbed_official 35:a8484e16c2f3 952 }
mbed_official 35:a8484e16c2f3 953
mbed_official 35:a8484e16c2f3 954
mbed_official 35:a8484e16c2f3 955 /*************************************************************************/
mbed_official 35:a8484e16c2f3 956 void USBHAL::unstallEndpoint(uint8_t endpoint)
mbed_official 35:a8484e16c2f3 957 {
mbed_official 35:a8484e16c2f3 958 uint32_t pipe = EP2PIPE(endpoint);
mbed_official 35:a8484e16c2f3 959
mbed_official 35:a8484e16c2f3 960 usb0_function_set_pid_stall( pipe );
mbed_official 35:a8484e16c2f3 961 }
mbed_official 35:a8484e16c2f3 962
mbed_official 35:a8484e16c2f3 963
mbed_official 35:a8484e16c2f3 964 /*************************************************************************/
mbed_official 35:a8484e16c2f3 965 bool USBHAL::getEndpointStallState(uint8_t endpoint)
mbed_official 35:a8484e16c2f3 966 {
mbed_official 35:a8484e16c2f3 967 // No implemens
mbed_official 35:a8484e16c2f3 968 return false;
mbed_official 35:a8484e16c2f3 969 }
mbed_official 35:a8484e16c2f3 970
mbed_official 35:a8484e16c2f3 971
mbed_official 35:a8484e16c2f3 972 /*************************************************************************/
mbed_official 35:a8484e16c2f3 973 #if 0 // No implements
mbed_official 35:a8484e16c2f3 974 void USBHAL::remoteWakeup(void)
mbed_official 35:a8484e16c2f3 975 {
mbed_official 35:a8484e16c2f3 976 }
mbed_official 35:a8484e16c2f3 977 #endif
mbed_official 35:a8484e16c2f3 978
mbed_official 35:a8484e16c2f3 979 /*************************************************************************/
mbed_official 35:a8484e16c2f3 980 void USBHAL::_usbisr(void)
mbed_official 35:a8484e16c2f3 981 {
mbed_official 35:a8484e16c2f3 982 instance->usbisr();
mbed_official 35:a8484e16c2f3 983 }
mbed_official 35:a8484e16c2f3 984
mbed_official 35:a8484e16c2f3 985
mbed_official 35:a8484e16c2f3 986 /*************************************************************************/
mbed_official 35:a8484e16c2f3 987 void USBHAL::usbisr(void)
mbed_official 35:a8484e16c2f3 988 {
mbed_official 35:a8484e16c2f3 989 uint16_t int_sts0;
mbed_official 35:a8484e16c2f3 990 uint16_t int_sts1;
mbed_official 35:a8484e16c2f3 991 uint16_t int_sts2;
mbed_official 35:a8484e16c2f3 992 uint16_t int_sts3;
mbed_official 35:a8484e16c2f3 993 uint16_t int_enb0;
mbed_official 35:a8484e16c2f3 994 uint16_t int_enb2;
mbed_official 35:a8484e16c2f3 995 uint16_t int_enb3;
mbed_official 35:a8484e16c2f3 996 uint16_t int_enb4;
mbed_official 35:a8484e16c2f3 997 volatile uint16_t dumy_sts;
mbed_official 35:a8484e16c2f3 998
mbed_official 35:a8484e16c2f3 999
mbed_official 35:a8484e16c2f3 1000 int_sts0 = USB200.INTSTS0;
mbed_official 35:a8484e16c2f3 1001
mbed_official 35:a8484e16c2f3 1002 if (!(int_sts0 & (
mbed_official 35:a8484e16c2f3 1003 USB_FUNCTION_BITVBINT |
mbed_official 35:a8484e16c2f3 1004 USB_FUNCTION_BITRESM |
mbed_official 35:a8484e16c2f3 1005 USB_FUNCTION_BITSOFR |
mbed_official 35:a8484e16c2f3 1006 USB_FUNCTION_BITDVST |
mbed_official 35:a8484e16c2f3 1007 USB_FUNCTION_BITCTRT |
mbed_official 35:a8484e16c2f3 1008 USB_FUNCTION_BITBEMP |
mbed_official 35:a8484e16c2f3 1009 USB_FUNCTION_BITNRDY |
mbed_official 35:a8484e16c2f3 1010 USB_FUNCTION_BITBRDY ))) {
mbed_official 35:a8484e16c2f3 1011 return;
mbed_official 35:a8484e16c2f3 1012 }
mbed_official 35:a8484e16c2f3 1013
mbed_official 35:a8484e16c2f3 1014 int_sts1 = USB200.BRDYSTS;
mbed_official 35:a8484e16c2f3 1015 int_sts2 = USB200.NRDYSTS;
mbed_official 35:a8484e16c2f3 1016 int_sts3 = USB200.BEMPSTS;
mbed_official 35:a8484e16c2f3 1017 int_enb0 = USB200.INTENB0;
mbed_official 35:a8484e16c2f3 1018 int_enb2 = USB200.BRDYENB;
mbed_official 35:a8484e16c2f3 1019 int_enb3 = USB200.NRDYENB;
mbed_official 35:a8484e16c2f3 1020 int_enb4 = USB200.BEMPENB;
mbed_official 35:a8484e16c2f3 1021
mbed_official 35:a8484e16c2f3 1022 if ((int_sts0 & USB_FUNCTION_BITRESM) &&
mbed_official 35:a8484e16c2f3 1023 (int_enb0 & USB_FUNCTION_BITRSME)) {
mbed_official 35:a8484e16c2f3 1024 USB200.INTSTS0 = (uint16_t)~USB_FUNCTION_BITRESM;
mbed_official 35:a8484e16c2f3 1025 RZA_IO_RegWrite_16(&USB200.INTENB0, 0, USB_INTENB0_RSME_SHIFT, USB_INTENB0_RSME);
mbed_official 35:a8484e16c2f3 1026 /*usb0_function_USB_FUNCTION_Resume();*/
mbed_official 35:a8484e16c2f3 1027 suspendStateChanged(1);
mbed_official 35:a8484e16c2f3 1028 } else if (
mbed_official 35:a8484e16c2f3 1029 (int_sts0 & USB_FUNCTION_BITVBINT) &&
mbed_official 35:a8484e16c2f3 1030 (int_enb0 & USB_FUNCTION_BITVBSE)) {
mbed_official 35:a8484e16c2f3 1031 USB200.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVBINT;
mbed_official 35:a8484e16c2f3 1032
mbed_official 35:a8484e16c2f3 1033 if (usb0_function_CheckVBUStaus() == DEVDRV_USBF_ON) {
mbed_official 35:a8484e16c2f3 1034 usb0_function_USB_FUNCTION_Attach();
mbed_official 35:a8484e16c2f3 1035 } else {
mbed_official 35:a8484e16c2f3 1036 usb0_function_USB_FUNCTION_Detach();
mbed_official 35:a8484e16c2f3 1037 }
mbed_official 35:a8484e16c2f3 1038 } else if (
mbed_official 35:a8484e16c2f3 1039 (int_sts0 & USB_FUNCTION_BITSOFR) &&
mbed_official 35:a8484e16c2f3 1040 (int_enb0 & USB_FUNCTION_BITSOFE)) {
mbed_official 35:a8484e16c2f3 1041 USB200.INTSTS0 = (uint16_t)~USB_FUNCTION_BITSOFR;
mbed_official 35:a8484e16c2f3 1042 SOF((USB200.FRMNUM & USB_FRMNUM_FRNM) >> USB_FRMNUM_FRNM_SHIFT);
mbed_official 35:a8484e16c2f3 1043 } else if (
mbed_official 35:a8484e16c2f3 1044 (int_sts0 & USB_FUNCTION_BITDVST) &&
mbed_official 35:a8484e16c2f3 1045 (int_enb0 & USB_FUNCTION_BITDVSE)) {
mbed_official 35:a8484e16c2f3 1046 USB200.INTSTS0 = (uint16_t)~USB_FUNCTION_BITDVST;
mbed_official 35:a8484e16c2f3 1047 switch (int_sts0 & USB_FUNCTION_BITDVSQ) {
mbed_official 35:a8484e16c2f3 1048 case USB_FUNCTION_DS_POWR:
mbed_official 35:a8484e16c2f3 1049 break;
mbed_official 35:a8484e16c2f3 1050
mbed_official 35:a8484e16c2f3 1051 case USB_FUNCTION_DS_DFLT:
mbed_official 35:a8484e16c2f3 1052 /*****************************************************************************
mbed_official 35:a8484e16c2f3 1053 * Function Name: usb0_function_USB_FUNCTION_BusReset
mbed_official 35:a8484e16c2f3 1054 * Description : This function is executed when the USB device is transitioned
mbed_official 35:a8484e16c2f3 1055 * : to POWERD_STATE. Sets the device descriptor according to the
mbed_official 35:a8484e16c2f3 1056 * : connection speed determined by the USB reset hand shake.
mbed_official 35:a8484e16c2f3 1057 * Arguments : none
mbed_official 35:a8484e16c2f3 1058 * Return Value : none
mbed_official 35:a8484e16c2f3 1059 *****************************************************************************/
mbed_official 35:a8484e16c2f3 1060 usb0_function_init_status(); /* memory clear */
mbed_official 35:a8484e16c2f3 1061
mbed_official 35:a8484e16c2f3 1062 #if 0
mbed_official 35:a8484e16c2f3 1063 /* You would program those steps in USBCallback_busReset
mbed_official 35:a8484e16c2f3 1064 * if the system need the comment out steps.
mbed_official 35:a8484e16c2f3 1065 */
mbed_official 35:a8484e16c2f3 1066
mbed_official 35:a8484e16c2f3 1067 if (usb0_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) {
mbed_official 35:a8484e16c2f3 1068 /* Device Descriptor reset */
mbed_official 35:a8484e16c2f3 1069 usb0_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED);
mbed_official 35:a8484e16c2f3 1070 } else {
mbed_official 35:a8484e16c2f3 1071 /* Device Descriptor reset */
mbed_official 35:a8484e16c2f3 1072 usb0_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED);
mbed_official 35:a8484e16c2f3 1073 }
mbed_official 35:a8484e16c2f3 1074 #endif
mbed_official 35:a8484e16c2f3 1075 /* Default Control PIPE reset */
mbed_official 35:a8484e16c2f3 1076 /*****************************************************************************
mbed_official 35:a8484e16c2f3 1077 * Function Name: usb0_function_ResetDCP
mbed_official 35:a8484e16c2f3 1078 * Description : Initializes the default control pipe(DCP).
mbed_official 35:a8484e16c2f3 1079 * Outline : Reset default control pipe
mbed_official 35:a8484e16c2f3 1080 * Arguments : none
mbed_official 35:a8484e16c2f3 1081 * Return Value : none
mbed_official 35:a8484e16c2f3 1082 *****************************************************************************/
mbed_official 35:a8484e16c2f3 1083 USB200.DCPCFG = 0;
mbed_official 35:a8484e16c2f3 1084 USB200.DCPMAXP = 64; /*TODO: This value is copied from sample*/
mbed_official 35:a8484e16c2f3 1085
mbed_official 35:a8484e16c2f3 1086 USB200.CFIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
mbed_official 35:a8484e16c2f3 1087 USB200.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
mbed_official 35:a8484e16c2f3 1088 USB200.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
mbed_official 35:a8484e16c2f3 1089
mbed_official 35:a8484e16c2f3 1090 busReset();
mbed_official 35:a8484e16c2f3 1091 break;
mbed_official 35:a8484e16c2f3 1092
mbed_official 35:a8484e16c2f3 1093 case USB_FUNCTION_DS_ADDS:
mbed_official 35:a8484e16c2f3 1094 break;
mbed_official 35:a8484e16c2f3 1095
mbed_official 35:a8484e16c2f3 1096 case USB_FUNCTION_DS_CNFG:
mbed_official 35:a8484e16c2f3 1097 break;
mbed_official 35:a8484e16c2f3 1098
mbed_official 35:a8484e16c2f3 1099 case USB_FUNCTION_DS_SPD_POWR:
mbed_official 35:a8484e16c2f3 1100 case USB_FUNCTION_DS_SPD_DFLT:
mbed_official 35:a8484e16c2f3 1101 case USB_FUNCTION_DS_SPD_ADDR:
mbed_official 35:a8484e16c2f3 1102 case USB_FUNCTION_DS_SPD_CNFG:
mbed_official 35:a8484e16c2f3 1103 suspendStateChanged(0);
mbed_official 35:a8484e16c2f3 1104 /*usb0_function_USB_FUNCTION_Suspend();*/
mbed_official 35:a8484e16c2f3 1105 break;
mbed_official 35:a8484e16c2f3 1106
mbed_official 35:a8484e16c2f3 1107 default:
mbed_official 35:a8484e16c2f3 1108 break;
mbed_official 35:a8484e16c2f3 1109 }
mbed_official 35:a8484e16c2f3 1110 } else if (
mbed_official 35:a8484e16c2f3 1111 (int_sts0 & USB_FUNCTION_BITBEMP) &&
mbed_official 35:a8484e16c2f3 1112 (int_enb0 & USB_FUNCTION_BITBEMP) &&
mbed_official 35:a8484e16c2f3 1113 ((int_sts3 & int_enb4) & g_usb0_function_bit_set[USB_FUNCTION_PIPE0])) {
mbed_official 35:a8484e16c2f3 1114 /* ==== BEMP PIPE0 ==== */
mbed_official 35:a8484e16c2f3 1115 usb0_function_BEMPInterruptPIPE0(int_sts3, int_enb4);
mbed_official 35:a8484e16c2f3 1116 } else if (
mbed_official 35:a8484e16c2f3 1117 (int_sts0 & USB_FUNCTION_BITBRDY) &&
mbed_official 35:a8484e16c2f3 1118 (int_enb0 & USB_FUNCTION_BITBRDY) &&
mbed_official 35:a8484e16c2f3 1119 ((int_sts1 & int_enb2) & g_usb0_function_bit_set[USB_FUNCTION_PIPE0])) {
mbed_official 35:a8484e16c2f3 1120 /* ==== BRDY PIPE0 ==== */
mbed_official 35:a8484e16c2f3 1121 usb0_function_BRDYInterruptPIPE0(int_sts1, int_enb2);
mbed_official 35:a8484e16c2f3 1122 } else if (
mbed_official 35:a8484e16c2f3 1123 (int_sts0 & USB_FUNCTION_BITNRDY) &&
mbed_official 35:a8484e16c2f3 1124 (int_enb0 & USB_FUNCTION_BITNRDY) &&
mbed_official 35:a8484e16c2f3 1125 ((int_sts2 & int_enb3) & g_usb0_function_bit_set[USB_FUNCTION_PIPE0])) {
mbed_official 35:a8484e16c2f3 1126 /* ==== NRDY PIPE0 ==== */
mbed_official 35:a8484e16c2f3 1127 usb0_function_NRDYInterruptPIPE0(int_sts2, int_enb3);
mbed_official 35:a8484e16c2f3 1128 } else if (
mbed_official 35:a8484e16c2f3 1129 (int_sts0 & USB_FUNCTION_BITCTRT) && (int_enb0 & USB_FUNCTION_BITCTRE)) {
mbed_official 35:a8484e16c2f3 1130 int_sts0 = USB200.INTSTS0;
mbed_official 35:a8484e16c2f3 1131 USB200.INTSTS0 = (uint16_t)~USB_FUNCTION_BITCTRT;
mbed_official 35:a8484e16c2f3 1132
mbed_official 35:a8484e16c2f3 1133 if (((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) ||
mbed_official 35:a8484e16c2f3 1134 ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) ||
mbed_official 35:a8484e16c2f3 1135 ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND)) {
mbed_official 35:a8484e16c2f3 1136
mbed_official 35:a8484e16c2f3 1137 /* remake EP0 into buffer */
mbed_official 35:a8484e16c2f3 1138 usb0_function_save_request();
mbed_official 35:a8484e16c2f3 1139 if ((USB200.INTSTS0 & USB_FUNCTION_BITVALID) && (
mbed_official 35:a8484e16c2f3 1140 ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) ||
mbed_official 35:a8484e16c2f3 1141 ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) ||
mbed_official 35:a8484e16c2f3 1142 ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND))) {
mbed_official 35:a8484e16c2f3 1143 /* New SETUP token received */
mbed_official 35:a8484e16c2f3 1144 /* Three dummy reads for cleearing interrupt requests */
mbed_official 35:a8484e16c2f3 1145 dumy_sts = USB200.INTSTS0;
mbed_official 35:a8484e16c2f3 1146 dumy_sts = USB200.INTSTS0;
mbed_official 35:a8484e16c2f3 1147 dumy_sts = USB200.INTSTS0;
mbed_official 35:a8484e16c2f3 1148 return;
mbed_official 35:a8484e16c2f3 1149 }
mbed_official 35:a8484e16c2f3 1150 }
mbed_official 35:a8484e16c2f3 1151
mbed_official 35:a8484e16c2f3 1152 switch (int_sts0 & USB_FUNCTION_BITCTSQ) {
mbed_official 35:a8484e16c2f3 1153 case USB_FUNCTION_CS_IDST:
mbed_official 35:a8484e16c2f3 1154 if (g_usb0_function_TestModeFlag == DEVDRV_USBF_YES) {
mbed_official 35:a8484e16c2f3 1155 /* ==== Test Mode ==== */
mbed_official 35:a8484e16c2f3 1156 usb0_function_USB_FUNCTION_TestMode();
mbed_official 35:a8484e16c2f3 1157 }
mbed_official 35:a8484e16c2f3 1158 /* Needs not procedure in this state */
mbed_official 35:a8484e16c2f3 1159 break;
mbed_official 35:a8484e16c2f3 1160
mbed_official 35:a8484e16c2f3 1161 case USB_FUNCTION_CS_RDDS:
mbed_official 35:a8484e16c2f3 1162 /* Reads a setup packet */
mbed_official 35:a8484e16c2f3 1163 EP0setupCallback();
mbed_official 35:a8484e16c2f3 1164 break;
mbed_official 35:a8484e16c2f3 1165
mbed_official 35:a8484e16c2f3 1166 case USB_FUNCTION_CS_WRDS:
mbed_official 35:a8484e16c2f3 1167 /* Original code was the SetDescriptor was called */
mbed_official 35:a8484e16c2f3 1168 EP0setupCallback();
mbed_official 35:a8484e16c2f3 1169 break;
mbed_official 35:a8484e16c2f3 1170
mbed_official 35:a8484e16c2f3 1171 case USB_FUNCTION_CS_WRND:
mbed_official 35:a8484e16c2f3 1172 EP0setupCallback();
mbed_official 35:a8484e16c2f3 1173
mbed_official 35:a8484e16c2f3 1174 /*The EP0setupCallback should finish in successful */
mbed_official 35:a8484e16c2f3 1175 usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);
mbed_official 35:a8484e16c2f3 1176
mbed_official 35:a8484e16c2f3 1177 RZA_IO_RegWrite_16(&USB200.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
mbed_official 35:a8484e16c2f3 1178 break;
mbed_official 35:a8484e16c2f3 1179
mbed_official 35:a8484e16c2f3 1180 case USB_FUNCTION_CS_RDSS:
mbed_official 35:a8484e16c2f3 1181 RZA_IO_RegWrite_16(&USB200.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
mbed_official 35:a8484e16c2f3 1182 break;
mbed_official 35:a8484e16c2f3 1183
mbed_official 35:a8484e16c2f3 1184 case USB_FUNCTION_CS_WRSS:
mbed_official 35:a8484e16c2f3 1185 RZA_IO_RegWrite_16(&USB200.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
mbed_official 35:a8484e16c2f3 1186 break;
mbed_official 35:a8484e16c2f3 1187
mbed_official 35:a8484e16c2f3 1188 case USB_FUNCTION_CS_SQER:
mbed_official 35:a8484e16c2f3 1189 usb0_function_set_pid_stall(USB_FUNCTION_PIPE0);
mbed_official 35:a8484e16c2f3 1190 break;
mbed_official 35:a8484e16c2f3 1191
mbed_official 35:a8484e16c2f3 1192 default:
mbed_official 35:a8484e16c2f3 1193 usb0_function_set_pid_stall(USB_FUNCTION_PIPE0);
mbed_official 35:a8484e16c2f3 1194 break;
mbed_official 35:a8484e16c2f3 1195 }
mbed_official 35:a8484e16c2f3 1196 } else if (
mbed_official 35:a8484e16c2f3 1197 (int_sts0 & USB_FUNCTION_BITBEMP) &&
mbed_official 35:a8484e16c2f3 1198 (int_enb0 & USB_FUNCTION_BITBEMP) &&
mbed_official 35:a8484e16c2f3 1199 (int_sts3 & int_enb4) ) {
mbed_official 35:a8484e16c2f3 1200 /* ==== BEMP PIPEx ==== */
mbed_official 35:a8484e16c2f3 1201 usb0_function_BEMPInterrupt(int_sts3, int_enb4);
mbed_official 35:a8484e16c2f3 1202 } else if (
mbed_official 35:a8484e16c2f3 1203 (int_sts0 & USB_FUNCTION_BITBRDY) &&
mbed_official 35:a8484e16c2f3 1204 (int_enb0 & USB_FUNCTION_BITBRDY) &&
mbed_official 35:a8484e16c2f3 1205 (int_sts1 & int_enb2) ) {
mbed_official 35:a8484e16c2f3 1206 /* ==== BRDY PIPEx ==== */
mbed_official 35:a8484e16c2f3 1207 usb0_function_BRDYInterrupt(int_sts1, int_enb2);
mbed_official 35:a8484e16c2f3 1208 } else if (
mbed_official 35:a8484e16c2f3 1209 (int_sts0 & USB_FUNCTION_BITNRDY) &&
mbed_official 35:a8484e16c2f3 1210 (int_enb0 & USB_FUNCTION_BITNRDY) &&
mbed_official 35:a8484e16c2f3 1211 (int_sts2 & int_enb3)) {
mbed_official 35:a8484e16c2f3 1212 /* ==== NRDY PIPEx ==== */
mbed_official 35:a8484e16c2f3 1213 usb0_function_NRDYInterrupt(int_sts2, int_enb3);
mbed_official 35:a8484e16c2f3 1214 } else {
mbed_official 35:a8484e16c2f3 1215 /* Do Nothing */
mbed_official 35:a8484e16c2f3 1216 }
mbed_official 35:a8484e16c2f3 1217
mbed_official 35:a8484e16c2f3 1218 /* Three dummy reads for cleearing interrupt requests */
mbed_official 35:a8484e16c2f3 1219 dumy_sts = USB200.INTSTS0;
mbed_official 35:a8484e16c2f3 1220 dumy_sts = USB200.INTSTS1;
mbed_official 35:a8484e16c2f3 1221 }
mbed_official 35:a8484e16c2f3 1222
mbed_official 35:a8484e16c2f3 1223 /*************************************************************************/
mbed_official 35:a8484e16c2f3 1224 #endif
mbed_official 35:a8484e16c2f3 1225 /*************************************************************************/
mbed_official 35:a8484e16c2f3 1226 /*EOF*/