aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmk <hasu@tmk-kbd.com>2015-05-19 00:32:58 +0900
committertmk <hasu@tmk-kbd.com>2015-05-19 00:39:44 +0900
commit80fd3b0b240a8840fbca1cc3cc70e76f5b52b888 (patch)
tree92cbbfe97ca83ab5646c8cd48758207cdeceb615
parent6b588eb7f7893500e18686e673dbf12b511dc975 (diff)
downloadqmk_firmware-80fd3b0b240a8840fbca1cc3cc70e76f5b52b888.tar.gz
qmk_firmware-80fd3b0b240a8840fbca1cc3cc70e76f5b52b888.zip
ibm4704_usb: Fix protocol handling
-rw-r--r--converter/ibm4704_usb/README.md1
-rw-r--r--converter/ibm4704_usb/config.h2
-rw-r--r--converter/ibm4704_usb/ibm4704.txt5
-rw-r--r--converter/ibm4704_usb/matrix.c30
-rw-r--r--tmk_core/protocol/ibm4704.c20
5 files changed, 29 insertions, 29 deletions
diff --git a/converter/ibm4704_usb/README.md b/converter/ibm4704_usb/README.md
index 25b72ba67..15c826ab8 100644
--- a/converter/ibm4704_usb/README.md
+++ b/converter/ibm4704_usb/README.md
@@ -8,6 +8,7 @@ Keyboard initialization process takes a few seconds at start up. During that you
8Update 8Update
9------ 9------
102015/05/05 Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack! 102015/05/05 Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack!
112015/05/19 Fixed a protocol handling bug.
11 12
12 13
13 14
diff --git a/converter/ibm4704_usb/config.h b/converter/ibm4704_usb/config.h
index d9d8d39bc..2fee10fd6 100644
--- a/converter/ibm4704_usb/config.h
+++ b/converter/ibm4704_usb/config.h
@@ -53,7 +53,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
53 53
54/* Pin interrupt on rising edge of clock */ 54/* Pin interrupt on rising edge of clock */
55#define IBM4704_INT_INIT() do { EICRA |= ((1<<ISC11)|(1<<ISC10)); } while (0) 55#define IBM4704_INT_INIT() do { EICRA |= ((1<<ISC11)|(1<<ISC10)); } while (0)
56#define IBM4704_INT_ON() do { EIMSK |= (1<<INT1); } while (0) 56#define IBM4704_INT_ON() do { EIFR |= (1<<INTF1); EIMSK |= (1<<INT1); } while (0)
57#define IBM4704_INT_OFF() do { EIMSK &= ~(1<<INT1); } while (0) 57#define IBM4704_INT_OFF() do { EIMSK &= ~(1<<INT1); } while (0)
58#define IBM4704_INT_VECT INT1_vect 58#define IBM4704_INT_VECT INT1_vect
59 59
diff --git a/converter/ibm4704_usb/ibm4704.txt b/converter/ibm4704_usb/ibm4704.txt
index 50d8c98b0..e2d42f08f 100644
--- a/converter/ibm4704_usb/ibm4704.txt
+++ b/converter/ibm4704_usb/ibm4704.txt
@@ -166,13 +166,14 @@ Data sent from host:
166 | `-----`--- scan code 166 | `-----`--- scan code
167 `------------- enable bit(0: enable repeat, 1: enable break) 167 `------------- enable bit(0: enable repeat, 1: enable break)
168 168
169 00-77 Enable repeat(78-7F: invalid scancode) 169 00-79 Enable repeat
170 80-F7 Enable break(F8-FF: invalid scancode) 170 80-F9 Enable break(FA-FF are used as other commands, see above.)
171 FE Resend(011ah) no need to use 171 FE Resend(011ah) no need to use
172 FF End(0114h) exits FC command mode. 172 FF End(0114h) exits FC command mode.
173 173
174Response from keyboard: 174Response from keyboard:
175 FD Out of bound - Invalid scancode 175 FD Out of bound - Invalid scancode
176 -- OK - No response means that command is accepted.
176 177
177Examples: 178Examples:
178 To enable break code of all keys. 179 To enable break code of all keys.
diff --git a/converter/ibm4704_usb/matrix.c b/converter/ibm4704_usb/matrix.c
index 5f928d716..155df9c38 100644
--- a/converter/ibm4704_usb/matrix.c
+++ b/converter/ibm4704_usb/matrix.c
@@ -67,35 +67,31 @@ uint8_t matrix_cols(void)
67 67
68static void enable_break(void) 68static void enable_break(void)
69{ 69{
70 uint8_t ret;
71 print("Enable break: "); 70 print("Enable break: ");
72 // valid scancode: 00-79h 71 // valid scancode: 00-79h
73 for (uint8_t code = 0; code < 0x7A; code++) { 72 for (uint8_t code = 0; code < 0x7A; code++) {
74 while (ibm4704_send(0x80|code)) _delay_ms(1); 73 while (ibm4704_send(0x80|code)) _delay_ms(10);
75 // get none when ok, get FD when out of bound 74 _delay_ms(5); // wait for response
76 _delay_ms(5); 75 // No response(FF) when ok, FD when out of bound
77 if ((ret = ibm4704_recv()) != 0xff) { 76 xprintf("s%02X:r%02X ", code, ibm4704_recv());
78 xprintf("c%02X:r%02X ", code, ret);
79 }
80 _delay_ms(1);
81 } 77 }
82 _delay_us(1000); 78 while (ibm4704_send(0xFF)) { _delay_ms(10); } // End
83 while (ibm4704_send(0xFF)) { _delay_ms(1); } // End
84 print("End\n"); 79 print("End\n");
85} 80}
86 81
87void matrix_init(void)
88{
89 debug_enable = true;
90 82
83void matrix_setup(void)
84{
91 ibm4704_init(); 85 ibm4704_init();
92 matrix_clear(); 86}
93 87
94 _delay_ms(2000); // wait for starting up debug console 88void matrix_init(void)
89{
90 debug_enable = true;
95 91
96 print("IBM 4704 converter\n"); 92 print("IBM 4704 converter\n");
97 while (ibm4704_send(0xFE)) _delay_ms(1); // resend 93 matrix_clear();
98 _delay_ms(5); 94 _delay_ms(2000); // wait for keyboard starting up
99 xprintf("Keyboard ID: %02X\n", ibm4704_recv()); 95 xprintf("Keyboard ID: %02X\n", ibm4704_recv());
100 enable_break(); 96 enable_break();
101} 97}
diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c
index a2c670047..6a03cd441 100644
--- a/tmk_core/protocol/ibm4704.c
+++ b/tmk_core/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/*
@@ -132,8 +133,8 @@ Stop bit: Keyboard pulls down Data line to lo after 9th clock.
132ISR(IBM4704_INT_VECT) 133ISR(IBM4704_INT_VECT)
133{ 134{
134 static enum { 135 static enum {
135 STOP, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY 136 BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP
136 } state = STOP; 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
@@ -141,11 +142,7 @@ ISR(IBM4704_INT_VECT)
141 142
142 ibm4704_error = 0; 143 ibm4704_error = 0;
143 144
144 switch (state++) { 145 switch (state) {
145 case STOP:
146 // Data:Low
147 WAIT(data_lo, 10, state);
148 break;
149 case BIT0: 146 case BIT0:
150 case BIT1: 147 case BIT1:
151 case BIT2: 148 case BIT2:
@@ -166,6 +163,10 @@ ISR(IBM4704_INT_VECT)
166 } 163 }
167 if (!parity) 164 if (!parity)
168 goto ERROR; 165 goto ERROR;
166 break;
167 case STOP:
168 // Data:Low
169 WAIT(data_lo, 100, state);
169 rbuf_enqueue(data); 170 rbuf_enqueue(data);
170 ibm4704_error = IBM4704_ERR_NONE; 171 ibm4704_error = IBM4704_ERR_NONE;
171 goto DONE; 172 goto DONE;
@@ -173,13 +174,14 @@ ISR(IBM4704_INT_VECT)
173 default: 174 default:
174 goto ERROR; 175 goto ERROR;
175 } 176 }
177 state++;
176 goto RETURN; 178 goto RETURN;
177ERROR: 179ERROR:
178 ibm4704_error = state; 180 ibm4704_error = state;
179 while (ibm4704_send(0xFE)) _delay_ms(1); // resend 181 while (ibm4704_send(0xFE)) _delay_ms(1); // resend
180 xprintf("R:%02X%02X\n", state, data); 182 xprintf("R:%02X%02X\n", state, data);
181DONE: 183DONE:
182 state = STOP; 184 state = BIT0;
183 data = 0; 185 data = 0;
184 parity = false; 186 parity = false;
185RETURN: 187RETURN: