Flashing the SPI NOR Flash
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 NOR flash: from an SD card or over a network connection.
The phyCORE-AM64x modules are optionally equipped with SPI NOR Flash. The SPI NOR flash partition table is defined in the U-Boot-only device tree k3-am642-phyboard-electra-rdk-u-boot.dtsi. It can be printed with:
uboot:~# mtd list
SF: Detected mt35xu512aba with page size 256 Bytes, erase size 4 KiB, total 64 MiB
List of MTD devices:
* nor0
- device: flash@0
- parent: spi@fc40000
- driver: jedec_spi_nor
- path: /bus@f0000/bus@fc00000/spi@fc40000/flash@0
- type: NOR flash
- block size: 0x1000 bytes
- min I/O: 0x1 bytes
- 0x000000000000-0x000004000000 : "nor0"
- 0x000000000000-0x000000080000 : "ospi.tiboot3"
- 0x000000080000-0x000000280000 : "ospi.tispl"
- 0x000000280000-0x000000680000 : "ospi.u-boot"
- 0x000000680000-0x0000006c0000 : "ospi.env"
- 0x0000006c0000-0x000000700000 : "ospi.env.backup"
- 0x000000700000-0x000000800000 : "ospi.dtb"
- 0x000000800000-0x000001e00000 : "ospi.kernel"
- 0x000001e00000-0x000004000000 : "ospi.rootfs"
In this chapter, we will explore proceduress of flashing the OSPI NOR flash, starting from the point after the u-boot bootloader has successfully booted.
Flash SPI NOR Flash from SD Card
Flash SPI NOR from SD Card in U-Boot
The easiest way to access the SOM’s OSPI is to boot the SOM into U-Boot from an SD card (you may already be doing this). This guide will require a “Bootable SD card”, an SD card that has been flashed with the development kit’s BSP image. For instructions on how to create a bootable SD card, see this guide SD Card.
Power on the development kit and hit any key to stop in U-Boot.
Note
Be sure that you are booting the kit from SD card!
Within U-Boot, flash both SPLs and the U-Boot image into the OSPI storage device.
uboot:~# mtd list uboot:~# load mmc 1 ${loadaddr} tiboot3.bin uboot:~# mtd write ospi.tiboot3 ${loadaddr} 0 ${filesize} uboot:~# load mmc 1 ${loadaddr} tispl.bin uboot:~# mtd write ospi.tispl ${loadaddr} 0 ${filesize} uboot:~# load mmc 1 ${loadaddr} u-boot.img uboot:~# mtd write ospi.u-boot ${loadaddr} 0 ${filesize}
Note
If the flashing process did not worked, try to erase the mtd partition first using mtd erase <mtdname>.
You can also include an initramfs and kernel on the OSPI NOR, which will allow you to boot into Linux using OSPI. Again, you will need to be booted into U-Boot with an SD card, and this guide also expects that you have a USB drive with an initramfs image on it. The name of the initramfs image will vary depending on what machine you are using.
uboot:~# load mmc 1 ${loadaddr} k3-am642-phyboard-electra-rdk.dtb uboot:~# mtd write ospi.dtb ${loadaddr} 0 ${filesize} uboot:~# setenv size_fdt $filesize uboot:~# load mmc 1 ${loadaddr} Image uboot:~# mtd write ospi.kernel ${loadaddr} 0 ${filesize} uboot:~# setenv size_kern $filesize uboot:~# usb start uboot:~# load usb 0 ${loadaddr} phytec-initramfs-phyboard-electra-am64xx-2.cpio.xz uboot:~# mtd write ospi.rootfs ${loadaddr} 0 ${filesize} uboot:~# setenv size_fs $filesize uboot:~# saveenv uboot:~# env export -c ${loadaddr} uboot:~# sf update ${loadaddr} 0x680000 ${filesize} uboot:~# sf update ${loadaddr} 0x6c0000 ${filesize}
Flash SPI NOR from SD Card in Linux
If you have booted using the phytec-headless-image-phyboard-electra-am64xx-2.wic image, you can find all required bootloader binaries in the automatically mounted /boot/ directory.
phyboard-electra-am64xx-2:~# ls /boot tiboot3.bin* tispl.bin* u-boot.img* ...
Find the number of blocks to erase of the U-boot partition:
phyboard-electra-am64xx-2:~# mtdinfo /dev/mtd0 mtd0 Name: fc40000.spi.0 Type: nor Eraseblock size: 131072 bytes, 128.0 KiB Amount of eraseblocks: 512 (67108864 bytes, 64.0 MiB) Minimum input/output unit size: 1 byte Sub-page size: 1 byte Character device major/minor: 90:0 Bad blocks are allowed: false
Erase the U-Boot partition and flash it:
phyboard-electra-am64xx-2:~# flash_erase /dev/mtd0 0 512 phyboard-electra-am64xx-2:~# flashcp /boot/tiboot3.bin /dev/mtd0 phyboard-electra-am64xx-2:~# flashcp /boot/tispl.bin /dev/mtd1 phyboard-electra-am64xx-2:~# flashcp /boot/u-boot.img /dev/mtd2
Flash SPI NOR Flash from Network
Flash SPI NOR from Network in U-Boot
Similar to updating the eMMC 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. Before reading and writing to the MTD partitions is possible, the MTD list needs to be initilized:
uboot:~# mtd list
SF: Detected mt35xu512aba with page size 256 Bytes, erase size 4 KiB, total 64 MiB
List of MTD devices:
* nor0
- device: flash@0
- parent: spi@fc40000
- driver: jedec_spi_nor
- path: /bus@f0000/bus@fc00000/spi@fc40000/flash@0
- type: NOR flash
- block size: 0x1000 bytes
- min I/O: 0x1 bytes
- 0x000000000000-0x000004000000 : "nor0"
- 0x000000000000-0x000000080000 : "ospi.tiboot3"
- 0x000000080000-0x000000280000 : "ospi.tispl"
- 0x000000280000-0x000000680000 : "ospi.u-boot"
- 0x000000680000-0x0000006c0000 : "ospi.env"
- 0x0000006c0000-0x000000700000 : "ospi.env.backup"
- 0x000000700000-0x000000800000 : "ospi.dtb"
- 0x000000800000-0x000001e00000 : "ospi.kernel"
- 0x000001e00000-0x000004000000 : "ospi.rootfs"
Flash both SPLs and the U-Boot image into the OSPI storage device.
tftp ${loadaddr} tiboot3.bin mtd write ospi.tiboot3 ${loadaddr} 0 ${filesize} tftp ${loadaddr} tispl.bin mtd write ospi.tispl ${loadaddr} 0 ${filesize} tftp ${loadaddr} u-boot.img mtd write ospi.u-boot ${loadaddr} 0 ${filesize}
Flash SPI NOR from Network in Linux
Make sure all three bootloader binaries are available on the target, e.g. by copying them via scp:
host:~$ scp tiboot3.bin tispl.bin u-boot.img [email protected]:/root
Find the number of blocks to erase of the U-boot partition:
phyboard-electra-am64xx-2:~# mtdinfo /dev/mtd0 mtd0 Name: fc40000.spi.0 Type: nor Eraseblock size: 131072 bytes, 128.0 KiB Amount of eraseblocks: 512 (67108864 bytes, 64.0 MiB) Minimum input/output unit size: 1 byte Sub-page size: 1 byte Character device major/minor: 90:0 Bad blocks are allowed: false
Erase the U-Boot partition and flash it:
phyboard-electra-am64xx-2:~# flash_erase /dev/mtd0 0 512 phyboard-electra-am64xx-2:~# flashcp tiboot3.bin /dev/mtd0 phyboard-electra-am64xx-2:~# flashcp tispl.bin /dev/mtd1 phyboard-electra-am64xx-2:~# flashcp u-boot.img /dev/mtd2