Hossein Rahmani / USBDevice
Committer:
Kojto
Date:
Thu Jul 27 12:14:04 2017 +0100
Revision:
72:53949e6131f6
Update libraries

Fixes the previous commmit, as some devices were not copied. USBDevice contains
now targets directory with all targets implementations

Who changed what in which revision?

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