pru: Support config_reset command to manually reset mcu

Add support for resetting the MCU via a software only mechanism.  This
is useful on the PRU.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor
2017-09-03 22:02:48 -04:00
parent 7b7f57e01c
commit 7083a33ecd
6 changed files with 52 additions and 12 deletions

View File

@@ -215,6 +215,25 @@ command_finalize_config(uint32_t *args)
}
DECL_COMMAND(command_finalize_config, "finalize_config crc=%u");
// Attempt a full manual reset of the config
void
config_reset(uint32_t *args)
{
if (! sched_is_shutdown())
shutdown("config_reset only available when shutdown");
irq_disable();
config_crc = 0;
oid_count = 0;
oids = NULL;
move_free_list = NULL;
move_list = NULL;
move_count = move_item_size = 0;
alloc_init();
sched_timer_reset();
sched_clear_shutdown();
irq_enable();
}
/****************************************************************
* Timing and load stats

View File

@@ -10,6 +10,7 @@ void *oid_lookup(uint8_t oid, void *type);
void *oid_alloc(uint8_t oid, void *type, uint16_t size);
void *oid_next(uint8_t *i, void *type);
void stats_update(uint32_t start, uint32_t cur);
void config_reset(uint32_t *args);
#define foreach_oid(pos,data,oidtype) \
for (pos=-1; (data=oid_next(&pos, oidtype)); )

View File

@@ -212,6 +212,9 @@ struct my_resource_table {
* Startup
****************************************************************/
// Support config_reset
DECL_COMMAND_FLAGS(config_reset, HF_IN_SHUTDOWN, "config_reset");
// Main entry point
int
main(void)

View File

@@ -165,8 +165,8 @@ sched_timer_dispatch(void)
return next_waketime;
}
// Remove all user timers on a shutdown
static void
// Remove all user timers
void
sched_timer_reset(void)
{
timer_list = &deleted_timer;

View File

@@ -29,6 +29,7 @@ struct task_wake {
void sched_add_timer(struct timer*);
void sched_del_timer(struct timer *del);
unsigned int sched_timer_dispatch(void);
void sched_timer_reset(void);
void sched_wake_tasks(void);
uint8_t sched_tasks_busy(void);
void sched_wake_task(struct task_wake *w);