diff options
| author | Jun Wako <wakojun@gmail.com> | 2015-09-24 12:29:11 +0900 |
|---|---|---|
| committer | Jun Wako <wakojun@gmail.com> | 2015-09-24 12:29:11 +0900 |
| commit | fdc38ef3f92af7adeeb4de49550d8838c8a39b5c (patch) | |
| tree | a20c7a06111e5f674d94e8ba48a82d16b2e3e07f /protocol/ibm4704.c | |
| parent | f6d56675f9f981c5464f0ca7a1fbb0162154e8c5 (diff) | |
| download | qmk_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.c | 45 |
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 | ||
| 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 | /* |
| @@ -104,51 +105,44 @@ uint8_t ibm4704_recv_response(void) | |||
| 104 | return rbuf_dequeue(); | 105 | return rbuf_dequeue(); |
| 105 | } | 106 | } |
| 106 | 107 | ||
| 108 | uint8_t ibm4704_recv(void) | ||
| 109 | { | ||
| 110 | if (rbuf_has_data()) { | ||
| 111 | return rbuf_dequeue(); | ||
| 112 | } else { | ||
| 113 | return -1; | ||
| 114 | } | ||
| 115 | } | ||
| 116 | |||
| 107 | /* | 117 | /* |
| 108 | Keyboard to Host | 118 | Keyboard to Host |
| 109 | ---------------- | 119 | ---------------- |
| 110 | Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. | 120 | Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. |
| 111 | 121 | ||
| 112 | ____ __ __ __ __ __ __ __ __ __ ________ | 122 | ____ __ __ __ __ __ __ __ __ __ _______ |
| 113 | Clock \____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ | 123 | Clock \_____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ |
| 114 | ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ | 124 | ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ |
| 115 | Data ____/ X____X____X____X____X____X____X____X____X____X________ | 125 | Data ____/ 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 | ||
| 118 | Start bit: can be long as 300-350us. | 128 | Start bit: can be long as 300-350us. |
| 119 | Inhibit: Pull Data line down to inhibit keyboard to send. | 129 | Inhibit: Pull Data line down to inhibit keyboard to send. |
| 120 | Timing: Host reads bit while Clock is hi. | 130 | Timing: Host reads bit while Clock is hi.(rising edge) |
| 121 | Stop bit: Keyboard pulls down Data line to lo after 9th clock. | 131 | Stop bit: Keyboard pulls down Data line to lo after 9th clock. |
| 122 | */ | 132 | */ |
| 123 | uint8_t ibm4704_recv(void) | ||
| 124 | { | ||
| 125 | if (rbuf_has_data()) { | ||
| 126 | return rbuf_dequeue(); | ||
| 127 | } else { | ||
| 128 | return -1; | ||
| 129 | } | ||
| 130 | } | ||
| 131 | |||
| 132 | ISR(IBM4704_INT_VECT) | 133 | ISR(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; |
| 180 | ERROR: | 179 | ERROR: |
| 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); |
| 184 | DONE: | 183 | DONE: |
| 185 | state = INIT; | 184 | state = BIT0; |
| 186 | data = 0; | 185 | data = 0; |
| 187 | parity = false; | 186 | parity = false; |
| 188 | RETURN: | 187 | RETURN: |
