187 lines
4.6 KiB
Text
187 lines
4.6 KiB
Text
$NetBSD: patch-ae,v 1.3 2004/05/02 20:08:14 bouyer Exp $
|
|
|
|
--- src/uart.cc.orig 2004-01-31 03:58:04.000000000 +0100
|
|
+++ src/uart.cc 2004-04-30 18:56:31.000000000 +0200
|
|
@@ -139,11 +139,16 @@
|
|
cout << "TXSTA - enabling transmitter\n";
|
|
if(txreg) {
|
|
cout << " TXSTA - does have a txreg\n";
|
|
- if(txreg->is_empty())
|
|
txreg->empty();
|
|
- else
|
|
+#if 0
|
|
+ if(txreg->is_empty()) {
|
|
+ txreg->empty();
|
|
+ } else {
|
|
+ cout << "start_transmitting1" << endl;
|
|
start_transmitting();
|
|
}
|
|
+#endif
|
|
+ }
|
|
} else
|
|
stop_transmitting();
|
|
}
|
|
@@ -431,47 +436,53 @@
|
|
void _RCSTA::receive_a_bit(unsigned int bit)
|
|
{
|
|
|
|
- if(bit_count)
|
|
- {
|
|
+ // If we're waiting for the start bit and this isn't it then
|
|
+ // we don't need to look any further
|
|
+ // cout << "receive_a_bit state " << state << "bit " << bit << endl;
|
|
+ if( state == RCSTA_MAYBE_START) {
|
|
+ if (bit)
|
|
+ state = RCSTA_WAITING_FOR_START;
|
|
+ else
|
|
+ state = RCSTA_RECEIVING;
|
|
+ return;
|
|
+ }
|
|
+ if (bit_count == 0) {
|
|
+ // we should now have the stop bit
|
|
+ if (bit) {
|
|
+ // got the stop bit
|
|
+ // If the rxreg has data from a previous reception then
|
|
+ // we have a receiver overrun error.
|
|
+ // cout << "rcsta.rsr is full\n";
|
|
+
|
|
+ if((value & RX9) == 0)
|
|
+ rsr >>= 1;
|
|
+
|
|
+ // copy the rsr to the fifo
|
|
+ if(rcreg)
|
|
+ rcreg->push( rsr & 0xff);
|
|
+ //cout << "_RCSTA::receive_a_bit received 0x" << (rsr & 0xff) << endl;
|
|
+
|
|
+ } else {
|
|
+ //not stop bit; discard the data and go back receiving
|
|
+ }
|
|
+ // If we're continuously receiving, then set up for the next byte.
|
|
+ // FIXME -- may want to set a half bit delay before re-starting...
|
|
+ if(value & CREN)
|
|
+ start_receiving();
|
|
+ else
|
|
+ state = RCSTA_DISABLED;
|
|
+ return;
|
|
+ }
|
|
|
|
- // If we're waiting for the start bit and this isn't it then
|
|
- // we don't need to look any further
|
|
- if( (state == RCSTA_WAITING_FOR_START) && bit)
|
|
- return;
|
|
-
|
|
- // Copy the bit into the Receive Shift Register
|
|
- if(bit)
|
|
- rsr |= 1<<9;
|
|
-
|
|
- //cout << "Receive bit #" << bit_count << ": " << (rsr&(1<<9)) << '\n';
|
|
-
|
|
- rsr >>= 1;
|
|
-
|
|
- if(--bit_count == 0)
|
|
- {
|
|
- // rsr is full.
|
|
-
|
|
- // If the rxreg has data from a previous reception then
|
|
- // we have a receiver overrun error.
|
|
- //cout << "rcsta.rsr is full\n";
|
|
-
|
|
- if((value & RX9) == 0)
|
|
- rsr >>= 1;
|
|
-
|
|
- // copy the rsr to the fifo
|
|
- if(rcreg)
|
|
- rcreg->push( rsr & 0xff);
|
|
-
|
|
- // If we're continuously receiving, then set up for the next byte.
|
|
- // FIXME -- may want to set a half bit delay before re-starting...
|
|
- if(value & CREN)
|
|
- start_receiving();
|
|
- else
|
|
- state = RCSTA_DISABLED;
|
|
|
|
- }
|
|
+ // Copy the bit into the Receive Shift Register
|
|
+ if(bit)
|
|
+ rsr |= 1<<9;
|
|
|
|
- }
|
|
+ //cout << "Receive bit #" << bit_count << ": " << (rsr&(1<<9)) << '\n';
|
|
+
|
|
+ rsr >>= 1;
|
|
+ bit_count--;
|
|
|
|
}
|
|
|
|
@@ -494,11 +505,11 @@
|
|
// Is this a 9-bit data reception?
|
|
if(value & RX9)
|
|
{
|
|
- bit_count = 10;
|
|
+ bit_count = 9;
|
|
}
|
|
else
|
|
{
|
|
- bit_count = 9;
|
|
+ bit_count = 8;
|
|
}
|
|
|
|
state = RCSTA_WAITING_FOR_START;
|
|
@@ -526,11 +537,11 @@
|
|
if(txsta && (txsta->value & _TXSTA::BRGH))
|
|
set_callback_break(BRGH_FIRST_MID_SAMPLE);
|
|
else
|
|
- set_callback_break(BRGH_FIRST_MID_SAMPLE);
|
|
+ set_callback_break(BRGL_FIRST_MID_SAMPLE);
|
|
|
|
sample = 0;
|
|
- state = RCSTA_WAITING_MID1;
|
|
-
|
|
+ sample_state = RCSTA_WAITING_MID1;
|
|
+ state = RCSTA_MAYBE_START;
|
|
}
|
|
|
|
void _RCSTA::callback(void)
|
|
@@ -538,7 +549,7 @@
|
|
|
|
//cout << "RCSTA callback " << (cycles.value) << '\n';
|
|
|
|
- switch(state) {
|
|
+ switch(sample_state) {
|
|
case RCSTA_WAITING_MID1:
|
|
if(uart_port->get_bit(rx_bit))
|
|
sample++;
|
|
@@ -548,7 +559,7 @@
|
|
else
|
|
set_callback_break(BRGL_SECOND_MID_SAMPLE - BRGL_FIRST_MID_SAMPLE);
|
|
|
|
- state = RCSTA_WAITING_MID2;
|
|
+ sample_state = RCSTA_WAITING_MID2;
|
|
|
|
break;
|
|
|
|
@@ -561,7 +572,7 @@
|
|
else
|
|
set_callback_break(BRGL_THIRD_MID_SAMPLE - BRGL_SECOND_MID_SAMPLE);
|
|
|
|
- state = RCSTA_WAITING_MID3;
|
|
+ sample_state = RCSTA_WAITING_MID3;
|
|
|
|
break;
|
|
|
|
@@ -573,13 +584,13 @@
|
|
sample = 0;
|
|
|
|
// If this wasn't the last bit then go ahead and set a break for the next bit.
|
|
- if(state==RCSTA_WAITING_MID3) {
|
|
+ if(state==RCSTA_RECEIVING) {
|
|
if(txsta && (txsta->value & _TXSTA::BRGH))
|
|
set_callback_break(TOTAL_BRGH_STATES -(BRGH_THIRD_MID_SAMPLE - BRGH_FIRST_MID_SAMPLE));
|
|
else
|
|
set_callback_break(TOTAL_BRGL_STATES -(BRGL_THIRD_MID_SAMPLE - BRGL_FIRST_MID_SAMPLE));
|
|
|
|
- state = RCSTA_WAITING_MID1;
|
|
+ sample_state = RCSTA_WAITING_MID1;
|
|
}
|
|
|
|
break;
|