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.

J721S2 is largely similar to J721E and AM654. The major differences are that it has the cypress s28hs512t flash, sysfw is bundled with tiboot3.bin and, OSPI0 is muxed externally between a NOR and a NAND flash through a physical switch. OSPI NOR and OSPI NAND can’t be used at the same time, they need to be selected by changing a physical configuration switch on the EVM board before driver probes them. CONFIG SW3.1 should be in OFF state to use OSPI NOR, and in ON STATE for OSPI NAND.

Flashing images to OSPI NOR/NAND

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

  • OSPI NOR:

    => 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
    
  • OSPI NAND:

    => mtd list
    => mtd erase spi-nand0
    => tftp $loadaddr tiboot3.bin
    => mtd write spi-nand0 $loadaddr 0x0 $filesize
    => tftp $loadaddr tispl.bin
    => mtd write spi-nand0 $loadaddr 0x80000 $filesize
    => tftp $loadaddr u-boot.img
    => mtd write spi-nand0 $loadaddr 0x280000 $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 cypress s28hs512t flash, this lies at the address 0x3fc0000. note, phy calibration is currently supported only for ospi nor flash.

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 0x3fc0000 $filesize

Flash layout for OSPI NOR

      0x0 +----------------------------+
          |     ospi.tiboot3(1m)       |
          |                            |
  0x80000 +----------------------------+
          |     ospi.tispl(2m)         |
          |                            |
 0x280000 +----------------------------+
          |     ospi.u-boot(4m)        |
          |                            |
 0x680000 +----------------------------+
          |     ospi.env(128k)         |
          |                            |
 0x6A0000 +----------------------------+
          |   ospi.env.backup(128k)    |
          |                            |
 0x6C0000 +----------------------------+
          |      padding (1280k)       |
 0x800000 +----------------------------+
          |     ospi.rootfs(ubifs)     |
          |                            |
0x3fc0000 +----------------------------+
          |   ospi.phypattern (256k)   |
          |                            |
          +----------------------------+

Flash layout for OSPI NAND

      0x0 +---------------------------------+
          |      ospi_nand.tiboot3(1m)      |
          |                                 |
  0x80000 +---------------------------------+
          |        ospi_nand.tispl(2m)      |
          |                                 |
 0x280000 +---------------------------------+
          |       ospi_nand.u-boot(4m)      |
          |                                 |
 0x680000 +---------------------------------+
          |       ospi_nand.env(128k)       |
          |                                 |
 0x6A0000 +---------------------------------+
          |    ospi_nand.env.backup(128k)   |
          |                                 |
 0x6C0000 +---------------------------------+
          |        padding (98048K)         |
0x2000000 +---------------------------------+
          |     ospi_nand.rootfs(ubifs)     |
          |                                 |
0x7fc0000 +---------------------------------+
          |   ospi_nand.phypattern (256k)   |
          |                                 |
          +---------------------------------+