qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

serial_usart.h (4649B)


      1 // Copyright 2021 QMK
      2 // SPDX-License-Identifier: GPL-2.0-or-later
      3 
      4 #pragma once
      5 
      6 #include "serial.h"
      7 #include <hal.h>
      8 
      9 #if defined(SOFT_SERIAL_PIN)
     10 #    define SERIAL_USART_TX_PIN SOFT_SERIAL_PIN
     11 #endif
     12 
     13 #if !defined(SERIAL_USART_TX_PIN)
     14 #    define SERIAL_USART_TX_PIN A9
     15 #endif
     16 
     17 #if !defined(SERIAL_USART_RX_PIN)
     18 #    define SERIAL_USART_RX_PIN A10
     19 #endif
     20 
     21 #if !defined(SELECT_SOFT_SERIAL_SPEED)
     22 #    define SELECT_SOFT_SERIAL_SPEED 1
     23 #endif
     24 
     25 #if defined(SERIAL_USART_SPEED)
     26 // Allow advanced users to directly set SERIAL_USART_SPEED
     27 #elif SELECT_SOFT_SERIAL_SPEED == 0
     28 #    define SERIAL_USART_SPEED 460800
     29 #elif SELECT_SOFT_SERIAL_SPEED == 1
     30 #    define SERIAL_USART_SPEED 230400
     31 #elif SELECT_SOFT_SERIAL_SPEED == 2
     32 #    define SERIAL_USART_SPEED 115200
     33 #elif SELECT_SOFT_SERIAL_SPEED == 3
     34 #    define SERIAL_USART_SPEED 57600
     35 #elif SELECT_SOFT_SERIAL_SPEED == 4
     36 #    define SERIAL_USART_SPEED 38400
     37 #elif SELECT_SOFT_SERIAL_SPEED == 5
     38 #    define SERIAL_USART_SPEED 19200
     39 #else
     40 #    error invalid SELECT_SOFT_SERIAL_SPEED value
     41 #endif
     42 
     43 #if !defined(SERIAL_USART_TIMEOUT)
     44 #    define SERIAL_USART_TIMEOUT 20
     45 #endif
     46 
     47 #if HAL_USE_SERIAL
     48 
     49 typedef SerialDriver QMKSerialDriver;
     50 typedef SerialConfig QMKSerialConfig;
     51 
     52 #    if !defined(SERIAL_USART_DRIVER)
     53 #        define SERIAL_USART_DRIVER SD1
     54 #    endif
     55 
     56 #elif HAL_USE_SIO
     57 
     58 typedef SIODriver QMKSerialDriver;
     59 typedef SIOConfig QMKSerialConfig;
     60 
     61 #    if !defined(SERIAL_USART_DRIVER)
     62 #        define SERIAL_USART_DRIVER SIOD1
     63 #    endif
     64 
     65 #endif
     66 
     67 #if !defined(USE_GPIOV1)
     68 /* The default PAL alternate modes are used to signal that the pins are used for USART. */
     69 #    if !defined(SERIAL_USART_TX_PAL_MODE)
     70 #        define SERIAL_USART_TX_PAL_MODE 7
     71 #    endif
     72 #    if !defined(SERIAL_USART_RX_PAL_MODE)
     73 #        define SERIAL_USART_RX_PAL_MODE 7
     74 #    endif
     75 #endif
     76 
     77 #if defined(MCU_STM32) /* STM32 MCUs */
     78 #    if !defined(USART_CR1_M0)
     79 #        define USART_CR1_M0 USART_CR1_M // some platforms (f1xx) dont have this so
     80 #    endif
     81 
     82 #    if !defined(SERIAL_USART_CR1)
     83 #        define SERIAL_USART_CR1 (USART_CR1_PCE | USART_CR1_PS | USART_CR1_M0) // parity enable, odd parity, 9 bit length
     84 #    endif
     85 
     86 #    if !defined(SERIAL_USART_CR2)
     87 #        define SERIAL_USART_CR2 (USART_CR2_STOP_1) // 2 stop bits
     88 #    endif
     89 
     90 #    if !defined(SERIAL_USART_CR3)
     91 #        define SERIAL_USART_CR3 0
     92 #    endif
     93 
     94 #    if defined(USART1_REMAP)
     95 #        define USART_REMAP                             \
     96             do {                                        \
     97                 (AFIO->MAPR |= AFIO_MAPR_USART1_REMAP); \
     98             } while (0)
     99 #    elif defined(USART2_REMAP)
    100 #        define USART_REMAP                             \
    101             do {                                        \
    102                 (AFIO->MAPR |= AFIO_MAPR_USART2_REMAP); \
    103             } while (0)
    104 #    elif defined(USART3_PARTIALREMAP)
    105 #        define USART_REMAP                                          \
    106             do {                                                     \
    107                 (AFIO->MAPR |= AFIO_MAPR_USART3_REMAP_PARTIALREMAP); \
    108             } while (0)
    109 #    elif defined(USART3_FULLREMAP)
    110 #        define USART_REMAP                                       \
    111             do {                                                  \
    112                 (AFIO->MAPR |= AFIO_MAPR_USART3_REMAP_FULLREMAP); \
    113             } while (0)
    114 #    endif
    115 #elif defined(MCU_AT32) /* AT32 MCUs */
    116 #    if !defined(USART_CTRL1_DBN0)
    117 #        define USART_CTRL1_DBN0 USART_CTRL1_DBN
    118 #    endif
    119 
    120 #    if !defined(SERIAL_USART_CTRL1)
    121 #        define SERIAL_USART_CTRL1 (USART_CTRL1_PEN | USART_CTRL1_PSEL | USART_CTRL1_DBN0) // parity enable, odd parity, 9 bit length
    122 #    endif
    123 
    124 #    if !defined(SERIAL_USART_CTRL2)
    125 #        define SERIAL_USART_CTRL2 (USART_CTRL2_STOPBN_1) // 2 stop bits
    126 #    endif
    127 
    128 #    if !defined(SERIAL_USART_CTRL3)
    129 #        define SERIAL_USART_CTRL3 0
    130 #    endif
    131 
    132 #    if defined(USART1_REMAP)
    133 #        define USART_REMAP                               \
    134             do {                                          \
    135                 (IOMUX->REMAP |= IOMUX_REMAP_USART1_MUX); \
    136             } while (0)
    137 #    elif defined(USART3_PARTIALREMAP)
    138 #        define USART_REMAP                                    \
    139             do {                                               \
    140                 (IOMUX->REMAP |= IOMUX_REMAP_USART3_MUX_MUX1); \
    141             } while (0)
    142 #    elif defined(USART3_FULLREMAP)
    143 #        define USART_REMAP                                    \
    144             do {                                               \
    145                 (IOMUX->REMAP |= IOMUX_REMAP_USART3_MUX_MUX2); \
    146             } while (0)
    147 #    endif
    148 #endif