diff --git a/src/main/drivers/dma_reqmap.c b/src/main/drivers/dma_reqmap.c index 6e53a61a28..4be6b587c8 100644 --- a/src/main/drivers/dma_reqmap.c +++ b/src/main/drivers/dma_reqmap.c @@ -68,8 +68,8 @@ typedef struct dmaTimerMapping_s { #define DMA_REQUEST_UART2_TX DMA_REQUEST_USART2_TX #define DMA_REQUEST_UART3_RX DMA_REQUEST_USART3_RX #define DMA_REQUEST_UART3_TX DMA_REQUEST_USART3_TX -#define DMA_REQUEST_UART6_RX DMA_REQUEST_LPUART1_RX -#define DMA_REQUEST_UART6_TX DMA_REQUEST_LPUART1_TX +#define DMA_REQUEST_UART9_RX DMA_REQUEST_LPUART1_RX +#define DMA_REQUEST_UART9_TX DMA_REQUEST_LPUART1_TX static const dmaPeripheralMapping_t dmaPeripheralMapping[] = { #ifdef USE_SPI @@ -102,8 +102,8 @@ static const dmaPeripheralMapping_t dmaPeripheralMapping[] = { REQMAP_DIR(UART, 4, RX), REQMAP_DIR(UART, 5, TX), REQMAP_DIR(UART, 5, RX), - REQMAP_DIR(UART, 6, TX), - REQMAP_DIR(UART, 6, RX), + REQMAP_DIR(UART, 9, TX), + REQMAP_DIR(UART, 9, RX), #endif #ifdef USE_TIMER diff --git a/src/main/drivers/serial_pinconfig.c b/src/main/drivers/serial_pinconfig.c index fadd6c3c8c..2d7c5f42c6 100644 --- a/src/main/drivers/serial_pinconfig.c +++ b/src/main/drivers/serial_pinconfig.c @@ -205,6 +205,18 @@ # endif #endif +#ifdef USE_UART9 +# if !defined(UART9_RX_PIN) +# define UART9_RX_PIN NONE +# endif +# if !defined(UART9_TX_PIN) +# define UART9_TX_PIN NONE +# endif +# if !defined(INVERTER_PIN_UART9) +# define INVERTER_PIN_UART9 NONE +# endif +#endif + #ifdef USE_SOFTSERIAL1 # if !defined(SOFTSERIAL1_RX_PIN) # define SOFTSERIAL1_RX_PIN NONE @@ -254,6 +266,9 @@ static const serialDefaultPin_t serialDefaultPin[] = { #ifdef USE_UART8 { SERIAL_PORT_USART8, IO_TAG(UART8_RX_PIN), IO_TAG(UART8_TX_PIN), IO_TAG(INVERTER_PIN_UART8) }, #endif +#ifdef USE_UART9 + { SERIAL_PORT_LPUART1, IO_TAG(UART9_RX_PIN), IO_TAG(UART9_TX_PIN), IO_TAG(INVERTER_PIN_UART9) }, +#endif #ifdef USE_SOFTSERIAL1 { SERIAL_PORT_SOFTSERIAL1, IO_TAG(SOFTSERIAL1_RX_PIN), IO_TAG(SOFTSERIAL1_TX_PIN), IO_TAG(NONE) }, #endif diff --git a/src/main/drivers/serial_uart.c b/src/main/drivers/serial_uart.c index d02a100bc2..e516262c0c 100644 --- a/src/main/drivers/serial_uart.c +++ b/src/main/drivers/serial_uart.c @@ -97,6 +97,10 @@ UART_BUFFERS(7); UART_BUFFERS(8); #endif +#ifdef USE_UART9 +UART_BUFFERS(9); +#endif + #undef UART_BUFFERS serialPort_t *uartOpen(UARTDevice_e device, serialReceiveCallbackPtr rxCallback, void *rxCallbackData, uint32_t baudRate, portMode_e mode, portOptions_e options) @@ -370,12 +374,8 @@ UART_IRQHandler(UART, 5, 5) // UART5 Rx/Tx IRQ Handler #endif #ifdef USE_UART6 -#ifdef STM32G4 -UART_IRQHandler(LPUART, 1, 6) // UART6 (implemented with LPUART1) Rx/Tx IRQ Handler -#else UART_IRQHandler(USART, 6, 6) // USART6 Rx/Tx IRQ Handler #endif -#endif #ifdef USE_UART7 UART_IRQHandler(UART, 7, 7) // UART7 Rx/Tx IRQ Handler @@ -385,4 +385,8 @@ UART_IRQHandler(UART, 7, 7) // UART7 Rx/Tx IRQ Handler UART_IRQHandler(UART, 8, 8) // UART8 Rx/Tx IRQ Handler #endif +#ifdef USE_UART9 +UART_IRQHandler(LPUART, 1, 9) // UART9 (implemented with LPUART1) Rx/Tx IRQ Handler +#endif + #endif // USE_UART diff --git a/src/main/drivers/serial_uart.h b/src/main/drivers/serial_uart.h index 7232ee062e..c00be4ab02 100644 --- a/src/main/drivers/serial_uart.h +++ b/src/main/drivers/serial_uart.h @@ -37,7 +37,8 @@ typedef enum { UARTDEV_5 = 4, UARTDEV_6 = 5, UARTDEV_7 = 6, - UARTDEV_8 = 7 + UARTDEV_8 = 7, + UARTDEV_9 = 8, } UARTDevice_e; typedef struct uartPort_s { diff --git a/src/main/drivers/serial_uart_impl.h b/src/main/drivers/serial_uart_impl.h index fe72772615..bd11aa96b2 100644 --- a/src/main/drivers/serial_uart_impl.h +++ b/src/main/drivers/serial_uart_impl.h @@ -68,7 +68,7 @@ #define UART_TX_BUFFER_SIZE 256 #endif #elif defined(STM32G4) -#define UARTDEV_COUNT_MAX 6 +#define UARTDEV_COUNT_MAX 9 // UART1~5 + UART9 (Implemented with LPUART1) #define UARTHARDWARE_MAX_PINS 3 #ifndef UART_RX_BUFFER_SIZE #define UART_RX_BUFFER_SIZE 128 @@ -130,7 +130,13 @@ #define UARTDEV_COUNT_8 0 #endif -#define UARTDEV_COUNT (UARTDEV_COUNT_1 + UARTDEV_COUNT_2 + UARTDEV_COUNT_3 + UARTDEV_COUNT_4 + UARTDEV_COUNT_5 + UARTDEV_COUNT_6 + UARTDEV_COUNT_7 + UARTDEV_COUNT_8) +#ifdef USE_UART9 +#define UARTDEV_COUNT_9 1 +#else +#define UARTDEV_COUNT_9 0 +#endif + +#define UARTDEV_COUNT (UARTDEV_COUNT_1 + UARTDEV_COUNT_2 + UARTDEV_COUNT_3 + UARTDEV_COUNT_4 + UARTDEV_COUNT_5 + UARTDEV_COUNT_6 + UARTDEV_COUNT_7 + UARTDEV_COUNT_8 + UARTDEV_COUNT_9) typedef struct uartPinDef_s { ioTag_t pin; @@ -252,4 +258,8 @@ UART_BUFFERS_EXTERN(7); UART_BUFFERS_EXTERN(8); #endif +#ifdef USE_UART9 +UART_BUFFERS_EXTERN(9); +#endif + #undef UART_BUFFERS_EXTERN diff --git a/src/main/drivers/serial_uart_stm32g4xx.c b/src/main/drivers/serial_uart_stm32g4xx.c index 76f31c9816..19186042b5 100644 --- a/src/main/drivers/serial_uart_stm32g4xx.c +++ b/src/main/drivers/serial_uart_stm32g4xx.c @@ -67,11 +67,11 @@ #ifndef UART5_RX_DMA_CHANNEL #define UART5_RX_DMA_CHANNEL NULL #endif -#ifndef UART6_TX_DMA_CHANNEL -#define UART6_TX_DMA_CHANNEL NULL +#ifndef UART9_TX_DMA_CHANNEL +#define UART9_TX_DMA_CHANNEL NULL #endif -#ifndef UART6_RX_DMA_CHANNEL -#define UART6_RX_DMA_CHANNEL NULL +#ifndef UART9_RX_DMA_CHANNEL +#define UART9_RX_DMA_CHANNEL NULL #endif const uartHardware_t uartHardware[UARTDEV_COUNT] = { @@ -222,16 +222,16 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { }, #endif -#ifdef USE_UART6 - // On G474, UART6 is implemented as LPUART1 +#ifdef USE_UART9 + // On G474, UART9 is implemented as LPUART1 { - .device = UARTDEV_6, + .device = UARTDEV_9, .reg = LPUART1, #ifdef USE_DMA .rxDMAChannel = DMA_REQUEST_LPUART1_RX, - .rxDMAResource = (dmaResource_t *)UART6_RX_DMA_CHANNEL, + .rxDMAResource = (dmaResource_t *)UART9_RX_DMA_CHANNEL, .txDMAChannel = DMA_REQUEST_LPUART1_TX, - .txDMAResource = (dmaResource_t *)UART6_TX_DMA_CHANNEL, + .txDMAResource = (dmaResource_t *)UART9_TX_DMA_CHANNEL, #endif .rxPins = { { DEFIO_TAG_E(PA3), GPIO_AF12_LPUART1 }, @@ -247,10 +247,10 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = { .rxIrq = LPUART1_IRQn, .txPriority = NVIC_PRIO_SERIALUART6_TXDMA, .rxPriority = NVIC_PRIO_SERIALUART6, - .txBuffer = uart6TxBuffer, - .rxBuffer = uart6RxBuffer, - .txBufferSize = sizeof(uart6TxBuffer), - .rxBufferSize = sizeof(uart6RxBuffer), + .txBuffer = uart9TxBuffer, + .rxBuffer = uart9RxBuffer, + .txBufferSize = sizeof(uart9TxBuffer), + .rxBufferSize = sizeof(uart9RxBuffer), }, #endif }; diff --git a/src/main/io/serial.c b/src/main/io/serial.c index e016650b99..307a38d7f5 100644 --- a/src/main/io/serial.c +++ b/src/main/io/serial.c @@ -93,6 +93,9 @@ const serialPortIdentifier_e serialPortIdentifiers[SERIAL_PORT_COUNT] = { #ifdef USE_UART8 SERIAL_PORT_USART8, #endif +#ifdef USE_UART9 + SERIAL_PORT_LPUART1, +#endif #ifdef USE_SOFTSERIAL1 SERIAL_PORT_SOFTSERIAL1, #endif @@ -391,6 +394,9 @@ serialPort_t *openSerialPort( #ifdef USE_UART8 case SERIAL_PORT_USART8: #endif +#ifdef USE_UART9 + case SERIAL_PORT_LPUART1: +#endif #if defined(SIMULATOR_BUILD) // emulate serial ports over TCP serialPort = serTcpOpen(SERIAL_PORT_IDENTIFIER_TO_UARTDEV(identifier), rxCallback, rxCallbackData, baudRate, mode, options); diff --git a/src/main/io/serial.h b/src/main/io/serial.h index 8023e32ab9..e09b862cb8 100644 --- a/src/main/io/serial.h +++ b/src/main/io/serial.h @@ -87,6 +87,7 @@ typedef enum { SERIAL_PORT_USART6, SERIAL_PORT_USART7, SERIAL_PORT_USART8, + SERIAL_PORT_LPUART1, SERIAL_PORT_USB_VCP = 20, SERIAL_PORT_SOFTSERIAL1 = 30, SERIAL_PORT_SOFTSERIAL2, @@ -95,7 +96,7 @@ typedef enum { extern const serialPortIdentifier_e serialPortIdentifiers[SERIAL_PORT_COUNT]; -#define SERIAL_PORT_IDENTIFIER_TO_INDEX(x) (((x) <= SERIAL_PORT_USART8) ? (x) : (RESOURCE_SOFT_OFFSET + ((x) - SERIAL_PORT_SOFTSERIAL1))) +#define SERIAL_PORT_IDENTIFIER_TO_INDEX(x) (((x) < RESOURCE_SOFT_OFFSET) ? (x) : (RESOURCE_SOFT_OFFSET + ((x) - SERIAL_PORT_SOFTSERIAL1))) #define SERIAL_PORT_IDENTIFIER_TO_UARTDEV(x) ((x) - SERIAL_PORT_USART1 + UARTDEV_1) diff --git a/src/main/pg/serial_uart.c b/src/main/pg/serial_uart.c index e12368e7ee..78d21022b4 100644 --- a/src/main/pg/serial_uart.c +++ b/src/main/pg/serial_uart.c @@ -68,6 +68,9 @@ static uartDmaopt_t uartDmaopt[] = { #ifdef USE_UART8 { UARTDEV_8, UART8_TX_DMA_OPT, UART8_RX_DMA_OPT }, #endif +#ifdef USE_UART9 + { UARTDEV_9, UART9_TX_DMA_OPT, UART9_RX_DMA_OPT }, +#endif }; void pgResetFn_serialUartConfig(serialUartConfig_t *config) diff --git a/src/main/target/common_defaults_post.h b/src/main/target/common_defaults_post.h index 965ade2274..df8db43040 100644 --- a/src/main/target/common_defaults_post.h +++ b/src/main/target/common_defaults_post.h @@ -638,6 +638,15 @@ #endif #endif +#ifdef USE_UART9 +#ifndef UART9_TX_DMA_OPT +#define UART9_TX_DMA_OPT (DMA_OPT_UNUSED) +#endif +#ifndef UART9_RX_DMA_OPT +#define UART9_RX_DMA_OPT (DMA_OPT_UNUSED) +#endif +#endif + #ifndef RTC6705_CS_PIN #define RTC6705_CS_PIN NONE #endif