diff --git a/atusb/fw/board.h b/atusb/fw/board.h index 90fb584..cd94e24 100644 --- a/atusb/fw/board.h +++ b/atusb/fw/board.h @@ -81,6 +81,7 @@ uint64_t timer_read(void); void timer_init(void); int gpio(uint8_t port, uint8_t data, uint8_t dir, uint8_t mask, uint8_t *res); +void gpio_cleanup(void); void board_init(void); void board_app_init(void); diff --git a/atusb/fw/board_app.c b/atusb/fw/board_app.c index 3721e8b..17859f8 100644 --- a/atusb/fw/board_app.c +++ b/atusb/fw/board_app.c @@ -93,7 +93,7 @@ void timer_init(void) int gpio(uint8_t port, uint8_t data, uint8_t dir, uint8_t mask, uint8_t *res) { - EIMSK = 0; /* must reset to recover INT_RF */ + EIMSK = 0; /* recover INT_RF to ATUSB_GPIO_CLEANUP or an MCU reset */ switch (port) { case 1: @@ -138,6 +138,12 @@ int gpio(uint8_t port, uint8_t data, uint8_t dir, uint8_t mask, uint8_t *res) } +void gpio_cleanup(void) +{ + EIMSK = 1 << 0; +} + + ISR(INT0_vect) { static uint8_t irq; diff --git a/atusb/fw/ep0.c b/atusb/fw/ep0.c index 656870b..83ab075 100644 --- a/atusb/fw/ep0.c +++ b/atusb/fw/ep0.c @@ -125,6 +125,9 @@ static int my_setup(const struct setup_request *setup) return 0; usb_send(&eps[0], buf, 3, NULL, NULL); return 1; + case ATUSB_TO_DEV(ATUSB_GPIO_CLEANUP): + gpio_cleanup(); + return 1; case ATUSB_TO_DEV(ATUSB_SLP_TR): debug("ATUSB_SLP_TR\n"); diff --git a/atusb/fw/include/atusb/ep0.h b/atusb/fw/include/atusb/ep0.h index 4775c3c..391b114 100644 --- a/atusb/fw/include/atusb/ep0.h +++ b/atusb/fw/include/atusb/ep0.h @@ -27,6 +27,7 @@ * ->host ATUSB_TIMER - - #bytes (6) * ->host ATUSB_GPIO dir+data mask+p# 3 * host-> ATUSB_SLP_TR - - 0 + * host-> ATUSB_GPIO_CLEANUP - - 0 * * host-> ATUSB_REG_WRITE value addr 0 * ->host ATUSB_REG_READ - addr 1 @@ -80,6 +81,7 @@ enum atspi_requests { ATUSB_TIMER, ATUSB_GPIO, ATUSB_SLP_TR, + ATUSB_GPIO_CLEANUP, ATUSB_REG_WRITE = 0x20, /* transceiver group */ ATUSB_REG_READ, ATUSB_BUF_WRITE,