diff options
author | tmk <hasu@tmk-kbd.com> | 2015-05-19 00:32:58 +0900 |
---|---|---|
committer | tmk <hasu@tmk-kbd.com> | 2015-05-19 00:39:44 +0900 |
commit | 80fd3b0b240a8840fbca1cc3cc70e76f5b52b888 (patch) | |
tree | 92cbbfe97ca83ab5646c8cd48758207cdeceb615 | |
parent | 6b588eb7f7893500e18686e673dbf12b511dc975 (diff) | |
download | qmk_firmware-80fd3b0b240a8840fbca1cc3cc70e76f5b52b888.tar.gz qmk_firmware-80fd3b0b240a8840fbca1cc3cc70e76f5b52b888.zip |
ibm4704_usb: Fix protocol handling
-rw-r--r-- | converter/ibm4704_usb/README.md | 1 | ||||
-rw-r--r-- | converter/ibm4704_usb/config.h | 2 | ||||
-rw-r--r-- | converter/ibm4704_usb/ibm4704.txt | 5 | ||||
-rw-r--r-- | converter/ibm4704_usb/matrix.c | 30 | ||||
-rw-r--r-- | tmk_core/protocol/ibm4704.c | 20 |
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 | |||
8 | Update | 8 | Update |
9 | ------ | 9 | ------ |
10 | 2015/05/05 Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack! | 10 | 2015/05/05 Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack! |
11 | 2015/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 | ||
174 | Response from keyboard: | 174 | Response 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 | ||
177 | Examples: | 178 | Examples: |
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 | ||
68 | static void enable_break(void) | 68 | static 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 | ||
87 | void matrix_init(void) | ||
88 | { | ||
89 | debug_enable = true; | ||
90 | 82 | ||
83 | void 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 | 88 | void 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 | ||
22 | void ibm4704_init(void) | 22 | void 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. | |||
132 | ISR(IBM4704_INT_VECT) | 133 | ISR(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; |
177 | ERROR: | 179 | ERROR: |
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); |
181 | DONE: | 183 | DONE: |
182 | state = STOP; | 184 | state = BIT0; |
183 | data = 0; | 185 | data = 0; |
184 | parity = false; | 186 | parity = false; |
185 | RETURN: | 187 | RETURN: |