summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 25b72ba671..15c826ab8b 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
Update
------
2015/05/05 Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack!
+2015/05/19 Fixed a protocol handling bug.
diff --git a/converter/ibm4704_usb/config.h b/converter/ibm4704_usb/config.h
index d9d8d39bc0..2fee10fd61 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/>.
/* Pin interrupt on rising edge of clock */
#define IBM4704_INT_INIT() do { EICRA |= ((1<<ISC11)|(1<<ISC10)); } while (0)
-#define IBM4704_INT_ON() do { EIMSK |= (1<<INT1); } while (0)
+#define IBM4704_INT_ON() do { EIFR |= (1<<INTF1); EIMSK |= (1<<INT1); } while (0)
#define IBM4704_INT_OFF() do { EIMSK &= ~(1<<INT1); } while (0)
#define IBM4704_INT_VECT INT1_vect
diff --git a/converter/ibm4704_usb/ibm4704.txt b/converter/ibm4704_usb/ibm4704.txt
index 50d8c98b08..e2d42f08fd 100644
--- a/converter/ibm4704_usb/ibm4704.txt
+++ b/converter/ibm4704_usb/ibm4704.txt
@@ -166,13 +166,14 @@ Data sent from host:
| `-----`--- scan code
`------------- enable bit(0: enable repeat, 1: enable break)
- 00-77 Enable repeat(78-7F: invalid scancode)
- 80-F7 Enable break(F8-FF: invalid scancode)
+ 00-79 Enable repeat
+ 80-F9 Enable break(FA-FF are used as other commands, see above.)
FE Resend(011ah) no need to use
FF End(0114h) exits FC command mode.
Response from keyboard:
FD Out of bound - Invalid scancode
+ -- OK - No response means that command is accepted.
Examples:
To enable break code of all keys.
diff --git a/converter/ibm4704_usb/matrix.c b/converter/ibm4704_usb/matrix.c
index 5f928d716f..155df9c38f 100644
--- a/converter/ibm4704_usb/matrix.c
+++ b/converter/ibm4704_usb/matrix.c
@@ -67,35 +67,31 @@ uint8_t matrix_cols(void)
static void enable_break(void)
{
- uint8_t ret;
print("Enable break: ");
// valid scancode: 00-79h
for (uint8_t code = 0; code < 0x7A; code++) {
- while (ibm4704_send(0x80|code)) _delay_ms(1);
- // get none when ok, get FD when out of bound
- _delay_ms(5);
- if ((ret = ibm4704_recv()) != 0xff) {
- xprintf("c%02X:r%02X ", code, ret);
- }
- _delay_ms(1);
+ while (ibm4704_send(0x80|code)) _delay_ms(10);
+ _delay_ms(5); // wait for response
+ // No response(FF) when ok, FD when out of bound
+ xprintf("s%02X:r%02X ", code, ibm4704_recv());
}
- _delay_us(1000);
- while (ibm4704_send(0xFF)) { _delay_ms(1); } // End
+ while (ibm4704_send(0xFF)) { _delay_ms(10); } // End
print("End\n");
}
-void matrix_init(void)
-{
- debug_enable = true;
+void matrix_setup(void)
+{
ibm4704_init();
- matrix_clear();
+}
- _delay_ms(2000); // wait for starting up debug console
+void matrix_init(void)
+{
+ debug_enable = true;
print("IBM 4704 converter\n");
- while (ibm4704_send(0xFE)) _delay_ms(1); // resend
- _delay_ms(5);
+ matrix_clear();
+ _delay_ms(2000); // wait for keyboard starting up
xprintf("Keyboard ID: %02X\n", ibm4704_recv());
enable_break();
}
diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c
index a2c6700477..6a03cd4419 100644
--- a/tmk_core/protocol/ibm4704.c
+++ b/tmk_core/protocol/ibm4704.c
@@ -21,9 +21,10 @@ uint8_t ibm4704_error = 0;
void ibm4704_init(void)
{
+ inhibit(); // keep keyboard from sending
IBM4704_INT_INIT();
IBM4704_INT_ON();
- idle();
+ idle(); // allow keyboard sending
}
/*
@@ -132,8 +133,8 @@ Stop bit: Keyboard pulls down Data line to lo after 9th clock.
ISR(IBM4704_INT_VECT)
{
static enum {
- STOP, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY
- } state = STOP;
+ BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP
+ } state = BIT0;
// LSB first
static uint8_t data = 0;
// Odd parity
@@ -141,11 +142,7 @@ ISR(IBM4704_INT_VECT)
ibm4704_error = 0;
- switch (state++) {
- case STOP:
- // Data:Low
- WAIT(data_lo, 10, state);
- break;
+ switch (state) {
case BIT0:
case BIT1:
case BIT2:
@@ -166,6 +163,10 @@ ISR(IBM4704_INT_VECT)
}
if (!parity)
goto ERROR;
+ break;
+ case STOP:
+ // Data:Low
+ WAIT(data_lo, 100, state);
rbuf_enqueue(data);
ibm4704_error = IBM4704_ERR_NONE;
goto DONE;
@@ -173,13 +174,14 @@ ISR(IBM4704_INT_VECT)
default:
goto ERROR;
}
+ state++;
goto RETURN;
ERROR:
ibm4704_error = state;
while (ibm4704_send(0xFE)) _delay_ms(1); // resend
xprintf("R:%02X%02X\n", state, data);
DONE:
- state = STOP;
+ state = BIT0;
data = 0;
parity = false;
RETURN: