diff options
author | tmk <nobody@nowhere> | 2011-09-17 15:39:50 +0200 |
---|---|---|
committer | tmk <nobody@nowhere> | 2011-09-17 16:53:18 +0200 |
commit | e67c988824f5ec0c965beb412f8ee5953dfd3c8c (patch) | |
tree | 190543f5bddfd31a326234aad91a0a995e55863a /hhkb | |
parent | b703de7b298f8463bf4654fa3730ba1958a7fa9e (diff) | |
download | qmk_firmware-e67c988824f5ec0c965beb412f8ee5953dfd3c8c.tar.gz qmk_firmware-e67c988824f5ec0c965beb412f8ee5953dfd3c8c.tar.xz |
Added Bulegiga iWRAP support into HHKB.(Bluetooth)
Diffstat (limited to 'hhkb')
-rw-r--r-- | hhkb/FUSE.txt | 40 | ||||
-rw-r--r-- | hhkb/Makefile.iwrap | 91 | ||||
-rw-r--r-- | hhkb/Makefile.pjrc (renamed from hhkb/Makefile) | 19 | ||||
-rw-r--r-- | hhkb/Makefile.vusb | 29 | ||||
-rw-r--r-- | hhkb/README | 113 | ||||
-rw-r--r-- | hhkb/config_iwrap.h | 55 | ||||
-rw-r--r-- | hhkb/config_pjrc.h | 6 | ||||
-rw-r--r-- | hhkb/config_vusb.h | 12 | ||||
-rw-r--r-- | hhkb/doc/Bluetooth.txt | 4 | ||||
-rwxr-xr-x | hhkb/doc/Bluetooth_img/.picasa.ini | 2 | ||||
-rwxr-xr-x | hhkb/doc/Bluetooth_img/BT_circuit.jpg | bin | 0 -> 502118 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/HHKB_TP1684.jpg (renamed from hhkb/doc/HHKB_TP1684.jpg) | bin | 149082 -> 149082 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/HHKB_chart1.jpg (renamed from hhkb/doc/HHKB_chart1.jpg) | bin | 155342 -> 155342 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/HHKB_chart2.jpg (renamed from hhkb/doc/HHKB_chart2.jpg) | bin | 148225 -> 148225 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/HHKB_connector.jpg (renamed from hhkb/doc/HHKB_connector.jpg) | bin | 193900 -> 193900 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/HHKB_controller.jpg (renamed from hhkb/doc/HHKB_controller.jpg) | bin | 135100 -> 135100 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/HHKB_keyswitch.jpg (renamed from hhkb/doc/HHKB_keyswitch.jpg) | bin | 171469 -> 171469 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/connector_contact.jpg (renamed from hhkb/doc/connector_contact.jpg) | bin | 192830 -> 192830 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/logic_analyzer.jpg (renamed from hhkb/doc/logic_analyzer.jpg) | bin | 169564 -> 169564 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/probe_contact.jpg (renamed from hhkb/doc/probe_contact.jpg) | bin | 208477 -> 208477 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/teensy_install.jpg (renamed from hhkb/doc/teensy_install.jpg) | bin | 135851 -> 135851 bytes | |||
-rw-r--r-- | hhkb/doc/HHKB_img/teensy_wiring.jpg (renamed from hhkb/doc/teensy_wiring.jpg) | bin | 154695 -> 154695 bytes | |||
-rw-r--r-- | hhkb/keymap.c | 115 | ||||
-rw-r--r-- | hhkb/matrix.c | 66 | ||||
-rw-r--r-- | hhkb/usbconfig.h | 16 |
25 files changed, 449 insertions, 119 deletions
diff --git a/hhkb/FUSE.txt b/hhkb/FUSE.txt new file mode 100644 index 000000000..40055e5ab --- /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 000000000..cf020b94a --- /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 e1cc2f210..17aa865dd 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 77841b824..5bfc233df 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 2a4418101..65f7dcab5 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 000000000..80ab64398 --- /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 ef2efe2d9..8379202ca 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 115b73de3..268644849 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 000000000..b27f19700 --- /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 000000000..f6a4f6067 --- /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 Binary files differnew file mode 100755 index 000000000..2e5a25e81 --- /dev/null +++ b/hhkb/doc/Bluetooth_img/BT_circuit.jpg diff --git a/hhkb/doc/HHKB_TP1684.jpg b/hhkb/doc/HHKB_img/HHKB_TP1684.jpg Binary files differindex 0a0316409..0a0316409 100644 --- a/hhkb/doc/HHKB_TP1684.jpg +++ b/hhkb/doc/HHKB_img/HHKB_TP1684.jpg diff --git a/hhkb/doc/HHKB_chart1.jpg b/hhkb/doc/HHKB_img/HHKB_chart1.jpg Binary files differindex 1f09bd185..1f09bd185 100644 --- a/hhkb/doc/HHKB_chart1.jpg +++ b/hhkb/doc/HHKB_img/HHKB_chart1.jpg diff --git a/hhkb/doc/HHKB_chart2.jpg b/hhkb/doc/HHKB_img/HHKB_chart2.jpg Binary files differindex 45f5ada90..45f5ada90 100644 --- a/hhkb/doc/HHKB_chart2.jpg +++ b/hhkb/doc/HHKB_img/HHKB_chart2.jpg diff --git a/hhkb/doc/HHKB_connector.jpg b/hhkb/doc/HHKB_img/HHKB_connector.jpg Binary files differindex e8a09e9b2..e8a09e9b2 100644 --- a/hhkb/doc/HHKB_connector.jpg +++ b/hhkb/doc/HHKB_img/HHKB_connector.jpg diff --git a/hhkb/doc/HHKB_controller.jpg b/hhkb/doc/HHKB_img/HHKB_controller.jpg Binary files differindex e3dae8e86..e3dae8e86 100644 --- a/hhkb/doc/HHKB_controller.jpg +++ b/hhkb/doc/HHKB_img/HHKB_controller.jpg diff --git a/hhkb/doc/HHKB_keyswitch.jpg b/hhkb/doc/HHKB_img/HHKB_keyswitch.jpg Binary files differindex 3afc269e7..3afc269e7 100644 --- a/hhkb/doc/HHKB_keyswitch.jpg +++ b/hhkb/doc/HHKB_img/HHKB_keyswitch.jpg diff --git a/hhkb/doc/connector_contact.jpg b/hhkb/doc/HHKB_img/connector_contact.jpg Binary files differindex 5304bc8d7..5304bc8d7 100644 --- a/hhkb/doc/connector_contact.jpg +++ b/hhkb/doc/HHKB_img/connector_contact.jpg diff --git a/hhkb/doc/logic_analyzer.jpg b/hhkb/doc/HHKB_img/logic_analyzer.jpg Binary files differindex f1b438ae7..f1b438ae7 100644 --- a/hhkb/doc/logic_analyzer.jpg +++ b/hhkb/doc/HHKB_img/logic_analyzer.jpg diff --git a/hhkb/doc/probe_contact.jpg b/hhkb/doc/HHKB_img/probe_contact.jpg Binary files differindex dc79afa0c..dc79afa0c 100644 --- a/hhkb/doc/probe_contact.jpg +++ b/hhkb/doc/HHKB_img/probe_contact.jpg diff --git a/hhkb/doc/teensy_install.jpg b/hhkb/doc/HHKB_img/teensy_install.jpg Binary files differindex 873d988ed..873d988ed 100644 --- a/hhkb/doc/teensy_install.jpg +++ b/hhkb/doc/HHKB_img/teensy_install.jpg diff --git a/hhkb/doc/teensy_wiring.jpg b/hhkb/doc/HHKB_img/teensy_wiring.jpg Binary files differindex 1c4eb6743..1c4eb6743 100644 --- a/hhkb/doc/teensy_wiring.jpg +++ b/hhkb/doc/HHKB_img/teensy_wiring.jpg diff --git a/hhkb/keymap.c b/hhkb/keymap.c index f539a06cc..85a7c31b7 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 a77febb29..350066b90 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 e8283505e..c3aad34be 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__ */ |