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

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

?? 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 頁
字號:
  rs_tmp2 = inportb(rs_ss.ier);     /* save ier */
  outportb(rs_ss.ier,'\0');         /* disable interrupts at UART */
  inportb(rs_ss.rbr);               /* read rcv buffer register */
  inportb(rs_ss.lsr);               /* read lsr */
  inportb(rs_ss.msr);               /* read msr */
  inportb(rs_ss.iir);               /* read iir */
  if(inportb(rs_ss.iir) != '\x01')  /* read it again, should indicate... */
    return 0;                       /* ...no interrupt pending */
  outportb(rs_ss.lcr,'\0');         /* make sure out2 is 0 */
  outportb(rs_ss.ier,'\x02');       /* enable thre interrupt indication */
  outportb(rs_ss.ier,'\x02');       /* do it again for 8250 */
  goto rs_J1;                       /* give UART some time */
  rs_J1:
  rs_tmp3 = inportb(rs_ss.iir);     /* get iir */
  outportb(rs_ss.ier,rs_tmp2);      /* restore original values */
  outportb(rs_ss.mcr,rs_tmp1);
  if(rs_tmp3 != '\x02')             /* should have seen thre interrupt... */
    return 0;                       /* ...else port is unavailable */

  /* find out what kind of UART it is */
  rs_ss.xmitfifo = 1; /* initialize for no FIFO */
  outportb(rs_portbase + 7,'\x55');  /* try writing scratch register */
  if(inportb(rs_portbase + 7) != '\x55')  /* and then reading it */
    rs_ret = 1; /* if value written wasn't read it's an 8250B */
  else{
    /* check for presence of 16550, if 16550A,C,CF, enable FIFOs */
    outportb(rs_ss.fcr,'\x41'); /* enable FIFO's with 4 byte RCVR trig. level */
    rs_tmp1 = inportb(rs_ss.iir);
    rs_tmp1 &= '\xC0';
    if(rs_tmp1 == (unsigned char)'\xC0'){ /* 16550A,C,CF bits 6 & 7 are set */
      rs_ret = 4;
      rs_ss.xmitfifo = 16;   /* #of bytes to write to XMIT FIFO per interrupt */
      }
    else{                 /* otherwise, it's an 8250A, 16450 or 16550 */
      outportb(rs_ss.fcr,'\x0');
      if(rs_tmp1 == (unsigned char)'\x80') /* 16550 */
        rs_ret = 3;
      else                                 /* 8250A or 16450 */
        rs_ret = 2;
      }
    }

  /* get the baud rate divisor values */
  rs_dvsrh = 0;
  switch(rs_baud){
    case 110L:
      rs_dvsrh = '\x04';
      rs_dvsrl = '\x17';
      break;
    case 300L:
      rs_dvsrh = '\x01';
      rs_dvsrl = '\x80';
      break;
    case 600L:
      rs_dvsrl = '\xC0';
      break;
    case 1200L:
      rs_dvsrl = '\x60';
      break;
    case 2400L:
      rs_dvsrl = '\x30';
      break;
    case 4800L:
      rs_dvsrl = '\x18';
      break;
    case 9600L:
      rs_dvsrl = '\x0C';
      break;
    case 19200L:
      rs_dvsrl = '\x06';
      break;
    case 38400L:
      rs_dvsrl = '\x03';
      break;
    case 57600L:
      rs_dvsrl = '\x02';
      break;
    case 115200L:
      rs_dvsrl = '\x01';
      break;
    default:
      return -7;
    }

  rs_oldvec = getvect(rs_ss.int_no); /* get the old interrupt vector */
  setvect(rs_ss.int_no,rs_inthndlr); /* plug in the new one */

  outportb(rs_ss.ier,0);      /* disable UART interrupts */
  outportb(rs_ss.lcr,'\x80'); /* enable baud rate divisor registers */
  outportb(rs_dll,rs_dvsrl);  /* write divisor lo byte */
  outportb(rs_dlm,rs_dvsrh);  /* write divisor hi byte */
  outportb(rs_ss.lcr,(rs_parity | rs_bits | rs_stop)); /* characteristics */
  /* enable interrupts at UART, do not change modem control lines */

  outportb(rs_ss.mcr,(inportb(rs_ss.mcr) | '\x08')); /* set out2 */
  inportb(rs_ss.iir); /* clear out any data...*/
  inportb(rs_ss.lsr); /*...left in...*/
  inportb(rs_ss.rbr); /*...UART's status...*/
  inportb(rs_ss.msr); /*...registers */

  disable();
  outportb(rs_ss.ier,'\x0D'); /* enable UART interrupts */
  inportb(rs_ss.iir);
  rs_ss.oldmask = inportb(rs_ss.pic + 1); /* save old interrupt mask */
  rs_mask &= rs_ss.oldmask;

  outportb(rs_ss.pic + 1,rs_mask); /* interrupt now enabled */
  rs_ds.msr_cod = inportb(rs_ss.msr) & '\xF0'; /* initialize modem status */
  enable();

  rs_timer(0);             /* zero out tick counter */
  rs_ss.flow = 0;          /* initialize flow control */
  rs_ds.rcv_cnt = 0;       /* initialize receive count */
  rs_ds.err_cod = '\x00';  /* initialize error flags */
  rs_ds.ier_msk = '\x0F'; /* insure that xmit interrupts stay enabled */
  rs_portopen = 1;         /* set port open flag */
  rs_ss.uart = rs_ret - 1; /* set UART type */
  return rs_ret;

}

/* rs_close: Restore original 8259 interrupt controller mask value,
   disable UART interrupts and restore original interrupt vector. */
void rs_close(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;
  extern void interrupt (*rs_oldvec)(void);
  unsigned rs_time,rs_tail;

  if(! rs_portopen) /* no port to close */
    return;

  /* if buffer xmit in progress, wait til it's done */
  if(rs_ds.ier_msk == '\x0F'){
    rs_time = rs_timer(1);
    rs_tail = rs_ds.out_tail;
    while(rs_ds.out_head != rs_ds.out_tail)
      /* make sure output is moving else time out (wait one char period) */
      if(rs_timer(1) - rs_time > 4 && rs_tail == rs_ds.out_tail)
        break;
    }

  /* insure that tranmitter is empty before continuing */
  rs_time = rs_timer(1);
  while(! (inportb(rs_ss.lsr) & '\x40'))
    if(rs_timer(1) - rs_time > 4)
      break;

  if(rs_ss.oldmask){
    disable();
    outportb(0x20,'\xC7');           /* restore interrupt priorities */
    enable();
    }

  /* disable UART interrupts */
  outportb(rs_ss.ier,0);
  outportb(rs_ss.mcr,inportb(rs_ss.mcr) & '\xF7');

  /* restore old interrupt vector */
  if(rs_oldvec != NULL)
    setvect(rs_ss.int_no,rs_oldvec);
  rs_oldvec = NULL;

  rs_portopen = 0; /* signal port closed */

}

/* rs_sndbyt: Output byte via output buffer.  If no space in output buffer,
   wait til there is unless output is disabled via flow control, in which
   case return -1.  If RS_POLLED_XMIT is defined, the byte is written to
   the port when the transmit holding register becomes empy.  THRE interrupt
   and output buffer are not used.  Return -1 if output disabled via flow
   control. */

int rs_sndbyt(int rs_snd)
{

  extern int rs_portopen;
  extern volatile struct rs_dynamics rs_ds;
  extern struct rs_statics rs_ss;


  if(! rs_portopen) /* is a port open ? */
    return -1;

#ifndef RS_POLLED_XMIT /* interrupt driven output */
  while(((rs_ds.out_head + 1)  & rs_ss.obuf_siz) == rs_ds.out_tail){
    /* make sure there's room in the buffer */
    /* if xmit disabled via flow control, don't wait */
    if(rs_ds.ier_msk == '\x0D')
      return -1;
    }
  disable();
  *(rs_ss.out_buf + rs_ds.out_head++) = (unsigned char)rs_snd;
  rs_ds.out_head &= rs_ss.obuf_siz;
  enable();
  if(rs_ds.ier_msk != '\x0D'){
    outportb(rs_ss.ier,'\x0D');
    if(! rs_ss.uart)           /* if it's an 8250 or 8250B... */
      while(! (inportb(rs_ss.lsr) & '\x20')) /* ...wait for THRE */
        ;
    outportb(rs_ss.ier,'\x0F'); /* generate an interrupt if needed */
    }
#else /* polled mode output */
  if(rs_ds.ier_msk == '\x0D')
    return -1;
  while(! (inportb(rs_ss.lsr) & '\x20')) /* wait for THRE */
    ;
  outportb(rs_ss.thr,(unsigned char)rs_snd);
#endif
  return 0;

}


/* rs_sndstr: Output rs_sndcnt chars from rs_str to output buffer.  If not
   enough space in output buffer, wait til there is.  If output disabled
   via flow control, return count of characters written to output buffer
   if less than string length.  If rs_sndcnt is 0, output characters from
   rs_str until nul character is reached.  If RS_POLLED_XMIT is defined,
   string is written to port by polling the line status register for THRE
   and the buffer is not used.  If output is disabled via flow control,
   return count of characters sent */

int rs_sndstr(int rs_sndcnt, char *rs_str)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  int rs_x,rs_y;

  if(! rs_portopen) /* is a port open? */
    return -1;

  if(rs_sndcnt) /* string length specified? */
    rs_y = rs_sndcnt;
  else
    rs_y = 0x7FFF; /* max buffer length (`11/2) */

#ifndef RS_POLLED_XMIT /* interrupt driven transmit */
  for(rs_x = 0;rs_x < rs_y;rs_x++){
    /* if no string length specified, stop when nul is encountered */
    if(! rs_sndcnt){
      if(*(rs_str + rs_x) == '\0')
        break;
      }
    while(((rs_ds.out_head + 1)  & rs_ss.obuf_siz) == rs_ds.out_tail){
      /* if xmit disabled via flow control,don't wait */
      if(rs_ds.ier_msk == '\x0D')
        return rs_x;
      else{ /* otherwise, may need to get xmit interrupts going (`11/2) */
        outportb(rs_ss.ier,'\x0D');
        if(! rs_ss.uart)           /* if it's an 8250 or 8250B... */
          while(! (inportb(rs_ss.lsr) & '\x20'))  /* wait for THRE */
            ;
        outportb(rs_ss.ier,'\x0F'); /* kick transmit interrupt */
        }
      }
    disable();
    *(rs_ss.out_buf + rs_ds.out_head++) = (unsigned char)*(rs_str + rs_x);
    rs_ds.out_head &= rs_ss.obuf_siz;
    enable();
    }
  if(rs_ds.ier_msk != '\x0D'){
    outportb(rs_ss.ier,'\x0D');
    if(! rs_ss.uart)
      while(! (inportb(rs_ss.lsr) & '\x20'))
        ;
    outportb(rs_ss.ier,'\x0F'); /* generate an interrupt if needed */
    }
#else /* polled transmit */
  for(rs_x = 0;rs_x < rs_y;rs_x++){
    /* if xmit disabled via flow control,don't wait */
    if(rs_ds.ier_msk == '\x0D')
      return rs_x;
    /* if no string length specified, stop when nul is encountered */
    if(! rs_sndcnt){
      if(*(rs_str + rs_x) == '\0')
        break;
      }
    while(! (inportb(rs_ss.lsr) & '\x20'))
      ;
    outportb(rs_ss.thr,(unsigned char)*(rs_str + rs_x));
    }
#endif
  return 0;

}


/* rs_outfre: Return amount of free space available in output buffer.
   This function does not return a meaningful value if RS_POLLED_XMIT is
   defined because transmission does not use the buffer */
unsigned rs_outfre(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;

  return(rs_ss.obuf_siz + 1 - ((rs_ds.out_head - rs_ds.out_tail) &
                                                       rs_ss.obuf_siz));

}

/* rs_scanin: Scan for first occurance of string rs_scan_str in input buffer.
   Return -1 if not found, offset into buffer if found */
int rs_scanin(char *rs_scan_str)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;
  int rs_off,rs_incnt,rs_flg = 0,rs_len = 0;

  while(*(rs_scan_str + rs_len))
    rs_len++;

  if((! rs_portopen) || (! rs_ds.rcv_cnt) || (! rs_len))
    return -1;

  for(rs_off = 0;rs_off < rs_ds.rcv_cnt;rs_off++){
    if(*(rs_ss.in_buf + ((rs_ds.in_tail + rs_off) & rs_ss.ibuf_siz)) ==
         *(rs_scan_str + rs_flg)){
      rs_flg++;
      if(rs_flg == rs_len)
        return((rs_off - (rs_len - 1)) & rs_ss.ibuf_siz);
      }
    else
      rs_flg = 0;
    }

  return -1;

}

/* rs_peek: Return next available character from input buffer, leave
   character in buffer. Return -1 if none are available */
int rs_peek(void)
{

  extern struct rs_statics rs_ss;
  extern volatile struct rs_dynamics rs_ds;
  extern int rs_portopen;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩综合在线视频| 亚洲综合丝袜美腿| 欧美三级电影一区| 粉嫩嫩av羞羞动漫久久久| 蜜桃91丨九色丨蝌蚪91桃色| 天堂影院一区二区| 日日摸夜夜添夜夜添精品视频 | 日本视频一区二区三区| 国产精品美女久久久久aⅴ| 久久久久久久久久久黄色| 欧美mv和日韩mv的网站| 欧美va亚洲va香蕉在线| 精品国产麻豆免费人成网站| 欧美成人乱码一区二区三区| 欧美哺乳videos| 久久综合网色—综合色88| 久久精品日产第一区二区三区高清版 | 91久久国产综合久久| 国产精品一区二区久久精品爱涩 | 成人高清免费在线播放| 成人h精品动漫一区二区三区| 成人看片黄a免费看在线| 成人性生交大合| 99国产精品一区| 91国偷自产一区二区开放时间 | 精品久久人人做人人爱| 久久久午夜电影| 中文字幕一区二区三区av| 一区二区三区四区视频精品免费| 亚洲一二三四久久| 午夜精品久久久久久久| 久国产精品韩国三级视频| 福利电影一区二区三区| 色偷偷一区二区三区| 欧美午夜理伦三级在线观看| 精品少妇一区二区| 亚洲3atv精品一区二区三区| 久久9热精品视频| www.激情成人| 91麻豆精品国产91久久久久久久久 | 国产视频不卡一区| 亚洲色图欧美在线| 日本不卡视频在线| 99久久精品国产导航| 欧美日韩在线三级| 日本一区二区成人在线| 亚洲午夜免费福利视频| 国产一区二区三区美女| 在线观看国产一区二区| 国产欧美一区二区在线| 偷拍日韩校园综合在线| 成人黄动漫网站免费app| 6080日韩午夜伦伦午夜伦| 国产精品久久网站| 久久99国产乱子伦精品免费| 色婷婷av一区二区三区大白胸| 欧美精品一区二区三区一线天视频 | 91精品国产免费| 成人免费一区二区三区视频 | 4438x亚洲最大成人网| 国产精品水嫩水嫩| 久久精品二区亚洲w码| 日本韩国欧美一区| 国产精品女人毛片| 精品一区二区三区在线视频| 欧美日韩一区不卡| 亚洲精品va在线观看| 成人性视频网站| 精品粉嫩aⅴ一区二区三区四区| 夜夜亚洲天天久久| 99re亚洲国产精品| 中文字幕高清不卡| 国产成人夜色高潮福利影视| 日韩女优电影在线观看| 青青草原综合久久大伊人精品| 在线免费观看视频一区| 亚洲美女在线一区| av一二三不卡影片| 国产精品欧美精品| 不卡的av电影| 成人免费在线视频| 99精品国产一区二区三区不卡| 国产精品免费久久久久| 成人丝袜18视频在线观看| 欧美激情一区二区三区全黄 | 国产精品初高中害羞小美女文| 国产精品12区| 欧美国产国产综合| 91麻豆文化传媒在线观看| 国产精品国产三级国产普通话蜜臀| 成人午夜电影网站| 亚洲欧美综合在线精品| 91麻豆高清视频| 亚洲国产精品久久久久婷婷884 | 日本成人在线网站| 欧美一级xxx| 韩日精品视频一区| 亚洲国产精品精华液2区45| 成人午夜av在线| 亚洲色图第一区| 91麻豆精品久久久久蜜臀| 麻豆成人免费电影| 欧美激情在线一区二区| 色综合久久久久| 视频在线观看国产精品| 久久色中文字幕| 播五月开心婷婷综合| 亚洲一本大道在线| 久久综合狠狠综合久久激情| 成人午夜免费电影| 亚洲成人av免费| 国产亚洲综合色| 欧美三级视频在线| 国产麻豆视频一区二区| 成人欧美一区二区三区1314| 欧美日韩国产123区| 精品一区二区三区久久| 中文字幕一区二区三区四区不卡 | 天天综合色天天综合色h| 日韩欧美久久久| 成人午夜精品在线| 蜜臀av一区二区三区| 中文欧美字幕免费| 8v天堂国产在线一区二区| 国产福利91精品| 午夜影院久久久| 欧美国产精品一区| 欧美一区二区三区成人| aaa亚洲精品| 国产美女久久久久| 婷婷丁香激情综合| 亚洲精品久久嫩草网站秘色| 精品国产a毛片| 欧美高清dvd| 91在线精品一区二区三区| 麻豆成人免费电影| 亚洲大片在线观看| 亚洲丝袜精品丝袜在线| 日韩欧美色电影| 欧美日韩国产欧美日美国产精品| 成人在线综合网| 韩国女主播成人在线| 日本va欧美va欧美va精品| 一区二区三区在线视频观看| 欧美国产一区二区在线观看| 日韩免费电影网站| 欧美一区二区久久| 在线播放欧美女士性生活| 色94色欧美sute亚洲线路二 | 波多野结衣一区二区三区| 免费在线视频一区| 日韩精品五月天| 午夜伦欧美伦电影理论片| 亚洲一区二区三区影院| 亚洲免费成人av| 亚洲日本青草视频在线怡红院 | www.性欧美| 成人97人人超碰人人99| 不卡一区在线观看| 91在线看国产| 欧美无人高清视频在线观看| 在线中文字幕不卡| 欧美日韩国产三级| 欧美肥大bbwbbw高潮| 欧美一区二区视频网站| 欧美一区二区网站| www国产精品av| 国产日产欧产精品推荐色 | 成人看片黄a免费看在线| 国产精品一二三| 粉嫩av一区二区三区在线播放| 国产成人一区二区精品非洲| 高清成人免费视频| 波多野洁衣一区| 色婷婷综合视频在线观看| 欧美性做爰猛烈叫床潮| 欧美一区二区二区| 国产午夜精品久久久久久免费视 | 精品福利在线导航| 久久免费国产精品| 国产精品国产a| 亚洲一区二区三区四区五区黄 | 日韩中文字幕av电影| 久久99精品国产麻豆婷婷| 国产很黄免费观看久久| 91美女片黄在线观看91美女| 欧美视频在线观看一区| 欧美成人精精品一区二区频| 国产精品国产三级国产aⅴ中文| 亚洲午夜久久久久久久久电影院 | 欧美国产一区视频在线观看| 亚洲色欲色欲www| 日韩高清在线一区| 风间由美一区二区三区在线观看 | 日韩精品一级二级 | 国产精品久久久久永久免费观看 | 精品国产a毛片| 亚洲另类中文字| 九九精品视频在线看| 91视频国产观看|