imx6ull uboot 从tftp 加载内核

问题背景

imx6ull 的mfgtool 烧录工具慢得要死,自己最近在看内核代码,经常烧内核,还经常烧完启动不了,如果每次都用mfg tool烧录,效率太低。有大佬提示可以通过tftp 启动,就找了个教程实践了一下。主要参考了这个页面,解决了自己遇到的几个小问题。在这里整理记录一下整个过程。

tftp 服务器配置(ubuntu)

步骤如下:
1、xinetd 安装

sudo apt-get install xinetd

2、 配置xinetd

sudo vi /etc/xinetd.conf

/etc/xinetd.conf 内容如下

# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info
}
includedir /etc/xinetd.d

3、安装 tftp-hpa和tftpd-hpa

sudo apt-get install tftp-hpa tftpd-hpa

4、配置 /etc/default/tftpd-hpa

内容如下,其中的TFTP_DIRECTORY目录就是要存放zImage 和dtb 的文件夹,同时要确保该目录的读写权限

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/zqxl/work/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS=" -l -c -s"

5、配置/etc/xinet.d/tftp,内容如下:

servicetftp
{
	socket_type = dgram
	wait = yes
	disable = no
	user = root
	protocol = udp
	server = /usr/sbin/in.tftpd
	server_args = -s  /etc/xinetd.d/tftp -c
	#log_on_success += PID HOST DURATION
	#log_on_failure += HOST
	per_source = 11
	cps =100 2
	flags =IPv4
}

6、重启xinetd

$ sudo service xinetd restart

单板 uboot 配置

1、配置环境变量。这里配置完成必须保证可以和主机ping通。

=> setenv serverip 192.168.0.175
=> setenv ipaddr 192.168.0.111
=> setenv ethaddr 08:00:00:00:22:01
=> setenv eth1addr 08:00:00:00:22:02
=> setenv gatewayip 192.168.0.1
=> setenv netmask 255.255.255.0

serverip :TFTP服务器IP,即主机(ubuntu)IP。
ipaddr :开发板IP
ethaddr / eth1addr :单板的mac地址,好像可以胡乱配
gatewayip :网关
netmask :子网掩码

2、设置启动命令,其中,注意修改dtb 文件名称。

setenv mmcboot 'echo Booting from mmc ...; run mmcargs; tftp ${loadaddr} zImage;tftp ${fdt_addr} imx6ull-14x14-evk-emmc-hdmi.dtb; bootz ${loadaddr} - ${fdt_addr};'

3、保存环境变量d到emmc

saveenv

4、重启后,进入uboot console,运行启动命令

run mmcboot

至此,tftp 启动的环境就搞好了。以后每次编完内核往tftp 目录一丢,在uboot 里run mmcboot一下就能启动刚编译好的内核了,如丝般顺滑。从此告别mfgtool。如下是启动log
在这里插入图片描述

遇到的问题

uboot 网卡报错

报错如下:在这里插入图片描述
根据错误log,追了下代码,发现如下位置会从环境变量获取eth1addr 的值。
在这里插入图片描述
于是设置了eth1addr这个环境变量后,问题解决。

uboot 与ubuntu ping 不通

尝试把ubuntu 虚拟机改成静态地址时,发现ubuntu 虚拟机跟windows 不在一个网段了。虚拟机的ip是192.168.31.xxx,windows是192.168.1.xxx。此时把单板的ipaddr配成192.168.1.xxx是可以和windows ping通,但是无法ping 通ubuntu。
最终将ubuntu 改会动态ip,保证ip地址也是192.168.1.xxx,才和单板ping 通了。顺手把虚拟机的ip 租期改了下,希望虚拟机的ip不要再频繁变了。。。
在这里插入图片描述

uboot 没有执行到配置好的启动命令

设置完mmcboot 环境变量后,重启单板发现没有跑到这个命令。于是通过env print -a 把所有环境变量打出来,发现有个boot变量如下:

boot=${devtype} dev ${mmcdev};
...
echo Checking if uname_r is set in /boot/uEnv.txt...;
if test -n ${uname_r};
 then setenv oldroot /dev/mmcblk${mmcdev}p${mmcpart};
echo Running uname_boot ...;
run uname_boot;
fi;
...

这个变量echo 出来的内容和我的uboot 启动内核时的log 一模一样。可以确定最终是通过uname_boot 这个启动命令来启动内核。所以我设置的名字叫mmcboot 的启动命令根本就没跑到。所以还是手动run mmcboot启动吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值