KT2000网络终端方案
一. 序
言
KT2000网络终端方案是为提升当前银行终端性能而专门设计的一种UNIX终端方案.
经软硬件测试,该方案性能良好, 功能比普通终端有极大的提高.是当前网络终端的最佳选择.
在我们的DEMO板上运行TELNET程序, 获得很好的效果.
方案简介: 1. 方案介绍:1、该方案采用终端主控芯片KT2000和386接口芯片KT2200
2. CPU采用386SX, 80188, 8088或其他嵌入式CPU
频率范围 : 9~66M(建议主频采用20M以上)
3. 网卡采用DM9008或其他与NE2000兼容网卡
4. 内存资源丰富, 采用80188/80186,可有1M存储器空间,如果采用
80386及以上CPU,可获得超过1M的存储空间, 为用户在该系统上
运行嵌入式操作系统提供方便.
5. 一片256K*16的DRAM用于字符和图形的缓存.
6. 字库有1M(GB2312)或4M(GBK2.0)可供选择
7. 三种显示模式: 80列16点阵, 80列24点阵;132列16点阵
8. 软件可移植性强: 用户经少量的改动,可将一些通用的VGA程序
TCP/IP协议移植到该系统.
9. 单色或16色VGA接口
10. 多屏显示, 多窗口显示
11. 由于采用剑拓高集成度的终端主控KT2000,使用户的外围电路减到
最小,减少了产品的体积及降低了成本,同时提高了系统的稳定性.
二. 协 议
一. 以太网协议 :
以太网协议包括802.2 和 802.3 , 由于现在的服务器均同时支持这两种协议, 故现在我们在开发时只需采用一种协议便可以了.
Ethernet
封装
46~1500字节
|
目的地址 |
源地址 |
类型 |
数 据 |
CRC |
6字节 6字节 2字节 4字节
上述由地址域, 类型域, 数据域和CRC域组成.
地址域: 包括目的和源地址的物理地址即硬件地址,
类型域: 类型域指明数据包的类型
0800 : IP数据包
0806 : ARP包
8035 : RARP包
数据域: 数据域即为要发送的数据,包括协议头.
CRC域: 为循环冗余校验码,由硬件电路附加. 程序源不需考虑
Notes:
数据域的长度不能超过1500字节, 同时也不能少于46字节,因为整个以太网的帧的
长度范围应在 64到1518字节之间.
二. 一个局域网的一台终端要与主机正常通讯,至少应该包含如下协议:
IP协议, ARP协议, TCP协议
1. IP协议 :
|
4位版本号 |
4位报头长 |
度8位服务类型(TOS) |
16位总长度(以字节为单位) |
|
|
16位标识 |
3位标志 |
13位段位移 |
||
|
8位生存期(TTL) |
8位协议 |
16位报头校验和 |
||
|
32位源IP地址 |
||||
|
32位目的IP地址 |
||||
|
选项 |
||||
|
数据 |
||||
4位版本号 : IP v4 还是IPv6
4位报头长: 左移两位即为报头长
TOS: 目前TCP/IP实现都不支持TOS特性
16总长度: 以字节为单位的IP数据包总长度,包括IP头,TCP头或UDP头, 数据
16位标识: 惟一标识出由主机发出的每个数据报,每发送一个数据报,该字段值 + 1;
生存期(TTL): 设置一个数据报可跨越路由器数目上限.
8位协议: 指明IP数据报类型: TCP, UDP, ICMP,IGMP
校验和: 报头校验和, 不包括其后的数据
2. ARP协议:
|
Hardware = 0x01 -----------------2 bytes |
|
Protocol = 0x0800 ---IP -----------------2 bytes |
|
Hardware address length = 0x06 --------------1 byte |
|
Protocol address length = 0x04 --------------1 byte |
|
Operation : 1- ARP Request; 2 – ARP Reply 1byte |
|
Sender MAC address-----------------------------6 bytes |
|
Sender IP address -----------------------------4 bytes |
|
Target MAC address -----------------------------6 bytes |
|
Target IP address ---------------------------------4 bytes |
ARP 发送一个称为ARP请求的以太网帧到网络上的每台主机, 该ARP请求报包包含主机的IP地址, 并且询问”如果你是该IP地址的主人, 请以你的硬件地址答复我, 当主机收到此包后, 发送ARP响应包,答复:”我的硬件地址是:”.
3. TCP协议
|
16位源端口号 |
16位目的端口号 |
|||||||
|
32位序列号 |
||||||||
|
32位确认序列号 |
||||||||
|
4位头部 信息 |
保留6位 |
U R G |
A C K |
P S H |
R S T |
S Y N |
F I N |
16位窗口大小 |
|
16位TCP校验和 |
16位紧急指针 |
|||||||
|
选项(如果有) |
||||||||
|
数据(如果有) |
||||||||
每个TCP数据段都包含有识别源与目的应用程序的端口号, 这两个值再加上IP数据包
的头部信息中的IP地址惟一标识一条链接.
序列号(sequence number)是发送方用来通知对方,这个数据段的首字节在自己发送的整
个字节流的位置. 编号从0~2^32 – 1
确认号(acknowledgment number)中包含接收方希望接下来收到的数据的序列号.编号为
该数值减1的数据是接收方成功接收的最后一字节信息, 这个值只有在ACK置
位时有效.
头部信息长度 : 此值左移两即为头部长度.长度最长不能超过60字节,基本长度为20字节
标志 :
URG : 紧急数据指针有效
ACK : 确认编号有效
PSH : 接收方尽快把数据传给应用程序
RST : 重置链接
SYN: : 在链接初始化时置初始序列号,
FIN : 发送者结束发送数
窗口大小 : 和流控有关, 它指出从确认编号开始,希望接收的数据量.
校验和 : 覆盖整个TCP数据段, 包括TCP数据和TCP头部信息.
紧急指针 : 如果URG=1,则紧急数据指针有效.这个指针加上本段的序列号, 得到紧急
数据的最后一个字节的序列号.
选项 : 最常用的选项是数据段的最大长度叫MSS,在SYN数据包中指出.
滑动窗口流控协议可参考有关TCP/IP方面的书籍.
三 . 网卡地址
输入输出地址:共32个,地址偏移量为00H--1FH
其中00H--0FH共16个地址,为寄存器地址。
10H--17H共8个地址,为DMA地址。
18H--1FH共8个地址,为复位端口。
于8位的操作方式,上面的地址中只有18个是有用的:
00H--0FH共16个寄存器地址。
10H DMA地址 (10H--17H的8个地址是一样的,都可以用来做DMA端口,只要用其中的一个就可以了)
1FH 复位地址。(18H到1FH共8个地址都是复位地址,每个地址的功能都是一样的,只要其中的一个就可以了,但实际上只有18H,1AH,1CH,1EH这几个复位端口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇数地址的复位)
网卡寄存器在系统中的地址定义
//------寄存器定义----------------
#define COMMAND 0x200*2 // command register of DM9008
#define PSTART COMMAND+1*2
#define PSTOP COMMAND+2*2
#define BNRY COMMAND+3*2
#define TSR COMMAND+4*2
#define TPSR COMMAND+4*2
#define TBCR0 COMMAND+5*2
#define NCR COMMAND+5*2
#define TBCR1 COMMAND+6*2
#define ISR COMMAND+7*2
#define CURR COMMAND+7*2 // IN PAGE 1
#define RSAR0 COMMAND+8*2
#define CRDA0 COMMAND+8*2
#define RSAR1 COMMAND+9*2
#define CRDA1 COMMAND+9*2
#define RBCR0 COMMAND+0x0a*2
#define RBCR1 COMMAND+0x0B*2
#define RSR COMMAND+0x0C*2
#define RecvCR COMMAND+0x0C*2
#define TCR COMMAND+0x0D*2
#define CNTR0 COMMAND+0x0D*2
#define DCR COMMAND+0x0E*2
#define CNTR1 COMMAND+0x0E*2
#define IMR COMMAND+0x0F*2
#define CNTR2 COMMAND+0x0F*2
#define IMRR COMMAND+0x0F*2
#define DMAPORT COMMAND+0x10*2
#define CRA COMMAND+0x0A*2 // configration register A
#define CRB COMMAND+0x0B*2 // configration register B
#define PAR0 COMMAND+1*2
#define PAR1 COMMAND+2*2
#define PAR2 COMMAND+3*2
#define PAR3 COMMAND+4*2
#define PAR4 COMMAND+5*2
#define PAR5 COMMAND+6*2
;
#define MAR0 COMMAND+8*2
#define MAR1 COMMAND+9*2
#define MAR2 COMMAND+10*2
#define MAR3 COMMAND+11*2
#define MAR4 COMMAND+12*2
#define MAR5 COMMAND+13*2
#define MAR6 COMMAND+14*2
#define MAR7 COMMAND+15*2
#define RES1F COMMAND+0x1F*2
#define RECVBUFFSTART 0x46 // 接收队列开始页
#define RECVBUFFSTOP 0x80 // 接收队列结束页(此页不可用)
#define TRANSBUFFSTART 0x40 // 发送开始页
#define TRANSMITBUFFER 0x40
四. 网卡复位
网卡的复位有冷复位和热复位两种;
网卡为高电平复位, 高电平至少需维持800nm的宽度, 施加一个1us以上高电平便可
对网卡进行复位.复位电平从高变低后, 需等待一定时间,因为复位的过程将执行一些
操作,比如将93c46读入,将内部寄存器初始化等。这些至少需要2毫秒的时间。我
们推荐大家等待更久的时间之后才对网卡操作,比如100毫秒之后才对它操作,以确
保完全复位。为了保证能够完全复位,加上热复位代码,18H--1FH共8个地址,为
复位端口。对该端口偶数地址的读,或者写入任何数,都引起网卡的复位。
当复位成功时, ISR.7置1, 用户可查询该位得知网卡是否正确复位.
网卡热复位子程序:
void netcardreset()
{
uchar temp;
temp = inportb(RES1F);
outportb(RES1F, temp);
for(int i=0;i<1000;i++);
}
四. 网卡初始化
网卡寄存器详细说明,可参考资料DM9008F
//----------------------------------------------------
void DriverInit()
{
disable(); // 关中断
DcrVal = 0x48; // 数据配置寄存器变量
TcrVal = 0; // 发送配置寄存器变量
RcrVal = 0x04; // 接收配置寄存器变量
ImrVal = 0x9f; // 中断屏蔽寄存器变量
IsrVal = 0xff; // 中断状态寄存器变量
RecvNextPkt = RECVBUFFSTART; // 接收下一包页地址变量
TransNextPkt = TRANSBUFFSTART; // 发送下一包页地址变量
outportb(COMMAND, 0x21); // into stop mode
outportb(DCR, DcrVal); // must be initialized prior to the
// Remote Byte Count Registers,
outportb(RBCR0, 0); // Remote Byte Count Register0
outportb(RBCR1, 0); // Remote Byte Count Register1
outportb(RecvCR, RcrVal); // Receive configuration register
outportb(TPSR, TRANSBUFFSTART); // Transmit Page Start Register
outportb(TCR, 2); // Transmit Configration Register
outportb(PSTART, RECVBUFFSTART); // Page Start Register
outportb(BNRY, RECVBUFFSTART); // Boundary Register
outportb(PSTOP, RECVBUFFSTOP); // Page Stop Register
outportb(COMMAND, 0x61); // into page 1
outportb(CURR, RECVBUFFSTART); // write CURRENT pgae register
//-------set phsical address----------------- // set physical address
outportb(PAR0, MyAddr.PhsAddr[0]);
outportb(PAR1, MyAddr.PhsAddr[1]);
outportb(PAR2, MyAddr.PhsAddr[2]);
outportb(PAR3, MyAddr.PhsAddr[3]);
outportb(PAR4, MyAddr.PhsAddr[4]);
outportb(PAR5, MyAddr.PhsAddr[5]);
//-------set multicast address--------------- // set multicast address
/*
outportb(MAR0, 0);
outportb(MAR1, 0x41);
outportb(MAR2, 0x0);
outportb(MAR3, 0x80);
outportb(MAR4, 0);
outportb(MAR5, 0);
outportb(MAR6, 0);
outportb(MAR7, 0);
*/
//-------------------------------------------
outportb(COMMAND, 0x22); // back to page 0
outportb(ISR, IsrVal); // clear ISR
outportb(IMR, ImrVal); // set IMR
outportb(TCR, TcrVal); // set transmit configuration register in normal mode
enable(); // enable interrupt
}
--网卡含有16K字节的RAM,地址为0x4000-0x7fff(指的是网卡上的存储地址,而不是ISA总线的地址,是网卡工作用的存储器),每256个字节称为一页,共有64页。页的地址就是地址的高8位,页地址为0x40--0x7f 。这16k的ram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包。
--在我的程序中使用0x40-0x45为网卡的发送缓冲区,共6页,刚好可以存储1