3.1.1. U-Boot用户指南
3.1.1.1. 概述
本文档介绍了U-Boot Linux核心版本在以下平台上的一般用法:
32位平台
• AM335x GP EVM
• AM335x EVM-SK
• AM335x ICE
• BeagleBone White
• BeagleBone Black
• DRA76x EVM
• DRA74x EVM
• DRA72x EVM
• DRA71x EVM
• AM437x GP EVM
• AM43xx ePOS EVM
• AM437x EVM-SK
• AM437x IDK
• AM574x IDK
• AM572x GP EVM
• AM572x IDK
• AM571x IDK
• 66AK2H EVM
• K2K EVM
• K2Ex EVM
• K2L EVM
• K2G GP EVM
• K2G ICE EVM
• OMAP-L138 LCDK
64-bit platforms
• AM65x EVM
• AM65x IDK
• J721E EVM
• J7200 EVM
3.1.1.2. 一般信息
3.1.1.2.1. 获取U-Boot源代码
访问U-boot源代码的最简单方法是下载并安装处理器SDK Linux。一旦安装,U-Boot源代码就包含在SDK的board support目录中。为了方便起见,源代码还包括U-Boot的git存储库,其中包括提交历史记录。或者,可以直接从GIT获取U-Boot源代码。
3.1.1.2.2. 32位平台上的构建和引导流
我们强烈建议在构建时使用单独的对象目录。这是通过O= parameter来完成的。我们还建议您使用与配置目标名称相同的输出目录名称。这样,如果您使用多个配置目标,就很容易知道哪个文件夹包含您感兴趣的u-boot二进制文件。
设置工具链路径
我们强烈建议使用与此U-Boot版本相对应的Linux核心版本附带的工具链。例如:
export PATH=$HOME/<TOOLCHAIN_PATH>/bin:$PATH
Cleaning the Sources
如果未使用单独的对象目录:
$ make CROSS_COMPILE=arm-linux-gnueabihf- distclean
如果使用‘O=am335x_evm’作为对象目录:
$ rm -rf ./am335x_evm
编译MLO和u-boot
同时进行u-boot和SPL的构建。但是,您必须首先为正在使用的板配置构建。使用下表来决定使用哪个defconfig进行配置:
Board SD Boot eMMC Boot NAND Boot UART Boot Ethernet Boot USB Ethernet Boot USB Host Boot SPI Boot
AM335x GP EVM am335x_evm_defconfig am335x_evm_defconfig am335x_evm_defconfig am335x_evm_defconfig am335x_evm_defconfig
AM335x EVM-SK am335x_evm_defconfig am335x_evm_defconfig am335x_evm_defconfig
AM335x ICE am335x_evm_defconfig am335x_evm_defconfig
BeagleBone Black am335x_evm_defconfig am335x_evm_defconfig am335x_evm_defconfig
BeagleBone White am335x_evm_defconfig am335x_evm_defconfig
AM437x GP EVM am43xx_evm_defconfig am43xx_evm_defconfig am43xx_evm_defconfig am43xx_evm_defconfig am43xx_evm_defconfig am43xx_evm_usbhost_boot_defconfig
AM437x EVM-Sk am43xx_evm_defconfig am43xx_evm_usbhost_boot_defconfig
AM437x IDK am43xx_evm_defconfig am43xx_evm_qspiboot_defconfig (XIP)
AM437x ePOS EVM am43xx_evm_defconfig am43xx_evm_defconfig am43xx_evm_usbhost_boot_defconfig
AM572x GP EVM am57xx_evm_defconfig am57xx_evm_defconfig
AM572x IDK am57xx_evm_defconfig
AM571x IDK am57xx_evm_defconfig
DRA74x/DRA72x/DRA71x EVM dra7xx_evm_defconfig dra7xx_evm_defconfig dra7xx_evm_defconfig (DRA71x EVM only) dra7xx_evm_defconfig(QSPI)
K2HK EVM k2hk_evm_defconfig k2hk_evm_defconfig k2hk_evm_defconfig k2hk_evm_defconfig
K2L EVM k2l_evm_defconfig k2l_evm_defconfig k2l_evm_defconfig
K2E EVM k2e_evm_defconfig k2e_evm_defconfig k2e_evm_defconfig
K2G GP EVM k2g_evm_defconfig k2g_evm_defconfig k2g_evm_defconfig k2g_evm_defconfig
K2G ICE k2g_evm_defconfig
OMAP-L138 LCDK omapl138_lcdk_defconfig omapl138_lcdk_defconfig
然后:
$ make CROSS_COMPILE=arm-linux-gnueabihf- O=am335x_evm am335x_evm_defconfig
$ make CROSS_COMPILE=arm-linux-gnueabihf- O=am335x_evm
注意,这里并没有列出给定平台的所有可能的构建目标,因为社区有TI不支持的其他构建目标。要找到这些,请阅读‘boards.cfg’文件并查找上面列出的生成目标。请注意,主配置文件将利用include/configs下的其他文件,如#include语句所示。
启动流程
在嵌入式平台上引导Linux内核并不像简单地将程序计数器指向内核位置并让处理器运行那么简单。本节将回顾在引导内核并在设备上运行之前必须运行的四个引导加载程序软件阶段。
AM335x等应用处理器是复杂的硬件,但内部RAM有限(例如128KB)。由于RAM数量有限,因此需要多个引导加载程序阶段。这些引导加载程序阶段系统地解锁设备的全部功能,以便内核可以使用设备的所有复杂性。
有四个不同的引导加载程序阶段:
export PATH=$HOME/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH
export PATH=$HOME/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin:$PATH
编译 R5 and ARM64 images
使用下表来决定使用哪个defconfig进行配置:
Board SD/eMMC Boot UART boot OSPI boot Hyper Flash USB DFU
AM65x EVM/IDK am65x_evm_r5_defconfig am65x_evm_a53_defconfig am65x_evm_r5_defconfig am65x_evm_a53_defconfig am65x_evm_r5_defconfig am65x_evm_a53_defconfig
J721E EVM j721e_evm_r5_defconfig j721e_evm_a72_defconfig j721e_evm_r5_defconfig j721e_evm_a72_defconfig j721e_evm_r5_defconfig j721e_evm_a72_defconfig j721e_evm_r5_defconfig j721e_evm_a72_defconfig j721e_evm_r5_defconfig j721e_evm_a72_defconfig
J7200 EVM j7200_evm_r5_defconfig j7200_evm_a72_defconfig j7200_evm_r5_defconfig j7200_evm_a72_defconfig
为AM65x EVM/IDK构建引导加载程序
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am65x_evm_r5_defconfig O=<output directory>/r5
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=<output directory>/r5
A53
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- am65x_evm_a53_defconfig O=<output directory>/a53
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to tisdk>/board-support/prebuilt-images/bl31.bin TEE=<path to tisdk>/board-support/prebuilt-images/bl32.bin O=<output directory>/a53
为J721E EVM构建引导加载程序
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- j721e_evm_r5_defconfig O=<output directory>/r5
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=<output directory>/r5
A72
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- j721e_evm_a72_defconfig O=<output directory>/a53
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to tisdk>/board-support/prebuilt-images/bl31.bin TEE=<path to tisdk>/board-support/prebuilt-images/bl32.bin DM=<path to tisdk>/board-support/prebuilt-images/ipc_echo_testb_mcu1_0_release_strip.xer5f O=<output directory>/a72
为J7200 EVM构建引导加载程序
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- j7200_evm_r5_defconfig O=<output directory>/r5
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=<output directory>/r5
A72
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- j7200_evm_a72_defconfig O=<output directory>/a53
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to tisdk>/board-support/prebuilt-images/bl31.bin TEE=<path to tisdk>/board-support/prebuilt-images/bl32.bin DM=<path to tisdk>/board-support/prebuilt-images/ipc_echo_testb_mcu1_0_release_strip.xer5f O=<output directory>/a72
$ cd <path to K3-image-gen project>
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- SOC=j7200 ROM_COMBINED_IMAGE=1 SBL=<path to tisdk>/board-support/prebuilt-images>/u-boot-spl.bin
依赖项目位置
•K3-image-gen (用于生成tiboot3.bin和sysfw.itb)项目位于这里
•linux固件(用于设备特定的ti-dm和ti-sysfw二进制文件)项目位于这里
目标映像
复制下面的映像到SD卡的引导分区和引导。格式化SD卡的说明可以在这里找到。
AM65x
• <output directory>/r5目录下的tiboot3.bin
•<output directory>/a53目录下的tispl.bin, u-boot.img
• <path to tisdk>/board-support/prebuilt-images/目录下的sysfw.itb
J721E
• <output directory>/r5目录下的tiboot3.bin
• <output directory>/a72 目录下的tispl.bin, u-boot.img
• <path to tisdk>/board-support/prebuilt-images/目录下的sysfw.itb
J7200型
• <path to K3-image-gen>目录下的tiboot3.bin(这是tiboot3.bin 和 sysfw.itb)
• <output directory>/a72 目录下的tispl.bin, u-boot.img
映像格式
•tiboot3.bin
+-----------------------+
| X.509 |
| Certificate |
| +-------------------+ |
| | | |
| | R5 | |
| | u-boot-spl.bin | |
| | | |
| +-------------------+ |
| | | |
| | FIT header | |
| | +---------------+ | |
| | | | | |
| | | DTB 1...N | | |
| | +---------------+ | |
| +-------------------+ |
+-----------------------+
• tispl.bin
+-----------------------+
| |
| FIT HEADER |
| +-------------------+ |
| | | |
| | ARM64 ATF | |
| +-------------------+ |
| | | |
| | ARM64 OPTEE | |
| +-------------------+ |
| | | |
| | ARM64 SPL | |
| +-------------------+ |
| | | |
| | SPL DTB 1...N | |
| +-------------------+ |
+-----------------------+
• sysfw.itb
+-----------------------+
| |
| FIT HEADER |
| +-------------------+ |
| | | |
| | sysfw.bin | |
| +-------------------+ |
| | | |
| | board config | |
| +-------------------+ |
| | | |
| | PM config | |
| +-------------------+ |
| | | |
| | RM config | |
| +-------------------+ |
| | | |
| | Secure config | |
| +-------------------+ |
+-----------------------+
启动流程
在基于K3体系结构的设备上,ROM只支持通过MCU(R5)引导。这意味着引导加载程序必须运行在R5内核上。为了满足这一约束,保证画面安全,加快启动时间,软件启动架构设计如下:
+------------------------------------------------------------------------+
| DMSC | R5 | ARM64 |
+------------------------------------------------------------------------+
| +--------+ | | |
| | Reset | | | |
| +--------+ | | |
| : | | |
| +--------+ | +-----------+ | |
| | *ROM* |----------|-->| Reset rls | | |
| +--------+ | +-----------+ | |
| | | | : | |
| | ROM | | : | |
| |services| | : | |
| | | | +-------------+ | |
| | | | | *R5 ROM* | | |
| | | | +-------------+ | |
| | |<---------|---|Load and auth| | |
| | | | | tiboot3.bin | | |
| | | | +-------------+ | |
| | | | : | |
| | | | : | |
| | | | : | |
| | | | +-------------+ | |
| | | | | *R5 SPL* | | |
| | | | +-------------+ | |
| | | | | Load | | |
| | | | | sysfw.itb | | |
| | Start | | +-------------+ | |
| | System |<---------|---| Start | | |
| |Firmware| | | SYSFW | | |
| +--------+ | +-------------+ | |
| : | | | | |
| +---------+ | | Load | | |
| | *SYSFW* | | | system | | |
| +---------+ | | Config data | | |
| | |<--------|---| | | |
| | | | +-------------+ | |
| | | | | | | |
| | | | | DDR | | |
| | | | | config | | |
| | | | +-------------+ | |
| | | | | | | |
| | |<--------|---| Start A53 | | |
| | | | | and Reset | | |
| | | | +-------------+ | |
| | | | | +-----------+ |
| | |---------|-----------------------|---->| Reset rls | |
| | | | | +-----------+ |
| | DMSC | | | : |
| |Services | | | +-----------+ |
| | |<--------|-----------------------|---->|*ATF/OPTEE*| |
| | | | | +-----------+ |
| | | | | : |
| | | | | +-----------+ |
| | |<--------|-----------------------|---->| *A53 SPL* | |
| | | | | +-----------+ |
| | | | | | Load | |
| | | | | | u-boot.img| |
| | | | | +-----------+ |
| | | | | : |
| | | | | +-----------+ |
| | |<--------|-----------------------|---->| *U-Boot* | |
| | | | | +-----------+ |
| | | | | | prompt | |
| | | | | +-----------+ |
| +---------+ | | |
| | | |
+------------------------------------------------------------------------+
在这里,DMSC充当主服务器并提供所有关键服务。R5/ARM64请求DMSC完成这些服务,如上图所示。
3.1.1.2.4. U-Boot环境
请注意,在许多电路板上,我们在系统启动期间修改了各种变量的环境,如board\u name和if unset,ethaddr。当我们恢复默认值时,一些变量将变得未设置,这可能导致其他事情无法工作,例如依赖于这些运行时设置变量的findfdt。
恢复默认值
可以将U-Boot环境变量集重置为其默认值,如果需要,将其保存到存储环境的位置(如果适用)。当u-boot版本从升级或降级更改时,还需要恢复默认设置。为此,请发出以下命令:
U-Boot # env default -f -a
U-Boot # saveenv
网络环境
使用USB-Ethernet dongle时,必须在环境中设置有效的MAC地址。要创建有效地址,请阅读本页。然后发出以下命令:
U-Boot # setenv usbethaddr value:from:link:above
您可以使用printenv命令查看是否已经设置了usbethaddr.
然后启动USB子系统:
U-Boot # usb start
U-Boot的默认行为是利用DHCP服务器在用户发出DHCP命令时传递给我们的所有信息。这将包括dhcp参数next-server,它指示通过TFTP从哪里获取文件。但是,有时网络上的dhcp服务器提供了不正确的信息,您无法修改服务器。在这种情况下,以下步骤可能会有帮助:
U-Boot # setenv autoload no
U-Boot # dhcp
U-Boot # setenv serverip correct.server.ip
U-Boot # tftp
另一种方法是使用tftp命令的完整语法:
U-Boot # setenv autoload no
U-Boot # dhcp
U-Boot # tftp ${loadaddr} server.ip:fileName
3.1.1.2.5. 可用于映像下载的RAM
要知道可用于下载映像或其他用途的RAM数量,请使用bdinfo命令。
=> bdinfo
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x7F000000
baudrate = 115200 bps
TLB addr = 0xFEFF0000
relocaddr = 0xFEF30000
reloc off = 0x7E730000
irq_sp = 0xFCEF8880
sp start = 0xFCEF8870
Early malloc usage: 890 / 2000
在引导之后,U-Boot重新定位自己(以及它的各种保留的RAM区域),并将自己放置在可用RAM的末端(从上面的bdinfo输出中的relocaddr开始)。只有堆栈位于该区域之前。栈顶的地址在bdinfo输出的sp start中,并向下增长。用户应该至少为堆栈预留1MB左右的内存,所以在上面的输出示例中,[0x80000000, 0xFCE00000]范围内的RAM是可以安全使用的。
3.1.1.2.6 设备树
关于设备树的说明。现在,所有受支持的板都需要使用设备树来引导。为了在受支持的平台中实现这一点,在U-Boot环境中有一个命令findfdt,它将fdtfile变量设置为要使用的设备树的名称,就像在内核源代码中找到的那样。在Keystone-2系列设备(K2H/K/E/L/G)中,每个平台由name_fdt变量指定。设备树应该从与内核相同的介质和相同的相对路径加载。
3.1.1.3. USB设备固件升级(DFU)
在使用USB设备固件升级(DFU)时,无论要写入的介质和使用的板是什么,都需要记住一些常规事项。首先,您需要在主机上安装一个dfu-util程序的副本。如果您的发行版没有提供此软件包,则需要从源代码构建它。其次,下面的示例假设一个单板插入到主机PC中。如果插入了多个设备,则需要使用dfu-util提供的用于指定要使用的单个设备的选项。最后,要通过DFU为给定的存储设备编程,请参阅正在使用的存储设备一节。
3.1.1.3.1 USB外设启动模式(SPL-DFU支持)
USB外设引导模式用于通过使用SPL-DFU功能的USB接口进行引导。这里概述的步骤可以在支持USB外设引导模式的平台上使用。
host$ make dra7xx_evm_defconfig
host$ make menuconfig
select SPL/DFU support
menuconfig->SPL/TPL--->
..
[*] Support booting from RAM
[*] Support USB Gadget drivers
[ ] Support USB Ethernet drivers
[*] Support DFU (Device Firmware Upgrade)
DFU device selection (RAM device) -->
Unselect CONFIG_HUSH_PARSER
menuconfig--->Command Line interface
[*] Support U-boot commands
[ ] Use hush shell
•构建spl/u-boot-spl.bin and u-boot.img
host$ make
J721E EVM上的USB外设引导模式(SPL-DFU引导模式)
•将SYSBOOT开关设置为USB外设引导模式(有关引导开关的详细信息,请参阅J721E TRM的初始化章节)
•确保USB0端口处于UFP/DRP模式:SW3[3:4] = 01 or 1x
•通过USB电缆将EVM的TypeC端口(USB0端口)连接到PC
•给单板上电
在主机端:
host$ sudo dfu-util -l
This will show the following DFU entities:
Found DFU: [0451:6163] ver=0200, devnum=50, cfg=1, intf=0, path="3-2", alt=1, name="SocId", serial="01.00.00.00"
Found DFU: [0451:6163] ver=0200, devnum=50, cfg=1, intf=0, path="3-2", alt=0, name="bootloader", serial="01.00.00.00"
Send boot images in this order: tiboot3.bin -> sysfw.itb -> tispl.bin -> u-boot.img.
host$ sudo dfu-util -R -a bootloader -D tiboot3.bin
host$ sudo dfu-util -l
Found DFU: [0451:6163] ver=0224, devnum=51, cfg=1, intf=0, path="3-2", alt=0, name="sysfw.itb", serial="UNKNOWN"
host$ sudo dfu-util -R -a sysfw.itb -D sysfw.itb
host$ sudo dfu-util -l
Found DFU: [0451:6163] ver=0224, devnum=52, cfg=1, intf=0, path="3-2", alt=1, name="u-boot.img", serial="UNKNOWN"
Found DFU: [0451:6163] ver=0224, devnum=52, cfg=1, intf=0, path="3-2", alt=0, name="tispl.bin", serial="UNKNOWN"
host$ sudo dfu-util -R -a tispl.bin -D tispl.bin
host$ sudo dfu-util -R -a u-boot.img -D u-boot.img
此时,单板应该引导到U-Boot提示符。
请注意
J721E Rev E2及以前的单板不支持此模式。
3.1.1.4 网络(有线或USB客户端)
本节介绍如何配置网络,并使用网络加载文件,然后使用通过NFS挂载的根文件系统引导Linux内核。此时,在支持的硬件上执行这些操作不需要U-Boot的特殊构建。
3.1.1.4.1. 从网络引导U-Boot
在某些情况下,由于ROM支持,我们支持通过网络加载SPL和U-Boot。在某些情况下,可能需要U-Boot的特殊构建。另外,DHCP服务器需要通过tftp向目标回复要获取的文件。为了方便起见,ROM填写vendor-class-identifier DHCP字段,并在下表中列出这些值。最后,您将需要使用spl/u-boot-spl.bin and u-boot.img文件来启动。
注意
仅在以下平台上支持从网络引导U-Boot/SPL。
Board make target Supported interfaces ROM vendor-class-identifier value SPL vendor-class-identifier value
AM335x GP EVM am335x_evm CPSW ethernet DM814x ROM (PG1.0) or AM335x ROM (PG2.0 and later) AM335x U-Boot SPL
AM335x GP EVM (PG2.0 and later) am335x_evm SPL and U-Boot via USB RNDIS AM335x ROM AM335x U-Boot SPL
AM335x GP EVM (PG1.0) am335x_evm SPL via UART, U-Boot via USB RNDIS N/A AM335x U-Boot SPL
AM43xx EVM am43xx_evm CPSW ethernet AM43xx ROM AM43xx U-Boot SPL
AM43xx EVM (PG1.2 and later) am43xx_evm SPL and U-Boot via USB RNDIS AM43xx ROM AM43xx U-Boot SPL
如果使用ISC dhcpd,示例主机条目如下所示:
host am335x_evm {
hardware ethernet de:ad:be:ee:ee:ef;
# Check for PG1.0, typically CPSW
if substring (option vendor-class-identifier, 0, 10) = "DM814x ROM" {
filename "u-boot-spl.bin";
# Check for PG2.0, CPSW or USB RNDIS
} elsif substring (option vendor-class-identifier, 0, 10) = "AM335x ROM" {
filename "u-boot-spl.bin";
} elsif substring (option vendor-class-identifier, 0, 17) = "AM335x U-Boot SPL" {
filename "u-boot.img";
} else {
filename "zImage-am335x-evm.bin";
}
}
请注意,在工厂类型设置中,可以在子网声明中执行子字符串测试,以设置子网的默认文件名值,并在主机条目中覆盖(如果需要)。
如果你已经从你的系统中删除了NetworkManager(这在大多数发行版中不是默认的),你需要配置你的/etc/network/interfaces文件:
allow-hotplug usb0
iface usb0 inet static
address 192.168.1.1
netmask 255.255.255.0
post-up service isc-dhcp-server reload
如果使用NetworkManager,则需要创建两个文件。首先,以root用户身份创建/etc/NetworkManager/system-connections/AM335x USB RNDIS(并使用\转义空间),内容如下:
[802-3-ethernet]
duplex=full
mac-address=AA:BB:CC:11:22:33
[connection]
id=AM335X USB RNDIS
uuid=INSERT THE CONTENTS OF 'uuidgen' HERE
type=802-3-ethernet
[ipv6]
method=ignore
[ipv4]
method=manual
addresses1=192.168.1.1;16;
Seccond为root,并确保执行权限,创建/etc/NetworkManager/dispatcher.d/99am335x-dhcp-server
#!/bin/sh
IF=$1
STATUS=$2
if [ "$IF" = "usb0" ] && [ "$STATUS" = "up" ]; then
service isc-dhcp-server reload
fi
这些步骤可以在ubuntu12.04上看到,设置为基于AM335x的平台进行网络引导.
3.1.1.4.2. 多个接口
在某些电路板上,例如,当我们同时拥有有线接口和USB RNDIS gadget以太网时,可能需要改变默认的U-Boot行为,即在它知道的每个接口上循环,以告诉U-Boot使用单个接口。例如,在开始时,您可能会看到如下行:
Net: cpsw, usb_ether
因此,为了确保我们使用usb_ether,首先发出以下命令:
U-Boot # setenv ethact usb_ether
3.1.1.4.3 通过DHCP配置网络
通过DHCP配置网络时,使用以下命令:
U-Boot # setenv autoload no
U-Boot # dhcp
并确保已配置DHCP服务器为所连接网络提供地址。
3.1.1.4.4. 手动网络配置
要手动配置网络,ipaddr、serverip、gatewayip和netmask:
U-Boot # setenv ipaddr 192.168.1.2
U-Boot # setenv serverip 192.168.1.1
U-Boot # setenv gatewayip 192.168.1.1
U-Boot # setenv netmask 255.255.255.0
3.1.1.4.5. Disabling Gigabit Phy Advertising
在一些板,如DRA72x Rev B或更早,有一个问题,如以太网不连接到1Gbps交换机。这个问题是由于使用了一个有不良行为历史的旧ti phy,因此几个J6 EVMs仅被标记为100M。因此,这里是U-Boot命令禁用phy的1Gbps支持和连接为100Mbps最大能力。
=> mii modify 0x3 0x9 0x0 0x300 /* Disable Gigabit advertising */
=> mii modify 0x3 0x0 0x0 0x1000 /* Disable Auto Negotiation */
=> mii modify 0x3 0x0 0x1000 0x1000 /* Enable Auto Negotiation */
3.1.1.4.6。从网络引导Linux
在支持连网的每个板的默认环境中,有一个在AM EVMs中称为netboot的引导命令和在KS2 EVMs中称为boot=net的引导命令,它们将自动加载内核并引导。对于每个命令的确切细节,请在netboot变量上使用printenv,然后依次printenv命令的其他子部分。AM57x/DRA7x中最重要的变量是rootpath和nfsopts,以及K2H/K/E/L/G中的tftp_root和nfs_root。
在AM65x GP和IDK板上,Linux内核也可以通过PRU-ICSSG以太网端口引导。在发行版u-boot映像中,仅启用ICSSG0、ICSSG1和ICSSG2的第一个端口(MII端口0)。要使用第二个端口(MII端口1),用户需要编辑DTS文件以启用第二个端口而不是第一个端口,并使用更新的DTS文件重建u-boot映像。第一个端口在主板(ICSSG2)上标记为Eth0,在IDK应用板上标记为Eth0(ICSSG0)和Eth2(ICSSG1)。用户需要使用如下所示的env脚本在ICSSG上加载并运行pru/rtu固件,然后再通过ICSSG端口执行诸如dhcp、tftp等网络操作。固件是从rootfs/lib/firmware/ti-pruss/文件夹加载的。有关在Uboot中使用rproc/RemoteProc的更多信息,请参阅此处的一节。下面显示了针对ICSSG0、ICSSG1和ICSSG2的AM65x EVM/IDK的U-Boot env脚本示例。用户需要将serverip and bootdir env变量自定义为安装程序中使用的tftp服务器的变量。
注意
目前,ICSSG端口仅支持100Mbps和1Gbps全双工(FD)链路。通过PRUETH以太网接口使用NFS rootfs引导Linux内核尚未验证。
ICSSG0 port 0
setenv start_icssg0 'rproc start 2; rproc start 3'
setenv stop_icssg0 'rproc stop 2; rproc stop 3'
setenv firmware_dir '/lib/firmware/ti-pruss'
setenv get_fdt_net 'run start_icssg0; tftp ${fdtaddr} ${serverip}:${bootdir}/${name_fdt}; run stop_icssg0'
setenv get_kern_net 'run start_icssg0; tftp ${loadaddr} ${serverip}:${bootdir}/${name_kern}; run stop_icssg0'
setenv get_overlay_net 'fdt address ${fdtaddr};fdt resize 0x0fffff;for overlay in $overlay_files;do; run start_icssg0; \
tftp ${overlayaddr} ${bootdir}/${overlay};fdt apply ${overlayaddr}; run stop_icssg0; done;'
setenv get_firmware_mmc 'load mmc ${bootpart} ${loadaddr} ${firmware_dir}/${firmware_file}'
setenv serverip 158.218.113.14
setenv bootdir 06.02.00.58-am6
setenv name_fdt k3-am654-base-board.dtb
setenv name_kern Image-am65xx-evm.bin
setenv overlay_files 'k3-am654-idk.dtbo k3-am654-pcie-usb2.dtbo'
setenv init_icssg0 'setenv ethact pruss0_eth; setenv autoload no; rproc init; setenv loadaddr 0x80000000; \
setenv firmware_file 'am65x-pru0-prueth-fw.elf'; run get_firmware_mmc; rproc load 2 0x80000000 13040; rproc start 2; \
setenv loadaddr 0x89000000; setenv firmware_file am65x-rtu0-prueth-fw.elf; run get_firmware_mmc; rproc load 3 0x89000000 5676; \
rproc start 3; dhcp; run stop_icssg0;'
setenv bootcmd 'run init_mmc; run init_icssg0; run get_kern_net; run get_fdt_net ; run get_overlay_net ; run run_kern'
saveenv
boot
ICSSG1 port 0
setenv start_icssg1 'rproc start 6; rproc start 7'
setenv stop_icssg1 'rproc stop 6; rproc stop 7'
setenv firmware_dir '/lib/firmware/ti-pruss'
setenv get_fdt_net 'run start_icssg1; tftp ${fdtaddr} ${serverip}:${bootdir}/${name_fdt}; run stop_icssg1'
setenv get_kern_net 'run start_icssg1; tftp ${loadaddr} ${serverip}:${bootdir}/${name_kern}; run stop_icssg1'
setenv get_overlay_net 'fdt address ${fdtaddr};fdt resize 0x0fffff;for overlay in $overlay_files;do; run start_icssg1; \
tftp ${overlayaddr} ${bootdir}/${overlay};fdt apply ${overlayaddr}; run stop_icssg1; done;'
setenv get_firmware_mmc 'load mmc ${bootpart} ${loadaddr} ${firmware_dir}/${firmware_file}'
setenv serverip 158.218.113.14
setenv bootdir 06.02.00.58-am6
setenv name_fdt k3-am654-base-board.dtb
setenv name_kern Image-am65xx-evm.bin
setenv overlay_files 'k3-am654-idk.dtbo k3-am654-pcie-usb2.dtbo'
setenv init_icssg1 'setenv ethact pruss1_eth; setenv autoload no; rproc init; setenv loadaddr 0x80000000; \
setenv firmware_file 'am65x-pru0-prueth-fw.elf'; run get_firmware_mmc; rproc load 6 0x80000000 13040; rproc start 6; \
setenv loadaddr 0x89000000; setenv firmware_file am65x-rtu0-prueth-fw.elf; run get_firmware_mmc; rproc load 7 0x89000000 5676; \
rproc start 7; dhcp; run stop_icssg1;'
setenv bootcmd 'run init_mmc; run init_icssg1; run get_kern_net; run get_fdt_net ; run get_overlay_net ; run run_kern'
saveenv
boot
ICSSG2 port 0
setenv start_icssg2 'rproc start 10; rproc start 11'
setenv stop_icssg2 'rproc stop 10; rproc stop 11'
setenv firmware_dir '/lib/firmware/ti-pruss'
setenv get_fdt_net 'run start_icssg2; tftp ${fdtaddr} ${serverip}:${bootdir}/${name_fdt}; run stop_icssg2'
setenv get_kern_net 'run start_icssg2; tftp ${loadaddr} ${serverip}:${bootdir}/${name_kern}; run stop_icssg2'
setenv get_overlay_net 'fdt address ${fdtaddr};fdt resize 0x0fffff;for overlay in $overlay_files;do; run start_icssg2; \
tftp ${overlayaddr} ${bootdir}/${overlay};fdt apply ${overlayaddr}; run stop_icssg2; done;'
setenv get_firmware_mmc 'load mmc ${bootpart} ${loadaddr} ${firmware_dir}/${firmware_file}'
setenv serverip 158.218.113.14
setenv bootdir 06.02.00.58-am6
setenv name_fdt k3-am654-base-board.dtb
setenv name_kern Image-am65xx-evm.bin
setenv overlay_files 'k3-am654-idk.dtbo k3-am654-pcie-usb2.dtbo'
setenv init_icssg2 'setenv ethact pruss2_eth; setenv autoload no; rproc init; setenv loadaddr 0x80000000; \
setenv firmware_file 'am65x-pru0-prueth-fw.elf'; run get_firmware_mmc; rproc load 10 0x80000000 13040; rproc start 10; \
setenv loadaddr 0x89000000; setenv firmware_file am65x-rtu0-prueth-fw.elf; run get_firmware_mmc; rproc load 11 0x89000000 5676; \
rproc start 11; dhcp; run stop_icssg2;'
setenv bootcmd 'run init_mmc; run init_icssg2; run get_kern_net; run get_fdt_net ; run get_overlay_net ; run run_kern'
saveenv
boot
请注意
如果需要通过ICSSG2的第二个端口(MII端口1)引导,用户需要在U-Boot源码树中编辑arch/arm/dts/k3-am654-base-board-u-boot.dtsi。参见DTS文件获取说明。例如,用户需要注释pruss2_emac0 DT节点,取消注释pruss2_emac1节点。类似地,要为ICSSG0和ICSSG1启用第二个端口,用户需要编辑arch/arm/dts/k3-am654-idk.dtso,分别启用pruss0_emac1 和 pruss1_emac1节点。重建后的u-boot映像并使用它。端口1在基板(ICSSG2)上为Eth1,在IDK应用板上为Eth1 (ICSSG0)和Eth3 (ICSSG1)。