From cec254950509038ca9c805e87feea9091d77d29f Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 10 Mar 2011 00:50:27 +0900 Subject: [PATCH] FIX: send last report when idle timeouts. (pjrc) --- adb.c | 2 +- adb_usb/Makefile | 2 +- adb_usb/config.h | 4 ++-- adb_usb/matrix.c | 2 +- command.c | 5 ++++- pjrc/host.c | 4 ++++ pjrc/usb.c | 7 ++++--- pjrc/usb_keyboard.c | 1 + vusb/host.c | 5 +++++ 9 files changed, 23 insertions(+), 9 deletions(-) mode change 100644 => 100755 adb.c mode change 100644 => 100755 adb_usb/Makefile mode change 100644 => 100755 adb_usb/matrix.c mode change 100644 => 100755 command.c diff --git a/adb.c b/adb.c old mode 100644 new mode 100755 index 6a3fb8e0821..006e424a92b --- a/adb.c +++ b/adb.c @@ -280,7 +280,6 @@ Pinouts 4: GND - Commands -------- ADB command is 1byte and consists of 4bit-address, 2bit-command @@ -381,6 +380,7 @@ Keyboard Data(Register0) You can read the state from PSW line(active low) however the switch has a special scancode 0x7F7F, so you can also read from Data line. It uses 0xFFFF for release scancode. + Release code seems to delay about some 100ms. Due to Mac soft power? Keyboard LEDs & state of keys(Register2) This register hold current state of three LEDs and nine keys. diff --git a/adb_usb/Makefile b/adb_usb/Makefile old mode 100644 new mode 100755 index 61e43a72fda..92b9ba1a939 --- a/adb_usb/Makefile +++ b/adb_usb/Makefile @@ -44,7 +44,7 @@ USB_EXTRA_ENABLE = yes # Enhanced feature for Windows(Audio control and System c #---------------- Programming Options -------------------------- -PROGRAM_CMD = teensy_loader_cli.exe -mmcu=$(MCU) -w -v $(TARGET).hex +PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex diff --git a/adb_usb/config.h b/adb_usb/config.h index ea78dd9bdb8..adc76bd5225 100644 --- a/adb_usb/config.h +++ b/adb_usb/config.h @@ -17,8 +17,8 @@ /* key combination for command */ #define IS_COMMAND() ( \ - keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT) || \ - keyboard_report->mods == (BIT_LCTRL | BIT_RSHIFT) \ + keyboard_report->mods == (BIT_LSHIFT | BIT_LCTRL | BIT_LALT | BIT_LGUI) || \ + keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT) \ ) diff --git a/adb_usb/matrix.c b/adb_usb/matrix.c old mode 100644 new mode 100755 index 72515dce238..db202896f5f --- a/adb_usb/matrix.c +++ b/adb_usb/matrix.c @@ -87,7 +87,7 @@ uint8_t matrix_scan(void) _register_key(key1); } - if (debug_matrix && matrix_is_modified()) { + if (debug_enable) { print("adb_host_kbd_recv: "); phex16(codes); print("\n"); } return 1; diff --git a/command.c b/command.c old mode 100644 new mode 100755 index 7afed5d7bf0..cd51b79cb30 --- a/command.c +++ b/command.c @@ -102,7 +102,10 @@ uint8_t command_proc(void) print("UDCON: "); phex(UDCON); print("\n"); print("UDIEN: "); phex(UDIEN); print("\n"); print("UDINT: "); phex(UDINT); print("\n"); - print("host_keyboard_leds:"); phex(host_keyboard_leds()); print("\n"); + print("usb_keyboard_leds:"); phex(usb_keyboard_leds); print("\n"); + print("usb_keyboard_protocol: "); phex(usb_keyboard_protocol); print("\n"); + print("usb_keyboard_idle_config:"); phex(usb_keyboard_idle_config); print("\n"); + print("usb_keyboard_idle_count:"); phex(usb_keyboard_idle_count); print("\n"); #endif break; #ifdef USB_NKRO_ENABLE diff --git a/pjrc/host.c b/pjrc/host.c index 8da88517b5c..b69c6cb20c5 100644 --- a/pjrc/host.c +++ b/pjrc/host.c @@ -1,4 +1,5 @@ #include +#include #include "usb_keycodes.h" #include "usb_keyboard.h" #include "usb_mouse.h" @@ -58,9 +59,12 @@ void host_add_code(uint8_t code) void host_swap_keyboard_report(void) { + uint8_t sreg = SREG; + cli(); report_keyboard_t *tmp = keyboard_report_prev; keyboard_report_prev = keyboard_report; keyboard_report = tmp; + SREG = sreg; } void host_clear_keyboard_report(void) diff --git a/pjrc/usb.c b/pjrc/usb.c index 9fd30dee3c6..3cfe9473101 100644 --- a/pjrc/usb.c +++ b/pjrc/usb.c @@ -687,10 +687,11 @@ ISR(USB_GEN_vect) usb_keyboard_idle_count++; if (usb_keyboard_idle_count == usb_keyboard_idle_config) { usb_keyboard_idle_count = 0; - UEDATX = keyboard_report->mods; + UEDATX = keyboard_report_prev->mods; UEDATX = 0; - for (i=0; i<6; i++) { - UEDATX = keyboard_report->keys[i]; + uint8_t keys = usb_keyboard_protocol ? KBD_REPORT_KEYS : 6; + for (i=0; ikeys[i]; } UEINTX = 0x3A; } diff --git a/pjrc/usb_keyboard.c b/pjrc/usb_keyboard.c index fc05f7c9e74..8aae2d38181 100644 --- a/pjrc/usb_keyboard.c +++ b/pjrc/usb_keyboard.c @@ -15,6 +15,7 @@ uint8_t usb_keyboard_protocol=1; // the idle configuration, how often we send the report to the // host (ms * 4) even when it hasn't changed +// Windows and Linux set 0 while OS X sets 6(24ms) by SET_IDLE request. uint8_t usb_keyboard_idle_config=125; // count until idle timeout diff --git a/vusb/host.c b/vusb/host.c index 05a1f29cd19..901537bcb89 100644 --- a/vusb/host.c +++ b/vusb/host.c @@ -1,3 +1,5 @@ +#include +#include #include "usbdrv.h" #include "usbconfig.h" #include "print.h" @@ -63,9 +65,12 @@ void host_add_code(uint8_t code) void host_swap_keyboard_report(void) { + uint8_t sreg = SREG; + cli(); report_keyboard_t *tmp = keyboard_report_prev; keyboard_report_prev = keyboard_report; keyboard_report = tmp; + SREG = sreg; } void host_clear_keyboard_report(void)