sched: Call timer_setup() from sched_main()

Create a board specific timer_setup() function and call it at the
start of sched_main().

Move udelay() from board code to sched.c.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2022-05-14 12:13:16 -04:00 committed by Eric Callahan
parent 97dfa9a1d1
commit 721a036b9d
8 changed files with 20 additions and 28 deletions

View File

@ -6,11 +6,12 @@
#include <string.h> // strlen #include <string.h> // strlen
#include "autoconf.h" // CONFIG_* #include "autoconf.h" // CONFIG_*
#include "board/misc.h" // udelay
#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 "board/misc.h" // set_bootup_code
#include "bootentry.h" // bootentry_check #include "bootentry.h" // bootentry_check
#include "ctr.h" // DECL_CTR #include "ctr.h" // DECL_CTR
#include "sched.h" // udelay
#define REQUEST_SIG 0x5984E3FA6CA1589B // Random request sig #define REQUEST_SIG 0x5984E3FA6CA1589B // Random request sig

View File

@ -35,16 +35,10 @@ timer_read_time(void)
return DWT->CYCCNT; return DWT->CYCCNT;
} }
// Implement simple early-boot delay mechanism // Initialize the timer
void void
udelay(uint32_t usecs) timer_setup(void)
{ {
if (!(CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk)) {
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
} }
uint32_t end = timer_read_time() + timer_from_us(usecs);
while (timer_is_before(timer_read_time(), end))
;
}

View File

@ -12,8 +12,7 @@ uint64_t get_bootup_code(void);
void set_bootup_code(uint64_t code); void set_bootup_code(uint64_t code);
void jump_to_application(void); void jump_to_application(void);
void timer_init(void); void timer_setup(void);
void udelay(uint32_t usecs);
uint32_t timer_from_us(uint32_t us); uint32_t timer_from_us(uint32_t us);
uint8_t timer_is_before(uint32_t time1, uint32_t time2); uint8_t timer_is_before(uint32_t time1, uint32_t time2);

View File

@ -24,9 +24,6 @@ void
led_init(void) led_init(void)
{ {
led = gpio_out_setup(led_gpio, led_gpio_high); led = gpio_out_setup(led_gpio, led_gpio_high);
// The short delay is simply to ensure that the Debug Timer is
// enabled
udelay(10);
last_blink_time = timer_read_time(); last_blink_time = timer_read_time();
} }
DECL_INIT(led_init); DECL_INIT(led_init);

View File

@ -9,6 +9,15 @@
#include "bootentry.h" // bootentry_check #include "bootentry.h" // bootentry_check
#include "sched.h" // sched_check_periodic #include "sched.h" // sched_check_periodic
// Implement simple delay mechanism
void
udelay(uint32_t usecs)
{
uint32_t end = timer_read_time() + timer_from_us(usecs);
while (timer_is_before(timer_read_time(), end))
;
}
// Wrapper for Klipper compatibility // Wrapper for Klipper compatibility
void void
sched_wake_tasks(void) sched_wake_tasks(void)
@ -36,6 +45,7 @@ sched_check_wake(struct task_wake *w)
void void
sched_main(void) sched_main(void)
{ {
timer_setup();
if (!bootentry_check()) if (!bootentry_check())
jump_to_application(); jump_to_application();

View File

@ -17,6 +17,7 @@ struct task_wake {
}; };
// sched.c // sched.c
void udelay(uint32_t usecs);
void sched_wake_tasks(void); void sched_wake_tasks(void);
void sched_wake_task(struct task_wake *w); void sched_wake_task(struct task_wake *w);
uint8_t sched_check_wake(struct task_wake *w); uint8_t sched_check_wake(struct task_wake *w);

View File

@ -7,7 +7,6 @@
#include "autoconf.h" // CONFIG_CLOCK_REF_FREQ #include "autoconf.h" // CONFIG_CLOCK_REF_FREQ
#include "board/armcm_boot.h" // armcm_main #include "board/armcm_boot.h" // armcm_main
#include "board/irq.h" // irq_disable #include "board/irq.h" // irq_disable
#include "board/misc.h" // timer_init
#include "command.h" // DECL_CONSTANT_STR #include "command.h" // DECL_CONSTANT_STR
#include "internal.h" // enable_pclock #include "internal.h" // enable_pclock
#include "sched.h" // sched_main #include "sched.h" // sched_main
@ -159,6 +158,5 @@ armcm_main(void)
SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;
#endif #endif
timer_init();
sched_main(); sched_main();
} }

View File

@ -73,8 +73,9 @@ TIMx_IRQHandler(void)
irq_enable(); irq_enable();
} }
// Initialize the timer
void void
timer_init(void) timer_setup(void)
{ {
irqstatus_t flag = irq_save(); irqstatus_t flag = irq_save();
enable_pclock((uint32_t)TIMx); enable_pclock((uint32_t)TIMx);
@ -104,12 +105,3 @@ timer_is_before(uint32_t time1, uint32_t time2)
{ {
return (int32_t)(time1 - time2) < 0; return (int32_t)(time1 - time2) < 0;
} }
// Implement simple early-boot delay mechanism
void
udelay(uint32_t usecs)
{
uint32_t end = timer_read_time() + timer_from_us(usecs);
while (timer_is_before(timer_read_time(), end))
;
}