Maxim nexpaq / nexpaq_dev
Committer:
nexpaq
Date:
Fri Nov 04 20:54:50 2016 +0000
Revision:
1:d96dbedaebdb
Parent:
0:6c56fb4bc5f0
Removed extra directories for other platforms

Who changed what in which revision?

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