px4iofirmware: make forceupdate more reliable

this schedules a reboot rather than rebooting immediately, which means
the FMU gets an ACK for its reboot operation, preventing it from
timing out waiting for the ACK. That makes the timing of the reboot
more consistent, which makes it more reliable for forceupdate
This commit is contained in:
Andrew Tridgell
2014-01-07 09:30:56 +01:00
committed by Lorenz Meier
parent 76477b2057
commit 1a13e66aab
3 changed files with 29 additions and 9 deletions
+21
View File
@@ -125,6 +125,25 @@ heartbeat_blink(void)
LED_BLUE(heartbeat = !heartbeat); LED_BLUE(heartbeat = !heartbeat);
} }
static uint64_t reboot_time;
/**
schedule a reboot in time_delta_usec microseconds
*/
void schedule_reboot(uint32_t time_delta_usec)
{
reboot_time = hrt_absolute_time() + time_delta_usec;
}
/**
check for a scheduled reboot
*/
static void check_reboot(void)
{
if (reboot_time != 0 && hrt_absolute_time() > reboot_time) {
up_systemreset();
}
}
static void static void
calculate_fw_crc(void) calculate_fw_crc(void)
@@ -249,6 +268,8 @@ user_start(int argc, char *argv[])
heartbeat_blink(); heartbeat_blink();
} }
check_reboot();
#if 0 #if 0
/* check for debug activity */ /* check for debug activity */
show_debug_messages(); show_debug_messages();
+4
View File
@@ -220,3 +220,7 @@ extern volatile uint8_t debug_level;
/** send a debug message to the console */ /** send a debug message to the console */
extern void isr_debug(uint8_t level, const char *fmt, ...); extern void isr_debug(uint8_t level, const char *fmt, ...);
/** schedule a reboot */
extern void schedule_reboot(uint32_t time_delta_usec);
+4 -9
View File
@@ -519,15 +519,10 @@ registers_set_one(uint8_t page, uint8_t offset, uint16_t value)
if (value != PX4IO_REBOOT_BL_MAGIC) if (value != PX4IO_REBOOT_BL_MAGIC)
break; break;
// note that we don't set BL_WAIT_MAGIC in // we schedule a reboot rather than rebooting
// BKP_DR1 as that is not necessary given the // immediately to allow the IO board to ACK
// timing of the forceupdate command. The // the reboot command
// bootloader on px4io waits for enough time schedule_reboot(100000);
// anyway, and this method works with older
// bootloader versions (tested with both
// revision 3 and revision 4).
up_systemreset();
break; break;
case PX4IO_P_SETUP_DSM: case PX4IO_P_SETUP_DSM: