Added basic structure to support interrupt driven operation
This commit is contained in:
19
hardware.hpp
19
hardware.hpp
@@ -19,7 +19,8 @@ enum class Driven {
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <class Registers, typename CtrlFlagsA, typename CtrlFlagsB, typename CtrlFlagsC, class cfg, Mode mode>
|
||||
template <class Registers, typename CtrlFlagsA, typename CtrlFlagsB, typename CtrlFlagsC, class cfg, Mode mode,
|
||||
Driven driven>
|
||||
class Hardware {
|
||||
public:
|
||||
static void init() FORCE_INLINE
|
||||
@@ -35,15 +36,16 @@ class Hardware {
|
||||
constexpr auto modeVal = calcMode();
|
||||
constexpr auto enableRx = calcRxState<true>();
|
||||
constexpr auto enableTx = calcTxState<true>();
|
||||
constexpr auto interruptVal = calcInterrupt();
|
||||
|
||||
constexpr uint8_t controlRegB = dataBitsVal.regBVal | enableRx | enableTx;
|
||||
constexpr uint8_t controlRegB = dataBitsVal.regBVal | enableRx | enableTx | interruptVal;
|
||||
constexpr uint8_t controlRegC = dataBitsVal.regCVal | parityVal | stopBitsVal | modeVal;
|
||||
|
||||
*Registers::CTRL_STAT_REG_B = controlRegB;
|
||||
*Registers::CTRL_STAT_REG_C = controlRegC;
|
||||
}
|
||||
|
||||
static void txByte(typename cfg::data_t byte) FORCE_INLINE
|
||||
static void txByteBlocking(typename cfg::data_t byte) FORCE_INLINE
|
||||
{
|
||||
while (!(*Registers::CTRL_STAT_REG_A & (1 << CtrlFlagsA::DATA_REG_EMPTY)))
|
||||
;
|
||||
@@ -146,6 +148,17 @@ class Hardware {
|
||||
|
||||
return enableVal;
|
||||
}
|
||||
|
||||
static constexpr auto calcInterrupt()
|
||||
{
|
||||
uint8_t interruptVal = 0;
|
||||
|
||||
if (driven == Driven::INTERRUPT)
|
||||
interruptVal |= (1 << CtrlFlagsB::DATA_REG_EMPTY_INT_ENABLE) | (1 << CtrlFlagsB::RX_INT_ENABLE) |
|
||||
(1 << CtrlFlagsB::TX_INT_ENABLE);
|
||||
|
||||
return interruptVal;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
Reference in New Issue
Block a user