summaryrefslogtreecommitdiff
path: root/hhkb
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2011-09-17 22:39:50 +0900
committertmk <nobody@nowhere>2011-09-17 23:53:18 +0900
commite67c988824f5ec0c965beb412f8ee5953dfd3c8c (patch)
tree190543f5bddfd31a326234aad91a0a995e55863a /hhkb
parentb703de7b298f8463bf4654fa3730ba1958a7fa9e (diff)
Added Bulegiga iWRAP support into HHKB.(Bluetooth)
Diffstat (limited to 'hhkb')
-rw-r--r--hhkb/FUSE.txt40
-rw-r--r--hhkb/Makefile.iwrap91
-rw-r--r--hhkb/Makefile.pjrc (renamed from hhkb/Makefile)19
-rw-r--r--hhkb/Makefile.vusb29
-rw-r--r--hhkb/README113
-rw-r--r--hhkb/config_iwrap.h55
-rw-r--r--hhkb/config_pjrc.h6
-rw-r--r--hhkb/config_vusb.h12
-rw-r--r--hhkb/doc/Bluetooth.txt4
-rwxr-xr-xhhkb/doc/Bluetooth_img/.picasa.ini2
-rwxr-xr-xhhkb/doc/Bluetooth_img/BT_circuit.jpgbin0 -> 502118 bytes
-rw-r--r--hhkb/doc/HHKB_img/HHKB_TP1684.jpg (renamed from hhkb/doc/HHKB_TP1684.jpg)bin149082 -> 149082 bytes
-rw-r--r--hhkb/doc/HHKB_img/HHKB_chart1.jpg (renamed from hhkb/doc/HHKB_chart1.jpg)bin155342 -> 155342 bytes
-rw-r--r--hhkb/doc/HHKB_img/HHKB_chart2.jpg (renamed from hhkb/doc/HHKB_chart2.jpg)bin148225 -> 148225 bytes
-rw-r--r--hhkb/doc/HHKB_img/HHKB_connector.jpg (renamed from hhkb/doc/HHKB_connector.jpg)bin193900 -> 193900 bytes
-rw-r--r--hhkb/doc/HHKB_img/HHKB_controller.jpg (renamed from hhkb/doc/HHKB_controller.jpg)bin135100 -> 135100 bytes
-rw-r--r--hhkb/doc/HHKB_img/HHKB_keyswitch.jpg (renamed from hhkb/doc/HHKB_keyswitch.jpg)bin171469 -> 171469 bytes
-rw-r--r--hhkb/doc/HHKB_img/connector_contact.jpg (renamed from hhkb/doc/connector_contact.jpg)bin192830 -> 192830 bytes
-rw-r--r--hhkb/doc/HHKB_img/logic_analyzer.jpg (renamed from hhkb/doc/logic_analyzer.jpg)bin169564 -> 169564 bytes
-rw-r--r--hhkb/doc/HHKB_img/probe_contact.jpg (renamed from hhkb/doc/probe_contact.jpg)bin208477 -> 208477 bytes
-rw-r--r--hhkb/doc/HHKB_img/teensy_install.jpg (renamed from hhkb/doc/teensy_install.jpg)bin135851 -> 135851 bytes
-rw-r--r--hhkb/doc/HHKB_img/teensy_wiring.jpg (renamed from hhkb/doc/teensy_wiring.jpg)bin154695 -> 154695 bytes
-rw-r--r--hhkb/keymap.c115
-rw-r--r--hhkb/matrix.c66
-rw-r--r--hhkb/usbconfig.h16
25 files changed, 449 insertions, 119 deletions
diff --git a/hhkb/FUSE.txt b/hhkb/FUSE.txt
new file mode 100644
index 0000000000..40055e5ab1
--- /dev/null
+++ b/hhkb/FUSE.txt
@@ -0,0 +1,40 @@
+ATMega168P Fuse/Lock Bits
+=========================
+This configuration is from usbasploader's Makefile.
+
+ HFUSE 0xD6
+ LFUSE 0xDF
+ EFUSE 0x00
+ LOCK 0x3F(intact)
+
+#---------------------------------------------------------------------
+# ATMega168P
+#---------------------------------------------------------------------
+# Fuse extended byte:
+# 0x00 = 0 0 0 0 0 0 0 0 <-- BOOTRST (boot reset vector at 0x1800)
+# \+/
+# +------- BOOTSZ (00 = 2k bytes)
+# Fuse high byte:
+# 0xd6 = 1 1 0 1 0 1 1 0
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V)
+# | | | | + --------- EESAVE (preserve EEPROM over chip erase)
+# | | | +-------------- WDTON (if 0: watchdog always on)
+# | | +---------------- SPIEN (allow serial programming)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (reset pin is enabled)
+# Fuse low byte:
+# 0xdf = 1 1 0 1 1 1 1 1
+# ^ ^ \ / \--+--/
+# | | | +------- CKSEL 3..0 (external >8M crystal)
+# | | +--------------- SUT 1..0 (crystal osc, BOD enabled)
+# | +------------------ CKOUT (if 0: Clock output enabled)
+# +-------------------- CKDIV8 (if 0: divide by 8)
+
+
+# Lock Bits
+# 0x3f = - - 1 1 1 1 1 1
+# \ / \-/ \-/
+# | | +----- LB 2..1 (No memory lock features enabled)
+# | +--------- BLB0 2..1 (No restrictions for SPM or LPM accessing the Application section)
+# +--------------- BLB1 2..1 (No restrictions for SPM or LPM accessing the Boot Loader section)
diff --git a/hhkb/Makefile.iwrap b/hhkb/Makefile.iwrap
new file mode 100644
index 0000000000..cf020b94aa
--- /dev/null
+++ b/hhkb/Makefile.iwrap
@@ -0,0 +1,91 @@
+#
+# Makefile for iWRAP
+#
+
+
+# Target file name (without extension).
+TARGET = hhkb_iwrap
+
+# Directory common source filess exist
+COMMON_DIR = ..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# keyboard dependent files
+SRC = main.c \
+ keymap.c \
+ matrix.c \
+ led.c
+
+CONFIG_H = config_iwrap.h
+
+
+# V-USB debug level: To use ps2_usart.c level must be 0
+# ps2_usart.c requires USART to receive PS/2 signal.
+OPT_DEFS = -DDEBUG_LEVEL=0
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+MCU = atmega168p
+# avrdude doesn't know atmega168p
+AVRDUDE_MCU = atmega168
+
+
+# Processor frequency.
+# Normally the first thing your program should do is set the clock prescaler,
+# so your program will run at the correct speed. You should also set this
+# variable to same clock speed. The _delay_ms() macro uses this, and many
+# examples use this variable to calculate timings. Do not add a "UL" here.
+F_CPU = 12000000
+
+
+# Build Options
+# comment out to disable the options.
+#
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+#NKRO_ENABLE = yes # USB Nkey Rollover
+
+
+
+#---------------- Programming Options --------------------------
+AVRDUDE = avrdude
+# Type: avrdude -c ? to get a full listing.
+AVRDUDE_PROGRAMMER = usbasp
+AVRDUDE_PORT =
+AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level. Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+#AVRDUDE_FLAGS = -p $(AVRDUDE_MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS = -p $(AVRDUDE_MCU) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
+AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
+AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
+
+PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+
+
+# Search Path
+VPATH = $(TARGET_DIR)
+
+include $(COMMON_DIR)/iwrap.mk
+# To be swatchable btween Bluetooth and USB. Comment out if you don't need USB.
+include $(COMMON_DIR)/vusb.mk
+include $(COMMON_DIR)/common.mk
diff --git a/hhkb/Makefile b/hhkb/Makefile.pjrc
index e1cc2f2106..17aa865ddc 100644
--- a/hhkb/Makefile
+++ b/hhkb/Makefile.pjrc
@@ -13,10 +13,10 @@ COMMON_DIR = ..
TARGET_DIR = .
# keyboard dependent files
-TARGET_SRC = main_pjrc.c \
- keymap.c \
- matrix.c \
- led.c
+SRC = main.c \
+ keymap.c \
+ matrix.c \
+ led.c
CONFIG_H = config_pjrc.h
@@ -41,8 +41,8 @@ F_CPU = 16000000
# comment out to disable the options.
MOUSEKEY_ENABLE = yes # Mouse keys
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
-USB_EXTRA_ENABLE = yes # Audio control and System control
-USB_NKRO_ENABLE = yes # USB Nkey Rollover
+EXTRAKEY_ENABLE = yes # Audio control and System control
+NKRO_ENABLE = yes # USB Nkey Rollover
@@ -51,5 +51,8 @@ PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
-include $(COMMON_DIR)/Makefile.pjrc
-include $(COMMON_DIR)/Makefile.common
+# Search Path
+VPATH = $(TARGET_DIR)
+
+include $(COMMON_DIR)/pjrc.mk
+include $(COMMON_DIR)/common.mk
diff --git a/hhkb/Makefile.vusb b/hhkb/Makefile.vusb
index 77841b824c..5bfc233df8 100644
--- a/hhkb/Makefile.vusb
+++ b/hhkb/Makefile.vusb
@@ -13,10 +13,10 @@ COMMON_DIR = ..
TARGET_DIR = .
# keyboard dependent files
-TARGET_SRC = main_vusb.c \
- keymap.c \
- matrix.c \
- led.c
+SRC = main.c \
+ keymap.c \
+ matrix.c \
+ led.c
CONFIG_H = config_vusb.h
@@ -28,7 +28,9 @@ OPT_DEFS = -DDEBUG_LEVEL=0
# MCU name, you MUST set this to match the board you are using
# type "make clean" after changing this, so all files will be rebuilt
-MCU = atmega168
+MCU = atmega168p
+# avrdude doesn't know atmega168p
+AVRDUDE_MCU = atmega168
# Processor frequency.
@@ -36,15 +38,15 @@ MCU = atmega168
# so your program will run at the correct speed. You should also set this
# variable to same clock speed. The _delay_ms() macro uses this, and many
# examples use this variable to calculate timings. Do not add a "UL" here.
-F_CPU = 20000000
+F_CPU = 12000000
# Build Options
# comment out to disable the options.
#
MOUSEKEY_ENABLE = yes # Mouse keys
-USB_EXTRA_ENABLE = yes # Audio control and System control
-#USB_NKRO_ENABLE = yes # USB Nkey Rollover
+EXTRAKEY_ENABLE = yes # Audio control and System control
+#NKRO_ENABLE = yes # USB Nkey Rollover
@@ -70,8 +72,8 @@ AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
# to submit bug reports.
#AVRDUDE_VERBOSE = -v -v
-#AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
-AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER)
+#AVRDUDE_FLAGS = -p $(AVRDUDE_MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS = -p $(AVRDUDE_MCU) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
@@ -80,5 +82,8 @@ PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE
-include $(COMMON_DIR)/Makefile.vusb
-include $(COMMON_DIR)/Makefile.common
+# Search Path
+VPATH = $(TARGET_DIR)
+
+include $(COMMON_DIR)/vusb.mk
+include $(COMMON_DIR)/common.mk
diff --git a/hhkb/README b/hhkb/README
index 2a44181016..65f7dcab5a 100644
--- a/hhkb/README
+++ b/hhkb/README
@@ -4,7 +4,7 @@ Alternative Controller for HHKB
Feature
-------
- Mouse Keys
-- NKRO on USB
+- NKRO on USB(PJRC Tennsy only)
- Keymap Layers
@@ -13,8 +13,11 @@ Customize Keymap
see keymap.c.
-Build for Teensy
-----------------
+
+Build
+=====
+PJRC Teensy
+-----------
0. Edit matrix.c.
adjust scan code to your pin configuration.(see doc/HHKB.txt for pinouts)
1. Define macros in config_pjrc.h.(Optional)
@@ -22,15 +25,15 @@ Build for Teensy
IS_COMMAND
2. Edit Makefile for MCU setting and build options.
MCU, F_CPU
- MOUSEKEY_ENABLE, USB_EXTRA_ENABLE, USB_NKRO_ENABLE
+ MOUSEKEY_ENABLE, EXTRAKEY_ENABLE, NKRO_ENABLE
3. Build hex file.
- $ make
+ $ make -f Makefile.pjrc
4. Program MCU.
- $ make program
+ $ make -f Makefile.pjrc program
-Build for V-USB
----------------
+V-USB
+-----
0. Edit matrix.c and usbconfig.h.
adjust scan code to your pin configuration.(see doc/HHKB.txt for pinouts)
define macros for V-USB in usbconfig.h.
@@ -38,7 +41,7 @@ Build for V-USB
IS_COMMAND
2. Edit Makefile.vusb for MCU setting and build options.
MCU, F_CPU
- MOUSEKEY_ENABLE, USB_EXTRA_ENABLE, USB_NKRO_ENABLE
+ MOUSEKEY_ENABLE, EXTRAKEY_ENABLE
3. Build hex file.
$ make -f Makefile.vusb
4. Program MCU.
@@ -52,21 +55,59 @@ Build for V-USB
http://www.obdev.at/products/vusb/usbasploader.html
-V-USB Circuit
--------------
+iWRAP
+-----
+0. Edit matrix.c and usbconfig.h.
+ adjust scan code to your pin configuration.(see doc/HHKB.txt for pinouts)
+ define macros for V-USB in usbconfig.h.
+1. Define macros in config_iwrap.h.(Optional)
+ IS_COMMAND
+2. Edit Makefile.iwrap for MCU setting and build options.
+ MCU, F_CPU
+ MOUSEKEY_ENABLE, EXTRAKEY_ENABLE
+3. Build hex file.
+ $ make -f Makefile.iwrap
+4. Program MCU.
+ $ make -f Makefile.iwrap program
+
+
+
+Hardware
+========
+PJRC Teensy
+-----------
+ +---------------+
+ | Teensy++ |
+ | |
+ | | HHKB
+ | | ~~~~
+ | PB0-2|------->ROW(6-8)
+ | PB3-5|------->COL(9-11)
+ | PB6|------->ENABLE(12)
+ | PE6|<-------KEY(4)
+ | PE7|------->PREV(5)
+ | |
+ | |
+ | |
+ +---------------+
+
+
+V-USB
+-----
+---+ +---------------+
USB GND | | ATmega168 |
-=== C3 | |
+~~~ C3 | |
5V <-------+--------+---|Vcc,AVCC | HHKB
- R1 | | ====
-D- <----+--+-----R2-----|INT1 PB0-2|------->ROW
-D+ <----|---+----R3-----|INT0 PB3-5|------->COL
- Z1 Z2 | PB6|------->ENABLE
-GND<----+---+--+--+-----|GND PE6|------->KEY
- | | | PE7|------->PREV
- | C2-+--|XTAL1 | (see doc/HHKB.txt for pinouts)
- | X1 | |
- +--C3-+--|XTAL2 RST|---SW--+GND
+ R1 | | ~~~~
+D- <----+--+-----R2-----|INT1 PB2-4|------->ROW(6-8)
+D+ <----|---+----R3-----|INT0 PC0-2|------->COL(9-11)
+ Z1 Z2 | PC3|------->ENABLE(12)
+GND<----+---+-----------|GND PB0|<-------KEY(4)
+ | PB1|------->PREV(5)
+ | |
+ GND+-C2--+--|XTAL1 RXD|------->Debug Console
+ X1 | TXD|<-------Debug Console
+ GND+-C3--+--|XTAL2 RST|---SW--+GND
+---------------+
R1: 1.5K Ohm
R2,R3: 68 Ohm
@@ -77,4 +118,34 @@ X1: Crystal 20MHz(16MHz/12MHz)
SW: Push Switch(Optional for bootloader)
+iWRAP
+-----
+ +---------------+ WT12
+ 5V | ATmega168 | 5V/3.3V~~~~
+ +-----+---|Vcc,AVCC PC4|---/--->iWRAP(RxD)
+USB | C3 | PC5|<--/----iWRAP(TxD)
+~~~ | + | |
+5V <--BATT + GND | | HHKB
+ R1 | | ~~~~
+D- <----+-----+--R2-----|INT1 PB2-4|------->ROW(6-8)
+D+ <----|---+----R3-----|INT0 PC0-2|------->COL(9-11)
+ Z1 Z2 | PC3|------->ENABLE(12)
+GND<----+---+-----------|GND PB0|<-------KEY(4)
+ | PB1|------->PREV(5)
+ | |
+ GND+-C2--+--|XTAL1 RXD|------->Debug Console
+ X1 | TXD|<-------Debug Console
+ GND+-C3--+--|XTAL2 RST|---SW--+GND
+ +---------------+
+
+R1: 1.5K Ohm
+R2,R3: 68 Ohm
+Z1,Z2: Zener 3.6V
+C1,C2: 22pF
+C3: 0.1uF
+X1: Crystal 12MHz
+SW: Push Switch(Optional)
+BATT: Li-Po Battery, Battery Charger and Voltage Regulator(5V and 3.3V).
+
+
EOF
diff --git a/hhkb/config_iwrap.h b/hhkb/config_iwrap.h
new file mode 100644
index 0000000000..80ab64398b
--- /dev/null
+++ b/hhkb/config_iwrap.h
@@ -0,0 +1,55 @@
+/*
+Copyright 2011 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xBEEA
+// TODO: share these strings with usbconfig.h
+// Edit usbconfig.h to change these.
+#define MANUFACTURER t.m.k.
+#define PRODUCT HHKB mod
+#define DESCRIPTION t.m.k. keyboard firmware for HHKB mod
+
+
+/* matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 8
+
+
+/* key combination for command */
+#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT)))
+
+/* mouse keys */
+#ifdef MOUSEKEY_ENABLE
+# define MOUSEKEY_DELAY_TIME 255
+#endif
+
+/* pins for Software UART */
+#define SUART_IN_PIN PINC
+#define SUART_IN_BIT 5
+#define SUART_OUT_PORT PORTC
+#define SUART_OUT_BIT 4
+
+
+#define DEBUG_LED 1
+#define DEBUG_LED_CONFIG (DDRD |= (1<<4))
+#define DEBUG_LED_OFF (PORTD |= (1<<4))
+#define DEBUG_LED_ON (PORTD &= ~(1<<4))
+
+#endif
diff --git a/hhkb/config_pjrc.h b/hhkb/config_pjrc.h
index ef2efe2d93..8379202ca8 100644
--- a/hhkb/config_pjrc.h
+++ b/hhkb/config_pjrc.h
@@ -36,11 +36,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* key combination for command */
-#define IS_COMMAND() ( \
- keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT) || \
- keyboard_report->mods == (BIT_LCTRL | BIT_RSHIFT) \
-)
-
+#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT)))
/* mouse keys */
#ifdef MOUSEKEY_ENABLE
diff --git a/hhkb/config_vusb.h b/hhkb/config_vusb.h
index 115b73de30..268644849e 100644
--- a/hhkb/config_vusb.h
+++ b/hhkb/config_vusb.h
@@ -18,7 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_H
#define CONFIG_H
-
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0xC0FE
// TODO: share these strings with usbconfig.h
@@ -34,11 +33,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* key combination for command */
-#define IS_COMMAND() ( \
- keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT) || \
- keyboard_report->mods == (BIT_LCTRL | BIT_RSHIFT) \
-)
-
+#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT)))
/* mouse keys */
#ifdef MOUSEKEY_ENABLE
@@ -46,4 +41,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#endif
+#define DEBUG_LED 1
+#define DEBUG_LED_CONFIG (DDRD |= (1<<4))
+#define DEBUG_LED_OFF (PORTD |= (1<<4))
+#define DEBUG_LED_ON (PORTD &= ~(1<<4))
+
#endif
diff --git a/hhkb/doc/Bluetooth.txt b/hhkb/doc/Bluetooth.txt
new file mode 100644
index 0000000000..b27f197006
--- /dev/null
+++ b/hhkb/doc/Bluetooth.txt
@@ -0,0 +1,4 @@
+HHKB Bluetooth mod
+==================
+See this article:
+http://geekhack.org/showwiki.php?title=Island:20851
diff --git a/hhkb/doc/Bluetooth_img/.picasa.ini b/hhkb/doc/Bluetooth_img/.picasa.ini
new file mode 100755
index 0000000000..f6a4f60674
--- /dev/null
+++ b/hhkb/doc/Bluetooth_img/.picasa.ini
@@ -0,0 +1,2 @@
+[Picasa]
+name=Bluetooth_img
diff --git a/hhkb/doc/Bluetooth_img/BT_circuit.jpg b/hhkb/doc/Bluetooth_img/BT_circuit.jpg
new file mode 100755
index 0000000000..2e5a25e81e
--- /dev/null
+++ b/hhkb/doc/Bluetooth_img/BT_circuit.jpg
Binary files differ
diff --git a/hhkb/doc/HHKB_TP1684.jpg b/hhkb/doc/HHKB_img/HHKB_TP1684.jpg
index 0a03164094..0a03164094 100644
--- a/hhkb/doc/HHKB_TP1684.jpg
+++ b/hhkb/doc/HHKB_img/HHKB_TP1684.jpg
Binary files differ
diff --git a/hhkb/doc/HHKB_chart1.jpg b/hhkb/doc/HHKB_img/HHKB_chart1.jpg
index 1f09bd185c..1f09bd185c 100644
--- a/hhkb/doc/HHKB_chart1.jpg
+++ b/hhkb/doc/HHKB_img/HHKB_chart1.jpg
Binary files differ
diff --git a/hhkb/doc/HHKB_chart2.jpg b/hhkb/doc/HHKB_img/HHKB_chart2.jpg
index 45f5ada905..45f5ada905 100644
--- a/hhkb/doc/HHKB_chart2.jpg
+++ b/hhkb/doc/HHKB_img/HHKB_chart2.jpg
Binary files differ
diff --git a/hhkb/doc/HHKB_connector.jpg b/hhkb/doc/HHKB_img/HHKB_connector.jpg
index e8a09e9b28..e8a09e9b28 100644
--- a/hhkb/doc/HHKB_connector.jpg
+++ b/hhkb/doc/HHKB_img/HHKB_connector.jpg
Binary files differ
diff --git a/hhkb/doc/HHKB_controller.jpg b/hhkb/doc/HHKB_img/HHKB_controller.jpg
index e3dae8e86c..e3dae8e86c 100644
--- a/hhkb/doc/HHKB_controller.jpg
+++ b/hhkb/doc/HHKB_img/HHKB_controller.jpg
Binary files differ
diff --git a/hhkb/doc/HHKB_keyswitch.jpg b/hhkb/doc/HHKB_img/HHKB_keyswitch.jpg
index 3afc269e7b..3afc269e7b 100644
--- a/hhkb/doc/HHKB_keyswitch.jpg
+++ b/hhkb/doc/HHKB_img/HHKB_keyswitch.jpg
Binary files differ
diff --git a/hhkb/doc/connector_contact.jpg b/hhkb/doc/HHKB_img/connector_contact.jpg
index 5304bc8d7e..5304bc8d7e 100644
--- a/hhkb/doc/connector_contact.jpg
+++ b/hhkb/doc/HHKB_img/connector_contact.jpg
Binary files differ
diff --git a/hhkb/doc/logic_analyzer.jpg b/hhkb/doc/HHKB_img/logic_analyzer.jpg
index f1b438ae77..f1b438ae77 100644
--- a/hhkb/doc/logic_analyzer.jpg
+++ b/hhkb/doc/HHKB_img/logic_analyzer.jpg
Binary files differ
diff --git a/hhkb/doc/probe_contact.jpg b/hhkb/doc/HHKB_img/probe_contact.jpg
index dc79afa0cc..dc79afa0cc 100644
--- a/hhkb/doc/probe_contact.jpg
+++ b/hhkb/doc/HHKB_img/probe_contact.jpg
Binary files differ
diff --git a/hhkb/doc/teensy_install.jpg b/hhkb/doc/HHKB_img/teensy_install.jpg
index 873d988edb..873d988edb 100644
--- a/hhkb/doc/teensy_install.jpg
+++ b/hhkb/doc/HHKB_img/teensy_install.jpg
Binary files differ
diff --git a/hhkb/doc/teensy_wiring.jpg b/hhkb/doc/HHKB_img/teensy_wiring.jpg
index 1c4eb67434..1c4eb67434 100644
--- a/hhkb/doc/teensy_wiring.jpg
+++ b/hhkb/doc/HHKB_img/teensy_wiring.jpg
Binary files differ
diff --git a/hhkb/keymap.c b/hhkb/keymap.c
index f539a06ccb..85a7c31b7e 100644
--- a/hhkb/keymap.c
+++ b/hhkb/keymap.c
@@ -32,21 +32,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Convert physical keyboard layout to matrix array.
// This is a macro to define keymap easily in keyboard layout form.
#define KEYMAP( \
- R3C1, R3C0, R0C0, R1C0, R1C1, R2C0, R2C1, R4C0, R4C1, R6C0, R6C1, R7C0, R7C1, R5C0, R5C1, \
- R3C2, R0C1, R0C2, R1C3, R1C2, R2C3, R2C2, R4C2, R4C3, R6C2, R6C3, R7C3, R7C2, R5C2, \
- R3C3, R0C4, R0C3, R1C4, R1C5, R2C4, R2C5, R4C5, R4C4, R6C5, R6C4, R7C4, R5C3, \
- R3C4, R0C5, R0C6, R0C7, R1C6, R1C7, R2C6, R4C6, R6C6, R7C6, R7C5, R5C5, R5C4, \
- R3C5, R3C6, R3C7, R5C7, R5C6 \
+ K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \
+ K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \
+ K33, K04, K03, K14, K15, K24, K25, K45, K44, K65, K64, K74, K53, \
+ K34, K05, K06, K07, K16, K17, K26, K46, K66, K76, K75, K55, K54, \
+ K35, K36, K37, K57, K56 \
) \
{ \
- { R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \
- { R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \
- { R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, KB_NO }, \
- { R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \
- { R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, KB_NO }, \
- { R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \
- { R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, KB_NO }, \
- { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, KB_NO } \
+ { KB_##K00, KB_##K01, KB_##K02, KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \
+ { KB_##K10, KB_##K11, KB_##K12, KB_##K13, KB_##K14, KB_##K15, KB_##K16, KB_##K17 }, \
+ { KB_##K20, KB_##K21, KB_##K22, KB_##K23, KB_##K24, KB_##K25, KB_##K26, KB_NO }, \
+ { KB_##K30, KB_##K31, KB_##K32, KB_##K33, KB_##K34, KB_##K35, KB_##K36, KB_##K37 }, \
+ { KB_##K40, KB_##K41, KB_##K42, KB_##K43, KB_##K44, KB_##K45, KB_##K46, KB_NO }, \
+ { KB_##K50, KB_##K51, KB_##K52, KB_##K53, KB_##K54, KB_##K55, KB_##K56, KB_##K57 }, \
+ { KB_##K60, KB_##K61, KB_##K62, KB_##K63, KB_##K64, KB_##K65, KB_##K66, KB_NO }, \
+ { KB_##K70, KB_##K71, KB_##K72, KB_##K73, KB_##K74, KB_##K75, KB_##K76, KB_NO } \
}
#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
@@ -58,8 +58,8 @@ static const uint8_t PROGMEM fn_layer[] = {
1, // Fn1
2, // Fn2
3, // Fn3
- 4, // Fn4
- 0, // Fn5
+ 3, // Fn4
+ 4, // Fn5
0, // Fn6
0 // Fn7
};
@@ -71,8 +71,8 @@ static const uint8_t PROGMEM fn_keycode[] = {
KB_NO, // Fn1
KB_SLSH, // Fn2
KB_SCLN, // Fn3
- KB_SPC, // Fn4
- KB_NO, // Fn5
+ KB_NO, // Fn4
+ KB_SPC, // Fn5
KB_NO, // Fn6
KB_NO // Fn7
};
@@ -91,11 +91,11 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |Gui|Alt |Fn5 |Alt |Fn4|
* `-------------------------------------------'
*/
- KEYMAP(KB_ESC, KB_1, KB_2, KB_3, KB_4, KB_5, KB_6, KB_7, KB_8, KB_9, KB_0, KB_MINS,KB_EQL, KB_BSLS,KB_GRV, \
- KB_TAB, KB_Q, KB_W, KB_E, KB_R, KB_T, KB_Y, KB_U, KB_I, KB_O, KB_P, KB_LBRC,KB_RBRC,KB_BSPC, \
- KB_LCTL,KB_A, KB_S, KB_D, KB_F, KB_G, KB_H, KB_J, KB_K, KB_L, KB_FN3, KB_QUOT,KB_ENT, \
- KB_LSFT,KB_Z, KB_X, KB_C, KB_V, KB_B, KB_N, KB_M, KB_COMM,KB_DOT, KB_FN2, KB_RSFT,KB_FN1, \
- KB_LGUI,KB_LALT,KB_FN4, KB_RALT,KB_RGUI),
+ KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \
+ TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \
+ LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,ENT, \
+ LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \
+ LGUI,LALT, FN5, RALT,FN4),
/* Layer 1: HHKB mode (HHKB Fn)
* ,-----------------------------------------------------------.
@@ -110,11 +110,11 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |Gui |Alt |Space |Alt |xxx|
* `--------------------------------------------'
*/
- KEYMAP(KB_ESC, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, KB_F11, KB_F12, KB_INS, KB_DEL, \
- KB_CAPS,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_PSCR,KB_SLCK,KB_BRK, KB_UP, KB_NO, KB_BSPC, \
- KB_LCTL,KB_VOLD,KB_VOLU,KB_MUTE,KB_NO, KB_NO, KB_PAST,KB_PSLS,KB_HOME,KB_PGUP,KB_LEFT,KB_RGHT,KB_ENT, \
- KB_LSFT,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_PPLS,KB_PMNS,KB_END, KB_PGDN,KB_DOWN,KB_RSFT,KB_FN1, \
- KB_LGUI,KB_LALT,KB_SPC, KB_RALT,KB_FN7),
+ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \
+ LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
+ LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
+ LGUI,LALT, SPC, RALT,FN7),
/* Layer 2: Vi mode (Slash)
* ,-----------------------------------------------------------.
@@ -129,11 +129,11 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |Gui|Alt |Space |Alt |Gui|
* `-------------------------------------------'
*/
- KEYMAP(KB_ESC, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, KB_F11, KB_F12, KB_INS, KB_DEL, \
- KB_TAB, KB_HOME,KB_PGDN,KB_UP, KB_PGUP,KB_END, KB_HOME,KB_PGDN,KB_PGUP,KB_END, KB_NO, KB_NO, KB_NO, KB_BSPC, \
- KB_LCTL,KB_NO, KB_LEFT,KB_DOWN,KB_RGHT,KB_NO, KB_LEFT,KB_DOWN,KB_UP, KB_RGHT,KB_NO, KB_NO, KB_ENT, \
- KB_LSFT,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_HOME,KB_PGDN,KB_PGUP,KB_END, KB_FN2, KB_RSFT,KB_NO, \
- KB_LGUI,KB_LALT,KB_SPC, KB_RALT,KB_RGUI),
+ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \
+ LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \
+ LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,NO, \
+ LGUI,LALT, SPC, RALT,RGUI),
/* Layer 3: Mouse mode (Semicolon)
* ,-----------------------------------------------------------.
@@ -149,11 +149,24 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `--------------------------------------------'
* Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
*/
- KEYMAP(KB_ESC, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, KB_F11, KB_F12, KB_INS, KB_DEL, \
- KB_TAB, KB_WH_L,KB_WH_U,KB_MS_U,KB_WH_D,KB_WH_R,KB_WH_L,KB_WH_D,KB_WH_U,KB_WH_R,KB_NO, KB_NO, KB_NO, KB_BSPC, \
- KB_LCTL,KB_NO, KB_MS_L,KB_MS_D,KB_MS_R,KB_NO, KB_MS_L,KB_MS_D,KB_MS_U,KB_MS_R,KB_FN3, KB_NO, KB_ENT, \
- KB_LSFT,KB_BTN4,KB_BTN5,KB_BTN1,KB_BTN2,KB_BTN3,KB_BTN2,KB_BTN1,KB_BTN4,KB_BTN5,KB_NO, KB_RSFT,KB_NO, \
- KB_LGUI,KB_LALT,KB_BTN1,KB_RALT,KB_RGUI),
+#ifdef HOST_IWRAP
+// iWRAP does not support mouse wheel, use these keycodes to remap as wheel
+#define KB_KPPL KB_KP_PLUS
+#define KB_KPMI KB_KP_MINUS
+#define KB_KPAS KB_KP_ASTERISK
+#define KB_KPSL KB_KP_SLASH
+ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ TAB, KPAS,KPPL,MS_U,KPMI,KPSL,KPAS,KPPL,KPMI,KPSL,NO, NO, NO, BSPC, \
+ LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \
+ LSFT,BTN4,BTN5,BTN1,BTN2,BTN3,BTN2,BTN1,NO, NO, NO, RSFT,NO, \
+ LGUI,LALT, BTN1, RALT,FN4),
+#else
+ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ TAB, WH_L,WH_U,MS_U,WH_D,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
+ LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \
+ LSFT,BTN4,BTN5,BTN1,BTN2,BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \
+ LGUI,LALT, BTN1, RALT,FN4),
+#endif
/* Layer 4: Matias half keyboard style (Space)
* ,-----------------------------------------------------------.
@@ -169,18 +182,26 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `--------------------------------------------'
*/
/*
- KEYMAP(KB_MINS,KB_0, KB_9, KB_8, KB_7, KB_6, KB_5, KB_4, KB_3, KB_2, KB_1, KB_NO, KB_NO, KB_NO, KB_ESC, \
- KB_BSPC,KB_P, KB_O, KB_I, KB_U, KB_Y, KB_T, KB_R, KB_E, KB_W, KB_Q, KB_NO, KB_NO, KB_TAB, \
- KB_LCTL,KB_SCLN,KB_L, KB_K, KB_J, KB_H, KB_G, KB_F, KB_D, KB_S, KB_A, KB_RCTL,KB_RCTL, \
- KB_LSFT,KB_SLSH,KB_DOT, KB_COMM,KB_M, KB_N, KB_B, KB_V, KB_C, KB_X, KB_Z, KB_RSFT,KB_NO, \
- KB_LGUI,KB_LALT,KB_FN4, KB_RALT,KB_RGUI)
+ KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \
+ BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \
+ LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \
+ LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \
+ LGUI,LALT, FN5, RALT,RGUI)
*/
/* Mouse mode (Space) */
- KEYMAP(KB_ESC, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, KB_F11, KB_F12, KB_INS, KB_DEL, \
- KB_TAB, KB_WH_L,KB_WH_U,KB_MS_U,KB_WH_D,KB_WH_R,KB_WH_L,KB_WH_D,KB_WH_U,KB_WH_R,KB_NO, KB_NO, KB_NO, KB_BSPC, \
- KB_LCTL,KB_NO, KB_MS_L,KB_MS_D,KB_MS_R,KB_NO, KB_MS_L,KB_MS_D,KB_MS_U,KB_MS_R,KB_FN3, KB_NO, KB_ENT, \
- KB_LSFT,KB_BTN4,KB_BTN5,KB_BTN1,KB_BTN2,KB_BTN3,KB_BTN2,KB_BTN1,KB_BTN4,KB_BTN5,KB_NO, KB_RSFT,KB_NO, \
- KB_LGUI,KB_LALT,KB_FN4, KB_RALT,KB_RGUI),
+#ifdef HOST_IWRAP
+ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ TAB, KPAS,KPPL,MS_U,KPMI,KPSL,KPAS,KPPL,KPMI,KPSL,NO, NO, NO, BSPC, \
+ LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \
+ LSFT,BTN4,BTN5,BTN1,BTN2,BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \
+ LGUI,LALT, FN5, RALT,RGUI),
+#else
+ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ TAB, WH_L,WH_U,MS_U,WH_D,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
+ LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \
+ LSFT,BTN4,BTN5,BTN1,BTN2,BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \
+ LGUI,LALT, FN5, RALT,RGUI),
+#endif
};
diff --git a/hhkb/matrix.c b/hhkb/matrix.c
index a77febb293..350066b904 100644
--- a/hhkb/matrix.c
+++ b/hhkb/matrix.c
@@ -25,9 +25,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <util/delay.h>
#include "print.h"
#include "util.h"
+#include "timer.h"
#include "matrix.h"
+// Timer resolution check
+#if (1000000/TIMER_RAW_FREQ > 20)
+# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB."
+#endif
+
#if (MATRIX_COLS > 16)
# error "MATRIX_COLS must not exceed 16"
#endif
@@ -82,18 +88,22 @@ static bool matrix_has_ghost_in_row(uint8_t row);
#define KEY_STATE() (PINE & (1<<6))
#define KEY_PREV_ON() (PORTE |= (1<<7))
#define KEY_PREV_OFF() (PORTE &= ~(1<<7))
-
+#define KEY_POWER_ON()
+#define KEY_POWER_OFF()
#else
// Ports for V-USB
// key: PB0(pull-uped)
// prev: PB1
// row: PB2-4
// col: PC0-2,3
+// power: PB5(Low:on/Hi-z:off)
#define KEY_INIT() do { \
- DDRB |= 0x1E; \
- DDRB &= ~(1<<0); \
- PORTB |= (1<<0); \
- DDRC |= 0x0F; \
+ DDRB |= 0x3E; \
+ DDRB &= ~(1<<0); \
+ PORTB |= 1<<0; \
+ DDRC |= 0x0F; \
+ KEY_UNABLE(); \
+ KEY_PREV_OFF(); \
} while (0)
#define KEY_SELECT(ROW, COL) do { \
PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \
@@ -104,6 +114,18 @@ static bool matrix_has_ghost_in_row(uint8_t row);
#define KEY_STATE() (PINB & (1<<0))
#define KEY_PREV_ON() (PORTB |= (1<<1))
#define KEY_PREV_OFF() (PORTB &= ~(1<<1))
+// Power supply switching
+#define KEY_POWER_ON() do { \
+ KEY_INIT(); \
+ PORTB &= ~(1<<5); \
+ _delay_us(200); \
+} while (0)
+#define KEY_POWER_OFF() do { \
+ DDRB &= ~0x3F; \
+ PORTB &= ~0x3F; \
+ DDRC &= ~0x0F; \
+ PORTC &= ~0x0F; \
+} while (0)
#endif
@@ -138,36 +160,46 @@ uint8_t matrix_scan(void)
matrix_prev = matrix;
matrix = tmp;
+ KEY_POWER_ON();
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
KEY_SELECT(row, col);
- _delay_us(40); // from logic analyzer chart
+ _delay_us(40);
+
+ // Not sure this is needed. This just emulates HHKB controller's behaviour.
if (matrix_prev[row] & (1<<col)) {
KEY_PREV_ON();
}
- _delay_us(7); // from logic analyzer chart
+ _delay_us(7);
+
+ // NOTE: KEY_STATE is valid only in 20us after KEY_ENABLE.
+ // If V-USB interrupts in this section we could lose 40us or so
+ // and would read invalid value from KEY_STATE.
+ uint8_t last = TIMER_RAW;
-#if HOST_VUSB
- // to avoid V-USB interrupt during read key state
- uint8_t sreg = SREG;
- cli();
-#endif
KEY_ENABLE();
- _delay_us(10); // from logic analyzer chart
+ // Wait for KEY_STATE outputs its value.
+ // 1us was ok on one HHKB, but not worked on another.
+ _delay_us(10);
if (KEY_STATE()) {
matrix[row] &= ~(1<<col);
} else {
matrix[row] |= (1<<col);
}
-#if HOST_VUSB
- SREG = sreg;
-#endif
+
+ // Ignore if this code region execution time elapses more than 20us.
+ if (TIMER_DIFF_RAW(TIMER_RAW, last) > 20/(1000000/TIMER_RAW_FREQ)) {
+ matrix[row] = matrix_prev[row];
+ }
KEY_PREV_OFF();
KEY_UNABLE();
- _delay_us(150); // from logic analyzer chart
+ // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE.
+ // This takes 25us or more to make sure KEY_STATE returns to idle state.
+ _delay_us(150);
}
}
+ KEY_POWER_OFF();
return 1;
}
diff --git a/hhkb/usbconfig.h b/hhkb/usbconfig.h
index e8283505e2..c3aad34bef 100644
--- a/hhkb/usbconfig.h
+++ b/hhkb/usbconfig.h
@@ -171,7 +171,7 @@ section at the end of this file).
/* This macro (if defined) is executed when a USB SET_ADDRESS request was
* received.
*/
-#define USB_COUNT_SOF 0
+#define USB_COUNT_SOF 1
/* define this macro to 1 if you need the global variable "usbSofCount" which
* counts SOF packets. This feature requires that the hardware interrupt is
* connected to D- instead of D+.
@@ -352,8 +352,8 @@ section at the end of this file).
#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-//#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-#define USB_CFG_DESCR_PROPS_HID 0
+#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
+//#define USB_CFG_DESCR_PROPS_HID 0
#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
#define USB_CFG_DESCR_PROPS_UNKNOWN 0
@@ -375,4 +375,14 @@ section at the end of this file).
/* #define USB_INTR_PENDING_BIT INTF0 */
/* #define USB_INTR_VECTOR INT0_vect */
+/* Set INT1 for D- falling edge to count SOF */
+/* #define USB_INTR_CFG EICRA */
+#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
+/* #define USB_INTR_CFG_CLR 0 */
+/* #define USB_INTR_ENABLE EIMSK */
+#define USB_INTR_ENABLE_BIT INT1
+/* #define USB_INTR_PENDING EIFR */
+#define USB_INTR_PENDING_BIT INTF1
+#define USB_INTR_VECTOR INT1_vect
+
#endif /* __usbconfig_h_included__ */