2 * This file is part of Cleanflight and Betaflight.
4 * Cleanflight and Betaflight are free software. You can redistribute
5 * this software and/or modify this software under the terms of the
6 * GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option)
10 * Cleanflight and Betaflight are distributed in the hope that they
11 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
12 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this software.
18 * If not, see <http://www.gnu.org/licenses/>.
28 #include "common/utils.h"
31 #include "pg/pg_ids.h"
32 #include "pg/serial_uart.h"
34 #include "drivers/io_types.h"
35 #include "drivers/serial.h"
36 #include "drivers/serial_uart.h"
37 #include "drivers/dma_reqmap.h"
39 // TODO(hertz@): UARTDEV_CONFIG_MAX is measured to be exactly 8, which cannot accomodate even all the UARTs below
40 PG_REGISTER_ARRAY_WITH_RESET_FN(serialUartConfig_t
, UARTDEV_CONFIG_MAX
, serialUartConfig
, PG_SERIAL_UART_CONFIG
, 0);
42 typedef struct uartDmaopt_s
{
43 serialPortIdentifier_e identifier
;
48 static const uartDmaopt_t uartDmaopt
[] = {
50 { SERIAL_PORT_UART0
, UART0_TX_DMA_OPT
, UART0_RX_DMA_OPT
},
53 { SERIAL_PORT_USART1
, UART1_TX_DMA_OPT
, UART1_RX_DMA_OPT
},
56 { SERIAL_PORT_USART2
, UART2_TX_DMA_OPT
, UART2_RX_DMA_OPT
},
59 { SERIAL_PORT_USART3
, UART3_TX_DMA_OPT
, UART3_RX_DMA_OPT
},
62 { SERIAL_PORT_UART4
, UART4_TX_DMA_OPT
, UART4_RX_DMA_OPT
},
65 { SERIAL_PORT_UART5
, UART5_TX_DMA_OPT
, UART5_RX_DMA_OPT
},
68 { SERIAL_PORT_UART6
, UART6_TX_DMA_OPT
, UART6_RX_DMA_OPT
},
71 { SERIAL_PORT_UART7
, UART7_TX_DMA_OPT
, UART7_RX_DMA_OPT
},
74 { SERIAL_PORT_UART8
, UART8_TX_DMA_OPT
, UART8_RX_DMA_OPT
},
77 { SERIAL_PORT_UART9
, UART9_TX_DMA_OPT
, UART9_RX_DMA_OPT
},
80 { SERIAL_PORT_UART10
, UART10_TX_DMA_OPT
, UART10_RX_DMA_OPT
},
83 { SERIAL_PORT_LPUART1
, DMA_OPT_UNUSED
, DMA_OPT_UNUSED
},
87 void pgResetFn_serialUartConfig(serialUartConfig_t
*config
)
89 for (unsigned i
= 0; i
< UARTDEV_CONFIG_MAX
; i
++) {
90 config
[i
].txDmaopt
= DMA_OPT_UNUSED
;
91 config
[i
].rxDmaopt
= DMA_OPT_UNUSED
;
94 for (unsigned i
= 0; i
< ARRAYLEN(uartDmaopt
); i
++) {
95 const int resourceIndex
= serialResourceIndex(uartDmaopt
[i
].identifier
);
96 if (resourceIndex
>= 0 && resourceIndex
< UARTDEV_CONFIG_MAX
) { // hadle corrupted config gracefuly
97 config
[resourceIndex
].txDmaopt
= uartDmaopt
[i
].txDmaopt
;
98 config
[resourceIndex
].rxDmaopt
= uartDmaopt
[i
].rxDmaopt
;