一、      概述

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. look and say 外观数列的python实现

    #look_and_say 外观数列 如果我们把 1 作为Look-and-say 数列的第一项,那么,它的前几项是这样的: 1, 11, 21, 1211, 111221, 312211, 1311 ...

  2. SVN服务器的搭建(三)

    接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...

  3. Hibernate(四)--延迟加载(lazyload)

    hibernate中的延迟加载(lazyload)分属性的延迟加载和关系的延迟加载 属性的延迟加载: 当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进 ...

  4. 新年在家学java之基础篇--循环&数组

    因为“野味肺炎”的肆虐,过年被迫宅家只能吃了睡.睡了吃.这么下次只能长膘脑子空空,不如趁此机会重新学习java基础,为日后做铺垫~ 循环结构: 几种循环:for(::),while(){},do{}w ...

  5. 2018 ACM-ICPC 宁夏 H.Fight Against Monsters(贪心)

    It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...

  6. Git内部原理(1)

    Git本质上是一套内容寻址文件系统,在此之上提供了VCS的用户界面. Git底层命令(plumbing) vs 高层命令(porcelain) Git的高层命令包括checkout.branch.re ...

  7. mysql关键字汇总

    ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE C ...

  8. day38-进程-事件

    #1.事件Event:以交通灯为例.可以控制所有进程等待或者运行. from multiprocessing import Event e = Event() #实例化一个事件,创建一个交通灯,默认是 ...

  9. 系统学习Javaweb10----BootStrap2

    学习内容: 1.BootStrap-轮播图 2.BootStrap-排版对齐方式 3.BootStrap-表单元素 4.BootStrap-分页条

  10. docker里修改时间

    在docker容器里,你会发现,你根本无法通过命令修改时间.这时我们就可以通过/etc/localtime这个配置文件修改时间了.但这个配置文件是一个二进制的文件,里面根本就是一堆乱码.所以我只好拷贝 ...