aboutsummaryrefslogtreecommitdiff
path: root/protocol/ibm4704.c
diff options
context:
space:
mode:
authorJun Wako <wakojun@gmail.com>2015-09-24 12:29:11 +0900
committerJun Wako <wakojun@gmail.com>2015-09-24 12:29:11 +0900
commitfdc38ef3f92af7adeeb4de49550d8838c8a39b5c (patch)
treea20c7a06111e5f674d94e8ba48a82d16b2e3e07f /protocol/ibm4704.c
parentf6d56675f9f981c5464f0ca7a1fbb0162154e8c5 (diff)
downloadqmk_firmware-fdc38ef3f92af7adeeb4de49550d8838c8a39b5c.tar.gz
qmk_firmware-fdc38ef3f92af7adeeb4de49550d8838c8a39b5c.zip
Squashed 'tmk_core/' changes from dc0e46e..57d27a8
57d27a8 Merge branch 'core_update_150924' into core 024abe3 core: Fix NKRO ifdef 7aa2d30 core: Fix for disabling NKRO in Boot protocol 95651fd core: Fix message print of debug command c20cd29 lufa: Fix endpoint bank mode for ATMega32u2 82ac21f next_usb: Fix next_kbd_set_leds() 537d9c7 Change to KC_BOOTLOADER(KC_BTLD) f2b3772 Add an assignable RESET key fc99257 Fix parenthesis e852582 Fix weak modifier clear in action macro c2a6c5c core: Fix lufa suspend callback(#234) fa548c5 usb_usb: Ignore error usage(0x01-03) report 513d95c usb_usb: Support locking key indicator LED cd78802 core: Add keymap section ldscript for ATMega32U2 70c9abd Add description for non-US keys on keycode.h 538c192 lufa: Fix console flush #223 87628c9 Revert "Make action_for_key a weak symbol" 3c0a1ba Make action_for_key a weak symbol 6bb0d7d ibm4704_usb: Fix protocol handling b6ef5cf Add keyboard_setup() and matrix_setup() f4bb8b2 ibm4704_usb: Fix interrupt of clock(rising edge) 0c1fcc1 usb_usb: Change debug LED pin config 595710d Reduce code size of magic commands 6bed174 Add description of AVR bootloader and boot section 54c6a01 Merge commit 'f6d56675f9f981c5464f0ca7a1fbb0162154e8c5' d18d42e Merge branch 'core-update2' into core febec88 Add compile options '-fdata-sections' git-subtree-dir: tmk_core git-subtree-split: 57d27a8e39173a589b4abae74851f95c39940174
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: