使用TFTP启动内核的方法前,需要在PC主机上安装TFTP服务器软件包。这里,我们通过U-Boot提供的pxelinux功能,从TFTP服务器下载位于pxelinux.cfg目录下的PXE配置文件。实现pxelinux功能的命令是pxe,执行后会在TFTP服务器的pxelinux.cfg目录中加载一个pxe配置文件并进行解析。
TFTP目录结构
使用U-Boot pxelinux功能从TFTP下载并启动Linux内核,TFTP目录的文件结构如下,TFTP的根目录为"/srv/tftp"。
/srv/tftp/
├── pxelinux.cfg
│ ├── 01-e2-2a-66-fc-e7-fa
├── stm32mp157a-panguboard.dtb
├── uImage
pxelinux.cfg是目录名。
01-e2-2a-66-fc-e7-fa为pxe配置文件名,内容与extlinux.cfg文件相同。
Linux内核的镜像文件uImage和设备树文件dtb都是放在"/srv/tftp"目录下。
pxelinux.cfg 目录
由于TFTP服务可能会被多个开发板使用,因此“ PXE配置文件”的名称取决于U-boot参数(板的硬件地址/ IP地址)。
U-Boot按如下顺序在pxelinux.cfg目录中搜索PXE配置文件:UUID的值由"pxeuuid"命令来得到
硬件类型和地址:ARP类型为"1"代表以太网和MAC地址
IP地址是每个板子的子网掩码
文件被命令为"default-$CONFIG_SYS_ARCH-$CONFIG_SYS_SOC"
在TFTP服务器上至少每个板子需要提供一个配置文件。
以PanGu开发板为例UUID没有定义
ethaddr=e2:2a:66:fc:e7:fa
IP =192.168.2.167 (16进制编码为 C0A802A7)
CONFIG_SYS_ARCH=arm and CONFIG_SYS_SOC="stm32mp"
PXE配置文件内容
每个PXE配置文件的格式与由标准Yocto发行版生成的extlinux.conf文件相同。
对于菜单中的每个元素:LABEL是一个字符串,例如引导设备,如e MMC、SD卡、NAND等等。
通过KERNEL和FDT选项定义U-Boot加载的内核和设备树。
Linux内核启动参数是通过APPEND选项定义的,包括要使用的rootfs。
menu title Select the boot mode
DEFAULT eMMC
LABEL initramfs
KERNEL uImage
FDT stm32mp157a-panguboard.dtb
INITRD uInitrd
APPEND rootwait rw earlyprintk console=ttySTM0,115200
LABEL nfs
KERNEL uImage
FDT stm32mp157a-panguboard.dtb
APPEND root=/dev/nfs nfsroot=192.168.1.1:/nfsroot ip=dhcp rootwait rw earlyprintk console=ttySTM0,115200
LABEL sdcard
KERNEL uImage
FDT stm32mp157a-panguboard.dtb
APPEND root=/dev/mmcblk0p6 rootwait rw earlyprintk console=ttySTM0,115200
LABEL eMMC
KERNEL uImage
FDT stm32mp157a-panguboard.dtb
APPEND root=/dev/mmcblk1p6 rootwait rw earlyprintk console=ttySTM0,115200
在开发板的U-Boot下执行命令
Board $> env set serverip
Board $> run bootcmd_pxe
表示TFTP服务器的IP地址。
STM32MP> env set serverip 192.168.2.123
STM32MP> run bootcmd_pxe
BOOTP broadcast 1
DHCP client bound to address 192.168.2.167 (1 ms)
missing environment variable: pxeuuid
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/01-e2-2a-66-fc-e7-fa
Using ethernet@5800a000 device
TFTP from server 192.168.2.123; our IP address is 192.168.2.167
Filename 'pxelinux.cfg/01-e2-2a-66-fc-e7-fa'.
Load address: 0xc4200000
Loading: #
3.9 KiB/s
done
Bytes transferred = 639 (27f hex)
Config file found
Select the boot mode
1:initramfs
2:nfs
3:sdcard
4:eMMC
Enter choice: 4
4:eMMC
missing environment variable: bootfile
Retrieving file: uImage
Using ethernet@5800a000 device
TFTP from server 192.168.2.123; our IP address is 192.168.2.167
Filename 'uImage'.
Load address: 0xc2000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#######################
591.8 KiB/s
done
Bytes transferred = 6053888 (5c6000 hex)
append: root=/dev/mmcblk1p6 rootwait rw earlyprintk console=ttySTM0,115200
missing environment variable: bootfile
Retrieving file: stm32mp157a-panguboard.dtb
Using ethernet@5800a000 device
TFTP from server 192.168.2.123; our IP address is 192.168.2.167
Filename 'stm32mp157a-panguboard.dtb'.
Load address: 0xc4000000
Loading: #####
581.1 KiB/s
done
Bytes transferred = 69115 (10dfb hex)
## Booting kernel from Legacy Image at c2000000 ...
Image Name: Linux-4.19.43
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 6053824 Bytes = 5.8 MiB
Load Address: c2000040
Entry Point: c2000040
Verifying Checksum ... OK
## Flattened Device Tree blob at c4000000
Booting using the fdt blob at 0xc4000000
XIP Kernel Image ... OK
Using Device Tree in place at c4000000, end c4013dfa
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.19.43 (stevechen@PD12-debian) (gcc version 8.2.0 (GCC)) #14 SMP PREEMPT Mon Jan 13 16:10:22 CST 2020
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: i2SOM PanGu Board
.....
[ 0.000000] Kernel command line: root=/dev/mmcblk1p6 rootwait rw earlyprintk console=ttySTM0,115200
.....