Flashing the eMMC

Before proceeding further, it’s recommended to familiarize yourself with the foundational concepts detailed in the Booting Essentials chapter. It will provides instructions on how to initiate the device from any accessible boot source, enabling you to proceed with the flashing procedure. Afterwards we’ll explore different approaches to flashing eMMC storage: from an SD card, over a network connection, and via USB or using partup or wic based images.

Flash eMMC from SD Card

By default, the phyBOARD-Electra AM64x is configured to boot from an SD Card. This is generally one of the most convenient methods to boot your hardware throughout development because it allows for easy software updates and file transfers between your Host and target systems. In addition to creating a standard bootable SD card formatted with the phyCORE-AM64x Linux BSP, the following steps can be used to burn bootable software images to the onboard eMMC flash memory of the SOM, thus freeing up the SD Card slot on the carrier board.

The easiest way to access the SOM’s eMMC is to boot the SOM into Linux from an SD Card (you may already be doing this). The Linux instance running from the SD Card will need access to software binaries to flash to the eMMC; thus, we will also need to transfer those binaries to the SD Card so that they are present and accessible at runtime.

Layout of a partup flashed eMMC

To generate bootable partup artifacts, we utilize partup. After flashing with partup, the eMMC layout is defined as follows:

partup-layout-default-k3.yaml

Flash eMMC from SD card in U-Boot

  • Flash an SD card with a working image and create a third FAT partition. Copy the WIC image (phytec-headless-image-phyboard-electra-am64xx-2.wic) to this partition. By default we deploy a compressed wic.xz file. As u-boot is not able to uncompress it, you should do so on your host machine.

    host:~$ unxz phytec-headless-image-phyboard-electra-am64xx-2.wic.xz
    
  • Configure the bootmode switch to SD Card and insert the SD Card.

  • Power on the board and stop in U-Boot.

  • Load the image:

    uboot:~# ls mmc 1:3
    <DIR>       4096 .
    <DIR>       4096 ..
           609646592 phytec-headless-image-phyboard-electra-am64xx-2.wic
    
    uboot:~# load mmc 1:3 0xA0000000 phytec-headless-image-phyboard-electra-am64xx-2.wic
    
  • Switch the mmc dev to use the eMMC device:

    uboot:~# mmc list
    mmc@fa10000: 0
    mmc@fa00000: 1 (SD)
    
    uboot:~# mmc dev 1
    switch to partitions #0, OK
    mmc1 is current device
    
  • Flash your WIC image from the SD card to eMMC. This will partition the card and copy bootloader files, Image, dtb, dtbo, and root file system to eMMC:

    uboot:~# setexpr nblk ${filesize} / 0x200
    uboot:~# mmc write 0xA0000000 0x0 ${nblk}
    
    MMC write: dev # 0, block # 0, count 1190716 ... 1190716 blocks written: OK
    

Note

This step only works if the size of the image file is less than 1GB due to limited usage of RAM size in the Bootloader as we have marked some RAM regions as reserved for other components such as OPTEE. If the image file is too large use the Updating eMMC from SD card in Linux on Target subsection.

  • Update the Bootloader to the eMMC’s dedicated boot0 partition:

    # Select eMMC boot0 partition
    uboot:~# mmc dev 0 1
    
    uboot:~# load mmc 1 ${loadaddr} tiboot3.bin
    uboot:~# mmc write ${loadaddr} 0x0 0x400
    
    uboot:~# load mmc 1 ${loadaddr} tispl.bin
    uboot:~# mmc write ${loadaddr} 0x400 0x1000
    
    uboot:~# load mmc 1 ${loadaddr} u-boot.img
    uboot:~# mmc write ${loadaddr} 0x1400 0x2000
    
  • To give the ROM access to the boot partition, the following commands must be used for the first time:

    uboot:~# mmc partconf 0 1 1 1
    uboot:~# mmc bootbus 0 2 0 0
    
  • Power off the board and change the bootmode switch to eMMC, see Booting Essentials.

Flash eMMC from SD card in Linux

You can also flash the eMMC on Linux. You only need a partup package or WIC image saved on the SD card.

  • Show your saved partup package or WIC image files on the SD card:

    phyboard-electra-am64xx-2:~# ls
    phytec-headless-image-phyboard-electra-am64xx-2.partup
    phytec-headless-image-phyboard-electra-am64xx-2.wic.bmap
    phytec-headless-image-phyboard-electra-am64xx-2.wic.xz
    
  • Show list of available MMC devices:

    phyboard-electra-am64xx-2:~# ls /dev | grep mmc
    mmcblk0
    mmcblk0boot0
    mmcblk0boot1
    mmcblk0rpmb
    mmcblk1
    mmcblk1p1
    mmcblk1p2
    mmcblk1p3
    

Note

The eMMC device can be recognized by the fact that it contains two boot partitions: (mmcblk0boot0; mmcblk0boot1)

  • Write the image to the eMMC device (MMC device 0 without partition) using partup:

    phyboard-electra-am64xx-2:~# partup install phytec-headless-image-phyboard-electra-am64xx-2.partup /dev/mmcblk0
    

Flashing the partup package has the advantage of using the full capacity of the eMMC device, adjusting partitions accordingly.

Note

Alternatively, bmaptool may be used instead:

phyboard-electra-am64xx-2:~# bmaptool copy phytec-headless-image-phyboard-electra-am64xx-2.wic.xz /dev/mmcblk0

When utilizing bmap, it becomes necessary to manually update the bootloader files individually. This is due to the fact that wic images store the bootloader files in a distinct FAT/boot partition, which is incompatible with eMMC devices.

phyboard-electra-am64xx-2:~# echo 0 > /sys/class/block/mmcblk0boot0/force_ro
phyboard-electra-am64xx-2:~# dd if=/boot/tiboot3.bin of=/dev/mmcblk0boot0 count=1024 conv=fsync
phyboard-electra-am64xx-2:~# dd if=/boot/tispl.bin of=/dev/mmcblk0boot0 seek=1024 count=3072 conv=fsync
phyboard-electra-am64xx-2:~# dd if=/boot/u-boot.img of=/dev/mmcblk0boot0 seek=5120 count=3072 conv=fsync

The following must be run once per eMMC device in order for it to allow the bootROM to load the bootloaders from it. Once done for a given phyCORE-AM64x SOM, you won’t ever have to do this again for the life of that device.

phyboard-electra-am64xx-2:~# mmc bootpart enable 1 1 /dev/mmcblk0
phyboard-electra-am64xx-2:~# mmc bootbus set single_backward x1 x8 /dev/mmcblk0
phyboard-electra-am64xx-2:~# mmc hwreset enable /dev/mmcblk0
  • Power off the development kit and configure the hardware to boot from the onboard eMMC flash. See the section Booting Essentials.

Flash eMMC from Network

The phyBOARD-Electra AM64x has an Ethernet connector and can be updated over a network. Be sure to set up the development host correctly. The IP needs to be set to 192.168.3.10, the netmask to 255.255.255.0, and a TFTP server needs to be available. From a high-level point of view, an eMMC device is like an SD card. Therefore, it is possible to flash the WIC image (<name>.wic) from the Yocto build system directly to the eMMC. The image contains the bootloader, kernel, device tree, device tree overlays, and root file system.

Flash eMMC from Network in U-Boot

Note

This step only works if the size of the image file is less than 1GB due to limited usage of RAM size in the Bootloader as we have marked some RAM regions as reserved for other components such as OPTEE. If the image file is too large use the Updating eMMC from SD card in Linux on Target subsection.

  • Load your image via network to RAM:

    uboot:~# tftp 0xA0000000 phytec-headless-image-phyboard-electra-am64xx-2.wic
    
  • Write the image to the eMMC:

    uboot:~# tftp 0xA0000000 phytec-headless-image-phyboard-electra-am64xx-2.wic
    uboot:~# mmc dev 0
    uboot:~# setexpr nblk ${filesize} / 0x200
    uboot:~# mmc write 0xA0000000 0x0 ${nblk}
    
  • Update the Bootloader to the eMMC’s dedicated boot0 partition:

    Target (U-Boot)
    # Select eMMC boot0 partition
    mmc dev 0 1
    
    tftp ${loadaddr} tiboot3.bin
    mmc write ${loadaddr} 0x0 0x400
    
    tftp ${loadaddr} tispl.bin
    mmc write ${loadaddr} 0x400 0x1000
    
    tftp ${loadaddr} u-boot.img
    mmc write ${loadaddr} 0x1400 0x2000
    
  • To give the ROM access to the boot partition, the following commands must be used for the first time:

    uboot:~# mmc partconf 0 1 1 1
    uboot:~# mmc bootbus 0 2 0 0
    
  • Power off the board and change the bootmode switch to eMMC, see Booting Essentials.

Flash eMMC from Network in Linux

  • Download the partup image:

    phyboard-electra-am64xx-2:~# tftp -r phytec-headless-image-phyboard-electra-am64xx-2.partup -g 192.168.3.10
    
  • Now copy the image to the eMMC device using partup:

    phyboard-electra-am64xx-2:~# partup install phytec-headless-image-phyboard-electra-am64xx-2.partup /dev/mmcblk0
    

Note

Alternatively, bmaptool may be used instead:

phyboard-electra-am64xx-2:~# tftp -r phytec-headless-image-phyboard-electra-am64xx-2.wic.xz -g 192.168.3.10
phyboard-electra-am64xx-2:~# tftp -r phytec-headless-image-phyboard-electra-am64xx-2.wic.bmap -g 192.168.3.10
phyboard-electra-am64xx-2:~# bmaptool copy phytec-headless-image-phyboard-electra-am64xx-2.wic.xz /dev/mmcblk0

When utilizing bmaptool, it becomes necessary to manually update the bootloader files individually. This is due to the fact that wic images store the bootloader files in a distinct FAT/boot partition, which is incompatible with eMMC devices.

phyboard-electra-am64xx-2:~# echo 0 > /sys/class/block/mmcblk0boot0/force_ro
phyboard-electra-am64xx-2:~# dd if=/boot/tiboot3.bin of=/dev/mmcblk0boot0 count=1024 conv=fsync
phyboard-electra-am64xx-2:~# dd if=/boot/tispl.bin of=/dev/mmcblk0boot0 seek=1024 count=3072 conv=fsync
phyboard-electra-am64xx-2:~# dd if=/boot/u-boot.img of=/dev/mmcblk0boot0 seek=5120 count=3072 conv=fsync

The following must be run once per eMMC device in order for it to allow the bootROM to load the bootloaders from it. Once done for a given phyCORE-AM64x SOM, you won’t ever have to do this again for the life of that device.

phyboard-electra-am64xx-2:~# mmc bootpart enable 1 1 /dev/mmcblk0
phyboard-electra-am64xx-2:~# mmc bootbus set single_backward x1 x8 /dev/mmcblk0
phyboard-electra-am64xx-2:~# mmc hwreset enable /dev/mmcblk0

Flash eMMC from Network in Linux from Host perspective

  • Download the partup image from our downloads server, see Pre-Built Binaries.

  • Copy the image to the target:

    host:~$ scp phytec-headless-image-phyboard-electra-am64xx-2.partup [email protected]
    
  • Flash using partup:

    host:~$ ssh [email protected] "partup install phytec-headless-image-phyboard-electra-am64xx-2.partup /dev/mmcblk0"
    
  • Power off the board and change the bootmode switch to eMMC, see Booting Essentials.

Flash eMMC from USB

The phyBOARD-Electra AM64x provides two USB 2.0 Dual-Role Devices (DRD) subsystems via the three USB connectors (X43, X36, and X34). This guide will show you how to utilize the USB interface for flashing the eMMC device, either by using USB/DFU or a simple USB flash drive. The only requirement for flashing from a USB flash drive is a USB drive containing all relevant bootloader images and a phytec-headless-image-phyboard-electra-am64xx-2.partup or phytec-headless-image-phyboard-electra-am64xx-2.wic.

Flash eMMC from USB flash drive in U-Boot

  • Load your image from USB drive to RAM:

    uboot:~# usb start
    uboot:~# load 0xA0000000 phytec-headless-image-phyboard-electra-am64xx-2.wic
    
  • Write the image to the eMMC:

    uboot:~# mmc dev 0
    uboot:~# setexpr nblk ${filesize} / 0x200
    uboot:~# mmc write 0xA0000000 0x0 ${nblk}
    
  • Update the Bootloader to the eMMC’s dedicated boot0 partition:

    # Select eMMC boot0 partition
    uboot:~# mmc dev 0 1
    
    uboot:~# load usb 0 ${loadaddr} tiboot3.bin
    uboot:~# mmc write ${loadaddr} 0x0 0x400
    
    uboot:~# load usb 0 ${loadaddr} tispl.bin
    uboot:~# mmc write ${loadaddr} 0x400 0x1000
    
    uboot:~# load usb 0 ${loadaddr} u-boot.img
    uboot:~# mmc write ${loadaddr} 0x1400 0x2000
    
  • To give the ROM access to the boot partition, the following commands must be used for the first time:

    uboot:~# mmc partconf 0 1 1 1
    uboot:~# mmc bootbus 0 2 0 0
    

Flash eMMC from USB flash drive in Linux

  • Mount your USB flash drive:

    phyboard-electra-am64xx-2:~# mkdir /mnt/usb
    phyboard-electra-am64xx-2:~# mount /dev/sda1 /mnt/usb
    
  • Write the image to the eMMC device (MMC device 0 without partition) using partup:

    phyboard-electra-am64xx-2:~# partup install /mnt/usb/phytec-headless-image-phyboard-electra-am64xx-2.partup /dev/mmcblk0
    

Flashing the partup package has the advantage of using the full capacity of the eMMC device, adjusting partitions accordingly.

Note

Alternatively, bmaptool may be used instead:

phyboard-electra-am64xx-2:~# bmaptool copy /mnt/usb/phytec-headless-image-phyboard-electra-am64xx-2.wic.xz /dev/mmcblk0

When utilizing bmaptool, it becomes necessary to manually update the bootloader files individually. This is due to the fact that wic images store the bootloader files in a distinct FAT/boot partition, which is incompatible with eMMC devices.

phyboard-electra-am64xx-2:~# echo 0 > /sys/class/block/mmcblk0boot0/force_ro
phyboard-electra-am64xx-2:~# dd if=/mnt/usb/tiboot3.bin of=/dev/mmcblk0boot0 count=1024 conv=fsync
phyboard-electra-am64xx-2:~# dd if=/mnt/usb/tispl.bin of=/dev/mmcblk0boot0 seek=1024 count=3072 conv=fsync
phyboard-electra-am64xx-2:~# dd if=/mnt/usb/u-boot.img of=/dev/mmcblk0boot0 seek=5120 count=3072 conv=fsync

The following must be run once per eMMC device in order for it to allow the bootROM to load the bootloaders from it. Once done for a given phyCORE-AM64x SOM, you won’t ever have to do this again for the life of that device.

phyboard-electra-am64xx-2:~# mmc bootpart enable 1 1 /dev/mmcblk0
phyboard-electra-am64xx-2:~# mmc bootbus set single_backward x1 x8 /dev/mmcblk0
phyboard-electra-am64xx-2:~# mmc hwreset enable /dev/mmcblk0
  • Power off the development kit and configure the hardware to boot from the onboard eMMC flash. See the section Booting Essentials.

RAUC

The RAUC (Robust Auto-Update Controller) mechanism support has been added to meta-ampliphy. It controls the procedure of updating a device with new firmware. This includes updating the Linux kernel, Device Tree, and root filesystem. PHYTEC has written an online manual on how we have intergraded RAUC into our BSPs: L-1006e.A5 RAUC Update & Device Management Manual.