diff --git a/arch/sim/src/sim/sim_initialize.c b/arch/sim/src/sim/sim_initialize.c index 45584ed8ed339..94a7aedc79404 100644 --- a/arch/sim/src/sim/sim_initialize.c +++ b/arch/sim/src/sim/sim_initialize.c @@ -266,6 +266,14 @@ void up_initialize(void) sim_init_cmdline(); #endif +#ifdef CONFIG_RTC_DRIVER + /* Register the RTC after clock_initialize() has synchronized system + * time. + */ + + sim_rtc_initialize(); +#endif + /* Register some tty-port to access tty-port on sim platform */ sim_uartinit(); diff --git a/arch/sim/src/sim/sim_internal.h b/arch/sim/src/sim/sim_internal.h index 3ca70b65e9421..719f26a37eb17 100644 --- a/arch/sim/src/sim/sim_internal.h +++ b/arch/sim/src/sim/sim_internal.h @@ -276,6 +276,12 @@ int sim_init_func_call_ipi(int irq); void sim_timer_update(void); #endif +/* sim_rtc.c ****************************************************************/ + +#ifdef CONFIG_RTC_DRIVER +int sim_rtc_initialize(void); +#endif + /* sim_uart.c ***************************************************************/ void sim_uartinit(void); diff --git a/arch/sim/src/sim/sim_rtc.c b/arch/sim/src/sim/sim_rtc.c index 10f5c745f65c9..656ae070d29df 100644 --- a/arch/sim/src/sim/sim_rtc.c +++ b/arch/sim/src/sim/sim_rtc.c @@ -59,6 +59,7 @@ static struct rtc_lowerhalf_s g_sim_rtc = .ops = &g_sim_rtc_ops, }; +static struct rtc_lowerhalf_s *g_sim_rtc_lower; static int64_t g_sim_delta; /**************************************************************************** @@ -134,6 +135,28 @@ int up_rtc_initialize(void) rtc = rpmsg_rtc_initialize(); sync = false; #endif + + g_sim_rtc_lower = rtc; up_rtc_set_lowerhalf(rtc, sync); - return rtc_initialize(0, rtc); + return OK; +} + +/**************************************************************************** + * Name: sim_rtc_initialize + * + * Description: + * Register the SIM RTC driver after the system clock has been initialized. + * This ensures that the /dev/rtc0 inode receives a valid timestamp. + * + * Input Parameters: + * None + * + * Returned Value: + * Zero (OK) on success; a negated errno on failure + * + ****************************************************************************/ + +int sim_rtc_initialize(void) +{ + return rtc_initialize(0, g_sim_rtc_lower); }