23 uint32_t OutputMask = 0xFFFF'FFFF,
29 uint32_t InputMask = OutputMask,
34 uint32_t OutputEnableMask = OutputMask,
39 uint32_t PcIntMask = InputMask>
44 uint32_t debouncedInput;
45 uint32_t outputEnable;
51 enum [[clang::flag_enum]] : uint32_t
58 enum [[clang::flag_enum]] PcIntMode : uint32_t
66 static constexpr uint32_t PcIntModeBits = 2;
68 enum [[clang::flag_enum]] : uint32_t
83 constexpr static uint32_t
gpio_bit(uint32_t index, uint32_t mask)
85 return (1 << index) & mask;
96 const uint32_t Bit =
gpio_bit(index, OutputMask);
99 output = output | Bit;
103 output = output & ~Bit;
114 const uint32_t Bit =
gpio_bit(index, OutputEnableMask);
117 outputEnable = outputEnable | Bit;
121 outputEnable = outputEnable & ~Bit;
155 const uint32_t Bit =
gpio_bit(index, PcIntMask);
158 pcintMask = pcintMask | Bit;
162 pcintMask = pcintMask & ~Bit;
190 void clear_interrupt_status()
volatile
204 return (input &
gpio_bit(index, InputMask)) > 0;
216 return (debouncedInput &
gpio_bit(index, InputMask)) > 0;
219 bool read_interrupt_status()
volatile
236struct SonataGpioBoard :
SonataGpioBase<0x0000'00FF, 0x0001'FFFF, 0x0000'0000>
247 enum [[clang::flag_enum]] JoystickDirection : uint16_t
262 JoystickDirection direction;
265 JoystickValue(JoystickDirection direction) : direction(direction) {}
267 bool is_direction_pressed(JoystickDirection direction)
269 return this->direction & direction;
274 return is_direction_pressed(JoystickDirection::Left);
279 return is_direction_pressed(JoystickDirection::Up);
284 return is_direction_pressed(JoystickDirection::Pressed);
289 return is_direction_pressed(JoystickDirection::Down);
294 return is_direction_pressed(JoystickDirection::Right);
302 return direction != static_cast<JoystickDirection>(0);
312 enum Outputs : uint32_t
323 enum Inputs : uint32_t
325 DipSwitches = (0xFFu << 0),
326 Joystick = (0x1Fu << 8),
327 SoftwareSelectSwitches = (0x7u << 13),
328 MicroSdCardDetection = (0x1u << 16),
334 static constexpr uint32_t FirstLED = 0;
338 static constexpr uint32_t LastLED = 7;
342 static constexpr uint32_t LEDCount = LastLED - FirstLED + 1;
346 static constexpr uint32_t LEDMask = static_cast<uint32_t>(Outputs::Leds);
351 constexpr static uint32_t led_bit(uint32_t index)
353 return gpio_bit(index + FirstLED, LEDMask);
359 void led_on(uint32_t index) volatile
361 output = output | led_bit(index);
367 void led_off(uint32_t index) volatile
369 output = output & ~led_bit(index);
375 void led_toggle(uint32_t index) volatile
377 output = output ^ led_bit(index);
383 static constexpr uint32_t FirstSwitch = 0;
387 static constexpr uint32_t LastSwitch = 7;
391 static constexpr uint32_t SwitchCount = LastSwitch - FirstSwitch + 1;
395 static constexpr uint32_t SwitchMask =
396 static_cast<uint32_t>(Inputs::DipSwitches);
401 constexpr static uint32_t switch_bit(uint32_t index)
403 return gpio_bit(index + FirstSwitch, SwitchMask);
409 bool read_switch(uint32_t index) volatile
411 return (input & switch_bit(index)) > 0;
417 JoystickValue read_joystick() volatile
419 return {static_cast<JoystickDirection>(input & Inputs::Joystick)};
423using SonataGpioRaspberryPiHat = SonataGpioBase<0x0FFF'FFFF>;
425using SonataGpioPmod = SonataGpioBase<0x0000'00FF>;
426using SonataGpioPmod0 = SonataGpioPmod;
427using SonataGpioPmod1 = SonataGpioPmod;
432typedef SonataGpioBoard SonataGPIO;
Utility class to delete copy and move contructors.
A simple driver for the Sonata's GPIO.
void set_interrupt(uint32_t index, bool enable) volatile
Only GPIO pins explicitly enabled can trigger an interrupt.
void change_interrupt_mode(enum PcIntMode mode) volatile
Select the pin-change interrupt mode.
void debounce_interrupt(bool debounce) volatile
Whether to use the raw or debounced input for the GPIO pin-change interrupt.
void set_output(uint32_t index, bool value) volatile
Set the output bit for a given GPIO pin index to a specified value.
void enable_interrupts(bool enable) volatile
Enable GPIO pin-change interrupts for this instance.
bool read_debounced_input(uint32_t index) volatile
Read the debounced input value for a given GPIO pin index.
void clear_interrupt_mask() volatile
Clear the GPIO pin-change interrupt mask.
static constexpr uint32_t gpio_bit(uint32_t index, uint32_t mask)
Returns a mask with a single bit set corresponding to the given GPIO index or 0 if that bit is not se...
void set_output_enable(uint32_t index, bool enable) volatile
Set the output enable bit for a given GPIO pin index.
bool read_input(uint32_t index) volatile
Read the input value for a given GPIO pin index.
Miscellaneous utility functions and classes.