diff options
author | Lorenz Meier <lm@inf.ethz.ch> | 2013-12-21 19:07:24 +0100 |
---|---|---|
committer | Lorenz Meier <lm@inf.ethz.ch> | 2013-12-21 19:07:24 +0100 |
commit | b84c9f962b5c3c4d94e21aeb148dec8ffb42b0c9 (patch) | |
tree | ed00e4ce697f96763964267a9dc5870b06a1ffa4 /src/modules/px4iofirmware/px4io.c | |
parent | c033443208666d6972d99fe5a7b8e0c3fa5050b5 (diff) | |
parent | 831f153b7385fecb180c977727eb6b2f8bef1317 (diff) | |
download | px4-firmware-b84c9f962b5c3c4d94e21aeb148dec8ffb42b0c9.tar.gz px4-firmware-b84c9f962b5c3c4d94e21aeb148dec8ffb42b0c9.tar.bz2 px4-firmware-b84c9f962b5c3c4d94e21aeb148dec8ffb42b0c9.zip |
Merged master
Diffstat (limited to 'src/modules/px4iofirmware/px4io.c')
-rw-r--r-- | src/modules/px4iofirmware/px4io.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/modules/px4iofirmware/px4io.c b/src/modules/px4iofirmware/px4io.c index cd9bd197b..745bd5705 100644 --- a/src/modules/px4iofirmware/px4io.c +++ b/src/modules/px4iofirmware/px4io.c @@ -45,6 +45,7 @@ #include <string.h> #include <poll.h> #include <signal.h> +#include <crc32.h> #include <drivers/drv_pwm_output.h> #include <drivers/drv_hrt.h> @@ -124,6 +125,22 @@ heartbeat_blink(void) LED_BLUE(heartbeat = !heartbeat); } + +static void +calculate_fw_crc(void) +{ +#define APP_SIZE_MAX 0xf000 +#define APP_LOAD_ADDRESS 0x08001000 + // compute CRC of the current firmware + uint32_t sum = 0; + for (unsigned p = 0; p < APP_SIZE_MAX; p += 4) { + uint32_t bytes = *(uint32_t *)(p + APP_LOAD_ADDRESS); + sum = crc32part((uint8_t *)&bytes, sizeof(bytes), sum); + } + r_page_setup[PX4IO_P_SETUP_CRC] = sum & 0xFFFF; + r_page_setup[PX4IO_P_SETUP_CRC+1] = sum >> 16; +} + int user_start(int argc, char *argv[]) { @@ -136,6 +153,9 @@ user_start(int argc, char *argv[]) /* configure the high-resolution time/callout interface */ hrt_init(); + /* calculate our fw CRC so FMU can decide if we need to update */ + calculate_fw_crc(); + /* * Poll at 1ms intervals for received bytes that have not triggered * a DMA event. |