rtc: initialize emulated RTC from environment variable

Up to now the emulated RTC is initialized using the U-Boot build time.

With this patch the environment variable 'rtc_emul_epoch' can be used to
provide a better initial time. The variable is a decimal string with
the number of seconds since 1970-01-01. Here is an example where the RTC
had not been probed yet:

    => setenv rtc_emul_epoch 1610109000
    => date
    Date: 2021-01-08 (Friday)    Time: 12:30:00

If the variable does not exist, the U-Boot build time is used as fallback.

The environment variable may be set when shutting down the operating system
if the U-Boot environment is exposed to the OS (cf. ENV_IS_IN_FAT and
ENV_IS_IN_EXT4).

Suggested-by: Pablo Sebastián Greco <pgreco@centosproject.org>
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
Heinrich Schuchardt 2020-10-30 03:27:22 +01:00
parent 0ca4b558b5
commit fb71c3f490
2 changed files with 20 additions and 7 deletions

View File

@ -68,11 +68,14 @@ config RTC_EMULATION
depends on DM_RTC
help
On a board without hardware clock this software real time clock can be
used. The build time is used to initialize the RTC. So you will have
to adjust the time either manually using the 'date' command or use
the 'sntp' to update the RTC with the time from a network time server.
See CONFIG_CMD_SNTP and CONFIG_BOOTP_NTPSERVER. The RTC time is
advanced according to CPU ticks.
used. The initial time may be provided via the environment variable
'rtc_emul_epoch' as a decimal string indicating seconds since
1970-01-01. If the environment variable is missing, the build time is
used to initialize the RTC. The time can be adjusted manually via the
'date' command or the 'sntp' command can be used to update the RTC
with the time from a network time server. See CONFIG_CMD_SNTP and
CONFIG_BOOTP_NTPSERVER. The RTC time is advanced according to CPU
ticks.
config RTC_ISL1208
bool "Enable ISL1208 driver"

View File

@ -8,6 +8,7 @@
#include <common.h>
#include <div64.h>
#include <dm.h>
#include <env.h>
#include <generated/timestamp_autogenerated.h>
#include <rtc.h>
@ -60,9 +61,18 @@ static int emul_rtc_set(struct udevice *dev, const struct rtc_time *time)
int emul_rtc_probe(struct udevice *dev)
{
struct emul_rtc *priv = dev_get_priv(dev);
const char *epoch_str;
u64 epoch;
/* Use the build date as initial time */
priv->offset_us = U_BOOT_EPOCH * 1000000ULL - timer_get_us();
epoch_str = env_get("rtc_emul_epoch");
if (epoch_str) {
epoch = simple_strtoull(epoch_str, NULL, 10);
} else {
/* Use the build date as initial time */
epoch = U_BOOT_EPOCH;
}
priv->offset_us = epoch * 1000000ULL - timer_get_us();
priv->isdst = -1;
return 0;