wiki:gsc/alternate_boot_device

Alternate Boot Device

Some Gateworks family products have an 'Alternate boot device' that can be used for alternate firmware images, such as a flash recovery image:

  • Newport - eMMC vs microSD
  • Laguna - NOR FLASH vs SPI FLASH

Please note that if you have a board with a 4MB SPI flash device, such as the GW2388-4 you will need to use ​u-boot-2014.10 cns3xxx bootloader.

There are 2 ways that you can instruct the Gateworks System Controller to boot to the alternate boot device:

  1. set GSC R0.3 and press the user pushbutton 5x times to perform a 1-time hard reboot to the alternate boot device
    i2cset -f -y 0 0x20 0 0x08
    
  2. set GSC R1.6 (SWITCH_BOOT_ENABLE) to enable 'switch boot check' (see below). If this is set when the board powers on, it will 'toggle' boot device selection and reboot after 30 seconds unless GSC R1.7 (SWITCH_BOOT_CLEAR) has been set before that time. Note that the countdown timer is only activated when the board powers on from a GSC sleep or unpowered state

Auto Switch Boot Device

The Gateworks System Controller implements an 'Auto Switch Boot Device' feature that can be useful as a firmware recovery mechanism. GSC register R1.6 (SWITCH_BOOT_ENABLE) enables this mode. When this is set and the board powers on it will initiate a countdown timer that expires in 30 seconds. Writing a 1 to GSC R1.7 (SWITCH_BOOT_CLEAR) will cancel this timer. If the timer expires the boot device will be 'toggled' and the board will be hard reset.

If you need to progamattically hard power cycle the board you can put it to sleep for a few seconds.

From Linux

Within the linux command-line shell, you can use i2cset from the i2c-tools package.

To enable 'switch boot check':

i2cset -f -y 0 0x20 1 0x40      ;# enable R1.6 (SWITCH_BOOT_ENABLE)

To assert 'SWITCH_BOOT_CLEAR' and cancel the countdown timer (within 30 seconds of power up):

i2cset -f -y 0 0x20 1 0xC0      ;# cancel countdown by asserting R1.7 (SWITCH_BOOT_CLEAR) but keep enabled R1.6 (SWITCH_BOOT_ENABLE)

From u-boot

Within the u-boot environment you can use the imw command to set i2c registers.

To enable 'switch boot check':

Laguna > imw 0x20 1 0x40 1     ;# enable R1.6 (SWITCH_BOOT_ENABLE)

To assert R1.7 (SWITCH_BOOT_CLEAR) and cancel the countdown timer (within 30 seconds of power up):

Laguna > imw 0x20 1 0xc0 1  # set SWITCH_BOOT_CLEAR (R1.7)

Alternate Boot Flash firmware images

Newport Product families

The Newport boards have a primary eMMC device and a removable microSD device that can be used as an alternate boot device. Because these are both MMC devices, the same boot firmware can be used on each device.

Laguna Product families

The Laguna boards have a primary NOR FLASH device and a smaller SPI FLASH device for an alternate boot device. Because of the differences in the FLASH types you need to have a different bootloader on each device.

Step 1. Bootloader

The alternate boot device and the primary boot device require different bootloaders (SPI vs NOR FLASH). Only the primary boot device is programmed with a bootable image by Gateworks. In order to program the alternate boot device you will need to do so from Linux (as u-boot-nor.bin on the primary boot device without modification can only access NOR flash).

REQUIRED: You will also need to modify your Linux kernel to allow writing to the u-boot partition of SPI flash by commenting out the '.mask_flags = MTD_WRITEABLE' in the laguna_spi_partitions structure in:

/gateworks-openwrt/trunk$ vi build_dir/target-arm_v6k_uClibc-0.9.33.2_eabi/linux-cns3xxx/linux-3.8.6/arch/arm/mach-cns3xxx/laguna.c

Once modified, recompile the BSP. Then flash this to the NOR flash on your board.

Once booted to NOR flash with this modified kernel you can write the laguna u-boot-spi.bin to /dev/mtd5 via mtd:

root@OpenWrt:/# mtd write u-boot_spi.bin /dev/mtd5
Unlocking /dev/mtd5 ...

Writing from u-boot_spi.bin to /dev/mtd5 ...     
root@OpenWrt:/#

Now you can follow the instructions above to boot off the Alternate Boot Device (SPI Flash) and setup your kernel/rootfs using the instructions for an SPI FLASH device such as the GW2380 found here here

Step 2. Kernel / Root Filesystem

Depending on the size of the SPI FLASH you will likely need to prune features from your kernel/filesystem. A good starting point may be the Laguna ​test_config file which uses a ramdisk and a minimal set of utilities used by Gateworks to test boards. As this OpenWrt config file specifies an INTRAMFS ramdisk, you only need to flash the kernel which includes the root filesystem.

  1. Use the instructions above to boot from the Alternate Boot Device (SPI FLASH) and break out into the bootloader. You can determine that you are booted to the Alternate Boot Device by seeing a smaller FLASH size in the boot header or by looking at the output of 'printenv bootcmd' and seeing that it boots a kernel from 0x60080000 (SPI FLASH) instead of 0x10080000 (NOR FLASH)
    ...
    Hit any key to stop autoboot:  0 
    Laguna> printenv bootcmd
    bootcmd=bootm 0x60080000
    
  2. set R1.7 (SWITCH_BOOT_CLEAR) so that you have plenty of time to write the kernel to the SPI Flash:
    Laguna > imw 0x20 1 0xc0 1  # set SWITCH_BOOT_CLEAR (R1.7)
    
  3. set ipaddr/serverip according to your network. For example if your server is at 192.168.1.14 and your target is to be 192.168.1.211:
    Laguna> sete ipaddr 192.168.1.211
    Laguna> sete serverip 192.168.1.14
    
  4. Erase what is currently in the SPI FLASH: (This is a range, start and end for a specific flash size. Example 16MB SPI below)
    Laguna> erase 0x60080000 0x60ffffff
    
  5. Copy Kernel+Root-filesystem to the Board
    Laguna> tftpboot 0x00800000 laguna/openwrt-cns3xxx-uImage_ramdisk
    Laguna> cp.b 0x00800000 0x60080000 $(filesize)
    
  6. Set kernel commandline for booting a ramdisk:
    setenv bootargs 'console=ttyS0,115200 root=/dev/ram0 rootfstype=ramfs'
    saveenv
    
  7. Boot into Linux
    Laguna> bootm
    

Notes:

  • when using the SPI FLASH device you can erase the u-boot env flash section and restore factory defaults with:
    Laguna> protect off 0x60040000 +0x40000
    Laguna> erase 0x60040000 +0x40000
    Laguna> reset
    

Using u-boot-2014.10-cns3xxx bootloader

If using the u-boot-2014.10-cns3xxx which supports both the 16MB and 4MB SPI flash devices used on Laguna products, you will need to use the 'sf' commands within uboot to access flash.

Update kernel:

setenv serverip 192.168.1.146
setenv ipaddr 192.168.1.1
setenv spi_koffset 0x80000
setenv spi_klen 0x180000
setenv spi_roffset 0x200000
# update kernel
tftp ${loadaddr} laguna/openwrt-cns3xxx-uImage && sf probe && sf update ${loadaddr} ${spi_koffset} ${filesize}

Update SPI uboot:

# update SPI uboot
setenv serverip 192.168.1.146
setenv ipaddr 192.168.1.1
tftp ${loadaddr} laguna/u-boot_spi.bin && sf probe && sf update ${loadaddr} 0 ${filesize}

Enable Alternate Boot timer:

i2c mw 0x20 1 0x40 1 # set R1.6 SWITCH_BOOT_ENABLE

Clear Alternate Boot timer:

i2c mw 0x20 1 0xc0 1 # set R1.7 SWITCH_BOOT_CLEAR
Last modified 2 years ago Last modified on 07/29/2020 05:00:13 PM