/uboot-bootcount

Read and reset the u-boot 'bootcount' register on various ARM platforms

Primary LanguageCGNU General Public License v3.0GPL-3.0

U-Boot Bootcount userspace program

U-Boot supports a boot count scheme that can be used to detect multiple failed attempts to boot Linux.

Some platforms have persistent registers that survive soft-resets. This tool provides a means to read and write the bootcount value to the register on several supported platforms (see below).

On platforms without register support, this will look for a Device-Tree EEPROM.
The I2C bus, address and EEPROM offset are defined at build-time in src/i2c_eeprom.h.

Platform detection is perfomed by looking at the value of /proc/device-tree/soc/compatible.

Usage

If invoked without any args, bootcount will read and print the current value to stdout. When passing the -r flag, it will reset the bootcount value

~ # bootcount -s 42  # set value
~ # bootcount        # read present bootcount value
42
~ # bootcount -r     # Reset to 0.  Exit status 0 means success
~ # bootcount
0
~ # bootcount -f     # sets bootcount to UINT16_MAX - 1
~ # bootcount
65534
~ # bootcount -d     # platform & method detection
Detected TI AM335x

Set the DEBUG environment variable to get debugging data on stdout. Example:

~ $ DEBUG=1 sudo -E bootcount -f
DEBUG: DEBUG=1
DEBUG: Read from /proc/device-tree/soc/compatible: ti,omap-infra
DEBUG: Using EEPROM? 0
DEBUG: Action=force
DEBUG: Write value 65534

Development

Assuming you're doing a cross-build from x86 host to ARM target:

./autogen.sh
./configure --host=arm-linux-gnueabihf --prefix=/usr
make
make install DESTDIR=$LOCATION_OF_CHROOT

During development, periodically run autoscan to detect if changes should be made to configure.ac.

Supported Platforms

For all supported chipsets below, the required u-boot config settings are set by default when choosing the respective build target. For I2C EEPROM, config settings are listed below.

TI AM335x

On TI AM335x, the RTC_SCRATCH2_REG register is used.

Compatible platforms:

  • ti,am33xx

STM32 MP15x

STM32 chipsets in the MP15x series use the TAMP_BKP21R register.

Compatible platforms:

  • st,stm32mp153
  • st,stm32mp157

NXP iMX8

NXP iMX8 uses the SNVS_LP GPR0 register.

Compatible platforms:

  • fsl,imx8mm
  • fsl,imx8mn
  • fsl,imx8mp
  • fsl,imx8mq

I2C EEPROM

Chipsets without a dedicated register can use I2C EEPROM.

For I2C EEPROM, use the following u-boot config settings:

CONFIG_BOOTCOUNT_LIMIT=y
CONFIG_DM_BOOTCOUNT=y
CONFIG_DM_BOOTCOUNT_I2C_EEPROM=y
CONFIG_SYS_I2C_MVTWSI=y
CONFIG_MISC=y
CONFIG_I2C_EEPROM=y
CONFIG_I2C_SET_DEFAULT_BUS_NUM=y
CONFIG_I2C_DEFAULT_BUS_NUMBER=0x02
CONFIG_SYS_I2C_EEPROM_ADDR=0x50
CONFIG_SPL_I2C=y
CONFIG_CMD_EEPROM=y
CONFIG_SYS_I2C_EEPROM_BUS=2
CONFIG_SYS_EEPROM_SIZE=1024

This bootcount program will look for i2c EEPROM at /sys/bus/i2c/devices/2-0050/eeprom, if none of the above platforms are detected. Bus and address are defined in i2c_eeprom.h.

Further Reading