1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-16 12:55:19 +03:00

[G4] Treat LPUART1 as UART9

This commit is contained in:
jflyper 2020-03-01 11:37:27 +09:00
parent 0f93dc9c88
commit fecc1a5ca8
10 changed files with 74 additions and 25 deletions

View file

@ -68,8 +68,8 @@ typedef struct dmaTimerMapping_s {
#define DMA_REQUEST_UART2_TX DMA_REQUEST_USART2_TX #define DMA_REQUEST_UART2_TX DMA_REQUEST_USART2_TX
#define DMA_REQUEST_UART3_RX DMA_REQUEST_USART3_RX #define DMA_REQUEST_UART3_RX DMA_REQUEST_USART3_RX
#define DMA_REQUEST_UART3_TX DMA_REQUEST_USART3_TX #define DMA_REQUEST_UART3_TX DMA_REQUEST_USART3_TX
#define DMA_REQUEST_UART6_RX DMA_REQUEST_LPUART1_RX #define DMA_REQUEST_UART9_RX DMA_REQUEST_LPUART1_RX
#define DMA_REQUEST_UART6_TX DMA_REQUEST_LPUART1_TX #define DMA_REQUEST_UART9_TX DMA_REQUEST_LPUART1_TX
static const dmaPeripheralMapping_t dmaPeripheralMapping[] = { static const dmaPeripheralMapping_t dmaPeripheralMapping[] = {
#ifdef USE_SPI #ifdef USE_SPI
@ -102,8 +102,8 @@ static const dmaPeripheralMapping_t dmaPeripheralMapping[] = {
REQMAP_DIR(UART, 4, RX), REQMAP_DIR(UART, 4, RX),
REQMAP_DIR(UART, 5, TX), REQMAP_DIR(UART, 5, TX),
REQMAP_DIR(UART, 5, RX), REQMAP_DIR(UART, 5, RX),
REQMAP_DIR(UART, 6, TX), REQMAP_DIR(UART, 9, TX),
REQMAP_DIR(UART, 6, RX), REQMAP_DIR(UART, 9, RX),
#endif #endif
#ifdef USE_TIMER #ifdef USE_TIMER

View file

@ -205,6 +205,18 @@
# endif # endif
#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 #ifdef USE_SOFTSERIAL1
# if !defined(SOFTSERIAL1_RX_PIN) # if !defined(SOFTSERIAL1_RX_PIN)
# define SOFTSERIAL1_RX_PIN NONE # define SOFTSERIAL1_RX_PIN NONE
@ -254,6 +266,9 @@ static const serialDefaultPin_t serialDefaultPin[] = {
#ifdef USE_UART8 #ifdef USE_UART8
{ SERIAL_PORT_USART8, IO_TAG(UART8_RX_PIN), IO_TAG(UART8_TX_PIN), IO_TAG(INVERTER_PIN_UART8) }, { SERIAL_PORT_USART8, IO_TAG(UART8_RX_PIN), IO_TAG(UART8_TX_PIN), IO_TAG(INVERTER_PIN_UART8) },
#endif #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 #ifdef USE_SOFTSERIAL1
{ SERIAL_PORT_SOFTSERIAL1, IO_TAG(SOFTSERIAL1_RX_PIN), IO_TAG(SOFTSERIAL1_TX_PIN), IO_TAG(NONE) }, { SERIAL_PORT_SOFTSERIAL1, IO_TAG(SOFTSERIAL1_RX_PIN), IO_TAG(SOFTSERIAL1_TX_PIN), IO_TAG(NONE) },
#endif #endif

View file

@ -97,6 +97,10 @@ UART_BUFFERS(7);
UART_BUFFERS(8); UART_BUFFERS(8);
#endif #endif
#ifdef USE_UART9
UART_BUFFERS(9);
#endif
#undef UART_BUFFERS #undef UART_BUFFERS
serialPort_t *uartOpen(UARTDevice_e device, serialReceiveCallbackPtr rxCallback, void *rxCallbackData, uint32_t baudRate, portMode_e mode, portOptions_e options) 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 #endif
#ifdef USE_UART6 #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 UART_IRQHandler(USART, 6, 6) // USART6 Rx/Tx IRQ Handler
#endif #endif
#endif
#ifdef USE_UART7 #ifdef USE_UART7
UART_IRQHandler(UART, 7, 7) // UART7 Rx/Tx IRQ Handler 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 UART_IRQHandler(UART, 8, 8) // UART8 Rx/Tx IRQ Handler
#endif #endif
#ifdef USE_UART9
UART_IRQHandler(LPUART, 1, 9) // UART9 (implemented with LPUART1) Rx/Tx IRQ Handler
#endif
#endif // USE_UART #endif // USE_UART

View file

@ -37,7 +37,8 @@ typedef enum {
UARTDEV_5 = 4, UARTDEV_5 = 4,
UARTDEV_6 = 5, UARTDEV_6 = 5,
UARTDEV_7 = 6, UARTDEV_7 = 6,
UARTDEV_8 = 7 UARTDEV_8 = 7,
UARTDEV_9 = 8,
} UARTDevice_e; } UARTDevice_e;
typedef struct uartPort_s { typedef struct uartPort_s {

View file

@ -68,7 +68,7 @@
#define UART_TX_BUFFER_SIZE 256 #define UART_TX_BUFFER_SIZE 256
#endif #endif
#elif defined(STM32G4) #elif defined(STM32G4)
#define UARTDEV_COUNT_MAX 6 #define UARTDEV_COUNT_MAX 9 // UART1~5 + UART9 (Implemented with LPUART1)
#define UARTHARDWARE_MAX_PINS 3 #define UARTHARDWARE_MAX_PINS 3
#ifndef UART_RX_BUFFER_SIZE #ifndef UART_RX_BUFFER_SIZE
#define UART_RX_BUFFER_SIZE 128 #define UART_RX_BUFFER_SIZE 128
@ -130,7 +130,13 @@
#define UARTDEV_COUNT_8 0 #define UARTDEV_COUNT_8 0
#endif #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 { typedef struct uartPinDef_s {
ioTag_t pin; ioTag_t pin;
@ -252,4 +258,8 @@ UART_BUFFERS_EXTERN(7);
UART_BUFFERS_EXTERN(8); UART_BUFFERS_EXTERN(8);
#endif #endif
#ifdef USE_UART9
UART_BUFFERS_EXTERN(9);
#endif
#undef UART_BUFFERS_EXTERN #undef UART_BUFFERS_EXTERN

View file

@ -67,11 +67,11 @@
#ifndef UART5_RX_DMA_CHANNEL #ifndef UART5_RX_DMA_CHANNEL
#define UART5_RX_DMA_CHANNEL NULL #define UART5_RX_DMA_CHANNEL NULL
#endif #endif
#ifndef UART6_TX_DMA_CHANNEL #ifndef UART9_TX_DMA_CHANNEL
#define UART6_TX_DMA_CHANNEL NULL #define UART9_TX_DMA_CHANNEL NULL
#endif #endif
#ifndef UART6_RX_DMA_CHANNEL #ifndef UART9_RX_DMA_CHANNEL
#define UART6_RX_DMA_CHANNEL NULL #define UART9_RX_DMA_CHANNEL NULL
#endif #endif
const uartHardware_t uartHardware[UARTDEV_COUNT] = { const uartHardware_t uartHardware[UARTDEV_COUNT] = {
@ -222,16 +222,16 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = {
}, },
#endif #endif
#ifdef USE_UART6 #ifdef USE_UART9
// On G474, UART6 is implemented as LPUART1 // On G474, UART9 is implemented as LPUART1
{ {
.device = UARTDEV_6, .device = UARTDEV_9,
.reg = LPUART1, .reg = LPUART1,
#ifdef USE_DMA #ifdef USE_DMA
.rxDMAChannel = DMA_REQUEST_LPUART1_RX, .rxDMAChannel = DMA_REQUEST_LPUART1_RX,
.rxDMAResource = (dmaResource_t *)UART6_RX_DMA_CHANNEL, .rxDMAResource = (dmaResource_t *)UART9_RX_DMA_CHANNEL,
.txDMAChannel = DMA_REQUEST_LPUART1_TX, .txDMAChannel = DMA_REQUEST_LPUART1_TX,
.txDMAResource = (dmaResource_t *)UART6_TX_DMA_CHANNEL, .txDMAResource = (dmaResource_t *)UART9_TX_DMA_CHANNEL,
#endif #endif
.rxPins = { .rxPins = {
{ DEFIO_TAG_E(PA3), GPIO_AF12_LPUART1 }, { DEFIO_TAG_E(PA3), GPIO_AF12_LPUART1 },
@ -247,10 +247,10 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = {
.rxIrq = LPUART1_IRQn, .rxIrq = LPUART1_IRQn,
.txPriority = NVIC_PRIO_SERIALUART6_TXDMA, .txPriority = NVIC_PRIO_SERIALUART6_TXDMA,
.rxPriority = NVIC_PRIO_SERIALUART6, .rxPriority = NVIC_PRIO_SERIALUART6,
.txBuffer = uart6TxBuffer, .txBuffer = uart9TxBuffer,
.rxBuffer = uart6RxBuffer, .rxBuffer = uart9RxBuffer,
.txBufferSize = sizeof(uart6TxBuffer), .txBufferSize = sizeof(uart9TxBuffer),
.rxBufferSize = sizeof(uart6RxBuffer), .rxBufferSize = sizeof(uart9RxBuffer),
}, },
#endif #endif
}; };

View file

@ -93,6 +93,9 @@ const serialPortIdentifier_e serialPortIdentifiers[SERIAL_PORT_COUNT] = {
#ifdef USE_UART8 #ifdef USE_UART8
SERIAL_PORT_USART8, SERIAL_PORT_USART8,
#endif #endif
#ifdef USE_UART9
SERIAL_PORT_LPUART1,
#endif
#ifdef USE_SOFTSERIAL1 #ifdef USE_SOFTSERIAL1
SERIAL_PORT_SOFTSERIAL1, SERIAL_PORT_SOFTSERIAL1,
#endif #endif
@ -391,6 +394,9 @@ serialPort_t *openSerialPort(
#ifdef USE_UART8 #ifdef USE_UART8
case SERIAL_PORT_USART8: case SERIAL_PORT_USART8:
#endif #endif
#ifdef USE_UART9
case SERIAL_PORT_LPUART1:
#endif
#if defined(SIMULATOR_BUILD) #if defined(SIMULATOR_BUILD)
// emulate serial ports over TCP // emulate serial ports over TCP
serialPort = serTcpOpen(SERIAL_PORT_IDENTIFIER_TO_UARTDEV(identifier), rxCallback, rxCallbackData, baudRate, mode, options); serialPort = serTcpOpen(SERIAL_PORT_IDENTIFIER_TO_UARTDEV(identifier), rxCallback, rxCallbackData, baudRate, mode, options);

View file

@ -87,6 +87,7 @@ typedef enum {
SERIAL_PORT_USART6, SERIAL_PORT_USART6,
SERIAL_PORT_USART7, SERIAL_PORT_USART7,
SERIAL_PORT_USART8, SERIAL_PORT_USART8,
SERIAL_PORT_LPUART1,
SERIAL_PORT_USB_VCP = 20, SERIAL_PORT_USB_VCP = 20,
SERIAL_PORT_SOFTSERIAL1 = 30, SERIAL_PORT_SOFTSERIAL1 = 30,
SERIAL_PORT_SOFTSERIAL2, SERIAL_PORT_SOFTSERIAL2,
@ -95,7 +96,7 @@ typedef enum {
extern const serialPortIdentifier_e serialPortIdentifiers[SERIAL_PORT_COUNT]; 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) #define SERIAL_PORT_IDENTIFIER_TO_UARTDEV(x) ((x) - SERIAL_PORT_USART1 + UARTDEV_1)

View file

@ -68,6 +68,9 @@ static uartDmaopt_t uartDmaopt[] = {
#ifdef USE_UART8 #ifdef USE_UART8
{ UARTDEV_8, UART8_TX_DMA_OPT, UART8_RX_DMA_OPT }, { UARTDEV_8, UART8_TX_DMA_OPT, UART8_RX_DMA_OPT },
#endif #endif
#ifdef USE_UART9
{ UARTDEV_9, UART9_TX_DMA_OPT, UART9_RX_DMA_OPT },
#endif
}; };
void pgResetFn_serialUartConfig(serialUartConfig_t *config) void pgResetFn_serialUartConfig(serialUartConfig_t *config)

View file

@ -638,6 +638,15 @@
#endif #endif
#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 #ifndef RTC6705_CS_PIN
#define RTC6705_CS_PIN NONE #define RTC6705_CS_PIN NONE
#endif #endif