ME11B Sample Code in Maxim Integrated Team

Dependencies:   BMI160 max32630hsp3 MemoryLCD USBDevice

Fork of Host_Software_MAX32664GWEB_HR_EXTENDED by Seyhmus Cacina

Committer:
seyhmus.cacina
Date:
Mon Mar 18 10:21:53 2019 +0300
Revision:
0:ac4dea3e2894
ME11B Sample Code First Commit

Who changed what in which revision?

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