From f354d17c7f15dcbc8c5b07fe2f950df3cb4552b2 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 7 Nov 2022 22:23:44 -0800 Subject: [PATCH] metro-m0: Demo pin interrupts Prints 'pressed' whenever D0 goes low. Signed-off-by: Keith Packard --- src/metro-m0/ao_pins.h | 5 +---- src/metro-m0/metro-m0.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/metro-m0/ao_pins.h b/src/metro-m0/ao_pins.h index c9a88275..1f7daae9 100644 --- a/src/metro-m0/ao_pins.h +++ b/src/metro-m0/ao_pins.h @@ -39,11 +39,8 @@ #define AO_AHB_PRESCALER 1 #define AO_APBA_PRESCALER 1 +#define HAS_SPI_0 1 #define HAS_SPI_5 1 -#define SPI_5_PB22_PB23_PB03 1 - -#define HAS_SPI_4 1 -#define SPI_4_PB10_PB11_PA12 1 /* * SPI Flash memory diff --git a/src/metro-m0/metro-m0.c b/src/metro-m0/metro-m0.c index 80f43672..1a5d3c60 100644 --- a/src/metro-m0/metro-m0.c +++ b/src/metro-m0/metro-m0.c @@ -15,6 +15,7 @@ #include #include #include +#include #define SNEK_CS_PORT (&samd21_port_a) #define SNEK_CS_PIN (11) @@ -41,6 +42,33 @@ const struct ao_cmds ao_spi_cmds[] = { { 0, NULL }, }; +static int pressed; + +static void +ao_button_callback(void) +{ + pressed = 1; + ao_wakeup(&pressed); +} + +static void +ao_button(void) +{ + ao_exti_setup(&samd21_port_a, 11, AO_EXTI_MODE_FALLING | AO_EXTI_MODE_PULL_UP, ao_button_callback); + ao_exti_enable(&samd21_port_a, 11); + for (;;) { + ao_arch_block_interrupts(); + pressed = 0; + while (!pressed) + ao_sleep(&pressed); + ao_arch_release_interrupts(); + printf("pressed\n"); + fflush(stdout); + } +} + +static struct ao_task ao_button_task; + int main(void) { ao_led_init(); @@ -48,12 +76,14 @@ int main(void) ao_task_init(); ao_timer_init(); ao_dma_init(); + ao_exti_init(); ao_spi_init(); ao_usb_init(); ao_cmd_register(ao_spi_cmds); ao_spi_init_cs(&samd21_port_a, 1 << 11); /* analog 8 for CS */ ao_storage_init(); ao_cmd_init(); + ao_add_task(&ao_button_task, ao_button, "button"); ao_start_scheduler(); return 0; } -- 2.30.2