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 /converter | |
| parent | 6b588eb7f7893500e18686e673dbf12b511dc975 (diff) | |
| download | qmk_firmware-80fd3b0b240a8840fbca1cc3cc70e76f5b52b888.tar.gz qmk_firmware-80fd3b0b240a8840fbca1cc3cc70e76f5b52b888.zip | |
ibm4704_usb: Fix protocol handling
Diffstat (limited to 'converter')
| -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 |
4 files changed, 18 insertions, 20 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 | } |
