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

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

?? rs232.c

?? RS232.C was written to provide all of the basic functionality needed to employ serial I/O in any a
?? C
?? 第 1 頁 / 共 4 頁
字號:
  int thr;
  int rbr;
  int iir;
  int fcr;
  int ier;
  int mcr;
  int lsr;
  int lcr;
  int msr;
  int uart;
  int pic;
  unsigned ibuf_siz;
  unsigned obuf_siz;
  char xon;
  char xoff;
  char hdw_flw;
  unsigned char *in_buf;
  unsigned char *out_buf;
  unsigned char oldmask;
  }rs_ss;

volatile struct rs_dynamics{           /* dynamic variables */
  unsigned in_head;
  unsigned in_tail;
  unsigned out_head;
  unsigned out_tail;
  unsigned rcv_cnt;
  unsigned char ier_msk;
  unsigned char msr_cod;
  unsigned char err_cod;
  }rs_ds;

int rs_portopen = 0;
struct rs_userport rs_user = {0,'\0'};
void interrupt (*rs_oldvec)(void) = NULL;

/* Interrupt service routine - Get received character from port rs_ss.rbr,
   store in rs_ss.in_buf and increment rs_inrcv.  If flow control enabled,
   update global variable rs_ss.iermsk to enable or disable output as
   required */
void interrupt rs_inthndlr(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern void interrupt (*rs_oldvec)(void);
  int rs_xmitcnt;

#ifndef RS_POLLED_XMIT
  if(rs_ss.uart)
    outportb(rs_ss.ier,rs_ds.ier_msk);   /* nudge xmit intrpt if not 8250B */
#endif
  _AL = (inportb(rs_ss.iir) & '\x07');   /* get interrupt id */
  if(!(_AL & '\x01')){     /* interrupt pending ? */
    do{
      if(_AL == '\x06'){   /* receive error ? */
        rs_ds.err_cod = inportb(rs_ss.lsr); /* record error */
        }
      else if((_AL & '\x04')){  /* data received interrupt ? */
        do{
          _AL = inportb(rs_ss.rbr); /* get the byte */
          _CL = _AL;
          if(rs_ss.flow == 2){
            if(_CL == rs_ss.xon){
#ifndef RS_POLLED_XMIT
              outportb(rs_ss.ier,'\x0F');
#endif
              rs_ds.ier_msk = '\x0F';
              }
            else if(_CL == rs_ss.xoff){
#ifndef RS_POLLED_XMIT
              outportb(rs_ss.ier,'\x0D');
#endif
              rs_ds.ier_msk = '\x0D';
              }
            else
              goto rs_J1;
            }
          else{
            /* store incoming byte */
          rs_J1:
            *(rs_ss.in_buf + rs_ds.in_head++) = _CL;
            /* in case head ptr wrapped around */
            rs_ds.in_head &= rs_ss.ibuf_siz;
            rs_ds.rcv_cnt++; /* track rcv buffer overflow */
            }
          }while(inportb(rs_ss.lsr) & '\x01'); /* loop while data avail. */
        }
#ifndef RS_POLLED_XMIT
      else if(_AL & '\x02'){  /* transmit holding reg. empty ? */
        for(rs_xmitcnt = 0;rs_xmitcnt < rs_ss.xmitfifo;rs_xmitcnt++){
          /* send a byte if any to send */
          if(rs_ds.out_tail != rs_ds.out_head){
            outportb(rs_ss.thr,*(rs_ss.out_buf + rs_ds.out_tail++));
            /* in case tail pointer wrapped around */
            rs_ds.out_tail &= rs_ss.obuf_siz;
            }
          else
            break;
          }
        }
#endif
      else{ /* change in one of the modem control lines */
        rs_ds.msr_cod = inportb(rs_ss.msr); /* record modem status */
        if(rs_ss.flow == 1){
          if(rs_ds.msr_cod & rs_ss.hdw_flw)
            rs_ds.ier_msk = '\x0F'; /* enable xmit interrupts */
          else
            rs_ds.ier_msk = '\x0D'; /* disable xmit interrupts */
#ifndef RS_POLLED_XMIT
          outportb(rs_ss.ier,rs_ds.ier_msk);
#endif
          }
        }
      }while(!((_AL = inportb(rs_ss.iir)) & '\x01')); /* loop if int. pending */
    }
  else
    rs_oldvec(); /* no interrupt pending on entry - call old isr */


  enable();  /* enable interrupts */
  outportb(rs_ss.pic,'\x20'); /* non-specific EOI to 8259 */
  if(rs_ss.pic == 0xA0)
    outportb(0x20,'\x20');

}

/* rs_initport: Initialize port, interrupt vector and interrupt mask (see
   description with function prototype for details on arguments). */
int rs_initport(char rs_port,long rs_baud,char rs_parity,char rs_bits,
                char rs_stop,unsigned rs_userinbufsiz, char *rs_userinbuf,
                unsigned rs_useroutbufsiz,char *rs_useroutbuf)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;
  extern void interrupt (*rs_oldvec)(void);
  int rs_init[] = {0x6328,0x2029,0x2E43,0x4B20,0x7261,0x6863,0x7265,
                   0x3120,0x3939,0x2033,0x3439};
  int rs_dll,rs_dlm,rs_portbase,rs_ret;
  int far *rs_bda;
  unsigned char rs_dvsrl,rs_dvsrh,rs_mask,rs_irq,rs_tmp1,rs_tmp2,rs_tmp3;


  if(rs_portopen) /* if there's already a port open, close it */
    rs_close();
  rs_ss.oldmask = '\0';

  /* make sure buffer size is valid */
  if((rs_userinbufsiz - 1) & rs_userinbufsiz)
    return -1;
  rs_ss.ibuf_siz = rs_userinbufsiz - 1;
  if((rs_ss.in_buf = (unsigned char *)rs_userinbuf) == NULL)
    return -1;
#ifndef RS_POLLED_XMIT
  if((rs_useroutbufsiz - 1) & rs_useroutbufsiz)
    return -2;
  rs_ss.obuf_siz = rs_useroutbufsiz - 1;
  if((rs_ss.out_buf = (unsigned char *)rs_useroutbuf) == NULL)
    return -2;
#endif

  /* initialize buffer head and tail pointers */
  rs_ds.in_head = rs_ds.in_tail = rs_ds.out_head = rs_ds.out_tail = 0;

  if(rs_init[1])
    rs_bda = (int far*)MK_FP(0x40,0); /* get far pointer to BIOS data area */

  switch(rs_port){ /* find i/o port address and irq */
    case '1':
      rs_portbase = *rs_bda;
      if(rs_portbase == 0)
        rs_portbase = 0x3F8;
      rs_irq = 4;
      break;
    case '2':
      rs_portbase = *(rs_bda + 1);
      if(rs_portbase == 0)
        rs_portbase = 0x2F8;
      rs_irq = 3;
      break;
    case '3':
      rs_portbase = *(rs_bda + 2);
      if(rs_portbase == 0)
        rs_portbase = 0x3E8;
      if(rs_portbase == 0x3220) /* if it's a PS/2 */
        rs_irq = 3;
      else
        rs_irq = 4;
      break;
    case '4':
      rs_portbase = *(rs_bda + 3);
      if(rs_portbase == 0)
        rs_portbase = 0x2E8;
      if(rs_portbase == 0x3228) /* if it's a PS/2 */
        rs_irq = 4;
      else
        rs_irq = 3;
      break;
    case '0': /* user defined IRQ and base address defined by struct rs_user */
      if(! rs_user.base) /* make sure it's been init'd */
        return -3;
      rs_portbase = rs_user.base;
      rs_irq = rs_user.irq;
      break;
    default:
      return -3;
    }

  if(rs_irq <= 7){ /* find interrupt number and PIC address */
    rs_ss.int_no = rs_irq + 8;
    rs_ss.pic = 0x20;
    }
  else if(rs_irq <= 15){
    rs_irq -= 8;
    rs_ss.int_no = rs_irq + 0x70;
    rs_ss.pic = 0xA0;
    }
  else
    return -3;
  rs_mask = ('\x01' << rs_irq) ^ '\xFF';

  switch(rs_parity){
    case 'N':
      rs_parity = 0;
      break;
    case 'E':
      rs_parity = '\x18';
      break;
    case 'O':
      rs_parity = '\x08';
      break;
    case 'S':
      rs_parity = '\x38';
      break;
    case 'M':
      rs_parity = '\x28';
      break;
    default:
      return -4;
    }

  if(rs_bits == '7')
    rs_bits = 2;
  else if(rs_bits == '8')
    rs_bits = 3;
  else
    return -5;

  if(rs_stop == '1')
    rs_stop = 0;
  else if(rs_stop == '2')
    rs_stop = 4;
  else
    return -6;

  /* 8250 (or 16x50) registers: */
  /* out, bit 7 of LCR = 0, (Transmit Holding Register) */
  rs_ss.thr = rs_portbase + 0;
  /* in, bit 7 of LCR = 0, (Receive Buffer Register) */
  rs_ss.rbr = rs_portbase + 0;
  /* out, bit 7 of LCR = 1, (Divisor Latch LSB) */
  rs_dll = rs_portbase + 0;
  /* out, bit 7 of LCR = 1, (Divisor Latch MSB) */
  rs_dlm = rs_portbase + 1;
  /* out, bit 7 of LCR = 0, (Interrupt Enable Register)
                        bit 0 = 1 data rcvd
                        bit 1 = 1 transmit holding reg. empty
                        bit 2 = 1 data reception error
                        bit 3 = 1 change in modem status
                        bit 4-7 unused */
  rs_ss.ier = rs_portbase + 1;
  /* in, (Interrupt ID register)
                        bit  0  :  0 = interrupt pending
                        bits 2-1: 00 = modem status change - read status
                                  01 = transmit ready - output character or
                                       read iir to clear
                                  10 = data rcvd - read data
                                  11 = break or error
                        bits 7-6: 11 = 16550 in FIFO mode */
  rs_ss.iir = rs_portbase + 2;
  /* out, (FIFO control register - 16550)
                        bit 0: 1 = FIFO enable
                        bit 1: 1 = RCVR FIFO reset
                        bit 2: 1 = XMIT FIFO reset
                        bit 6 & 7: RCVR trigger level
                        (00 = 1, 01 = 4, 10 = 8, 11 = 14) */
  rs_ss.fcr = rs_portbase + 2;
  /* out, (Line Control Register)
                        bits 0-1: Character Length
                                     00 = 5 bits
                                     01 = 6 bits
                                     10 = 7 bits
                                     11 = 8 bits
                        bit 2: Number of stop bits
                                      0 = 1 (1.5 if character length 5)
                                      1 = 2
                        bit 3: Parity
                                      0 = no parity
                                      1 = parity generated
                        bit 4: Parity type
                                      0 = odd
                                      1 = even
                        bit 5: Stick Parity
                                      0 = disabled
                                      1 = always 1 if bit 3 = 1 & bit 4 = 0 or
                                          always 0 if bit 3 = 1 & bit 4 = 1 or
                                          no parity if bit 3 = 0
                        bit 6: Set Break
                                      0 = disabled
                                      1 = output string of 0s
                        bit 7: Enable write to baud divisor regs. if 1 */
  rs_ss.lcr = rs_portbase + 3;
  /* out, (Modem Control Register)
                        bit 0:        1 = data terminal ready
                        bit 1:        1 = request to send
                        bit 2:        1 = aux. output 1
                        bit 3:        1 = aux. output 2 - enables hdwr intrrpts.
                        bit 4:        1 = UART loopback mode
                        bit 5-7:      always 0 */
  rs_ss.mcr = rs_portbase + 4;
  /* in, (Line Status Register)
                        bit 0:        1 = character received
                        bit 1:        1 = rcvd data overrun
                        bit 2:        1 = parity error
                        bit 3:        1 = framing error
                        bit 4:        1 = break detected
                        bit 5:        1 = transmit holding reg. empty
                        bit 6:        1 = transmitter empty
                        bit 7:        1 = rcvr FIFO error (16550) */
  rs_ss.lsr = rs_portbase + 5;
  /* in, (Modem Status Register)
                        bit 0:        1 = delta clear to send
                        bit 1:        1 = delta data set ready
                        bit 2:        1 = delta ring indicator
                        bit 3:        1 = delta data carrier detect
                        bit 4:        1 = clear to send
                        bit 5:        1 = data set ready
                        bit 6:        1 = ring indicator
                        bit 7:        1 = data carrier detect */
  rs_ss.msr = rs_portbase + 6;

  /* check for existence of UART */
  outportb(rs_ss.fcr,'\0');         /* if 16550, make it a 16450 */
  rs_tmp1 = inportb(rs_ss.mcr);     /* save mcr */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜视频网站| 天天综合天天做天天综合| 国产伦精一区二区三区| 久久综合九色综合97婷婷女人| 午夜精品123| 欧美日韩日日夜夜| 日韩中文字幕区一区有砖一区 | 久久国内精品自在自线400部| 日韩欧美激情四射| 国产精品99久| 亚洲欧美视频在线观看| 在线观看91精品国产入口| 亚洲一区二区三区自拍| 欧美一区二区三区色| 国产麻豆视频一区| 成人免费一区二区三区视频 | 欧美三级三级三级爽爽爽| 日日夜夜精品视频天天综合网| 精品少妇一区二区三区视频免付费| 久久成人麻豆午夜电影| 中文字幕的久久| 在线观看91精品国产入口| 美女一区二区三区在线观看| 国产精品婷婷午夜在线观看| 欧美中文字幕一区二区三区| 九一九一国产精品| 日韩毛片在线免费观看| 日韩欧美国产一区二区在线播放| 成人性生交大片免费看中文 | 日韩欧美一区二区三区在线| 国产高清不卡二三区| 亚洲欧美另类小说| 日韩欧美一区在线观看| 91免费看`日韩一区二区| 青青草成人在线观看| 国产精品三级久久久久三级| 911精品国产一区二区在线| 国产不卡视频在线观看| 日韩国产欧美一区二区三区| 欧美肥胖老妇做爰| 欧美又粗又大又爽| 国产一区二区视频在线播放| 亚洲综合在线电影| 色8久久精品久久久久久蜜 | 激情成人综合网| 欧洲激情一区二区| 秋霞av亚洲一区二区三| 制服丝袜成人动漫| 盗摄精品av一区二区三区| 亚洲精品成人精品456| 亚洲精品一区二区三区影院 | 国产成人av一区二区三区在线 | 亚洲国产精品久久人人爱| 久久久精品免费网站| 在线播放中文字幕一区| 91成人免费在线| www.亚洲人| 国产盗摄精品一区二区三区在线 | 久久精品一区八戒影视| 这里只有精品免费| 91精品福利视频| 99精品视频在线播放观看| 国产又黄又大久久| 久久精品国产精品亚洲精品| 婷婷开心久久网| 亚洲国产一区在线观看| 亚洲乱码国产乱码精品精的特点 | 亚洲欧洲日韩综合一区二区| 久久久久久麻豆| 久久综合久色欧美综合狠狠| 日韩欧美一级片| 日韩一级大片在线| 日韩三级电影网址| 欧美成人精品二区三区99精品| 欧美电影在线免费观看| 欧美色视频在线| 欧美亚洲愉拍一区二区| 欧美在线播放高清精品| 欧美在线观看18| 欧美视频一区二区三区| 欧美亚洲国产怡红院影院| 在线亚洲免费视频| 一本久道久久综合中文字幕| 91丝袜高跟美女视频| 色88888久久久久久影院野外| av亚洲产国偷v产偷v自拍| av在线综合网| 色婷婷亚洲综合| 欧美日韩亚洲综合一区二区三区| 欧美日韩一区二区欧美激情| 欧美色大人视频| 538prom精品视频线放| 日韩欧美在线不卡| 久久精品网站免费观看| 欧美激情综合五月色丁香| 国产精品福利一区二区三区| 亚洲精品福利视频网站| 亚洲国产另类av| 免费在线观看日韩欧美| 国产一区二三区| 成人动漫av在线| 欧美日韩综合一区| 欧美va在线播放| 亚洲国产精品激情在线观看| 亚洲品质自拍视频| 首页欧美精品中文字幕| 国产一区二区剧情av在线| av电影在线观看一区| 欧美日韩三级在线| 久久久久久一级片| 一区二区三区电影在线播| 免费人成网站在线观看欧美高清| 国产尤物一区二区| 久久久午夜精品| 亚洲视频综合在线| 日韩中文字幕不卡| 国产成人超碰人人澡人人澡| 欧美图区在线视频| 久久九九久精品国产免费直播| 成人欧美一区二区三区黑人麻豆| 亚洲成人精品影院| 国产a视频精品免费观看| 在线观看中文字幕不卡| 精品国产99国产精品| 亚洲精品国产a久久久久久| 另类欧美日韩国产在线| 日本道色综合久久| 久久九九久久九九| 日韩精品一区第一页| av不卡一区二区三区| 日韩美女主播在线视频一区二区三区 | 香蕉乱码成人久久天堂爱免费| 久久精品二区亚洲w码| 99久久精品国产导航| 欧美成人精品福利| 亚洲国产一区在线观看| av电影一区二区| 亚洲精品在线观看视频| 午夜视频在线观看一区| a亚洲天堂av| 久久品道一品道久久精品| 丝瓜av网站精品一区二区| 91丨porny丨户外露出| 久久久久国产精品麻豆| 免费在线观看一区二区三区| 欧美亚洲高清一区| ...av二区三区久久精品| 国产一区二区导航在线播放| 在线成人小视频| 亚洲一级二级三级在线免费观看| 福利一区二区在线观看| 精品裸体舞一区二区三区| 午夜精品久久久久久久99水蜜桃 | 美女视频黄久久| 欧美羞羞免费网站| 中文字幕中文字幕一区二区| 国产美女主播视频一区| 精品日韩欧美一区二区| 日韩和欧美的一区| 欧美日韩精品久久久| 丁香另类激情小说| 国产目拍亚洲精品99久久精品| 久88久久88久久久| 欧美成人r级一区二区三区| 日韩激情视频网站| 在线成人免费观看| 天堂av在线一区| 欧美一区午夜视频在线观看| 亚洲bt欧美bt精品| 91精品国产aⅴ一区二区| 日欧美一区二区| 欧美一区二区播放| 捆绑紧缚一区二区三区视频 | 91免费版在线看| 亚洲啪啪综合av一区二区三区| 不卡的av在线| 亚洲免费观看在线视频| 色偷偷久久人人79超碰人人澡| 亚洲欧美一区二区三区久本道91| 一本到不卡精品视频在线观看| 亚洲精选在线视频| 欧美色精品天天在线观看视频| 偷拍日韩校园综合在线| 日韩精品一区二区三区三区免费| 激情五月激情综合网| 国产欧美精品国产国产专区 | 欧美成人精精品一区二区频| 麻豆精品久久久| 久久久久99精品国产片| 懂色av中文一区二区三区 | 日韩一级二级三级| 九色|91porny| 中文成人av在线| 91精品福利视频| 美女脱光内衣内裤视频久久网站| 欧美大尺度电影在线| 粉嫩久久99精品久久久久久夜 | 国产欧美日韩精品在线| 99久久精品国产毛片| 亚洲高清免费观看|