From 42dae8dde24305326ce800ca102687f17f53fa63 Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Mon, 9 May 2011 23:52:00 -0300 Subject: [PATCH] atusb/fw: implemented ATUSB_RESET - board.c (board_init): disable the watchdog timer (tricky !) - board.h (reset_cpu), board.c: enable the watchdog timer to cause a CPU reset - ep0.c (my_setup): uncommented and updated ATUSB_RESET handler --- atusb/fw/board.c | 13 +++++++++++++ atusb/fw/board.h | 1 + atusb/fw/ep0.c | 4 +--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/atusb/fw/board.c b/atusb/fw/board.c index bf96ea4..82c8a04 100644 --- a/atusb/fw/board.c +++ b/atusb/fw/board.c @@ -61,6 +61,12 @@ void reset_rf(void) } +void reset_cpu(void) +{ + WDTCSR = 1 << WDE; +} + + uint8_t read_irq(void) { return PIN(IRQ_RF); @@ -90,6 +96,13 @@ void panic(void) void board_init(void) { + /* Disable the watchdog timer */ + + MCUSR = 0; /* Remove override */ + WDTCSR |= 1 << WDCE; /* Enable change */ + WDTCSR = 1 << WDCE; /* Disable watchdog while still enabling + change */ + /* We start with a 1 MHz/8 clock. Disable the prescaler. */ CLKPR = 1 << CLKPCE; diff --git a/atusb/fw/board.h b/atusb/fw/board.h index 988e94c..50852bc 100644 --- a/atusb/fw/board.h +++ b/atusb/fw/board.h @@ -63,6 +63,7 @@ void reset_rf(void); +void reset_cpu(void); uint8_t read_irq(void); void led(int on); diff --git a/atusb/fw/ep0.c b/atusb/fw/ep0.c index 78695c9..e456be5 100644 --- a/atusb/fw/ep0.c +++ b/atusb/fw/ep0.c @@ -82,12 +82,10 @@ static int my_setup(const struct setup_request *setup) usb_send(&eps[0], buf+i, size, NULL, NULL); return 1; -#ifdef NOTYET case ATUSB_TO_DEV(ATUSB_RESET): debug("ATUSB_RESET\n"); - RSTSRC = SWRSF; + reset_cpu(); while (1); -#endif case ATUSB_TO_DEV(ATUSB_RF_RESET): debug("ATUSB_RF_RESET\n");