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 'f6d56675f9'
d18d42e Merge branch 'core-update2' into core
febec88 Add compile options '-fdata-sections'

git-subtree-dir: tmk_core
git-subtree-split: 57d27a8e39173a589b4abae74851f95c39940174
This commit is contained in:
Jun Wako 2015-09-24 12:29:11 +09:00
parent f6d56675f9
commit fdc38ef3f9
26 changed files with 554 additions and 189 deletions

View file

@ -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
}
/*
@ -104,22 +105,6 @@ uint8_t ibm4704_recv_response(void)
return rbuf_dequeue();
}
/*
Keyboard to Host
----------------
Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
____ __ __ __ __ __ __ __ __ __ ________
Clock \____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
Data ____/ X____X____X____X____X____X____X____X____X____X________
Start 0 1 2 3 4 5 6 7 P Stop
Start bit: can be long as 300-350us.
Inhibit: Pull Data line down to inhibit keyboard to send.
Timing: Host reads bit while Clock is hi.
Stop bit: Keyboard pulls down Data line to lo after 9th clock.
*/
uint8_t ibm4704_recv(void)
{
if (rbuf_has_data()) {
@ -129,26 +114,35 @@ uint8_t ibm4704_recv(void)
}
}
/*
Keyboard to Host
----------------
Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
____ __ __ __ __ __ __ __ __ __ _______
Clock \_____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
Data ____/ X____X____X____X____X____X____X____X____X____X________
Start 0 1 2 3 4 5 6 7 P Stop
Start bit: can be long as 300-350us.
Inhibit: Pull Data line down to inhibit keyboard to send.
Timing: Host reads bit while Clock is hi.(rising edge)
Stop bit: Keyboard pulls down Data line to lo after 9th clock.
*/
ISR(IBM4704_INT_VECT)
{
static enum {
INIT, START, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY,
} state = INIT;
BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP
} state = BIT0;
// LSB first
static uint8_t data = 0;
// Odd parity
static uint8_t parity = false;
ibm4704_error = 0;
// return unless falling edge
if (clock_in()) { goto RETURN; } // why this occurs?
state++;
switch (state) {
case START:
// Data:Low
WAIT(data_hi, 10, state);
break;
case BIT0:
case BIT1:
case BIT2:
@ -169,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;
@ -176,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 = INIT;
state = BIT0;
data = 0;
parity = false;
RETURN: