3.1.1.7. OSPI/QSPI

OSPI/QSPI is a serial peripheral interface like SPI the major difference being the support for Octal/Quad read, uses 8/4 data lines for read compared to 2 lines used by the traditional SPI. This section documents how to write files to the QSPI device and use it to load and then boot the Linux Kernel using a root filesystem also found on QSPI. At this time, no special builds of U-Boot are required to perform these operations on the supported hardware. For simplicity we assume the files are being loaded from an SD card. Using the network interface (if applicable) is documented in U-boot SPI section.

Note

Not all OSPI flashes can be supported. Users are recommended to check whether or not the OSPI flash part chosen for custom board designs meets all the criteria listed at https://e2e.ti.com/support/processors/f/791/t/946418

Note

The sf command is used to access SPI NOR flash, supporting read/write/erase and a few other functions. For more information on sf command in U-boot please refer to the u-boot documentation: here. And for accessing SPI NAND flash, the mtd command is used, supporting read/write/erase and bad block management.

ROM supports booting from OSPI from offset 0x0.

Flashing Images to OSPI

Below commands can be used to download tiboot3.bin, tispl.bin and u-boot.img over tftp and then flash it to OSPI at respective addresses.

=> sf probe
=> tftp ${loadaddr} tiboot3.bin
=> sf update $loadaddr 0x0 $filesize
=> tftp ${loadaddr} tispl.bin
=> sf update $loadaddr 0x80000 $filesize
=> tftp ${loadaddr} u-boot.img
=> sf update $loadaddr 0x280000 $filesize
=> tftp ${loadaddr} sysfw.itb
=> sf update $loadaddr 0x6C0000 $filesize

PHY Calibration

PHY calibration allows for higher read performance. To enable PHY, the PHY calibration pattern must be flashed to OSPI at the start of the last erase sector. For the Micron MT35XU512ABA flash, this lies at the address 0x3fe0000.

Download the binary file containing the PHY pattern from here. Below commands can be used to flash the PHY pattern, with the location of the pattern depending on which flash is being used:

=> sf probe
=> tftp ${loadaddr} ospi_phy_pattern
=> sf update $loadaddr 0x3fe0000 $filesize

Flash Layout for OSPI

      0x0 +----------------------------+
          |     ospi.tiboot3(512K)     |
          |                            |
  0x80000 +----------------------------+
          |     ospi.tispl(2M)         |
          |                            |
 0x280000 +----------------------------+
          |     ospi.u-boot(4M)        |
          |                            |
 0x680000 +----------------------------+
          |     ospi.env(128K)         |
          |                            |
 0x6A0000 +----------------------------+
          |   ospi.env.backup (128K)   |
          |                            |
 0x6C0000 +----------------------------+
          |      ospi.sysfw(1M)        |
          |                            |
 0x7C0000 +----------------------------+
          |      padding (256k)        |
 0x800000 +----------------------------+
          |     ospi.rootfs(UBIFS)     |
          |                            |
0x3FE0000 +----------------------------+
          |   ospi.phypattern (128k)   |
          |                            |
          +----------------------------+

Kernel Image and DT are expected to be present in the /boot folder of UBIFS ospi.rootfs just like in SD card case. U-Boot looks for UBI volume named “rootfs” for rootfs.

To boot kernel from OSPI, at the U-Boot prompt:

=> setenv boot ubi
=> boot

Writing to OSPI using DFU

Setup: Connect the Type C port (USB0 port) of EVM to ubuntu host PC. Make sure dfu-util tool is installed and USB0 port is in UFP/DRP mode: SW3[3:4] = 01 or 1x.

#sudo apt-get install dfu-util

From u-boot(for OSPI flash):

U-Boot # env default -a
U-Boot # setenv dfu_alt_info ${dfu_alt_info_ospi}; dfu 0 sf "0:0:25000000:0"

From u-boot(for QSPI flash):

U-Boot # env default -a
U-Boot # setenv dfu_alt_info ${dfu_alt_info_ospi}; dfu 0 sf "1:0:40000000:0"

From ubuntu PC: Using dfu-util utilities to flash the binares to OSPI/QSPI flash.

# sudo dfu-util -l
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Found DFU: [0451:6163] ver=0224, devnum=75, cfg=1, intf=0, path="1-5", alt=5, name="rootfs", serial="0000000000000110"
Found DFU: [0451:6163] ver=0224, devnum=75, cfg=1, intf=0, path="1-5", alt=4, name="sysfw.itb", serial="0000000000000110"
Found DFU: [0451:6163] ver=0224, devnum=75, cfg=1, intf=0, path="1-5", alt=3, name="u-boot-env", serial="0000000000000110"
Found DFU: [0451:6163] ver=0224, devnum=75, cfg=1, intf=0, path="1-5", alt=2, name="u-boot.img", serial="0000000000000110"
Found DFU: [0451:6163] ver=0224, devnum=75, cfg=1, intf=0, path="1-5", alt=1, name="tispl.bin", serial="0000000000000110"
Found DFU: [0451:6163] ver=0224, devnum=75, cfg=1, intf=0, path="1-5", alt=0, name="tiboot3.bin", serial="0000000000000110""

Flash the binaries to the respective regions using alternate interface number (alt=<x>).

# sudo dfu-util -c 1 -i 0 -a 0 -D tiboot3.bin
# sudo dfu-util -c 1 -i 0 -a 1 -D tispl.bin
# sudo dfu-util -c 1 -i 0 -a 2 -D u-boot.img
# sudo dfu-util -c 1 -i 0 -a 3 -D sysfw.itb