Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change uart settings values and use enums #2387

Merged
merged 1 commit into from
Oct 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 11 additions & 12 deletions Sming/Arch/Esp32/Components/driver/uart.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,22 @@
uart.cpp - esp32 UART HAL
*/

#include <BitManipulations.h>

#include <driver/uart.h>
#include <driver/SerialBuffer.h>
#include <soc/uart_periph.h>
#include <soc/uart_channel.h>
#include <esp_heap_caps.h>

// These conflict with enumerated types defined in IDF - values are same though
// #define typeof(x) std::remove_volatile<decltype(x)>::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 <hal/uart_ll.h>
#undef UART_PARITY_NONE
#undef UART_PARITY_EVEN
#undef UART_PARITY_ODD

// #define typeof(x) std::remove_volatile<decltype(x)>::type
#define typeof(x) decltype(x)
#include <hal/uart_ll.h>
#include <driver/uart.h>
#include <driver/SerialBuffer.h>
#include <driver/periph_ctrl.h>
#include <soc/uart_channel.h>
#include <BitManipulations.h>

namespace
{
Expand Down
133 changes: 91 additions & 42 deletions Sming/Components/arch_driver/src/include/driver/uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down