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

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

?? serpc.c

?? 嵌入式TCPIP協議棧的源代碼!
?? C
字號:
/* PC serial routines for 'TCP/IP Lean' (c) Iosoft Ltd. 2000

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. */

/*
** v1.00 JPB 2/3/97  Code extracted from TER.C v1.01
** v1.01 JPB 6/1/99  Added COM3/4 support
** v1.02 JPB 10/6/99 Added handshakes and 'initser'
** v1.03 JPB 11/6/99 Added non-interrupt capability to initser
** v1.04 JPB 3/11/99 Minor cosmetic changes for use with TCPIPFS
** v1.05 JPB 11/2/00 Added IRDA 'litelink' setting capability
** v1.06 JPB 17/3/00 Fixed uninitialised variable in 'litelink'
** v1.07 JPB 20/3/00 Changed 'txstr' to use char string (not byte string)
** v1.08 JPB 23/3/00 Added support for multiple serial channels
** v1.09 JPB 9/4/00  Added transmit interrupts
** v1.10 JPB 3/7/00  Revised header for book CD
*/

#include <stdio.h>
#include <dos.h>

#include "serpc.h"

#define TXINTS  1               /* Set non-zero to use transmit interrupts */

int break_handler(void);        /* Control-break handler */

typedef struct {                /* Structure for a circular buffer.. */
    char rbuf[RBUFSIZ];             /* Rx character buffer */
    int  ri, ro;                    /* I/P and O/P pointers */
#if TXINTS
    char tbuf[TBUFSIZ];             /* Tx character buffer */
    int  ti, to;                    /* I/P and O/P pointers */
#endif
    void interrupt (*oldvector)();  /* Save int vector */
    unsigned char oldmask;          /* Saved int mask */
    int irq;                        /* IRQ number */
    unsigned pic;                   /* Int controller addr */
    unsigned uart;                  /* UART addr */
} SERBUFF;

static SERBUFF serbuffs[MAXCOMMS];  /* One circular buffer per channel */
static int serchan;

void interrupt hand1(void), hand2(void), hand3(void), hand4(void);
void ser_handler(SERBUFF *sbp);
int txfree(SERBUFF *sbp);

/* Permissible IRDA baud rates */
long irbauds[] = {115200L, 57600L, 38400L, 19200L, 9600L, 4800L, 2400L, 0};

/* Set up UART to given baud rate, enable receive interrupts
** If 'irq' is zero, use standard IRQ number for COM1 and COM2
** Return base addr, 0 if error */
unsigned setuart(int com, long baud, int irq)
{
    unsigned far *addrp;
    unsigned addr;

    addrp = MK_FP(0x40, (com-1)*2);       /* Read BIOS data area for COM port */
    if (com<=0 || com>4 || *addrp<0x100 || *addrp==0xffff)
        return(0);
    addr = *addrp;
    if ((com==1 && addr!=UART1) || (com==2 && addr!=UART2))
        printf("WARNING: non-standard COM%u address (%03Xh) in BIOS!\n",
            com, addr);
    if (!irq)
    {
        if (com == 1)
            irq = 4;
        else if (com == 2)
            irq = 3;
    }
    ctrlbrk(break_handler);
    return(initser(addr, baud, irq));
}

/* Set up 8250 at given address to given baud rate.
** If 'irq' is non-zero, enable receive interrupts
** Return 0 if error */
unsigned initser(unsigned addr, long baud, int irq)
{
    unsigned divisor, mask, vectnum;
    SERBUFF *sbp;
    void interrupt (*handler)(void);

    sbp = &serbuffs[serchan];
    sbp->uart = addr;                           /* Save addr & irq */
    sbp->irq = irq;
    outportb(addr+1, 0);                        /* Disable Rx ints */
    if (irq)                                    /* Use IRQ if given */
    {
        vectnum = irq>7 ? irq+0x68 : irq+8;
        handler = serchan==0?hand1:serchan==1?hand2:serchan==2?hand3:hand4;
        disable();                              /* Disable interrupts */
        mask = 0xff - (1<<(vectnum & 7));       /* Interrupt mask value */
        sbp->pic  = vectnum>15  ? PIC2  : PIC1; /* Int controller base addr */
        sbp->oldmask = inportb(sbp->pic+1);     /* Enable COM interrupt */
        if (!(sbp->oldmask & (~mask)))          /* Int already enabled? */
        {
            printf("\r\n***WARNING*** serial interrupt already in use!\n");
            printf("Other drivers may be using this port\n");
        }
        sbp->oldvector = getvect(vectnum);      /* Get current int vector */
        setvect(vectnum, handler);              /* Set to new handler */
        outportb(sbp->pic+1, sbp->oldmask & mask);
    }
    outportb(addr+3, 0x80);                     /* Set DLAB bit */
    divisor = (unsigned)(115200L / baud);       /* Write baud rate divisor */
    outportb(addr, divisor&0xff);
    outportb(addr+1, divisor>>8);
    outportb(addr+3, 3);                        /* LCR: 8 bits, 1 stop bit */
    outportb(addr+4, 0xb);                      /* MCR: set RI, RTS, DTR */
    while (inportb(addr+5) & 1)
        inportb(addr);                          /* Clear any Rx chars */
    sbp->ro = sbp->ri = 0;
    if (irq)
    {
        outportb(addr+1, 1);                    /* Enable Rx ints */
        enable();
    }
    return(addr);
}

/* Select a serial channel for initialisation or read/write  */
void selectuart(int n)
{
    serchan = n;
}

/* Set IRDA baud rate using 'LiteLink' protocol; return 0 if invalid rate */
int litelink(long baud)
{
    SERSTATUS st, stat;
    int n=0, ok=0;

    while (irbauds[n] && !(ok = baud==irbauds[n]))
        n++;                                    /* Find baud rate table index */
    if (ok)
    {
        st.rts = st.dtr = 1;                    /* Allow device to warm up */
        setserstatus(stat = st);                /* ..with dtr & rts high */
        delay(50);
        st.rts = 0;                             /* Pulse RTS low to reset */
        setserstatus(st);
        delay(2);
        setserstatus(stat);
        st.rts = 1;
        st.dtr = 0;
        while (n--)                             /* Loop using table index.. */
        {
            delay(2);
            setserstatus(st);                   /* ..pulse DTR low */
            delay(2);
            setserstatus(stat);                 /* ..then high */
        }
        delay(2);
    }
    return(ok);
}

/* Clear down UART */
void clearuart(void)
{
    SERBUFF *sbp;
    unsigned vectnum;

    sbp = &serbuffs[serchan];
    if (sbp->uart)
    {                                           /* Interrupt vector */
        vectnum = sbp->irq>7 ? sbp->irq+0x68 : sbp->irq+8;
        disable();
        outportb(sbp->uart+1, 0);               /* Disable COM interrupts */
        outportb(sbp->uart+3, 0);
        outportb(sbp->uart+4, 0);
        outportb(sbp->pic+1, sbp->oldmask);     /* Restore mask and vector */
        setvect(vectnum, sbp->oldvector);
        enable();
        sbp->uart = 0;
    }
}

/* Handler for serial interrupts */
void interrupt hand1(void)
{
    ser_handler(&serbuffs[0]);
}
void interrupt hand2(void)
{
    ser_handler(&serbuffs[1]);
}
void interrupt hand3(void)
{
    ser_handler(&serbuffs[2]);
}
void interrupt hand4(void)
{
    ser_handler(&serbuffs[3]);
}
void ser_handler(SERBUFF *sbp)
{
    int ip;
    unsigned char istat;
    unsigned uart;

    uart = sbp->uart;
    while (!((istat = inportb(uart+2) & 7) & 1))
    {
        if (istat == 2)                         /* Tx interrupt */
#if TXINTS
            if (sbp->ti == sbp->to)
                outportb(sbp->uart+1, inportb(sbp->uart+1) & ~2);
            else
            {
                outportb(sbp->uart, sbp->tbuf[sbp->to]);
                sbp->to = (sbp->to + 1) & (TBUFSIZ-1);
            }
#else
            ;
#endif
        else if (istat == 4)
        {                                       /* Rx interrupt */
            ip = sbp->ri;
            sbp->rbuf[ip] = inportb(uart);      /* Save character */
            ip = (ip + 1) & (RBUFSIZ-1);
            if (ip != sbp->ro)
                sbp->ri = ip;
        }
        else if (istat == 6)
        {
            inportb(uart+5);                    /* Line status (error) int */
            inportb(uart);
        }
        else
            inportb(uart+6);                    /* Modem status int */
    }
    outportb(sbp->pic, 0x20);                   /* Ack int controller */
    if (sbp->pic != PIC1)                       /* If slave, ack master also */
        outportb(PIC1, 0x20);
}

/* Return a character from circular buffer, NOCHAR if none */
unsigned rxchar(void)
{
    unsigned char c;
    SERBUFF *sbp;

    sbp = &serbuffs[serchan];
    if (sbp->ri == sbp->ro)                     /* Ret if I/P ptr = O/P ptr */
        return(NOCHAR);
    c = sbp->rbuf[sbp->ro];                     /* Get next char */
    sbp->ro = (sbp->ro+1) & (RBUFSIZ-1);        /* Increment & wrap pointer */
    return(c);
}

/* Clear the receive buffer */
void rxclear(void)
{
    SERBUFF *sbp;

    sbp = &serbuffs[serchan];
    disable();
    sbp->ro = sbp->ri;
    enable();
}

/* Send a string out of the serial port */
void txstr(char *s)
{
    while (*s)
        txchar(*s++);
}

/* Send a character out of the serial port */
void txchar(unsigned char c)
{
    SERBUFF *sbp;

    sbp = &serbuffs[serchan];
#if TXINTS
    while (!txfree(sbp))
        ;
    disable();
    sbp->tbuf[sbp->ti] = c;
    sbp->ti = (sbp->ti + 1) & (TBUFSIZ-1);
    outportb(sbp->uart+1, inportb(sbp->uart+1) | 2);
    enable();
#else
    while (! (inportb(sbp->uart+5) & 0x20))
        ;
    outportb(sbp->uart, c);
#endif
}
#if TXINTS
/* Return non-zero if there is space in Tx buffer */
int txfree(SERBUFF *sbp)
{
    return(((sbp->ti+1)&(RBUFSIZ-1)) != sbp->to);
}
#endif
/* Get the state of the handshake lines */
SERSTATUS getserstatus(void)
{
    unsigned char b;
    SERSTATUS hs;
    SERBUFF *sbp;

    sbp = &serbuffs[serchan];
    b = inportb(sbp->uart+6);
    hs.dcd = (b & 0x80) != 0;
    hs.dsr = (b & 0x20) != 0;
    hs.cts = (b & 0x10) != 0;
    b = inportb(sbp->uart+4);
    hs.rts = (b & 0x02) != 0;
    hs.dtr = (b & 0x01) != 0;
    return(hs);
}

/* Set the state of the handshake lines */
void setserstatus(SERSTATUS hs)
{
    unsigned char b;
    SERBUFF *sbp;

    sbp = &serbuffs[serchan];
    b = inportb(sbp->uart+4);
    b = hs.rts ? b | 0x02 : b & ~0x02;
    b = hs.dtr ? b | 0x01 : b & ~0x01;
    outportb(sbp->uart+4, b);
}

#pragma exit clearuart

/* EOF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久久久快鸭 | 日本中文在线一区| 久久99最新地址| 91丨porny丨蝌蚪视频| 精品美女在线观看| 夜夜亚洲天天久久| 成人免费av网站| 日韩欧美一区二区视频| 一区二区三区不卡视频在线观看| 国产伦精品一区二区三区免费迷| 欧美色男人天堂| 亚洲人123区| 粉嫩欧美一区二区三区高清影视| 欧美成人一区二区| 亚洲第一成年网| 日本久久电影网| 国产精品国模大尺度视频| 国产一区激情在线| 日韩视频免费观看高清完整版在线观看 | 欧美变态tickling挠脚心| 亚洲成人免费在线| 欧美主播一区二区三区美女| 日韩毛片在线免费观看| eeuss鲁片一区二区三区在线观看| 日韩精品一区二区三区视频播放| 亚洲成人在线网站| 欧美日韩在线一区二区| 亚洲精品你懂的| 91麻豆精品在线观看| 成人免费在线视频观看| 不卡av电影在线播放| 中文字幕在线不卡一区二区三区| 国产成人综合网站| 一区视频在线播放| 91玉足脚交白嫩脚丫在线播放| 中文字幕欧美激情| 成人免费毛片aaaaa**| 国产精品区一区二区三区| 国产不卡免费视频| 亚洲欧洲日韩综合一区二区| 91视频精品在这里| 午夜精品一区二区三区三上悠亚 | 国产成人一级电影| 国产日本欧美一区二区| 波多野结衣在线一区| ...中文天堂在线一区| 色先锋aa成人| 亚洲成av人片一区二区三区| 日韩一区二区三区三四区视频在线观看| 香蕉成人啪国产精品视频综合网| 欧美人妇做爰xxxⅹ性高电影 | 日韩一级视频免费观看在线| 麻豆国产精品官网| 国产网红主播福利一区二区| 成人av在线网| 亚洲午夜精品网| 精品人伦一区二区色婷婷| 国产麻豆一精品一av一免费| 1000精品久久久久久久久| 欧美午夜精品久久久久久超碰| 日韩精品91亚洲二区在线观看 | 欧美色图天堂网| 麻豆精品视频在线观看| 国产精品三级久久久久三级| 色噜噜狠狠色综合中国| 麻豆国产91在线播放| 中文字幕在线观看一区| 欧美日韩国产成人在线91| 国产综合久久久久久鬼色| 亚洲婷婷在线视频| 4438x成人网最大色成网站| 成人午夜又粗又硬又大| 亚洲线精品一区二区三区八戒| 欧美成人伊人久久综合网| 日本精品一级二级| 激情成人午夜视频| 亚洲成人综合网站| 中文字幕一区三区| 日韩精品一区在线| 在线观看视频91| 国产成人在线看| 免费av网站大全久久| 一区二区三区蜜桃| 国产午夜亚洲精品理论片色戒 | 日本不卡视频一二三区| 中文av一区二区| 欧美精品自拍偷拍动漫精品| a亚洲天堂av| 国产最新精品免费| 日本不卡的三区四区五区| 亚洲激情av在线| 国产精品三级电影| 国产色综合久久| 欧美白人最猛性xxxxx69交| 欧美日韩久久久一区| 日本高清免费不卡视频| 岛国av在线一区| 精品一区二区成人精品| 日本亚洲一区二区| 午夜不卡av免费| 亚洲一区二区三区爽爽爽爽爽 | 色一情一乱一乱一91av| 国产精一品亚洲二区在线视频| 日韩精品福利网| 图片区小说区区亚洲影院| 亚洲一二三四在线观看| 亚洲男人电影天堂| 亚洲精品一二三| 亚洲欧美国产77777| 国产精品第13页| 欧美韩日一区二区三区| 久久久一区二区| 久久免费电影网| 久久九九全国免费| 久久精品亚洲国产奇米99| 久久奇米777| 久久婷婷色综合| 国产欧美精品在线观看| 国产色婷婷亚洲99精品小说| 久久久不卡网国产精品一区| 国产三级一区二区三区| 国产精品视频免费| 日韩一区在线免费观看| 亚洲激情六月丁香| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲精品一区二区三区精华液| 日韩欧美一级片| 久久精品夜色噜噜亚洲a∨| 国产日韩欧美在线一区| 亚洲国产成人一区二区三区| 中文字幕乱码一区二区免费| 亚洲欧美日韩精品久久久久| 一区二区三区美女| 青娱乐精品视频| 国模少妇一区二区三区| 成人免费视频网站在线观看| 在线日韩国产精品| 日韩亚洲欧美高清| 久久久午夜精品| 亚洲美女一区二区三区| 日韩av电影一区| 国产成人一区在线| 91极品视觉盛宴| 日韩一区二区三区免费看| 国产精品毛片大码女人| 香蕉乱码成人久久天堂爱免费| 久久精品久久99精品久久| 懂色av一区二区夜夜嗨| 欧美色电影在线| 久久精品人人做人人爽人人| 一区二区三区四区在线免费观看| 三级在线观看一区二区| 国产激情视频一区二区在线观看 | 一区二区在线电影| 免费xxxx性欧美18vr| 99久久99久久精品国产片果冻| 欧美三级乱人伦电影| 国产欧美日韩激情| 视频在线在亚洲| 99视频一区二区| 精品国产污网站| 一区二区三区国产精品| 国产精品99久久久久久久女警| 欧美午夜在线一二页| 久久精品水蜜桃av综合天堂| 亚洲成人动漫在线免费观看| 国产成人精品免费视频网站| 欧美精品 日韩| 一区二区三区高清在线| 福利一区二区在线| 日韩精品最新网址| 亚洲高清在线视频| 不卡一卡二卡三乱码免费网站 | 欧美日韩一区 二区 三区 久久精品 | 日韩欧美国产综合| 亚洲国产精品一区二区久久| 成人免费视频一区二区| 欧美本精品男人aⅴ天堂| 午夜天堂影视香蕉久久| 91亚洲精品久久久蜜桃| 中文字幕av一区 二区| 另类中文字幕网| 欧美精品久久天天躁| 亚洲欧美一区二区三区孕妇| 成人性生交大片免费看在线播放| 精品欧美黑人一区二区三区| 婷婷久久综合九色国产成人| 欧美在线免费观看亚洲| 亚洲欧美国产77777| 97se亚洲国产综合在线| 国产精品高潮呻吟| 国产成人综合在线| 国产三区在线成人av| 国产suv一区二区三区88区| 久久免费视频一区| 国产福利一区在线观看| 久久久99免费| 成人国产亚洲欧美成人综合网| 欧美国产综合一区二区| 国产成人综合亚洲网站|