The Flash-N-Go infrastructure (or FnG infrastructure) is a software product for NXP i.MX Edge devices created by SECO Nothern Europe. It has been used for SAN* devices like, Santoka, Santino, Santaro,…Consisting of three parts, Flash-N-Go Boot, Flash-N-Go System and Flash-N-Go Update it provides a convenient way of booting, flashing, testing and updating edge devices.
Where is …
What is …
What is Flash-N-Go System?
Flash-N-Go System is a versatile Linux distribution to aid with the initial installation, production test and upgrade tasks but is limited to a small set of features. It is sometimes coined a management or recovery system. Flash-N-Go System is the backbone of the Flash-N-Go infrastructure.
It is designed to run entirely from RAM and can modify the whole non-volatile memory (eMMC). This enables the user to upgrade anything from inside a Linux based environment.
Pre-installed in the factory, Flash-N-Go System can be used in the field and during development to upgrade the devices and possibly install all components from scratch.
In production, Flash-N-Go System is used to conduct the production test. This de-couples the testing process from the target-end system and makes it possible to test devices with customer-specific OS configurations, with limited testing capabilities.
What is Flash-N-Go Boot?
Flash-N-Go Boot is a simple, non-interactive and open-source bootloader for i.MX6 and i.MX6ULL devices. With its condensed functionalities, it is capable of initializing the RAM dynamically and booting Linux, Android, and Windows CE.
Even though it uses a serial port to output informative and debugging messages, it does not provide any kind of console interface, network drivers, display drivers or even the capability to write any data to storage media. All installation, configuration, update and other maintenance tasks usually provided by bootloaders like RedBoot, U-Boot, or Barebox are missing in Flash-N-Go Boot on purpose and provided by Flash-N-Go System instead, which is always expected to be installed on a device using Flash-N-Go Boot.
All actions necessary to boot any kind of OS are controlled by one of two simple ASCII-text boot-scripts, which Flash-N-Go Boot looks for in all FAT12/16/32-partitions on the storage medium it is booted from itself. Normally Flash-N-Go Boot looks for a boot-script called boot.cfg
. In three special cases it looks for a boot-script called boot-alt.cfg, instead:
if no
boot.cfg
can be found or loaded and executed successfully,if the bootmode-button of the device is pressed during power-up or reset, or
if some software - usually a tool called
bootselect
provided in any OS - has set a special flag in a particular place of non-volatile storage of the system.
Flash-N-Go Boot itself only uses the SoC-internal SRAM for its code and all runtime heap, stack, and data. All other RAM-areas of a device are free to use by boot-scripts and operating systems and as soon as Flash-N-Go Boot has started another binary executable, this, in turn, may also use the SoC-internal SRAM for its own purposes.
By using Flash-N-Go Boot it is possible to use different DDR-memory hardware without adapting the bootloader to the specific RAM configuration, and this makes the SD-RAM equipment of embedded board very flexible. Pre-initialization and matching of the bootloader to board or RAM isn’t necessary.
What is Flash-N-Go Update?
The Flash-N-Go Update software tool provides an update solution for Flash-N-Go System based i.MX6 devices.
Normally coming as a USB flash drive, it uses an auto-start feature of the device to bring up the graphical update process. The available operating systems can be directly downloaded if the device is setup up with internet access and by this provides a way to implement an OTA update behaviour.
Basic Flash-N-Go Architecture
The following figure shows the basic boot-up and file system structure of a Flash-N-Go Boot based system.
The Flash-N-Go architecture consists of the bootloader, the recovery, device-specific data and the target operating system. Flash-N-Go System and the target system may use the device-specific data to initialize and configure hardware interfaces like display, touch and network interfaces.
The first stage bootloader Flash-N-Go Boot initializes the board and decides which OS needs to be booted. The decision is based on the availability of boot-able systems, the hardware boot-mode switch and the internal bootselect
setting. The internal boot select setting is stored on the battery-backed RTC, and thus independent of the non-volatile Flash memory (eMMC), but may be impacted by changing the battery.
A regular target OS is booted iff:
A FAT32 partition is available containing a valid
boot.cfg
fileThe
bootselect
setting set to "regular
" or "initialized
".The boot mode button is not pressed.
Otherwise, the Flash-N-Go Boot bootloader will try to load the Flash-N-Go System that resides in a FAT partition containing the boot-alt.cfg
file.
Flash-N-Go System is a RAM-based system and is loaded completely into SD-RAM memory by the bootloader and runs from the volatile memory. Thus changes made inside the FnG System, like changes inside the /etc
directory will not be stored and lost after reboot. This guarantees a consistent environment after boot and provides a good basis for production tests and installing software.
Because FnG System is designed as a RAM-based system it can be used to change anything on the non-volatile memory including updating Flash-N-Go System itself.
Even though the current systems are Linux based the Flash-N-Go Boot can be used to boot different target OSes like Windows CE or Android.
Flash-N-Go Boot can start the following Linux kernel image and Windows Embedded image types:
zImage compressed image
uImage compressed image with u-boot header
Image uncompressed image
BNX (legacy Garz & Fricke) bnx image for Windows Embedded Compact
The shared device-specific data is currently well-supported on iMX6 and iMX6ULL devices. However, i.MX8 devices may use this scheme in the future as well.
Partition layout
The current backing-storage type of Flash-N-Go is eMMC (using the Linux naming mmcblk0). In addition to the partitions for the basic Flash-N-Go components, there may be some more partitions depending on the system configuration.
iMX6 Partition layout
The default partition layout for the Flash-N-Go on the iMX6 platform is:
Partition | File System | Contents |
---|---|---|
| none | Flash-N-Go Boot |
| FAT32 | XML based device configuration and touchscreen settings |
| FAT32 | Flash-N-Go System including
|
The target operating system kernel is usually installed in mmcblk0p2
FAT32 partition and uses a third partition mmcblk0p3
as a non-volatile rootfs partition. However other partition layouts are possible for the target OS like customer-specific partition layouts or Android-based multi-partition layouts.
iMX8 Partition layout
On the imx8 based systems the default partition layout also contains the partitions for the target OS.
The following table contains all possible partitions. Depending on the selected setup it is possible that that the LINUXB, ROOTFSB and user partition are missing.
Partition | File System | Contents |
---|---|---|
mmcblk0p1 | none | Bootloader U-Boot placeholder to make the bootloader placement visible |
mmcblk0p2 | none | Bootloader Uboot environment placeholder to make the usage visible |
mmcblk0p3 | VFAT | Config SECO specific config partition, contain xml and other persistent device data |
mmcblk0p4 | none | Extended Partition |
mmcblk0p5 | VFAT, 128M | FLASH-N-GO Flash-N-Go System Kernel and RAM FS |
mmcblk0p6 | VFAT, 128M | LINUX Kernel, devicetrees and boot.cfg for installation A |
mmcblk0p7 | VFAT, 128M | LINUXB Kernel, devicetrees and boot.cfg for installation B |
mmcblk0p8 | EXT4, ~1.2GB | ROOTFS Root Files System for installation A |
mmcblk0p9 | EXT4, ~1.2GB | ROOTFSB Root filessystem for installation B |
mmcblk0p10 | not in use by default, ~1GB | User partition |
Booting Flash-N-Go System
There are two options for booting the device into Flash-N-Go System instead of booting the target OS. The first one is pressing down and holding the bootmode switch while the power supply is switched on. The location of the bootmode switch is shown in the following figure
After a few seconds a Flash-N-Go System prompt should be displayed on the serial console similar to this:
FLASH-N-GO:/
Alternatively, the bootselect
tool can be used, which is usually provided by Flash-N-Go compatible operating systems using Flash-N-Go System as well as by Flash-N-Go System itself.
The boomode switch needs to be pressed on each boot process. The selection made with bootselect
is persistent.
Configuration tools
Several tools on the Flash-N-Go System solution are provided for configuring, testing and flashing the devices.
bootselect
This tool offers the possibility to switch the boot target between the flashed operation system (e.g. Linux, Windows Embedded) on the device and Flash-N-Go System itself. The following code block shows a list of all possible parameters:
FLASH-N-GO:/ bootselect -h Usage: bootselect [-qv] [<bootmode>] When called without parameters, bootselect reads the current boot-mode setting from the RTC-register Options: <bootmode> Writes the given boot-mode into the RTC-register May be one of: initialized regular regularB alternative invalid -v Turns on debug messages on stderr -vv Turns on info messages on stderr -q Turns off warning messages on stderr -qq Turns off all messages on stderr
For the selection of the target OS the bootselect
tool should be called with the regular
parameter:
FLASH-N-GO:/ bootselect regular regular
For the selection of Flash-N-Go System the bootselect
tool should be called with the alternative
parameter:
FLASH-N-GO:/ bootselect alternative alternative
The bootselect
tool is also part of SECO Nothern Europe formerly Garz & Fricke operating systems which use Flash-N-Go Boot as bootloader. Thus the selection may be done at OS runtime too.
sconfig
sconfig
is a small command-line tool that offers functionalities for device configurations like network settings, screen rotation etc. The following code block shows a list of all possible parameters.
FLASH-N-GO:/ sconfig -h Usage: /usr/bin/sconfig {start | list | init | <setting> [value]} Call without [value] to read a setting, call with [value] to write it. Available settings: serialdiag switch serial debug console on or off dhcp switch DHCP on or off ip set IP address mask set subnet mask gateway set standard network gateway mac set MAC address name set device name serial set serial number (affects MAC address and device name) rotation set display rotation If a 2.Ethernet is present, it may be configured via serial2, mac2, etc.
xconfig
xconfig
is a command-line tool to manipulate the XML-configuration data directly. Care should be taken when using these commands as miss-configured or corrupted XML- configuration data might render a system unusable. The following code block shows a list of all possible parameters.
FLASH-N-GO:/# xconfig Usage: $0 [command] [options] Script to manipulate the XML-configuration data of GuF i.MX Boards inside the NAND Flash. xconfig expect one of the following commands to define its behavior: list show the current contents of the XML-configuration as obtained from NAND import import an external XML-configuration file into the NAND Flash addnode add a new (empty) XML node delnode delete XML node(s) and its/their children addattribute add a new or change an existing attribute delattribute delete an existing attribute If no command and option given xconfig will display its version and exit. Syntax: xconfig list [-v] [-p <path>] -v show whole (sub)tree instead of summary, the format is suitable to be used as input to "xconfig import" -s search for a specific pattern -l show long path syntax instead of xml --node filter result by node name, basic wildcards are allowed --attribute filter result by attribute name, basic wildcards are allowed format is either --attribute linux* matches all nodes that have an attribute starting with linux or --attribute key="value" matching nodes that have an attribute 'key' with the value 'value' -p <path> path to subtree, e.g.: -p /configurationFile/variables/setting[@key='enable_serialdiag] if omitted, the whole tree is shown xconfig import [-v] [-y] [-b] <file> -v be verbose -y assume yes - apply changes without user interaction <file> path to file to import -b deprecated - do not use xconfig addnode [-y] -p <path> -n <name> -y same as above -p <path> path to parent node -n <name> name of new node xconfig delnode [-y] -p <path> -y same as above -p <path> path to node xconfig addattribute [-y] -p <path> -n <attr-name> -v <value> -y same as above -p <path> path to parent node -n <attr-name> name of the attribute -v <value> new value of attribute xconfig delattribute [-y] -p <path> -n <attr-name> -y same as above -p <path> path to parent node -n <attr-name> name of the attribute xconfig listattributes -p <path> -p <path> path to node xconfig getattribute -p <path> -n <attr-name> -p <path> path to parent node -n <attr-name> name of the attribute
Manual System Update
The manual system update considers a manual operating system (OS) installation via a console. The progress can be done locally using mass storage devices or using a network connection. The update process described here requires an Ethernet connection of the device to a development PC, either directly or via intranet. Also, a TFTP-Server or HTTP-Server is required on the development PC. There are several, also free, TFTP-Servers and HTTP-Servers online available. Please make sure that the timeout settings of the TFTP-Server are set to 60 seconds at a minimum. The installation of target OSes, and Flash-N-Go System and Flash-N-Go Boot should work via console one- or two-liners. All device partitioning, deployment actions should be done by shell scripts executed by the simple command. See Booting Flash-N-Go System for instructions on how to boot into the management system.
Accessing the target system via serial console
Before updating the target operating system we first need access to the device. The easiest way to access the target is via the serial console. Simply connect the first RS-232 port of your target system with a COM port of your PC or a USB-to-RS-232 converter using a null-modem cable. With the serial connection set up start your favourite terminal program (e.g. minicom or tera term) with the following settings:
115200 baud
8 data bits
no parity
1 stop bit
no hardware flow control
no software flow control
From the very first moment when the target is powered, you should see debug messages in the terminal if the standard configuration is set.
Establish a network connection
The Ethernet can be set up with the sconfig command-line tool, see also sconfig.
To set the IP address to the static IP 192.168.1.1 with the submask 255.255.255.0 use the following commands:
sconfig ip 192.168.1.1 sconfig mask 255.255.255.0 sconfig dhcp off
To set DHCP and reboot the system to apply the network configuration:
sconfig dhcp on reboot
It is also necessary to install a TFTP-server or HTTP-server on a host PC.
Installation via network
The common concept of the installation is always similar.
Set the download source variable
TFTP
(or URL for newer installation script versions)Download the installation script (with
curl
) andExecute the installation script (with
sh
).
These concatenating these steps the installation can be done in one-liner commands.
Example 1: Install Yocto Daisy 15.0
Download all files within the Linux-Yocto/Releases/Yocto-15.0-r4523-9/prebuilt_images
folder of the SECO Nothern Europe support server (formerly known as Garz & Fricke FTP server).
GUF-Yocto-15.0-r4523-9-SANTARO-boot.cfg
GUF-Yocto-15.0-r4523-9-SANTARO-fng-install.sh
GUF-Yocto-15.0-r4523-9-SANTARO-imx6-santaro-x1.dtb
GUF-Yocto-15.0-r4523-9-SANTARO-imx6-santaro-x2.dtb
GUF-Yocto-15.0-r4523-9-SANTARO-linuximage.bin
GUF-Yocto-15.0-r4523-9-SANTARO-modules.tgz
GUF-Yocto-15.0-r4523-9-SANTARO-pkg.py
GUF-Yocto-15.0-r4523-9-SANTARO-root.tar.gz
To start the upgrade process use:
export TFTP=tftp://<TFTP-Server IP> ; curl $TFTP/GUF-Yocto-15.0-r4523-9-SANTARO-fng-install.sh | sh
Replace <TFTP-Server IP>
with the IP address of your TFTP-server
Example 2: Upgrade to Flash-N-Go System 8.0
Download the Flash-N-Go System files listed below from the Flash-N-Go/FNGSystem/FNGSystem8.0
folder of the support server.
Flash-N-Go-System-8.0-python-3.1.4.ext2
Flash-N-Go-System-8.0-self-init.sh
Flash-N-Go-System-8.0-self-update.sh
Flash-N-Go-System-8.0.cpio.gz
GF_Bootlogo_Flash-N-Go-System.png
boot-alt.cfg
fng_wipe_emmc.sh
Additionally, download the Kernel Files files listed below from the Flash-N-Go/FNGSystem/FNGSystem-8.0/GUFYocto-35.0-r5982-0
directory of the support server. Place them in a subfolder of the TFTP-Server root folder named GUF-Yocto-35.0-r5982-0
GUF-Yocto-35.0-r5982-0-IMX6GUF-imx6dl-santaro.dtb
GUF-Yocto-35.0-r5982-0-IMX6GUF-imx6dl-santino-lt.dtb
GUF-Yocto-35.0-r5982-0-IMX6GUF-imx6dl-santino.dtb
GUF-Yocto-35.0-r5982-0-IMX6GUF-imx6dl-santoka.dtb
GUF-Yocto-35.0-r5982-0-IMX6GUF-imx6q-santaro.dtb
GUF-Yocto-35.0-r5982-0-IMX6GUF-imx6q-santoka.dtb
GUF-Yocto-35.0-r5982-0-IMX6GUF-linuximage.bin
GUF-Yocto-35.0-r5982-0-IMX6GUF-modules.ext4
ParamFile.txt
md5sums.txt
To start the upgrade process use the following lines
export TFTP=<TFTP-Server IP> curl tftp://$TFTP/Flash-N-Go-System-8.0-self-update.sh | -s -- --ParamFile=GUF-Yocto-35.0-r5982-0/ParamFile.txt
Replace <TFTP-Server IP>
with the IP address of your TFTP-server
Example 3: Upgrade Flash-N-Go Boot to version 13.0
Download the Flash-N-Go Boot files listed below from the Flash-N-Go/FNGBoot/FNGBoot-v13.0r3476/
directory of the support server.
GF_iMX6x-FNGBoot-v13.0r3797_26-09-2019.bin
fng_boot_update.sh
md5sums.txt
export TFTP=<TFTP-Server IP>; curl tftp://$TFTP/fng_boot_update.sh | sh
Replace <TFTP-Server IP>
with the IP address of your TFTP-server
Security Considerations
The Flash-N-Go System is designed as a management system to install and update target operating systems and change the device configurations. Thus it runs with root privileges. This may be a concern for some scenarios. Therefore some security considerations are necessary.