From 731e2ab24755b3706daf7d64eaa53f2ec0512277 Mon Sep 17 00:00:00 2001 From: Gregwar Date: Thu, 24 Apr 2014 10:15:05 +0200 Subject: Adding ROBOTIS "make install" and reset hook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Grégoire Passault --- wirish/usb_serial.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'wirish') diff --git a/wirish/usb_serial.cpp b/wirish/usb_serial.cpp index d21766f..3bb1923 100644 --- a/wirish/usb_serial.cpp +++ b/wirish/usb_serial.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -179,6 +180,7 @@ static void ifaceSetupHook(unsigned hook, void *requestvp) { return; } +#if defined(BOOTLOADER_maple) // We need to see a negative edge on DTR before we start looking // for the in-band magic reset byte sequence. uint8 dtr = usb_cdcacm_get_dtr(); @@ -196,13 +198,25 @@ static void ifaceSetupHook(unsigned hook, void *requestvp) { reset_state = dtr ? DTR_HIGH : DTR_LOW; break; } +#endif + +#if defined(BOOTLOADER_robotis) + uint8 dtr = usb_cdcacm_get_dtr(); + uint8 rts = usb_cdcacm_get_rts(); + + if (rts && !dtr) { + reset_state = DTR_NEGEDGE; + } +#endif } #define RESET_DELAY 100000 +#if defined(BOOTLOADER_maple) static void wait_reset(void) { delay_us(RESET_DELAY); nvic_sys_reset(); } +#endif #define STACK_TOP 0x20000800 #define EXC_RETURN 0xFFFFFFF9 @@ -215,7 +229,12 @@ static void rxHook(unsigned hook, void *ignored) { if (usb_cdcacm_data_available() >= 4) { // The magic reset sequence is "1EAF". +#if defined(BOOTLOADER_maple) static const uint8 magic[4] = {'1', 'E', 'A', 'F'}; +#endif +#if defined(BOOTLOADER_robotis) + static const uint8 magic[4] = {'C', 'M', '9', 'X'}; +#endif uint8 chkBuf[4]; // Peek at the waiting bytes, looking for reset sequence, @@ -227,6 +246,7 @@ static void rxHook(unsigned hook, void *ignored) { } } +#if defined(BOOTLOADER_maple) // Got the magic sequence -> reset, presumably into the bootloader. // Return address is wait_reset, but we must set the thumb bit. uintptr_t target = (uintptr_t)wait_reset | 0x1; @@ -251,6 +271,12 @@ static void rxHook(unsigned hook, void *ignored) { [exc_return] "r" (EXC_RETURN), [cpsr] "r" (DEFAULT_CPSR) : "r0", "r1", "r2"); +#endif + +#if defined(BOOTLOADER_robotis) + iwdg_init(IWDG_PRE_4, 10); +#endif + /* Can't happen. */ ASSERT_FAULT(0); } -- cgit v1.2.3