2017-08-24 14:04:53 +00:00
|
|
|
/* Copyright (c) 2017 mbed.org, MIT License
|
2016-10-05 14:44:10 +00:00
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
|
|
* and associated documentation files (the "Software"), to deal in the Software without
|
|
|
|
* restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in all copies or
|
|
|
|
* substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
|
|
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
2017-08-24 14:04:53 +00:00
|
|
|
|
2017-08-25 13:37:47 +00:00
|
|
|
/* TARGET NOT STM does not support this HAL */
|
2017-02-13 08:50:13 +00:00
|
|
|
#ifndef TARGET_STM
|
|
|
|
#define USBSTM_HAL_UNSUPPORTED
|
|
|
|
#endif
|
2017-08-24 14:04:53 +00:00
|
|
|
|
2017-08-25 13:37:47 +00:00
|
|
|
/* STM32F4 family without USB_STM_HAL use another HAL */
|
|
|
|
#if defined(TARGET_STM) && defined(TARGET_STM32F4) && !defined(USB_STM_HAL)
|
2017-02-13 08:50:13 +00:00
|
|
|
#define USBSTM_HAL_UNSUPPORTED
|
|
|
|
#endif
|
2016-10-05 14:44:10 +00:00
|
|
|
|
2017-02-13 08:50:13 +00:00
|
|
|
#ifndef USBSTM_HAL_UNSUPPORTED
|
2016-10-05 14:44:10 +00:00
|
|
|
#include "USBHAL.h"
|
|
|
|
#include "pinmap.h"
|
2017-08-24 14:04:53 +00:00
|
|
|
|
2017-08-25 13:37:47 +00:00
|
|
|
#include "USBHAL_STM32.h"
|
|
|
|
|
2017-08-24 14:04:53 +00:00
|
|
|
/* mbed endpoint definition to hal definition */
|
2016-10-05 14:44:10 +00:00
|
|
|
#define EP_ADDR(ep) (((ep) >> 1)|((ep) & 1) << 7)
|
2017-08-24 14:04:53 +00:00
|
|
|
|
2016-10-05 14:44:10 +00:00
|
|
|
/* from hal definition to mbed definition */
|
|
|
|
#define ADDR_EPIN(ep) (((ep) << 1) | 1)
|
|
|
|
#define ADDR_EPOUT(ep) (((ep) << 1))
|
|
|
|
|
|
|
|
/* this call at device reception completion on a Out Enpoint */
|
|
|
|
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
2016-10-05 14:44:10 +00:00
|
|
|
uint8_t endpoint = ADDR_EPOUT(epnum);
|
|
|
|
priv->epComplete[endpoint] = 1;
|
|
|
|
/* -2 endpoint 0 In out are not in call back list */
|
|
|
|
if (epnum) {
|
2018-06-27 13:01:23 +00:00
|
|
|
bool (USBHAL::*func)(void) = priv->epCallback[endpoint - 2];
|
2016-10-05 14:44:10 +00:00
|
|
|
(obj->*func)();
|
|
|
|
} else {
|
|
|
|
void (USBHAL::*func)(void) = priv->ep0_out;
|
|
|
|
(obj->*func)();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* this is call at device transmission completion on In endpoint */
|
|
|
|
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
2016-10-05 14:44:10 +00:00
|
|
|
uint8_t endpoint = ADDR_EPIN(epnum);
|
|
|
|
priv->epComplete[endpoint] = 1;
|
|
|
|
/* -2 endpoint 0 In out are not in call back list */
|
|
|
|
if (epnum) {
|
2018-06-27 13:01:23 +00:00
|
|
|
bool (USBHAL::*func)(void) = priv->epCallback[endpoint - 2];
|
2016-10-05 14:44:10 +00:00
|
|
|
(obj->*func)();
|
|
|
|
} else {
|
|
|
|
void (USBHAL::*func)(void) = priv->ep0_in;
|
|
|
|
(obj->*func)();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* This is call at device set up reception */
|
|
|
|
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
|
|
|
void (USBHAL::*func)(void) = priv->ep0_setup;
|
|
|
|
void (USBHAL::*func1)(void) = priv->ep0_read;
|
2016-10-05 14:44:10 +00:00
|
|
|
(obj->*func)();
|
|
|
|
(obj->*func1)();
|
|
|
|
}
|
|
|
|
|
|
|
|
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
2016-10-05 14:44:10 +00:00
|
|
|
void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
|
|
|
|
(obj->*func)(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
2016-10-05 14:44:10 +00:00
|
|
|
void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
|
|
|
|
(obj->*func)(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
2016-10-05 14:44:10 +00:00
|
|
|
void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
|
|
|
|
(obj->*func)(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
2016-10-05 14:44:10 +00:00
|
|
|
void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
|
|
|
|
(obj->*func)(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
|
|
|
|
{
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL_Private_t *priv = ((USBHAL_Private_t *)(hpcd->pData));
|
|
|
|
USBHAL *obj = priv->inst;
|
2016-10-05 14:44:10 +00:00
|
|
|
unsigned int i;
|
2018-06-27 13:01:23 +00:00
|
|
|
for (i = 0; i < hpcd->Init.dev_endpoints; i++) {
|
|
|
|
priv->epComplete[2 * i] = 0;
|
|
|
|
HAL_PCD_EP_Close(hpcd, EP_ADDR(2 * i));
|
|
|
|
HAL_PCD_EP_Flush(hpcd, EP_ADDR(2 * i));
|
|
|
|
priv->epComplete[2 * i + 1] = 0;
|
|
|
|
HAL_PCD_EP_Close(hpcd, EP_ADDR(2 * i + 1));
|
|
|
|
HAL_PCD_EP_Flush(hpcd, EP_ADDR(2 * i + 1));
|
2016-10-05 14:44:10 +00:00
|
|
|
|
|
|
|
}
|
2018-06-27 13:01:23 +00:00
|
|
|
void (USBHAL::*func)(void) = priv->bus_reset;
|
2016-10-05 14:44:10 +00:00
|
|
|
bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) = priv->ep_realise;
|
|
|
|
(obj->*func)();
|
2018-06-27 13:01:23 +00:00
|
|
|
(obj->*ep_realise)(EP0IN, MAX_PACKET_SIZE_EP0, 0);
|
|
|
|
(obj->*ep_realise)(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* hal pcd handler , used for STM32 HAL PCD Layer */
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
USBHAL::~USBHAL(void)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
|
|
|
|
HAL_PCD_DeInit(&hpcd);
|
|
|
|
delete HALPriv;
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::connect(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
NVIC_EnableIRQ(USBHAL_IRQn);
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::disconnect(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
NVIC_DisableIRQ(USBHAL_IRQn);
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::configureDevice(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
// Not needed
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::unconfigureDevice(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
// Not needed
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::setAddress(uint8_t address)
|
|
|
|
{
|
|
|
|
HAL_PCD_SetAddress(&hpcd, address);
|
2016-10-05 14:44:10 +00:00
|
|
|
EP0write(0, 0);
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
uint32_t epIndex = EP_ADDR(endpoint);
|
|
|
|
uint32_t type;
|
|
|
|
uint32_t len;
|
|
|
|
HAL_StatusTypeDef ret;
|
|
|
|
switch (endpoint) {
|
2018-06-27 13:01:23 +00:00
|
|
|
case EP0IN:
|
|
|
|
case EP0OUT:
|
|
|
|
type = 0;
|
|
|
|
break;
|
|
|
|
case EPISO_IN:
|
|
|
|
case EPISO_OUT:
|
|
|
|
type = 1;
|
|
|
|
break;
|
|
|
|
case EPBULK_IN:
|
|
|
|
case EPBULK_OUT:
|
|
|
|
type = 2;
|
|
|
|
break;
|
|
|
|
case EPINT_IN:
|
|
|
|
case EPINT_OUT:
|
|
|
|
type = 3;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (maxPacket > MAXTRANSFER_SIZE) {
|
|
|
|
return false;
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
if (epIndex & 0x80) {
|
2018-06-27 13:01:23 +00:00
|
|
|
len = HAL_PCDEx_GetTxFiFo(&hpcd, epIndex & 0x7f);
|
2016-10-05 14:44:10 +00:00
|
|
|
MBED_ASSERT(len >= maxPacket);
|
|
|
|
}
|
|
|
|
ret = HAL_PCD_EP_Open(&hpcd, epIndex, maxPacket, type);
|
2018-06-27 13:01:23 +00:00
|
|
|
MBED_ASSERT(ret != HAL_BUSY);
|
|
|
|
return (ret == HAL_OK) ? true : false;
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// read setup packet
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::EP0setup(uint8_t *buffer)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
memcpy(buffer, hpcd.Setup, MAX_PACKET_SIZE_SETUP);
|
2018-06-27 13:01:23 +00:00
|
|
|
memset(hpcd.Setup, 0, MAX_PACKET_SIZE_SETUP);
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::EP0readStage(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::EP0read(void)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
|
|
|
|
uint32_t epIndex = EP_ADDR(EP0OUT);
|
|
|
|
uint8_t *pBuf = (uint8_t *)HALPriv->pBufRx0;
|
|
|
|
HAL_StatusTypeDef ret;
|
|
|
|
HALPriv->epComplete[EP0OUT] = 2;
|
|
|
|
ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, MAX_PACKET_SIZE_EP0);
|
|
|
|
MBED_ASSERT(ret != HAL_BUSY);
|
2016-10-05 14:44:10 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
|
2016-10-05 14:44:10 +00:00
|
|
|
uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, 0);
|
2018-06-27 13:01:23 +00:00
|
|
|
HALPriv->epComplete[EP0OUT] = 0;
|
2016-10-05 14:44:10 +00:00
|
|
|
if (length) {
|
|
|
|
uint8_t *buff = (uint8_t *)HALPriv->pBufRx0;
|
|
|
|
memcpy(buffer, buff, length);
|
|
|
|
}
|
|
|
|
return length;
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
/* check that endpoint maximum size is not exceeding TX fifo */
|
|
|
|
MBED_ASSERT(hpcd.IN_ep[0].maxpacket >= size);
|
|
|
|
endpointWrite(EP0IN, buffer, size);
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::EP0getWriteResult(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::EP0stall(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
stallEndpoint(EP0IN);
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
|
2016-10-05 14:44:10 +00:00
|
|
|
uint32_t epIndex = EP_ADDR(endpoint);
|
2018-06-27 13:01:23 +00:00
|
|
|
uint8_t *pBuf = (uint8_t *)HALPriv->pBufRx;
|
|
|
|
HAL_StatusTypeDef ret;
|
2016-10-05 14:44:10 +00:00
|
|
|
// clean reception end flag before requesting reception
|
|
|
|
HALPriv->epComplete[endpoint] = 2;
|
|
|
|
ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, maximumSize);
|
2018-06-27 13:01:23 +00:00
|
|
|
MBED_ASSERT(ret != HAL_BUSY);
|
2016-10-05 14:44:10 +00:00
|
|
|
return EP_PENDING;
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *buffer, uint32_t *bytesRead)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
|
|
|
|
if (HALPriv->epComplete[endpoint] == 0) {
|
|
|
|
/* no reception possible !!! */
|
|
|
|
bytesRead = 0;
|
2016-10-05 14:44:10 +00:00
|
|
|
return EP_COMPLETED;
|
2018-06-27 13:01:23 +00:00
|
|
|
} else if ((HALPriv->epComplete[endpoint] != 1)) {
|
|
|
|
return EP_PENDING;
|
|
|
|
}
|
2016-10-05 14:44:10 +00:00
|
|
|
uint32_t epIndex = EP_ADDR(endpoint);
|
|
|
|
uint8_t *buff = (uint8_t *)HALPriv->pBufRx;
|
|
|
|
uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, epIndex);
|
|
|
|
memcpy(buffer, buff, length);
|
|
|
|
*bytesRead = length;
|
2018-06-27 13:01:23 +00:00
|
|
|
HALPriv->epComplete[endpoint] = 0;
|
2016-10-05 14:44:10 +00:00
|
|
|
return EP_COMPLETED;
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
|
2016-10-05 14:44:10 +00:00
|
|
|
uint32_t epIndex = EP_ADDR(endpoint);
|
|
|
|
HAL_StatusTypeDef ret;
|
|
|
|
// clean transmission end flag before requesting transmission
|
|
|
|
HALPriv->epComplete[endpoint] = 2;
|
|
|
|
ret = HAL_PCD_EP_Transmit(&hpcd, epIndex, data, size);
|
2018-06-27 13:01:23 +00:00
|
|
|
MBED_ASSERT(ret != HAL_BUSY);
|
2016-10-05 14:44:10 +00:00
|
|
|
// update the status
|
2018-06-27 13:01:23 +00:00
|
|
|
if (ret != HAL_OK) {
|
|
|
|
return EP_INVALID;
|
|
|
|
}
|
2016-10-05 14:44:10 +00:00
|
|
|
// fix me return is too simple
|
|
|
|
return EP_PENDING;
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
|
|
|
|
if (HALPriv->epComplete[endpoint] == 1) {
|
2016-10-05 14:44:10 +00:00
|
|
|
return EP_COMPLETED;
|
2018-06-27 13:01:23 +00:00
|
|
|
}
|
2016-10-05 14:44:10 +00:00
|
|
|
return EP_PENDING;
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::stallEndpoint(uint8_t endpoint)
|
|
|
|
{
|
|
|
|
USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
|
|
|
|
HAL_StatusTypeDef ret;
|
|
|
|
HALPriv->epComplete[endpoint] = 0;
|
|
|
|
ret = HAL_PCD_EP_SetStall(&hpcd, EP_ADDR(endpoint));
|
|
|
|
MBED_ASSERT(ret != HAL_BUSY);
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::unstallEndpoint(uint8_t endpoint)
|
|
|
|
{
|
|
|
|
HAL_StatusTypeDef ret;
|
2016-10-05 14:44:10 +00:00
|
|
|
ret = HAL_PCD_EP_ClrStall(&hpcd, EP_ADDR(endpoint));
|
2018-06-27 13:01:23 +00:00
|
|
|
MBED_ASSERT(ret != HAL_BUSY);
|
2016-10-05 14:44:10 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
bool USBHAL::getEndpointStallState(uint8_t endpoint)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::remoteWakeup(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::_usbisr(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
instance->usbisr();
|
|
|
|
}
|
|
|
|
|
2018-06-27 13:01:23 +00:00
|
|
|
void USBHAL::usbisr(void)
|
|
|
|
{
|
2016-10-05 14:44:10 +00:00
|
|
|
HAL_PCD_IRQHandler(&instance->hpcd);
|
|
|
|
}
|
|
|
|
|
2017-08-25 13:37:47 +00:00
|
|
|
#endif
|