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*16DRAM用于字符和图形的缓存.

6.      字库有1M(GB2312)4M(GBK2.0)可供选择

7.      三种显示模式: 8016点阵, 8024点阵;13216点阵

8.      软件可移植性强: 用户经少量的改动,可将一些通用的VGA程序

TCP/IP协议移植到该系统.

9.      单色或16VGA接口

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字节,因为整个以太网的帧的

长度范围应在 641518字节之间.

 

 

. 一个局域网的一台终端要与主机正常通讯,至少应该包含如下协议:

   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位窗口大小

 16TCP校验和                   

 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--0FH16个地址,为寄存器地址。
10H
--17H8个地址,为DMA地址。
18H
--1FH8个地址,为复位端口。
8位的操作方式,上面的地址中只有18是有用的:
00H
--0FH16个寄存器地址。
10H DMA
地址 10H--17H8个地址是一样的,都可以用来做DMA端口,只要用其中的一个就可以了)
1FH
复位地址。(18H1FH8个地址都是复位地址,每个地址的功能都是一样的,只要其中的一个就可以了,但实际上只有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--1FH8个地址,为

复位端口。对该端口偶数地址的读,或者写入任何数,都引起网卡的复位。

当复位成功时, ISR.71, 用户可查询该位得知网卡是否正确复位.

 

网卡热复位子程序:

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 。这16kram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包。

--在我的程序中使用0x40-0x45为网卡的发送缓冲区,共6页,刚好可以存储1