[[PageOutline]] = Updating Malibu Firmware / Software This page is all about updating / flashing firmware / software onto a Malibu SBC. The various components of the 'firmware' on a Malibu board which you may want to update from time to time are (lowest level components listed first): - GSC firmware - SPL - Linux device-tree - U-Boot bootloader - Linux kernel - root filesystem Some components above you can update individually in Linux using {{{dd}}} or in U-Boot using {{{mmc write}}} taking care to place them at the right offset. = Pre-Built Firmware [wiki:malibu/bsp#images Malibu Pre-Built Firmware / Software] JTAG binary images: - Flash with Gateworks JTAG dongle on a Linux host with instructions [#jtag - Note there are several variants of the i.MX8M processor (mini (mm), nano (mn), plus(mp)) which is indicated in the filename. - firmware-malibu-gw8901-jtag.bin - JTAG image of boot firmware containing: ATF, U-Boot, and U-Boot env. Flash with JTAG if recovering a board from an unknown state. - gsc_8901_v62.txt - Latest GSC firmware release for GW891 Disk Images (Update via Bootloader gzwrite or via Linux): - see http://trac.gateworks.com/wiki/malibu/firmware - jammy-malibu.img.gz [=#firmware-version] = Firmware Versioning You can determine the firmware version of various portions of the firmware by looking for banners on the serial console. For example: {{{#!bash Gateworks Malibu SPL v2.4(release):v2.4-5-g9f5a66e417b6 Built : 13:50:03, Apr 6 2023 DDR4-2133 4x16GiB: 8GiB mv_ddr: devel-ged350176570c (Apr 06 2023 - 13:50:01) SSCG_EN Synopsys DDR43 PHY Firmware version: A-2017.11 ... U-Boot 2022.10-00019-gcbfa8885831d (Apr 06 2023 - 13:49:47 -0700) ... GSCv3 : v62 0x4a26 RST:VIN Thermal protection:enabled at 96C ... [ 0.000000] Linux version 6.1.0-00021-g4225c178a023 (jenkins@buildbot) (aarch64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, GNU ld (GNU Binutils for Ubuntu ) 2.34) #5 SMP Thu Apr 6 08:55:30 PDT 2023 ... Ubuntu 22.04.1 LTS jammy-malibu ttyS0 Gateworks-Ubuntu-gateworks-g67953fe Thu Aug 18 17:49:36 UTC 2022 ... }}} The above output shows you: * Secondary Program Loader (SPL) GIT revision and build date * Marvell DDR version * U-Boot GIT revision and build date * GSC firmware version * Linux kernel version, GIT revision, build date and build source * Ubuntu root filesystem version and GIT revision of the Gateworks [https://github.com/gateworks/ubuntu-rootfs ubuntu-rootfs.sh] that created it (use {{{dpkg -l | grep "^ii"}}} to see what packages and versions are installed [=#firmware-update] = Updating Firmware This section provides instructions for updating both GSC firmware as well as boot device firmware. There are two methods for updating firmware: * on a live board using Serial Console and Ethernet * using a GW16099 JTAG dongle (see [#jtag below]) The various items that can be easily updated: * GSC Firmware - Can be updated via JTAG or at runtime - see [#gsc below]) * Boot Firmware (Everything up to and including the Bootloader) * Root Filesystem (Operating System) [=#jtag] == JTAG Programming The Gateworks JTAG adapter (GW16099) is available in the Malibu Dev Kit as well as on the Gateworks web store [http://shop.gateworks.com/index.php?route=product/category&path=70_80 here] All Malibu boards have a 10-pin JTAG header which provides: * JTAG Programming for embedded emmc flash - see [wiki:jtag_instructions here] for instructions * Serial Console access via UART1 (/dev/ttyS0) Please Note: * Only program *jtag.bin files via the JTAG programmer and jtag_usbv4 * Linux software is supported for programming Malibu (jtag_usbv4 required). Windows is not supported. (Serial console through Windows does work). * JTAG Programming of eMMC is supported by [http://dev.gateworks.com/jtag/jtag_usbv4 jtag_usbv4] - see [wiki:jtag_instructions here]. Due to this being a slow process for large eMMC devices it is recommended to program boot firmware via JTAG if you brick your board and use the bootloader to install firmware when possible for speed (see [#serial-ethernet] below). * JTAG Programming of the GSC firmware is supported by [http://dev.gateworks.com/jtag/jtag_usbv4 jtag_usbv4] - see [#jtag-gsc below] To flash the Malibu boot firmware (no operating system), use the following command: {{{ sudo ./jtag_usbv4 –p firmware-malibu-gw8901-jtag.bin }}} [=#serial-ethernet] == Update Firmware via Serial Console and Ethernet from Bootloader The quickest and easiest way to update your firmware is via Serial Console and Ethernet. You can do this either in the U-Boot bootloader (recommended) or within a Linux OS. If updating firmware via !Bootloader/Serial/Ethernet (recommended for speed) you need to setup a TFTP server to host the files for transfer. Alternatively you could load firmware files from removable storage (microSD, or USB Mass Storage for example) however you will need to deviate from the examples below. For details on setting up a TFTP server see [wiki:tftpserver here]. The following instructions assume your board target IP address is 192.168.1.1 and you have a TFTP server at 192.168.1.146. Adjust environment according to your network via 'setenv ipaddr ' and 'setenv serverip '. The methods you use to update the firmware depends on what specifically you are trying to update. ==== Update OS Updating the OS can be done via a Compressed Disk Image. This image includes the partition table and root filesystem which includes the kernel, device-tree and bootscript. Note for Malibu the boot firmware is contained on the emmc boot0 hardware partition keeping it separate from the OS on the emmc user parition. Complete Compressed Disk Images are available for download here: [http://dev.gateworks.com/malibu/images/] Procedure: * Via U-Boot: {{{#!bash #First, setup the IP and server IP as described above (example IPs below) setenv ipaddr 192.168.1.1 setenv serverip 192.168.1.2 # setup network environment (use bootp or static by setting ipaddr/serverip and optional netmask/gatewayip) setenv autoload 0; bootp # use dhcp for network config but do not fetch a file # choose the device to update setenv dev 0 # sets MMC device to be flashed - see mmc list # set your image setenv image jammy-malibu.img.gz # update run update_all }}} - This is what the update_all script does if your curious: {{{#!bash update_all=tftpboot ${loadaddr} ${image} && gzwrite mmc ${dev} ${loadaddr} ${filesize} }}} * Via Linux (assuming the device you are updating is not mounted): {{{#!bash # fetch your file cd /tmp wget http://dev.gateworks.com/malibu/images/jammy-malibu.img.gz # uncompress and write to the emmc device zcat jammy-malibu.img.gz | dd of=/dev/mmcblk0 bs=4M }}} ==== Updating just the boot firmware Updating the [wiki:malibu/boot 'Boot firmware'] via this method updates the ATF and U-Boot bootloader. Note for Malibu the boot firmware is contained on the emmc boot0 hardware partition keeping it separate from the OS on the emmc user parition. The latest pre-built boot firmware images for Malibu are available for download here: [http://dev.gateworks.com/malibu/boot_firmware/] Procedure: * Via U-Boot: {{{#!bash # setup network environment (use bootp or static by setting ipaddr/serverip and optional netmask/gatewayip) bootp # optional: use dhcp for network config # update run update_firmware }}} - This is what the update_firmware script does if your curious: {{{#!bash tftpboot $loadaddr ${dir}/firmware-malibu-${board}.bin && setexpr blkcnt $filesize + 0x1ff && setexpr blkcnt $blkcnt / 0x200 && mmc dev 0 1 && mmc write $loadaddr 0 $blkcnt && mmc dev 0 2 && mmc write $loadaddr 0 $blkcnt }}} * Via Linux: - Updating via Linux requires you to download the 'firmware-malibu-${board}.bin' file (pre-built images can be found [http://dev.gateworks.com/malibu/boot_firmware/ here] {{{#!bash # fetch your file cd /tmp wget http://dev.gateworks.com/malibu/boot_firmware/firmware-malibu-${board}.bin dd if=firmware-malibu-${board}.bin of=/dev/mmcblk2 bs=1K seek=0 }}} Note that if you want to update the boot firmware including the default U-Boot environment (overwriting any environment you already have) use the 'firmware-malibu-${board}.img' file. === TFTP Error Troubleshooting There are many reasons why TFTP may fail including: * firewall issue keeping your TFTP server for being accessible (make sure you can ping it!) * invalid network configuration (netmask, gatewayip, ipaddr, serverip) - again make sure you can ping it! * 'TFTP error: trying to overwrite reserved memory...' - indicates you are trying to transfer a file that is larger than system memory. You will need to split the file into chunks and flash them individually at the right offsets = Updating GSC firmware The GSC firmware is updated via the {{{gsc_update}}} application running under Linux as described at on the [wiki:gsc#firmware gsc wiki]. While it takes only a few seconds to update there is no recovery for a failed update. Gateworks has ensured that this update is robust but can not survive a power-cut or kernel crash in the middle of the update. Updates to the GSC firmware are expected to be rare. [=#jtag-gsc] === Update GSC Firmware via JTAG === To update the GSC firmware via JTAG download the {{{jtag_usbv4}}} application on a Linux x86 host from [http://dev.gateworks.com/jtag/jtag_usbv4 here] and execute as follows: {{{#!bash ./jtag_usbv4 -m gsc_8901_v62.txt }}} Note that the {{{ftdi_sio}}} kernel module must not be loaded (sudo rmmod ftdi_sio) and you may need to run this command as root by pre-pending a sudo depending on the configuration of your linux host. For more details please see: * [wiki:jtag Gateworks JTAG wiki page]