summaryrefslogtreecommitdiffstats
path: root/c/src
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1998-07-09 22:16:27 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1998-07-09 22:16:27 +0000
commit2c5ea019fa55219c924f8996cae11762d9de0321 (patch)
treedf46c012f95fbb5036aa4040e969717a54631b07 /c/src
parentCorrected definition of MC68681_RX_BUFFER. (diff)
downloadrtems-2c5ea019fa55219c924f8996cae11762d9de0321.tar.bz2
Properly handle extended baud rate set commands.
Temporarily "if 0" of code which enables interrupts. Moved setting of command registers at open but the current implementation is questionable. Added reset of RX errors while polling TX. Read polled character as unsigned. Baud rate mask must be in upper and lower nibble.
Diffstat (limited to 'c/src')
-rw-r--r--c/src/lib/libchip/serial/mc68681.c37
-rw-r--r--c/src/libchip/serial/mc68681.c37
2 files changed, 44 insertions, 30 deletions
diff --git a/c/src/lib/libchip/serial/mc68681.c b/c/src/lib/libchip/serial/mc68681.c
index 3f2c561004..818d7c137a 100644
--- a/c/src/lib/libchip/serial/mc68681.c
+++ b/c/src/lib/libchip/serial/mc68681.c
@@ -273,7 +273,10 @@ MC68681_STATIC int mc68681_set_attributes(
rtems_interrupt_disable(Irql);
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
- (*setReg)( pMC68681_port, MC68681_COMMAND, cmd );
+ if ( cmd ) {
+ (*setReg)( pMC68681_port, MC68681_COMMAND, cmd ); /* RX */
+ (*setReg)( pMC68681_port, MC68681_COMMAND, cmd | 0x20 ); /* TX */
+ }
(*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
(*setReg)( pMC68681_port, MC68681_MODE, mode1 );
(*setReg)( pMC68681_port, MC68681_MODE, mode2 );
@@ -365,7 +368,11 @@ MC68681_STATIC unsigned int mc68681_build_imr(
}
}
+#if 0
return mask | mate_mask;
+#endif
+
+ return 0;
}
/*
@@ -451,10 +458,10 @@ MC68681_STATIC int mc68681_open(
*/
rtems_interrupt_disable(Irql);
+ (*setReg)( pMC68681, MC68681_COMMAND, command );
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
(*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
- (*setReg)( pMC68681, MC68681_COMMAND, command );
(*setReg)( pMC68681_port, MC68681_MODE, 0x13 );
(*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
rtems_interrupt_enable(Irql);
@@ -523,7 +530,10 @@ MC68681_STATIC void mc68681_write_polled(
*/
iTimeout = 1000;
ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
- while ((ucLineStatus & MC68681_TX_READY) == 0) {
+ while ((ucLineStatus & (MC68681_TX_READY|MC68681_TX_EMPTY)) == 0) {
+
+ if ((ucLineStatus & 0xF0))
+ (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_ERROR );
/*
* Yield while we wait
@@ -816,7 +826,7 @@ MC68681_STATIC int mc68681_inbyte_nonblocking_polled(
{
unsigned32 pMC68681_port;
unsigned char ucLineStatus;
- char cChar;
+ unsigned char cChar;
getRegister_f getReg;
pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
@@ -842,7 +852,6 @@ MC68681_STATIC int mc68681_baud_rate(
unsigned int baud_mask;
unsigned int acr_bit;
int status;
- int is_a;
int is_extended;
int baud_requested;
mc68681_baud_table_t *baud_tbl;
@@ -851,12 +860,6 @@ MC68681_STATIC int mc68681_baud_rate(
acr_bit = 0;
status = 0;
- if (Console_Port_Tbl[minor].ulCtrlPort1 ==
- Console_Port_Tbl[minor].ulCtrlPort2)
- is_a = 1;
- else
- is_a = 0;
-
if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
acr_bit = 1;
@@ -867,17 +870,17 @@ MC68681_STATIC int mc68681_baud_rate(
*command = 0x00;
break;
case MC68681_XBRG_ENABLED:
- *command = (is_a) ? 0x08 : 0x09;
+ *command = 0x80;
is_extended = 1;
break;
case MC68681_XBRG_DISABLED:
- *command = (is_a) ? 0x0A : 0x0B;
+ *command = 0x90;
break;
}
baud_requested = baud & CBAUD;
if (!baud_requested)
- baud_requested = B9600;
+ baud_requested = B9600; /* default to 9600 baud */
baud_requested = termios_baud_to_index( baud_requested );
@@ -893,7 +896,11 @@ MC68681_STATIC int mc68681_baud_rate(
if ( baud_mask == MC68681_BAUD_NOT_VALID )
status = -1;
- *baud_mask_p = baud_mask; /* default to 9600 baud */
+ /*
+ * upper nibble is receiver and lower nibble is transmitter
+ */
+
+ *baud_mask_p = (baud_mask << 4) | baud_mask;
*acr_bit_p = acr_bit;
return status;
}
diff --git a/c/src/libchip/serial/mc68681.c b/c/src/libchip/serial/mc68681.c
index 3f2c561004..818d7c137a 100644
--- a/c/src/libchip/serial/mc68681.c
+++ b/c/src/libchip/serial/mc68681.c
@@ -273,7 +273,10 @@ MC68681_STATIC int mc68681_set_attributes(
rtems_interrupt_disable(Irql);
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
- (*setReg)( pMC68681_port, MC68681_COMMAND, cmd );
+ if ( cmd ) {
+ (*setReg)( pMC68681_port, MC68681_COMMAND, cmd ); /* RX */
+ (*setReg)( pMC68681_port, MC68681_COMMAND, cmd | 0x20 ); /* TX */
+ }
(*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
(*setReg)( pMC68681_port, MC68681_MODE, mode1 );
(*setReg)( pMC68681_port, MC68681_MODE, mode2 );
@@ -365,7 +368,11 @@ MC68681_STATIC unsigned int mc68681_build_imr(
}
}
+#if 0
return mask | mate_mask;
+#endif
+
+ return 0;
}
/*
@@ -451,10 +458,10 @@ MC68681_STATIC int mc68681_open(
*/
rtems_interrupt_disable(Irql);
+ (*setReg)( pMC68681, MC68681_COMMAND, command );
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
(*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
- (*setReg)( pMC68681, MC68681_COMMAND, command );
(*setReg)( pMC68681_port, MC68681_MODE, 0x13 );
(*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
rtems_interrupt_enable(Irql);
@@ -523,7 +530,10 @@ MC68681_STATIC void mc68681_write_polled(
*/
iTimeout = 1000;
ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
- while ((ucLineStatus & MC68681_TX_READY) == 0) {
+ while ((ucLineStatus & (MC68681_TX_READY|MC68681_TX_EMPTY)) == 0) {
+
+ if ((ucLineStatus & 0xF0))
+ (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_ERROR );
/*
* Yield while we wait
@@ -816,7 +826,7 @@ MC68681_STATIC int mc68681_inbyte_nonblocking_polled(
{
unsigned32 pMC68681_port;
unsigned char ucLineStatus;
- char cChar;
+ unsigned char cChar;
getRegister_f getReg;
pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
@@ -842,7 +852,6 @@ MC68681_STATIC int mc68681_baud_rate(
unsigned int baud_mask;
unsigned int acr_bit;
int status;
- int is_a;
int is_extended;
int baud_requested;
mc68681_baud_table_t *baud_tbl;
@@ -851,12 +860,6 @@ MC68681_STATIC int mc68681_baud_rate(
acr_bit = 0;
status = 0;
- if (Console_Port_Tbl[minor].ulCtrlPort1 ==
- Console_Port_Tbl[minor].ulCtrlPort2)
- is_a = 1;
- else
- is_a = 0;
-
if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
acr_bit = 1;
@@ -867,17 +870,17 @@ MC68681_STATIC int mc68681_baud_rate(
*command = 0x00;
break;
case MC68681_XBRG_ENABLED:
- *command = (is_a) ? 0x08 : 0x09;
+ *command = 0x80;
is_extended = 1;
break;
case MC68681_XBRG_DISABLED:
- *command = (is_a) ? 0x0A : 0x0B;
+ *command = 0x90;
break;
}
baud_requested = baud & CBAUD;
if (!baud_requested)
- baud_requested = B9600;
+ baud_requested = B9600; /* default to 9600 baud */
baud_requested = termios_baud_to_index( baud_requested );
@@ -893,7 +896,11 @@ MC68681_STATIC int mc68681_baud_rate(
if ( baud_mask == MC68681_BAUD_NOT_VALID )
status = -1;
- *baud_mask_p = baud_mask; /* default to 9600 baud */
+ /*
+ * upper nibble is receiver and lower nibble is transmitter
+ */
+
+ *baud_mask_p = (baud_mask << 4) | baud_mask;
*acr_bit_p = acr_bit;
return status;
}