📄 comm_pc.c
字号:
* COMM1
* COMM2
* Note(s) : This function assumes that the 80x86 is running in REAL mode.
*********************************************************************************************************
*/
void CommRclIntVect (INT8U ch)
{
CommRxIntDis(ch);
CommRxFlush(ch);
CommTxIntDis(ch);
switch (ch) {
case COMM1:
PC_VectSet(0x0C, Comm1ISROld);
break;
case COMM2:
PC_VectSet(0x0B, Comm1ISROld);
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* FLUSH RX PORT
*
* Description : This function is called to flush any input characters still in the receiver. This
* function is useful when you replace the NS16450 with the more powerful NS16550.
* Arguments : 'ch' is the COMM port channel number and can either be:
* COMM1
* COMM2
*********************************************************************************************************
*/
void CommRxFlush (INT8U ch)
{
INT8U ctr;
INT16U base;
switch (ch) {
case COMM1:
base = COMM1_BASE;
break;
case COMM2:
base = COMM2_BASE;
break;
}
ctr = COMM_MAX_RX; /* Flush Rx input */
OS_ENTER_CRITICAL();
while (ctr-- > 0) {
inp(base + COMM_UART_RBR);
}
OS_EXIT_CRITICAL();
}
/*$PAGE*/
/*
*********************************************************************************************************
* DISABLE RX INTERRUPTS
*
* Description : This function disables the Rx interrupt.
* Arguments : 'ch' is the COMM port channel number and can either be:
* COMM1
* COMM2
*********************************************************************************************************
*/
void CommRxIntDis (INT8U ch)
{
INT8U stat;
switch (ch) {
case COMM1:
OS_ENTER_CRITICAL();
/* Disable Rx interrupts */
stat = (INT8U)inp(COMM1_BASE + COMM_UART_IER) & ~BIT0;
outp(COMM1_BASE + COMM_UART_IER, stat);
if (stat == 0x00) { /* Both Tx & Rx interrupts are disabled ? */
/* Yes, disable IRQ4 on the PC */
outp(PIC_MSK_REG_PORT, (INT8U)inp(PIC_MSK_REG_PORT) | BIT4);
}
OS_EXIT_CRITICAL();
break;
case COMM2:
OS_ENTER_CRITICAL();
/* Disable Rx interrupts */
stat = (INT8U)inp(COMM2_BASE + COMM_UART_IIR) & ~BIT0;
outp(COMM2_BASE + COMM_UART_IER, stat);
if (stat == 0x00) { /* Both Tx & Rx interrupts are disabled ? */
/* Yes, disable IRQ3 on the PC */
outp(PIC_MSK_REG_PORT, (INT8U)inp(PIC_MSK_REG_PORT) | BIT3);
}
OS_EXIT_CRITICAL();
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* ENABLE RX INTERRUPTS
*
* Description : This function enables the Rx interrupt.
* Arguments : 'ch' is the COMM port channel number and can either be:
* COMM1
* COMM2
*********************************************************************************************************
*/
void CommRxIntEn (INT8U ch)
{
INT8U stat;
switch (ch) {
case COMM1:
OS_ENTER_CRITICAL();
/* Enable Rx interrupts */
stat = (INT8U)inp(COMM1_BASE + COMM_UART_IER) | BIT0;
outp(COMM1_BASE + COMM_UART_IER, stat);
/* Enable IRQ4 on the PC */
outp(PIC_MSK_REG_PORT, (INT8U)inp(PIC_MSK_REG_PORT) & ~BIT4);
OS_EXIT_CRITICAL();
break;
case COMM2:
OS_ENTER_CRITICAL();
/* Enable Rx interrupts */
stat = (INT8U)inp(COMM2_BASE + COMM_UART_IER) | BIT0;
outp(COMM2_BASE + COMM_UART_IER, stat);
/* Enable IRQ3 on the PC */
outp(PIC_MSK_REG_PORT, (INT8U)inp(PIC_MSK_REG_PORT) & ~BIT3);
OS_EXIT_CRITICAL();
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* SET INTERRUPT VECTOR
*
* Description : This function installs the interrupt vector for the desired communications channel.
* Arguments : 'ch' is the COMM port channel number and can either be:
* COMM1
* COMM2
* Note(s) : This function assumes that the 80x86 is running in REAL mode.
*********************************************************************************************************
*/
void CommSetIntVect (INT8U ch)
{
switch (ch) {
case COMM1:
Comm1ISROld = PC_VectGet(0x0C);
PC_VectSet(0x0C, Comm1ISR);
break;
case COMM2:
Comm2ISROld = PC_VectGet(0x0B);
PC_VectSet(0x0B, Comm2ISR);
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* DISABLE TX INTERRUPTS
*
* Description : This function disables the character transmission.
* Arguments : 'ch' is the COMM port channel number and can either be:
* COMM1
* COMM2
*********************************************************************************************************
*/
void CommTxIntDis (INT8U ch)
{
INT8U stat;
INT8U cmd;
switch (ch) {
case COMM1:
OS_ENTER_CRITICAL();
/* Disable Tx interrupts */
stat = (INT8U)inp(COMM1_BASE + COMM_UART_IER) & ~BIT1;
outp(COMM1_BASE + COMM_UART_IER, stat);
if (stat == 0x00) { /* Both Tx & Rx interrupts are disabled ? */
cmd = (INT8U)inp(PIC_MSK_REG_PORT) | BIT4;
outp(PIC_MSK_REG_PORT, cmd); /* Yes, disable IRQ4 on the PC */
}
OS_EXIT_CRITICAL();
break;
case COMM2:
OS_ENTER_CRITICAL();
/* Disable Tx interrupts */
stat = (INT8U)inp(COMM2_BASE + COMM_UART_IER) & ~BIT1;
outp(COMM2_BASE + COMM_UART_IER, stat);
if (stat == 0x00) { /* Both Tx & Rx interrupts are disabled ? */
cmd = (INT8U)inp(PIC_MSK_REG_PORT) | BIT3;
outp(PIC_MSK_REG_PORT, cmd); /* Yes, disable IRQ3 on the PC */
}
OS_EXIT_CRITICAL();
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* ENABLE TX INTERRUPTS
*
* Description : This function enables transmission of characters. Transmission of characters is
* interrupt driven. If you are using a multi-drop driver, the code must enable the driver
* for transmission.
* Arguments : 'ch' is the COMM port channel number and can either be:
* COMM1
* COMM2
*********************************************************************************************************
*/
void CommTxIntEn (INT8U ch)
{
INT8U stat;
INT8U cmd;
switch (ch) {
case COMM1:
OS_ENTER_CRITICAL();
stat = (INT8U)inp(COMM1_BASE + COMM_UART_IER) | BIT1; /* Enable Tx interrupts */
outp(COMM1_BASE + COMM_UART_IER, stat);
cmd = (INT8U)inp(PIC_MSK_REG_PORT) & ~BIT4;
outp(PIC_MSK_REG_PORT, cmd); /* Enable IRQ4 on the PC */
OS_EXIT_CRITICAL();
break;
case COMM2:
OS_ENTER_CRITICAL();
stat = (INT8U)inp(COMM2_BASE + COMM_UART_IER) | BIT1; /* Enable Tx interrupts */
outp(COMM2_BASE + COMM_UART_IER, stat);
cmd = (INT8U)inp(PIC_MSK_REG_PORT) & ~BIT3;
outp(PIC_MSK_REG_PORT, cmd); /* Enable IRQ3 on the PC */
OS_EXIT_CRITICAL();
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -