aboutsummaryrefslogtreecommitdiff
path: root/protocol/ibm4704.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocol/ibm4704.c')
-rw-r--r--protocol/ibm4704.c45
1 files changed, 22 insertions, 23 deletions
diff --git a/protocol/ibm4704.c b/protocol/ibm4704.c
index a10a5e74d..6a03cd441 100644
--- a/protocol/ibm4704.c
+++ b/protocol/ibm4704.c
@@ -21,9 +21,10 @@ uint8_t ibm4704_error = 0;
21 21
22void ibm4704_init(void) 22void ibm4704_init(void)
23{ 23{
24 inhibit(); // keep keyboard from sending
24 IBM4704_INT_INIT(); 25 IBM4704_INT_INIT();
25 IBM4704_INT_ON(); 26 IBM4704_INT_ON();
26 idle(); 27 idle(); // allow keyboard sending
27} 28}
28 29
29/* 30/*
@@ -104,51 +105,44 @@ uint8_t ibm4704_recv_response(void)
104 return rbuf_dequeue(); 105 return rbuf_dequeue();
105} 106}
106 107
108uint8_t ibm4704_recv(void)
109{
110 if (rbuf_has_data()) {
111 return rbuf_dequeue();
112 } else {
113 return -1;
114 }
115}
116
107/* 117/*
108Keyboard to Host 118Keyboard to Host
109---------------- 119----------------
110Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. 120Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
111 121
112 ____ __ __ __ __ __ __ __ __ __ ________ 122 ____ __ __ __ __ __ __ __ __ __ _______
113Clock \____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ 123Clock \_____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
114 ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ 124 ____ ____ ____ ____ ____ ____ ____ ____ ____ ____
115Data ____/ X____X____X____X____X____X____X____X____X____X________ 125Data ____/ X____X____X____X____X____X____X____X____X____X________
116 Start 0 1 2 3 4 5 6 7 P Stop 126 Start 0 1 2 3 4 5 6 7 P Stop
117 127
118Start bit: can be long as 300-350us. 128Start bit: can be long as 300-350us.
119Inhibit: Pull Data line down to inhibit keyboard to send. 129Inhibit: Pull Data line down to inhibit keyboard to send.
120Timing: Host reads bit while Clock is hi. 130Timing: Host reads bit while Clock is hi.(rising edge)
121Stop bit: Keyboard pulls down Data line to lo after 9th clock. 131Stop bit: Keyboard pulls down Data line to lo after 9th clock.
122*/ 132*/
123uint8_t ibm4704_recv(void)
124{
125 if (rbuf_has_data()) {
126 return rbuf_dequeue();
127 } else {
128 return -1;
129 }
130}
131
132ISR(IBM4704_INT_VECT) 133ISR(IBM4704_INT_VECT)
133{ 134{
134 static enum { 135 static enum {
135 INIT, START, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, 136 BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP
136 } state = INIT; 137 } state = BIT0;
137 // LSB first 138 // LSB first
138 static uint8_t data = 0; 139 static uint8_t data = 0;
139 // Odd parity 140 // Odd parity
140 static uint8_t parity = false; 141 static uint8_t parity = false;
141 142
142 ibm4704_error = 0; 143 ibm4704_error = 0;
143 // return unless falling edge
144 if (clock_in()) { goto RETURN; } // why this occurs?
145 144
146 state++;
147 switch (state) { 145 switch (state) {
148 case START:
149 // Data:Low
150 WAIT(data_hi, 10, state);
151 break;
152 case BIT0: 146 case BIT0:
153 case BIT1: 147 case BIT1:
154 case BIT2: 148 case BIT2:
@@ -169,6 +163,10 @@ ISR(IBM4704_INT_VECT)
169 } 163 }
170 if (!parity) 164 if (!parity)
171 goto ERROR; 165 goto ERROR;
166 break;
167 case STOP:
168 // Data:Low
169 WAIT(data_lo, 100, state);
172 rbuf_enqueue(data); 170 rbuf_enqueue(data);
173 ibm4704_error = IBM4704_ERR_NONE; 171 ibm4704_error = IBM4704_ERR_NONE;
174 goto DONE; 172 goto DONE;
@@ -176,13 +174,14 @@ ISR(IBM4704_INT_VECT)
176 default: 174 default:
177 goto ERROR; 175 goto ERROR;
178 } 176 }
177 state++;
179 goto RETURN; 178 goto RETURN;
180ERROR: 179ERROR:
181 ibm4704_error = state; 180 ibm4704_error = state;
182 while (ibm4704_send(0xFE)) _delay_ms(1); // resend 181 while (ibm4704_send(0xFE)) _delay_ms(1); // resend
183 xprintf("R:%02X%02X\n", state, data); 182 xprintf("R:%02X%02X\n", state, data);
184DONE: 183DONE:
185 state = INIT; 184 state = BIT0;
186 data = 0; 185 data = 0;
187 parity = false; 186 parity = false;
188RETURN: 187RETURN: