1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-25 17:25:20 +03:00

Fix UARTS and LPUART

This commit is contained in:
Mark Haslinghuis 2022-01-23 21:13:59 +01:00
parent edfb94b1b5
commit 3009a13355
6 changed files with 36 additions and 20 deletions

View file

@ -61,15 +61,13 @@ typedef struct dmaTimerMapping_s {
#define REQMAP_DIR(periph, device, dir) { DMA_PERIPH_ ## periph ## _ ## dir, periph ## DEV_ ## device, DMA_REQUEST_ ## periph ## device ## _ ## dir } #define REQMAP_DIR(periph, device, dir) { DMA_PERIPH_ ## periph ## _ ## dir, periph ## DEV_ ## device, DMA_REQUEST_ ## periph ## device ## _ ## dir }
#define REQMAP_TIMUP(periph, timno) { DMA_PERIPH_TIMUP, timno - 1, DMA_REQUEST_ ## TIM ## timno ## _UP } #define REQMAP_TIMUP(periph, timno) { DMA_PERIPH_TIMUP, timno - 1, DMA_REQUEST_ ## TIM ## timno ## _UP }
// Resolve UART/USART mess, also map UART6 requests to LPUART1 requests // Resolve UART/USART mess
#define DMA_REQUEST_UART1_RX DMA_REQUEST_USART1_RX #define DMA_REQUEST_UART1_RX DMA_REQUEST_USART1_RX
#define DMA_REQUEST_UART1_TX DMA_REQUEST_USART1_TX #define DMA_REQUEST_UART1_TX DMA_REQUEST_USART1_TX
#define DMA_REQUEST_UART2_RX DMA_REQUEST_USART2_RX #define DMA_REQUEST_UART2_RX DMA_REQUEST_USART2_RX
#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_UART9_RX DMA_REQUEST_LPUART1_RX
#define DMA_REQUEST_UART9_TX DMA_REQUEST_LPUART1_TX
// Resolve our preference for MOSI/MISO rather than TX/RX // Resolve our preference for MOSI/MISO rather than TX/RX
#define DMA_REQUEST_SPI1_MOSI DMA_REQUEST_SPI1_TX #define DMA_REQUEST_SPI1_MOSI DMA_REQUEST_SPI1_TX
@ -112,8 +110,10 @@ 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, 9, TX), #ifdef USE_LPUART1
REQMAP_DIR(UART, 9, RX), { DMA_PERIPH_UART_TX, LPUARTDEV_1, DMA_REQUEST_LPUART1_TX },
{ DMA_PERIPH_UART_RX, LPUARTDEV_1, DMA_REQUEST_LPUART1_RX },
#endif
#endif #endif
#ifdef USE_TIMER #ifdef USE_TIMER
@ -218,6 +218,8 @@ static dmaChannelSpec_t dmaChannelSpec[MAX_PERIPHERAL_DMA_OPTIONS] = {
#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_USART6_RX #define DMA_REQUEST_UART6_RX DMA_REQUEST_USART6_RX
#define DMA_REQUEST_UART6_TX DMA_REQUEST_USART6_TX #define DMA_REQUEST_UART6_TX DMA_REQUEST_USART6_TX
#define DMA_REQUEST_UART10_RX DMA_REQUEST_USART10_RX
#define DMA_REQUEST_UART10_TX DMA_REQUEST_USART10_TX
// Resolve our preference for MOSI/MISO rather than TX/RX // Resolve our preference for MOSI/MISO rather than TX/RX
#define DMA_REQUEST_SPI1_MOSI DMA_REQUEST_SPI1_TX #define DMA_REQUEST_SPI1_MOSI DMA_REQUEST_SPI1_TX
@ -272,6 +274,16 @@ static const dmaPeripheralMapping_t dmaPeripheralMapping[] = {
REQMAP_DIR(UART, 7, RX), REQMAP_DIR(UART, 7, RX),
REQMAP_DIR(UART, 8, TX), REQMAP_DIR(UART, 8, TX),
REQMAP_DIR(UART, 8, RX), REQMAP_DIR(UART, 8, RX),
#if defined(STM32H7A3xxQ)
REQMAP_DIR(UART, 9, TX),
REQMAP_DIR(UART, 9, RX),
REQMAP_DIR(UART, 10, TX),
REQMAP_DIR(UART, 10, RX),
#endif
#ifdef USE_LPUART1
{ DMA_PERIPH_UART_TX, LPUARTDEV_1, BDMA_REQUEST_LPUART1_TX },
{ DMA_PERIPH_UART_RX, LPUARTDEV_1, BDMA_REQUEST_LPUART1_RX },
#endif
#endif #endif
#ifdef USE_TIMER #ifdef USE_TIMER

View file

@ -67,7 +67,7 @@
#endif #endif
#endif #endif
#elif defined(STM32H7) #elif defined(STM32H7)
#define UARTDEV_COUNT_MAX 8 #define UARTDEV_COUNT_MAX 11 // UARTs 1 to 10 + LPUART1
#define UARTHARDWARE_MAX_PINS 5 #define UARTHARDWARE_MAX_PINS 5
#ifndef UART_RX_BUFFER_SIZE #ifndef UART_RX_BUFFER_SIZE
#define UART_RX_BUFFER_SIZE 128 #define UART_RX_BUFFER_SIZE 128
@ -80,7 +80,7 @@
#endif #endif
#endif #endif
#elif defined(STM32G4) #elif defined(STM32G4)
#define UARTDEV_COUNT_MAX 9 // UART1~5 + UART9 (Implemented with LPUART1) #define UARTDEV_COUNT_MAX 11 // UARTs 1 to 5 + LPUART1 (index 10)
#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

View file

@ -41,7 +41,7 @@
#include "drivers/serial_uart.h" #include "drivers/serial_uart.h"
#include "drivers/serial_uart_impl.h" #include "drivers/serial_uart_impl.h"
FAST_DATA_ZERO_INIT uartDevice_t uartDevice[UARTDEV_COUNT]; // Only those configured in target.h static FAST_DATA_ZERO_INIT uartDevice_t uartDevice[UARTDEV_COUNT]; // Only those configured in target.h
FAST_DATA_ZERO_INIT uartDevice_t *uartDevmap[UARTDEV_COUNT_MAX]; // Full array FAST_DATA_ZERO_INIT uartDevice_t *uartDevmap[UARTDEV_COUNT_MAX]; // Full array
void uartPinConfigure(const serialPinConfig_t *pSerialPinConfig) void uartPinConfigure(const serialPinConfig_t *pSerialPinConfig)

View file

@ -222,10 +222,9 @@ const uartHardware_t uartHardware[UARTDEV_COUNT] = {
}, },
#endif #endif
#ifdef USE_UART9 #ifdef USE_LPUART1
// On G474, UART9 is implemented as LPUART1
{ {
.device = UARTDEV_9, .device = LPUARTDEV_1,
.reg = LPUART1, .reg = LPUART1,
#ifdef USE_DMA #ifdef USE_DMA
.rxDMAChannel = DMA_REQUEST_LPUART1_RX, .rxDMAChannel = DMA_REQUEST_LPUART1_RX,
@ -247,10 +246,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 = uart9TxBuffer, .txBuffer = lpuart1TxBuffer,
.rxBuffer = uart9RxBuffer, .rxBuffer = lpuart1RxBuffer,
.txBufferSize = sizeof(uart9TxBuffer), .txBufferSize = sizeof(lpuart1TxBuffer),
.rxBufferSize = sizeof(uart9RxBuffer), .rxBufferSize = sizeof(lpuart1RxBuffer),
}, },
#endif #endif
}; };

View file

@ -106,7 +106,7 @@ const serialPortIdentifier_e serialPortIdentifiers[SERIAL_PORT_COUNT] = {
SERIAL_PORT_SOFTSERIAL2, SERIAL_PORT_SOFTSERIAL2,
#endif #endif
#ifdef USE_LPUART1 #ifdef USE_LPUART1
SERIAL_PORT_LPUART1 SERIAL_PORT_LPUART1,
#endif #endif
}; };
@ -406,6 +406,9 @@ serialPort_t *openSerialPort(
#ifdef USE_UART10 #ifdef USE_UART10
case SERIAL_PORT_USART10: case SERIAL_PORT_USART10:
#endif #endif
#ifdef USE_LPUART1
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);
@ -474,9 +477,12 @@ void serialInit(bool softserialEnabled, serialPortIdentifier_e serialPortToDisab
serialPortCount--; serialPortCount--;
} }
} }
#if !defined(SIMULATOR_BUILD) #if !defined(SIMULATOR_BUILD)
else if (serialPortUsageList[index].identifier <= SERIAL_PORT_USART8) { else if (serialPortUsageList[index].identifier <= SERIAL_PORT_USART10
#ifdef USE_LPUART1
|| serialPortUsageList[index].identifier == SERIAL_PORT_LPUART1
#endif
) {
int resourceIndex = SERIAL_PORT_IDENTIFIER_TO_INDEX(serialPortUsageList[index].identifier); int resourceIndex = SERIAL_PORT_IDENTIFIER_TO_INDEX(serialPortUsageList[index].identifier);
if (!(serialPinConfig()->ioTagTx[resourceIndex] || serialPinConfig()->ioTagRx[resourceIndex])) { if (!(serialPinConfig()->ioTagTx[resourceIndex] || serialPinConfig()->ioTagRx[resourceIndex])) {
serialPortUsageList[index].identifier = SERIAL_PORT_NONE; serialPortUsageList[index].identifier = SERIAL_PORT_NONE;
@ -484,7 +490,6 @@ void serialInit(bool softserialEnabled, serialPortIdentifier_e serialPortToDisab
} }
} }
#endif #endif
else if ((serialPortUsageList[index].identifier == SERIAL_PORT_SOFTSERIAL1 else if ((serialPortUsageList[index].identifier == SERIAL_PORT_SOFTSERIAL1
#ifdef USE_SOFTSERIAL1 #ifdef USE_SOFTSERIAL1
&& !(softserialEnabled && (serialPinConfig()->ioTagTx[RESOURCE_SOFT_OFFSET + SOFTSERIAL1] || && !(softserialEnabled && (serialPinConfig()->ioTagTx[RESOURCE_SOFT_OFFSET + SOFTSERIAL1] ||

View file

@ -189,7 +189,7 @@
#define USE_UART6 #define USE_UART6
#define USE_UART7 #define USE_UART7
#define USE_UART8 #define USE_UART8
// #define USE_LPUART1 #define USE_LPUART1
#define SERIAL_PORT_COUNT (UNIFIED_SERIAL_PORT_COUNT + 9) #define SERIAL_PORT_COUNT (UNIFIED_SERIAL_PORT_COUNT + 9)