2021-02-22

深渊向深渊呼唤

TI jacinto uboot – 中

3.1.1.5. NAND
请注意
J721E平台不支持NAND。
本节介绍如何将文件写入NAND设备,并使用它来使用NAND上的根文件系统加载并引导Linux内核。

3.1.1.5.1 擦除,读写NAND分区
清单NAND闪存分区
使用如下命令查看U-boot中启用的mtd设备列表.

mtdparts
Example output on DRA71x EVM:
device nand0 <nand.0>, # parts = 10
 #: name                size            offset          mask_flags
 0: NAND.SPL            0x00020000      0x00000000      0
 1: NAND.SPL.backup1    0x00020000      0x00020000      0
 2: NAND.SPL.backup2    0x00020000      0x00040000      0
 3: NAND.SPL.backup3    0x00020000      0x00060000      0
 4: NAND.u-boot-spl-os  0x00040000      0x00080000      0
 5: NAND.u-boot         0x00100000      0x000c0000      0
 6: NAND.u-boot-env     0x00020000      0x001c0000      0
 7: NAND.u-boot-env.backup10x00020000   0x001e0000      0
 8: NAND.kernel         0x00800000      0x00200000      0
 9: NAND.file-system    0x0f600000      0x00a00000      0

注意:在后面的部分中,符号应该替换为执行mtdparts命令时看到的分区名称。
擦除分区

nand erase.part <partition name>

写入分区

在写入NAND分区时,要写入的文件必须事先复制到内存中。

nand write <ddr address> <partition name> <file size>

符号是指在内存中文件被读入ddr内存的位置。符号表示要写入NAND分区的文件字节数(十六进制)。注意:在将文件读入DDR时,默认情况下,U-boot将环境变量“filesize”的值设置为通过上一个read/load命令读取的字节数(十六进制)。
下面的示例显示了将内核(zImage)写入NAND内核分区的过程。要写入的zImage从SD卡的rootfs(第2个)分区加载。将zImage从MMC加载到DDR内存

U-Boot # mmc dev 0;
U-Boot # setenv devnum 0
U-Boot # setenv devtype mmc
U-Boot # mmc rescan
U-Boot # load ${devtype} 1:2 ${loadaddr} /boot/zImage

现在zImage已加载到内存中,需要时间将其写入NAND分区

U-Boot # nand erase.part NAND.kernel
U-Boot # nand write ${loadaddr} NAND.kernel ${filesize}
从分区读
nand read <ddr address> <partition name>

符号应替换为您希望将NAND分区的内容复制到的ddr中的位置。符号包含要从中读取的NAND分区名称。
3.1.1.5.2. 通过DFU写入NAND
目前在支持使用DFU的板中,默认构建支持写入NAND,因此不需要定制构建。要查看要写入的可用位置的列表(用DFU术语,altsettings),请使用mtdparts命令列出已知的MTD分区和printenv dfu_alt_settings,以查看它们是如何映射和公开给dfu-util。

U-Boot # mtdparts

device nand0 <nand0>, # parts = 8
 #: name                size            offset          mask_flags
 0: NAND.SPL            0x00020000      0x00000000      0
 1: NAND.SPL.backup1    0x00020000      0x00020000      0
 2: NAND.SPL.backup2    0x00020000      0x00040000      0
 3: NAND.SPL.backup3    0x00020000      0x00060000      0
 4: NAND.u-boot         0x001e0000      0x00080000      0
 5: NAND.u-boot-env     0x00020000      0x00260000      0
 6: NAND.kernel         0x00500000      0x00280000      0
 7: NAND.file-system    0x0f880000      0x00780000      0

active partition: nand0,0 - (SPL) 0x00080000 @ 0x00000000
U-Boot # printenv dfu_alt_info_nand
dfu_alt_info=NAND.SPL part 0 1;NAND.SPL.backup1 part 0 2;NAND.SPL.backup2 part 0 3;NAND.SPL.backup3 part 0 4;NAND.u-boot part 0 5;NAND.kernel part 0 7;NAND.file-system part 0 8

这意味着您可以告诉dfu-util将任何内容写入:
•NAND.SPL
•NAND.SPL.backup1
•NAND.SPL.backup2
•NAND.SPL.backup3
•NAND.u-boot
•NAND.kernel
•NAND.file-system
在写入之前,必须至少擦除要写入的区域。然后在第一个NAND设备的目标上启动DFU:

U-Boot # nand erase.chip
U-Boot # setenv dfu_alt_info ${dfu_alt_info_nand}
U-Boot # dfu 0 nand 0

然后在主机PC上将MLO写入第一个SPL分区:

$ sudo dfu-util -D MLO -a NAND.SPL

3.1.1.5.3 NAND引导
如果您想从NAND加载并运行U-Boot,第一步是确保正确的U-Boot文件被加载到正确的分区。对于AM335x, AM437x, DRA7x设备,这意味着将文件MLO写入NAND的SPL分区。对于OMAP-L138设备,将.ais映像写入NAND分区。对于所有设备,这需要写入u-boot.img到NAND的U-Boot分区。
请注意
OMAP-L138的NAND分区与其他设备不同,请使用以下命令对NAND进行编程:

=> setenv ipaddr <EVM_IPADDR>
=> setenv serverip <TFTP_SERVER_IPADDR>
=> tftp ${loadaddr} ${serverip}:u-boot-omapl138-lcdk.ais
=> print filesize
=> nand erase 0x20000 <hex_len>
=> nand write ${loadaddr} 0x20000 <hex_len>
hex_len是文件大小的下一个扇区边界。扇区大小为0x10000。将dip开关设置为NAND boot并关闭EVM电源。
文件写入NAND后,应关闭电路板电源。接下来evm的引导开关需要配置为NAND引导。要了解适当的引导开关设置,请参阅evm的硬件设置指南。
3.1.1.5.4。从NAND引导内核和文件系统
如果用户希望使用NAND作为其主存储,那么NAND闪存必须为引导内核所需的所有关键软件拥有单独的分区。至少包括内核、dtb和文件系统。一些SoCs需要额外的文件和固件,它们也需要存储在不同的NAND分区中。
与从任何接口引导内核类似,用户必须确保引导所需的所有文件都加载到DDR内存中。唯一的例外是由内核通过bootargs参数加载的文件系统。Bootargs包含传递给内核的信息,包括挂载文件系统的位置和方式。
下面包含DRA7x evm使用ubifs文件系统时使用的引导示例:
setenv bootargs console=${console} ${optargs} root=ubi0:rootfs rw ubi.mtd=NAND.file-system,2048 rootfstype=ubifs rootwait=1

在上面的boottargs示例中,“rootfs”代表在ubinize.cfg文件中定义的“vol_name”参数中指定的值。在ubi.mtd 中“NAND.file-system” and “2048”表示包含ubifs和页面大小的分区的名称。Rootfstype只是告诉内核要使用哪种类型的文件系统。
默认情况下,我们的evms正确加载、设置引导和引导内核是通过在U-boot中运行“run nandboot”来处理的。关于创建UBIFS的信息可以在这里找到。
3.1.1.6. SD、eMMC或USB存储
使用SD卡、eMMC闪存和USB大容量存储设备(硬盘驱动器、闪存驱动器、读卡器等)的命令都非常相似。最大的区别是,在某些硬件上,我们可能无法从存储设备的ROM中运行U-Boot,因为它不受支持。但是,一旦U-Boot运行,这些文件中的任何一个都可以用于内核和根文件系统。
3.1.1.6.1. 从U-Boot分区eMMC
eMMC设备通常不附带任何分区表。我们利用U-Boot中的GPT支持将GPT分区表写入eMMC。在这种情况下,我们需要在主机上使用uuidgen程序来创建用于磁盘和每个分区的UUIDs。

$ uuidgen
...first uuid...
$ uuidgen
...second uuid...
U-Boot # printenv partitions
uuid_disk=${uuid_gpt_disk};name=rootfs,start=2MiB,size=-,uuid=${uuid_gpt_rootfs}
U-Boot # setenv uuid_gpt_disk ...first uuid...
U-Boot # setenv uuid_gpt_rootfs ...second uuid...
U-Boot # gpt write mmc 1 ${partitions}

分区表需要重置才能可见。
3.1.1.6.2. 从主机更新SD卡
本节假设您已经按照Processor SDK Linux Create SD卡脚本上的说明创建了SD卡,或者手工制作了兼容的布局。在这种情况下,您需要复制所有引导映像(MLO and u-boot.img for 32-bit platforms, tiboot3.bin, sysfw.itb, tispl.bin, u-boot.img for K3 based platforms)文件,将其添加到引导分区。此时,该卡现在可以在SD卡插槽中引导。我们默认在rootfs分区上使用/boot/${bootfile},从/boot加载的设备树文件与内核中的同名。
但是,如果您使用的是基于OMAP-L138的主板(如LCDK),则需要编写生成的u-boot.ais使用dd命令将映像传输到SD卡。

$ sudo dd if=u-boot.ais of=/dev/sd<N> seek=117 bs=512 conv=fsync

3.1.1.6.3。使用DFU更新SD卡或eMMC
要查看可写入的可用位置列表(用DFU术语表示,altsettings),请使用mmc part命令列出MMC设备上的分区,并使用printenv dfu_alt_settings_mmc or dfu_alt_settings_emmc查看它们是如何映射和暴露给dfu-util的。

U-Boot# mmc part

Partition Map for MMC device 0  --   Partition Type: DOS

Partition     Start Sector     Num Sectors     Type
    1                   63          144522       c Boot
    2               160650         1847475      83
    3              2024190         1815345      83
U-Boot# printenv dfu_alt_info_mmc
dfu_alt_info=boot part 0 1;rootfs part 0 2;MLO fat 0 1;u-boot.img fat 0 1;uEnv.txt fat 0 1"

这意味着你可以告诉dfu-util将任何东西写入:
• boot
• rootfs
• MLO
• u-boot.img
• uEnv.txt
MLO, u-boot.img and uEnv.txt文件将被写入FAT文件系统.
在第一个MMC设备的目标上启动DFU:

U-Boot # setenv dfu_alt_info ${dfu_alt_info_mmc}
U-Boot # dfu 0 mmc 0

在AM57x GP EVM或BeagleBoard x15这样的板上,第二个USB实例被用作USB客户端,dfu命令变成:

U-Boot # dfu 1 mmc 0

然后在主机PC上写MLO到一个现有的引导分区:

$ sudo dfu-util -D MLO -a MLO

在主机PC上覆盖当前引导分区的内容,在主机FAT文件系统映像上新建一个:

$ sudo dfu-util -D fat.img -a boot

3.1.1.6.4. 使用原始写入更新SD卡或eMMC
在某些情况下,需要编写MLO和u-boot.img作为原始映像发送到MMC设备,而不是文件系统中。例如,eMMC需要这样做。在这种情况下,下面介绍如何对这些文件进行编程,而不是覆盖设备上的分区表。我们假设这些文件存在于SD卡上。此外,您可能希望将文件系统映像写入设备,因此还提供了一个示例。

U-Boot # mmc dev 0
U-Boot # mmc rescan
U-Boot # mmc dev 1
U-Boot # fatload mmc 0 ${loadaddr} MLO
U-Boot # mmc write ${loadaddr} 0x100 0x100
U-Boot # mmc write ${loadaddr} 0x200 0x100
U-Boot # fatload mmc 0 ${loadaddr} u-boot.img
U-Boot # mmc write ${loadaddr} 0x300 0x400
U-Boot # fatload mmc 0 ${loadaddr} rootfs.ext4
U-Boot # mmc write ${loadaddr} 0x1000 ...rootfs.ext4 size in bytes divided by 512, in hex...

3.1.1.6.5 从SD卡或eMMC启动Linux
在每个支持SD/MMC的板的默认环境中,都有一个名为mmcboot的引导命令,它将正确设置引导参数并启动内核。但是,在这种情况下,您必须首先运行loaduimagefat or loaduimage来首先将内核加载到内存中。对于每个细节,请在mmcboot, loaduimagefat and loaduimage变量上使用printenv,然后依次在命令的其他子部分上使用printenv。这里最重要的变量是mmcroot and mmcrootfstype。
3.1.1.6.6. 从eMMC引导分区引导MLO和u-boot
名称:booting-mlo-and-u-boot-from-emmc-boot-partition
dra7xx和am57xx处理器支持从eMMC引导分区引导。以下命令从网络加载引导映像并将它们写入boot0分区。

U-boot # setenv autoload no
U-boot # dhcp
U-boot # mmc dev 1 1
U-boot # tftp ${loadaddr} dra7xx/MLO
U-boot # mmc write ${loadaddr} 0x0 0x300
U-boot # tftp ${loadaddr} dra7xx/u-boot.img
U-boot # mmc write ${loadaddr} 0x300 0x400

我们还需要使用bootbus和partconf命令配置eMMC。bootbus命令将eMMC设置为双数据速率模式,总线宽度为8,以与Boot ROM支持的总线配置相匹配。partconf命令在引导操作期间访问boot0分区。注意,这些配置仅限于启动操作,一旦启动操作完成,eMMC可以设置为最高速度模式。所有这些都是非易失性配置,每个eMMC/board都需要做一次。

U-boot # mmc bootbus 1 2 0 2
U-boot # mmc partconf 1 1 1 0
U-boot # mmc rst-function 1 1

3.1.1.6.7。从eMMC引导分区引导tiboot3.bin, tispl.bin and u-boot.img

基于K3的处理器支持从eMMC引导分区启动。可以使用以下命令下载tiboot3.bin, tispl.bin and u-boot.img。并将它们写入eMMC boot0分区的相应地址.

=> mmc dev 0 1
=> fatload mmc 1 ${loadaddr} tiboot3.bin
=> mmc write ${loadaddr} 0x0 0x400
=> fatload mmc 1 ${loadaddr} tispl.bin
=> mmc write ${loadaddr} 0x400 0x1000
=> fatload mmc 1 ${loadaddr} u-boot.img
=> mmc write ${loadaddr} 0x1400 0x2000
=> fatload mmc 1 ${loadaddr} sysfw.itb
=> mmc write ${loadaddr} 0x3600 0x800

要让ROM访问引导分区,必须第一次使用以下命令:

=> mmc partconf 0 1 1 1
=> mmc bootbus 0 2 0 0

3.1.1.6.8 从USB存储启动Linux
名称: booting-linux-from-usb-storage
要从AMx/DRA7x EVMs上的USB而不是SD/MMC卡加载Linux内核和rootfs,如果我们假设USB设备的分区方式与SD/MMC卡相同,我们可以使用mmcboot命令进行引导。为此,请执行以下步骤:

U-Boot # usb start
U-Boot # setenv mmcroot /dev/sda2 ro
U-Boot # run mmcargs
U-Boot # run bootcmd_usb

对于K2H/K/E/L EVMs,内核中的USB驱动程序需要内置(默认模块)。配置更改如下:

CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_PCI=y
CONFIG_USB_XHCI_PLATFORM=y
CONFIG_USB_STORAGE=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_HOST=y
CONFIG_USB_DWC3_KEYSTONE=y
CONFIG_EXTCON=y
CONFIG_EXTCON_USB_GPIO=y
CONFIG_SCSI_MOD=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y

USB应具有FAT32格式的引导分区和EXT4格式的rootfs分区。启动分区必须包含以下映像:

keystone-<platform>-evm.dtb
skern-<platform>.bin
k2-fw-initrd.cpio.gz
zImage

其中=k2hk,k2e,k2l
rootfs分区包含ProcSDK发行包中的文件系统.

# mkdir /mnt/temp
# mount -t ext4 /dev/sdb2 /mnt/temp
# cd /mnt/temp
# tar xvf <Linux_Proc_Sdk_Install_DIR>/filesyste/tisdk-server-rootfs-image-k2hk-evm.tar.xz
# cd /mnt
# umount temp

设置以下u-boot环境变量:

setenv args_all 'setenv bootargs console=ttyS0,115200n8 rootwait'
setenv args_usb 'setenv bootargs ${bootargs} rootdelay=3 rootfstype=ext4 root=/dev/sda2 rw'
setenv get_fdt_usb 'fatload usb 0:1 ${fdtaddr} ${name_fdt}'
setenv get_kern_usb 'fatload usb 0:1 ${loadaddr} ${name_kern}'
setenv get_mon_usb 'fatload usb 0:1 ${addr_mon} ${name_mon}'
setenv init_fw_rd_usb 'fatload usb 0:1 ${rdaddr} ${name_fw_rd}; setenv filesize <hex_len>; run set_rd_spec'
setenv init_usb 'usb start; run args_all args_usb'
setenv boot usb
saveenv
boot

注:<hex_len>必须至少为k2-fw-initrd.cpio.gz文件的十六进制大小。
在J721e EVM上启用USB 3.0主机端口
注意
J721e SoC不支持从USB大容量存储设备引导。但可以在U-Boot提示符下用作存储设备。
J721e基板上的USB0实例连接到TypeC端口,该端口既可以用作主机端口,也可以用作设备端口。默认情况下,USB0 is port配置为处于外设模式。由于U-Boot不支持USB角色的动态切换,因此需要应用下面的DT fragment并重建U-Boot映像,使USB0端口成为usb3.0主机端口。

diff --git a/arch/arm/dts/k3-j721e-common-proc-board-u-boot.dtsi b/arch/arm/dts/k3-j721e-common-proc-board-u-boot.dtsi
index 50effb4812b2..28986c4d2c2a 100644
--- a/arch/arm/dts/k3-j721e-common-proc-board-u-boot.dtsi
+++ b/arch/arm/dts/k3-j721e-common-proc-board-u-boot.dtsi
@@ -184,11 +184,10 @@

 &usbss0 {
        u-boot,dm-spl;
-       ti,usb2-only;
 };

 &usb0 {
-       dr_mode = "peripheral";
+       dr_mode = "host";
        u-boot,dm-spl;
 };

3.1.1.6.9. 从SD/eMMC从SPL引导(单级或Falcon模式)
在这种引导模式下,SPL(第一阶段引导加载程序)直接引导Linux内核。(可选)要进入U-Boot,请在按住串行终端上的“c”键的同时重置电路板。当在U-Boot构建中启用falcon模式(通常在默认情况下启用)时,MLO检查在定义的偏移量处是否存在有效的uImage。如果存在uImage,则直接引导它。如果找不到有效的uImage,MLO会返回到检查uImage是否存在于FAT分区中。如果它失败了,它会退回到启动u-boot.img.
falcon boot使用uImage。要构建内核uImage,需要将U-Boot工具mkimage保存在$PATH中

# make uImage modules dtbs LOADADDR=80008000

如果内核不是使用CONFIG_CMDLINE构建的,无法设置正确的引导参数,则使用fdtput host实用程序在DTB文件中的选定节点中添加所需的引导参数。例如,对于DRA74x EVM:

# fdtput -v -t s arch/arm/boot/dts/dra7-evm.dtb "/chosen" bootargs "console=ttyO0,115200n8 root=<rootfs>"

MLO, u-boot.img (optional), DTB, uImage都存储在同一介质上,即SD或eMMC。有两种方法可以将二进制文件存储在SD(resp。eMMC):

raw:二进制文件以固定的偏移量存储在介质中
*fat:二进制文件作为文件存储在fat分区中
要将二进制文件flash到SD或eMMC,可以使用DFU。对于SD引导,从u-boot提示符
=> env default -a; setenv dfu_alt_info ${dfu_alt_info_mmc}; dfu 0 mmc 0

对于eMMC引导,从u-boot提示符

=> env default -a; setenv dfu_alt_info ${dfu_alt_info_emmc}; dfu 0 mmc 1

注:在AM57x GP EVM或BeagleBoard x15等板上,第二个USB实例用作USB客户端,请将“dfu 0 mmc X”替换为“dfu 1 mmc X”
在主机端:FAT中的二进制文件:

$ sudo dfu-util -D MLO -a MLO
$ sudo dfu-util -D u-boot.img -a u-boot.img
$ sudo dfu-util -D dra7-evm.dtb -a spl-os-args
$ sudo dfu-util -D uImage -a spl-os-image

原始二进制文件:

$ sudo dfu-util -D MLO -a MLO.raw
$ sudo dfu-util -D u-boot.img -a u-boot.img.raw
$ sudo dfu-util -D dra7-evm.dtb -a spl-os-args.raw
$ sudo dfu-util -D uImage -a spl-os-image.raw

如果二进制文件是fat分区中的文件,则需要指定它们的名称(如果它们与默认值(“uImage”和“args”)不同)。注意,DFU使用名称“spl-os-image” and “spl-os-args”,因此在DFU的情况下需要此步骤。从u-boot提示符

=> setenv falcon_image_file spl-os-image
=> setenv falcon_args_file spl-os-args
=> saveenv

将环境变量“boot_os”设置为1。从u-boot提示符

=> setenv boot_os 1
=> saveenv

设置单板从SD启动(或eMMC启动),复位EVM。SPL直接从SD(或eMMC)引导内核映像。
3.1.1.7. SPI
注意
J721E平台不支持SPI(不要与QSPI/OSPI混淆)。
本节介绍如何将文件写入SPI设备,并使用它加载Linux内核,然后使用SPI上的根文件系统引导Linux内核。此时,在支持的硬件上执行这些操作不需要特殊的U-Boot版本。但是,下表列出的构建也将在环境中使用SPI闪存,而不是默认值,在AM57x和DRA7x EVMs中通常是NAND,但在Keystone-2 EVMs中,它只是NOR。最后,为了简单起见,我们假设文件是从SD卡加载的。使用网络接口(如适用)见上文。
3.1.1.7.1. 从U-Boot写入SPI
AM57x和DRA7x平台的注意事项:
•在U-Boot构建中MLO.byteswap and u-boot.img文件就是要写的。
•在本例中,我们从SD卡加载所有文件,但也可以通过网络(如上所述)或其他现有接口轻松加载。
•此时SPI mtd partition map尚未更新,以包括设备树的示例位置。

U-Boot # mmc rescan
U-Boot # sf probe 0
U-Boot # sf erase 0 +80000
U-Boot # fatload mmc 0 ${loadaddr} MLO.byteswap
U-Boot # sf write ${loadaddr} 0 ${filesize}
U-Boot # fatload mmc 0 ${loadaddr} u-boot.img
U-Boot # sf write ${loadaddr} 0x20000 ${filesize}
U-Boot # sf erase 80000 +${spiimgsize}
U-Boot # fatload mmc 0 ${loadaddr} zImage
U-Boot # sf write ${loadaddr} ${spisrcaddr} ${filesize}

Keystone-2(K2H/K/E/L/G)平台注释:
•从U-Boot构建,u-boot-spi.gph文件是要写入的文件。
•在本例中,我们通过netowrk从tftp服务器加载文件。
•串行命令将u-boot映像烧录到SPI NOR flash

U-Boot # env default -f -a
U-Boot # setenv serverip <ip address of tftp server>
U-Boot # setenv tftp_root <tftp root directory>
U-Boot # setenv name_uboot u-boot-spi.gph
U-Boot # run get_uboot_net
U-Boot # run burn_uboot_spi

3.1.1.7.2 从SPI引导
在每个支持SPI的板的默认环境中,都有一个名为spiboot的引导命令,它将自动加载内核并引导。要获得每个命令的确切细节,请在spiboot变量上使用printenv,然后依次在命令的其他小节上使用printenv。这里最重要的变量是spiroot和spirootfstype。对于Keystone-2平台,通过SW1拨码设置为ARM SPI启动模式。请参考每个Keystone-2 EVM的硬件设置。
3.1.1.8. OSPI/QSPI
OSPI/QSPI是一种类似SPI的串行外围接口,主要区别在于支持八进制/四进制读取,使用8/4数据线进行读取,而传统SPI使用2线。本节介绍如何将文件写入QSPI设备,并使用它加载Linux内核,然后使用QSPI上的根文件系统引导Linux内核。此时,在支持的硬件上执行这些操作不需要特殊的U-Boot版本。为简单起见,我们假设文件是从SD卡加载的。使用网络接口(如适用)见上文。
3.1.1.8.1. AM654/J721E支持
ROM支持从OSPI从偏移量0x0启动。
Flashing Images to OSPI
下面的命令可以用来下载tiboot3.bin, tispl.bin and u-boot.img通过tftp,然后在相应的地址将其flash到OSPI。

=> 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校准
PHY校准允许更高的读取性能。要使能PHY, PHY校准模式必须在最后一个擦除扇区的开始flashed到OSPI。对于Micron MT35XU512ABA闪存,它位于地址0x3fe0000。
下面的命令可以用来flash PHY pattern,pattern的位置取决于哪个flash正在被使用:

=> sf probe
=> tftp ${loadaddr} pattern_file
=> 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)   |
          |                            |
          +----------------------------+

内核映像和DT应该出现在UBIFS的/boot文件夹中ospi.rootfs就像SD卡一样。U-Boot为rootfs查找名为“rootfs”的UBI卷。
要从OSPI引导内核,请在U-boot提示符下:

=> setenv boot ubi
=> boot

3.1.1.8.2 J7200支持
J7200在很大程度上类似于J721E和AM654。主要的区别是它有Cypress S28HS512T flash, sysfw绑定了tiboot3.bin。

Flashing Images to OSPI
下面的命令可以用来通过tftp下载tiboot3.bin, tispl.bin and u-boot.img,然后在相应的地址将其flash到OSPI。

=> 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

PHY校准
PHY校准允许更高的读取性能。要启用PHY,PHY校准模式必须在最后一个擦除扇区开始时flashed到OSPI。对于Cypress S28HS512T闪存,它位于地址0x3fc0000处。
以下命令可用于刷新PHY pattern,pattern的位置取决于正在使用的闪存:

=> sf probe
=> tftp ${loadaddr} pattern_file
=> sf update $loadaddr 0x3fc0000 $filesize
Flash Layout for OSPI
      0x0 +----------------------------+
          |     ospi.tiboot3(512K)     |
          |                            |
  0x80000 +----------------------------+
          |     ospi.tispl(2M)         |
          |                            |
 0x280000 +----------------------------+
          |     ospi.u-boot(4M)        |
          |                            |
 0x680000 +----------------------------+
          |     ospi.env(256K)         |
          |                            |
 0x6C0000 +----------------------------+
          |   ospi.env.backup (256K)   |
          |                            |
 0x700000 +----------------------------+
          |       padding (1M)         |
 0x800000 +----------------------------+
          |     ospi.rootfs(UBIFS)     |
          |                            |
0x3FC0000 +----------------------------+
          |   ospi.phypattern (256k)   |
          |                            |
          +----------------------------+
 

3.1.1.8.3. DRA7xx support

Memory Layout of QSPI Flash
+----------------+ 0x00000
|      MLO       |
|                |
+----------------+ 0x040000
|   u-boot.img   |
|                |
+----------------+ 0x140000
|   DTB blob     |
+----------------+ 0x1c0000
|   u-boot env   |
+----------------+ 0x1d0000
|   u-boot env   |
|    (backup)    |
+----------------+ 0x1e0000
|                |
|     uImage     |
|                |
|                |
+----------------+ 0x9e0000
|                |
|  other data    |
|                |
+----------------+

从U-Boot写入QSPI
注意:
•从U-Boot构建,MLO and u-boot.img文件是要写入的文件。
•在这个例子中,我们从SD卡加载所有文件,但它们也可以通过网络(如上所述)或其他存在的接口轻松加载。
编写MLO and u-boot.img二进制文件。
对于QSPI_1使用dra7xx_evm_config构建U-Boot

U-Boot # mmc rescan
U-Boot # fatload mmc 0 ${loadaddr} MLO
U-Boot # sf probe 0
U-Boot # sf erase 0x00000 0x100000
U-Boot # sf write ${loadaddr} 0x00000 ${filesize}
U-Boot # fatload mmc 0 ${loadaddr} u-boot.img
U-Boot # sf write ${loadaddr} 0x40000 ${filesize}

更改SW2[5:0] = 110110为qspi引导。
对于QSPI_4,使用dra7xx_evm_qspiboot_config构建U-Boot

U-Boot # mmc rescan
U-Boot # fatload mmc 0 ${loadaddr} MLO
U-Boot # sf probe 0
U-Boot # sf erase 0x00000 0x100000
U-Boot # sf write ${loadaddr} 0x00000 0x10000
U-Boot # fatload mmc 0 ${loadaddr} u-boot.img
U-Boot # sf write ${loadaddr} 0x40000 0x60000

更改SW2[5:0] = 110111为qspi引导。
使用DFU写入QSPI
安装:连接EVM的usb0端口到ubuntu主机PC。确保安装了dfu-util工具。

#sudo apt-get install dfu-util

从 u-boot:

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

从ubuntu PC:使用dfu-util实用程序flash二进制文件到QSPI flash.

# sudo dfu-util -l
(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY
dfu-util does currently only support DFU version 1.0
Found DFU: [0451:d022] devnum=0, cfg=1, intf=0, alt=0, name="MLO"
Found DFU: [0451:d022] devnum=0, cfg=1, intf=0, alt=1, name="u-boot.img"
Found DFU: [0451:d022] devnum=0, cfg=1, intf=0, alt=2, name="u-boot-spl-os"
Found DFU: [0451:d022] devnum=0, cfg=1, intf=0, alt=3, name="u-boot-env"
Found DFU: [0451:d022] devnum=0, cfg=1, intf=0, alt=4, name="u-boot-env.backup"
Found DFU: [0451:d022] devnum=0, cfg=1, intf=0, alt=5, name="kernel"

使用备用接口号(alt=)将二进制文件闪存到相应的区域。

# sudo dfu-util -c 1 -i 0 -a 0 -D MLO
# sudo dfu-util -c 1 -i 0 -a 1 -D u-boot.img
# sudo dfu-util -c 1 -i 0 -a 2 -D <DTB-file>
# sudo dfu-util -c 1 -i 0 -a 5 -D uImage

从u-boot QSPI引导
默认环境不包含QSPI启动命令。下面的示例使用在内核中找到的分区表。

U-Boot # sf probe 0
U-Boot # sf read ${loadaddr} 0x1e0000 0x800000
U-Boot # sf read ${fdtaddr} 0x140000 0x80000
U-Boot # setenv bootargs console=${console} root=/dev/mtdblock19 rootfstype=jffs2
U-Boot # bootz ${loadaddr} - ${fdtaddr}

从SPL的QSPI引导(单级或Falcon模式)
在这种引导模式下,SPL(第一阶段引导加载程序)直接引导Linux内核。(可选)要进入U-Boot,请在按住串行终端上的“c”键的同时重置电路板。当在U-Boot构建中启用falcon模式(通常在默认情况下启用)时,MLO检查在定义的偏移量处是否存在有效的uImage。如果存在uImage,则直接引导它。如果找不到有效的uImage,MLO将返回到引导u-boot.img.
对于QSPI单级或Falcon模式,应启用CONFIG_QSPI_BOOT引导。

Menuconfig->Bood media
   [ ] Support for booting from NAND flash
   ..
   [*] Support for booting from QSPI flash
   [ ] Support for booting from SATA


MLO, u-boot.img (optional), DTB, uImage存储在QSPI闪存中。有关偏移量的详细信息,请参阅“内存布局”部分。例如,要将二进制文件闪存到QSPI,可以使用DFU。
QSPI引导使用uImage。构建内核uImage。您需要将U-Boot工具mkimage保存在$PATH中

# make uImage modules dtbs LOADADDR=80008000

如果内核没有使用CONFIG_CMDLINE来设置正确的引导,那么使用fdtput主机实用程序在DTB文件中选择的节点中添加所需的引导。例如,DRA74x EVM:

# fdtput -v -t s arch/arm/boot/dts/dra7-evm.dtb "/chosen" bootargs "console=ttyO0,115200n8 root=<rootfs>"

将环境变量“boot_os”设置为1.

From u-boot prompt
=> setenv boot_os 1
=> saveenv

设置单板从QSPI启动,复位EVM。SPL直接从QSPI引导内核映像.
3.1.1.8.4. AM335X支持
以下平台支持SPI引导:

Board	Config target
AM335x ICE	am335x_evm_spiboot_defconfig
U-Boot # mmc rescan
U-Boot # sf probe 0
U-Boot # sf erase 0x0 0x100000
U-Boot # fatload mmc 0 ${loadaddr} MLO.byteswap
U-Boot # sf write ${loadaddr} 0x0 ${filesize}
U-Boot # fatload mmc 0 ${loadaddr} u-boot.img
U-Boot # sf write ${loadaddr} 0x20000 ${filesize}

注:
•默认情况下,来自SPI的AM335X ICE boots。要从SD卡引导,请擦除MLO分区

U-Boot # sf erase 0x0 0x20000

3.1.1.8.5. AM43xx支持
在AM43xx平台上使用QSPI是作为eXecute In Place完成的,U-Boot是直接引导的。
从U-Boot写入QSPI
注:
•从U-Boot构建u-boot.bin文件是要写入的文件。
•在本例中,我们从SD卡加载所有文件,但也可以通过网络(如上所述)或其他现有接口轻松加载。

U-Boot # mmc rescan
U-Boot # fatload mmc 0 ${loadaddr} u-boot.bin
U-Boot # sf probe 0
U-Boot # sf erase 0x0 0x100000
U-Boot # sf write ${loadaddr} 0x0 ${filesize}

从QSPI引导
默认环境不包含QSPI引导命令。下面的示例使用在内核中找到的分区表.

U-Boot # sf probe 0
U-Boot # sf read ${loadaddr} 0x1a0000 0x800000
U-Boot # sf read ${fdtaddr} 0x100000 0x80000
U-Boot # setenv bootargs console=${console} spi-ti-qspi.enable_qspi=1 root=/dev/mtdblock6 rootfstype=jffs2
U-Boot # bootz ${loadaddr} - ${fdtaddr}

请注意
J721E平台不支持并行NOR。
本节介绍如何将文件写入NOR设备,并使用NOR设备上的根文件系统加载并引导Linux内核。为了使NOR对U-Boot可见,在支持的硬件上需要U-Boot的特殊构建。下表列出了看到NOR的构建,在某些情况下也使用环境中的theit,而不是默认的NAND。最后,为了简单起见,我们假设文件是从SD卡加载的。使用网络接口(如果适用)在上面有说明。
3.1.1.9.1. 从U-Boot写入NOR
注意:
•在U-Boot构建中,u-boot.bin文件是要写入的文件。
•在这个例子中,我们从SD卡加载所有文件,但它们也可以通过网络(如上所述)或其他存在的接口轻松加载。
•此时NOR mtd分区图还没有更新到包含设备树的示例位置。

Board	Config target
AM335x EVM	am335x_evm_nor_config / am335x_evm_norboot_config
U-Boot # mmc rescan
U-Boot # load mmc 0 ${loadaddr} u-boot.bin
U-Boot # protect off 08000000 +4c0000
U-Boot # erase 08000000 +4c0000
U-Boot # cp.b ${loadaddr} 08000000 ${filesize}
U-Boot # fatload mmc 0 ${loadaddr} zImage
U-Boot # cp.b ${loadaddr} 080c0000 ${filesize}

3.1.1.9.2. 从NOR启动

在默认环境中,没有启动的快捷方式。需要传递root=/dev/mtdblockN,其中N是bootargs中rootfs分区的数目。
3.1.1.10. UART
本节介绍如何使用UART加载文件以将板引导到U-boot。在此之后,用户需要知道如何继续加载文件。
3.1.1.10.1. 从控制台UART引导U-Boot
在某些情况下,我们支持通过控制台UART加载SPL和U-Boot。您需要使用spl/u-boot-spl.bin and u-boot.img文件来启动。根据TRM,该文件将通过X-MODEM协议以115200波特8停止位无奇偶校验(与控制台使用相同)加载。SPL反过来期望被发送到u-boot.img以相同的速率,但通过Y调制解调器。一个来自主机PC的会话示例,假设console在ttyUSB0上,并且已经配置好,并且安装了lrzsz包

$ sx -kb /path/to/u-boot-spl.bin < /dev/ttyUSB0 > /dev/ttyUSB0
$ sx -kb --ymodem /path/to/u-boot.img < /dev/ttyUSB0 > /dev/ttyUSB0

在基于K3的平台上,ROM支持通过X-Modem协议从MCU_UART0引导。整个基于UART的引导过程直到U-Boot(正确)提示符经过不同的阶段,使用不同的UART外设如下:

WHO	Loading WHAT	HW Module	Protocol
Boot ROM	tiboot3.bin	MCU_UART0	X-Modem
R5 SPL	sysfw.itb	MCU_UART0	Y-Modem
R5 SPL	tispl.bin	MAIN_UART0	Y-Modem
A53/A72 SPL	u-boot.img	MAIN_UART0	Y-Modem

UART_BOOT_MAIN_UART and UART_BOOT_MCU_UART应该设置为串行端口,比如/dev/ttyUSBx.

$ sb --xmodem $OUT_R5/tiboot3.bin > $UART_BOOT_MCU_UART < $UART_BOOT_MCU_UART
$ sb --ymodem $SYSFW_ITB > $UART_BOOT_MCU_UART < $UART_BOOT_MCU_UART
$ sb --ymodem $OUT_AXX/tispl.bin > $UART_BOOT_MAIN_UART < $UART_BOOT_MAIN_UART
$ sb --xmodem $OUT_AXX/u-boot.img > $UART_BOOT_MAIN_UART < $UART_BOOT_MAIN_UART
栏目