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

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

?? serial.cpp

?? 基于AMD X86構(gòu)架的嵌入式處理器SC520的4串口驅(qū)動(dòng)程序(帶緩沖)
?? CPP
字號(hào):

#define SERIAL_GLOBALS
 
#include "includes.h"



/* Handle communications interrupts and put them in serialbuf */
void interrupt com1_int(...)
{
    
     unsigned char  temp;

    disable();
    temp =inportb(COM1BASE + IIR) ;
   //接收
    if ((temp& RX_ID)== RX_ID)
    {
       com1recvbufend->data =inportb(COM1BASE + RXR);
	com1recvbufend=com1recvbufend->next;
    }
   //發(fā)送
    else if ((temp&TX_ID)== TX_ID)
    {
       if(com1sendbufend !=com1sendbufstart)
        {
           
             outportb(COM1BASE +TXR ,com1sendbufstart->data);
	       com1sendbufstart =com1sendbufstart->next;
        }
    }
    // Signal end of hardware interrupt 
    
    outportb(ICR8259A, EOI);
    enable();
}
/* Handle communications interrupts and put them in serialbuf */
void interrupt com2_int(...)
{
      unsigned char  temp;

    disable();
    temp =inportb(COM2BASE + IIR) ;
   //接收
    if ((temp& RX_ID)== RX_ID)
    {
       com2recvbufend->data =inportb(COM2BASE + RXR);
	com2recvbufend=com2recvbufend->next;
    }
   //發(fā)送
   else if ((temp&TX_ID)== TX_ID)
    {
      if(com2sendbufend !=com2sendbufstart)
        {
              outportb(COM2BASE +TXR ,com2sendbufstart->data);
	       com2sendbufstart =com2sendbufstart->next;
	 }
     }
	 
    // Signal end of hardware interrupt 
    
    outportb(ICR8259A, EOI);
    enable();

}
//Handle communications interrupts and put them in serialbuf 
void interrupt com3_int(...)
{
      unsigned char  temp;

    disable();
    temp =inportb(COM3BASE + IIR) ;
   //接收
    if ((temp& RX_ID)== RX_ID)
    {
       com3recvbufend->data =inportb(COM3BASE + RXR);
	com3recvbufend=com3recvbufend->next;
    }
   //發(fā)送
   else if ((temp&TX_ID)== TX_ID)
    {
      if(com3sendbufend !=com3sendbufstart)
        {
              outportb(COM3BASE +TXR ,com3sendbufstart->data);
	       com3sendbufstart =com3sendbufstart->next;
	 }
     }
	 
    // Signal end of hardware interrupt 
    
    outportb(ICR8259A, EOI);
    enable();

}
// Handle communications interrupts and put them in serialbuf 
void interrupt com4_int(...)
{
      unsigned char  temp;

     disable();
    temp =inportb(COM4BASE + IIR) ;
   //接收
    if ((temp& RX_ID)== RX_ID)
    {
       com4recvbufend->data =inportb(COM4BASE + RXR);
	com4recvbufend=com4recvbufend->next;
    }
   //發(fā)送
   else if ((temp&TX_ID)== TX_ID)
    {
      if(com4sendbufend !=com4sendbufstart)
        {
              outportb(COM4BASE +TXR ,com4sendbufstart->data);
	       com4sendbufstart =com4sendbufstart->next;
	 }
     }
   
    // Signal end of hardware interrupt 
    outportb(ICR8259A, EOI);
    enable();

}
int GetBaseAddr(int Port )
{
    int  baseaddr;
    if (Port ==1)
    {
         baseaddr =COM1BASE;
	 
    }
    else  if (Port ==2)
    {
         baseaddr =COM2BASE;
    }
    else  if (Port ==3)
    {
         baseaddr =COM3BASE;
    }
    else  if (Port ==4)
    {
         baseaddr =COM4BASE;
    }
    return baseaddr;
}
/* This routine sets the speed; will accept funny baud rates. */
/* Setting the speed requires that the DLAB be set on.        */
void SetSpeed(int Port,long int Speed)
{
    char		temp;
    int		divisor;
    int baseaddr;

    baseaddr =GetBaseAddr(Port);
   
    divisor = (int) (115200/Speed);
  
    disable();
    temp= inportb(baseaddr + LCR);
    outportb(baseaddr + LCR, (temp| 0x80)); //Set DLAB 
    outportb(baseaddr + DLL, (divisor & 0x00FF));
    outportb(baseaddr + DLH, ((divisor >> 8) & 0x00FF));
    outportb(baseaddr + LCR, temp);          // Reset DLAB 
    enable();
}

/* Set other communications parameters */
void SetOthers(int Port,int Parity, int Bits, int StopBit)
{
    int                setting;

    setting  = Bits-5;
    setting |= ((StopBit == 1) ? 0x00 : 0x04);
    setting |= Parity;

    disable();
    outportb(GetBaseAddr(Port) + LCR, setting);
    enable();
}
/* Turn off communications interrupts */
void DisableI(int Port)
{
    int                temp;
    int  baseaddr;
    baseaddr =GetBaseAddr(Port);
    disable();
    temp= inportb(IMR8259A) | ~IRQ3 | ~IRQ4;
    outportb(IMR8259A, temp);
    outportb(baseaddr + IER, 0);
    temp = inportb(baseaddr + MCR) & ~MC_INT;
    outportb(baseaddr + MCR, temp);
    enable();
}
/* Turn on communications interrupts */
void EnableI(int Port)
{
    int   temp,temp1;
    int  baseaddr;
    baseaddr =GetBaseAddr(Port);
    disable();
    temp= inportb(baseaddr + MCR) | MC_INT;
    outportb(baseaddr + MCR, temp);
    outportb(baseaddr + IER, RX_INT|TX_INT);
    if(Port == COM1)
    {
         temp1 =IRQ4;
    }
    else  if(Port == COM2)
    {
         temp1 =IRQ3;
    }
    else  if(Port == COM3)
    {
         temp1 =IRQ5;
    }
    else  if(Port == COM4)
    {
         temp1 =IRQ6;
    }
     temp = inportb(IMR8259A) & temp1;
    outportb(IMR8259A, temp);
    enable();
}
/* Install our functions to handle communications */
void SetVects(int Port) //設(shè)置中斷向量
{
   switch(Port)
   {
       case COM1:
               {
			 comoldvects[0] = getvect(0x0C);
			 setvect(0x0C, com1_int);
			 break;
       	  }
       case COM2:
               {
			 comoldvects[1] = getvect(0x0B);
                       setvect(0x0B, com2_int);
			break;
		        
       	  }
	case COM3:
               {
			 comoldvects[2] = getvect(0x0D);
                       setvect(0x0D, com3_int);
			 break;
       	  }
	case COM4:
               {
			 comoldvects[3] = getvect(0x0E);
                       setvect(0x0E, com4_int);
			break;
       	  }
	default:
			break;

   }
   
}    
/* Uninstall our vectors before exiting the program */
void ResVects(int Port)//恢復(fù)原有的中斷向量
{

   switch(Port)
   {
       case COM1:
               {
			  setvect(0x0C, comoldvects[0]);
			  break;
       	  }
       case COM2:
               {
			  setvect(0x0B, comoldvects[1]);
			  break;
       	  }
	case COM3:
               {
			  setvect(0x0D, comoldvects[2]);
			  break;
       	  }
	case COM4:
               {
			  setvect(0x0E, comoldvects[3]);
			  break;
       	  }
	default:
			break;
   }
}
/* Go off-line */
void CommOff(int Port)
{
    DisableI(Port);

    outportb(GetBaseAddr(Port)+ MCR, 0);
}
/* Tell modem that we're ready to go */
void CommOn(int Port)
{
    int   temp, pnum;
   int baseaddr;
    if(Port <=4)
    {
        EnableI(Port);
    }
    baseaddr =GetBaseAddr(Port) ;
  
    temp = inportb(baseaddr+ MCR) | DTR | RTS;
    outportb(baseaddr + MCR, temp);
}
void CloseSerial(int Port)
{
    CommOff(Port);
    ResVects(Port);
}
void OpenSerial(int Port)
{
   
    SetVects(Port);
    CommOn(Port);
}
int InitSerial(int Port, long int Speed, int Parity, int Bits, int StopBit)
{
 
   
   if((Port ==0)||(Port >4))
   {
        return PORTERROR;
   }
   if ((Speed == 0)||(Speed >115200))            /* Avoid divide by zero */
    {
       return SPEEDERROR;
    }
    if (Bits < 5 || Bits > 8)
    {
       return BITSERROR;
    }
    if((StopBit != 1) && (StopBit != 2))
    {
       return STOPBITERROR;
    }
    if (Parity != NO_PARITY && Parity != ODD_PARITY && Parity != EVEN_PARITY)
    {
       return PARITYERROR;
    }
  //COM3COM4需要設(shè)置IRQ
    if((Port ==3)||(Port ==4))
    {
           outportb(COM34IRQADDR, COM34IRQ);//COM3=IRQ5,COM4=IRQ6
    }
    SetSpeed(Port,Speed);
	
    SetOthers(Port,Parity, Bits, StopBit);

    OpenSerial(Port);
    return OK;
	
}
void InitComBuf(void)
{
     int i;
//com1
    for (i=0;i<COMBUFSIZE;i++)
  {
         com1sendbuf[i].next =&com1sendbuf[i+1];
	  com1recvbuf[i].next =&com1recvbuf[i+1];
	  
  }
  com1sendbuf[COMBUFSIZE-1].next =com1sendbuf;
  com1recvbuf[COMBUFSIZE-1].next =com1recvbuf;
  com1sendbufstart =com1sendbuf;
  com1sendbufend  = com1sendbuf;
  com1recvbufstart =com1recvbuf;
  com1recvbufend   = com1recvbuf;
//com2
  for (i=0;i<COMBUFSIZE;i++)
  {
         com2sendbuf[i].next =&com2sendbuf[i+1];
	  com2recvbuf[i].next =&com2recvbuf[i+1];
  }
  com2sendbuf[COMBUFSIZE-1].next =com2sendbuf;
  com2recvbuf[COMBUFSIZE-1].next =com2recvbuf;
  com2sendbufstart =com2sendbuf;
  com2sendbufend  = com2sendbuf;
  com2recvbufstart =com2recvbuf;
  com2recvbufend   = com2recvbuf;
//com3
  for (i=0;i<COMBUFSIZE;i++)
  {
         com3sendbuf[i].next =&com3sendbuf[i+1];
	  com3recvbuf[i].next =&com3recvbuf[i+1];
  }
  com3sendbuf[COMBUFSIZE-1].next =com3sendbuf;
  com3recvbuf[COMBUFSIZE-1].next =com3recvbuf;
  com3sendbufstart =com3sendbuf;
  com3sendbufend  = com3sendbuf;
  com3recvbufstart =com3recvbuf;
  com3recvbufend   = com3recvbuf;
//com4
  for (i=0;i<COMBUFSIZE;i++)
  {
         com4sendbuf[i].next =&com4sendbuf[i+1];
	  com4recvbuf[i].next =&com4recvbuf[i+1];
  }
  com4sendbuf[COMBUFSIZE-1].next =com4sendbuf;
  com4recvbuf[COMBUFSIZE-1].next =com4recvbuf;
  com4sendbufstart =com4sendbuf;
  com4sendbufend  = com4sendbuf;
  com4recvbufstart =com4recvbuf;
  com4recvbufend   = com4recvbuf;
}

void DisableSendInt( int baseaddr)
{
   
    char temp;
    temp = inportb(baseaddr + IER);
    temp &=~TX_INT;
    outportb(baseaddr + IER, temp);
}
void EnableSendInt(int  baseaddr)
{
 
    char temp;
    temp = inportb(baseaddr + IER);
    temp |=TX_INT;
    outportb(baseaddr + IER, temp);

}


void ComSend(int Port,char *temp)
{
    unsigned char temp2=0;
    if(Port ==1)
    {
         if (com1sendbufend == com1sendbufstart) //發(fā)送緩沖為空時(shí)需要激活發(fā)送
        {
                temp2 =1;
         }
         else
        {
                temp2 =0;
        }
        DisableSendInt(COM1BASE);
        while(*temp)
        {
                  com1sendbufend->data =*temp;
	          com1sendbufend = com1sendbufend->next;
	          temp ++;
        }
        if(temp2)
        {
                   outportb(COM1BASE +TXR ,com1sendbufstart->data);
	           com1sendbufstart =com1sendbufstart->next;
     
         }
         EnableSendInt(COM1BASE);
    }
    else     if(Port ==2)
    {
         if (com2sendbufend == com2sendbufstart) //發(fā)送緩沖為空時(shí)需要激活發(fā)送
        {
                temp2 =1;
         }
         else
        {
                temp2 =0;
        }
        DisableSendInt(COM2BASE);
        while(*temp)
        {
                  com2sendbufend->data =*temp;
	          com2sendbufend = com2sendbufend->next;
	          temp ++;
        }
        if(temp2)
        {
                   outportb(COM2BASE +TXR ,com2sendbufstart->data);
	           com2sendbufstart =com2sendbufstart->next;
     
         }
         EnableSendInt(COM2BASE);
    }
    else     if(Port ==3)
    {
         if (com3sendbufend == com3sendbufstart) //發(fā)送緩沖為空時(shí)需要激活發(fā)送
        {
                temp2 =1;
         }
         else
        {
                temp2 =0;
        }
        DisableSendInt(COM3BASE);
        while(*temp)
        {
                  com3sendbufend->data =*temp;
	          com3sendbufend = com3sendbufend->next;
	          temp ++;
        }
        if(temp2)
        {
                   outportb(COM3BASE +TXR ,com3sendbufstart->data);
	           com3sendbufstart =com3sendbufstart->next;
     
         }
         EnableSendInt(COM3BASE);
    }
    else     if(Port ==4)
    {
        if (com4sendbufend == com4sendbufstart) //發(fā)送緩沖為空時(shí)需要激活發(fā)送
        {
                temp2 =1;
         }
         else
        {
                temp2 =0;
        }
        DisableSendInt(COM4BASE);
        while(*temp)
        {
                  com4sendbufend->data =*temp;
	          com4sendbufend = com4sendbufend->next;
	          temp ++;
        }
        if(temp2)
        {
                   outportb(COM4BASE +TXR ,com4sendbufstart->data);
	           com4sendbufstart =com4sendbufstart->next;
     
         }
         EnableSendInt(COM4BASE);
     }

}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图制服丝袜| 中文字幕一区三区| 欧美videofree性高清杂交| 久久你懂得1024| 一个色妞综合视频在线观看| 三级亚洲高清视频| 粉嫩av一区二区三区| 色综合久久精品| 精品久久国产老人久久综合| 国产精品视频你懂的| 三级不卡在线观看| voyeur盗摄精品| 欧美高清hd18日本| 国产精品免费av| 日韩高清在线电影| 成人av片在线观看| 51精品视频一区二区三区| 国产精品久久毛片a| 亚洲成年人网站在线观看| 国产成人免费在线| 7799精品视频| 亚洲伦理在线精品| 国产精品羞羞答答xxdd| 欧美久久一二区| 中文字幕一区二区在线播放| 免费精品视频最新在线| 一本久道久久综合中文字幕| 精品国产乱码久久久久久闺蜜| 亚洲欧美日韩国产综合在线| 国产精品911| 91精品福利在线一区二区三区 | 免费高清视频精品| 99国产精品视频免费观看| 26uuu精品一区二区| 午夜久久久久久久久| 99热99精品| 久久精品日韩一区二区三区| 日日夜夜免费精品| 色综合久久88色综合天天6| 国产性色一区二区| 日本在线不卡视频一二三区| 色乱码一区二区三区88| 欧美激情一区三区| 激情成人午夜视频| 日韩三级.com| 日韩精品电影在线观看| 欧美亚洲国产一区二区三区va| 中文字幕一区二| 国产盗摄一区二区三区| 精品久久久久久久久久久院品网 | 日韩一区二区影院| 亚洲综合图片区| 色爱区综合激月婷婷| 亚洲色图欧洲色图| 99精品国产视频| 国产精品伦理一区二区| 国产成人精品一区二区三区四区| 欧美xxxxx裸体时装秀| 日韩成人伦理电影在线观看| 欧美日韩一区二区三区免费看 | 欧美中文字幕亚洲一区二区va在线| 中文无字幕一区二区三区| 国产女同互慰高潮91漫画| 狠狠色丁香婷婷综合| 日韩精品资源二区在线| 免费成人小视频| 日韩视频在线一区二区| 蜜桃av一区二区| 欧美va天堂va视频va在线| 久久国产欧美日韩精品| 久久综合狠狠综合久久综合88| 久久爱www久久做| 精品欧美一区二区久久| 国产美女视频91| 久久网站热最新地址| 国产精品一区二区在线播放| 久久免费电影网| 国产精品99久久不卡二区| 国产免费久久精品| 99久久综合色| 亚洲黄色性网站| 欧美群妇大交群的观看方式| 麻豆精品视频在线| 欧美本精品男人aⅴ天堂| 国产精品一级片| 自拍偷拍国产亚洲| 欧美色成人综合| 麻豆成人91精品二区三区| 2022国产精品视频| 成人免费电影视频| 一区二区在线看| 欧美肥大bbwbbw高潮| 黑人巨大精品欧美一区| 日本一区二区视频在线| 99免费精品视频| 午夜a成v人精品| 久久久精品一品道一区| 色综合天天狠狠| 日本视频在线一区| 久久久不卡网国产精品二区| 97成人超碰视| 三级在线观看一区二区 | 国产91丝袜在线播放| 亚洲色图丝袜美腿| 欧美一区二区三区在线看| 国产精品伊人色| 亚洲一区二区视频| 精品久久久久久亚洲综合网| 成人动漫av在线| 午夜久久久久久电影| 久久久精品国产免大香伊| 91精彩视频在线观看| 日本成人在线视频网站| 中文字幕第一页久久| 欧美绝品在线观看成人午夜影视| 国产福利不卡视频| 亚洲成人综合网站| 国产欧美日本一区视频| 欧美精品九九99久久| 成人网在线播放| 日韩黄色免费网站| 中文字幕乱码一区二区免费| 欧美日韩成人综合| 国产成人av网站| 亚洲成人av一区| 国产精品视频你懂的| 91麻豆精品91久久久久同性| 99精品视频免费在线观看| 欧美a级一区二区| 一卡二卡欧美日韩| 欧美激情综合在线| 91精品国产欧美一区二区| 99久久免费精品| 国模娜娜一区二区三区| 亚洲成在人线免费| 亚洲天堂免费在线观看视频| 日韩欧美一二三| 亚洲综合在线电影| 国产欧美日韩精品在线| 日韩区在线观看| 欧美日韩国产天堂| 99国产精品国产精品毛片| 国产在线一区观看| 奇米在线7777在线精品| 一区二区三区自拍| 欧美国产一区二区在线观看| 日韩午夜激情av| 欧美色区777第一页| 91网址在线看| 大陆成人av片| 国产一区二区三区综合| 日韩综合在线视频| 一个色综合网站| 综合电影一区二区三区 | 91免费版在线| 国产一区二区成人久久免费影院| 日韩av在线免费观看不卡| 亚洲国产一区视频| 亚洲另类在线一区| 国产精品国产三级国产三级人妇 | 成人一二三区视频| 久久国产剧场电影| 免费在线观看视频一区| 午夜精品久久久久久久久久久| 亚洲美女在线国产| 亚洲私人影院在线观看| 一区在线中文字幕| 国产精品短视频| 中文字幕在线一区二区三区| 国产亚洲综合av| 久久久久亚洲蜜桃| 久久久青草青青国产亚洲免观| 精品国产精品一区二区夜夜嗨| 91精品视频网| 91 com成人网| 91精品在线一区二区| 欧美福利一区二区| 91精品国产入口| 日韩一卡二卡三卡| 欧美精品一区在线观看| 亚洲精品在线三区| 久久久综合精品| 亚洲国产精品t66y| 中文字幕一区二区三区蜜月| 亚洲天天做日日做天天谢日日欢| 综合电影一区二区三区 | 欧美日韩国产综合草草| 欧美日韩国产a| 日韩一级黄色大片| 精品女同一区二区| 国产欧美日产一区| 中文字幕在线观看一区二区| 亚洲激情成人在线| 天天影视色香欲综合网老头| 日韩电影在线免费观看| 国产一区欧美日韩| www.欧美精品一二区| 91国产免费看| 欧美一区二区在线看| 久久免费电影网|