A copy of the mbed USBDevice with USBSerial library
Dependents: STM32L0_LoRa Smartage STM32L0_LoRa Turtle_RadioShuttle
targets/TARGET_STM/USBHAL_STM32.cpp@7:8a5cc0d9bfa2, 2019-01-31 (annotated)
- 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?
User | Revision | Line number | New 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 |