IOTON boards API using mbed SDK - http://ioton.cc/plataforma-ton
Dependents: ton-bot_teste ton-bot_seguidor_linha ton-bot_seguidor_parede
Fork of IOTON-API by
usbd_cdc_if_template.c
- Committer:
- krebyy
- Date:
- 2017-06-29
- Revision:
- 3:9c7195d31602
- Parent:
- 1:3a73d77c2cef
File content as of revision 3:9c7195d31602:
/** ****************************************************************************** * @file usbd_cdc_if_template.c * @author MCD Application Team * @version V2.3.0 * @date 04-November-2014 * @brief Generic media access Layer. ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> * * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** * @remark * Fun��es TEMPLATE_Init e TEMPLATE_Receive modificadas; Fun��es VCP_read e * VCP_write criadas por Kleber Lima da Silva (kleber.ufu@hotmail.com) * em 26-Abril-2015 * */ /* Includes ------------------------------------------------------------------*/ #include "usbd_cdc_if_template.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ */ /** @defgroup USBD_CDC * @brief usbd core module * @{ */ /** @defgroup USBD_CDC_Private_TypesDefinitions * @{ */ static struct { uint8_t Buffer[CDC_DATA_FS_IN_PACKET_SIZE]; int Position, Size; char ReadDone; } s_RxBuffer; extern USBD_HandleTypeDef USBD_Device; /** * @} */ /** @defgroup USBD_CDC_Private_Defines * @{ */ /** * @} */ /** @defgroup USBD_CDC_Private_Macros * @{ */ /** * @} */ /** @defgroup USBD_CDC_Private_FunctionPrototypes * @{ */ static int8_t TEMPLATE_Init (void); static int8_t TEMPLATE_DeInit (void); static int8_t TEMPLATE_Control (uint8_t cmd, uint8_t* pbuf, uint16_t length); static int8_t TEMPLATE_Receive (uint8_t* pbuf, uint32_t *Len); int VCP_read(void *pBuffer, int size); int VCP_write(const void *pBuffer, int size); USBD_CDC_ItfTypeDef USBD_CDC_Template_fops = { TEMPLATE_Init, TEMPLATE_DeInit, TEMPLATE_Control, TEMPLATE_Receive }; USBD_CDC_LineCodingTypeDef linecoding = { 115200, /* baud rate*/ 0x00, /* stop bits-1*/ 0x00, /* parity - none*/ 0x08 /* nb. of bits 8*/ }; /* Private functions ---------------------------------------------------------*/ /** * @brief TEMPLATE_Init * Initializes the CDC media low layer * @param None * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL */ static int8_t TEMPLATE_Init(void) { /* Add your initialization code here */ USBD_CDC_SetRxBuffer(&USBD_Device, s_RxBuffer.Buffer); return (USBD_OK); } /** * @brief TEMPLATE_DeInit * DeInitializes the CDC media low layer * @param None * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL */ static int8_t TEMPLATE_DeInit(void) { /* Add your deinitialization code here */ return (0); } /** * @brief TEMPLATE_Control * Manage the CDC class requests * @param Cmd: Command code * @param Buf: Buffer containing command data (request parameters) * @param Len: Number of data to be sent (in bytes) * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL */ static int8_t TEMPLATE_Control (uint8_t cmd, uint8_t* pbuf, uint16_t length) { switch (cmd) { case CDC_SEND_ENCAPSULATED_COMMAND: /* Add your code here */ break; case CDC_GET_ENCAPSULATED_RESPONSE: /* Add your code here */ break; case CDC_SET_COMM_FEATURE: /* Add your code here */ break; case CDC_GET_COMM_FEATURE: /* Add your code here */ break; case CDC_CLEAR_COMM_FEATURE: /* Add your code here */ break; case CDC_SET_LINE_CODING: linecoding.bitrate = (uint32_t)(pbuf[0] | (pbuf[1] << 8) |\ (pbuf[2] << 16) | (pbuf[3] << 24)); linecoding.format = pbuf[4]; linecoding.paritytype = pbuf[5]; linecoding.datatype = pbuf[6]; /* Add your code here */ break; case CDC_GET_LINE_CODING: pbuf[0] = (uint8_t)(linecoding.bitrate); pbuf[1] = (uint8_t)(linecoding.bitrate >> 8); pbuf[2] = (uint8_t)(linecoding.bitrate >> 16); pbuf[3] = (uint8_t)(linecoding.bitrate >> 24); pbuf[4] = linecoding.format; pbuf[5] = linecoding.paritytype; pbuf[6] = linecoding.datatype; /* Add your code here */ break; case CDC_SET_CONTROL_LINE_STATE: /* Add your code here */ break; case CDC_SEND_BREAK: /* Add your code here */ break; default: break; } return (0); } /** * @brief TEMPLATE_Receive * Data received over USB OUT endpoint are sent over CDC interface * through this function. * * @note * This function will issue a NAK packet on any OUT packet received on * USB endpoint untill exiting this function. If you exit this function * before transfer is complete on CDC interface (ie. using DMA controller) * it will result in receiving more data while previous ones are still * not sent. * * @param Buf: Buffer of data to be received * @param Len: Number of data received (in bytes) * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL */ static int8_t TEMPLATE_Receive (uint8_t* Buf, uint32_t *Len) { s_RxBuffer.Position = 0; s_RxBuffer.Size = *Len; s_RxBuffer.ReadDone = 1; return (0); } /** * @brief Fun��o de leitura da Virtual COM Port */ int VCP_read(void *pBuffer, int size) { if (!s_RxBuffer.ReadDone) return 0; int remaining = s_RxBuffer.Size - s_RxBuffer.Position; int todo = MIN(remaining, size); if (todo <= 0) return 0; memcpy(pBuffer, s_RxBuffer.Buffer + s_RxBuffer.Position, todo); s_RxBuffer.Position += todo; if (s_RxBuffer.Position >= s_RxBuffer.Size) { s_RxBuffer.ReadDone = 0; USBD_CDC_ReceivePacket(&USBD_Device); } return todo; } /** * @brief Fun��o de escrita na Virtual COM Port */ int VCP_write(const void *pBuffer, int size) { uint16_t timeout = 10000; if (size > CDC_DATA_FS_OUT_PACKET_SIZE) { int offset; for (offset = 0; offset < size; offset++) { int todo = MIN(CDC_DATA_HS_OUT_PACKET_SIZE, size - offset); int done = VCP_write(((char *)pBuffer) + offset, todo); if (done != todo) return offset + done; } return size; } USBD_CDC_HandleTypeDef *pCDC = (USBD_CDC_HandleTypeDef *)USBD_Device.pClassData; USBD_CDC_SetTxBuffer(&USBD_Device, (uint8_t *)pBuffer, size); if (USBD_CDC_TransmitPacket(&USBD_Device) != USBD_OK) return 0; while(pCDC->TxState) { if ((timeout--) == 0) return 0; } return size; } /** * @} */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/