uboot中TFTP协议的原理
来源:互联网 发布:网络盒子看电视不清晰 编辑:程序博客网 时间:2024/06/05 19:29
http://www.cnblogs.com/heaad/archive/2009/08/10/1542538.html
一、 概述
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流程
U-Boot中的环境命令可以使用$(filesize)来确定刚下载(传输)得到的文件大小.
setenv ipaddr 192.168.2.2;
setenv serverip 192.168.2.10;
saveenv;
tftp 0x31000000 u-boot.bin
cp.b 0x31000000 0 ${filesize}
- uboot中TFTP协议的原理
- uboot的tftp问题
- uboot的tftp上传功能
- tftp协议的实现
- tftp协议的实现
- tftp协议的实现
- TFTP协议的实现
- tftp协议的实现
- TFTP协议的实现
- Uboot tftp
- 关于uboot中tftp上传内存数据到tftp服务器
- uboot中使用tftp命令下载
- uboot中配置并使用tftp命令
- uboot中配置并使用tftp命令
- 在Uboot中支持tftp服务器
- 让uboot的tftp支持上传功能
- 让uboot的tftp支持上传功能
- 嵌入式 uboot中ping或者tftp的错误“Retry count exceeded; starting again”
- mongodb Replica Sets +Sharding高可用集群搭建(含认证)
- 已经为元素 "web-app" 指定属性 "xmlns"
- 面向对象(典型)
- Java基础——Servlet(六)分页相关
- 当前企业财务报表分析存在的问题
- uboot中TFTP协议的原理
- [转] C#7.0新特性(VS2017可用)
- Load data批量导入mysql
- av_write_trailer()
- Android自定义View-canvas.drawRect()用法详解
- -Java基础-Java介绍
- C++ filesystem
- MySQL 读取 frm 源码
- MongoDb下载及安装