⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.c

📁 ucos porting source for Am188
💻 C
字号:
/************************************************************************/
/* PROGRAMER: CHAE BYOUNG CHEOL										    */
/* PROGRAM 	: COMM.C                                                    */
/* COMPILER : BORLAND C/C++ 3.1 FOR DOS                                 */
/************************************************************************/

#include    ".\header\main.h"

byte    TxBuffer1[COM1BUF_TXSIZE], RxBuffer1[COM1BUF_RXSIZE];
int     TxIn1, TxOut1, RxIn1, RxOut1;         

byte    TxBuffer2[COM2BUF_TXSIZE], RxBuffer2[COM2BUF_RXSIZE];      
int     TxIn2, TxOut2, RxIn2, RxOut2;   	

byte    TxBuffer3[COM3BUF_TXSIZE], RxBuffer3[COM3BUF_RXSIZE];    
int     TxIn3, TxOut3, RxIn3, RxOut3;   

byte    TxBuffer4[COM4BUF_TXSIZE], RxBuffer4[COM4BUF_RXSIZE];
int     TxIn4, TxOut4, RxIn4, RxOut4; 

word    TxTimer, TxTimeOutFlag;
word    RxTimer, RxTimeOutFlag;

word    DelayCounter;                           /* TIMER 瘤楷 函荐 */
word    CommCounter;

extern word	_int11flag;

void __interrupt INT_Comm0(void);
void __interrupt INT_Comm1(void);

void COM_Initialize(int port, long baud, int databit, char parity, int stopbit);
void COM_Close(int port);

int  COM_Putchar(int port,  unsigned char tc);
int  COM_Getchar(int port, byte *);
int  COM_Getch(int port, byte *);
void COM_TxEnable(int port);
int  COM_Printf(int port, char *format, ...);
int  COM_String(int port, const char *format);
int  COM_Memory(int, const char *, int);
void COM_DtrContorl(int port, int ctrl);
void COM_ClearBuffer(int port);
int  COM_TxBuffer(int port, const char *buffer, int number_of_buffer);

int CheckPrinterBusy(void);

/***********************************************************************/
/* NAME     : COM_init                                                 */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURNS  :                                                          */
/***********************************************************************/
void COM_Initialize(int port, long baud, int databit, char parity, int stopbit)
{
	word mode;
    unsigned divisor;
	word COMBASE;
	word BAUD;
	
	if (port == COM1 || port == COM2)
	{	
		mode = SPRT_CTL_RSIE_ES | SPRT_CTL_RXIE_ES | 
			   SPRT_CTL_RMODE_ES | SPRT_CTL_TMODE_ES;
		switch (databit)
		{
			case 7: 
				mode = mode | SPRT_CTL_MODE1_ES | SPRT_CTL_PE_ES;
				break;
			case 8:
				mode = mode | SPRT_CTL_MODE1_ES;
				break;
			case 9:
				mode = mode | SPRT_CTL_MODE3_ES;  
				break;
		}

		switch (parity)
		{
			case 'E':
			case 'e':
				mode = mode | SPRT_CTL_EVN_ES | SPRT_CTL_PE_ES;
				break;
			case 'O':
			case 'o':
				mode = mode | SPRT_CTL_PE_ES;
				break;
			case 'N':
			case 'n':
				break;
		}
	
		stopbit = stopbit;
			
		switch (baud/10)
		{
			case 120: BAUD = B1200;
				break;
			case 240: BAUD = B2400;
				break;
			case 480: BAUD = B4800;
				break;
			case 960: BAUD = B9600;
				break;
			case 1920: BAUD = B19200;
				break;
			case 2880: BAUD = B28800;
				break;
			case 3840: BAUD = B38400;
				break;
			case 5760: BAUD = B57600;
				break;
			case 7680: BAUD = B76800;
				break;
			case 11520: BAUD = B115200;
				break;
		}

		switch (port)
    	{
        	case COM1:
            	outpw(SPRT0_CTL, mode);
				outpw(SPRT0_BDV, BAUD);
            	outpw(INT_SPRT0, INT_ENABLE|INT_PRI0);
            
				poke(0x0000, ITYPE_SPRT0*4,  FP_OFF(INT_Comm0));
    			poke(0x0000, ITYPE_SPRT0*4+2,FP_SEG(INT_Comm0));
				break;
        	case COM2:
            	outpw(SPRT1_CTL, mode);
            	outpw(SPRT1_BDV, BAUD);
            	outpw(INT_SPRT1, INT_ENABLE|INT_PRI1);
			
				poke(0x0000, ITYPE_SPRT1*4,  FP_OFF(INT_Comm1));
            	poke(0x0000, ITYPE_SPRT1*4+2,FP_SEG(INT_Comm1));
				break;
    	}
	}
}

/***********************************************************************/
/* NAME     : Close_Close                                              */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
void COM_Close(int port)
{
    switch (port)
    {
        case COM1: break;
        case COM2: break;
        case COM3: break;
        case COM4: break;
    }
}

/***********************************************************************/
/* NAME     : NewComm1Int                                              */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
void static __interrupt INT_Comm0(void)
{
	OSIntEnter();
    if ((inpw(SPRT0_STAT) & 0x0080))
	{
        RxBuffer1[RxIn1++] = inpw(SPRT0_RX);
		if (RxIn1 >= COM1BUF_RXSIZE) RxIn1 = 0;
	}
    outpw(SPRT0_STAT, 0x00);
    outpw(INT_EOI, EOITYPE_SPRT0);
	OSIntExit();
}

/***********************************************************************/
/* NAME     : NewComm2Int                                              */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
void static __interrupt INT_Comm1(void)
{
	OSIntEnter();
	if ((inpw(SPRT1_STAT) & 0x0080))
	{
        RxBuffer2[RxIn2++] = inpw(SPRT1_RX);
		if (RxIn2 >= COM2BUF_RXSIZE) RxIn2 = 0;
	}
    outpw(SPRT1_STAT, 0x00);
    outpw(INT_EOI, EOITYPE_SPRT1);
	OSIntExit();
}

/***********************************************************************/
/* NAME     : COM_putchar                                              */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int COM_Putchar(int port,  unsigned char tc)
{
	word COMBASE;

	switch (port)
	{
        case COM1:
            while ((inpw(SPRT0_STAT) & SPRT_STAT_TEMT_ES) == 0);
            outpw(SPRT0_TX, tc);
            while ((inpw(SPRT0_STAT) & SPRT_STAT_TEMT_ES) == 0);
            break;
        case COM2:
            while ((inpw(SPRT1_STAT) & SPRT_STAT_THRE_ES) == 0);
            outpw(SPRT1_TX, tc);
            break;
        case COM3:
			SCC_Putchar(0, tc);		
			break;
		case COM4:	
			SCC_Putchar(1, tc);		
			break;
	}
    return 0;
}

/***********************************************************************/
/* NAME     : Getchar                                                  */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int COM_Getchar(int port, byte *rc)
{
	byte bTemp;
	
    switch (port)
    {
        case COM1 :
            if(RxOut1 == RxIn1)
                return 0;
            else
                *rc=RxBuffer1[RxOut1++];
            if (RxOut1 >= COM1BUF_RXSIZE) RxOut1 = 0;
			break;
        case COM2 :
            if(RxOut2 == RxIn2)
                return 0;
            else
                *rc=RxBuffer2[RxOut2++];
            if (RxOut2 >= COM2BUF_RXSIZE) RxOut2 = 0;
			break;
        case COM3 :
            /*
			if(RxOut3 == RxIn3)
                return 0;
            else
                *rc=RxBuffer3[RxOut3++];
            if (RxOut3 >= COM3BUF_RXSIZE) RxOut3 = 0;
			*/
			if (SCC_Getchar(0, &bTemp))
				*rc = bTemp;
			else
				return 0;
			break;
        case COM4 :
            /*
			if(RxOut4 == RxIn4)
                return 0;
            else
                *rc=RxBuffer4[RxOut4++];
            if (RxOut4 >= COM4BUF_RXSIZE) RxOut4 = 0;
			*/
			if (SCC_Getchar(1, &bTemp))
				*rc = bTemp;
			else
				return 0;
			break;
    }
    return 1;
}

/***********************************************************************/
/* NAME     : Getch                                                    */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int COM_Getch(int port, byte *rc)
{
	byte bTemp;
	
	TIMER_Control2(TIMER1, 1);
	RxTimer = 10;

    switch (port)
    {
        case COM1 :
            while (RxOut1 == RxIn1)
            {
                if (!RxTimer) 
				{
					TIMER_Control2(TIMER1, 0);
					return FALSE;
				}
            }
            *rc=RxBuffer1[RxOut1++];
            if (RxOut1 >= COM1BUF_RXSIZE) RxOut1 = 0;
        	break;
        case COM2 :
            while (RxOut2 == RxIn2)
            {
                if (RxTimer)
       			{
					TIMER_Control2(TIMER1, 0);
					return FALSE;
				}
            }
            *rc=RxBuffer2[RxOut2++];
           	if (RxOut2 >= COM2BUF_RXSIZE) RxOut2 = 0;
            break;
        case COM3 :
			while (1)
            {
                if (RxTimer) 
       			{
					TIMER_Control2(TIMER1, 0);
					return FALSE;
				}

				if (SCC_Getchar(0, &bTemp)) break;
            }
            *rc=bTemp;
            break;
        case COM4 :
            while (1)
            {
                if (RxTimer)
       			{
					TIMER_Control2(TIMER1, 0);
					return FALSE;
				}
           		if (SCC_Getchar(1, &bTemp)) break;
			}
            *rc = bTemp;
			break;
    }
	TIMER_Control2(TIMER1, 0);
    return 1;
}

/***********************************************************************/
/* NAME     : COM_TxEnable                                             */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
void COM_TxEnable(int port)
{
    word COMBASE;

    switch (port)
    {
        case COM3: COMBASE = COM3BASE; break;
        case COM4: COMBASE = COM4BASE; break;
    }

    outpw(COMBASE+4, 0x0b);
    outpw(COMBASE+1, 0x07);
}

/***********************************************************************/
/* NAME     : COM_Printf                                               */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int COM_Printf(int port, char *format, ...)
{
	char str[256];
	int cnt=0;
	va_list arglist;

	va_start(arglist, format);
	cnt=vsprintf(str,format,arglist);
    COM_String(port, str);
	va_end(arglist);

	return (cnt);
}

/***********************************************************************/
/* NAME     : COM_String                                               */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int COM_String(int port, const char *format)
{
	int nr_of_chars=0;

	while(*format)
	{
        COM_Putchar(port, *format++); /* Out Terminal */
		nr_of_chars++;
	}

	return (nr_of_chars);
}

/***********************************************************************/
/* NAME     : COM_Memory                                               */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int COM_Memory(int port, const char *format, int iTxCount)
{
	int nr_of_chars=0;

	while (iTxCount--)
	{
        COM_Printf(port, "[%02x]", (byte)*format++);
		nr_of_chars++;
	}

	return (nr_of_chars);
}

/***********************************************************************/
/* NAME     : TxBuffer                                                 */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int COM_TxBuffer(int port, const char *buffer, int number_of_buffer)
{
    int i = 0;

    for (; i < number_of_buffer; i++)
    {
        COM_Putchar(port, *buffer++); /* Out Terminal */
    }
    return (i);
}


/***********************************************************************/
/* NAME     : COM_DtrControl                                           */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
void COM_DtrControl(int port, int ctrl)
{
    word COMBASE;

    switch (port)
    {
        case COM3: COMBASE = COM3BASE; break;
        case COM4: COMBASE = COM4BASE; break;
    }

	if (ctrl == 1)
        outp(COMBASE+MCR, 0x09|RTS);   	/* Set DTR ON */
	else if (ctrl == 0)
		outp(COMBASE+MCR, 0x08);   		/* Set DTR OFF */

}

/***********************************************************************/
/* NAME     : COM_ClearBuffer                                          */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
void COM_ClearBuffer(int port)
{
    switch (port)
    {
        case COM1: RxIn1 = RxOut1 = 0x00; break;
        case COM2: RxIn2 = RxOut2 = 0x00; break;
        case COM3: SCC_ClearBuffer(0); break;
        case COM4: SCC_ClearBuffer(1); break;
    }
}

/***********************************************************************/
/* NAME     : CheckPrinterBusy                                         */
/* FUNCTION :														   */
/* ARGUMENT :                                                          */
/* RETURN VALUE :                                                      */
/***********************************************************************/
int CheckPrinterBusy(void)
{
	byte status;

 	WR[15] |= DCD_IE;
    SCC_write_command(0, WR15, WR[15]);

	status = SCC_read_status(0, RR0);
	COM_Printf(COM2, "S=[%02x]\r\n", status);
	if (status & SCC_DCD)
		return 1;
	else 
		return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -