9 namespace port = satcat5::port;
10 namespace util = satcat5::util;
14 #if __cplusplus < 201703L
22 inline u32 cmd_uart(u32 ref, u32 baud,
bool ignore_cts) {
23 static const u32 CTS_OVERRIDE = (1u << 31);
24 u32 flags = (ignore_cts ? CTS_OVERRIDE : 0);
27 inline u32 cmd_i2c_controller(u32 ref, u32 baud, u32 devaddr) {
29 return (devaddr << 16) | clkdiv;
31 inline u32 cmd_i2c_peripheral(u32 devaddr) {
32 return (devaddr << 16);
34 inline u32 cmd_spi_controller(u32 ref, u32 baud, u32 mode) {
36 return (mode << 8) | clkdiv;
38 inline u32 cmd_spi_peripheral(u32 mode, u32 gfilt) {
39 return (mode << 8) | gfilt;
43 static const unsigned REGADDR_STATUS = 0;
44 static const unsigned REGADDR_CLKREF = 1;
45 static const unsigned REGADDR_CTRL0 = 2;
46 static const unsigned REGADDR_CTRL1 = 3;
47 static const unsigned REGADDR_MODE = 4;
51 : m_ctrl(cfg->get_register(devaddr))
57 return (u8)m_ctrl[REGADDR_STATUS];
61 m_ctrl[REGADDR_MODE] = (u32)mode;
65 m_ctrl[REGADDR_CTRL1] = cmd_spi_peripheral(mode, gfilt);
69 u32 clk_hz = m_ctrl[REGADDR_CLKREF];
70 m_ctrl[REGADDR_CTRL0] = cmd_uart(clk_hz, baud, ignore_cts);
74 return (u8)m_ctrl[REGADDR_MODE];
78 u32 clk_hz = m_ctrl[REGADDR_CLKREF];
79 m_ctrl[REGADDR_CTRL0] = cmd_i2c_controller(clk_hz, baud, devaddr.
m_addr);
83 m_ctrl[REGADDR_CTRL0] = cmd_i2c_peripheral(devaddr.
m_addr);
87 u32 clk_hz = m_ctrl[REGADDR_CLKREF];
88 m_ctrl[REGADDR_CTRL0] = cmd_spi_controller(clk_hz, baud, mode);
92 m_ctrl[REGADDR_CTRL0] = cmd_spi_peripheral(mode, gfilt);
96 u32 clk_hz = m_ctrl[REGADDR_CLKREF];
97 m_ctrl[REGADDR_CTRL0] = cmd_uart(clk_hz, baud, ignore_cts);
static constexpr u8 MODE_AUTO
Constants for config_mode() and read_mode().
static constexpr u8 MODE_UART1
Constants for config_mode() and read_mode().
static constexpr u8 MODE_SPI
Constants for config_mode() and read_mode().
static constexpr u8 MODE_UART2
Constants for config_mode() and read_mode().
void config_spi(u8 mode, u8 gfilt=1)
Set the SPI clock mode (0/1/2/3) and glitch-filter parameters.
void config_mode(u8 mode)
Manually select auto/SPI/UART mode.
u8 read_mode()
Report the current mode (auto/SPI/UART).
void config_uart(unsigned baud, bool ignore_cts=false)
Set the UART baud rate and flow-control options.
u8 status()
Read the port-status register.
SerialGeneric(satcat5::cfg::ConfigBus *cfg, unsigned devaddr)
Link this object to a specific ConfigBus address.
void config_i2c(const satcat5::util::I2cAddr &devaddr, unsigned baud=100000)
Configure the remote I2C address and baud rate.
void config_i2c(const satcat5::util::I2cAddr &devaddr)
Configure the local I2C address.
void config_spi(unsigned baud, u8 mode)
Set the SPI baud-rate and clock mode (0/1/2/3).
void config_spi(u8 mode, u8 gfilt=1)
Set the SPI clock mode (0/1/2/3) and glitch-filter parameters.
void config_uart(unsigned baud, bool ignore_cts=false)
Set the UART baud rate and flow-control options.
Configuration for the various Ethernet-over-Serial ports.
Conversion function for I2C device addresses.
const u16 m_addr
Native internal address representation.
Miscellaneous mathematical utility functions.
constexpr u32 div_round_u32(u32 a, u32 b)
Integer division functions with various rounding options:
constexpr u32 div_ceil_u32(u32 a, u32 b)
Integer division functions with various rounding options: