1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-13 03:19:58 +03:00

update f4 vcp in line with BF (#9544)

This commit is contained in:
Jonathan Hudson 2023-12-07 12:46:59 +00:00 committed by GitHub
parent b39a2dcde4
commit 9ba78683fc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 100 additions and 138 deletions

View file

@ -184,8 +184,8 @@ __ALIGN_BEGIN uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] __ALIGN_END ;
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ; __ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ;
uint32_t APP_Rx_ptr_in = 0; volatile uint32_t APP_Rx_ptr_in = 0;
uint32_t APP_Rx_ptr_out = 0; volatile uint32_t APP_Rx_ptr_out = 0;
uint32_t APP_Rx_length = 0; uint32_t APP_Rx_length = 0;
uint8_t USB_Tx_State = USB_CDC_IDLE; uint8_t USB_Tx_State = USB_CDC_IDLE;
@ -619,7 +619,6 @@ uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum)
{ {
(void)pdev; (void)pdev;
(void)epnum; (void)epnum;
uint16_t USB_Tx_ptr;
uint16_t USB_Tx_length; uint16_t USB_Tx_length;
if (USB_Tx_State == USB_CDC_BUSY) if (USB_Tx_State == USB_CDC_BUSY)
@ -627,46 +626,32 @@ uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum)
if (APP_Rx_length == 0) if (APP_Rx_length == 0)
{ {
USB_Tx_State = USB_CDC_IDLE; USB_Tx_State = USB_CDC_IDLE;
} } else {
else
{
if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) { if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) {
USB_Tx_ptr = APP_Rx_ptr_out;
USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
} else {
APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
}
else
{
USB_Tx_ptr = APP_Rx_ptr_out;
USB_Tx_length = APP_Rx_length; USB_Tx_length = APP_Rx_length;
APP_Rx_ptr_out += APP_Rx_length; if (USB_Tx_length == CDC_DATA_IN_PACKET_SIZE) {
APP_Rx_length = 0;
if(USB_Tx_length == CDC_DATA_IN_PACKET_SIZE)
{
USB_Tx_State = USB_CDC_ZLP; USB_Tx_State = USB_CDC_ZLP;
} }
} }
/* Prepare the available data buffer to be sent on IN endpoint */ /* Prepare the available data buffer to be sent on IN endpoint */
DCD_EP_Tx (pdev, DCD_EP_Tx(pdev, CDC_IN_EP, (uint8_t*)&APP_Rx_Buffer[APP_Rx_ptr_out], USB_Tx_length);
CDC_IN_EP,
(uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], // Advance the out pointer
USB_Tx_length); APP_Rx_ptr_out = (APP_Rx_ptr_out + USB_Tx_length) % APP_RX_DATA_SIZE;
APP_Rx_length -= USB_Tx_length;
return USBD_OK; return USBD_OK;
} }
} }
/* Avoid any asynchronous transfer during ZLP */ /* Avoid any asynchronous transfer during ZLP */
if (USB_Tx_State == USB_CDC_ZLP) if (USB_Tx_State == USB_CDC_ZLP) {
{
/*Send ZLP to indicate the end of the current transfer */ /*Send ZLP to indicate the end of the current transfer */
DCD_EP_Tx (pdev, DCD_EP_Tx(pdev, CDC_IN_EP, NULL, 0);
CDC_IN_EP,
NULL,
0);
USB_Tx_State = USB_CDC_IDLE; USB_Tx_State = USB_CDC_IDLE;
} }
@ -731,66 +716,48 @@ uint8_t usbd_cdc_SOF (void *pdev)
*/ */
static void Handle_USBAsynchXfer (void *pdev) static void Handle_USBAsynchXfer (void *pdev)
{ {
uint16_t USB_Tx_ptr;
uint16_t USB_Tx_length; uint16_t USB_Tx_length;
if(USB_Tx_State == USB_CDC_IDLE) if (USB_Tx_State == USB_CDC_IDLE) {
{ if (APP_Rx_ptr_out == APP_Rx_ptr_in) {
if (APP_Rx_ptr_out == APP_RX_DATA_SIZE) // Ring buffer is empty
{
APP_Rx_ptr_out = 0;
}
if(APP_Rx_ptr_out == APP_Rx_ptr_in)
{
USB_Tx_State = USB_CDC_IDLE;
return; return;
} }
if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */ if (APP_Rx_ptr_out > APP_Rx_ptr_in) {
{ // Transfer bytes up to the end of the ring buffer
APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out; APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out;
} else {
} // Transfer all bytes in ring buffer
else
{
APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out; APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out;
} }
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
// Only transfer whole 32 bit words of data
APP_Rx_length &= ~0x03; APP_Rx_length &= ~0x03;
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) {
{
USB_Tx_ptr = APP_Rx_ptr_out;
USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
USB_Tx_State = USB_CDC_BUSY; USB_Tx_State = USB_CDC_BUSY;
} } else {
else
{
USB_Tx_ptr = APP_Rx_ptr_out;
USB_Tx_length = APP_Rx_length; USB_Tx_length = APP_Rx_length;
APP_Rx_ptr_out += APP_Rx_length; if (USB_Tx_length == CDC_DATA_IN_PACKET_SIZE) {
APP_Rx_length = 0;
if(USB_Tx_length == CDC_DATA_IN_PACKET_SIZE)
{
USB_Tx_State = USB_CDC_ZLP; USB_Tx_State = USB_CDC_ZLP;
} } else {
else
{
USB_Tx_State = USB_CDC_BUSY; USB_Tx_State = USB_CDC_BUSY;
} }
} }
DCD_EP_Tx (pdev, DCD_EP_Tx (pdev,
CDC_IN_EP, CDC_IN_EP,
(uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], (uint8_t*)&APP_Rx_Buffer[APP_Rx_ptr_out],
USB_Tx_length); USB_Tx_length);
APP_Rx_ptr_out = (APP_Rx_ptr_out + USB_Tx_length) % APP_RX_DATA_SIZE;
APP_Rx_length -= USB_Tx_length;
} }
} }

View file

@ -19,15 +19,17 @@
****************************************************************************** ******************************************************************************
*/ */
/* Includes ------------------------------------------------------------------*/
#include "usbd_cdc_vcp.h"
#include "stm32f4xx_conf.h"
#include <stdbool.h>
#include "drivers/time.h"
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#pragma data_alignment = 4 #pragma data_alignment = 4
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
/* Includes ------------------------------------------------------------------*/ __ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END;
#include "usbd_cdc_vcp.h"
#include "stm32f4xx_conf.h"
#include "stdbool.h"
#include "drivers/time.h"
LINE_CODING g_lc; LINE_CODING g_lc;
@ -38,11 +40,11 @@ __IO uint32_t bDeviceState = UNCONNECTED; /* USB device status */
/* This is the buffer for data received from the MCU to APP (i.e. MCU TX, APP RX) */ /* This is the buffer for data received from the MCU to APP (i.e. MCU TX, APP RX) */
extern uint8_t APP_Rx_Buffer[]; extern uint8_t APP_Rx_Buffer[];
extern uint32_t APP_Rx_ptr_out; extern volatile uint32_t APP_Rx_ptr_out;
/* Increment this buffer position or roll it back to /* Increment this buffer position or roll it back to
start address when writing received data start address when writing received data
in the buffer APP_Rx_Buffer. */ in the buffer APP_Rx_Buffer. */
extern uint32_t APP_Rx_ptr_in; extern volatile uint32_t APP_Rx_ptr_in;
/* /*
APP TX is the circular buffer for data that is transmitted from the APP (host) APP TX is the circular buffer for data that is transmitted from the APP (host)
@ -63,7 +65,6 @@ static void *ctrlLineStateCbContext;
static void (*baudRateCb)(void *context, uint32_t baud); static void (*baudRateCb)(void *context, uint32_t baud);
static void *baudRateCbContext; static void *baudRateCbContext;
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END;
CDC_IF_Prop_TypeDef VCP_fops = {VCP_Init, VCP_DeInit, VCP_Ctrl, VCP_DataTx, VCP_DataRx }; CDC_IF_Prop_TypeDef VCP_fops = {VCP_Init, VCP_DeInit, VCP_Ctrl, VCP_DataTx, VCP_DataRx };
@ -183,14 +184,7 @@ uint32_t CDC_Send_DATA(const uint8_t *ptrBuffer, uint32_t sendLength)
uint32_t CDC_Send_FreeBytes(void) uint32_t CDC_Send_FreeBytes(void)
{ {
/* return APP_RX_DATA_SIZE - CDC_Receive_BytesAvailable();
return the bytes free in the circular buffer
functionally equivalent to:
(APP_Rx_ptr_out > APP_Rx_ptr_in ? APP_Rx_ptr_out - APP_Rx_ptr_in : APP_RX_DATA_SIZE - APP_Rx_ptr_in + APP_Rx_ptr_in)
but without the impact of the condition check.
*/
return ((APP_Rx_ptr_out - APP_Rx_ptr_in) + (-((int)(APP_Rx_ptr_out <= APP_Rx_ptr_in)) & APP_RX_DATA_SIZE)) - 1;
} }
/** /**
@ -210,12 +204,13 @@ static uint16_t VCP_DataTx(const uint8_t* Buf, uint32_t Len)
while (USB_Tx_State != 0); while (USB_Tx_State != 0);
for (uint32_t i = 0; i < Len; i++) { for (uint32_t i = 0; i < Len; i++) {
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i]; // Stall if the ring buffer is full
APP_Rx_ptr_in = (APP_Rx_ptr_in + 1) % APP_RX_DATA_SIZE; while (((APP_Rx_ptr_in + 1) % APP_RX_DATA_SIZE) == APP_Rx_ptr_out) {
while (CDC_Send_FreeBytes() == 0) {
delay(1); delay(1);
} }
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
APP_Rx_ptr_in = (APP_Rx_ptr_in + 1) % APP_RX_DATA_SIZE;
} }
return USBD_OK; return USBD_OK;
@ -232,7 +227,7 @@ uint32_t CDC_Receive_DATA(uint8_t* recvBuf, uint32_t len)
{ {
uint32_t count = 0; uint32_t count = 0;
while (APP_Tx_ptr_out != APP_Tx_ptr_in && count < len) { while (APP_Tx_ptr_out != APP_Tx_ptr_in && (count < len)) {
recvBuf[count] = APP_Tx_Buffer[APP_Tx_ptr_out]; recvBuf[count] = APP_Tx_Buffer[APP_Tx_ptr_out];
APP_Tx_ptr_out = (APP_Tx_ptr_out + 1) % APP_TX_DATA_SIZE; APP_Tx_ptr_out = (APP_Tx_ptr_out + 1) % APP_TX_DATA_SIZE;
count++; count++;
@ -243,7 +238,7 @@ uint32_t CDC_Receive_DATA(uint8_t* recvBuf, uint32_t len)
uint32_t CDC_Receive_BytesAvailable(void) uint32_t CDC_Receive_BytesAvailable(void)
{ {
/* return the bytes available in the receive circular buffer */ /* return the bytes available in the receive circular buffer */
return APP_Tx_ptr_out > APP_Tx_ptr_in ? APP_TX_DATA_SIZE - APP_Tx_ptr_out + APP_Tx_ptr_in : APP_Tx_ptr_in - APP_Tx_ptr_out; return (APP_Tx_ptr_in + APP_TX_DATA_SIZE - APP_Tx_ptr_out) % APP_TX_DATA_SIZE;
} }
/** /**