30template <
typename T, u
intptr_t Addr,
typename Fields>
36 static_assert(
sizeof(Fields) ==
sizeof(
type),
"");
49 static type volatile*
r() noexcept
51 return (
type volatile*)Addr;
79 operator type() const noexcept
85# if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
88# define ZTH_REG_BITFIELDS(...) REVERSE(__VA_ARGS__)
90# define ZTH_REG_BITFIELDS(...) __VA_ARGS__
116# define ZTH_REG_DEFINE(T, name, addr, fields...) \
117 struct name##__type { \
118 T ZTH_REG_BITFIELDS(fields); \
119 } __attribute__((packed)); \
120 struct name : public zth::Register<T, addr, name##__type> { \
121 typedef zth::Register<T, addr, name##__type> base; \
122 using typename base::type; \
126 constexpr explicit name(type v) noexcept \
Helper class to read/write (bitfields in) hardware registers.
static type volatile * r() noexcept
constexpr Register(type v) noexcept
void write(type v) noexcept
type read() const noexcept
void write(type v) const noexcept
void write() const noexcept