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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ether3c.c

?? 嵌入式小型TCPIP協議棧
?? C
字號:
/* 3COM Etherlink III 3C509 ISA drivers for 'TCP/IP Lean' (c) Iosoft Ltd. 2000

WARNING: this driver is in an early stage of development...
It only works with the co-ax network interface at present, not twisted pair.
Use 3COM's 3C5X9CFG utility to select the interface and set the I/O addr

This software is only licensed for distribution with the book 'TCP/IP Lean',
and may only be used for personal experimentation by the purchaser
of that book, on condition that this copyright notice is retained.
For commercial licensing, contact license@iosoft.co.uk

This is experimental software; use it entirely at your own risk. The author
offers no warranties of any kind, including its fitness for purpose. */

/*
** v0.01 JPB 1/12/99
** v0.02 JPB 7/1/00   Added 'maxlen' to initialisation
** v0.03 JPB 17/1/00  Removed 'maxlen' again!
** v0.04 JPB 20/1/00  Added support for multiple cards
** v0.05 JPB 23/3/00  Added flag for promiscuous mode
** v0.06 JPB 3/7/00   Revised header for book CD
*/

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#include "ether.h"              /* Typedefs and function prototypes */
#include "netutil.h"
#include "net.h"

#define IDPORT      0x100       /* ID port addr (NOT the card base addr) */

/* Register definitions */
#define CMDS        0xe         /* Command/status       all windows */
#define CCR         0x4         /* Config control       window 0 */
#define FIFO        0x0         /* Tx/Rx FIFO           window 1 */
#define RXSTAT      0x8         /* Receive status       window 1 */
#define TXSTAT      0xb         /* Transmit status      window 1 (byte) */
#define ETHADDR     0x0         /* Ethernet address     window 2 */
#define RXFREE      0xa         /* Rx free space        window 3 */
#define TXFREE      0xc         /* Tx free space        window 1 or 3 */
#define MEDIATYPE   0xa         /* Media type & status  window 4 */

/* Commands */
#define CMD_RESET       0x0000  /* Reset board */
#define CMD_SELWIN      0x0800  /* Select register window */
#define CMD_COAX        0x1000  /* Start coax transceiver */
#define CMD_RXDIS       0x1800  /* Disable Rx */
#define CMD_RXEN        0x2000  /* Enable Rx */
#define CMD_RXDISC      0x4000  /* Discard Rx packet */
#define CMD_TXDIS       0x5000  /* Disable Tx */
#define CMD_TXRESET     0x5800  /* Reset Tx */
#define CMD_TXEN        0x4800  /* Enable Tx */
#define CMD_RXFILT      0x8000  /* Set Rx filter */
#define CMD_TXTHRESH    0x9800  /* Tx threshold */
#define CMD_NOCOAX      0xb800  /* Stop coax transceiver */

/* Network controller register I/O */
#define GETREG(r)       inpw((WORD)(ebase+r))       /* Read word from reg */
#define SETREG(r, x)    outpw((WORD)(ebase+r), x)   /* Write word to reg */
#define CMD(c, x)       SETREG(CMDS, (WORD)(c+x))   /* Send command and data */
#define SELWIN(x)       CMD(CMD_SELWIN, x)          /* Select window number */

typedef struct                  /* Net driver configuration data */
{
    WORD dtype;                     /* Driver type */
    BYTE myeth[MACLEN];             /* MAC (Ethernet) addr */
    WORD ebase;                     /* Card I/O base addr */
} CONFIGNE;

static CONFIGNE configs[MAXNETS];   /* Driver configurations */

static unsigned ebase;              /* Temp I/O base addr (not ID port addr) */
extern int promisc;                 /* Flag to enable promiscuous mode */

/* Private prototypes */
void write_idseq(void);
WORD read_eeword(BYTE oset);

/* Initialise card given base addr, and byte/word mode flag
** Return 0 if initialisation error */
int init_ether3c(WORD dtype, WORD baseaddr)
{
    int ok=0, i;
    WORD w, addr, mfg, prod;
    CONFIGNE *cp;

    cp = &configs[dtype & NETNUM_MASK]; /* Get pointer into driver data */
    cp->dtype = dtype;                  /* Set driver type */
    cp->ebase = ebase = baseaddr;       /* Set card I/O base address */
    outp(IDPORT, 0xc0);                 /* Reset board, wait at least 1 msec */
    delay(10);
    write_idseq();                      /* Do strange ident sequence */
    outp(IDPORT, 0xc0);                 /* Rinse and repeat.. */
    delay(10);
    write_idseq();                 
    mfg = read_eeword(7);               /* Check manufacturer ID */
    prod = read_eeword(3);              /* ..and product ID */
    if (mfg==0x6d50 && (prod&0xf0ff)==0x9050)
    {
        if ((addr=(read_eeword(8) & 0x1f)*0x10 + 0x200) != ebase)
            printf("ERROR: actual card base addr %03Xh\n", addr);
        else
        {
            outp(IDPORT, 0xff);         /* Activate board */
            delay(10);
            SELWIN(0);                  /* Enable adapter */
            SETREG(CCR, 0x01);
            SELWIN(2);
            for (i=0; i<MACLEN; i+=2)   /* Get Ethernet address */
            {
                w = read_eeword((BYTE)(i/2));
                cp->myeth[i] = (BYTE)(w >> 8);
                cp->myeth[i+1] = (BYTE)w;   /* ..and set in controller */
                SETREG(ETHADDR+i, swapw(w));
            }
            CMD(CMD_TXTHRESH, 0x777);   /* Only Tx when whole packet sent */
            CMD(CMD_COAX, 0);           /* Start coax transceiver */
            delay(10);
            SELWIN(3);
            CMD(CMD_TXEN, 0);           /* Enable transmit */
            if (promisc)
                CMD(CMD_RXFILT, 8);     /* Set promiscuous mode */
            else
                CMD(CMD_RXFILT, 5);     /* Accept own & bcast addrs */
            CMD(CMD_RXEN, 0);           /* Enable receive */
            SELWIN(1);
            ok = 1;
        }
    }
    else
        printf("ERROR: card manufacturer %04Xh product %04Xh\n", mfg, prod);
    return(ok);
}

/* Return pointer to my Ethernet addr, given driver type */
BYTE *ether3c_addr(WORD dtype)
{
    return(configs[dtype & NETNUM_MASK].myeth);
}

/* Close down ethernet controller */
void close_ether3c(WORD dtype)
{
    ebase = configs[dtype & NETNUM_MASK].ebase;
    if (ebase)
    {
        CMD(CMD_TXDIS, 0);           /* Disable transmit & receive */
        CMD(CMD_RXDIS, 0);
        configs[dtype & NETNUM_MASK].ebase = 0;
    }
}

/* Poll network interface to keep it alive; send & receive frames */
void poll_ether3c(WORD dtype)
{
    WORD len;
    BYTE stat;
    static BYTE ebuff[MAXFRAMEC];
    CONFIGNE *cp;

    cp = &configs[dtype & NETNUM_MASK];
    if (cp->ebase)                              /* If net in use.. */
    {
        ebase = cp->ebase;                      /* Set card I/O address */
        /* Receive */
        SELWIN(1);
        while ((len=get_ether3c(ebuff))>0)
        {                               /* Store frames in circ buff */
            receive_upcall(cp->dtype, ebuff, len);
        }
        /* Transmit */
        while ((stat=inp((WORD)(ebase+TXSTAT))) & 0x80)
        {
            if (stat & 0x1c)                    /* Reset Tx if error */
            {
                CMD(CMD_TXRESET, 0);
                CMD(CMD_TXEN, 0);
            }
            outp((WORD)(ebase+TXSTAT), 0);      /* Pop status off stack */
        }
        while (GETREG(TXFREE)>=MAXFRAME &&      /* While space in buff.. */
            (len=transmit_upcall(cp->dtype, ebuff, MAXFRAME))>0)
        {                                       /* ..and frame available.. */
            memcpy(&ebuff[MACLEN], cp->myeth, MACLEN);  /* Set my addr */
            put_ether3c(ebuff, len);            /* ..and transmit frame */
        }
    }
}

/* Get packet into buffer, return length (excl CRC), or 0 if none available */
WORD get_ether3c(void *pkt)
{
    WORD stat, len=0;
    register WORD n, *p;

    if (!((stat = GETREG(RXSTAT)) & 0x8000))/* If complete packet received.. */
    {
        if (!(stat & 0x4000))               /* ..and no errors */
        {
            p = (WORD *)pkt;                /* Get data ptr & length */
            len = minw((WORD)(stat&0x7ff), MAXFRAME);
            n = (len+1) >> 1;
            while (n--)                     /* Read bytes */
                *p++ = GETREG(FIFO);
        }
        CMD(CMD_RXDISC, 0);                 /* Discard received packet */
    }
    return(len);                            /* Return length excl. CRC */
}

/* Send Ethernet packet given len excl. CRC, return length */
WORD put_ether3c(void *pkt, WORD len)
{
    register WORD n, *p;

    p = (WORD *)pkt;                        /* Get length & word ptr */
    len = minw(MAXFRAME, maxw(MINFRAME, len));
    SETREG(FIFO, len);                      /* Send length */
    SETREG(FIFO, 0);                        /* ..and dummy word */
    n = (((len+3) & 0xffc) >> 1);           /* Round len up to DWORD boundary */
    while (n--)                             /* Send data */
        SETREG(FIFO, *p++);
    return(len);
}

/* Do ID sequence to put board in ID command state */
void write_idseq(void)
{
    WORD a=0xff;
    int i;

    outp(IDPORT, 0);
    outp(IDPORT, 0);
    for (i=0; i<255; i++)
    {
        outp(IDPORT, a);
        if ((a <<= 1) & 0x100)
            a ^= 0xcf;
    }
}

/* Read EEPROM data (if already in ID command state) */
WORD read_eeword(BYTE oset)
{
    int i;
    WORD w=0;

    outp(IDPORT, 0x80+oset);
    delay(1);
    for (i=0; i<16; i++)
        w = (w<<1) | (inpw(IDPORT) & 1);
    return(w);
}

/* EOF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美大片一区二区| 欧美日韩aaaaaa| 韩国精品主播一区二区在线观看 | 亚洲视频中文字幕| 国产精品久久久一本精品| 亚洲国产岛国毛片在线| 久久天天做天天爱综合色| 久久久不卡影院| 中文字幕欧美国产| 中文字幕一区二区三区不卡| 亚洲日本在线看| 亚洲国产一区二区三区| 午夜av一区二区| 久久成人av少妇免费| 国内久久精品视频| 成人国产精品视频| 欧美视频一区在线| 精品国产伦一区二区三区观看方式 | 成人免费av在线| 97超碰欧美中文字幕| 色狠狠色狠狠综合| 欧美一区二区黄色| 国产亚洲欧美激情| 亚洲精品国产成人久久av盗摄| 亚洲制服丝袜在线| 美腿丝袜亚洲一区| www.欧美日韩国产在线| 欧美日韩中文一区| 精品国一区二区三区| 国产精品白丝在线| 五月天久久比比资源色| 国产精品综合视频| 欧美亚洲一区二区三区四区| 欧美成人bangbros| 一区二区三区国产| 韩国av一区二区三区在线观看| 成人黄色网址在线观看| 678五月天丁香亚洲综合网| 国产清纯白嫩初高生在线观看91 | 欧美肥妇bbw| 国产精品视频线看| 免费在线观看一区二区三区| 成人动漫一区二区在线| 欧美高清hd18日本| 中文字幕人成不卡一区| 久久精品国产99| 欧美日韩一区二区三区高清| 久久天堂av综合合色蜜桃网 | 欧美一区二区三区不卡| 中文字幕在线不卡一区二区三区| 偷拍与自拍一区| 91美女在线看| 国产三级欧美三级日产三级99| 亚洲一区二区在线观看视频| 成人深夜视频在线观看| 日韩精品中文字幕在线一区| 亚洲精品国产一区二区三区四区在线| 麻豆成人综合网| 91精品国产丝袜白色高跟鞋| 亚洲狠狠丁香婷婷综合久久久| 狠狠久久亚洲欧美| 日韩一区二区三区电影| 亚洲高清一区二区三区| 在线亚洲高清视频| 日韩伦理电影网| av网站免费线看精品| 国产日韩精品一区二区三区| 久久99精品一区二区三区 | 久久国产夜色精品鲁鲁99| 欧美日本国产一区| 亚洲不卡av一区二区三区| 色猫猫国产区一区二在线视频| 国产精品久久久久久久久久久免费看 | 91精品国产欧美一区二区| 亚洲成人av福利| 欧美视频中文一区二区三区在线观看 | 国产福利91精品一区二区三区| 日韩欧美国产三级电影视频| 奇米亚洲午夜久久精品| 欧美精品色综合| 视频一区二区中文字幕| 欧美日韩一卡二卡| 日韩精品电影在线| 欧美一区三区二区| 久久精品久久99精品久久| 欧美tk—视频vk| 国产成人精品综合在线观看| 欧美国产一区视频在线观看| voyeur盗摄精品| 亚洲激情成人在线| 欧美日本视频在线| 国产一区二三区好的| 国产精品天美传媒| 91福利视频久久久久| 无码av免费一区二区三区试看 | 亚洲激情自拍视频| 欧美日韩一区在线观看| 九九久久精品视频| 国产精品美女久久久久久2018 | 天堂午夜影视日韩欧美一区二区| 在线不卡免费av| 国产精品亚洲成人| 一区二区三区四区av| 日韩一区二区三区精品视频| 国产成人精品免费视频网站| 一个色妞综合视频在线观看| 欧美一区二区在线看| 国产激情一区二区三区桃花岛亚洲 | 久久久91精品国产一区二区精品 | 欧美va亚洲va香蕉在线| 成人黄色综合网站| 亚洲电影视频在线| 国产亚洲美州欧州综合国| 91首页免费视频| 全国精品久久少妇| 中文字幕一区不卡| 精品理论电影在线观看| 色综合色狠狠天天综合色| 久久精品噜噜噜成人av农村| 亚洲欧美偷拍三级| 久久中文娱乐网| 欧美视频你懂的| av电影在线观看完整版一区二区| 日韩专区中文字幕一区二区| 国产精品久久久久久久久免费樱桃| 91精品久久久久久久久99蜜臂| 成人免费福利片| 国产一区二区三区日韩| 天堂蜜桃一区二区三区 | 欧美午夜精品理论片a级按摩| 精品制服美女久久| 午夜精品福利一区二区蜜股av| 亚洲国产精品成人综合色在线婷婷 | 国产精品久久久久一区二区三区共| 欧美午夜片在线观看| 91最新地址在线播放| 成人手机在线视频| 国产精品资源网站| 狠狠色丁香久久婷婷综| 蜜臀av性久久久久蜜臀av麻豆| 亚洲国产一二三| 亚洲在线观看免费| 亚洲人成在线播放网站岛国| 中文成人综合网| 国产欧美日韩精品a在线观看| 精品99一区二区三区| 精品国产人成亚洲区| 日韩久久久久久| 日韩欧美成人激情| 91精品国产欧美一区二区18| 678五月天丁香亚洲综合网| 欧美精品在线观看播放| 欧美年轻男男videosbes| 91精品国产aⅴ一区二区| 91精品国产91综合久久蜜臀| 日韩一区二区在线观看视频 | 中文字幕一区二区三区在线播放 | 99天天综合性| 色综合天天综合网国产成人综合天 | 国产伦精一区二区三区| 国产伦精品一区二区三区在线观看 | 高清shemale亚洲人妖| 国产精品18久久久久久vr| 国产一区二区三区四| 国产成人精品免费| 99精品国产91久久久久久| 91蝌蚪porny成人天涯| 色婷婷av一区二区三区gif| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产欧美一区二区精品性色超碰| 国产婷婷色一区二区三区四区| 国产精品女上位| 夜夜嗨av一区二区三区| 亚洲成人av一区二区三区| 久久成人羞羞网站| 成人免费视频一区| 欧美性xxxxx极品少妇| 欧美大尺度电影在线| 国产精品女主播av| 亚洲不卡一区二区三区| 国产传媒一区在线| 色婷婷精品大视频在线蜜桃视频| 欧美日韩成人一区二区| 久久综合狠狠综合久久综合88 | 91麻豆精品国产综合久久久久久| 日韩精品一区二区三区四区视频 | 欧美日韩一区二区三区四区五区| 欧美一级高清片| 亚洲视频一区在线| 男女男精品网站| 99久久精品国产网站| 欧美成人vr18sexvr| 日韩理论片在线| 激情文学综合插| 在线视频国内自拍亚洲视频| 久久精品人人做人人爽97 | 日韩精品一区二区三区视频在线观看 | 久久九九久久九九| 丝袜诱惑制服诱惑色一区在线观看| 国产麻豆一精品一av一免费|