Env

Board: BPI-F3 based on k1 of SpaceMit

Note: 本文默认已经在主机待建成功tftp服务

Content

设置IP

在主机上查询ip:

❯ ifconfig
enx00e099a751b1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.230.28 netmask 255.255.255.0 broadcast 192.168.230.255
inet6 fe80::7d95:76be:c484:17b6 prefixlen 64 scopeid 0x20<link>
ether 00:e0:99:a7:51:b1 txqueuelen 1000 (以太网)
RX packets 223389 bytes 75866217 (75.8 MB)
RX errors 0 dropped 94 overruns 0 frame 0
TX packets 196725 bytes 223909969 (223.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

得到主机ip192.168.230.28,板子ip确保在一个局域网内就好。

接下来进入uboot设置ip

=> setenv ipaddr 192.168.230.4
=> setenv serverip 192.168.230.28
=> [ 723.486] printenv ipaddr
ipaddr=192.168.230.4
=> [ 727.153] printenv serverip
serverip=192.168.230.28
=> saveenv

配置pxe文件

在主机上进入tftp文件夹,目录结构如下:

❯ tree
.
├── Image
├── k1-x_deb1.dtb
└── pxelinux.cfg
└── 01-fe-fe-fe-81-b4-a8

1 directory, 3 files

其中pxelinux.cfg是存放pxe配置文件的文件夹,由于TFTP服务可能会被多个开发板使用,因此PXE配置文件的名称取决于U-boot参数(板的硬件地址/ IP地址)。

优先级最高的是mac地址,在uboot中查看mac地址:

=> [ 898.685] printenv ethaddr 
ethaddr=FE:FE:FE:81:B4:A8

所以cfg的名字就应该是: 01-fe-fe-fe-81-b4-a8

这个01我也不知道什么意思,反正必须加上。

接下来就是修改 01-fe-fe-fe-81-b4-a8这个文件了,文件内容格式跟extlinux是一模一样的,这里不再赘述。

文件内容如下:

cat pxelinux.cfg/01-fe-fe-fe-81-b4-a8
default linux

label linux
kernel Image
fdt k1-x_deb1.dtb
append earlycon=sbi earlyprintk quiet splash plymouth.ignore-serial-consoles plymouth.prefer-fbcon console=ttyS0,115200 loglevel=8 clk_ignore_unused swiotlb=65536 rdinit=/init workqueue.default_affinity_scope=system root=/dev/mmcblk2p6 rootwait rootfstype=ext4

pxe启动

uboot中执行如下命令:

pxe get
pxe boot

经过以上命令按道理来说就可以启动内核了,但是发现启动到一半卡死了,看log发现貌似是设备树没有加载,他使用了一个地址0x7deb2e10的设备树:

=> [1976.087] pxe get
missing environment variable: pxeuuid
[1978.023] Retrieving file: pxelinux.cfg/01-fe-fe-fe-81-b4-a8
[1978.171] ethernet@cac80000 Waiting for PHY auto negotiation to complete...... done
[1981.637] emac_adjust_link link:1 speed:1000 duplex:full
[1981.659] Using ethernet@cac80000 device
[1981.660] TFTP from server 192.168.230.28; our IP address is 192.168.230.4
Filename 'pxelinux.cfg/01-fe-fe-fe-81-b4-a8'.
Load address: 0xc200000
Loading: #
[1981.682] 39.1 KiB/s
done
Bytes transferred = 322 (142 hex)
[1981.685] Config file '<NULL>' found
=> [1982.858] pxe boot
1: linux
[1984.100] Retrieving file: Image
[1984.244] ethernet@cac80000 Waiting for PHY auto negotiation to complete...... done
[1987.710] emac_adjust_link link:1 speed:1000 duplex:full
[1987.732] Using ethernet@cac80000 device
[1987.733] TFTP from server 192.168.230.28; our IP address is 192.168.230.4
Filename 'Image'.
Load address: 0x11000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#####
[2011.448] 1.4 MiB/s
done
Bytes transferred = 34423808 (20d4400 hex)
[2011.451] append: earlycon=sbi earlyprintk quiet splash plymouth.ignore-serial-consoles plymouth.prefer-fbcon console=ttyS0,115200 loglevel=8 clk_igno
re_unused swiotlb=65536 rdinit=/init workqueue.default_affinity_scope=system root=/dev/mmcblk2p6 rootwait rootfstype=ext4
[2011.475] Moving Image from 0x11000000 to 0x200000, end=2358000
[2011.493] ## Flattened Device Tree blob at 7deb2e10
[2011.495] Booting using the fdt blob at 0x7deb2e10
[2011.500] Loading Device Tree to 000000007dd8f000, end 000000007dd9cf27 ... OK

这就很奇怪了,但运气使然,在uboot中发现了这么一个变量:

=>  printenv fdtcontroladdr 
fdtcontroladdr=7deb2e10

这和刚才在内存中加载的设备树的地址一模一样,但尝试将他清空再执行pxe,same thing,看来有点运气,但不多。

经过查询资料发现,pxe会将conf指定的Image加载到kernel_addr_r处,将dtb加载到fdt_addr_r处,那么是否我们的uboot默认只设置了kernel的地址而没有dtb的地址,在uboot中输入以下指令:

=> [  58.262] printenv kernel_addr_r 
kernel_addr_r=0x11000000
=> [ 59.428] printenv dtb_addr_r
## Error: "dtb_addr_r" not defined

果然..,增加fdt_addr_r变量:

=> printenv dtb_addr 
dtb_addr=0x31000000
=> setenv fdt_addr_r 0x31000000
=> saveenv
Saving Environment to MMC... Writing to MMC(2)... OK

此时再通过pxe启动就没有任何问题了。

Ref

https://blog.csdn.net/weixin_35808698/article/details/117274748