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

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

?? ether3c.c

?? 內容包括: 嵌入式TCPIP協議棧應用主機端程序(VC6源碼);如何構造嵌入式Linux系統;基于ARM的嵌入式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一区二区三区免费野_久草精品视频
www.在线成人| 精品美女在线播放| 日韩欧美国产精品| 樱花草国产18久久久久| 国产一区二区按摩在线观看| 欧美一区二区啪啪| 亚洲婷婷国产精品电影人久久| 国产经典欧美精品| 欧美国产97人人爽人人喊| 亚洲欧美国产毛片在线| 欧美精品国产精品| 一区二区三区国产精品| 91精彩视频在线观看| 欧美丝袜丝交足nylons图片| 日韩一区二区三区在线视频| 亚洲午夜在线电影| 中文字幕制服丝袜成人av | 久久精品国产色蜜蜜麻豆| 亚洲视频小说图片| 国产三级精品三级| 欧美va亚洲va在线观看蝴蝶网| 欧美色图第一页| 在线一区二区三区四区五区| 成人免费视频视频在线观看免费 | 美女性感视频久久| 天堂va蜜桃一区二区三区| 一区二区三区在线观看欧美| 国产精品美女视频| 99re这里只有精品视频首页| 中文字幕综合网| 欧美浪妇xxxx高跟鞋交| 久久成人麻豆午夜电影| 亚洲欧美在线aaa| 欧美人狂配大交3d怪物一区| 久久激情五月激情| 一区在线观看免费| 在线不卡a资源高清| 国产不卡视频在线播放| 亚洲欧美aⅴ...| 久久精品视频一区二区三区| 欧美性受xxxx黑人xyx| 国产成人精品午夜视频免费| 一区二区三区成人在线视频| 国产精品国产三级国产专播品爱网| 成人精品鲁一区一区二区| 婷婷中文字幕综合| 亚洲女同女同女同女同女同69| 欧美三级在线看| 欧美韩日一区二区三区四区| 国内精品自线一区二区三区视频| 国产精品区一区二区三| 日韩免费一区二区三区在线播放| 欧美精品精品一区| 亚洲午夜电影在线观看| 欧美精品久久久久久久多人混战| 国内精品久久久久影院色| 国产成人高清在线| 99国产精品久久久| 欧美体内she精视频| 欧美一区二区免费观在线| 精品国产一区久久| 日本一区二区三区久久久久久久久不| 中文字幕一区av| 亚洲综合色成人| 久久精品久久精品| 成人av免费在线观看| 欧美亚洲国产怡红院影院| 日韩一区二区视频在线观看| 中文字幕高清一区| 伊人性伊人情综合网| 美女视频网站久久| 不卡高清视频专区| 欧美肥大bbwbbw高潮| 精品国产99国产精品| 亚洲欧洲国产专区| 麻豆久久久久久久| av在线不卡观看免费观看| 欧美年轻男男videosbes| 国产欧美一区二区三区在线看蜜臀 | 九九精品一区二区| 99久久精品国产一区二区三区| 欧美日产在线观看| 欧美高清在线一区二区| 午夜av电影一区| 成人av影视在线观看| 4438x亚洲最大成人网| 中文字幕免费观看一区| 亚洲成人av中文| 成人综合婷婷国产精品久久免费| 欧美日韩一级黄| 国产欧美综合在线观看第十页| 亚洲成年人影院| www.亚洲免费av| 精品国产电影一区二区| 亚洲电影一区二区三区| 春色校园综合激情亚洲| 欧美videos大乳护士334| 亚洲精品成人a在线观看| 国产尤物一区二区| 777色狠狠一区二区三区| 国产精品久久久久久久久免费丝袜| 麻豆专区一区二区三区四区五区| 91丝袜美女网| 国产亚洲一本大道中文在线| 日韩综合一区二区| 在线免费亚洲电影| 一区视频在线播放| 丰满少妇在线播放bd日韩电影| 欧美大片在线观看一区二区| 亚洲成a人片综合在线| av男人天堂一区| 久久久久久毛片| 狠狠色综合日日| 欧美成人激情免费网| 婷婷国产在线综合| 欧美色男人天堂| 一区二区三区精品视频| 99精品欧美一区二区蜜桃免费 | 欧美激情综合在线| 裸体一区二区三区| 欧美一区欧美二区| 视频一区视频二区中文| 欧美日韩一区二区三区高清| 亚洲精品成a人| 91亚洲男人天堂| 亚洲视频香蕉人妖| 色哟哟国产精品| 一区二区三区成人在线视频| 色婷婷精品久久二区二区蜜臂av| 欧美国产激情二区三区| 国产精品一区二区在线观看不卡| 2021国产精品久久精品| 极品瑜伽女神91| 国产亚洲欧美中文| 国产精品18久久久久久vr | 天天免费综合色| 欧美日韩精品三区| 亚洲成av人在线观看| 欧美日本在线播放| 奇米色777欧美一区二区| 欧美一级一级性生活免费录像| 青青草视频一区| 精品粉嫩aⅴ一区二区三区四区| 国产精品一区在线观看乱码| 欧美国产综合色视频| youjizz久久| 亚洲永久精品大片| 欧美日韩电影一区| 日本一不卡视频| 26uuu精品一区二区| 国产99久久久国产精品潘金| 亚洲三级理论片| 欧美日韩国产a| 国产一区二区网址| 国产精品成人一区二区艾草| 91久久国产最好的精华液| 午夜日韩在线电影| 26uuu国产日韩综合| www.欧美色图| 午夜不卡在线视频| 久久久久综合网| 一本色道久久综合亚洲91 | 国产一区二区按摩在线观看| 国产精品伦一区| 欧美日韩精品专区| 国产精品中文字幕日韩精品 | 亚洲精品高清在线观看| 欧美一级免费观看| 成人性生交大合| 亚洲一区二区三区不卡国产欧美| 日韩视频中午一区| 91麻豆文化传媒在线观看| 亚洲午夜在线观看视频在线| 久久久亚洲精品石原莉奈 | 中文字幕第一区| 91精彩视频在线观看| 精品一区二区三区视频在线观看 | 三级不卡在线观看| 国产丝袜欧美中文另类| 欧美日韩日日骚| 国产盗摄女厕一区二区三区| 香蕉成人伊视频在线观看| 国产欧美日韩三级| 欧美剧情片在线观看| av午夜精品一区二区三区| 美女国产一区二区三区| 亚洲激情图片一区| 国产日韩欧美一区二区三区乱码| 91久久免费观看| 高清不卡在线观看| 日本中文字幕一区二区视频 | 日韩丝袜情趣美女图片| 91麻豆国产香蕉久久精品| 精品一区二区av| 亚洲成人一区二区| 亚洲欧洲av色图| 国产性做久久久久久| 欧美一区二区三区人| 色8久久精品久久久久久蜜| 国产麻豆欧美日韩一区|