Customizing U-Boot on i.MX
Published on October 22, 2010
Many of our customers have needs at the boot loader level that differ slightly from our standard releases. Some choose to track these changes in their own version control systems and periodically pull in updates from our git repository. If the custom changes are large, this makes perfect sense. If the changes are really small, we've introduced a new way of doing things that allows overrides of the board configuration file 'include/configs/nitrogen.h', which accounts for the vast majority of our customers' needs. This patch in our git repository shows the details, and the comment describes the limitations:
The purpose of this is to not pollute the git history of the board in order to override one or two settings. If things get complicated, use a branch instead.
Let's walk through an example. One of our customers wants to gracefully and automatically handle the situation where either there's an intermittent SD card failure at boot time or an SD card has been removed from the Nitrogen. They want to show a message on the screen, but attempt to recover by re-booting. This can be done by overriding the bootcmd
environment variable, which shows up in the C code as CONFIG_BOOTCMD
.
They also don't want to pause to wait for a user to break the boot on the serial console. This change involves the U-Boot environment variable bootdelay
and shows up as CONFIG_BOOTDELAY
in the U-Boot sources.
#ifndef __CUSTOM_H__ #define __CUSTOM_H__ #ifdef CONFIG_BOOTDELAY #undef CONFIG_BOOTDELAY #endif #define CONFIG_BOOTDELAY 0 #ifdef CONFIG_BOOTCOMMAND #undef CONFIG_BOOTCOMMAND #endif #define CONFIG_BOOTCOMMAND "fatload mmc 0 90008000 nitrogen_bootscript && source 90008000 ; echo failed ; lecho SD card error ; sleep 2 ; reset ; reset" #endif
To compile this, you specify the name of the custom header file during configuration and then build as normal:
user@host:~/u-boot$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- CUSTOM_CONFIG=~/u-boot-custom.h nitrogen_config
user@host:~/u-boot$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all
Note that this particular setup will make it difficult to use U-Boot, and is suggested only for production use. During development, you'll want to have a version that does allow you to get to a prompt.