summaryrefslogtreecommitdiffhomepage
path: root/digital/io-hub/src/apbirthday
diff options
context:
space:
mode:
authorNicolas Schodet2013-05-01 00:54:10 +0200
committerNicolas Schodet2013-05-01 00:54:10 +0200
commit3e8898eb008be3fa11a6d312102d27f3daf55a77 (patch)
tree20123106594cdd1ca953d2e01d3e4655836c7033 /digital/io-hub/src/apbirthday
parent6ba10be3492959fa052eaa98b2ff0935f09b6d24 (diff)
digital/io-hub/src/apbirthday: add !b to go to bootloader
Diffstat (limited to 'digital/io-hub/src/apbirthday')
-rw-r--r--digital/io-hub/src/apbirthday/hardware.hh2
-rw-r--r--digital/io-hub/src/apbirthday/hardware.host.cc6
-rw-r--r--digital/io-hub/src/apbirthday/hardware.stm32.cc20
-rw-r--r--digital/io-hub/src/apbirthday/robot.cc4
4 files changed, 32 insertions, 0 deletions
diff --git a/digital/io-hub/src/apbirthday/hardware.hh b/digital/io-hub/src/apbirthday/hardware.hh
index 44ded0df..818ca769 100644
--- a/digital/io-hub/src/apbirthday/hardware.hh
+++ b/digital/io-hub/src/apbirthday/hardware.hh
@@ -111,6 +111,8 @@ struct Hardware
void zb_handle ();
// Handle zb programmation from specific stream.
void zb_handle (ucoo::Stream &s);
+ // Go to bootloader.
+ void bootloader ();
};
#endif // hardware_hh
diff --git a/digital/io-hub/src/apbirthday/hardware.host.cc b/digital/io-hub/src/apbirthday/hardware.host.cc
index 4226281f..9e074f7c 100644
--- a/digital/io-hub/src/apbirthday/hardware.host.cc
+++ b/digital/io-hub/src/apbirthday/hardware.host.cc
@@ -100,3 +100,9 @@ Hardware::zb_handle (ucoo::Stream &s)
// No zb on host.
}
+void
+Hardware::bootloader ()
+{
+ // No bootloader on host.
+}
+
diff --git a/digital/io-hub/src/apbirthday/hardware.stm32.cc b/digital/io-hub/src/apbirthday/hardware.stm32.cc
index b5123038..e60ebf78 100644
--- a/digital/io-hub/src/apbirthday/hardware.stm32.cc
+++ b/digital/io-hub/src/apbirthday/hardware.stm32.cc
@@ -25,6 +25,7 @@
#include <libopencm3/stm32/f4/rcc.h>
#include <libopencm3/stm32/f4/timer.h>
+#include <libopencm3/cm3/scb.h>
#include "ucoolib/hal/gpio/gpio.hh"
#include "zb_avrisp.stm32.hh"
@@ -153,3 +154,22 @@ Hardware::zb_handle (ucoo::Stream &s)
zb_uart.enable (38400, ucoo::Uart::EVEN, 1);
}
+void
+Hardware::bootloader ()
+{
+ // Reset every peripherals.
+ RCC_AHB1RSTR = 0xffffffff;
+ RCC_AHB2RSTR = 0xffffffff;
+ RCC_APB1RSTR = 0xffffffff;
+ RCC_APB2RSTR = 0xffffffff;
+ RCC_AHB1RSTR = 0;
+ RCC_AHB2RSTR = 0;
+ RCC_APB1RSTR = 0;
+ RCC_APB2RSTR = 0;
+ // Jump to bootloader.
+ uint32_t bootloader_address = 0x080e0000;
+ SCB_VTOR = bootloader_address & 0x1fffff;
+ asm volatile ("msr msp, %0" : : "r" (* (uint32_t *) bootloader_address));
+ (*(void (**) ()) (bootloader_address + 4)) ();
+}
+
diff --git a/digital/io-hub/src/apbirthday/robot.cc b/digital/io-hub/src/apbirthday/robot.cc
index 727976c8..76545a9a 100644
--- a/digital/io-hub/src/apbirthday/robot.cc
+++ b/digital/io-hub/src/apbirthday/robot.cc
@@ -221,6 +221,10 @@ Robot::proto_handle (ucoo::Proto &proto, char cmd, const uint8_t *args, int size
// Reset.
ucoo::arch_reset ();
break;
+ case c ('b', 0):
+ // Reset to bootloader.
+ hardware.bootloader ();
+ break;
case c ('Z', 0):
// Enter zigbit update from uart.
proto.send ('Z');