亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? eagle.c

?? 這是新華龍(www.xhl.xom.xn)開發(fā)的
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Interface driver for the EAGLE board for KA9Q's TCP/IP on an IBM-PC ONLY!
 *
 *  Written by Art Goldman, WA3CVG - (c) Copyright 1987 All Rights Reserved
 *  Permission for non-commercial use is hereby granted provided this notice
 *  is retained.  For info call: (301) 997-3838.
 */

#include <stdio.h>
#include <dos.h>
#include "global.h"
#include "mbuf.h"
#include "iface.h"
#include "pktdrvr.h"
#include "netuser.h"
#include "eagle.h"
#include "z8530.h"
#include "ax25.h"
#include "trace.h"
#include "nospc.h"
#include "devparam.h"
#include <time.h>

static int32 eg_ctl(struct iface *iface,int cmd,int set,int32 val);
static int eg_raw(struct iface *iface,struct mbuf **bpp);
static int eg_stop(struct iface *iface);
static void egchanparam(struct egchan *hp);
static void egexint(struct egchan *hp);
static void egrxint(struct egchan *hp);
static void egtxint(struct egchan *hp);
static void rts(struct egchan *hp,uint16 x);
static void waitmsec(int n);

static struct EGTAB Eagle[EGMAX];	/* Device table - one entry per card */
static INTERRUPT (*eghandle[])() = {	/* handler interrupt vector table */
	eg0vec,	
};
static struct egchan Egchan[2*EGMAX];	/* channel table - 2 entries per card */
static uint16 Egnbr;

/* Master interrupt handler.  One interrupt at a time is handled.
 * here. Service routines are called from here.
 */
INTERRUPT (far *(egint)(dev))()
int dev;
{
	register char st;
	register uint16 pcbase;
	struct egchan *hp;
	struct EGTAB *ep;

	ep = &Eagle[dev];
	ep->ints++;
	pcbase = ep->addr;

	/* Read interrupt status register from channel A */
	while((st = read_scc(pcbase+CHANA+CTL,R3)) != 0) {
		/* Use IFs to process ALL interrupts pending
		 * because we need to check all interrupt conditions
		 */
		if (st & CHARxIP) {
			/* Channel A Rcv Interrupt Pending */
			hp = &Egchan[2 * dev];
			egrxint(hp);
		} else if (st & CHATxIP) {
			/* Channel A Transmit Int Pending */
			hp = &Egchan[2 * dev];
			egtxint(hp);
		} else if (st & CHAEXT) {
			/* Channel A External Status Int */
			hp = &Egchan[2 * dev];
			egexint(hp);
		} else if (st & CHBRxIP) {
			/* Channel B Rcv Interrupt Pending */
			hp = &Egchan[(2 * dev)+1];
			egrxint(hp);
		} else if (st & CHBTxIP) {
			/* Channel B Transmit Int Pending */
			hp = &Egchan[(2 * dev)+1];
			egtxint(hp);
		} else if (st & CHBEXT) {
			/* Channel B External Status Int */
			hp = &Egchan[(2 * dev)+1];
			egexint(hp);
		}
		/* Reset highest interrupt under service */
		write_scc(hp->base+CTL,R0,RES_H_IUS);
	} /* End of while loop on int processing */
	return ep->chain ? ep->oldvec : NULL;
}

/* Eagle SIO External/Status interrupts
 * This can be caused by a receiver abort, or a Tx UNDERRUN/EOM.
 * Receiver automatically goes to Hunt on an abort.
 *
 * If the Tx Underrun interrupt hits, change state and
 * issue a reset command for it, and return.
 */
static void
egexint(hp)
register struct egchan *hp;
{
	char st;
	int i_state;

	i_state = dirps();
	hp->exints++;
	st = read_scc(hp->base+CTL,R0);     /* Fetch status */

	/* Check for Tx UNDERRUN/EOM - only in Transmit Mode */
	if((hp->rstate==0) && (st & TxEOM)) {
		/* if in UNDERRUN, go to FLAGOUT state
		 * see explanation under egtxint()
		 * CRC & FLAG now going out, so
		 * wait for Tx BUffer Empty int
		 */

		/* If we are not in underrun, this is an unexpected
		 * underrun.  EOM bit should be set, so the SCC will
		 * now send an abort
		 */

		if(hp->tstate == UNDERRUN)
		    hp->tstate = FLAGOUT;

		/* Tx Buff EMPTY interrupt occurs after CRC is sent */
	}

	/* Receive Mode only
	 * This triggers when hunt mode is entered, & since an ABORT
	 * automatically enters hunt mode, we use that to clean up
	 * any waiting garbage
	 */
	if((hp->rstate == ACTIVE) && (st & BRK_ABRT)) {
		hp->rcp = hp->rcvbuf->data;
		hp->rcvbuf->cnt = 0;	      /* rewind on DCD transition */
		hp->aborts++;		      /* nbr aborts * 2 */
	}

	/* reset external status latch */
	write_scc(CTL+hp->base,R0,RES_EXT_INT);

	restore(i_state);
}

/* EG receive interrupt handler. The first receive buffer is pre-allocated
 * in the init routine.  Thereafter, it is filled here, queued out, and a
 * new one acquired.  CRC, OVERRUN and TOOBIG errors merely 'rewind' the
 * pointers and reuse the same buffer.
 */
static void
egrxint(hp)
register struct egchan *hp;
{
	register uint16 base;
	char rse;
	int i_state;

	i_state = dirps();
	hp->rxints++;
	base = hp->base;

	if ((read_scc(base+CTL,R0)) & Rx_CH_AV) {
		/* there is a char to be stored
		 * read special condition bits before reading the data char
		 */
		rse = read_scc(hp->base+CTL,R1); /* get status byte from R1 */
		if(rse & Rx_OVR) {
			/* Rx overrun - toss buffer */
			hp->rcp = hp->rcvbuf->data;	/* reset buffer pointers */
			hp->rcvbuf->cnt = 0;
			hp->rstate = RXERROR;	/* set error flag */
			hp->rovers++;		/* count overruns */
		} else if(hp->rcvbuf->cnt >= hp->bufsiz) {
			/* Too large -- toss buffer */
			hp->toobig++;
			hp->rcp = hp->rcvbuf->data;	/* reset buffer pointers */
			hp->rcvbuf->cnt = 0;
			hp->rstate = TOOBIG;	/* when set, chars are not stored */
		}
		/* ok, we can store the received character now */
		if(hp->rstate == ACTIVE) {		/* If no errors... */
			*hp->rcp++ = inportb(base+DATA);    /* char to rcv buff */
			hp->rcvbuf->cnt++;		    /* bump count */
		} else {
			/* got to empty FIFO */
			(void) inportb(base+DATA);
			write_scc(hp->base+CTL,R0,ERR_RES);	/* reset err latch */
			hp->rstate = ACTIVE;
		}
	}
	/* char has been stored
	 * read special condition bits
	 */
	rse = read_scc(hp->base+CTL,R1);     /* get status byte from R1 */

	/* The End of Frame bit is ALWAYS associated with a character,
	 * usually, it is the last CRC char.  Only when EOF is true can
	 * we look at the CRC byte to see if we have a valid frame
	 */
	if(rse & END_FR) {
		hp->rxframes++;
		/* END OF FRAME -- Make sure Rx was active */
		if(hp->rcvbuf->cnt > 0) {		/* any data to store */
			/* looks like a frame was received
			 * now is the only time we can check for CRC error
			 */
			if((rse & CRC_ERR) || (hp->rstate > ACTIVE) || (hp->rcvbuf->cnt < 10)) {
				/* error occurred; toss frame */
				if(rse & CRC_ERR)
					hp->crcerr++;	/* count CRC errs */
				if(hp->rstate == RXERROR)
					hp->rovers++;
				/* don't throw away buffer -
				 * merely reset the pointers
				 */
				hp->rcp = hp->rcvbuf->data;
				hp->rcvbuf->cnt = 0;
			} else {
				/* Here we have a valid frame */
				hp->rcvbuf->cnt -= 2;	       /* Toss 2 crc bytes */
				net_route(hp->iface,&hp->rcvbuf);
				/* packet queued - get buffer for next frame */
				hp->rcvbuf = alloc_mbuf(hp->bufsiz);
				hp->rcp = hp->rcvbuf->data;
				hp->rcvbuf->cnt = 0;
				if(hp->rcvbuf == NULL) {
					/* No memory, abort receiver */
					restore(i_state);
					printf("DISASTER! Out of Memory for Receive!\n");
					write_scc(CTL+base,R3,Rx8);
					return;
				}
			} /* end good frame queued */
		}  /* end check for active receive upon EOF */
		hp->rstate = ACTIVE;	/* and clear error status */
	} /* end EOF check */
	restore(i_state);
}

/* egchan transmit interrupt service routine
 *
 * The state variable tstate, along with some static pointers,
 * represents the state of the transmit "process".
 */
static void
egtxint(hp)
register struct egchan *hp;
{
	register uint16 base;
	int c;
	int i_state;

	i_state = dirps();

	if(hp->tstate != DEFER && hp->tstate)
		hp->txints++;
	base = hp->base;

	switch(hp->tstate) {
	case FLAGOUT:
		/* Here after CRC sent and Tx interrupt fires.
		 * To give the SCC a chance to get the FLAG
		 * out, we delay 100 Ms
		 */
		hp->tstate = IDLE;	/* fall thru to IDLE */
		waitmsec(10);		/* 100 msec wait for flag Tx */
		/* Note, it may be possible to stuff out a
		 * meaningless character, wait for the interrupt
		 * then go to idle.  A delay is absolutely necessary
		 * here else the packet gets truncated prematurely
		 * when no other packet is waiting to be sent.
		 * IDLE state indicates either we are starting a brand new packet
		 * as a result of its being queued for transmission (egtxint called
		 * from eg_raw), or after a frame has been transmitted (as a
		 * result of a Tx buffer empty interrupt after the CRC/FLAG
		 */
	case IDLE:
		/* Transmitter idle. Find a frame for transmission */
		if((hp->sndbuf = dequeue(&hp->sndq)) == NULL) {
			/* Nothing to send - return to receive mode
			 * Tx OFF now - flag should have gone
			 */
			rts(hp,OFF);
			restore(i_state);
			return;
		}
		/* If a buffer to send, we drop thru here */
	case DEFER:	    /* we may have deferred prev xmit attempt */
		/* PPERSIST CALCULATION: we use the lower byte of the
		 * 8253 timer 0 count, as a random number (0-255).
		 * If the persist value is higher, wait one slot time
		 */
		if(hp->persist >= peekb(0x40,0x6c))
			waitmsec(hp->slotime);

		/* Check DCD so we don't step on a frame being received */
		/* DCD is ACTIVE LOW on the SCC DCD pin, but the bit in R0 */
		/* is SET when DCD is ACTIVE!! */

		if((read_scc(base+CTL,R0) & DCD) > 0) { /* Carrier Detected? */
			hp->tstate = DEFER;	/* defer xmit */
			/* don't release dequeued buffer...*/
			restore(i_state);
			return;
		}

		rts(hp,ON);   /* Transmitter on */
		/* ints not enabled yet */

		/* Get next char to send */
		c = PULLCHAR(&hp->sndbuf);	    /* one char at a time */
		write_scc(CTL+base,R0,RES_Tx_CRC);	/* reset for next frame */
		outportb(base+DATA,c);	    /* First char out now */

		/* select transmit interrupts to enable */

		write_scc(CTL+base,R15,TxUIE);	    /* allow Underrun int only */
		write_scc(CTL+base,R1,TxINT_ENAB|EXT_INT_ENAB);  /* Tx/Extern ints on */
		write_scc(CTL+base,R9,MIE|NV);	    /* master enable */
		/* enable interrupt latch on board */
		outportb(hp->dmactrl,INTENABLE);

		hp->tstate = ACTIVE;	/* char going out now */
		restore(i_state);
		return;

	case ACTIVE:
		/* Here we are actively sending a frame */
		if((c = PULLCHAR(&hp->sndbuf)) != -1){
			outportb(hp->base+DATA,c);	/* next char is gone */
			/* stuffing a char satisfies Interrupt condition */
		} else {
			/* No more to send - just stop till underrun int */
			hp->tstate = UNDERRUN;
			free_p(&hp->sndbuf);
			/* now we reset the EOM latch & enable underrun int */
			write_scc(CTL+base,R0,RES_EOM_L);	/* send CRC at underrun */
			write_scc(CTL+hp->base,R0,RES_Tx_P); /* reset Tx Int Pend */
		}
		restore(i_state);
		return;     /* back to wait for interrupt */

	case UNDERRUN:
		/*
		 * This state is handled by an UNDERRUN interrupt, which
		 * is an External Status interrupt.  At UNDERRUN, the
		 * UNDERRUN/EOM latch in R0 will be 0, so the SCC will send
		 * CRC and ending flag.  After the CRC clears the Tx buffer,
		 * a TX BUFF EMPTY interrupt will fire.  At that time, we
		 * should be in FLAGOUT state, ready to send another frame
		 * if one is there to send.
		 */
		break;
	} /* end switch */
	restore(i_state);
}

/* SET Transmit or Receive Mode
 * Set RTS (request-to-send) to modem on Transmit
 */
static void
rts(hp,x)
register struct egchan *hp;
uint16 x;
{
uint16 tc;
long br;

	/* Reprogram BRG and turn on transmitter to send flags */
	if(x == ON) {				/* Turn Tx ON and Receive OFF */
		write_scc(CTL+hp->base,R3,Rx8);	/* Rx off */
		waitmsec(50);			/* 500 msec delay before on */
		hp->rstate = IDLE;
		write_scc(CTL+hp->base,R9,0);	/* Interrupts off */
		br = hp->speed; 		/* get desired speed */
		tc = (XTAL/br)-2;		/* calc 1X BRG divisor */
		write_scc(CTL+hp->base,R12,tc&0xFF);      /* lower byte */
		write_scc(CTL+hp->base,R13,(tc>>8)&0xFF); /* upper bite */

		write_scc(CTL+hp->base,R5,TxCRC_ENAB|RTS|TxENAB|Tx8|DTR);
		/* Transmitter now on */
		write_scc(CTL+hp->base,R0,RES_Tx_CRC);/* CRC reset */
		waitmsec(hp->txdelay);	  /* Delay after Tx on */
	} else {	/* Tx OFF and Rx ON */
		hp->tstate = IDLE;
		write_scc(CTL+hp->base,R5,Tx8|DTR); 	/* TX off now */
		write_scc(CTL+hp->base,R0,ERR_RES); 	/* reset error bits */

		write_scc(CTL+hp->base,R1,(INT_ALL_Rx|EXT_INT_ENAB));
		write_scc(CTL+hp->base,R15,BRKIE);		/* allow ABORT int */

		/* delay for squelch tail before enable of Rx */
		waitmsec(hp->squeldelay);	/* keep it up  */

		/* Reprogram BRG for 32x clock for receive DPLL */
		write_scc(CTL+hp->base,R14,BRSRC);	     /* BRG off, but keep Pclk source */
		br = hp->speed; 			/* get desired speed */
		tc = ((XTAL/32)/br)-2;			/* calc 32X BRG divisor */
		write_scc(CTL+hp->base,R12,tc&0xFF);	/* lower byte */
		write_scc(CTL+hp->base,R13,(tc>>8)&0xFF);	/* upper bite */
		write_scc(CTL+hp->base,R14,BRSRC|SEARCH);	/* SEARCH mode, keep BRG source */
		write_scc(CTL+hp->base,R14,BRSRC|BRENABL);	/* Enable the BRG */

		/* Now, turn on the receiver and hunt for a flag */
		write_scc(CTL+hp->base,R3,RxENABLE|RxCRC_ENAB|Rx8);
		hp->rstate = ACTIVE;			/* Normal state */
	}
}

/* Initialize eg controller parameters */
static void
egchanparam(hp)
register struct egchan *hp;
{
	uint16 tc;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久aaaa樱花| 国产精品午夜免费| 国产成人亚洲综合色影视| 亚洲啪啪综合av一区二区三区| 日韩午夜激情视频| 色婷婷久久一区二区三区麻豆| 久久99精品国产麻豆婷婷| 亚洲精品美国一| 中文字幕久久午夜不卡| 日韩网站在线看片你懂的| 91久久精品一区二区二区| 成人不卡免费av| 黄色小说综合网站| 首页亚洲欧美制服丝腿| 一区二区三区在线观看欧美| 久久久精品日韩欧美| 日韩一区二区在线看| 在线视频国产一区| 99久久99久久久精品齐齐| 国产精品一区二区三区乱码| 亚洲成人免费视频| 尤物视频一区二区| 日韩一区欧美一区| 国产清纯美女被跳蛋高潮一区二区久久w| 91精品国产一区二区三区蜜臀 | 亚洲另类在线视频| 国产色91在线| 久久亚洲综合色一区二区三区| 91精品午夜视频| 欧美日韩视频专区在线播放| 欧美在线高清视频| 欧美综合欧美视频| 欧美少妇xxx| 在线视频观看一区| 精品婷婷伊人一区三区三| 91免费观看国产| 一本大道久久a久久精二百| www.日韩在线| 一本大道av伊人久久综合| 91在线小视频| 欧美综合一区二区| 色婷婷精品久久二区二区蜜臂av| 99精品国产视频| 色诱亚洲精品久久久久久| 在线视频亚洲一区| 欧美日韩视频在线一区二区| 欧美日韩精品一区二区| 666欧美在线视频| 日韩欧美一区在线| 亚洲精品一区二区精华| 久久久精品天堂| 中文字幕中文乱码欧美一区二区| 成人欧美一区二区三区视频网页 | 亚洲精品视频在线观看网站| 亚洲精品免费一二三区| 亚洲成人免费视频| 玖玖九九国产精品| 粉嫩高潮美女一区二区三区| av欧美精品.com| 欧美tickling网站挠脚心| 精品精品欲导航| 欧美国产成人精品| 一区二区三区**美女毛片| 五月婷婷久久综合| 激情欧美日韩一区二区| 成人av午夜电影| 欧美性色黄大片| 欧美va在线播放| 国产精品电影一区二区三区| 一区二区三区 在线观看视频| 丝袜国产日韩另类美女| 国内精品伊人久久久久av影院 | 97精品久久久午夜一区二区三区 | 日本视频免费一区| 国产精品亚洲人在线观看| 97久久超碰国产精品电影| 欧美精品亚洲二区| 国产欧美综合色| 亚洲午夜在线电影| 韩国三级在线一区| 91久久精品国产91性色tv| 欧美电影影音先锋| 国产精品天美传媒| 日韩和的一区二区| 99精品偷自拍| 欧美成人艳星乳罩| 一区二区三区久久久| 狠狠色综合播放一区二区| 色老汉av一区二区三区| 欧美v国产在线一区二区三区| 亚洲色图视频网| 狠狠色综合日日| 欧美三级日本三级少妇99| 国产日韩欧美综合在线| 污片在线观看一区二区| 日韩免费一区二区三区在线播放| 中文字幕精品—区二区四季| 日韩国产精品91| av一本久道久久综合久久鬼色| 日韩午夜激情电影| 亚洲成人免费视| 99视频精品全部免费在线| 精品动漫一区二区三区在线观看| 亚洲一区二区三区自拍| 顶级嫩模精品视频在线看| 91精品国产综合久久久久久漫画| 国产精品久久久久久亚洲毛片| 蜜桃视频在线观看一区二区| 日本乱人伦aⅴ精品| 国产精品美女一区二区三区| 美女一区二区在线观看| 欧美人妇做爰xxxⅹ性高电影| 国产精品美女久久久久久| 国精产品一区一区三区mba视频| 欧美日韩精品二区第二页| 亚洲视频在线一区观看| 成人网页在线观看| 久久久久久99久久久精品网站| 免费看欧美女人艹b| 欧美男人的天堂一二区| 亚洲综合一二三区| 91久久一区二区| 亚洲色大成网站www久久九九| 成熟亚洲日本毛茸茸凸凹| 国产亚洲欧美一级| 国产美女久久久久| 久久免费美女视频| 国产麻豆成人传媒免费观看| 欧美成人乱码一区二区三区| 欧美aⅴ一区二区三区视频| 欧美日韩国产综合一区二区| 亚洲一区二区三区视频在线| 色拍拍在线精品视频8848| 亚洲日本va午夜在线电影| 99久久精品久久久久久清纯| 中文字幕一区视频| 91年精品国产| 亚洲伦在线观看| 在线亚洲免费视频| 午夜视频久久久久久| 亚洲精品国产a| 色婷婷av一区二区三区大白胸| 亚洲免费在线播放| 色婷婷综合久久久中文一区二区| 综合欧美亚洲日本| 色综合色狠狠综合色| 亚洲自拍偷拍av| 欧美日本韩国一区| 麻豆精品视频在线观看视频| 精品欧美乱码久久久久久1区2区| 韩国精品一区二区| 国产精品色噜噜| 一本到不卡免费一区二区| 亚洲第一福利一区| 欧美成人性福生活免费看| 国产91综合网| 亚洲美女视频在线| 7777女厕盗摄久久久| 国产美女精品人人做人人爽| 中文字幕第一区二区| 在线亚洲+欧美+日本专区| 首页国产丝袜综合| 久久精品人人做人人综合| 97久久超碰国产精品| 午夜激情久久久| 国产午夜精品久久久久久免费视 | 色综合色综合色综合色综合色综合 | 亚洲在线观看免费| 欧美一区二区在线观看| 国产精品66部| 伊人一区二区三区| 精品久久久久久最新网址| av欧美精品.com| 免费高清成人在线| 欧美激情在线免费观看| 欧美日本在线看| 高清国产午夜精品久久久久久| 一个色综合av| 26uuu国产在线精品一区二区| 91免费看`日韩一区二区| 亚洲123区在线观看| 国产欧美一区二区精品仙草咪| 在线亚洲精品福利网址导航| 国产在线视频不卡二| 亚洲一二三四在线观看| 国产亚洲成年网址在线观看| 欧美日韩亚洲另类| 福利一区在线观看| 日韩制服丝袜av| 亚洲天堂精品在线观看| 日韩欧美在线网站| 在线精品视频一区二区| 国产盗摄一区二区三区| 亚洲成人免费视频| 成人欧美一区二区三区在线播放| 欧美成人官网二区| 欧美性videosxxxxx| 成人午夜电影久久影院| 久久97超碰国产精品超碰| 亚洲一区二区三区四区在线|