summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2011-03-10 00:50:27 +0900
committertmk <nobody@nowhere>2011-03-10 11:17:54 +0900
commitcec254950509038ca9c805e87feea9091d77d29f (patch)
treec4f542b18dc080e32508aced1ee0ccce5cbf3a53
parent1a7c3585ed9a68099e371b3180a404dd5d08ce1a (diff)
FIX: send last report when idle timeouts. (pjrc)
-rwxr-xr-x[-rw-r--r--]adb.c2
-rwxr-xr-x[-rw-r--r--]adb_usb/Makefile2
-rw-r--r--adb_usb/config.h4
-rwxr-xr-x[-rw-r--r--]adb_usb/matrix.c2
-rwxr-xr-x[-rw-r--r--]command.c5
-rw-r--r--pjrc/host.c4
-rw-r--r--pjrc/usb.c7
-rw-r--r--pjrc/usb_keyboard.c1
-rw-r--r--vusb/host.c5
9 files changed, 23 insertions, 9 deletions
diff --git a/adb.c b/adb.c
index 6a3fb8e082..006e424a92 100644..100755
--- 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
index 61e43a72fd..92b9ba1a93 100644..100755
--- 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 ea78dd9bdb..adc76bd522 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
index 72515dce23..db202896f5 100644..100755
--- 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
index 7afed5d7bf..cd51b79cb3 100644..100755
--- 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 8da88517b5..b69c6cb20c 100644
--- a/pjrc/host.c
+++ b/pjrc/host.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include <avr/interrupt.h>
#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 9fd30dee3c..3cfe947310 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; i<keys; i++) {
+ UEDATX = keyboard_report_prev->keys[i];
}
UEINTX = 0x3A;
}
diff --git a/pjrc/usb_keyboard.c b/pjrc/usb_keyboard.c
index fc05f7c9e7..8aae2d3818 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 05a1f29cd1..901537bcb8 100644
--- a/vusb/host.c
+++ b/vusb/host.c
@@ -1,3 +1,5 @@
+#include <stdint.h>
+#include <avr/interrupt.h>
#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)