canboot_main: Rework "complete" handling

Convert the "complete" command to use a regular task instead of custom
code in enter_bootloader().

Perform the reboot based on a timer so that it is not necessary to
query the low-level code for ack transmission status.

Use jump_to_application() instead of canbus_reboot() to start the user
code.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2022-05-10 15:05:40 -04:00 committed by Eric Callahan
parent 21469fea3e
commit 09a500cf90
4 changed files with 12 additions and 25 deletions

View File

@ -7,7 +7,6 @@
#include <string.h> // strlen #include <string.h> // strlen
#include "autoconf.h" // CONFIG_* #include "autoconf.h" // CONFIG_*
#include "board/misc.h" // udelay #include "board/misc.h" // udelay
#include "board/canbus.h" // canbus_send
#include "board/flash.h" // flash_read_block #include "board/flash.h" // flash_read_block
#include "board/gpio.h" // gpio_in_setup #include "board/gpio.h" // gpio_in_setup
#include "canboot_main.h" // canboot_main #include "canboot_main.h" // canboot_main
@ -18,7 +17,8 @@
#define REQUEST_SIG 0x5984E3FA6CA1589B // Random request sig #define REQUEST_SIG 0x5984E3FA6CA1589B // Random request sig
static uint8_t complete = 0; static uint8_t complete;
static uint32_t complete_endtime;
void void
command_complete(uint32_t *data) command_complete(uint32_t *data)
@ -26,8 +26,17 @@ command_complete(uint32_t *data)
uint32_t out[3]; uint32_t out[3];
command_respond_ack(CMD_COMPLETE, out, ARRAY_SIZE(out)); command_respond_ack(CMD_COMPLETE, out, ARRAY_SIZE(out));
complete = 1; complete = 1;
complete_endtime = timer_read_time() + timer_from_us(100000);
} }
void
complete_task(void)
{
if (complete && timer_is_before(complete_endtime, timer_read_time()))
jump_to_application();
}
DECL_TASK(complete_task);
void void
command_connect(uint32_t *data) command_connect(uint32_t *data)
{ {
@ -93,16 +102,8 @@ enter_bootloader(void)
{ {
sched_run_init(); sched_run_init();
for (;;) { for (;;)
sched_run_tasks(); sched_run_tasks();
if (complete && canbus_tx_clear())
// wait until we are complete and the ack has returned
break;
}
// Flash Complete, system reset
udelay(100000);
canbus_reboot();
} }
// Main loop of program // Main loop of program

View File

@ -22,12 +22,6 @@ static uint8_t canbus_uuid[CANBUS_UUID_LEN];
static struct task_wake canbus_tx_wake; static struct task_wake canbus_tx_wake;
static uint8_t transmit_buf[96], transmit_pos, transmit_max; static uint8_t transmit_buf[96], transmit_pos, transmit_max;
uint8_t
canbus_tx_clear(void)
{
return transmit_pos >= transmit_max;
}
void void
canbus_notify_tx(void) canbus_notify_tx(void)
{ {

View File

@ -11,13 +11,11 @@
int canbus_read(uint32_t *id, uint8_t *data); int canbus_read(uint32_t *id, uint8_t *data);
int canbus_send(uint32_t id, uint32_t len, uint8_t *data); int canbus_send(uint32_t id, uint32_t len, uint8_t *data);
void canbus_set_filter(uint32_t id); void canbus_set_filter(uint32_t id);
void canbus_reboot(void);
// canbus.c // canbus.c
void canbus_notify_tx(void); void canbus_notify_tx(void);
void canbus_notify_rx(void); void canbus_notify_rx(void);
void canbus_process_data(uint32_t id, uint32_t len, uint8_t *data); void canbus_process_data(uint32_t id, uint32_t len, uint8_t *data);
void canbus_set_uuid(void *data); void canbus_set_uuid(void *data);
uint8_t canbus_tx_clear(void);
#endif // canbus.h #endif // canbus.h

View File

@ -268,12 +268,6 @@ compute_btr(uint32_t pclock, uint32_t bitrate)
return make_btr(sjw, time_seg1, time_seg2, brp); return make_btr(sjw, time_seg1, time_seg2, brp);
} }
void
canbus_reboot(void)
{
NVIC_SystemReset();
}
void void
can_init(void) can_init(void)
{ {