summaryrefslogtreecommitdiffhomepage
path: root/digital/io-hub/src/apbirthday
diff options
context:
space:
mode:
authorNicolas Schodet2013-05-01 12:51:10 +0200
committerNicolas Schodet2013-05-01 12:51:46 +0200
commita90882ab6912fc85436b9a5b5ae51d3b2007ed3e (patch)
treef539044c543b3273359681e511bb8cb1bca68568 /digital/io-hub/src/apbirthday
parent13aa76d23158b33a375f87479ffe6d0f577e5d2c (diff)
digital/io-hub/src/apbirthday: compute code CRC
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.cc7
-rw-r--r--digital/io-hub/src/apbirthday/hardware.stm32.cc12
-rw-r--r--digital/io-hub/src/apbirthday/robot.cc4
4 files changed, 25 insertions, 0 deletions
diff --git a/digital/io-hub/src/apbirthday/hardware.hh b/digital/io-hub/src/apbirthday/hardware.hh
index 818ca769..911ea1ca 100644
--- a/digital/io-hub/src/apbirthday/hardware.hh
+++ b/digital/io-hub/src/apbirthday/hardware.hh
@@ -113,6 +113,8 @@ struct Hardware
void zb_handle (ucoo::Stream &s);
// Go to bootloader.
void bootloader ();
+ // Compute code CRC.
+ uint32_t crc ();
};
#endif // hardware_hh
diff --git a/digital/io-hub/src/apbirthday/hardware.host.cc b/digital/io-hub/src/apbirthday/hardware.host.cc
index 9e074f7c..7ebee185 100644
--- a/digital/io-hub/src/apbirthday/hardware.host.cc
+++ b/digital/io-hub/src/apbirthday/hardware.host.cc
@@ -106,3 +106,10 @@ Hardware::bootloader ()
// No bootloader on host.
}
+uint32_t
+Hardware::crc ()
+{
+ // No CRC on host.
+ return 0;
+}
+
diff --git a/digital/io-hub/src/apbirthday/hardware.stm32.cc b/digital/io-hub/src/apbirthday/hardware.stm32.cc
index e60ebf78..9c7bb089 100644
--- a/digital/io-hub/src/apbirthday/hardware.stm32.cc
+++ b/digital/io-hub/src/apbirthday/hardware.stm32.cc
@@ -27,6 +27,7 @@
#include <libopencm3/stm32/f4/timer.h>
#include <libopencm3/cm3/scb.h>
#include "ucoolib/hal/gpio/gpio.hh"
+#include "ucoolib/utils/crc.hh"
#include "zb_avrisp.stm32.hh"
@@ -173,3 +174,14 @@ Hardware::bootloader ()
(*(void (**) ()) (bootloader_address + 4)) ();
}
+extern unsigned _data_loadaddr, _data, _edata;
+
+uint32_t
+Hardware::crc ()
+{
+ int binsize = ((int) &_data_loadaddr & 0x1fffff)
+ + (int) &_edata - (int) &_data;
+ const uint8_t *binaddr = (const uint8_t *) 0x08000000;
+ return ucoo::crc32_compute (binaddr, binsize);
+}
+
diff --git a/digital/io-hub/src/apbirthday/robot.cc b/digital/io-hub/src/apbirthday/robot.cc
index 76545a9a..598881a0 100644
--- a/digital/io-hub/src/apbirthday/robot.cc
+++ b/digital/io-hub/src/apbirthday/robot.cc
@@ -225,6 +225,10 @@ Robot::proto_handle (ucoo::Proto &proto, char cmd, const uint8_t *args, int size
// Reset to bootloader.
hardware.bootloader ();
break;
+ case c ('c', 0):
+ // Compute code CRC.
+ proto.send ('c', "L", hardware.crc ());
+ break;
case c ('Z', 0):
// Enter zigbit update from uart.
proto.send ('Z');