From 1a3770dfe3a83e5b2646cadd35409d18d7328b0c Mon Sep 17 00:00:00 2001 From: mikee47 Date: Mon, 4 Oct 2021 18:22:16 +0100 Subject: [PATCH] Change uart settings values and use enums --- Sming/Arch/Esp32/Components/driver/uart.cpp | 23 ++- .../arch_driver/src/include/driver/uart.h | 133 ++++++++++++------ 2 files changed, 102 insertions(+), 54 deletions(-) diff --git a/Sming/Arch/Esp32/Components/driver/uart.cpp b/Sming/Arch/Esp32/Components/driver/uart.cpp index 34752c9d76..f62ece0f5c 100644 --- a/Sming/Arch/Esp32/Components/driver/uart.cpp +++ b/Sming/Arch/Esp32/Components/driver/uart.cpp @@ -2,23 +2,22 @@ uart.cpp - esp32 UART HAL */ -#include - -#include -#include -#include -#include -#include - -// These conflict with enumerated types defined in IDF - values are same though +// #define typeof(x) std::remove_volatile::type +#define typeof(x) decltype(x) +// These conflict with enumerated types defined in IDF +#define UART_PARITY_NONE IDF_UART_PARITY_NONE +#define UART_PARITY_EVEN IDF_UART_PARITY_EVEN +#define UART_PARITY_ODD IDF_UART_PARITY_ODD +#include #undef UART_PARITY_NONE #undef UART_PARITY_EVEN #undef UART_PARITY_ODD -// #define typeof(x) std::remove_volatile::type -#define typeof(x) decltype(x) -#include +#include +#include #include +#include +#include namespace { diff --git a/Sming/Components/arch_driver/src/include/driver/uart.h b/Sming/Components/arch_driver/src/include/driver/uart.h index 9df0d09753..3d8877560f 100644 --- a/Sming/Components/arch_driver/src/include/driver/uart.h +++ b/Sming/Components/arch_driver/src/include/driver/uart.h @@ -53,48 +53,97 @@ extern "C" { #define UART_PIN_DEFAULT (255) ///< Use default pin assignments #define UART_PIN_NO_CHANGE (-1) ///< Use default pin assignments -// Options for `config` argument of uart_init -#define UART_NB_BIT_MASK 0B00001100 -#define UART_NB_BIT_5 0B00000000 -#define UART_NB_BIT_6 0B00000100 -#define UART_NB_BIT_7 0B00001000 -#define UART_NB_BIT_8 0B00001100 - -#define UART_PARITY_MASK 0B00000011 -#define UART_PARITY_NONE 0B00000000 -#define UART_PARITY_EVEN 0B00000010 -#define UART_PARITY_ODD 0B00000011 - -#define UART_NB_STOP_BIT_MASK 0B00110000 -#define UART_NB_STOP_BIT_0 0B00000000 -#define UART_NB_STOP_BIT_1 0B00010000 -#define UART_NB_STOP_BIT_15 0B00100000 -#define UART_NB_STOP_BIT_2 0B00110000 - -#define UART_5N1 (UART_NB_BIT_5 | UART_PARITY_NONE | UART_NB_STOP_BIT_1) -#define UART_6N1 (UART_NB_BIT_6 | UART_PARITY_NONE | UART_NB_STOP_BIT_1) -#define UART_7N1 (UART_NB_BIT_7 | UART_PARITY_NONE | UART_NB_STOP_BIT_1) -#define UART_8N1 (UART_NB_BIT_8 | UART_PARITY_NONE | UART_NB_STOP_BIT_1) -#define UART_5N2 (UART_NB_BIT_5 | UART_PARITY_NONE | UART_NB_STOP_BIT_2) -#define UART_6N2 (UART_NB_BIT_6 | UART_PARITY_NONE | UART_NB_STOP_BIT_2) -#define UART_7N2 (UART_NB_BIT_7 | UART_PARITY_NONE | UART_NB_STOP_BIT_2) -#define UART_8N2 (UART_NB_BIT_8 | UART_PARITY_NONE | UART_NB_STOP_BIT_2) -#define UART_5E1 (UART_NB_BIT_5 | UART_PARITY_EVEN | UART_NB_STOP_BIT_1) -#define UART_6E1 (UART_NB_BIT_6 | UART_PARITY_EVEN | UART_NB_STOP_BIT_1) -#define UART_7E1 (UART_NB_BIT_7 | UART_PARITY_EVEN | UART_NB_STOP_BIT_1) -#define UART_8E1 (UART_NB_BIT_8 | UART_PARITY_EVEN | UART_NB_STOP_BIT_1) -#define UART_5E2 (UART_NB_BIT_5 | UART_PARITY_EVEN | UART_NB_STOP_BIT_2) -#define UART_6E2 (UART_NB_BIT_6 | UART_PARITY_EVEN | UART_NB_STOP_BIT_2) -#define UART_7E2 (UART_NB_BIT_7 | UART_PARITY_EVEN | UART_NB_STOP_BIT_2) -#define UART_8E2 (UART_NB_BIT_8 | UART_PARITY_EVEN | UART_NB_STOP_BIT_2) -#define UART_5O1 (UART_NB_BIT_5 | UART_PARITY_ODD | UART_NB_STOP_BIT_1) -#define UART_6O1 (UART_NB_BIT_6 | UART_PARITY_ODD | UART_NB_STOP_BIT_1) -#define UART_7O1 (UART_NB_BIT_7 | UART_PARITY_ODD | UART_NB_STOP_BIT_1) -#define UART_8O1 (UART_NB_BIT_8 | UART_PARITY_ODD | UART_NB_STOP_BIT_1) -#define UART_5O2 (UART_NB_BIT_5 | UART_PARITY_ODD | UART_NB_STOP_BIT_2) -#define UART_6O2 (UART_NB_BIT_6 | UART_PARITY_ODD | UART_NB_STOP_BIT_2) -#define UART_7O2 (UART_NB_BIT_7 | UART_PARITY_ODD | UART_NB_STOP_BIT_2) -#define UART_8O2 (UART_NB_BIT_8 | UART_PARITY_ODD | UART_NB_STOP_BIT_2) +/** + * @brief Number of UART data bits + */ +enum smg_uart_bits_t { + UART_NB_BIT_5 = 0, + UART_NB_BIT_6 = 1, + UART_NB_BIT_7 = 2, + UART_NB_BIT_8 = 3, +}; + +/** + * @brief UART parity setting + * + * Actually combines two bits: + * bit 1 is set for parity enable, clear if disabled + * bit 0 is set for even parity, clear for odd parity + */ +enum smg_uart_parity_t { + UART_PARITY_NONE = 0, + UART_PARITY_EVEN = 2, + UART_PARITY_ODD = 3, +}; + +/** + * @brief Number of UART stop bits + */ +enum smg_uart_stop_bits_t { + UART_NB_STOP_BIT_0 = 0, + UART_NB_STOP_BIT_1 = 1, + UART_NB_STOP_BIT_15 = 2, + UART_NB_STOP_BIT_2 = 3, +}; + +enum smg_uart_format_settings_t { + UART_PARITY_MASK = 0B00000011, + UART_PARITY_SHIFT = 0, + UART_NB_BIT_MASK = 0B00001100, + UART_NB_BIT_SHIFT = 2, + UART_NB_STOP_BIT_MASK = 0B00110000, + UART_NB_STOP_BIT_SHIFT = 4, +}; + +static inline constexpr uint8_t SMG_UART_FORMAT(smg_uart_bits_t databits, smg_uart_stop_bits_t stopbits, + smg_uart_parity_t parity) +{ + return (databits << UART_NB_BIT_SHIFT) | (stopbits << UART_NB_STOP_BIT_SHIFT) | (parity << UART_PARITY_SHIFT); +} + +/** + * @brief Structure for easier decomposing of `config` value + * + * Used by drivers to read config values + */ +union smg_uart_config_format_t { + struct { + smg_uart_parity_t parity : 2; + smg_uart_bits_t bits : 2; + smg_uart_stop_bits_t stop_bits : 2; + }; + uint8_t val; +}; + +/** + * @brief Options for `config` argument of uart_init + */ +enum smg_uart_format_t { + UART_5N1 = SMG_UART_FORMAT(UART_NB_BIT_5, UART_NB_STOP_BIT_1, UART_PARITY_NONE), + UART_6N1 = SMG_UART_FORMAT(UART_NB_BIT_6, UART_NB_STOP_BIT_1, UART_PARITY_NONE), + UART_7N1 = SMG_UART_FORMAT(UART_NB_BIT_7, UART_NB_STOP_BIT_1, UART_PARITY_NONE), + UART_8N1 = SMG_UART_FORMAT(UART_NB_BIT_8, UART_NB_STOP_BIT_1, UART_PARITY_NONE), + UART_5N2 = SMG_UART_FORMAT(UART_NB_BIT_5, UART_NB_STOP_BIT_2, UART_PARITY_NONE), + UART_6N2 = SMG_UART_FORMAT(UART_NB_BIT_6, UART_NB_STOP_BIT_2, UART_PARITY_NONE), + UART_7N2 = SMG_UART_FORMAT(UART_NB_BIT_7, UART_NB_STOP_BIT_2, UART_PARITY_NONE), + UART_8N2 = SMG_UART_FORMAT(UART_NB_BIT_8, UART_NB_STOP_BIT_2, UART_PARITY_NONE), + UART_5E1 = SMG_UART_FORMAT(UART_NB_BIT_5, UART_NB_STOP_BIT_1, UART_PARITY_EVEN), + UART_6E1 = SMG_UART_FORMAT(UART_NB_BIT_6, UART_NB_STOP_BIT_1, UART_PARITY_EVEN), + UART_7E1 = SMG_UART_FORMAT(UART_NB_BIT_7, UART_NB_STOP_BIT_1, UART_PARITY_EVEN), + UART_8E1 = SMG_UART_FORMAT(UART_NB_BIT_8, UART_NB_STOP_BIT_1, UART_PARITY_EVEN), + UART_5E2 = SMG_UART_FORMAT(UART_NB_BIT_5, UART_NB_STOP_BIT_2, UART_PARITY_EVEN), + UART_6E2 = SMG_UART_FORMAT(UART_NB_BIT_6, UART_NB_STOP_BIT_2, UART_PARITY_EVEN), + UART_7E2 = SMG_UART_FORMAT(UART_NB_BIT_7, UART_NB_STOP_BIT_2, UART_PARITY_EVEN), + UART_8E2 = SMG_UART_FORMAT(UART_NB_BIT_8, UART_NB_STOP_BIT_2, UART_PARITY_EVEN), + UART_5O1 = SMG_UART_FORMAT(UART_NB_BIT_5, UART_NB_STOP_BIT_1, UART_PARITY_ODD), + UART_6O1 = SMG_UART_FORMAT(UART_NB_BIT_6, UART_NB_STOP_BIT_1, UART_PARITY_ODD), + UART_7O1 = SMG_UART_FORMAT(UART_NB_BIT_7, UART_NB_STOP_BIT_1, UART_PARITY_ODD), + UART_8O1 = SMG_UART_FORMAT(UART_NB_BIT_8, UART_NB_STOP_BIT_1, UART_PARITY_ODD), + UART_5O2 = SMG_UART_FORMAT(UART_NB_BIT_5, UART_NB_STOP_BIT_2, UART_PARITY_ODD), + UART_6O2 = SMG_UART_FORMAT(UART_NB_BIT_6, UART_NB_STOP_BIT_2, UART_PARITY_ODD), + UART_7O2 = SMG_UART_FORMAT(UART_NB_BIT_7, UART_NB_STOP_BIT_2, UART_PARITY_ODD), + UART_8O2 = SMG_UART_FORMAT(UART_NB_BIT_8, UART_NB_STOP_BIT_2, UART_PARITY_ODD), +}; // Status values enum smg_uart_status_t {