菜鸟科技网

uboot tftp命令如何使用?参数有哪些?

tftp 命令概述

TFTP 是一个简单的文件传输协议,基于 UDP 协议,它比 FTP 简单得多,但功能也少,通常用于无盘系统启动或简单的文件传输,非常适合在 U-Boot 这样的 Bootloader 环境中使用。

uboot tftp命令如何使用?参数有哪些?-图1
(图片来源网络,侵删)

tftp 命令的核心功能是:从 TFTP 服务器下载一个文件到 U-Boot 所在设备的 RAM(内存)中。


基本语法

tftp 命令的基本语法如下:

tftp [loadAddress] [[hostIPaddr:]filename]

参数详解:

  1. loadAddress (可选)

    • 作用:指定下载的文件将被加载到内存中的哪个地址。
    • 如果省略:U-Boot 会使用环境变量 loadaddr 的值作为默认加载地址,你通常可以通过 printenv loadaddr 查看这个值,并通过 setenv loadaddr <address> 来修改它。
    • 示例tftp 0x82000000 uImage 表示将 uImage 文件下载到内存地址 0x82000000 处。
  2. hostIPaddr: (可选)

    uboot tftp命令如何使用?参数有哪些?-图2
    (图片来源网络,侵删)
    • 作用:指定 TFTP 服务器的 IP 地址。
    • 如果省略:U-Boot 会使用环境变量 serverip 的值作为默认服务器地址,你可以通过 printenv serverip 查看和修改。
    • 示例tftp 192.168.1.10:zImage 表示从 IP 地址为 168.1.10 的服务器下载 zImage 文件。
  3. filename (必需)

    • 作用:指定要从 TFTP 服务器上下载的文件名。
    • 示例uImage, zImage, rootfs.cpio.gz, atf.bin 等。

常用命令示例

假设我们已经配置好了 U-Boot 的网络环境:

  • 开发板 IP: 168.1.20
  • TFTP 服务器 IP: 168.1.10 (存放在 serverip 环境变量中)
  • 默认加载地址: 0x82000000 (存放在 loadaddr 环境变量中)

示例 1:最简单的用法(使用默认值)

如果只想下载一个文件,并且使用默认的服务器 IP 和默认的加载地址,只需指定文件名即可。

tftp uImage
  • 解释:U-Boot 会从 serverip (192.168.1.10) 下载 uImage 文件,并将其加载到 loadaddr (0x82000000) 指定的内存位置。

示例 2:指定加载地址

如果不想使用默认的加载地址,可以手动指定。

uboot tftp命令如何使用?参数有哪些?-图3
(图片来源网络,侵删)
tftp 0x81000000 zImage
  • 解释:从 serverip (192.168.1.10) 下载 zImage 文件,并将其加载到内存地址 0x81000000

示例 3:指定服务器 IP 和文件名

TFTP 服务器不是 serverip 环境变量中配置的那个,可以在命令中直接指定。

tftp 192.168.1.30:my-device-tree.dtb
  • 解释:从 IP 地址为 168.1.30 的服务器下载 my-device-tree.dtb 文件,并将其加载到默认的 loadaddr (0x82000000) 位置。

示例 4:同时指定加载地址、服务器 IP 和文件名

这是最完整的用法,提供了最大的灵活性。

tftp 0x88000000 192.168.1.10:rootfs.cpio.gz
  • 解释:从 IP 地址为 168.1.10 的服务器下载 rootfs.cpio.gz 文件,并将其加载到内存地址 0x88000000

环境变量配置

tftp 命令的强大之处在于它依赖于几个关键的环境变量,在执行 tftp 命令前,请确保这些变量已正确设置。

环境变量 描述 示例值 查看命令 设置命令
ipaddr 本机(开发板)的 IP 地址 168.1.20 printenv ipaddr setenv ipaddr 192.168.1.20
serverip TFTP 服务器的 IP 地址 168.1.10 printenv serverip setenv serverip 192.168.1.10
loadaddr 文件下载的默认内存地址 0x82000000 printenv loadaddr setenv loadaddr 0x82000000
bootcmd 启动命令 (通常包含 tftp) tftp ${loadaddr}; bootm printenv bootcmd setenv bootcmd 'tftp ${loadaddr}; bootm'
bootfile 默认下载的文件名 uImage printenv bootfile setenv bootfile uImage

配置示例:

# 1. 设置开发板IP
setenv ipaddr 192.168.1.20
# 2. 设置TFTP服务器IP
setenv serverip 192.168.1.10
# 3. 设置默认加载地址
setenv loadaddr 0x82000000
# 4. 设置默认启动文件 (可选)
setenv bootfile uImage
# 5. 保存环境变量,使设置永久生效
saveenv

配置完成后,就可以直接执行 tftptftp ${bootfile} 来下载默认文件了。


常见问题与排查

在使用 tftp 时,经常会遇到失败的情况,下面是常见错误及其解决方法:

错误信息 可能原因 解决方案
Error: 'serverip' not set serverip 环境变量未定义或为空。 使用 setenv serverip <服务器IP> 设置服务器地址。
File not found TFTP 服务器上找不到指定的文件名。 检查文件名拼写是否正确。
2. 确认文件是否存在于 TFTP 服务器的根目录下。
3. 检查 TFTP 服务器的权限设置。
TFTP error: 'access violation' 通常是权限问题。 检查 TFTP 服务器配置文件(如 tftpd-hpa 的配置)中的权限,确保对文件有读取权限。
2. 尝试将文件权限改为 777 (chmod 777 filename) 进行测试。
TFTP error: 'file not found' File not found 类似,但更偏向于协议层面的错误。 同上,重点检查文件名和服务器目录。
ARP timeout 最常见的问题,开发板无法通过 ARP 协议找到 TFTP 服务器的 MAC 地址,这通常意味着网络不通。 检查物理连接:网线是否插好?
2. 检查网络配置:开发板和服务器是否在同一个网段?(168.1.x
3. 检查服务器状态:TFTP 服务器程序是否正在运行?(可以在服务器上执行 ps aux | grep tftp 查看)
4. 在开发板上 ping 服务器ping ${serverip},看是否能通。ping 不通,说明网络层有问题,请优先排查。
ethernet not ready 网卡驱动未初始化或网络未启动。 检查 U-Boot 中是否正确加载了网卡驱动。
2. 尝试手动启动网络:dhcp 命令(如果配置为 DHCP)或手动设置 ipaddrnetmask 后执行 ifconfig

相关命令

  • tftpboot: tftpboottftp 命令的一个别名,功能完全相同。tftp 是更新的、更推荐的命令名,但很多旧的 U-Boot 版本仍然支持 tftpboot
  • dhcp: 通过 DHCP 协议自动获取 IP 地址、网关、TFTP 服务器地址等网络信息,如果使用 DHCP,serveripipaddr 等变量可能会被自动设置。
  • ping: 测试网络连通性的基本命令。ping ${serverip} 是排查 tftp 问题的第一步。
  • saveenv: 保存所有环境变量的修改,使其在重启后仍然有效。
  • printenv / env print: 查看所有环境变量的当前值。

tftp 命令是 U-Boot 与网络交互的基石,要成功使用它,关键在于:

  1. 网络通畅:确保开发板和 TFTP 服务器物理连接正确,IP 配置在同一网段,并且能互相 ping 通。
  2. 服务就绪:确保 TFTP 服务器程序正在运行,并且目标文件存在且有正确的读取权限。
  3. 地址正确:了解并设置好 loadaddr 等关键环境变量,确保文件被加载到正确的内存位置以便后续执行(如 bootm)。
分享:
扫描分享到社交APP
上一篇
下一篇