显示标签为“w5100e01-avr”的博文。显示所有博文
显示标签为“w5100e01-avr”的博文。显示所有博文

2012年8月31日星期五

[Final] W5100E01-AVR是什麼?怎麼用?(八)(用戶手冊V1.0版)


W5100E01-AVR是為AVR開發者提供的W5100評估板。本文是W5100E01-AVR的使用者手冊第八部分,也是最後一部分了。由於本次手冊內容比較多,分次講給了大家,謝謝大家的耐心閱讀。還是希望對大家有幫助嘍~





4. 硬件设计向导
4.1 方块图
<图4‑1: 评估板方块图>
 
4.2 模块描述
评估板由W5100E01-AVR(EVB底板)和PM-A1(AVR模块)组成。
以下9个块组成了评估板。
-PM-A1
-字符LCD(LCD)
-PAL
-SRAM
-RS232端口
-扩充板接口
-功率调节器
-用于系统复位的3.3V电源
 
4.2.1. PM-A1
PM-A1(AVR模块)由Atmega128处理器、74HC573地址锁存器、8MHz外部晶振、底板(JP4,JP5)接头、ISP(JP3)和JTAG(JP1)接口。
为了便于利用EVB板开发,除了ALE(PG2),所有的端口引脚都通过模块接口(JP4,JP5)连接MB-EVB-X2,接口的引脚描述如<表4-1:MB-EVB-X2模块引脚描述>所示。
AVR ISP (JP3) 引脚映射
 
4.2.2. LCD
LCD用于调试和系统状态显示。
LCD接口(JP3)引脚描述如下表所示。
 
在LC1624的规格文件中,LCD使用的电压范围是-0.3V~13V。为了适应这个数据,需要使用R6(电压5V、最大上拉电阻10千欧)和R7(下拉接地电阻820欧),在实际应用中,LCD显示经过R6调整后变得明显。更多关于LC1624,参见“LC1624 Specifications”文档。
 
4.2.3. PAL
PAL用于给评估板使用的各种芯片和模块制作启动信号,PAL元素在ATMEL公司的ATF16V8B-15PL产品在使用,该产品使用了10个输入引脚和8个I/O引脚。
PAL制作有关SRAM(/CS_RAM)、LCD(LCD_E)和W5100(/CS_IINCHIP)的芯片选择或启动信号。输出和PAL_OUT_0~PAL_OUT_4信号通过扩展接口为后续扩展预留空间。
 
4.2.4. SRAM
SRAM大小为32K字节,作为Atmega128的外部存储器使用。
4.2.5. RS232端口
RS232端口是Atmega128支持的双向串口USARTs接口,
评估板使用引脚9的DSUB的male类型(P1,P2)连接器。
 
4.2.6. 扩展板接口
扩展板接口的设计是为了便于使用评估板开发。多数的Atmega128端口引脚、PAL (PAL_OUT_0~PAL_OUT_4)的输出信号以及许多预留的引脚都与外界板接口连接。
Atmega128中没有连接到外接板接口的信号是7 RXD1(PD2)、TXD1(PD3)、RXD0(PE0)、TXD0(PE1)、LED0(PG3)、LED1(PG4)、/I2CHIP_IRQ(PE4)。
 
外接板接口连接器是Hirose公司的“PCN10BK-96S-2.54DS”,属于96引脚的母口直角形连接器,公口型的连接器在这里与“PCN10-96P-2.54DS”成对。
 
4.2.7. 功率调节器
评估板通过电源适配器得到5V电压,板内部使用的电压时5V和3.3V。调节器是LT1963EST-3.3(U1),可以使用Toggle Switch(SW1)关闭调节器。
 
4.2.8.用于系统复位的3.3V电源
使用RC模拟电路实现手控复位和上电复位。
4.3. 原理图
 
4.3.1 W5100E01-AVR
请参考光盘文件中的“W5100E01-AVR.DSN”。
4.3.2. PM-A1
请参考光盘文件中的”PM-A1.DSN”。
4.4. PAL
在评估板中,PAL用于创建芯片选择(模块可用)。
评估板的地址映射与<图3.1:评估板存储器映射>所示相同。
评估板支持3路信号(芯片选择),与评估板的地址映射一致。
评估板提供VHDL(硬件描述语言)编码,对使用PAL元素的开发者来说,推荐使用CUPL,因为PAL编译器是免费软件。在简单的注册后,可以使用ATMEL公司的WINCUPL。
需要使用的“AWINCUPL.EXE”可以在ATMEL的主页下载。
用法请参考“AVR工具指南.pdf”。
 
4.4.1. IO定义
以下是VHDL的源代码
以下是CUPL的源代码
 
4.4.2. SRAM外部区域
SRAM外部区域从0x0000到0x7fff。
以下是制作SRAM CS的VHDL源代码。
 
4.4.3. LCD区域
LCD从0x9000到0x9400。
同时使用WR和RD信号控制计时器。
 
4.4.4. W5100区域
在W5100中,地址被分成两部分相同的芯片。
想了解更多,请参考“W5100 Datasheet”。
对于VHDL源码,参见光盘中的“EVB_PAL.VHD”。
对于CUPL源码,参见光盘中的“EVB_PAL.PLD”。
编译时请参考“AVR工具指南.pdf”。
 
4.5 零件清单
 
4.5.1. W5100E01-AVR零件清单
请参考光盘中的“W5100E01-AVR_PARTLIST.PDF”。
 
4.5.2. PM-A1零件清单
请参考光盘中的“PM-A1_PARTLIST.PDF”。
 
4.6. 实体规格
 
4.6.1. 功耗
评估板的每个部件的功耗如下表所示。
总功耗为243mA X 5V = 1215mW。
 
 
 
這部分內容終於講完了,下次我會帶來更優質的資訊來跟大家見面,還請多多關照喔!
 
更多有關W5100的帖子請進入我們的官方網站或官方部落格進行查看。
 

2012年8月30日星期四

W5100E01-AVR是什麼?怎麼用?(七)(用戶手冊V1.0版)

W5100E01-AVR是为AVR开发者提供的W5100评估板。本文是W5100E01-AVR用户手册的第七部份,因为这个用户手册内容比较多,所以就分了很多部分,一一给大家讲,不要没有耐性噢~ 我的帖子还是希望对大家有帮助。今天我们接着昨天的内容继续介绍:


第六部分在这里W5100E01-AVR是什么?怎么用?(六)(用户手册V1.0版)



3.2.6.6.6 DNS客户端

在介绍DNS客户端设置之前,让我们简要的看一下DNS(域名系统)。
 
DNS系统用于将因特网域名转换成因特网IP地址,反之亦然。DNS由域名服务器和域名解析模块组成,域名服务器包含IP地址与域名之间的映射图,域名解析模块通过给域名服务器传输查询接收查询结果。
 
域名解析模块查询转换成本地域名服务器的IP地址或域名。本地域名服务器通过搜索DB(数据库)接收查询,并响应解析模块。如果域名解析模块找不到需要的信息,本地域名服务器就将接收到的查询发送给上一级域名服务器,接收到的响应就可以发送给域名解析模块。
如<图3.33>所示,DNS查询与DNS响应信息在域名解析系统和域名服务器之间的传送包括5部分,如<图3.34>所示。
Header部分包含固定12字节长度,其他4部分的长度是可变的。除了Header和Question部分,Answer、Authority和Additional部分被称为资源记录(RRs)。每一个Header、Question和RRs都有不同的格式。
DNS信息的Header部分保存信息类型、DNS查询类型和可变长度部分的统计信息。
 
在<图3.35:Header部分格式>中,当DNS信息是域名解析器到域名服务器的请求,QR字段值为0;反之,QR字段得值为1。当DNS信息为查询域名IP地址时,Opcode字段值为0;当它查询域名服务器状态时,Opcode字段值为2。
 
QDCOUNT、ANCOUNT、NSCOUNT与ARCOUNT字段统计可变长度的信息、由Question部分组成的代表区块数、Answer、Authority以及additional部分。组成Question部分的块如<图3.36:Question部分格式>所示,组成Answer、Authority和Additional部分的块如<图3.37>所示。
 
举例来说,如果QDCOUNT是1,ANCOUNT是0,NSCOUNT是10,ARCOUNT是10,那么组成Question部分的块如<图3.36:Question部分格式>所示。Answer、Authority和Additional部分由10块组成,如<图3.37>所示。
 
<图3.37>的NAME字段、<图3.36>的QNAME字段与RDDATA字段也可以得到可变长度。QNAME与NAME字段是可变长度字段,组成的格式和他们处理的每一个字段如<图3.36>所示。RDDATA可变长度字段和进程使用RDLENGTH字段的数据长度。
想了解更多,参见RFC1034和RFC1035。
 
DNS信息由<表3-38>所定义的数据类型操作,参见“inet/dns.h”。
如<图3.33>所示,DNS查询与DNS响应信息在域名解析系统和域名服务器之间的传送包括5部分,如<图3.34>所示。
 
域名解析模块基于gethostbyaddr()函数和gethostbyname()函数运作。gethostbyaddr()函数负责将因特网IP地址转换成因特网域名,gethostbyname()的功能正好相反。gethostbyaddr()函数和gethostbyname()函数测试域名服务器IP地址的设置和搜索W5100连接域名服务器所需信道。如果W5100的闲置信道存在,gethostbyaddr()函数和gethostbyname()函数用‘BYNAME’或‘BYIP’元素调用dns_query()。
 
更多gethostbyaddr() 函数和gethostbyname()函数的例子,参见3.2.5.3.章——Ping请求程序。
 
实际与域名服务器的连接是通过dns_query()函数执行的,gethostbyaddr()函数和gethostbyname()函数只负责报告dns_query()函数的结果。
 
dns_query()函数用于初始化域名服务器间的工作缓存区并基于‘BYNAME’和‘BYIP’查询类型创建Question部分的QNAME。如果查询类型是‘BYNAME’,那么当使用IP地址查询域名时,域名可以当成QNAME使用而不需要转换。
 
当查询类型是‘BYIP’时,那么当使用IP地址查询域名时,需要将IP地址转换成IP地址字符串,并在改变的IP地址字符串添加“in-addr.arpa”后使用QNAME。创建完QNAME后,需要为域名服务器间的工作创建UDP Socket,并通过调用dns_make_query()函数创建DNS请求信息。如果DNS请求信息被成功创建,就通过UDP Socket发送给域名服务器。发送完DNS请求信息后,它就接收DNS响应信息或等待,直到等待时间结束。
 
如果在等待期间从域名服务器接收到DNS响应信息,就使用dns_parse_response()函数分析接收到的DNS响应信息,dns_query()函数会基于查询类型返回IP地址或域名。
 
<图3.39>是dns_query()函数的流程图。
 
<图3‑39: dns_query()函数>
<图3‑40: dns_makequery()函数>
 
dns_makequery()函数创建需要发送给域名服务器的DNS请求信息。因为DNS请求信息只能通过Header和Question部分查询,dns_makequery()函数不需要创建RRs部分。如果你在dns_makequery()函数中查看Header部分,首先它将ID字段值与在域名服务期间工作的信息设置相同,这里ID设置成0x1122。为进一步实现域名服务器间的工作,ID值加1。QR、Opcode、AA、TC和RD字段通过MAKE_FLAG0()函数分别设置成QR_QUERY、OP_QUERY/OP_IQUERY、0、0、1,RA、Z和RCODE字段通过MAKE_FLAG1()函数分别设置成0、0、0。
因为count字段中,QDCOUNT、ANCOUNT、NSCOUNT和ARCOUNT都只有一个question,因此分别设置成1、0、0、0。
让我们来看一下Question部分,QNAME字段用于设置IP地址字符串。域名和IP地址字符串由1 byte的标签和最大可达63 byte的标签组成。为了识别QNAME的可变长度,QNAME字段通常以0作为结尾。<图3.41>所示是QNAME字段中,域名为www.wiznet.co.kr的实际传输例子。
因为count字段中,QDCOUNT、ANCOUNT、NSCOUNT和ARCOUNT都只有一个question,因此分别设置成1、0、0、0。
让我们来看一下Question部分,QNAME字段用于设置IP地址字符串。域名和IP地址字符串由1 byte的标签和最大可达63 byte的标签组成。为了识别QNAME的可变长度,QNAME字段通常以0作为结尾。<图3.41>所示是QNAME字段中,域名为www.wiznet.co.kr的实际传输例子。
 
Question部分的QTYPE字段需要设置成‘TYPE_PTR’,当它保存的域名认为是QNAME时,它的IP地址设置成‘TYPE_A’时,因为它包含在网络中,因此QCLASS字段需要设置成‘CLASS_IN’。
 
<表3-41 >是在QTYPE & QCLASS字段使用的常量定义。
<图3‑42: dns_parse_response()函数>
 
<图3.42> 所示的dns_parse_response()函数分析了通过域名服务器接收的响应信息。dns_parse_response()函数检查发送给域名服务器的ID与响应信息的ID是否相同,它也检测接收到的响应信息是否为通过检查Header部分的QR字段的响应信息。如果接收到的信息是域名服务器的响应,改变的成功与否决定于检查Header部分的RCODE字段。
<表3-42>所示为RCODE字段使用的常量定义。
 
如果RCODE是RC_NO_ERROR,可变长度部分,例如Question、Answer、Authority和Additional部分被解析,因为在Answer部分设置了必要信息被分析和处理,而其他部分没有。如果你需要Authority和Additional部分的信息,你可以通过自己很轻松的获取。
 
Question部分通过调用dns_parse_question()函数处理Header部分的次数与QDCOUNT一样。Answer部分通过调用dns_parse_question()函数处理部分的次数与ANCOUNT一样多。
 
<图3‑43: dns_parse_question()函数和dns_answer()函数>
 
dns_parse_question()函数分析和处理Question部分。在DNS请求信息的Question部分并没有实际的信息,但是它必须被处理以获取Answer部分的开始位置。因为Question 部分的QNAME字段得到可变长度,parse_name()函数跳过了处理QNAME字段可变长度的过程、QTYPE和QCLASS字段。
 
dns_answer()函数分析和处理Answer部分。Answer部分在转换确实产生作用时,在Answer部分的TYPE字段执行适当的程序。
 
Answer部分的TYPE字段只有一种值,而不是来自TYPE_A 或TYPE_PTR,如<表3-41 : QTYPE & QCLASS字段的常量定义>所示。如果域名变成IP地址,它可以从TYPE中得到改变的IP地址,域名可以从TYPE_PTR中获取,改变的域名或IP地址也可以通过parse_name()函数加工和提取。
 
<图3‑44: parse_name()函数>
 
parse_name()函数处理Question部分的QNAME字段或RRs部分的NAME、RDDATA字段。QNAME、NAME、RDDATA字段大多数的组成如<图3.41:Question 部分的QNAME 字段传输实例>所示,但是,它可以被压缩从而减少DNS信息的大小。压缩方法为2字节压缩,如果第1个字节——高字节的2位是‘11’,这就描述标签被压缩了。它包含第1个字节的偏移量,除了高字节的2位和第2个字节。
 
这个偏移量是DNS信息的偏移量,表示从DNS信息的起点到标签存放位置的实际偏移量。如果压缩方案尝试重新使用已经在DNS信息中使用过的域名,就需要间接设置在DNS信息中的相关域名偏移量。<图3.45>所示为DNS信息压缩方案和应用实例。
 
<图3.45>的压缩方案实例是为了防止“F.ISI.ARPA”、“FOO.F.ISI.ARPA”、“ARPA”和ROOT. “F.ISI.ARPA” 没有压缩的情况下,在<图3.41:Question部分的QNAME字段传输实例>的格式中产生20的偏移量。
 
在“FOO.F.ISI.ARPA,”中,因为剩下的除了“FOO”,都和先前处理的Name字段一样。“FOO”在没有压缩的情况下的处理流程如<图3.41:Question部分的QNAME字段传输实例>所示格式,剩下的名称做位移26处理。ROOT是最高级的域名,它使用0的Label Length字段处理。
 
parse_name()函数在分析Name字段之前,检测Label Length Byte的高字节2位是否为11。如果是‘11’,相关Label就分析DNS信息中Lable所在的偏移量;如果不存在,Label的分析和处理过程如<图3.41:Question部分的QNAME字段传输实例>所示。
 
 
这是本文的第七部分内容,后面还剩下一些部分,我将会在下次帖子中发布,敬请期待噢!希望我的内容对大家有所帮助。
更多有關W5100的帖子請進入我們的官方網站www.iwiznet.cn 或官方部落http://blog.iwiznet.cn/ 查看更多。
 
 

2012年8月29日星期三

W5100E01-AVR是什麼?怎麼用?(六)(用戶手冊V1.0版)

W5100E01-AVR是为AVR开发者提供的W5100评估板。本文是W5100E01-AVR的用户手册,希望对大家有所帮助。今天我们接着前天的博文继续介绍:

第五部分在这里:W5100E01-AVR是什么?怎么用?(五)(用户手册V1.0版)



<表3-34>所示为在“inet/dhcp.h”中定义成枚举数据类型,显示了许多DHCP客户端程序普遍使用的Option代码段。

其他没有在<表3-34>定义的代码段在DHCP客户端程序中跳过。
 
DHCP客户端程序的操作在评估板’s main()函数执行,参见<图3.3>。
 
第一,在初始化阶段设置DHCP客户端使用的MAC地址,MAC地址时网络中唯一标识设备的地址,是网络通信中最基本的地址,用于在DHCP服务器中识别DHCP客户。对于DHCP客户端程序的MAC地址,使用评估板的MAC地址设置DHCP客户的全局变量SRC_MAC_ADDR。在设置完SRC_MAC_ADDR后,通过调用init_dhcp_client()函数可以对从DHCP服务器接收的IP进行收集时,注册两个函数,防止DHCP服务器端的IP地址更新。
 
当调用init_dhcp_client()函数时,如果每个函数未指定,DHCP客户端程序的set_DHCP_network()函数和proc_ip_conflict()函数分别被调用。
当更新网络信息或发生IP冲突,注册evb_soft_reset()函数来自动重置评估板。
 
第二,可以通过getIP_DHCPS()函数获取网络信息。
getIP_DHCPS()函数使用setIP(),setMACAddr()等函数初始化W5100,并初始化DHCP客户端程序的‘dhcp_state’的变量状态为‘STATE_DHCP_DISCOVER’。
 
初始化结束后,它调用send_DHCP_DISCOVER()函数发送DHCP DISCOVERY消息给DHCP服务器。
 
发送DHCP DISCOVERY消息后,通过调用reset_DHCP_time()函数初始化定时器为才DHCP服务器端接收的网络信息中的租约期限,并使用set_timer() 函数将‘DHCP定时器’时间间隔设为1秒。在初始化DHCP_Timeout为0后,等待接收从DHCP服务器端的DHCP信息,并将DHCP_Timeout定义为‘DHCP_WAIT_TIME’与‘MAX_DHCP_RETRY’定义的时间。在等待‘DHCP_WAIT_TIME & MAX_DHCP_RETRY’时间中,它会检测dhcp_state是否通过check_DHCP_state()函数改为STATE_DHCP_LEASED状态。
 
STATE_DHCP_LEASED状态代表网络信息,并意味着getIP_DHCP()函数成功执行。如果在等待接收‘DHCP_WAIT_TIME & MAX_DHCP_RETRY’的过程中没有从DHCP服务器获取网络信息,调用check_DHCP_state()函数将DHCP_Timeout改为1,。当DHCP_Timeout等于1时,getIP_DHCPS()函数在释放DHCP计时器后返回失败信息。
 
当无法从DHCP服务器获取网络信息时,评估板使用默认网络信息或先前获取的网络信息进行网络配置。
 
<表3-35>所示为定义的状态、超时和重新连接DHCP客户端。
在getIP_DHCP()函数中,‘DHCP_XID’是可变的,可用于设置DHCP信息的xid字段,如<图3.26:DHCP信息格式>所示。它的值必需是唯一的,而且在网络信息中规定的租约期限内它值不变。这里DHCP_XID与‘0x12345678’固定,但建议使用随机值。
 
当初始化W5100与DHCP服务器进行通信时,建议设置源IP地址为‘0.0.0.0.’你可以使用任何IP地址设置W5100的源IP地址,但是使用‘0.0.0.0’会更好,因为‘0.0.0.0’相当于IPv4的A类地址,它是一个无效的IP地址,实际上并不使用。因此,它不可能与其他网络产生冲突。
 
对于DHCP服务器发送的UDP广播封包,注意DHCP信息的MSB的Flag字段必须设置成1,参见<图3.19:DHCP信息格式>
<表3-36>是设置Flag字段的部分代码。
 
 
第三,从DHCP服务器获取的网络信息管理可以通过check_DHCP_state()函数执行,<图3.30>所示为在check_DHCP_state()中改变DHCP客户端状态的DHCP信息流。
 
check_DHCP_state()函数检测是否有从DHCP服务器传来DHCP信息。它接收和分析DHCP信息。根据DHCP信息的类型,如果DHCP信息可接收,他再DHCP客户端状态改变后进入下一个状态显示DHCP信息流,如<图3.30>所示。
 
check_DHCP_state()函数的每一个进程都对应一个DHCP客户端状态,如<图3.31>所示。如果我们简要看一下在check_DHCP_state()函数中的DHCP_STATE_LEASED状态,我们会发现从DHCP服务器接收的租约期限是有限的。因此,当经过租约期限的一半后,check_DHCP_state()函数就擦送DHCP_REQEUST消息给DHCP服务器,并在服务器返回IP地址后变成DHCP_STATE_REREQUEST状态。因为它持续给服务器发送DHCP_REQUEST消息,因此网络信息得以持续。
 
 
<图3‑32: parse_DHCPMSG()函数与check_DHCP_Timeout()函数>
 
parseDHCPMSG()函数负责接收DHCP服务器的DHCP信息,管理DHCP信息及保存网络信息。当执行check_DHCP_state()函数时,如果在DHCP_WAIT_TIME时间内没有接收到DHCP信息,或接收到的不是期望的DHCP信息,就重新发送DHCP信息给DHCP服务器。如果重新发送DHCP信息的重复次数达到MAX_DHCP_RETRY,check_DHCP_state()函数就在它初始化所有变量尝试连接DHCP服务器和DHCP客户后,发送DHCP_DISCOVER消息给DHCP服务器。
这是本文的第六部分内容,后面还剩下一些部分,我将会在下次帖子中发布,敬请期待噢!希望我的内容对大家有所帮助。
 
更多有關W5100的帖子請進入我們的官方網站www.iwiznet.cn 或官方部落http://blog.iwiznet.cn/ 查看更多。
 
 

 

2012年8月27日星期一

W5100E01-AVR是什麼?怎麼用?(五)(用戶手冊V1.0版)

 W5100E01-AVR是为AVR开发者提供的W5100评估板。本文是W5100E01-AVR的用户手册,希望对大家有所帮助。今天我们接着昨天的博文继续介绍:


第四部分在这里W5100E01-AVR是什么?怎么用?(四)(用户手册V1.0版)


3.2.6.3.Loopback UDP

Loopback UPD程序是一个使用UDP协议的单播数据包通信的程序,操作流程与Loopback TCP客户/服务器相同。UDP通信包括单播数包通信和广播数据包通信,并且基本上支持使用单一信道与多目的地址通信的一对多通信方式。
Loopback UDP程序使用Loopback _udp()函数,Loopback _udp()函数的流程图如<图3 -16>所示。
当处于in SOCK_CLOSED状态下,使用SOCK_DGRAM、端口号和选项标志位作为参数创建UDPsocket调用socket(),
与TCP通信正好相反,UDP数据通信是一个没有要求连接过程的通信。因此,当创建socket后,可以直接进行数据通信。创建UDPsocket后,UDP socket的状态会从SOCK_CLOSED变成SOCK_UDP。
这里,UDP使用sendto()函数和recvfrom()函数,而不像TCP数据通信使用send() 函数and recv()函数。
这是因为TCP是确定目的地址的一对一通信,而UDP是没有连接程序的一对多通信。sendto()函数将数据作为一个参数发送给特定地址的特定端口,recvfrom()函数则从临时的端口接收传来的数据。recvfrom()函数通知用户使用作为参数发送的destip和destport来接收目的地址的信息。
在Loopback _udp()函数中,没有使用close()函数的例子,但是如果我们不再需要UDP通信,通常也可以调用close()函数关闭UDP socket。
 
3.2.6.4. Web服务
 
Web服务器程序是使用运行在TCP协议上的HTTP协议的TCP服务器程序。在建立Web服务器程序之前,我们需要了解在Web服务器和Web客户(浏览器)之间传输消息的HTTP协议消息结构。
HTTP(超文本传输协议)是因特网中在Web服务器和客户浏览器之间传输数据使用的协议。
Web服务器程序分析函数和从浏览器接收到的HTTP请求消息的URI(统一资源标示符)。如果相关的URI只是单纯的页面请求,这个页面会发送。如果URI请求一个行为,例如CGI(公共网关接口),它会采取行动并将结果显示在页面中。
<图3.17>所示为web服务器和web客户端之间的HTTP信息流,<表3-28>所示为HTTP信息结构。
 
想了解更多关于HTTP的信息,请参考RFC2616。HTTP请求信息根据浏览器类型的不同而改变,<表3-29>所示为Windows 2000的浏览器和评估板上的HTTP信息通信的例子。
 
 
Web服务器程序由管理HTTP服务器socket的of web_server()函数和管理HTTP信息的函数组成。
<图3.18>所示为web_server()函数流程图。
 
因为web_server()是TCP服务器程序,所以它的创建跟3.2.6.1讲的Loopback _tcps()函数类似,web_server()和Loopback _tcps()不同的地方在于数据通信代码。web_server()函数调用从处于SOCK_ESTABLISHED状态下的http socket的HTTP请求的proc_http()函数。
 
在调用proc_http()函数后,web_server()等待从网页的HTTP请求的HTTP响应信息,再调用disconnect()函数关闭http socket。
 
这个socket的关闭称为主动关闭,这种情况下,评估板首先请求客户关闭。供您参见,被动关闭是在客户请求无法第一时间建立连接的情况下。Web服务器支持主动关闭的原因是评估板支持服务器与其他客户端进行连接。
 
<图3‑19: proc_http()函数>
 
proc_http()函数调用parse_http_request()函数分析从浏览器接收的HTTP请求信息。如果分析的HTTP请求是“GET”、“HEAD或“POST”方法,就调用get_http_uri_name()函数,并从HTTP请求信息中提取URI名称。如果URI名称为“/”,用评估板的Web服务器的默认页面“index.html”代替“/”,因为这表示浏览器请求的是Web服务器的默认页面。
 
通过调用find_http_uri_type()函数得到HTTP请求信息的HTTP请求类型后,如果HTTP请求类型是“CGI”,它就会执行相应的CGI指令的流程。
 
处理完CGI命令或当HTTP请求不是CGI类型时,就通过URI名称搜索从评估板创建的ROM文件镜像。
如果检索到文件,就创建HTTP响应信息并发送。
 
HTTP响应信息包括HTTP响应头传输和HTTP响应文本传输。对于HTTP响应头传输,它使用HTTP请求类型作为参数调用make_http_response_head()函数去创建HTTP响应头。传输完创建HTTP响应头后,就开始传输HTTP响应文本。例如,如果HTTP响应文本是ROM文件镜像中的任意文件,这个文件就比W5100的MTU(最大传输单元)大很多。因此,在传输之前,必须以W5100的最大值为基准将它分割。在这点上,如果在评估板中定义的系统环境变量在HTTP响应文本中存在,就调用replace_sys_env_value()函数,并用评估板中存储的系统环境变量值取代原有的。
 
<表3-30>是评估板的ROM文件镜像“evbctrl.html”的一部分。
 
评估板的系统环境变量的长度变化是根据系统环境变量值来确定并代替它,例如,假设EVB的IP地址用字符串表示,那么最大长度就是16,因此,$SRC_IP_ADDRESS$的长度也是16。我们可以使用WIZnet公司提供的“ROMFileMaker.exe”创建评估板的ROM文件系统,想了解更多,请参考“ROM File Maker Manual Vx.x.pdf”。
HTTP请求信息可以分为方法和请求地址,后者由parse_http_request()函数解析并保存在‘st_http_request’数据类型中,具体定义如<表3-31>,通过get_http_uri_type()函数得到相应的URI类型。
 
 
请求地址保存在st_http_request的URI [MAX_URI_SIZE]中,URI名称在“?”符号之前,查询字符串在“?”符号之后。当请求地址从浏览器转变为Web服务器时,空格字符转换成‘+’的形式,剩下其它的文本转换成十六进制的形式。因此,请求地址的字符需要反编码成原先的值,从‘+’到空格,从十六进制转换成相关的ASCII码值,具体Request-URI的编码信息参见RFC1738。请求地址的URI名称通过get_http_uri_name()函数得到,请求地址的查询字符串可以包含一个或者更多的“variable=value”对,以“&”作为分隔符。通过get_http_param_value()函数,请求地址可以在查询字符串中取得期望的值。
 
 
评估板的Web服务器图像处理与传统Web服务器程序处理程序有所不同,传统的Web服务器程序处理程序是基于操作系统的,通过分离的独立过程进行进程间的通信。但是,评估板的Web服务器不需要操作系统,因此,它不需要创建独立进程,而是通过调用相关函数直接进行图像处理。评估板支持用于更新网络信息的“NETCONF.CGI”和控制字符LCD、评估板发光二极管的的D1/D2的“LCDNLED.CGI”,<图3.23>和<图3.24>显示了两个图像处理的过程。
 
 
NETCONF.CGI的<FORM>不是通过查询字符串方式,而是通过“POST”方式,并通过HTTP请求信息的实体进行提交。这样的NETCONF.CGI参数值也可以使用get_http_param_value()函数提取相关参数值。
 
LCDNLED.CGI的<FORM>通过“GET”方式提交,请求地址的查询字符串通过“GET”方式提交。通过请求地址的查询字符串方式提交的参数也可以通过使用get_http_param_value()函数获取。
 
 
3.2.6.5. DHCP客户端
 
DHCP客户端程序是一个在网络的DHCP服务器分配网络信息的程序。注意DHCP客户端程序必须先于其他程序启动,因为它负责管理网络信息设置。首先在DHCP(动态主机配置协议)检查基本情况,然后进一步使用DHCP客户端程序。
DHCP在传输层使用UDP协议,并使用UDP广播方式与DHCP服务器端进行通信。DHCP之所以使用UDP广播方式,是因为它没有IP地址,而且服务器端的IP是未知的。当使用W5100的UDP广播通信时,若要实现广播封装传输,需要将目的IP地址设置成’255.255.255.255’。
 
<图3.25>所示为DHCP服务器端与客户端通信的信息流。
 
 
首先,DHCP客户端向当地网络播送DISCOVERY消息,如果DHCP服务器端在网络中存在,就接收DISCOVERY消息并提供DHCP客户端可以使用的网络信息,例如IP地址、默认网关、子网掩码和DNS地址,同时DHCP服务器还提供信息给DHCP客户端,例如租约期限。DHCP客户端通过接收到的信息检测DHCP服务器,并利用DHCP服务器提供的信息给DHCP服务器端发送REQUEST消息。从DHCP客户端接收到REQUEST消息后,DHCP服务器端检测请求的网络信息是否可用,如果可用,就发送ACK消息给DHCP客户端;如果不可用,就发送NACK消息。从DHCP服务器接收到ACK消息后,DHCP客户端就使用DHCP服务器提供的网络信息,该网络信息只有在DHCP服务器建议的租约期限内有效。因此,如果DHCP客户端想继续使用网络信息,通常在租约期限过半的时候,重新发送REQUEST消息给DHCP服务器端来维持网络信息。在这个过程中,DHCP客户端可以从DHCP服务器获取相同或者新的网络信息,如果收到新的网络信息,就必须使用新的。
DHCP服务器端与客户端传送的544字节信息格式如<图3.26>所示。想了解每个DHCP信息格式字段的详细解释,参见‘RFC1541’文档。第一个字节的op.字段决定了请求/响应,ciaddr后面的字段用于传输网络信息,312字节的options字段用于传输消息类型或信息,例如客户标识符。
 
<图3.26>所示的DHCP信息通过RIP_MSG数据类型管理,其定义如<表3-33>所示,参见“inet/dhcp.h”。
 
我们来简要的看一下DHCP信息的Option字段,格式如<图3.27>所示。它包括Magic Cookie字段、一个4字节的租约识别Cookie和从代码0到代码255变化的代码设置。从代码1到代码254,代码由{Code, Len, Value}组成,代码0和代码255仅由代码组成。想了解Option字段的每段代码的更多解释,参见RFC1533。
 
在312字节的Option字段中,未使用的字节用0填充。
 
这是本文的第五部分内容,后面的内容我们将会在今后的博文一一介绍,希望对大家有所帮助。
 
 
 
更多有關W5100的帖子請看這裡:
 
想瞭解更多有關W5100產品信息,請登錄中文網站及官方部落格: