CRC32 verification on NAND flash

Trent Piepho trent.piepho at
Thu Sep 23 02:55:40 PDT 2021

On Tue, Sep 21, 2021 at 7:11 AM Yunus Bas <Y.Bas at> wrote:
> Here an example:
> The startpage of slot1 is 0x240000. This is the real address, where
> Barebox is flashed into and can also be dumped using the original
> nand0-partition. Now, when a bad-block occurs prior to the startpage of
> slot1, let's take for example the block at 0x140000, then offset of
> slot1 changes also in the partition. In the original partition
> nand0, slot1 is still at 0x240000, but on, slot1 has been
> moved one block prior to the original offset and changed to 0x220000.

If you partition nand, via e.g. device tree entries, those partition
start offsets are non-BB aware, so do not move.

So if I write X pages to partition 0 BB and read back X pages, I will
know the crc.  And the same for partition 1, even if some blocks in
partition 0 are bad.

But these "slots" you talk about, I think these are not nand
partitions.  Maybe more like the two bootloader slots in an IMX boot

If the position of the slots is determined dynamically at flash time,
then I think your answer is you must also determine it when you check
CRC.  For instance, on imx one could create a command that queries the
FCB to find the two bootloader slot start addresses.  Code is already
there in the imx bbu handler, it just needs an interface.  Or,
something had to determine this dynamic address of the slot, so have
that process also tell you what it determined.  For example, have the
imx bbu code set env variables with the address of the bootloader
slots that it calculates when it flashes barebox.

If you want to calculate one CRC value for all of NAND, then I think
you can not do that.  Because the contents of the entire nand flash
chip are not constant.  Instead have a list of CRCs and lengths for
the parts you have actually flashed.  Most of flash is usually blank
anyway, why even flash blank space?  It just slows down manufacturing.

You must just find the start location for these lengths of data that
have CRCs.  As above, nand partitions start at a constant location, so
this is easy.  Dynamically determined locations one would need to:
query location if it is stored somewhere, have code that determined
the location also provide the value to the verification code, or
repeat the calculation by which the location was determined in the
first place to independently arrive at the same answer.

More information about the barebox mailing list