为方便调试和下载代码可以使用u-boot通过TFTP来下载代码和网络启动,以下描述如何实现通过TFTP来实现网络文件系统的启动
- 主机的TFTP服务的设置(Trivial File Transfer Protocol)主机为ubuntu系统或对应的虚拟机。
如果已经安装就请忽略
$ sudo apt-get install tftpd-hpa
(注意:在各种论坛中都有很多示例,这些示例如何自动启动TFTP服务,但似乎并非所有示例在所有Linux发行版上都成功!以下内容可能对您有用。)
通过向/etc/rc.local添加命令来自动启动tftpd-hpa服务。
$ vi /etc/rc.local
在 exit0 行之前,添加如下命令,然后单击“保存并退出”。
$ service tftpd-hpa start
现在,要从命令行控制TFTP服务,请使用:
$ service tftpd-hpa restart
若要从命令行检查TFTP服务的状态,请使用:
$ service tftpd-hpa status
- 设置TFTP的目录
创建一个目录,里面包含kernel image和 device tree blob文件
$ mkdir /tftpboot
拷贝kernel image和 device tree blob文件到此目录下
$ cp fsl-imx8mm-evk.dtb /tftpboot
$ cp image /tftpboot
或者直接将TFTP的目录设置为我们的编译部署目录:
Yocto {YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}/
因tftpd-hpa服务在/ tftpboot下查找请求的文件
而默认的tftpd-hpa服务的目录可能随发行版/发行版而有所不同,但要在配置文件:/ etc / default / tfptd-hpa中指定。 我们必须更改指定的目录,即上述所创建的目录 /tftpboot
编辑default tftp directory
$ vi /etc/default/tftpd-hpa
在里面添加
TFTP_DIRECTORY=” /tftpboot”
或者
TFTP_DIRECTORY=” {YOCTO_BUILD_DIR}/tmp/deploy/images/{TARGET}/”
然后重启 TFTP service
$ service tftpd-hpa restart
以上TFTP server安装完毕,
或者百度搜索,按tftpd xinetd的方法安装也可以。
- NFS的设置
在主机上安装 NFS server
$ sudo apt-get install nfs-kernel-server
启动NFS service
$ service nfs-kernel-server restart
在命令行中检查NFS service 启动状态
$ service nfs-kernel-server status
- 设置NFS的目录
必须创建一个目录包含rootfs (root file system)
$ mkdir -p /tftpboot/rootfs_imx8mm
然后拷贝rootfs 到此目录下
$ cp -R {YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs/* /tftpboot/rootfs_imx8mm
或者使用yocto项目目录的默认目录
$ {YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs
- 更新 NFS Export File
要正确访问主机指定的NFS filesystem 的目录,NFS server要求必须正确配置/etc/exports
$ vi /etc/exports
在里面添加
<”YOUR NFS DIRECTORY”> (rw,sync,no_root_squash,no_subtree_check)
如我的板子:
/tftpboot/rootfs_imx8mm/ 10.86.* (rw,sync,no_root_squash,no_subtree_check)
或者
/{YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs <YOUR
BOARD IP>(rw,sync,no_root_squash,no_subtree_check)
然后,重新启动 NFS service.
$ service nfs-kernel-server restart
- 目标板子的设置
设置板子的网络IP和一些uboot环境变量值。
板子上电后,敲回车键进入u-boot环境设置,设置如下参数
U-Boot > setenv serverip 10.86.133.200 //设置主机服务器的IP地址,在主机上用ifconfig查看
设置主机上存放rootfs的路径:
U-Boot > setenv nfsroot /tftpboot/rootfs_imx8mm
其他一些设置:
U-Boot > setenv image Image
U-Boot > setenv fdt_file fsl-imx8mm-evk.dtb
U-Boot >setenv rootfsinfo 'setenv bootargs ${bootargs} console=${console},${baudrate} ${smp} root=/dev/nfs ip=dhcp nfsroot=${serverip}:/tftpboot/rootfs_imx8mm,v3,tcp'
U-Boot > setenv bootcmd_net 'run rootfsinfo; dhcp ${image}; dhcp ${fdt_addr} ${fdt_file}; booti ${loadaddr} - ${fdt_addr}'
U-Boot > setenv bootcmd 'run bootcmd_net'
像其他的一些环境变量,uboot中默认已经有了,就不重复了。
loadaddr = 0x40480000
fdt_addr = 0x43000000
最后,保存环境变量,然后复位。
U-Boot >saveenv
U-Boot >reset
如下为所有环境变量:
u-boot=> printenv
baudrate=115200
boot_fdt=try
bootargs=console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200,115200 root=/dev/nfs ip=dhcp nfsroot=10.86.133.200:/tftpboot/rootfs_imx8mm,v3,tcp console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200,115200 root=/dev/nfs ip=dhcp nfsroot=10.86.133.200:/tftpboot/rootfs_imx8mm,v3,tcp
bootcmd=echo Booting from net(NFS) ...; run bootcmd_net
bootcmd_mfg=run mfgtool_args;if iminfo ${initrd_addr}; then if test ${tee} = yes; then bootm ${tee_addr} ${initrd_addr} ${fdt_addr}; else booti ${loadaddr} ${initrd_addr} ${fdt_addr}; fi; else echo "Run fastboot ..."; fastboot 0; fi;
bootcmd_net=run rootfsinfo; dhcp ${image}; dhcp ${fdt_addr} ${fdt_file}; booti ${loadaddr} - ${fdt_addr}
bootdelay=2
bootfile=fsl-imx8mm-evk.dtb
bootscript=echo Running bootscript from mmc ...; source
console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200
emmc_dev=1
ethact=ethernet@30be0000
ethaddr=00:04:9f:05:fa:a3
ethprime=FEC
fastboot_dev=mmc0
fdt_addr=0x43000000
fdt_file=fsl-imx8mm-evk.dtb
fdt_high=0xffffffffffffffff
fdtcontroladdr=bc908500
fileaddr=43000000
filesize=a8d3
image=Image
initrd_addr=0x43800000
initrd_high=0xffffffffffffffff
ipaddr=10.86.133.10
jh_clk=
jh_mmcboot=mw 0x303d0518 0xff; setenv fdt_file fsl-imx8mm-evk-root.dtb;setenv jh_clk clk_ignore_unused; if run loadimage; then run mmcboot; else run jh_netboot; fi;
jh_netboot=mw 0x303d0518 0xff; setenv fdt_file fsl-imx8mm-evk-root.dtb; setenv jh_clk clk_ignore_unused; run netboot;
kboot=booti
loadaddr=0x40480000
loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc clk_ignore_unused
mmcargs=setenv bootargs ${jh_clk} console=${console} root=${mmcroot}
mmcautodetect=yes
mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then booti ${loadaddr} - ${fdt_addr}; else echo WARN: Cannot load the DT; fi; else echo wait for boot; fi;
mmcdev=0
mmcpart=1
mmcroot=/dev/mmcblk1p2 rootwait rw
netargs=setenv bootargs ${jh_clk} console=${console} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
netboot=echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${loadaddr} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then booti ${loadaddr} - ${fdt_addr}; else echo WARN: Cannot load the DT; fi; else booti; fi;
netmask=255.255.255.0
rootfsinfo=setenv bootargs ${bootargs} console=${console},${baudrate} ${smp} root=/dev/nfs ip=dhcp nfsroot=${serverip}:/tftpboot/rootfs_imx8mm,v3,tcp
script=boot.scr
sd_dev=0
serverip=10.86.133.200
soc_type=imx8mm
Environment size: 2973/4092 bytes
然后执行网络启动,结果如下:
u-boot=> run bootcmd_net
BOOTP broadcast 1
DHCP client bound to address 10.86.133.10 (15 ms)
Using ethernet@30be0000 device
TFTP from server 10.86.133.200; our IP address is 10.86.133.10
Filename 'Image'.
Load address: 0x40480000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################
3.3 MiB/s
done
Bytes transferred = 23542272 (1673a00 hex)
BOOTP broadcast 1
DHCP client bound to address 10.86.133.10 (7 ms)
Using ethernet@30be0000 device
TFTP from server 10.86.133.200; our IP address is 10.86.133.10
Filename 'fsl-imx8mm-evk.dtb'.
Load address: 0x43000000
Loading: #########
2.9 MiB/s
done
Bytes transferred = 43219 (a8d3 hex)
## Flattened Device Tree blob at 43000000
Booting using the fdt blob at 0x43000000
Using Device Tree in place at 0000000043000000, end 000000004300d8d2
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.14.98-05983-g5d6cbea (sac-m@ubuntu01) (gcc version 7.3.0 (GCC)) #1 SMP PREEMPT Wed Sep 18 15:08:08 CST 2019
[ 0.000000] Boot CPU: AArch64 Processor [410fd034]
[ 0.000000] Machine model: FSL i.MX8MM EVK board
挂载成功的关键log 如下:
[ 59.032872] IP-Config: Got DHCP answer from 10.86.133.254, my address is 10.86.133.10
[ 59.040714] IP-Config: Complete:
[ 59.043959] device=eth0, hwaddr=00:04:9f:05:fa:a3, ipaddr=10.86.133.10, mask=255.255.255.0, gw=10.86.133.251
[ 59.054236] host=10.86.133.10, domain=, nis-domain=(none)
[ 59.060078] bootserver=0.0.0.0, rootserver=10.86.133.200, rootpath= nameserver0=10.86.175.240, nameserver1=10.86.175.239
[ 59.087842] ALSA device list:
[ 59.090841] #0: wm8524-audio
[ 59.093896] #1: imx-spdif
[ 59.096759] #2: imx-audio-micfil
[ 59.123407] VFS: Mounted root (nfs filesystem) readonly on device 0:16.
[ 59.131572] devtmpfs: mounted
[ 59.134889] Freeing unused kernel memory: 1280K
[ 59.664582] systemd[1]: System time before build time, advancing clock.
[ 59.734250] systemd[1]: systemd 237 running in system mode. (+PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN -PCRE2 default-hierarchy=hybrid)
[ 59.755959] systemd[1]: Detected architecture arm64.
Welcome to NXP i.MX Release Distro 4.14-sumo (sumo)!
[ 59.790920] systemd[1]: Set hostname to .
评论