Hi (mostly Prafulla)! I'm looking at detecting cold starts on the OpenRD board (and also maintain the bootcounter via this). I've come up with a slight hack which works in practice for me, but which feels a bit unsafe.
What I do is basically to reset the SYSRST duration counter just before doing the soft reset in reset_cpu() (see patch below, I do a similar thing in Linux). I've then added the following function to the board code: #if defined(CONFIG_MISC_INIT_R) # define MS_TO_COUNT(x) ( ((x) * 1000 * 1000) / 40) int misc_init_r (void) { u32 rst_count = 0x1fffffff & readl(KW_REG_SYSRST_CNT); struct uboot_com *p = (struct uboot_com *)CONFIG_BOOTCOUNT_ADDR; /* clear the counter for next valid read*/ writel(1 << 31, KW_REG_SYSRST_CNT); /* If the reset has been held for over 20ms it's a cold-start, * wait for 40 to be sure * * FIXME! This should rely one some more safe metric for the future */ if ( rst_count > MS_TO_COUNT(40) ) { printf("Start type: cold\n"); p->bootcount_magic = 0x12345678; /* Clear the bootcount magic */ p->is_coldstart = is_coldstart = 1; } else { printf("Start type: warm\n"); p->is_coldstart = is_coldstart = 0; } return 0; } #endif i.e., just check how long the reset was held at startup. If it's longer than an empirically determined value (~40ms), then it's a cold start. Pressing the reset button, I always get cold starts (even when tapping as fast as I can), while soft resets are always warm. But... Isn't there some better way of checking this on Kirkwood? // Simon [PATCH] Reset sysrst count before restarting Signed-off-by: Simon Kagstrom <simon.kagst...@netinsight.net> --- cpu/arm926ejs/kirkwood/cpu.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/cpu/arm926ejs/kirkwood/cpu.c b/cpu/arm926ejs/kirkwood/cpu.c index bab5faf..d0cdaf6 100644 --- a/cpu/arm926ejs/kirkwood/cpu.c +++ b/cpu/arm926ejs/kirkwood/cpu.c @@ -37,6 +37,7 @@ void reset_cpu(unsigned long ignored) writel(readl(&cpureg->rstoutn_mask) | (1 << 2), &cpureg->rstoutn_mask); + writel(1 << 31, KW_REG_SYSRST_CNT); writel(readl(&cpureg->sys_soft_rst) | 1, &cpureg->sys_soft_rst); while (1) ; -- 1.6.0.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot