一、      概述

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的更多相关文章

  1. 九鼎S5PV210开发板的SD卡启动、uboot tftp升级内核镜像

    Note: 我的S5PV210板子的磁盘是emmc版本,不是nandflash版本. 1. SD卡内烧录uboot镜像,然后作为启动盘来启动emmc中的内核镜像和根文件系统. 只要破坏emmc内的ub ...

  2. u-boot TFTP: &#39;Access violation&#39; (2)

    今天做tftp下载时间会遇到以下问题. --->8--- Load address: 0x20000000 Loading: * TFTP error: 'Access violation' ( ...

  3. 使用U-Boot的TFTP(远程/网络内核)

    前提条件 假设您的主机PC运行的是Ubuntu 14.04.1 LTS或更高版本,并且与您的开发平台在同一个本地网络上;为了简单起见,我们假设网络上也有DHCP服务器.如果使用Juno,请确保使用的是 ...

  4. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  5. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

  6. UBoot常用命令手册

    UBoot常用命令手册 U-Boot还提供了更加详细的命令帮助,可以通过”?”显示支持的命令列表,通过help [CommandName]命令还可以查看每个命令的参数说明. 1.bootm bootm ...

  7. u-boot烧写Linux及系统整个启动过程

    一.烧写文件 u-boot: u-boot.bin linux kernel: uImage Filesystem: root.bin(yaffs) 二.烧写步骤  1.烧写u-boot tftp 0 ...

  8. 18.17 U-Boot+内核移植

    18.17.1 移植U-Boot-2012.04.08 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因. $ .tar.bz2 $ cd u-boot- $ make ...

  9. learning uboot source command

    reference: http://www.denx.de/wiki/DULG/UBootCmdGroupExec => help source source - run script from ...

  10. AM335x开发板与PC机虚拟机建立tftp文件传输

    1.AM335x开发板必须要支持以太网,而且在U-boot中要有完好的以太网驱动 因为开发板的储存介质为SD卡,所以在编译好的U-boot中并没有配置网络环境,为了不使每次上电都修改u-boot的网络 ...

随机推荐

  1. spring自定义aop

    package com.dhht.config.articleAdvice; import com.dhht.util.UUIDUtil;import lombok.extern.slf4j.Slf4 ...

  2. Haploid inheritance|Hardy-Weinberg proportions|

    I.2 Haploid inheritance 单倍体也有短暂的二倍体时期: Meiosis:减数分裂 依据图示信息,同时基因型A的频率是p,基因型a的频率是(1-p): 建立Hardy-Weinbe ...

  3. Vue项目中跨域问题解决

    后台更改header 使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建) Jquery jsonp 一.后台更改header header('Access-C ...

  4. MySQL导入及导出数据库

    一.数据库导入 背景:已经从A机器把SQL文件导出,现在需要将sql文件导入B机器(两台机器都是Linux系统) 将sql文件上传到B机器,然后在B机器命令行执行以下命令(不用进入到数据库) 前提是t ...

  5. 吴裕雄--天生自然python学习笔记:python 用 Open CV抓取脸部图形及保存

    将面部的范围识别出来后,可以对识别出来的部分进行抓取.抓取一张图片中 的部分图形是通过 pillow 包中的 crop 方法来实现的 我们首先学习用 pillow 包来读取图片文件,语法为: 例如,打 ...

  6. Gson、jackson 序列化,反序列化(单个、集合)

    实体类: package com.nf.redisDemo1.entity; public class News { private long id; private String title; pr ...

  7. 火车进出栈 java

    题目描述 一列火车n节车厢,依次编号为1,2,3,…,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入 一个数,n(n<=60000) 输出 一个数s表示n节 ...

  8. iOS动画效果集合、 通过摄像头获取心率、仿淘宝滑动样式、瀑布流、分类切换布局等源码

    iOS精选源码 动画知识运用及常见动画效果收集 较为美观的多级展开列表 MUImageCache -简单轻量的图片缓存方案 iOS 瀑布流之栅格布局 一用就上瘾的JXCategoryView iOS ...

  9. java实现线程交替打印1-52和A-Z

    题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交替打印,输出结果为12A34B...........5152Z. 3.请用多线程方式实现. 实现思路:通过锁(s ...

  10. python语法基础-基础-变量和数据类型

    ###############   第一个python程序   ############### print("hello python") # 打印hello python # 分 ...