A copy of the mbed USBDevice with USBSerial library

Dependents:   STM32L0_LoRa Smartage STM32L0_LoRa Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Thu Jan 31 20:56:55 2019 +0100
Revision:
7:8a5cc0d9bfa2
Parent:
2:195554780c9b
fixed compiler warnings

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut Tschemernjak 2:195554780c9b 1 #include "mbed.h"
Helmut Tschemernjak 2:195554780c9b 2 #include "PinMap.h"
Helmut Tschemernjak 2:195554780c9b 3
Helmut Tschemernjak 2:195554780c9b 4 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 2:195554780c9b 5
Helmut64 0:a3ea811f80f2 6 /* Copyright (c) 2017 mbed.org, MIT License
Helmut64 0:a3ea811f80f2 7 *
Helmut64 0:a3ea811f80f2 8 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Helmut64 0:a3ea811f80f2 9 * and associated documentation files (the "Software"), to deal in the Software without
Helmut64 0:a3ea811f80f2 10 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
Helmut64 0:a3ea811f80f2 11 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
Helmut64 0:a3ea811f80f2 12 * Software is furnished to do so, subject to the following conditions:
Helmut64 0:a3ea811f80f2 13 *
Helmut64 0:a3ea811f80f2 14 * The above copyright notice and this permission notice shall be included in all copies or
Helmut64 0:a3ea811f80f2 15 * substantial portions of the Software.
Helmut64 0:a3ea811f80f2 16 *
Helmut64 0:a3ea811f80f2 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Helmut64 0:a3ea811f80f2 18 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Helmut64 0:a3ea811f80f2 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Helmut64 0:a3ea811f80f2 20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Helmut64 0:a3ea811f80f2 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Helmut64 0:a3ea811f80f2 22 */
Helmut64 0:a3ea811f80f2 23
Helmut64 0:a3ea811f80f2 24 /* TARGET NOT STM does not support this HAL */
Helmut64 0:a3ea811f80f2 25 #ifndef TARGET_STM
Helmut64 0:a3ea811f80f2 26 #define USBSTM_HAL_UNSUPPORTED
Helmut64 0:a3ea811f80f2 27 #endif
Helmut64 0:a3ea811f80f2 28
Helmut64 0:a3ea811f80f2 29 /* STM32F4 family without USB_STM_HAL use another HAL */
Helmut64 0:a3ea811f80f2 30 #if defined(TARGET_STM) && defined(TARGET_STM32F4) && !defined(USB_STM_HAL)
Helmut64 0:a3ea811f80f2 31 #define USBSTM_HAL_UNSUPPORTED
Helmut64 0:a3ea811f80f2 32 #endif
Helmut64 0:a3ea811f80f2 33
Helmut64 0:a3ea811f80f2 34 #ifndef USBSTM_HAL_UNSUPPORTED
Helmut64 0:a3ea811f80f2 35 #include "USBHAL.h"
Helmut64 0:a3ea811f80f2 36 #include "pinmap.h"
Helmut64 0:a3ea811f80f2 37
Helmut64 0:a3ea811f80f2 38 #include "USBHAL_STM32.h"
Helmut64 0:a3ea811f80f2 39
Helmut64 0:a3ea811f80f2 40 /* mbed endpoint definition to hal definition */
Helmut64 0:a3ea811f80f2 41 #define EP_ADDR(ep) (((ep) >> 1)|((ep) & 1) << 7)
Helmut64 0:a3ea811f80f2 42
Helmut64 0:a3ea811f80f2 43 /* from hal definition to mbed definition */
Helmut64 0:a3ea811f80f2 44 #define ADDR_EPIN(ep) (((ep) << 1) | 1)
Helmut64 0:a3ea811f80f2 45 #define ADDR_EPOUT(ep) (((ep) << 1))
Helmut64 0:a3ea811f80f2 46
Helmut64 0:a3ea811f80f2 47 /* this call at device reception completion on a Out Enpoint */
Helmut64 0:a3ea811f80f2 48 void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Helmut64 0:a3ea811f80f2 49 {
Helmut64 0:a3ea811f80f2 50 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 51 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 52 uint8_t endpoint = ADDR_EPOUT(epnum);
Helmut64 0:a3ea811f80f2 53 priv->epComplete[endpoint] = 1;
Helmut64 0:a3ea811f80f2 54 /* -2 endpoint 0 In out are not in call back list */
Helmut64 0:a3ea811f80f2 55 if (epnum) {
Helmut64 0:a3ea811f80f2 56 bool (USBHAL::*func)(void) = priv->epCallback[endpoint-2];
Helmut64 0:a3ea811f80f2 57 (obj->*func)();
Helmut64 0:a3ea811f80f2 58 } else {
Helmut64 0:a3ea811f80f2 59 void (USBHAL::*func)(void) = priv->ep0_out;
Helmut64 0:a3ea811f80f2 60 (obj->*func)();
Helmut64 0:a3ea811f80f2 61 }
Helmut64 0:a3ea811f80f2 62 }
Helmut64 0:a3ea811f80f2 63
Helmut64 0:a3ea811f80f2 64 /* this is call at device transmission completion on In endpoint */
Helmut64 0:a3ea811f80f2 65 void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Helmut64 0:a3ea811f80f2 66 {
Helmut64 0:a3ea811f80f2 67 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 68 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 69 uint8_t endpoint = ADDR_EPIN(epnum);
Helmut64 0:a3ea811f80f2 70 priv->epComplete[endpoint] = 1;
Helmut64 0:a3ea811f80f2 71 /* -2 endpoint 0 In out are not in call back list */
Helmut64 0:a3ea811f80f2 72 if (epnum) {
Helmut64 0:a3ea811f80f2 73 bool (USBHAL::*func)(void) = priv->epCallback[endpoint-2];
Helmut64 0:a3ea811f80f2 74 (obj->*func)();
Helmut64 0:a3ea811f80f2 75 } else {
Helmut64 0:a3ea811f80f2 76 void (USBHAL::*func)(void) = priv->ep0_in;
Helmut64 0:a3ea811f80f2 77 (obj->*func)();
Helmut64 0:a3ea811f80f2 78 }
Helmut64 0:a3ea811f80f2 79 }
Helmut64 0:a3ea811f80f2 80 /* This is call at device set up reception */
Helmut64 0:a3ea811f80f2 81 void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
Helmut64 0:a3ea811f80f2 82 {
Helmut64 0:a3ea811f80f2 83 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 84 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 85 void (USBHAL::*func)(void)=priv->ep0_setup;
Helmut64 0:a3ea811f80f2 86 void (USBHAL::*func1)(void)=priv->ep0_read;
Helmut64 0:a3ea811f80f2 87 (obj->*func)();
Helmut64 0:a3ea811f80f2 88 (obj->*func1)();
Helmut64 0:a3ea811f80f2 89 }
Helmut64 0:a3ea811f80f2 90
Helmut64 0:a3ea811f80f2 91 void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
Helmut64 0:a3ea811f80f2 92 {
Helmut64 0:a3ea811f80f2 93 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 94 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 95 void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
Helmut64 0:a3ea811f80f2 96 (obj->*func)(1);
Helmut64 0:a3ea811f80f2 97 }
Helmut64 0:a3ea811f80f2 98
Helmut64 0:a3ea811f80f2 99 void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
Helmut64 0:a3ea811f80f2 100 {
Helmut64 0:a3ea811f80f2 101 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 102 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 103 void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
Helmut64 0:a3ea811f80f2 104 (obj->*func)(0);
Helmut64 0:a3ea811f80f2 105 }
Helmut64 0:a3ea811f80f2 106
Helmut64 0:a3ea811f80f2 107 void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
Helmut64 0:a3ea811f80f2 108 {
Helmut64 0:a3ea811f80f2 109 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 110 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 111 void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
Helmut64 0:a3ea811f80f2 112 (obj->*func)(1);
Helmut64 0:a3ea811f80f2 113 }
Helmut64 0:a3ea811f80f2 114
Helmut64 0:a3ea811f80f2 115 void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
Helmut64 0:a3ea811f80f2 116 {
Helmut64 0:a3ea811f80f2 117 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 118 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 119 void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
Helmut64 0:a3ea811f80f2 120 (obj->*func)(0);
Helmut64 0:a3ea811f80f2 121 }
Helmut64 0:a3ea811f80f2 122
Helmut64 0:a3ea811f80f2 123 void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
Helmut64 0:a3ea811f80f2 124 {
Helmut64 0:a3ea811f80f2 125 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
Helmut64 0:a3ea811f80f2 126 USBHAL *obj= priv->inst;
Helmut64 0:a3ea811f80f2 127 unsigned int i;
Helmut64 0:a3ea811f80f2 128 for(i=0;i<hpcd->Init.dev_endpoints;i++) {
Helmut64 0:a3ea811f80f2 129 priv->epComplete[2*i]=0;
Helmut64 0:a3ea811f80f2 130 HAL_PCD_EP_Close(hpcd,EP_ADDR(2*i));
Helmut64 0:a3ea811f80f2 131 HAL_PCD_EP_Flush(hpcd,EP_ADDR(2*i));
Helmut64 0:a3ea811f80f2 132 priv->epComplete[2*i+1]=0;
Helmut64 0:a3ea811f80f2 133 HAL_PCD_EP_Close(hpcd,EP_ADDR(2*i+1));
Helmut64 0:a3ea811f80f2 134 HAL_PCD_EP_Flush(hpcd,EP_ADDR(2*i+1));
Helmut64 0:a3ea811f80f2 135
Helmut64 0:a3ea811f80f2 136 }
Helmut64 0:a3ea811f80f2 137 void (USBHAL::*func)(void)=priv->bus_reset;
Helmut64 0:a3ea811f80f2 138 bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) = priv->ep_realise;
Helmut64 0:a3ea811f80f2 139 (obj->*func)();
Helmut64 0:a3ea811f80f2 140 (obj->*ep_realise)(EP0IN, MAX_PACKET_SIZE_EP0,0);
Helmut64 0:a3ea811f80f2 141 (obj->*ep_realise)(EP0OUT, MAX_PACKET_SIZE_EP0,0);
Helmut64 0:a3ea811f80f2 142 }
Helmut64 0:a3ea811f80f2 143
Helmut64 0:a3ea811f80f2 144
Helmut64 0:a3ea811f80f2 145 /* hal pcd handler , used for STM32 HAL PCD Layer */
Helmut64 0:a3ea811f80f2 146
Helmut64 0:a3ea811f80f2 147 uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
Helmut64 0:a3ea811f80f2 148 return 0;
Helmut64 0:a3ea811f80f2 149 }
Helmut64 0:a3ea811f80f2 150
Helmut64 0:a3ea811f80f2 151 USBHAL::~USBHAL(void) {
Helmut64 0:a3ea811f80f2 152 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
Helmut64 0:a3ea811f80f2 153 HAL_PCD_DeInit(&hpcd);
Helmut64 0:a3ea811f80f2 154 delete HALPriv;
Helmut64 0:a3ea811f80f2 155 }
Helmut64 0:a3ea811f80f2 156
Helmut64 0:a3ea811f80f2 157 void USBHAL::connect(void) {
Helmut64 0:a3ea811f80f2 158 NVIC_EnableIRQ(USBHAL_IRQn);
Helmut64 0:a3ea811f80f2 159 }
Helmut64 0:a3ea811f80f2 160
Helmut64 0:a3ea811f80f2 161 void USBHAL::disconnect(void) {
Helmut64 0:a3ea811f80f2 162 NVIC_DisableIRQ(USBHAL_IRQn);
Helmut64 0:a3ea811f80f2 163 }
Helmut64 0:a3ea811f80f2 164
Helmut64 0:a3ea811f80f2 165 void USBHAL::configureDevice(void) {
Helmut64 0:a3ea811f80f2 166 // Not needed
Helmut64 0:a3ea811f80f2 167 }
Helmut64 0:a3ea811f80f2 168
Helmut64 0:a3ea811f80f2 169 void USBHAL::unconfigureDevice(void) {
Helmut64 0:a3ea811f80f2 170 // Not needed
Helmut64 0:a3ea811f80f2 171 }
Helmut64 0:a3ea811f80f2 172
Helmut64 0:a3ea811f80f2 173 void USBHAL::setAddress(uint8_t address) {
Helmut64 0:a3ea811f80f2 174 HAL_PCD_SetAddress(&hpcd, address);
Helmut64 0:a3ea811f80f2 175 EP0write(0, 0);
Helmut64 0:a3ea811f80f2 176 }
Helmut64 0:a3ea811f80f2 177
Helmut64 0:a3ea811f80f2 178 bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
Helmut64 0:a3ea811f80f2 179 uint32_t epIndex = EP_ADDR(endpoint);
Helmut Tschemernjak 7:8a5cc0d9bfa2 180 uint32_t type = 0;
Helmut64 0:a3ea811f80f2 181 uint32_t len;
Helmut64 0:a3ea811f80f2 182 HAL_StatusTypeDef ret;
Helmut64 0:a3ea811f80f2 183 switch (endpoint) {
Helmut64 0:a3ea811f80f2 184 case EP0IN:
Helmut64 0:a3ea811f80f2 185 case EP0OUT:
Helmut64 0:a3ea811f80f2 186 type = 0;
Helmut64 0:a3ea811f80f2 187 break;
Helmut64 0:a3ea811f80f2 188 case EPISO_IN:
Helmut64 0:a3ea811f80f2 189 case EPISO_OUT:
Helmut64 0:a3ea811f80f2 190 type = 1;
Helmut64 0:a3ea811f80f2 191 break;
Helmut64 0:a3ea811f80f2 192 case EPBULK_IN:
Helmut64 0:a3ea811f80f2 193 case EPBULK_OUT:
Helmut64 0:a3ea811f80f2 194 type = 2;
Helmut64 0:a3ea811f80f2 195 break;
Helmut64 0:a3ea811f80f2 196 case EPINT_IN:
Helmut64 0:a3ea811f80f2 197 case EPINT_OUT:
Helmut64 0:a3ea811f80f2 198 type = 3;
Helmut64 0:a3ea811f80f2 199 break;
Helmut64 0:a3ea811f80f2 200 }
Helmut64 0:a3ea811f80f2 201 if (maxPacket > MAXTRANSFER_SIZE) return false;
Helmut64 0:a3ea811f80f2 202 if (epIndex & 0x80) {
Helmut64 0:a3ea811f80f2 203 len = HAL_PCDEx_GetTxFiFo(&hpcd,epIndex & 0x7f);
Helmut64 0:a3ea811f80f2 204 MBED_ASSERT(len >= maxPacket);
Helmut64 0:a3ea811f80f2 205 }
Helmut64 0:a3ea811f80f2 206 ret = HAL_PCD_EP_Open(&hpcd, epIndex, maxPacket, type);
Helmut64 0:a3ea811f80f2 207 MBED_ASSERT(ret!=HAL_BUSY);
Helmut64 0:a3ea811f80f2 208 return (ret == HAL_OK) ? true:false;
Helmut64 0:a3ea811f80f2 209 }
Helmut64 0:a3ea811f80f2 210
Helmut64 0:a3ea811f80f2 211 // read setup packet
Helmut64 0:a3ea811f80f2 212 void USBHAL::EP0setup(uint8_t *buffer) {
Helmut64 0:a3ea811f80f2 213 memcpy(buffer, hpcd.Setup, MAX_PACKET_SIZE_SETUP);
Helmut64 0:a3ea811f80f2 214 memset(hpcd.Setup,0,MAX_PACKET_SIZE_SETUP);
Helmut64 0:a3ea811f80f2 215 }
Helmut64 0:a3ea811f80f2 216
Helmut64 0:a3ea811f80f2 217 void USBHAL::EP0readStage(void) {
Helmut64 0:a3ea811f80f2 218 }
Helmut64 0:a3ea811f80f2 219
Helmut64 0:a3ea811f80f2 220 void USBHAL::EP0read(void) {
Helmut64 0:a3ea811f80f2 221 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
Helmut64 0:a3ea811f80f2 222 uint32_t epIndex = EP_ADDR(EP0OUT);
Helmut64 0:a3ea811f80f2 223 uint8_t *pBuf = (uint8_t *)HALPriv->pBufRx0;
Helmut64 0:a3ea811f80f2 224 HAL_StatusTypeDef ret;
Helmut64 0:a3ea811f80f2 225 HALPriv->epComplete[EP0OUT] = 2;
Helmut64 0:a3ea811f80f2 226 ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, MAX_PACKET_SIZE_EP0 );
Helmut64 0:a3ea811f80f2 227 MBED_ASSERT(ret!=HAL_BUSY);
Helmut64 0:a3ea811f80f2 228
Helmut64 0:a3ea811f80f2 229 }
Helmut64 0:a3ea811f80f2 230
Helmut64 0:a3ea811f80f2 231 uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
Helmut64 0:a3ea811f80f2 232 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
Helmut64 0:a3ea811f80f2 233 uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, 0);
Helmut64 0:a3ea811f80f2 234 HALPriv->epComplete[EP0OUT] = 0;
Helmut64 0:a3ea811f80f2 235 if (length) {
Helmut64 0:a3ea811f80f2 236 uint8_t *buff = (uint8_t *)HALPriv->pBufRx0;
Helmut64 0:a3ea811f80f2 237 memcpy(buffer, buff, length);
Helmut64 0:a3ea811f80f2 238 }
Helmut64 0:a3ea811f80f2 239 return length;
Helmut64 0:a3ea811f80f2 240 }
Helmut64 0:a3ea811f80f2 241
Helmut64 0:a3ea811f80f2 242 void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
Helmut64 0:a3ea811f80f2 243 /* check that endpoint maximum size is not exceeding TX fifo */
Helmut64 0:a3ea811f80f2 244 MBED_ASSERT(hpcd.IN_ep[0].maxpacket >= size);
Helmut64 0:a3ea811f80f2 245 endpointWrite(EP0IN, buffer, size);
Helmut64 0:a3ea811f80f2 246 }
Helmut64 0:a3ea811f80f2 247
Helmut64 0:a3ea811f80f2 248 void USBHAL::EP0getWriteResult(void) {
Helmut64 0:a3ea811f80f2 249
Helmut64 0:a3ea811f80f2 250 }
Helmut64 0:a3ea811f80f2 251
Helmut64 0:a3ea811f80f2 252 void USBHAL::EP0stall(void) {
Helmut64 0:a3ea811f80f2 253 stallEndpoint(EP0IN);
Helmut64 0:a3ea811f80f2 254 }
Helmut64 0:a3ea811f80f2 255
Helmut64 0:a3ea811f80f2 256 EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
Helmut64 0:a3ea811f80f2 257 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
Helmut64 0:a3ea811f80f2 258 uint32_t epIndex = EP_ADDR(endpoint);
Helmut64 0:a3ea811f80f2 259 uint8_t* pBuf = (uint8_t *)HALPriv->pBufRx;
Helmut64 0:a3ea811f80f2 260 HAL_StatusTypeDef ret;
Helmut64 0:a3ea811f80f2 261 // clean reception end flag before requesting reception
Helmut64 0:a3ea811f80f2 262 HALPriv->epComplete[endpoint] = 2;
Helmut64 0:a3ea811f80f2 263 ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, maximumSize);
Helmut64 0:a3ea811f80f2 264 MBED_ASSERT(ret!=HAL_BUSY);
Helmut64 0:a3ea811f80f2 265 return EP_PENDING;
Helmut64 0:a3ea811f80f2 266 }
Helmut64 0:a3ea811f80f2 267
Helmut64 0:a3ea811f80f2 268 EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
Helmut64 0:a3ea811f80f2 269 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
Helmut64 0:a3ea811f80f2 270 if (HALPriv->epComplete[endpoint]==0) {
Helmut64 0:a3ea811f80f2 271 /* no reception possible !!! */
Helmut64 0:a3ea811f80f2 272 bytesRead = 0;
Helmut64 0:a3ea811f80f2 273 return EP_COMPLETED;
Helmut64 0:a3ea811f80f2 274 }else if ((HALPriv->epComplete[endpoint]!=1))
Helmut64 0:a3ea811f80f2 275 return EP_PENDING;
Helmut64 0:a3ea811f80f2 276 uint32_t epIndex = EP_ADDR(endpoint);
Helmut64 0:a3ea811f80f2 277 uint8_t *buff = (uint8_t *)HALPriv->pBufRx;
Helmut64 0:a3ea811f80f2 278 uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, epIndex);
Helmut64 0:a3ea811f80f2 279 memcpy(buffer, buff, length);
Helmut64 0:a3ea811f80f2 280 *bytesRead = length;
Helmut64 0:a3ea811f80f2 281 HALPriv->epComplete[endpoint]= 0;
Helmut64 0:a3ea811f80f2 282 return EP_COMPLETED;
Helmut64 0:a3ea811f80f2 283 }
Helmut64 0:a3ea811f80f2 284
Helmut64 0:a3ea811f80f2 285 EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
Helmut64 0:a3ea811f80f2 286 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
Helmut64 0:a3ea811f80f2 287 uint32_t epIndex = EP_ADDR(endpoint);
Helmut64 0:a3ea811f80f2 288 HAL_StatusTypeDef ret;
Helmut64 0:a3ea811f80f2 289 // clean transmission end flag before requesting transmission
Helmut64 0:a3ea811f80f2 290 HALPriv->epComplete[endpoint] = 2;
Helmut64 0:a3ea811f80f2 291 ret = HAL_PCD_EP_Transmit(&hpcd, epIndex, data, size);
Helmut64 0:a3ea811f80f2 292 MBED_ASSERT(ret!=HAL_BUSY);
Helmut64 0:a3ea811f80f2 293 // update the status
Helmut64 0:a3ea811f80f2 294 if (ret != HAL_OK) return EP_INVALID;
Helmut64 0:a3ea811f80f2 295 // fix me return is too simple
Helmut64 0:a3ea811f80f2 296 return EP_PENDING;
Helmut64 0:a3ea811f80f2 297 }
Helmut64 0:a3ea811f80f2 298
Helmut64 0:a3ea811f80f2 299 EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
Helmut64 0:a3ea811f80f2 300 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
Helmut64 0:a3ea811f80f2 301 if (HALPriv->epComplete[endpoint] == 1)
Helmut64 0:a3ea811f80f2 302 return EP_COMPLETED;
Helmut64 0:a3ea811f80f2 303 return EP_PENDING;
Helmut64 0:a3ea811f80f2 304 }
Helmut64 0:a3ea811f80f2 305
Helmut64 0:a3ea811f80f2 306 void USBHAL::stallEndpoint(uint8_t endpoint) {
Helmut64 0:a3ea811f80f2 307 USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
Helmut64 0:a3ea811f80f2 308 HAL_StatusTypeDef ret;
Helmut64 0:a3ea811f80f2 309 HALPriv->epComplete[endpoint] = 0;
Helmut64 0:a3ea811f80f2 310 ret = HAL_PCD_EP_SetStall(&hpcd, EP_ADDR(endpoint));
Helmut64 0:a3ea811f80f2 311 MBED_ASSERT(ret!=HAL_BUSY);
Helmut64 0:a3ea811f80f2 312 }
Helmut64 0:a3ea811f80f2 313
Helmut64 0:a3ea811f80f2 314 void USBHAL::unstallEndpoint(uint8_t endpoint) {
Helmut64 0:a3ea811f80f2 315 HAL_StatusTypeDef ret;
Helmut64 0:a3ea811f80f2 316 ret = HAL_PCD_EP_ClrStall(&hpcd, EP_ADDR(endpoint));
Helmut64 0:a3ea811f80f2 317 MBED_ASSERT(ret!=HAL_BUSY);
Helmut64 0:a3ea811f80f2 318
Helmut64 0:a3ea811f80f2 319 }
Helmut64 0:a3ea811f80f2 320
Helmut64 0:a3ea811f80f2 321 bool USBHAL::getEndpointStallState(uint8_t endpoint) {
Helmut64 0:a3ea811f80f2 322 return false;
Helmut64 0:a3ea811f80f2 323 }
Helmut64 0:a3ea811f80f2 324
Helmut64 0:a3ea811f80f2 325 void USBHAL::remoteWakeup(void) {
Helmut64 0:a3ea811f80f2 326 }
Helmut64 0:a3ea811f80f2 327
Helmut64 0:a3ea811f80f2 328 void USBHAL::_usbisr(void) {
Helmut64 0:a3ea811f80f2 329 instance->usbisr();
Helmut64 0:a3ea811f80f2 330 }
Helmut64 0:a3ea811f80f2 331
Helmut64 0:a3ea811f80f2 332 void USBHAL::usbisr(void) {
Helmut64 0:a3ea811f80f2 333 HAL_PCD_IRQHandler(&instance->hpcd);
Helmut64 0:a3ea811f80f2 334 }
Helmut64 0:a3ea811f80f2 335
Helmut64 0:a3ea811f80f2 336 #endif
Helmut Tschemernjak 2:195554780c9b 337
Helmut Tschemernjak 2:195554780c9b 338 #endif // FEATURE_USBSERIAL