问题背景
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启动吧。