微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > TFTP协议在嵌入式系统中的实现

TFTP协议在嵌入式系统中的实现

时间:07-13 来源:互联网 点击:

随着Internet和PC时代的到来,嵌入式系统成为当前IT产业的焦点之一。在这种形势下,家用电器等嵌入式设备的Internet网络化就成了目前网络发展的一个重要方向和必然结果。

本文基于ARM核处理器的多嵌入式应用综合开发平台,对嵌入式设备联网的TCP/IP协议进行了讨论研究。

1.引言
  

嵌入式系统是继IT网络技术之后,又一个新的技术发展方向。由于嵌入式系统具有体积小、性能强、功耗低、可靠性高以及面向行业应用的突出特征,目前己经广泛地应用于军事国防、消费电子、网络通信、工业控制等各个领域。随着计算机技术与通信技术的发展,嵌入式系统的研究与开发也有着越来越重要的实际意义。而ARM是业界领先的32位嵌入式RISC处理器技术提供商,占领了大约75%的市场。它可为一个完整系统的开发提供全面的技术支持,技术具有性能高、成本低和能耗省的特点。ARM的微处理器核心正迅速地成为便携式通信设备、手持计算、多媒体数字消费和嵌入式解决方案市场中MSC批量生产的标准。
  

在本项目中利用SAMSUNG公司的S3C44B0X与网络控制芯片的结合实现了系统通过TFTP协议从PC机下载资源的功能。

2.TFTP协议介绍

a.TFTP与各种协议关系
  

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使用超时重传方式来保证数据的到达。与FTP相比,TFTP协议要简单得多。现在最普遍使用的是第二版TFTP(TFTP Version 2,RFC1350)使用UDP 的67端口。

图1 TFTP协议包头次序

因为TFTP使用UDP,而UDP又使用IP,IP可以还使用其它本地通信方法(一般为以太网)。因此一个TFTP包中会有以下几段:本地媒介头,IP头,数据报头,TFTP头,剩下的就是TFTP数据了,具体见图(1)。TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。由TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于0到65,535之间。TFTP头中包括两字节的操作码,这个码指出了包的类型下面我们看看大体上的TFTP包格式。

b. TFTP包介绍

TFTP支持五种类型的包,分别如下:
1 .Read request (RRQ)
2 .Write request (WRQ)
3 .Data (DATA)
4 .Acknowledgment (ACK)
5 .Error (ERROR)
图(2)显示了TFTP各种包在IP包中的位置:

图2 TFTP协议数据包格式

3.硬件实现
  

系统使用了RTL8019AS 10M ISA网卡芯片接入以太网。RTL8019AS是一款性价比很高的网卡芯片:NE2000兼容,软件移植性好;接口简单不用转换芯片如PCI-ISA桥;价格便宜、带宽充裕、较长一段时间内不会停产。8019有3种配置模式:跳线方式、即插即用PP方式、串行Flash配置方式。串行模式不与NE2000兼容,PP模式用在PC机中,这里用不上。只剩下跳线配置模式可用。系统的MCU选择的三星公司的S3C44B0X芯片,S3C44B0x是基于ARM7TDMI核的处理器,没有MMU,可以源代码级跟踪调试。44B0与RTL8019的电路设计相对来说比较简单,只需要连接数据线、地址选通、中断等信号线。简略电路图如图(3):            

图3 RTL8019与S3C440X的接口电路

4.软件设计

a.RTL8019驱动程序
  RTL8019驱动程序主要包括3个函数 :
  i..RTL8019 初始化函数。要对网卡的工作参数进行设置.以使网卡开始工作。
  其主要工作包括:复位网络芯片,设置MAC地址,设置组播地址,设置DMA传输参数等等。
  ii.收包函数:从网络中接收数据到缓冲区。
  iii.发包函数:从缓冲区向网络中发送数据。
b.协议栈的实现
  TFTP的实现其实就是根据各种协议,对数据打包(当发送数据时)和解包(当接收数据时)。主函数主要部分如下

eth_init();//其主要是清空ARP缓冲区.其中调用了一个功能函数[2]
arp_init();//清零
Mac_init();//设置MAC地址
ip_init(ip); //主要功能:设置ip地址
udp_init(); //初始化UDP协议
while (1) net_handle();//处理函数
  

前5个函数主要是初始化工作接下来的int net_handle(void)就要开始进入网络传输了,这里就是协议栈的核心了:

skb = alloc_skb(ETH_FRAME_LEN);//选择一个 SKB
if (eth_rcv(skb) != -1) {
eth_hdr = (struct ethhdr *)(skb->data);
skb_pull(skb, ETH_HLEN);
if (ntohs(eth_hdr->h_proto) == ETH_P_ARP)//是否为ARP包
arp_rcv_packet(skb); //是则进行ARP包应答
else if(ntohs(eth_hdr->h_proto) == ETH_P_IP) //是否为IP包
ip_rcv_packet(skb);//是则进行IP包处理
  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top