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:
@@ -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
|
||||
|
||||
@@ -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)); )
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user