mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 23:23:13 +00:00
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.
This commit is contained in:
@@ -273,7 +273,10 @@ MC68681_STATIC int mc68681_set_attributes(
|
|||||||
rtems_interrupt_disable(Irql);
|
rtems_interrupt_disable(Irql);
|
||||||
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
|
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
|
||||||
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
|
(*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_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
|
||||||
(*setReg)( pMC68681_port, MC68681_MODE, mode1 );
|
(*setReg)( pMC68681_port, MC68681_MODE, mode1 );
|
||||||
(*setReg)( pMC68681_port, MC68681_MODE, mode2 );
|
(*setReg)( pMC68681_port, MC68681_MODE, mode2 );
|
||||||
@@ -365,7 +368,11 @@ MC68681_STATIC unsigned int mc68681_build_imr(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
return mask | mate_mask;
|
return mask | mate_mask;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -451,10 +458,10 @@ MC68681_STATIC int mc68681_open(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
rtems_interrupt_disable(Irql);
|
rtems_interrupt_disable(Irql);
|
||||||
|
(*setReg)( pMC68681, MC68681_COMMAND, command );
|
||||||
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
|
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
|
||||||
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
|
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
|
||||||
(*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
|
(*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, 0x13 );
|
||||||
(*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
|
(*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
|
||||||
rtems_interrupt_enable(Irql);
|
rtems_interrupt_enable(Irql);
|
||||||
@@ -523,7 +530,10 @@ MC68681_STATIC void mc68681_write_polled(
|
|||||||
*/
|
*/
|
||||||
iTimeout = 1000;
|
iTimeout = 1000;
|
||||||
ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
|
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
|
* Yield while we wait
|
||||||
@@ -816,7 +826,7 @@ MC68681_STATIC int mc68681_inbyte_nonblocking_polled(
|
|||||||
{
|
{
|
||||||
unsigned32 pMC68681_port;
|
unsigned32 pMC68681_port;
|
||||||
unsigned char ucLineStatus;
|
unsigned char ucLineStatus;
|
||||||
char cChar;
|
unsigned char cChar;
|
||||||
getRegister_f getReg;
|
getRegister_f getReg;
|
||||||
|
|
||||||
pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
|
pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
|
||||||
@@ -842,7 +852,6 @@ MC68681_STATIC int mc68681_baud_rate(
|
|||||||
unsigned int baud_mask;
|
unsigned int baud_mask;
|
||||||
unsigned int acr_bit;
|
unsigned int acr_bit;
|
||||||
int status;
|
int status;
|
||||||
int is_a;
|
|
||||||
int is_extended;
|
int is_extended;
|
||||||
int baud_requested;
|
int baud_requested;
|
||||||
mc68681_baud_table_t *baud_tbl;
|
mc68681_baud_table_t *baud_tbl;
|
||||||
@@ -851,12 +860,6 @@ MC68681_STATIC int mc68681_baud_rate(
|
|||||||
acr_bit = 0;
|
acr_bit = 0;
|
||||||
status = 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) )
|
if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
|
||||||
acr_bit = 1;
|
acr_bit = 1;
|
||||||
|
|
||||||
@@ -867,17 +870,17 @@ MC68681_STATIC int mc68681_baud_rate(
|
|||||||
*command = 0x00;
|
*command = 0x00;
|
||||||
break;
|
break;
|
||||||
case MC68681_XBRG_ENABLED:
|
case MC68681_XBRG_ENABLED:
|
||||||
*command = (is_a) ? 0x08 : 0x09;
|
*command = 0x80;
|
||||||
is_extended = 1;
|
is_extended = 1;
|
||||||
break;
|
break;
|
||||||
case MC68681_XBRG_DISABLED:
|
case MC68681_XBRG_DISABLED:
|
||||||
*command = (is_a) ? 0x0A : 0x0B;
|
*command = 0x90;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
baud_requested = baud & CBAUD;
|
baud_requested = baud & CBAUD;
|
||||||
if (!baud_requested)
|
if (!baud_requested)
|
||||||
baud_requested = B9600;
|
baud_requested = B9600; /* default to 9600 baud */
|
||||||
|
|
||||||
baud_requested = termios_baud_to_index( baud_requested );
|
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 )
|
if ( baud_mask == MC68681_BAUD_NOT_VALID )
|
||||||
status = -1;
|
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;
|
*acr_bit_p = acr_bit;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -273,7 +273,10 @@ MC68681_STATIC int mc68681_set_attributes(
|
|||||||
rtems_interrupt_disable(Irql);
|
rtems_interrupt_disable(Irql);
|
||||||
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
|
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
|
||||||
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
|
(*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_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
|
||||||
(*setReg)( pMC68681_port, MC68681_MODE, mode1 );
|
(*setReg)( pMC68681_port, MC68681_MODE, mode1 );
|
||||||
(*setReg)( pMC68681_port, MC68681_MODE, mode2 );
|
(*setReg)( pMC68681_port, MC68681_MODE, mode2 );
|
||||||
@@ -365,7 +368,11 @@ MC68681_STATIC unsigned int mc68681_build_imr(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
return mask | mate_mask;
|
return mask | mate_mask;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -451,10 +458,10 @@ MC68681_STATIC int mc68681_open(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
rtems_interrupt_disable(Irql);
|
rtems_interrupt_disable(Irql);
|
||||||
|
(*setReg)( pMC68681, MC68681_COMMAND, command );
|
||||||
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
|
(*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
|
||||||
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
|
(*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
|
||||||
(*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
|
(*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, 0x13 );
|
||||||
(*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
|
(*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
|
||||||
rtems_interrupt_enable(Irql);
|
rtems_interrupt_enable(Irql);
|
||||||
@@ -523,7 +530,10 @@ MC68681_STATIC void mc68681_write_polled(
|
|||||||
*/
|
*/
|
||||||
iTimeout = 1000;
|
iTimeout = 1000;
|
||||||
ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
|
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
|
* Yield while we wait
|
||||||
@@ -816,7 +826,7 @@ MC68681_STATIC int mc68681_inbyte_nonblocking_polled(
|
|||||||
{
|
{
|
||||||
unsigned32 pMC68681_port;
|
unsigned32 pMC68681_port;
|
||||||
unsigned char ucLineStatus;
|
unsigned char ucLineStatus;
|
||||||
char cChar;
|
unsigned char cChar;
|
||||||
getRegister_f getReg;
|
getRegister_f getReg;
|
||||||
|
|
||||||
pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
|
pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
|
||||||
@@ -842,7 +852,6 @@ MC68681_STATIC int mc68681_baud_rate(
|
|||||||
unsigned int baud_mask;
|
unsigned int baud_mask;
|
||||||
unsigned int acr_bit;
|
unsigned int acr_bit;
|
||||||
int status;
|
int status;
|
||||||
int is_a;
|
|
||||||
int is_extended;
|
int is_extended;
|
||||||
int baud_requested;
|
int baud_requested;
|
||||||
mc68681_baud_table_t *baud_tbl;
|
mc68681_baud_table_t *baud_tbl;
|
||||||
@@ -851,12 +860,6 @@ MC68681_STATIC int mc68681_baud_rate(
|
|||||||
acr_bit = 0;
|
acr_bit = 0;
|
||||||
status = 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) )
|
if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
|
||||||
acr_bit = 1;
|
acr_bit = 1;
|
||||||
|
|
||||||
@@ -867,17 +870,17 @@ MC68681_STATIC int mc68681_baud_rate(
|
|||||||
*command = 0x00;
|
*command = 0x00;
|
||||||
break;
|
break;
|
||||||
case MC68681_XBRG_ENABLED:
|
case MC68681_XBRG_ENABLED:
|
||||||
*command = (is_a) ? 0x08 : 0x09;
|
*command = 0x80;
|
||||||
is_extended = 1;
|
is_extended = 1;
|
||||||
break;
|
break;
|
||||||
case MC68681_XBRG_DISABLED:
|
case MC68681_XBRG_DISABLED:
|
||||||
*command = (is_a) ? 0x0A : 0x0B;
|
*command = 0x90;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
baud_requested = baud & CBAUD;
|
baud_requested = baud & CBAUD;
|
||||||
if (!baud_requested)
|
if (!baud_requested)
|
||||||
baud_requested = B9600;
|
baud_requested = B9600; /* default to 9600 baud */
|
||||||
|
|
||||||
baud_requested = termios_baud_to_index( baud_requested );
|
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 )
|
if ( baud_mask == MC68681_BAUD_NOT_VALID )
|
||||||
status = -1;
|
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;
|
*acr_bit_p = acr_bit;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user