[U-Boot] a few questions about saving bootcount in the environment

Robert P. J. Day rpjday at crashcourse.ca
Tue Jul 26 14:21:28 CEST 2016


On Mon, 25 Jul 2016, Heiko Schocher wrote:

... snip ...

> Yep ... why do we need "upgrade_available"?
>
> in ./common/autoboot.c on *every* boot bootcount_store() gets
> called, so on every boot (which can happen very often) the Environment
> would be written ... not good, for long life of your product (if
> you have the Env in raw nand flash for example, as for the siemens
> boards)
>
> If the bootcounter feature is only needed if you really did an
> update, to most writtes are unnecessary ... so the Userspace App can
> set also "upgrade_available" to enable the bootcount feature in case
> we save the bootcounter in the Environment ... and save a lot of
> writtes to the Env
>
> But if you say "I don;t care how often I write the Environment" you
> simply can set "upgrade_available" to 1 and have the "original"
> behaviour of the bootcount feature (incrementing bootcount on each
> reboot ...)

  ok, i am now *totally* confused, so let's start at the beginning.
it's my understanding that selecting CONFIG_BOOTCOUNT_LIMIT means you
want to use the boot counter, it does *not* select what method you
want to use to store the boot counter, correct? but here's the
confusing part.

  if i look in common/autoboot.c, i see:

    const char *bootdelay_process(void)
    {
          char *s;
          int bootdelay;
    #ifdef CONFIG_BOOTCOUNT_LIMIT
          unsigned long bootcount = 0;
          unsigned long bootlimit = 0;
    #endif /* CONFIG_BOOTCOUNT_LIMIT */

    #ifdef CONFIG_BOOTCOUNT_LIMIT
          bootcount = bootcount_load();
          bootcount++;
          bootcount_store(bootcount);
          setenv_ulong("bootcount", bootcount);      <----- ?????
          bootlimit = getenv_ulong("bootlimit", 10, 0);
    #endif /* CONFIG_BOOTCOUNT_LIMIT */

          ... snip ...

and that's what confuses the heck out of me. i thought that, depending
on the technique i wanted to use to store the boot counter (RAM, I2C,
whatever), it would use *exclusively* that technique, and while i can
see the use of the routines bootcount_load() and bootcount_store(),
which are redefined based on the technique you select:

  $ grep -rw bootcount_store *
  bootcount_at91.c:void bootcount_store(ulong a)
  bootcount_blackfin.c:void bootcount_store(ulong cnt)
  bootcount.c:__weak void bootcount_store(ulong a)
  bootcount_davinci.c:void bootcount_store(ulong a)
  bootcount_env.c:void bootcount_store(ulong a)
  bootcount_i2c.c:void bootcount_store(ulong a)
  bootcount_i2c.c:	bootcount_store(0);
  bootcount_ram.c:void bootcount_store(ulong a)
  $

it appears that, no matter what, the environment *is* updated every
single time because of this line in the bootdelay_process() routine:

  setenv_ulong("bootcount", bootcount);

why? it seems, from the above, that no matter what boot counter
mechanism you use, the environment will be updated because of that
line.

  i can certainly see in bootcount_env.c where using
"upgrade_available" can deselect writing to the environment based on
invoking bootcount_store(), but that in no way stops that explicit
call to setenv_ulong() in that routine above.

  so how am i misunderstanding this? it seems that no matter what boot
counter storage mechanism i select, i'll be writing to the environment
every time *anyway*.

rday

-- 

========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                        http://crashcourse.ca

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================





More information about the U-Boot mailing list