uboot--tftp
一、 概述
U-boot中的TFTP用于发送较小的文件。下层使用UDP协议,发送使用UDP 69端口,每次发送的最大分组为512 Bytes。发送双方采用超时重传机制。数据传输模式为octet模式( 二进制模式 )。
在U-boot中使用tftp功能可以使用如下命令:
tftp MemoryAddress FileName
其中MemoryAddress为放入文件的内存首地址,FileName为传送文件的文件名(文件需放在tftp默认目录下)。
二、 使用TFTP
使用TFTP传送文件的步骤:
1 使用时已经初始化以下变量:
NetOurIP (本机IP地址,定义在Net.c文件)
NetServerIP(TFTP服务器的IP地址,定义在Net.c文件)
BootFile (需要传送文件的文件名,定于在Tftp.c)
NetOurGatewayIP (本机的网关地址)
NetOurSubnetMask (本机子网掩码)
2 调用TftpStart 函数开始文件传送。
三、 TFTP实现
(1)客户端状态
TFTP使用一个变量TftpState来描述TFTP客户端可能的5种状态:
|
状态 |
说明 |
|
STATE_RRQ |
发出读取请求,正等待批准 |
|
STATE_DATA |
正在接收数据 |
|
STATE_TOO_LARGE |
文件太大 |
|
STATE_BAD_MAGIC |
Bad magic number |
|
STATE_OACK |
收到OACK帧 |
(2)包类型
使用TFTP传送的包分为6种类型:
|
类型 |
说明 |
|
TFTP_RRQ |
请求读取文件 |
|
TFTP_WRQ |
请求写文件 |
|
TFTP_DATA |
数据包 |
|
TFTP_ACK |
确认包 |
|
TFTP_ERROR |
包含出错信息的包 |
|
TFTP_OACK |
option acknowledge,当服务器超时未收到客户端的ACK帧时,主动发出一个OACK帧 |
(3)各种包结构
TFTP协议中各种包的结构:

图1.TFTP协议中包结构
具体到U-boot中客户端发送的各种包的结构:
RRQ(请求读的包的结构):
|
TFTP_RRQ(包的类型) |
请求文件名 |
0 |
“octet”(传输模式) |
0 |
“timeout”(超时重传机制) |
0 |
TIMEOUT(超时重传等待时间) |
ACK(确认帧)结构:
|
TFTP_ACK |
确认的包的编号 |
(4)主要函数及作用
U-boot中与tftp协议有关的文件有tftp.c与tftp.h文件,主要函数包括:
static __inline__ void
store_block (unsigned block, uchar * src, unsigned len);
/* 根据预先设定的地址load_addr决定将首地址为src,长度为len的block个数据块写入flash 或写入内存*/
static void
TftpSend (void) ;
/* 根据TftpState变量的不同值发送不同的 Tftp包 (使用UDP协议发送) */
static void
TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len) ;
/* 处理收到的Tftp包 */
static void
TftpTimeout (void);
/* 超时处理函数 */
void
TftpStart (void);
/* 初始化各个需要的数据 然后开始发送TFTP读请求 */
(5) 流程
TFTP总体流程:
首先客户端发出读写请求。如果服务器批准此请求,则打开连接,并第一个数据包。客户端收到数据包后发回确认,而服务器发出下一个数据包以前必须得到客户对上一个数据包的确认。如果数据包在传输过程中丢失,服务器方会在超时后重新传输最后一个未被确认的数据包。
发送的数据包一般为512字节,如果一个数据包小于 512 字节,则表示这个包是最后一个包,如果发送的数据正好是 512 的整数倍,发送完后再发一个空包。
客户端程序流程:
<1>客户端设定NetOurIP 、NetServerIP、BootFile 变量的值。
<2>调用TftpStart函数,TftpStart函数完成如下的6步工作:
1若BootFile为空,则使用默认文件名;否则使用BootFile为传送的文件名。
2比较客户端和服务器的子网地址,判断两者是否在同一个子网内。
3设定超时处理函数为TftpTimeout 。
4设置处理接收到的TFTP包的函数为TftpHandler。
5初始化服务器端口、本机端口、超时次数为0、初始状态为RRQ
6调用TftpSend函数发送TFTP读取请求。
<3> TftpSend函数根据TftpState 发送不同的包,同时TftpHandler函数根据包的类型和当前客户端的状态(TftpState) 处理接收到的包。

图2.TFTP流程
过程

uboot--tftp的更多相关文章
- 九鼎S5PV210开发板的SD卡启动、uboot tftp升级内核镜像
Note: 我的S5PV210板子的磁盘是emmc版本,不是nandflash版本. 1. SD卡内烧录uboot镜像,然后作为启动盘来启动emmc中的内核镜像和根文件系统. 只要破坏emmc内的ub ...
- u-boot TFTP: 'Access violation' (2)
今天做tftp下载时间会遇到以下问题. --->8--- Load address: 0x20000000 Loading: * TFTP error: 'Access violation' ( ...
- 使用U-Boot的TFTP(远程/网络内核)
前提条件 假设您的主机PC运行的是Ubuntu 14.04.1 LTS或更高版本,并且与您的开发平台在同一个本地网络上;为了简单起见,我们假设网络上也有DHCP服务器.如果使用Juno,请确保使用的是 ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel
经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...
- 移植u-boot.2012.04.01
/*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...
- UBoot常用命令手册
UBoot常用命令手册 U-Boot还提供了更加详细的命令帮助,可以通过”?”显示支持的命令列表,通过help [CommandName]命令还可以查看每个命令的参数说明. 1.bootm bootm ...
- u-boot烧写Linux及系统整个启动过程
一.烧写文件 u-boot: u-boot.bin linux kernel: uImage Filesystem: root.bin(yaffs) 二.烧写步骤 1.烧写u-boot tftp 0 ...
- 18.17 U-Boot+内核移植
18.17.1 移植U-Boot-2012.04.08 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因. $ .tar.bz2 $ cd u-boot- $ make ...
- learning uboot source command
reference: http://www.denx.de/wiki/DULG/UBootCmdGroupExec => help source source - run script from ...
- AM335x开发板与PC机虚拟机建立tftp文件传输
1.AM335x开发板必须要支持以太网,而且在U-boot中要有完好的以太网驱动 因为开发板的储存介质为SD卡,所以在编译好的U-boot中并没有配置网络环境,为了不使每次上电都修改u-boot的网络 ...
随机推荐
- idea快捷键(最常用)
--跳到上一空白行 ctrl+alt+enter --跳到下一空白行 shift+enter --为代码生成包裹快(try catch等) ctrl+alt+t --跳到某行 ctrl+g --实现父 ...
- 爬虫笔记(十三)——lxml库的使用
HTML示例代码: text = ''' <div> <ul> <li class="item-0"><a href="link ...
- 拿到新linux服务器,从配置环境到跑起项目的部署流程
今早翻开手机看到某云一条广告Linux1 核 2 GB 1 Mbps服务器10元一个月,正巧最近在搞linux,于是下单了一台2个月20. 上班来到公司后,借空闲时间一顿研究,一波骚操作配置后,浏览器 ...
- 利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别
用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077. ...
- [LC] 146. LRU Cache
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- ionic 打包时所遇问题记录
问题1 ----------------------- Error occurred during initialization of VM Could not reserve enough spac ...
- 树分治(挑战p360)
poj1741 题:http://poj.org/problem?id=1741 #include<iostream> #include<algorithm> #include ...
- dedecms_5.7 download.php SQL注入
最近在看Web渗透与漏洞挖掘,这本书的编写目的感觉非常的不错,把渗透和代码审计结合在一起,但是代码审计部分感觉思路个人认为并不是很清晰,在学习dedecms v5.7 SQL注入的时候就只看懂了漏洞, ...
- linux 新添加的硬盘格式化并挂载到目录下方法
需求: 新增加一块硬盘sdb,将sdb分区,只分一个区,格式化,挂载到目录/ssd下.原文:https://www.cnblogs.com/ddbear/p/7009736.html 1. 查看现在 ...
- android多框架实现短视频应用、3D手势旋转、banner控件、指南针、智能管家等应用源码
Android精选源码 android智能管家app源码 Android高仿拼多多分类列表 Android百度地图实例详解之仿摩拜单车APP RecyclerView的LayoutManager搭建流 ...