commit - 42dfc04af51c29c3853644328b33f070c0f46f0c
commit + 69da5ffe1eeea1c4e88eaa4bbc4ce4ab4e296c94
blob - eafe421c10a35b5ef633100ee47fcee4c7b02880
blob + e12fb16f4c3017b5c462c6b4c4b43279565a4098
--- include/uart16550.h
+++ include/uart16550.h
namespace Uart16550 {
-enum Register {
- INTERRUPT_ENABLE_REGISTER = 0x04,
- MODEM_CONTROL_REGISTER = 0x10,
- LINE_STATUS_REGISTER = 0x14,
-};
-
-
struct InterruptEnableRegister {
union _U {
struct _Bits {
{
m_u.m_nValue = nValue;
}
+
+ static constexpr auto OFFSET = 0x04;
};
static_assert(sizeof(InterruptEnableRegister) == 1, "should be byte");
+struct FifoControlRegister {
+ union _U {
+ struct _Bits {
+ uint8_t m_EnableFifos : 1;
+ uint8_t m_RcvrFifoReset : 1;
+ uint8_t m_XmitFifoReset : 1;
+ uint8_t m_DmaMode : 1;
+ uint8_t m_TxEmptyTrigger : 2;
+ uint8_t m_RcvrTrigger : 2;
+ } m_Bits;
+ uint8_t m_nValue;
+ } m_u;
+
+ explicit FifoControlRegister(uint8_t nValue = 0)
+ {
+ m_u.m_nValue = nValue;
+ }
+
+ static constexpr auto OFFSET = 0x08;
+};
+static_assert(sizeof(FifoControlRegister) == 1, "should be byte");
+
+
struct ModemControlRegister {
union _U {
struct _Bits {
{
m_u.m_nValue = nValue;
}
+
+ static constexpr auto OFFSET = 0x10;
};
static_assert(sizeof(ModemControlRegister) == 1, "should be byte");
{
m_u.m_nValue = nValue;
}
+
+ static constexpr auto OFFSET = 0x14;
};
static_assert(sizeof(LineStatusRegister) == 1, "should be byte");
blob - c1fd4791e78f489855b40d6ee017d9fd57b40a3f
blob + 2e8d89e89f1d6851336fc4fe2137e6450fdac72c
--- uart_a64.cc
+++ uart_a64.cc
static_assert(CLOCK_DIVISOR == 13, "Should be 13");
+
+template <typename T>
+T read()
+{
+ return T{Hw::read8(UART0_BASE + T::OFFSET)};
+}
+
+
+template <typename T>
+void write(T Register)
+{
+ Hw::write8(UART0_BASE + T::OFFSET, Register.m_u.m_nValue);
+}
+
+
} // anonymous namespace
{
for (; ; )
{
- const Uart16550::LineStatusRegister LineStatusRegister {
- Hw::read8(UART0_BASE + Uart16550::LINE_STATUS_REGISTER)
- };
+ const auto LineStatusRegister{read<Uart16550::LineStatusRegister>()};
if (LineStatusRegister.m_u.m_Bits.m_TransmitterEmpty)
break;
}
- const Uart16550::InterruptEnableRegister InterruptEnableRegister{};
- Hw::write8(UART0_BASE + Uart16550::INTERRUPT_ENABLE_REGISTER, InterruptEnableRegister.m_u.m_nValue);
+ write(Uart16550::InterruptEnableRegister{});
Uart16550::ModemControlRegister ModemControlRegister;
ModemControlRegister.m_u.m_Bits.m_DataTerminalReady = 1;
ModemControlRegister.m_u.m_Bits.m_RequestToSend = 1;
- Hw::write8(UART0_BASE + Uart16550::MODEM_CONTROL_REGISTER, ModemControlRegister.m_u.m_nValue);
+ write(ModemControlRegister);
+
+ Uart16550::FifoControlRegister FifoControlRegister;
+ FifoControlRegister.m_u.m_Bits.m_EnableFifos = 1;
+ FifoControlRegister.m_u.m_Bits.m_RcvrFifoReset = 1;
+ FifoControlRegister.m_u.m_Bits.m_XmitFifoReset = 1;
+ write(FifoControlRegister);
}