USB device stack

Dependents:   mbed-mX-USB-TEST1 USBMSD_SD_HID_HelloWorld HidTest MIDI_usb_bridge ... more

Legacy Warning

This is an mbed 2 library. To learn more about mbed OS 5, visit the docs.

Pull requests against this repository are no longer supported. Please raise against mbed OS 5 as documented above.

Committer:
Kojto
Date:
Thu Jul 20 10:14:36 2017 +0100
Revision:
70:2c525a50f1b6
Update libraries (ed9d1da)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 70:2c525a50f1b6 1 /* mbed Microcontroller Library
Kojto 70:2c525a50f1b6 2 * Copyright (c) 2015-2016 Nuvoton
Kojto 70:2c525a50f1b6 3 *
Kojto 70:2c525a50f1b6 4 * Licensed under the Apache License, Version 2.0 (the "License");
Kojto 70:2c525a50f1b6 5 * you may not use this file except in compliance with the License.
Kojto 70:2c525a50f1b6 6 * You may obtain a copy of the License at
Kojto 70:2c525a50f1b6 7 *
Kojto 70:2c525a50f1b6 8 * http://www.apache.org/licenses/LICENSE-2.0
Kojto 70:2c525a50f1b6 9 *
Kojto 70:2c525a50f1b6 10 * Unless required by applicable law or agreed to in writing, software
Kojto 70:2c525a50f1b6 11 * distributed under the License is distributed on an "AS IS" BASIS,
Kojto 70:2c525a50f1b6 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Kojto 70:2c525a50f1b6 13 * See the License for the specific language governing permissions and
Kojto 70:2c525a50f1b6 14 * limitations under the License.
Kojto 70:2c525a50f1b6 15 */
Kojto 70:2c525a50f1b6 16
Kojto 70:2c525a50f1b6 17 #if defined(TARGET_NUMAKER_PFM_NUC472)
Kojto 70:2c525a50f1b6 18
Kojto 70:2c525a50f1b6 19 #include "USBHAL.h"
Kojto 70:2c525a50f1b6 20 #include "NUC472_442.h"
Kojto 70:2c525a50f1b6 21 #include "pinmap.h"
Kojto 70:2c525a50f1b6 22
Kojto 70:2c525a50f1b6 23 /**
Kojto 70:2c525a50f1b6 24 * EP: mbed USBD defined endpoint, e.g. EP0OUT/IN, EP1OUT/IN, EP2OUT/IN.
Kojto 70:2c525a50f1b6 25 * EPX: BSP defined endpoint, e.g. CEP, EPA, EPB, EPC.
Kojto 70:2c525a50f1b6 26 */
Kojto 70:2c525a50f1b6 27
Kojto 70:2c525a50f1b6 28 USBHAL * USBHAL::instance;
Kojto 70:2c525a50f1b6 29
Kojto 70:2c525a50f1b6 30 static volatile uint32_t s_ep_compl = 0;
Kojto 70:2c525a50f1b6 31 static volatile uint32_t s_ep_buf_ind = 0;
Kojto 70:2c525a50f1b6 32 static volatile uint8_t s_usb_addr = 0;
Kojto 70:2c525a50f1b6 33 static volatile S_USBD_CMD_T s_setup;
Kojto 70:2c525a50f1b6 34 static volatile uint16_t s_ctrlin_packetsize;
Kojto 70:2c525a50f1b6 35 static uint8_t *g_usbd_CtrlInPointer = 0;
Kojto 70:2c525a50f1b6 36 static uint32_t g_usbd_CtrlMaxPktSize = 64;
Kojto 70:2c525a50f1b6 37 static uint32_t g_usbd_ShortPkt = 0;
Kojto 70:2c525a50f1b6 38 static uint32_t gEpRead = 0;
Kojto 70:2c525a50f1b6 39 static uint32_t gEpReadCnt = 0;
Kojto 70:2c525a50f1b6 40
Kojto 70:2c525a50f1b6 41 void USBD_CtrlInput(void)
Kojto 70:2c525a50f1b6 42 {
Kojto 70:2c525a50f1b6 43 int volatile i;
Kojto 70:2c525a50f1b6 44 uint32_t volatile count;
Kojto 70:2c525a50f1b6 45
Kojto 70:2c525a50f1b6 46 // Process remained data
Kojto 70:2c525a50f1b6 47 if (g_usbd_CtrlInSize >= g_usbd_CtrlMaxPktSize)
Kojto 70:2c525a50f1b6 48 {
Kojto 70:2c525a50f1b6 49 // Data size > MXPLD
Kojto 70:2c525a50f1b6 50 for (i=0; i<(g_usbd_CtrlMaxPktSize >> 2); i++, g_usbd_CtrlInPointer+=4)
Kojto 70:2c525a50f1b6 51 USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
Kojto 70:2c525a50f1b6 52 USBD_START_CEP_IN(g_usbd_CtrlMaxPktSize);
Kojto 70:2c525a50f1b6 53 g_usbd_CtrlInSize -= g_usbd_CtrlMaxPktSize;
Kojto 70:2c525a50f1b6 54 }
Kojto 70:2c525a50f1b6 55 else
Kojto 70:2c525a50f1b6 56 {
Kojto 70:2c525a50f1b6 57 // Data size <= MXPLD
Kojto 70:2c525a50f1b6 58 for (i=0; i<(g_usbd_CtrlInSize >> 2); i++, g_usbd_CtrlInPointer+=4)
Kojto 70:2c525a50f1b6 59 USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
Kojto 70:2c525a50f1b6 60
Kojto 70:2c525a50f1b6 61 count = g_usbd_CtrlInSize % 4;
Kojto 70:2c525a50f1b6 62 for (i=0; i<count; i++)
Kojto 70:2c525a50f1b6 63 USBD->CEPDAT_BYTE = *(uint8_t *)(g_usbd_CtrlInPointer + i);
Kojto 70:2c525a50f1b6 64
Kojto 70:2c525a50f1b6 65 USBD_START_CEP_IN(g_usbd_CtrlInSize);
Kojto 70:2c525a50f1b6 66 g_usbd_CtrlInPointer = 0;
Kojto 70:2c525a50f1b6 67 g_usbd_CtrlInSize = 0;
Kojto 70:2c525a50f1b6 68 }
Kojto 70:2c525a50f1b6 69 }
Kojto 70:2c525a50f1b6 70
Kojto 70:2c525a50f1b6 71 USBHAL::USBHAL(void)
Kojto 70:2c525a50f1b6 72 {
Kojto 70:2c525a50f1b6 73 SYS_UnlockReg();
Kojto 70:2c525a50f1b6 74
Kojto 70:2c525a50f1b6 75 s_ep_buf_ind = 0;
Kojto 70:2c525a50f1b6 76
Kojto 70:2c525a50f1b6 77 memset(epCallback, 0x00, sizeof (epCallback));
Kojto 70:2c525a50f1b6 78 epCallback[0] = &USBHAL::EP1_OUT_callback;
Kojto 70:2c525a50f1b6 79 epCallback[1] = &USBHAL::EP2_IN_callback;
Kojto 70:2c525a50f1b6 80 epCallback[2] = &USBHAL::EP3_OUT_callback;
Kojto 70:2c525a50f1b6 81 epCallback[3] = &USBHAL::EP4_IN_callback;
Kojto 70:2c525a50f1b6 82 epCallback[4] = &USBHAL::EP5_OUT_callback;
Kojto 70:2c525a50f1b6 83 epCallback[5] = &USBHAL::EP6_IN_callback;
Kojto 70:2c525a50f1b6 84 epCallback[6] = &USBHAL::EP7_OUT_callback;
Kojto 70:2c525a50f1b6 85 epCallback[7] = &USBHAL::EP8_IN_callback;
Kojto 70:2c525a50f1b6 86 epCallback[8] = &USBHAL::EP9_OUT_callback;
Kojto 70:2c525a50f1b6 87 epCallback[9] = &USBHAL::EP10_IN_callback;
Kojto 70:2c525a50f1b6 88 epCallback[10] = &USBHAL::EP11_OUT_callback;
Kojto 70:2c525a50f1b6 89 epCallback[11] = &USBHAL::EP12_IN_callback;
Kojto 70:2c525a50f1b6 90
Kojto 70:2c525a50f1b6 91 instance = this;
Kojto 70:2c525a50f1b6 92
Kojto 70:2c525a50f1b6 93 /* Enable USBD module clock */
Kojto 70:2c525a50f1b6 94 CLK_EnableModuleClock(USBD_MODULE);
Kojto 70:2c525a50f1b6 95
Kojto 70:2c525a50f1b6 96 /* Enable USB PHY's LDO33. Run as USB device. */
Kojto 70:2c525a50f1b6 97 SYS->USBPHY = SYS_USBPHY_USBROLE_OTG_V33_EN | SYS_USBPHY_USBROLE_STD_USBD;
Kojto 70:2c525a50f1b6 98
Kojto 70:2c525a50f1b6 99 /* Enable USB PHY and wait for it ready */
Kojto 70:2c525a50f1b6 100 USBD_ENABLE_PHY();
Kojto 70:2c525a50f1b6 101 while (1)
Kojto 70:2c525a50f1b6 102 {
Kojto 70:2c525a50f1b6 103 USBD->EPAMPS = 0x20;
Kojto 70:2c525a50f1b6 104 if (USBD->EPAMPS == 0x20)
Kojto 70:2c525a50f1b6 105 break;
Kojto 70:2c525a50f1b6 106 }
Kojto 70:2c525a50f1b6 107
Kojto 70:2c525a50f1b6 108 /* Force to full-speed */
Kojto 70:2c525a50f1b6 109 USBD->OPER = 0;//USBD_OPER_HISPDEN_Msk;
Kojto 70:2c525a50f1b6 110
Kojto 70:2c525a50f1b6 111 /* Set SE0 (disconnect) */
Kojto 70:2c525a50f1b6 112 USBD_SET_SE0();
Kojto 70:2c525a50f1b6 113
Kojto 70:2c525a50f1b6 114 NVIC_SetVector(USBD_IRQn, (uint32_t) &_usbisr);
Kojto 70:2c525a50f1b6 115 NVIC_EnableIRQ(USBD_IRQn);
Kojto 70:2c525a50f1b6 116 }
Kojto 70:2c525a50f1b6 117
Kojto 70:2c525a50f1b6 118 USBHAL::~USBHAL(void)
Kojto 70:2c525a50f1b6 119 {
Kojto 70:2c525a50f1b6 120 NVIC_DisableIRQ(USBD_IRQn);
Kojto 70:2c525a50f1b6 121 USBD_SET_SE0();
Kojto 70:2c525a50f1b6 122 USBD_DISABLE_PHY();
Kojto 70:2c525a50f1b6 123 }
Kojto 70:2c525a50f1b6 124
Kojto 70:2c525a50f1b6 125 void USBHAL::connect(void)
Kojto 70:2c525a50f1b6 126 {
Kojto 70:2c525a50f1b6 127 USBD_ResetDMA();
Kojto 70:2c525a50f1b6 128 USBD_SET_ADDR(0);
Kojto 70:2c525a50f1b6 129
Kojto 70:2c525a50f1b6 130 /**
Kojto 70:2c525a50f1b6 131 * Control Transfer Packet Size Constraints
Kojto 70:2c525a50f1b6 132 * low-speed: 8
Kojto 70:2c525a50f1b6 133 * full-speed: 8, 16, 32, 64
Kojto 70:2c525a50f1b6 134 * high-speed: 64
Kojto 70:2c525a50f1b6 135 */
Kojto 70:2c525a50f1b6 136 /* Control endpoint */
Kojto 70:2c525a50f1b6 137 USBD_SetEpBufAddr(CEP, s_ep_buf_ind, MAX_PACKET_SIZE_EP0);
Kojto 70:2c525a50f1b6 138 s_ep_buf_ind = MAX_PACKET_SIZE_EP0;
Kojto 70:2c525a50f1b6 139
Kojto 70:2c525a50f1b6 140 /* Enable USB/CEP interrupt */
Kojto 70:2c525a50f1b6 141 USBD_ENABLE_USB_INT(USBD_GINTEN_USBIE_Msk | USBD_GINTEN_CEPIE_Msk);
Kojto 70:2c525a50f1b6 142 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk);
Kojto 70:2c525a50f1b6 143
Kojto 70:2c525a50f1b6 144 /* Enable BUS interrupt */
Kojto 70:2c525a50f1b6 145 USBD_ENABLE_BUS_INT(
Kojto 70:2c525a50f1b6 146 USBD_BUSINTEN_DMADONEIEN_Msk |
Kojto 70:2c525a50f1b6 147 USBD_BUSINTEN_RESUMEIEN_Msk |
Kojto 70:2c525a50f1b6 148 USBD_BUSINTEN_RSTIEN_Msk |
Kojto 70:2c525a50f1b6 149 USBD_BUSINTEN_VBUSDETIEN_Msk |
Kojto 70:2c525a50f1b6 150 USBD_BUSINTEN_SOFIEN_Msk
Kojto 70:2c525a50f1b6 151 );
Kojto 70:2c525a50f1b6 152
Kojto 70:2c525a50f1b6 153 /* Clear SE0 (connect) */
Kojto 70:2c525a50f1b6 154 USBD_CLR_SE0();
Kojto 70:2c525a50f1b6 155 }
Kojto 70:2c525a50f1b6 156
Kojto 70:2c525a50f1b6 157 void USBHAL::disconnect(void)
Kojto 70:2c525a50f1b6 158 {
Kojto 70:2c525a50f1b6 159 /* Set SE0 (disconnect) */
Kojto 70:2c525a50f1b6 160 USBD_SET_SE0();
Kojto 70:2c525a50f1b6 161 }
Kojto 70:2c525a50f1b6 162
Kojto 70:2c525a50f1b6 163 void USBHAL::configureDevice(void)
Kojto 70:2c525a50f1b6 164 {
Kojto 70:2c525a50f1b6 165 /**
Kojto 70:2c525a50f1b6 166 * In USBDevice.cpp > USBDevice::requestSetConfiguration, configureDevice() is called after realiseEndpoint() (in USBCallback_setConfiguration()).
Kojto 70:2c525a50f1b6 167 * So we have the following USB buffer management policy:
Kojto 70:2c525a50f1b6 168 * 1. Allocate for CEP on connect().
Kojto 70:2c525a50f1b6 169 * 2. Allocate for EPX in realiseEndpoint().
Kojto 70:2c525a50f1b6 170 * 3. Deallocate all except for CEP in unconfigureDevice().
Kojto 70:2c525a50f1b6 171 */
Kojto 70:2c525a50f1b6 172 }
Kojto 70:2c525a50f1b6 173
Kojto 70:2c525a50f1b6 174 void USBHAL::unconfigureDevice(void)
Kojto 70:2c525a50f1b6 175 {
Kojto 70:2c525a50f1b6 176 s_ep_buf_ind = MAX_PACKET_SIZE_EP0;
Kojto 70:2c525a50f1b6 177 }
Kojto 70:2c525a50f1b6 178
Kojto 70:2c525a50f1b6 179 void USBHAL::setAddress(uint8_t address)
Kojto 70:2c525a50f1b6 180 {
Kojto 70:2c525a50f1b6 181 // NOTE: Delay address setting; otherwise, USB controller won't ack.
Kojto 70:2c525a50f1b6 182 s_usb_addr = address;
Kojto 70:2c525a50f1b6 183 }
Kojto 70:2c525a50f1b6 184
Kojto 70:2c525a50f1b6 185 void USBHAL::remoteWakeup(void)
Kojto 70:2c525a50f1b6 186 {
Kojto 70:2c525a50f1b6 187 USBD->OPER |= USBD_OPER_RESUMEEN_Msk;
Kojto 70:2c525a50f1b6 188 }
Kojto 70:2c525a50f1b6 189
Kojto 70:2c525a50f1b6 190 bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
Kojto 70:2c525a50f1b6 191 {
Kojto 70:2c525a50f1b6 192 uint32_t ep_type;
Kojto 70:2c525a50f1b6 193 uint32_t ep_hw_index = NU_EP2EPH(endpoint);
Kojto 70:2c525a50f1b6 194
Kojto 70:2c525a50f1b6 195 USBD_SetEpBufAddr(ep_hw_index, s_ep_buf_ind, maxPacket);
Kojto 70:2c525a50f1b6 196 s_ep_buf_ind += maxPacket;
Kojto 70:2c525a50f1b6 197 USBD_SET_MAX_PAYLOAD(ep_hw_index, maxPacket);
Kojto 70:2c525a50f1b6 198
Kojto 70:2c525a50f1b6 199 switch (NU_EP2EPL(endpoint))
Kojto 70:2c525a50f1b6 200 {
Kojto 70:2c525a50f1b6 201 case 1: case 2:
Kojto 70:2c525a50f1b6 202 ep_type = USB_EP_CFG_TYPE_INT;
Kojto 70:2c525a50f1b6 203 break;
Kojto 70:2c525a50f1b6 204
Kojto 70:2c525a50f1b6 205 case 3: case 4:
Kojto 70:2c525a50f1b6 206 ep_type = USB_EP_CFG_TYPE_ISO;
Kojto 70:2c525a50f1b6 207 break;
Kojto 70:2c525a50f1b6 208
Kojto 70:2c525a50f1b6 209 default:
Kojto 70:2c525a50f1b6 210 ep_type = USB_EP_CFG_TYPE_BULK;
Kojto 70:2c525a50f1b6 211 }
Kojto 70:2c525a50f1b6 212 uint32_t ep_dir = (NU_EP_DIR(endpoint) == NU_EP_DIR_IN) ? USB_EP_CFG_DIR_IN : USB_EP_CFG_DIR_OUT;
Kojto 70:2c525a50f1b6 213 USBD_ConfigEp(ep_hw_index, NU_EP2EPL(endpoint), ep_type, ep_dir);
Kojto 70:2c525a50f1b6 214
Kojto 70:2c525a50f1b6 215 /* Enable USB/EPX interrupt */
Kojto 70:2c525a50f1b6 216 // NOTE: Require USBD_GINTEN_EPAIE_Pos, USBD_GINTEN_EPBIE_Pos, ... USBD_GINTEN_EPLIE_Pos to be consecutive.
Kojto 70:2c525a50f1b6 217 USBD_ENABLE_USB_INT(USBD->GINTEN | USBD_GINTEN_USBIE_Msk |
Kojto 70:2c525a50f1b6 218 USBD_GINTEN_CEPIE_Msk |
Kojto 70:2c525a50f1b6 219 1 << (ep_hw_index + USBD_GINTEN_EPAIE_Pos)); // Added USB/EPX interrupt
Kojto 70:2c525a50f1b6 220
Kojto 70:2c525a50f1b6 221 if (ep_dir == 0)
Kojto 70:2c525a50f1b6 222 USBD_ENABLE_EP_INT(ep_hw_index, USBD_EPINTEN_RXPKIEN_Msk);
Kojto 70:2c525a50f1b6 223 else
Kojto 70:2c525a50f1b6 224 USBD_ENABLE_EP_INT(ep_hw_index, USBD_EPINTEN_TXPKIEN_Msk);
Kojto 70:2c525a50f1b6 225 return true;
Kojto 70:2c525a50f1b6 226 }
Kojto 70:2c525a50f1b6 227
Kojto 70:2c525a50f1b6 228 void USBHAL::EP0setup(uint8_t *buffer)
Kojto 70:2c525a50f1b6 229 {
Kojto 70:2c525a50f1b6 230 uint32_t sz;
Kojto 70:2c525a50f1b6 231 endpointReadResult(EP0OUT, buffer, &sz);
Kojto 70:2c525a50f1b6 232 }
Kojto 70:2c525a50f1b6 233
Kojto 70:2c525a50f1b6 234 void USBHAL::EP0read(void)
Kojto 70:2c525a50f1b6 235 {
Kojto 70:2c525a50f1b6 236 if (s_setup.wLength && ! (s_setup.bmRequestType & 0x80))
Kojto 70:2c525a50f1b6 237 {
Kojto 70:2c525a50f1b6 238 // Control OUT
Kojto 70:2c525a50f1b6 239 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk | USBD_CEPINTEN_RXPKIEN_Msk);
Kojto 70:2c525a50f1b6 240 }
Kojto 70:2c525a50f1b6 241 else
Kojto 70:2c525a50f1b6 242 {
Kojto 70:2c525a50f1b6 243 // Status stage
Kojto 70:2c525a50f1b6 244 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
Kojto 70:2c525a50f1b6 245 USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);
Kojto 70:2c525a50f1b6 246 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
Kojto 70:2c525a50f1b6 247 }
Kojto 70:2c525a50f1b6 248 }
Kojto 70:2c525a50f1b6 249
Kojto 70:2c525a50f1b6 250 void USBHAL::EP0readStage(void)
Kojto 70:2c525a50f1b6 251 {
Kojto 70:2c525a50f1b6 252 // N/A
Kojto 70:2c525a50f1b6 253 }
Kojto 70:2c525a50f1b6 254
Kojto 70:2c525a50f1b6 255 uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
Kojto 70:2c525a50f1b6 256 {
Kojto 70:2c525a50f1b6 257 uint32_t i;
Kojto 70:2c525a50f1b6 258 uint32_t ceprxcnt = USBD->CEPRXCNT;
Kojto 70:2c525a50f1b6 259 for (i = 0; i < ceprxcnt; i ++)
Kojto 70:2c525a50f1b6 260 *buffer ++ = USBD->CEPDAT_BYTE;
Kojto 70:2c525a50f1b6 261 return ceprxcnt;
Kojto 70:2c525a50f1b6 262 }
Kojto 70:2c525a50f1b6 263
Kojto 70:2c525a50f1b6 264 void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
Kojto 70:2c525a50f1b6 265 {
Kojto 70:2c525a50f1b6 266 if (buffer && size)
Kojto 70:2c525a50f1b6 267 {
Kojto 70:2c525a50f1b6 268 g_usbd_CtrlInPointer = buffer;
Kojto 70:2c525a50f1b6 269 g_usbd_CtrlInSize = size;
Kojto 70:2c525a50f1b6 270 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk);
Kojto 70:2c525a50f1b6 271 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_INTKIEN_Msk);
Kojto 70:2c525a50f1b6 272 }
Kojto 70:2c525a50f1b6 273 else
Kojto 70:2c525a50f1b6 274 {
Kojto 70:2c525a50f1b6 275 /* Status stage */
Kojto 70:2c525a50f1b6 276 s_ctrlin_packetsize = 0;
Kojto 70:2c525a50f1b6 277 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
Kojto 70:2c525a50f1b6 278 USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);
Kojto 70:2c525a50f1b6 279 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
Kojto 70:2c525a50f1b6 280 }
Kojto 70:2c525a50f1b6 281 }
Kojto 70:2c525a50f1b6 282
Kojto 70:2c525a50f1b6 283 void USBHAL::EP0getWriteResult(void)
Kojto 70:2c525a50f1b6 284 {
Kojto 70:2c525a50f1b6 285 // N/A
Kojto 70:2c525a50f1b6 286 }
Kojto 70:2c525a50f1b6 287
Kojto 70:2c525a50f1b6 288 void USBHAL::EP0stall(void)
Kojto 70:2c525a50f1b6 289 {
Kojto 70:2c525a50f1b6 290 stallEndpoint(EP0OUT);
Kojto 70:2c525a50f1b6 291 }
Kojto 70:2c525a50f1b6 292
Kojto 70:2c525a50f1b6 293 EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize)
Kojto 70:2c525a50f1b6 294 {
Kojto 70:2c525a50f1b6 295 return EP_PENDING;
Kojto 70:2c525a50f1b6 296 }
Kojto 70:2c525a50f1b6 297
Kojto 70:2c525a50f1b6 298 EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) //spcheng
Kojto 70:2c525a50f1b6 299 {
Kojto 70:2c525a50f1b6 300 if (endpoint == EP0OUT)
Kojto 70:2c525a50f1b6 301 {
Kojto 70:2c525a50f1b6 302 if (buffer) {
Kojto 70:2c525a50f1b6 303 *((uint16_t *) (buffer + 0)) = (uint16_t) USBD->SETUP1_0;
Kojto 70:2c525a50f1b6 304 *((uint16_t *) (buffer + 2)) = (uint16_t) USBD->SETUP3_2;
Kojto 70:2c525a50f1b6 305 *((uint16_t *) (buffer + 4)) = (uint16_t) USBD->SETUP5_4;
Kojto 70:2c525a50f1b6 306 *((uint16_t *) (buffer + 6)) = (uint16_t) USBD->SETUP7_6;
Kojto 70:2c525a50f1b6 307 }
Kojto 70:2c525a50f1b6 308
Kojto 70:2c525a50f1b6 309 s_setup.bmRequestType = (uint8_t) (USBD->SETUP1_0 & 0xff);
Kojto 70:2c525a50f1b6 310 s_setup.bRequest = (int8_t) (USBD->SETUP1_0 >> 8) & 0xff;
Kojto 70:2c525a50f1b6 311 s_setup.wValue = (uint16_t) USBD->SETUP3_2;
Kojto 70:2c525a50f1b6 312 s_setup.wIndex = (uint16_t) USBD->SETUP5_4;
Kojto 70:2c525a50f1b6 313 s_setup.wLength = (uint16_t) USBD->SETUP7_6;
Kojto 70:2c525a50f1b6 314 }
Kojto 70:2c525a50f1b6 315 else
Kojto 70:2c525a50f1b6 316 {
Kojto 70:2c525a50f1b6 317 if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
Kojto 70:2c525a50f1b6 318 {
Kojto 70:2c525a50f1b6 319 while (1)
Kojto 70:2c525a50f1b6 320 {
Kojto 70:2c525a50f1b6 321 if (!(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
Kojto 70:2c525a50f1b6 322 break;
Kojto 70:2c525a50f1b6 323 else
Kojto 70:2c525a50f1b6 324 if (!USBD_IS_ATTACHED())
Kojto 70:2c525a50f1b6 325 break;
Kojto 70:2c525a50f1b6 326 }
Kojto 70:2c525a50f1b6 327 gEpReadCnt = USBD_GET_EP_DATA_COUNT(NU_EP2EPH(endpoint));
Kojto 70:2c525a50f1b6 328 if (gEpReadCnt == 0)
Kojto 70:2c525a50f1b6 329 {
Kojto 70:2c525a50f1b6 330 *bytesRead = 0;
Kojto 70:2c525a50f1b6 331 return EP_COMPLETED;
Kojto 70:2c525a50f1b6 332 }
Kojto 70:2c525a50f1b6 333 s_ep_compl |= (1 << NU_EP2EPL(endpoint));
Kojto 70:2c525a50f1b6 334 USBD_SET_DMA_LEN(gEpReadCnt);
Kojto 70:2c525a50f1b6 335 USBD_SET_DMA_ADDR((uint32_t)buffer);
Kojto 70:2c525a50f1b6 336 USBD_SET_DMA_WRITE(NU_EP2EPL(endpoint));
Kojto 70:2c525a50f1b6 337 USBD_ENABLE_DMA();
Kojto 70:2c525a50f1b6 338 return EP_PENDING;;
Kojto 70:2c525a50f1b6 339
Kojto 70:2c525a50f1b6 340 }
Kojto 70:2c525a50f1b6 341 else
Kojto 70:2c525a50f1b6 342 {
Kojto 70:2c525a50f1b6 343 if ((USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
Kojto 70:2c525a50f1b6 344 return EP_PENDING;;
Kojto 70:2c525a50f1b6 345
Kojto 70:2c525a50f1b6 346 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_DMADONEIF_Msk);
Kojto 70:2c525a50f1b6 347 s_ep_compl &= ~(1 << NU_EP2EPL(endpoint));
Kojto 70:2c525a50f1b6 348 *bytesRead = gEpReadCnt;
Kojto 70:2c525a50f1b6 349 }
Kojto 70:2c525a50f1b6 350 }
Kojto 70:2c525a50f1b6 351 return EP_COMPLETED;
Kojto 70:2c525a50f1b6 352 }
Kojto 70:2c525a50f1b6 353
Kojto 70:2c525a50f1b6 354
Kojto 70:2c525a50f1b6 355 uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer)
Kojto 70:2c525a50f1b6 356 {
Kojto 70:2c525a50f1b6 357 return 0;
Kojto 70:2c525a50f1b6 358 }
Kojto 70:2c525a50f1b6 359
Kojto 70:2c525a50f1b6 360 EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
Kojto 70:2c525a50f1b6 361 {
Kojto 70:2c525a50f1b6 362 uint32_t ep_logic_index = NU_EP2EPL(endpoint);
Kojto 70:2c525a50f1b6 363 if (ep_logic_index == 0)
Kojto 70:2c525a50f1b6 364 return EP_INVALID;
Kojto 70:2c525a50f1b6 365 else
Kojto 70:2c525a50f1b6 366 {
Kojto 70:2c525a50f1b6 367 uint32_t ep_hw_index = NU_EP2EPH(endpoint);
Kojto 70:2c525a50f1b6 368 uint32_t mps = USBD_GET_EP_MAX_PAYLOAD(ep_hw_index);
Kojto 70:2c525a50f1b6 369 if (size > mps) {
Kojto 70:2c525a50f1b6 370 return EP_INVALID;
Kojto 70:2c525a50f1b6 371 }
Kojto 70:2c525a50f1b6 372 if (size < mps)
Kojto 70:2c525a50f1b6 373 g_usbd_ShortPkt = 1;
Kojto 70:2c525a50f1b6 374 if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
Kojto 70:2c525a50f1b6 375 {
Kojto 70:2c525a50f1b6 376 s_ep_compl |= (1 << ep_logic_index);
Kojto 70:2c525a50f1b6 377
Kojto 70:2c525a50f1b6 378 while (1)
Kojto 70:2c525a50f1b6 379 {
Kojto 70:2c525a50f1b6 380 if (!(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
Kojto 70:2c525a50f1b6 381 break;
Kojto 70:2c525a50f1b6 382 else
Kojto 70:2c525a50f1b6 383 if (!USBD_IS_ATTACHED())
Kojto 70:2c525a50f1b6 384 break;
Kojto 70:2c525a50f1b6 385 }
Kojto 70:2c525a50f1b6 386 USBD_SET_DMA_LEN(size);
Kojto 70:2c525a50f1b6 387 USBD_SET_DMA_ADDR((uint32_t)data);
Kojto 70:2c525a50f1b6 388 USBD_SET_DMA_READ(ep_logic_index);
Kojto 70:2c525a50f1b6 389 USBD_ENABLE_DMA();
Kojto 70:2c525a50f1b6 390 }
Kojto 70:2c525a50f1b6 391 }
Kojto 70:2c525a50f1b6 392 return EP_PENDING;
Kojto 70:2c525a50f1b6 393 }
Kojto 70:2c525a50f1b6 394
Kojto 70:2c525a50f1b6 395 EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
Kojto 70:2c525a50f1b6 396 {
Kojto 70:2c525a50f1b6 397 if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
Kojto 70:2c525a50f1b6 398 return EP_COMPLETED;
Kojto 70:2c525a50f1b6 399 else
Kojto 70:2c525a50f1b6 400 {
Kojto 70:2c525a50f1b6 401 if ((USBD_GET_EP_DATA_COUNT(NU_EP2EPH(endpoint))) == 0 && !(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
Kojto 70:2c525a50f1b6 402 {
Kojto 70:2c525a50f1b6 403 s_ep_compl &= ~(s_ep_compl & (1 << NU_EP2EPL(endpoint)));
Kojto 70:2c525a50f1b6 404 return EP_COMPLETED;
Kojto 70:2c525a50f1b6 405 }
Kojto 70:2c525a50f1b6 406 }
Kojto 70:2c525a50f1b6 407 return EP_PENDING;
Kojto 70:2c525a50f1b6 408 }
Kojto 70:2c525a50f1b6 409
Kojto 70:2c525a50f1b6 410 void USBHAL::stallEndpoint(uint8_t endpoint)
Kojto 70:2c525a50f1b6 411 {
Kojto 70:2c525a50f1b6 412 uint32_t ep_hw_index = NU_EP2EPH(endpoint);
Kojto 70:2c525a50f1b6 413 if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
Kojto 70:2c525a50f1b6 414 return;
Kojto 70:2c525a50f1b6 415 USBD_SetStall(ep_hw_index);
Kojto 70:2c525a50f1b6 416 }
Kojto 70:2c525a50f1b6 417
Kojto 70:2c525a50f1b6 418 void USBHAL::unstallEndpoint(uint8_t endpoint)
Kojto 70:2c525a50f1b6 419 {
Kojto 70:2c525a50f1b6 420 uint32_t ep_hw_index = NU_EP2EPH(endpoint);
Kojto 70:2c525a50f1b6 421 if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
Kojto 70:2c525a50f1b6 422 return;
Kojto 70:2c525a50f1b6 423 USBD_ClearStall(ep_hw_index);
Kojto 70:2c525a50f1b6 424 }
Kojto 70:2c525a50f1b6 425
Kojto 70:2c525a50f1b6 426 bool USBHAL::getEndpointStallState(uint8_t endpoint)
Kojto 70:2c525a50f1b6 427 {
Kojto 70:2c525a50f1b6 428 uint32_t ep_hw_index = NU_EP2EPH(endpoint);
Kojto 70:2c525a50f1b6 429 if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
Kojto 70:2c525a50f1b6 430 return false;
Kojto 70:2c525a50f1b6 431 return USBD_GetStall(ep_hw_index) ? 1 : 0;
Kojto 70:2c525a50f1b6 432 }
Kojto 70:2c525a50f1b6 433
Kojto 70:2c525a50f1b6 434 void USBHAL::_usbisr(void)
Kojto 70:2c525a50f1b6 435 {
Kojto 70:2c525a50f1b6 436 MBED_ASSERT(instance);
Kojto 70:2c525a50f1b6 437 instance->usbisr();
Kojto 70:2c525a50f1b6 438 }
Kojto 70:2c525a50f1b6 439
Kojto 70:2c525a50f1b6 440 void USBHAL::usbisr(void)
Kojto 70:2c525a50f1b6 441 {
Kojto 70:2c525a50f1b6 442 uint32_t gintsts = USBD->GINTSTS & USBD->GINTEN;
Kojto 70:2c525a50f1b6 443 if (! gintsts)
Kojto 70:2c525a50f1b6 444 return;
Kojto 70:2c525a50f1b6 445
Kojto 70:2c525a50f1b6 446 if (gintsts & USBD_GINTSTS_USBIF_Msk)
Kojto 70:2c525a50f1b6 447 {
Kojto 70:2c525a50f1b6 448 uint32_t busintsts = USBD->BUSINTSTS & USBD->BUSINTEN;
Kojto 70:2c525a50f1b6 449
Kojto 70:2c525a50f1b6 450 /* SOF */
Kojto 70:2c525a50f1b6 451 if (busintsts & USBD_BUSINTSTS_SOFIF_Msk)
Kojto 70:2c525a50f1b6 452 {
Kojto 70:2c525a50f1b6 453 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SOFIF_Msk);
Kojto 70:2c525a50f1b6 454 // TODO
Kojto 70:2c525a50f1b6 455 SOF(USBD->FRAMECNT >> 3);
Kojto 70:2c525a50f1b6 456 }
Kojto 70:2c525a50f1b6 457
Kojto 70:2c525a50f1b6 458 /* Reset */
Kojto 70:2c525a50f1b6 459 if (busintsts & USBD_BUSINTSTS_RSTIF_Msk)
Kojto 70:2c525a50f1b6 460 {
Kojto 70:2c525a50f1b6 461 connect();
Kojto 70:2c525a50f1b6 462 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RSTIF_Msk);
Kojto 70:2c525a50f1b6 463 USBD_CLR_CEP_INT_FLAG(0x1ffc);
Kojto 70:2c525a50f1b6 464 }
Kojto 70:2c525a50f1b6 465
Kojto 70:2c525a50f1b6 466 /* Resume */
Kojto 70:2c525a50f1b6 467 if (busintsts & USBD_BUSINTSTS_RESUMEIF_Msk)
Kojto 70:2c525a50f1b6 468 {
Kojto 70:2c525a50f1b6 469 USBD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk|USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_SOFIEN_Msk | USBD_BUSINTEN_SOFIEN_Msk);
Kojto 70:2c525a50f1b6 470 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RESUMEIF_Msk);
Kojto 70:2c525a50f1b6 471 }
Kojto 70:2c525a50f1b6 472
Kojto 70:2c525a50f1b6 473 /* Suspend */
Kojto 70:2c525a50f1b6 474 if (busintsts & USBD_BUSINTSTS_SUSPENDIF_Msk)
Kojto 70:2c525a50f1b6 475 {
Kojto 70:2c525a50f1b6 476 USBD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk |USBD_BUSINTEN_SOFIEN_Msk);
Kojto 70:2c525a50f1b6 477 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SUSPENDIF_Msk);
Kojto 70:2c525a50f1b6 478 }
Kojto 70:2c525a50f1b6 479
Kojto 70:2c525a50f1b6 480 /* High-speed */
Kojto 70:2c525a50f1b6 481 if (busintsts & USBD_BUSINTSTS_HISPDIF_Msk)
Kojto 70:2c525a50f1b6 482 {
Kojto 70:2c525a50f1b6 483 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk);
Kojto 70:2c525a50f1b6 484 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_HISPDIF_Msk);
Kojto 70:2c525a50f1b6 485 }
Kojto 70:2c525a50f1b6 486
Kojto 70:2c525a50f1b6 487 /* DMA */
Kojto 70:2c525a50f1b6 488 if (busintsts & USBD_BUSINTSTS_DMADONEIF_Msk)
Kojto 70:2c525a50f1b6 489 {
Kojto 70:2c525a50f1b6 490 if (USBD->DMACTL & 0x10) /* IN - Read */
Kojto 70:2c525a50f1b6 491 {
Kojto 70:2c525a50f1b6 492 if (g_usbd_ShortPkt)
Kojto 70:2c525a50f1b6 493 {
Kojto 70:2c525a50f1b6 494 uint32_t ep_hw_index = NU_EPL2EPH((USBD->DMACTL & 0xF));
Kojto 70:2c525a50f1b6 495 USBD_SET_EP_SHORT_PACKET(ep_hw_index);
Kojto 70:2c525a50f1b6 496 g_usbd_ShortPkt = 0;
Kojto 70:2c525a50f1b6 497 }
Kojto 70:2c525a50f1b6 498 }
Kojto 70:2c525a50f1b6 499 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_DMADONEIF_Msk);
Kojto 70:2c525a50f1b6 500 }
Kojto 70:2c525a50f1b6 501
Kojto 70:2c525a50f1b6 502 /* PHY clock available */
Kojto 70:2c525a50f1b6 503 if (busintsts & USBD_BUSINTSTS_PHYCLKVLDIF_Msk)
Kojto 70:2c525a50f1b6 504 {
Kojto 70:2c525a50f1b6 505 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_PHYCLKVLDIF_Msk);
Kojto 70:2c525a50f1b6 506 }
Kojto 70:2c525a50f1b6 507
Kojto 70:2c525a50f1b6 508 /* VBUS plug-in */
Kojto 70:2c525a50f1b6 509 if (busintsts & USBD_BUSINTSTS_VBUSDETIF_Msk)
Kojto 70:2c525a50f1b6 510 {
Kojto 70:2c525a50f1b6 511 if (USBD_IS_ATTACHED())
Kojto 70:2c525a50f1b6 512 {
Kojto 70:2c525a50f1b6 513 // USB plug-in
Kojto 70:2c525a50f1b6 514 USBD_ENABLE_USB();
Kojto 70:2c525a50f1b6 515 }
Kojto 70:2c525a50f1b6 516 else
Kojto 70:2c525a50f1b6 517 {
Kojto 70:2c525a50f1b6 518 // USB unplug-out
Kojto 70:2c525a50f1b6 519 USBD_DISABLE_USB();
Kojto 70:2c525a50f1b6 520 }
Kojto 70:2c525a50f1b6 521 USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_VBUSDETIF_Msk);
Kojto 70:2c525a50f1b6 522 }
Kojto 70:2c525a50f1b6 523 }
Kojto 70:2c525a50f1b6 524
Kojto 70:2c525a50f1b6 525 /* CEP interrupts */
Kojto 70:2c525a50f1b6 526 if (gintsts & USBD_GINTSTS_CEPIF_Msk)
Kojto 70:2c525a50f1b6 527 {
Kojto 70:2c525a50f1b6 528 uint32_t cepintsts = USBD->CEPINTSTS & USBD->CEPINTEN;
Kojto 70:2c525a50f1b6 529
Kojto 70:2c525a50f1b6 530 /* SETUP token packet */
Kojto 70:2c525a50f1b6 531 if (cepintsts & USBD_CEPINTSTS_SETUPTKIF_Msk)
Kojto 70:2c525a50f1b6 532 {
Kojto 70:2c525a50f1b6 533 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPTKIF_Msk);
Kojto 70:2c525a50f1b6 534 return;
Kojto 70:2c525a50f1b6 535 }
Kojto 70:2c525a50f1b6 536
Kojto 70:2c525a50f1b6 537 /* SETUP transaction */
Kojto 70:2c525a50f1b6 538 if (cepintsts & USBD_CEPINTSTS_SETUPPKIF_Msk)
Kojto 70:2c525a50f1b6 539 {
Kojto 70:2c525a50f1b6 540 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPPKIF_Msk);
Kojto 70:2c525a50f1b6 541 EP0setupCallback();
Kojto 70:2c525a50f1b6 542 return;
Kojto 70:2c525a50f1b6 543 }
Kojto 70:2c525a50f1b6 544
Kojto 70:2c525a50f1b6 545 /* OUT token packet */
Kojto 70:2c525a50f1b6 546 if (cepintsts & USBD_CEPINTSTS_OUTTKIF_Msk)
Kojto 70:2c525a50f1b6 547 {
Kojto 70:2c525a50f1b6 548 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_OUTTKIF_Msk);
Kojto 70:2c525a50f1b6 549 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
Kojto 70:2c525a50f1b6 550 return;
Kojto 70:2c525a50f1b6 551 }
Kojto 70:2c525a50f1b6 552
Kojto 70:2c525a50f1b6 553 /* IN token packet */
Kojto 70:2c525a50f1b6 554 if (cepintsts & USBD_CEPINTSTS_INTKIF_Msk)
Kojto 70:2c525a50f1b6 555 {
Kojto 70:2c525a50f1b6 556 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk);
Kojto 70:2c525a50f1b6 557 if (!(cepintsts & USBD_CEPINTSTS_STSDONEIF_Msk))
Kojto 70:2c525a50f1b6 558 {
Kojto 70:2c525a50f1b6 559 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
Kojto 70:2c525a50f1b6 560 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk);
Kojto 70:2c525a50f1b6 561 USBD_CtrlInput();
Kojto 70:2c525a50f1b6 562 }
Kojto 70:2c525a50f1b6 563 else
Kojto 70:2c525a50f1b6 564 {
Kojto 70:2c525a50f1b6 565 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
Kojto 70:2c525a50f1b6 566 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk);
Kojto 70:2c525a50f1b6 567 }
Kojto 70:2c525a50f1b6 568 return;
Kojto 70:2c525a50f1b6 569 }
Kojto 70:2c525a50f1b6 570
Kojto 70:2c525a50f1b6 571 /* PING packet */
Kojto 70:2c525a50f1b6 572 if (cepintsts & USBD_CEPINTSTS_PINGIF_Msk)
Kojto 70:2c525a50f1b6 573 {
Kojto 70:2c525a50f1b6 574 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_PINGIF_Msk);
Kojto 70:2c525a50f1b6 575 return;
Kojto 70:2c525a50f1b6 576 }
Kojto 70:2c525a50f1b6 577
Kojto 70:2c525a50f1b6 578 /* IN transaction */
Kojto 70:2c525a50f1b6 579 if (cepintsts & USBD_CEPINTSTS_TXPKIF_Msk)
Kojto 70:2c525a50f1b6 580 {
Kojto 70:2c525a50f1b6 581 EP0in();
Kojto 70:2c525a50f1b6 582 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
Kojto 70:2c525a50f1b6 583 return;
Kojto 70:2c525a50f1b6 584 }
Kojto 70:2c525a50f1b6 585
Kojto 70:2c525a50f1b6 586 /* OUT transaction */
Kojto 70:2c525a50f1b6 587 if (cepintsts & USBD_CEPINTSTS_RXPKIF_Msk)
Kojto 70:2c525a50f1b6 588 {
Kojto 70:2c525a50f1b6 589 EP0out();
Kojto 70:2c525a50f1b6 590 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_RXPKIF_Msk);
Kojto 70:2c525a50f1b6 591 return;
Kojto 70:2c525a50f1b6 592 }
Kojto 70:2c525a50f1b6 593
Kojto 70:2c525a50f1b6 594 /* NAK handshake packet */
Kojto 70:2c525a50f1b6 595 if (cepintsts & USBD_CEPINTSTS_NAKIF_Msk)
Kojto 70:2c525a50f1b6 596 {
Kojto 70:2c525a50f1b6 597 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_NAKIF_Msk);
Kojto 70:2c525a50f1b6 598 return;
Kojto 70:2c525a50f1b6 599 }
Kojto 70:2c525a50f1b6 600
Kojto 70:2c525a50f1b6 601 /* STALL handshake packet */
Kojto 70:2c525a50f1b6 602 if (cepintsts & USBD_CEPINTSTS_STALLIF_Msk)
Kojto 70:2c525a50f1b6 603 {
Kojto 70:2c525a50f1b6 604 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STALLIF_Msk);
Kojto 70:2c525a50f1b6 605 return;
Kojto 70:2c525a50f1b6 606 }
Kojto 70:2c525a50f1b6 607
Kojto 70:2c525a50f1b6 608 /* ERR special packet */
Kojto 70:2c525a50f1b6 609 if (cepintsts & USBD_CEPINTSTS_ERRIF_Msk)
Kojto 70:2c525a50f1b6 610 {
Kojto 70:2c525a50f1b6 611 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_ERRIF_Msk);
Kojto 70:2c525a50f1b6 612 return;
Kojto 70:2c525a50f1b6 613 }
Kojto 70:2c525a50f1b6 614
Kojto 70:2c525a50f1b6 615 /* Status stage transaction */
Kojto 70:2c525a50f1b6 616 if (cepintsts & USBD_CEPINTSTS_STSDONEIF_Msk)
Kojto 70:2c525a50f1b6 617 {
Kojto 70:2c525a50f1b6 618 if (s_usb_addr)
Kojto 70:2c525a50f1b6 619 {
Kojto 70:2c525a50f1b6 620 USBD_SET_ADDR(s_usb_addr);
Kojto 70:2c525a50f1b6 621 s_usb_addr = 0;
Kojto 70:2c525a50f1b6 622 }
Kojto 70:2c525a50f1b6 623 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
Kojto 70:2c525a50f1b6 624 USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk);
Kojto 70:2c525a50f1b6 625 return;
Kojto 70:2c525a50f1b6 626 }
Kojto 70:2c525a50f1b6 627
Kojto 70:2c525a50f1b6 628 /* Buffer Full */
Kojto 70:2c525a50f1b6 629 if (cepintsts & USBD_CEPINTSTS_BUFFULLIF_Msk)
Kojto 70:2c525a50f1b6 630 {
Kojto 70:2c525a50f1b6 631 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFFULLIF_Msk);
Kojto 70:2c525a50f1b6 632 return;
Kojto 70:2c525a50f1b6 633 }
Kojto 70:2c525a50f1b6 634
Kojto 70:2c525a50f1b6 635 /* Buffer Empty */
Kojto 70:2c525a50f1b6 636 if (cepintsts & USBD_CEPINTSTS_BUFEMPTYIF_Msk)
Kojto 70:2c525a50f1b6 637 {
Kojto 70:2c525a50f1b6 638 USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFEMPTYIF_Msk);
Kojto 70:2c525a50f1b6 639 return;
Kojto 70:2c525a50f1b6 640 }
Kojto 70:2c525a50f1b6 641 }
Kojto 70:2c525a50f1b6 642 /* EPA, EPB, EPC, ... EPL interrupts */
Kojto 70:2c525a50f1b6 643 uint32_t gintsts_epx = gintsts >> 2;
Kojto 70:2c525a50f1b6 644 uint32_t ep_hw_index = 0;
Kojto 70:2c525a50f1b6 645 while (gintsts_epx) {
Kojto 70:2c525a50f1b6 646 if (gintsts_epx & 0x01)
Kojto 70:2c525a50f1b6 647 {
Kojto 70:2c525a50f1b6 648 uint32_t epxintsts = USBD_GET_EP_INT_FLAG(ep_hw_index) & USBD_GET_EP_INT_EN(ep_hw_index);
Kojto 70:2c525a50f1b6 649
Kojto 70:2c525a50f1b6 650 USBD_CLR_EP_INT_FLAG(ep_hw_index, epxintsts);
Kojto 70:2c525a50f1b6 651
Kojto 70:2c525a50f1b6 652 /* Buffer Full */
Kojto 70:2c525a50f1b6 653 if (epxintsts & USBD_EPINTSTS_BUFFULLIF_Msk)
Kojto 70:2c525a50f1b6 654 {
Kojto 70:2c525a50f1b6 655 }
Kojto 70:2c525a50f1b6 656
Kojto 70:2c525a50f1b6 657 /* Buffer Empty */
Kojto 70:2c525a50f1b6 658 if (epxintsts & USBD_EPINTSTS_BUFEMPTYIF_Msk)
Kojto 70:2c525a50f1b6 659 {
Kojto 70:2c525a50f1b6 660 }
Kojto 70:2c525a50f1b6 661
Kojto 70:2c525a50f1b6 662 /* Short Packet Transferred */
Kojto 70:2c525a50f1b6 663 if (epxintsts & USBD_EPINTSTS_SHORTTXIF_Msk)
Kojto 70:2c525a50f1b6 664 {
Kojto 70:2c525a50f1b6 665 }
Kojto 70:2c525a50f1b6 666
Kojto 70:2c525a50f1b6 667 /* Data Packet Transmitted */
Kojto 70:2c525a50f1b6 668 if (epxintsts & USBD_EPINTSTS_TXPKIF_Msk)
Kojto 70:2c525a50f1b6 669 {
Kojto 70:2c525a50f1b6 670 s_ep_compl &= ~(1 << (NU_EPH2EPL(ep_hw_index)));
Kojto 70:2c525a50f1b6 671 if ((instance->*(epCallback[ep_hw_index]))())
Kojto 70:2c525a50f1b6 672 {
Kojto 70:2c525a50f1b6 673 }
Kojto 70:2c525a50f1b6 674 }
Kojto 70:2c525a50f1b6 675
Kojto 70:2c525a50f1b6 676 /* Data Packet Received */
Kojto 70:2c525a50f1b6 677 if (epxintsts & USBD_EPINTSTS_RXPKIF_Msk)
Kojto 70:2c525a50f1b6 678 {
Kojto 70:2c525a50f1b6 679 if ((instance->*(epCallback[ep_hw_index]))())
Kojto 70:2c525a50f1b6 680 {
Kojto 70:2c525a50f1b6 681
Kojto 70:2c525a50f1b6 682 }
Kojto 70:2c525a50f1b6 683 }
Kojto 70:2c525a50f1b6 684
Kojto 70:2c525a50f1b6 685 /* OUT token packet */
Kojto 70:2c525a50f1b6 686 if (epxintsts & USBD_EPINTSTS_OUTTKIF_Msk)
Kojto 70:2c525a50f1b6 687 {
Kojto 70:2c525a50f1b6 688 }
Kojto 70:2c525a50f1b6 689
Kojto 70:2c525a50f1b6 690 /* IN token packet */
Kojto 70:2c525a50f1b6 691 if (epxintsts & USBD_EPINTSTS_INTKIF_Msk)
Kojto 70:2c525a50f1b6 692 {
Kojto 70:2c525a50f1b6 693 }
Kojto 70:2c525a50f1b6 694
Kojto 70:2c525a50f1b6 695 /* PING packet */
Kojto 70:2c525a50f1b6 696 if (epxintsts & USBD_EPINTSTS_PINGIF_Msk)
Kojto 70:2c525a50f1b6 697 {
Kojto 70:2c525a50f1b6 698 }
Kojto 70:2c525a50f1b6 699
Kojto 70:2c525a50f1b6 700 /* NAK handshake packet sent to Host */
Kojto 70:2c525a50f1b6 701 if (epxintsts & USBD_EPINTSTS_NAKIF_Msk)
Kojto 70:2c525a50f1b6 702 {
Kojto 70:2c525a50f1b6 703 }
Kojto 70:2c525a50f1b6 704
Kojto 70:2c525a50f1b6 705 /* STALL handshake packet sent to Host */
Kojto 70:2c525a50f1b6 706 if (epxintsts & USBD_EPINTSTS_STALLIF_Msk)
Kojto 70:2c525a50f1b6 707 {
Kojto 70:2c525a50f1b6 708 }
Kojto 70:2c525a50f1b6 709
Kojto 70:2c525a50f1b6 710 /* NYET handshake packet sent to Host */
Kojto 70:2c525a50f1b6 711 if (epxintsts & USBD_EPINTSTS_NYETIF_Msk)
Kojto 70:2c525a50f1b6 712 {
Kojto 70:2c525a50f1b6 713 }
Kojto 70:2c525a50f1b6 714
Kojto 70:2c525a50f1b6 715 /* ERR packet sent to Host */
Kojto 70:2c525a50f1b6 716 if (epxintsts & USBD_EPINTSTS_ERRIF_Msk)
Kojto 70:2c525a50f1b6 717 {
Kojto 70:2c525a50f1b6 718 }
Kojto 70:2c525a50f1b6 719
Kojto 70:2c525a50f1b6 720 /* Bulk Out Short Packet Received */
Kojto 70:2c525a50f1b6 721 if (epxintsts & USBD_EPINTSTS_SHORTRXIF_Msk)
Kojto 70:2c525a50f1b6 722 {
Kojto 70:2c525a50f1b6 723 }
Kojto 70:2c525a50f1b6 724 }
Kojto 70:2c525a50f1b6 725 gintsts_epx = gintsts_epx >> 1;
Kojto 70:2c525a50f1b6 726 ep_hw_index++;
Kojto 70:2c525a50f1b6 727 }
Kojto 70:2c525a50f1b6 728 }
Kojto 70:2c525a50f1b6 729 #endif
Kojto 70:2c525a50f1b6 730