📄 mc68681.c
字号:
/*
* File: mc68681.c
* Purpose: Polled-mode driver for the MC68681 DUART.
*
* Notes:
*
* Author: Eric DeVolder
* Date:
*
* Modifications:
*
*/
#include "mc68681p.h"
/***********************************************************/
void
mc68681_init (MC68681 *mc68681, int baud)
{
/*
* This routine initializes the MC68681 using the given
* baud rate and 8N1 settings with no IRQs.
*/
#if 0
/* On the IDP, the IRQ of the MC68681 is routed through the PIT */
/* Initialte the PIT */
*(BYTE *)(0x00C00003) = 0x00;
*(BYTE *)(0x00C00007) = 0x18;
*(BYTE *)(0x00C0000F) = 0x00;
*(BYTE *)(0x00C0001F) = 0x82;
*(BYTE *)(0x00C00017) = 0xF8;
*(BYTE *)(0x00C00003) = 0x20;
#endif
/* Turn off all interrupts */
MC68681_WR_IMR(mc68681,MC68681_IR_NO_INTERRUPTS);
/* mc68681->IR = IR_NO_INTERRUPTS; */
/* Configure Channel A for `baud', 8N1, null-modem */
MC68681_WR_CH1_CR(mc68681, MC68681_CR_TX_DISABLED);
MC68681_WR_CH1_CR(mc68681, MC68681_CR_RX_DISABLED);
MC68681_WR_CH1_CR(mc68681, MC68681_CR_RESET_TX);
MC68681_WR_CH1_CR(mc68681, MC68681_CR_RESET_RX);
MC68681_WR_CH1_CR(mc68681, MC68681_CR_RESET_MR);
/* mc68681->CH1.COMMAND = CMD_TX_DISABLED; */
/* mc68681->CH1.COMMAND = CMD_RX_DISABLED; */
/* mc68681->CH1.COMMAND = CMD_RESET_TX; */
/* mc68681->CH1.COMMAND = CMD_RESET_RX; */
/* mc68681->CH1.COMMAND = CMD_RESET_MR; */
MC68681_WR_CH1_MR(mc68681, 0
/* mc68681->CH1.MODE = ( 0 */ /* mode register 1 */
| MC68681_MR1_PARITY_NONE
| MC68681_MR1_BITS_8
) ;
MC68681_WR_CH1_MR(mc68681, 0
/* mc68681->CH1.MODE = ( 0 */ /* mode register 2 */
| MC68681_MR2_STOP_BITS_1
) ;
switch (baud)
{
case 19200:
MC68681_WR_CH1_CSR(mc68681, MC68681_CSR_19200_BPS);
/*mc68681->CH1.STATUS = CSR_19200_BPS;*/ /* write is CSR */
break;
case 9600:
default:
MC68681_WR_CH1_CSR(mc68681, MC68681_CSR_9600_BPS);
/*mc68681->CH1.STATUS = CSR_9600_BPS;*/ /* write is CSR */
break;
}
MC68681_WR_ACR(mc68681, MC68681_ACR_BRG_SET_2);
/* mc68681->ACR = ACR_BRG_SET_2; */
MC68681_WR_OPCR(mc68681, 0);
/* mc68681->OPCR = 0x00; */
/* Configure Channel B for 9600 baud, 8N1, null-modem */
MC68681_WR_CH2_CR(mc68681, MC68681_CR_TX_DISABLED);
MC68681_WR_CH2_CR(mc68681, MC68681_CR_RX_DISABLED);
MC68681_WR_CH2_CR(mc68681, MC68681_CR_RESET_TX);
MC68681_WR_CH2_CR(mc68681, MC68681_CR_RESET_RX);
MC68681_WR_CH2_CR(mc68681, MC68681_CR_RESET_MR);
/* mc68681->CH2.COMMAND = CMD_TX_DISABLED; */
/* mc68681->CH2.COMMAND = CMD_RX_DISABLED; */
/* mc68681->CH2.COMMAND = CMD_RESET_TX; */
/* mc68681->CH2.COMMAND = CMD_RESET_RX; */
/* mc68681->CH2.COMMAND = CMD_RESET_MR; */
MC68681_WR_CH2_MR(mc68681, 0
/* mc68681->CH2.MODE = ( 0 */ /* mode register 1 */
| MC68681_MR1_PARITY_NONE
| MC68681_MR1_BITS_8
) ;
MC68681_WR_CH2_MR(mc68681, 0
/* mc68681->CH2.MODE = ( 0 */ /* mode register 2 */
| MC68681_MR2_STOP_BITS_1
) ;
MC68681_WR_CH2_CSR(mc68681, MC68681_CSR_9600_BPS);
/* mc68681->CH2.STATUS = CSR_9600_BPS; */ /* write is CSR */
/* Enable the transmitters and receivers */
MC68681_WR_CH1_CR(mc68681, MC68681_CR_RX_ENABLED);
/* mc68681->CH1.COMMAND = CMD_RX_ENABLED; */
MC68681_WR_CH1_CR(mc68681, MC68681_CR_TX_ENABLED);
/* mc68681->CH1.COMMAND = CMD_TX_ENABLED; */
}
/***********************************************************/
int
mc68681_in_char (MC68681 *mc68681)
{
/* wait for receiver ready */
while (!(MC68681_RD_CH1_SR(mc68681) & MC68681_SR_RXRDY))
;
return /* mc68681->CH1.BUFFER; */ MC68681_RD_CH1_BR(mc68681);
}
/***********************************************************/
void
mc68681_out_char (MC68681 *mc68681, int c)
{
/* wait for transmitter ready */
while (!(MC68681_RD_CH1_SR(mc68681) & MC68681_SR_TXRDY))
;
MC68681_WR_CH1_BR(mc68681,c);
}
/***********************************************************/
int
mc68681_char_present (MC68681 *mc68681)
{
return (MC68681_RD_CH1_SR(mc68681) & MC68681_SR_RXRDY);
}
/***********************************************************/
int
mc68681_in_char2 (MC68681 *mc68681)
{
/* wait for receiver ready */
while (!(MC68681_RD_CH2_SR(mc68681) & MC68681_SR_RXRDY))
;
return /* mc68681->CH2.BUFFER; */ MC68681_RD_CH2_BR(mc68681);
}
/***********************************************************/
void
mc68681_out_char2 (MC68681 *mc68681, int c)
{
/* wait for transmitter ready */
while (!(MC68681_RD_CH2_SR(mc68681) & MC68681_SR_TXRDY))
;
MC68681_WR_CH2_BR(mc68681,c);
}
/***********************************************************/
int
mc68681_char_present2 (MC68681 *mc68681)
{
return (MC68681_RD_CH2_SR(mc68681) & MC68681_SR_RXRDY);
/* return (mc68681->CH2.STATUS & STAT_RXRDY); */
}
/***********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -