max4146x_comp

Dependencies:   MAX14690

Committer:
sdivarci
Date:
Sun Oct 25 20:10:02 2020 +0000
Revision:
0:0061165683ee
sdivarci

Who changed what in which revision?

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