* [hhkb](keyboard/hhkb/) - [Happy Hacking Keyboard professional][GH_hhkb]
* [macway](keyboard/macway/) - [Compact keyboard mod][GH_macway]
* [hbkb](keyboard/hbkb/) - [Happy Buckling sprint keyboard(IBM Model M mod)][GH_hbkb]
-* [IIgs_Standard](keyboard/IIgs_Standard/) - Apple [IIGS] keyboard mod(by JeffreySung)
+* [IIgs_Standard](keyboard/IIgs/) - Apple [IIGS] keyboard mod(by JeffreySung)
* [hid_liber](keyboard/hid_liber/) - [HID liberation controller][HID_liber](by alaricljs)
* [phantom](keyboard/phantom/) - [Phantom keyboard][PHANTOM] (by Tranquilite)
* [gh60](keyboard/gh60/) - [GH60 keyboard][GH60]
return keycode_to_action(keycode);
}
}
-
-__attribute__ ((weak))
-const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; }
-
-__attribute__ ((weak))
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {}
#else
/*
* legacy keymap support
return keycode_to_action(keycode);
}
}
-/* not used for legacy keymap */
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-}
#endif
+__attribute__ ((weak))
+const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; }
+
+__attribute__ ((weak))
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {}
+
+
+
/* translates keycode to action */
static action_t keycode_to_action(uint8_t keycode)
--- /dev/null
+# Target file name (without extension).
+TARGET = m0110_lufa
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# keyboard dependent files
+SRC = keymap.c \
+ matrix.c \
+ led.c \
+ m0110.c
+
+CONFIG_H = config.h
+
+
+# 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 = at90usb162 # Teensy 1.0
+MCU = atmega32u4 # Teensy 2.0
+#MCU = at90usb646 # Teensy++ 1.0
+#MCU = at90usb1286 # Teensy++ 2.0
+
+
+# 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 = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Build Options
+# *Comment out* to disable the options.
+#
+MOUSEKEY_ENABLE = yes # Mouse keys
+#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+#NKRO_ENABLE = yes # USB Nkey Rollover
+
+
+# Boot Section Size in bytes
+# Teensy halfKay 512
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+OPT_DEFS += -DBOOT_SIZE=4096
+
+
+
+#---------------- Programming Options --------------------------
+PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+
+include $(TOP_DIR)/protocol/lufa.mk
+include $(TOP_DIR)/protocol.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
+
+hasu: EXTRAFLAGS += -DHASU
+hasu: all
$ git clone git://github.com/tmk/tmk_keyboard.git (or download source)
$ cd m0110_usb
- $ make
+ $ make -f Makefile.lufa clean
+ $ make -f Makefile.lufa
and program your Teensy with [PJRC Teensy loader](http://www.pjrc.com/teensy/loader.html).
|---------------------------------------------------------| |---------------|
|Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
`---------------------------------------------------------' |-----------|Ent|
- |Alt|Gui | Space |Ctl |Alt| | 0| .| |
+ |Ctl|Alt | Space |Gui |Ctl| | 0| .| |
`-----------------------------------------------' `---------------'
#### *HHKB/WASD Layer(WASD/IJKL)*
,---------------------------------------------------------. ,---------------.
|---------------------------------------------------------| |---------------|
|Shift |End| |PgD| | | |PgD| |End| |Shift | | 1| 2| 3| |
`---------------------------------------------------------' |-----------|Ent|
- |Alt|Gui | Space |Ctl |Alt| | 0| .| |
+ |Ctl|Alt | Space |Gui |Ctl| | 0| .| |
`-----------------------------------------------' `---------------'
### M0110A
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0110
+#define DEVICE_VER 0x0100
#define MANUFACTURER t.m.k.
#define PRODUCT M0110 keyboard converter
#define DESCRIPTION convert M0110 keyboard to USB
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
-#include "usb_keyboard.h"
#include "keycode.h"
#include "print.h"
#include "debug.h"
* |---------------------------------------------------------| |---------------|
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
* |---------------------------------------------------------| |-----------|Ent|
- * |Alt |Gui | Space |Ctl| \|Lft|Rgt|Dn | | 0| .| |
+ * |Ctl |Alt | Space |Gui| \|Lft|Rgt|Dn | | 0| .| |
* `---------------------------------------------------------' `---------------'
*/
KEYMAP(
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
FN0, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS,
LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT,
- LALT,LGUI, SPC, LCTL,BSLS,LEFT,RGHT,DOWN, P0, PDOT
+ LCTL,LALT, SPC, LGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT
),
/* Cursor Layer(WASD, IJKL)
* ,---------------------------------------------------------. ,---------------.
* |---------------------------------------------------------| |---------------|
* |Shift |End| |PgD| | | |PgD| |End| |Shif|PgU| | 1| 2| 3| |
* |---------------------------------------------------------| |-----------|Ent|
- * |Alt |Gui | Space |Gui |Ins|Hom|End|PgD| | 0| .| |
+ * |Ctl |Alt | Space |Gui |Ins|Hom|End|PgD| | 0| .| |
* `---------------------------------------------------------' `---------------'
*/
KEYMAP(
CAPS,HOME,UP, PGUP,NO, NO, NO, PGUP,UP, HOME,PSCR,SLCK,PAUS, P7, P8, P9, PMNS,
FN0, LEFT,DOWN,RGHT,NO, NO, NO, LEFT,DOWN,RGHT,NO, NO, ENT, P4, P5, P6, PPLS,
LSFT,END, NO, PGDN,NO, NO, NO, PGDN,NO, END, NO, PGUP, P1, P2, P3, PENT,
- LALT,LGUI, SPC, LCTL,INS, HOME,END, PGDN, P0, PDOT
+ LCTL,LALT, SPC, LGUI,INS, HOME,END, PGDN, P0, PDOT
),
};
ACTION_KEYMAP_TAP_TOGGLE(0), // FN0
ACTION_KEYMAP_TAP_KEY(1, KC_SLASH), // FN1
ACTION_KEYMAP_TAP_KEY(2, KC_SCLN), // FN2
- ACTION_KEYMAP(2), // FN3
+ ACTION_KEYMAP_MOMENTARY(2), // FN3
ACTION_MACRO(LBRACKET), // FN4
ACTION_MACRO(RBRACKET), // FN5
ACTION_MACRO(DUMMY), // FN6
--- /dev/null
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+# Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+# (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+# have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+# have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+# (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+# (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+# with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = IIgs_Standard
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# keyboard dependent files
+SRC = keymap.c \
+ matrix.c \
+ led.c
+
+CONFIG_H = config.h
+
+
+# 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 = at90usb162 # Teensy 1.0
+#MCU = atmega32u4 # Teensy 2.0
+#MCU = at90usb646 # Teensy++ 1.0
+MCU = at90usb1286 # Teensy++ 2.0
+
+
+# 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 = 16000000
+
+
+# Build Options
+# comment out to disable the options.
+#
+MOUSEKEY_ENABLE = no # Mouse keys
+#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
+EXTRAKEY_ENABLE = yes # Audio control and System control
+#NKRO_ENABLE = yes # USB Nkey Rollover
+
+
+
+#---------------- Programming Options --------------------------
+PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
+
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/pjrc.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
--- /dev/null
+Replacable USB Controller for Apple IIgs/Standard(M0116)\r
+JeffreySung(nattyman@gmail.com)\r
+\r
+===============================\r
+\r
+Feature\r
+-------\r
+- Replaceable keyboard controller for Apple IIgs(A9M0330)/Standard(M0116)\r
+- Teensy++ 2.0 required\r
+- Some signal bypass required\r
+- ADB keyboard doesn't use matrix for modifier keys. With virtual row for modifier keys, \r
+ these keys are merged into key matrix using virtual row.\r
+ \r
+History\r
+=======\r
+- 2012.09.17 First Release\r
+- 2012.09.17 CapsLock support\r
+- 2012.09.19 Power button added\r
+Build\r
+=====\r
+0. Just Type "Make" and return.\r
+\r
+Hardware\r
+========\r
+PJRC Teensy\r
+-----------\r
+0. The following ports should not be connected to board.\r
+ From top view of Teensy++, from GND and counter clock wise.\r
+ -7,26(in keyboard PCB, these pins are VDD,GND)\r
+ -30,31(in Teensy++, these pins are Ref,GND respectively)\r
+ -5,6(D2,D3 for bluetooth in future)\r
+1. Bypass #31 pin(from board) to E4(Teensy)\r
+2. Bypass #30 pin(from board) to F2(Teensy)\r
+3. Bypass #6 pin(from board) to A0(Teensy)\r
+4. Refer doc directory\r
+\r
+To Do\r
+=====\r
+0. When DEBOUNCE defined, there is a errors.\r
+1. Layer Change by toggling Clear Key\r
+2. Eject Key add. (following files should be modified.)\r
+ common/keycode.h\r
+ common/keyboard.c\r
+3. Use bluetooth\r
+EOF\r
--- /dev/null
+/*\r
+Copyright 2011 Jun Wako <wakojun@gmail.com>\r
+\r
+This program is free software: you can redistribute it and/or modify\r
+it under the terms of the GNU General Public License as published by\r
+the Free Software Foundation, either version 2 of the License, or\r
+(at your option) any later version.\r
+\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+GNU General Public License for more details.\r
+\r
+You should have received a copy of the GNU General Public License\r
+along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+*/\r
+\r
+#ifndef CONFIG_H\r
+#define CONFIG_H\r
+\r
+/* controller configuration */\r
+#include "controller_teensy.h"\r
+\r
+\r
+/* USB Device descriptor parameter */\r
+/* for Apple \r
+#define VENDOR_ID 0x05AC\r
+#define PRODUCT_ID 0xBEE0\r
+*/\r
+#define VENDOR_ID 0xFEED\r
+#define PRODUCT_ID 0xBEE0\r
+#define DEVICE_VER 0x0202\r
+#define MANUFACTURER t.m.k.\r
+#define PRODUCT Apple Desktop Bus Keyboard\r
+\r
+\r
+/* message strings */\r
+#define DESCRIPTION Apple M0116/A9M0660 keyboard firmware\r
+\r
+\r
+/* matrix size */\r
+#define MATRIX_ROWS 11 // last row is virtual for modifier\r
+#define MATRIX_COLS 8\r
+/* define if matrix has ghost */\r
+#define MATRIX_HAS_GHOST\r
+/* Set 0 if need no debouncing */\r
+#define DEBOUNCE 5\r
+\r
+\r
+/* key combination for command */\r
+#define IS_COMMAND() ( \\r
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LCTRL) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LGUI)) || \\r
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \\r
+)\r
+\r
+\r
+/* layer switching */\r
+#define LAYER_SWITCH_DELAY 100\r
+#define LAYER_SEND_FN_TERM 300\r
+\r
+\r
+/* mouse keys */\r
+#ifdef MOUSEKEY_ENABLE\r
+# define MOUSEKEY_DELAY_TIME 192\r
+#endif\r
+\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright 2012 Jeffrey Sung <nattyman@gmail.com>\r
+\r
+This program is free software: you can redistribute it and/or modify\r
+it under the terms of the GNU General Public License as published by\r
+the Free Software Foundation, either version 2 of the License, or\r
+(at your option) any later version.\r
+\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+GNU General Public License for more details.\r
+\r
+You should have received a copy of the GNU General Public License\r
+along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+*/\r
+\r
+/* \r
+ * Keymap for Apple IIgs/Standard Keyboard\r
+ */\r
+#include <stdint.h>\r
+#include <stdbool.h>\r
+#include <avr/pgmspace.h>\r
+#include "keycode.h"\r
+#include "print.h"\r
+#include "debug.h"\r
+#include "util.h"\r
+#include "keymap.h"\r
+\r
+\r
+// Convert physical keyboard layout to matrix array.\r
+// This is a macro to define keymap easily in keyboard layout form.\r
+#define KEYMAP( R10C5, \\r
+ R3C7, R3C6, R3C5, R3C4, R3C3, R3C2, R3C1, R8C1, R8C0, R3C0, R0C0, R0C1, R0C2, R0C3, R4C4, R4C5, R4C6, R4C7, \\r
+ R9C7, R9C6, R9C5, R9C4, R9C3, R9C2, R9C1, R9C0, R1C0, R1C1, R1C2, R1C3, R1C4, R2C4, R2C5, R2C6, R2C3, \\r
+ R10C0,R7C7, R7C6, R7C5, R7C4, R7C3, R7C2, R7C1, R7C0, R0C4, R1C6, R1C7, R1C5, R2C0, R2C1, R2C2, R2C7, \\r
+ R10C1,R6C7, R6C6, R6C5, R6C4, R6C3, R6C2, R6C1, R6C0, R0C5, R0C6, R4C0, R4C1, R4C2, \\r
+ R10C4,R10C2,R10C3,R5C4, R5C7, R5C5, R5C6, R5C0, R5C2, R0C7, R5C1, R5C3, R4C3 \\r
+) { \\r
+ { R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \\r
+ { R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \\r
+ { R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, R2C7 }, \\r
+ { R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \\r
+ { R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, R4C7 }, \\r
+ { R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \\r
+ { R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, R6C7 }, \\r
+ { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, R7C7 }, \\r
+ { R8C0, R8C1, KC_NO, KC_NO, KC_NO,KC_NO, KC_NO, KC_NO }, \\r
+ { R9C0, R9C1, R9C2, R9C3, R9C4, R9C5, R9C6, R9C7 }, \\r
+ { R10C0,R10C1, R10C2, R10C3, R10C4,R10C5, KC_NO, KC_NO} \\r
+}\r
+\r
+#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))\r
+\r
+\r
+// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.\r
+static const uint8_t PROGMEM fn_layer[] = {\r
+ 0, // Fn0\r
+ 1, // Fn1\r
+ 2, // Fn2\r
+ 3, // Fn3\r
+ 4, // Fn4\r
+ 0, // Fn5\r
+ 3, // Fn6\r
+ 3 // Fn7\r
+};\r
+\r
+// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.\r
+// See layer.c for details.\r
+static const uint8_t PROGMEM fn_keycode[] = {\r
+ KC_NO, // Fn0\r
+ KC_NO, // Fn1\r
+ KC_SLSH, // Fn2\r
+ KC_SCLN, // Fn3\r
+ KC_SPC, // Fn4\r
+ KC_NO, // Fn5\r
+ KC_NO, // Fn6\r
+ KC_NO // Fn7\r
+};\r
+\r
+static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\r
+ /* Layer 0: Default Layer\r
+ * ,-----------------------------------------------------------. ,---------------,\r
+ * | POWER | | | \r
+ * |-----------------------------------------------------------| |---------------|\r
+ * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |FN0| = | / | * |\r
+ * |-----------------------------------------------------------| |---------------|\r
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7 | 8 | 9 | + |\r
+ * |-----------------------------------------------------' | |---------------|\r
+ * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | | 4 | 5 | 6 | - |\r
+ * |-----------------------------------------------------------| |---------------|\r
+ * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | | 1 | 2 | 3 | E |\r
+ * |-----------------------------------------------------------| |-----------| N |\r
+ * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T |\r
+ * `-----------------------------------------------------------' |---------------'\r
+ */\r
+ KEYMAP( KC_PWR,\r
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_PAST, \\r
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PPLS, \\r
+ KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_P4, KC_P5, KC_P6, KC_PMNS, \\r
+ KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_P1, KC_P2, KC_P3, \\r
+ KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT),\r
+\r
+\r
+ /* Layer 1: Tenkey use Layer\r
+ * ,-----------------------------------------------------------. ,---------------,\r
+ * | POWER | | | \r
+ * |-----------------------------------------------------------| |---------------|\r
+ * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |NLK| = | / | * |\r
+ * |-----------------------------------------------------------| |---------------|\r
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |INS| 8 |PGU|V+ |\r
+ * |-----------------------------------------------------' | |---------------|\r
+ * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | |DEL|UP |PGD|V- |\r
+ * |-----------------------------------------------------------| |---------------|\r
+ * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | |LFT|DN |RGT| E |\r
+ * |-----------------------------------------------------------| |-----------| N |\r
+ * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T |\r
+ * `-----------------------------------------------------------' `---------------'\r
+ */\r
+ KEYMAP( KC_PWR, \\r
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_MUTE, \\r
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_INS, KC_P8, KC_PGUP, KC_VOLU, \\r
+ KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_DEL, KC_UP, KC_PGDN, KC_VOLD, \\r
+ KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_LEFT, KC_DOWN, KC_RIGHT, \\r
+ KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT),\r
+};\r
+\r
+\r
+uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)\r
+{\r
+ return KEYCODE(layer, row, col);\r
+}\r
+\r
+uint8_t keymap_fn_layer(uint8_t index)\r
+{\r
+ return pgm_read_byte(&fn_layer[index]);\r
+}\r
+\r
+uint8_t keymap_fn_keycode(uint8_t index)\r
+{\r
+ return pgm_read_byte(&fn_keycode[index]);\r
+}\r
--- /dev/null
+/*
+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/>.
+*/
+
+#include "stdint.h"
+#include "led.h"
+
+
+void led_set(uint8_t usb_led)
+{
+}
--- /dev/null
+/*
+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/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <util/delay.h>
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "led.h"
+
+
+#if (MATRIX_COLS > 16)
+# error "MATRIX_COLS must not exceed 16"
+#endif
+#if (MATRIX_ROWS > 255)
+# error "MATRIX_ROWS must not exceed 255"
+#endif
+
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 0
+#endif
+static uint8_t debouncing = DEBOUNCE;
+
+// matrix state buffer(1:on, 0:off)
+#if (MATRIX_COLS <= 8)
+static uint8_t *matrix;
+static uint8_t *matrix_prev;
+static uint8_t _matrix0[MATRIX_ROWS];
+static uint8_t _matrix1[MATRIX_ROWS];
+#else
+static uint16_t *matrix;
+static uint16_t *matrix_prev;
+static uint16_t _matrix0[MATRIX_ROWS];
+static uint16_t _matrix1[MATRIX_ROWS];
+#endif
+
+#ifdef MATRIX_HAS_GHOST
+static bool matrix_has_ghost_in_row(uint8_t row);
+#endif
+static uint8_t read_col(uint8_t row);
+static void unselect_rows(void);
+static void select_row(uint8_t row);
+
+
+inline
+uint8_t matrix_rows(void)
+{
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+ return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+ // initialize row and col
+ unselect_rows();
+ // Input with pull-up(DDR:0, PORT:1)
+ // Column C1 ~ C7 (PortC0-6)
+ // Column C0(Port E1)
+ DDRC &= ~0b01111111;
+ PORTC |= 0b01111111;
+ DDRE &= ~0b00000010;
+ PORTE |= 0b00000010;
+ //DDRB &= ~0b00000100;
+ //PORTB |= 0b00000100;
+ // modifier B3/4,F4/5,E4 always input
+ // A0
+ //DDRA |= 0b00000001;
+ //PORTA &= 0b00000001;
+ //DDRB |= 0b00011000;
+ //PORTB &= 0b00011000;
+ //DDRF |= ~0b00110000;
+ //PORTF &= 0b00110000;
+ //DDRB &= ~0b00011000;
+ //PORTB |= 0b00011000;
+ //DDRF &= ~0b00110000;
+ //PORTF |= 0b00110000;
+ //DDRE &= ~0b00010000;
+ //PORTE |= 0b00010000;
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
+ matrix = _matrix0;
+ matrix_prev = _matrix1;
+}
+
+uint8_t matrix_scan(void)
+{
+ if (!debouncing) {
+ uint8_t *tmp = matrix_prev;
+ matrix_prev = matrix;
+ matrix = tmp;
+ }
+
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ unselect_rows();
+ select_row(i);
+ _delay_us(30); // without this wait read unstable value.
+ if ( i == ( MATRIX_ROWS - 1 ) ) { // CHECK CAPS LOCK
+ if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { // CAPS LOCK is ON on HOST
+ if ( ~read_col(i) & (1<< 4) ) { // CAPS LOCK is still DOWN ( 0bXXX1_XXXX)
+ matrix[i] = ~read_col(i) & 0b11101111; // change CAPS LOCK as released
+ } else { // CAPS LOCK in UP
+ matrix[i] = ~read_col(i) | 0b00010000; // send fake caps lock down
+ }
+ } else { // CAPS LOCK is OFF on HOST
+ if (matrix[i] != (uint8_t)~read_col(i)) {
+ matrix[i] = (uint8_t)~read_col(i);
+ if (debouncing) {
+ debug("bounce!: "); debug_hex(debouncing); print("\n");
+ }
+ debouncing = DEBOUNCE;
+ }
+ }
+ } else {
+ if (matrix[i] != (uint8_t)~read_col(i)) {
+ matrix[i] = (uint8_t)~read_col(i);
+ if (debouncing) {
+ debug("bounce!: "); debug_hex(debouncing); print("\n");
+ }
+ debouncing = DEBOUNCE;
+ }
+ }
+ }
+ unselect_rows();
+
+ if (debouncing) {
+ debouncing--;
+ }
+
+ return 1;
+}
+
+bool matrix_is_modified(void)
+{
+ if (debouncing) return false;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ if (matrix[i] != matrix_prev[i]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+inline
+bool matrix_has_ghost(void)
+{
+#ifdef MATRIX_HAS_GHOST
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ if (matrix_has_ghost_in_row(i))
+ return true;
+ }
+#endif
+ return false;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+// if ( row == ( MATRIX_ROWS - 1 ) && col == 4) { // CHECK CAPS LOCK
+// if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { // CAPS LOCK is ON on HOST
+// if ((matrix_prev[row] & 0b00010000) && (~matrix[row] & 0b00010000)) {
+// debug("CapsLock Reverse:");debug_hex(matrix[row]);
+// matrix[row] |= 0b00010000;
+// matrix_prev[row] &= ~0b00010000;
+// debug("->");debug_hex(matrix[row]);debug("\n");
+// }
+// }
+// }
+ return (matrix[row] & (1<<col));
+}
+
+inline
+#if (MATRIX_COLS <= 8)
+uint8_t matrix_get_row(uint8_t row)
+#else
+uint16_t matrix_get_row(uint8_t row)
+#endif
+{
+ return matrix[row];
+}
+
+void matrix_print(void)
+{
+ print("\nr/c 01234567\n");
+ for (uint8_t row = 0; row < matrix_rows(); row++) {
+ phex(row); print(": ");
+#if (MATRIX_COLS <= 8)
+ pbin_reverse(matrix_get_row(row));
+#else
+ pbin_reverse16(matrix_get_row(row));
+#endif
+#ifdef MATRIX_HAS_GHOST
+ if (matrix_has_ghost_in_row(row)) {
+ print(" <ghost");
+ }
+#endif
+ print("\n");
+ }
+}
+
+uint8_t matrix_key_count(void)
+{
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+#if (MATRIX_COLS <= 8)
+ count += bitpop(matrix[i]);
+#else
+ count += bitpop16(matrix[i]);
+#endif
+ }
+ return count;
+}
+
+#ifdef MATRIX_HAS_GHOST
+inline
+static bool matrix_has_ghost_in_row(uint8_t row)
+{
+ // no ghost exists in case less than 2 keys on
+ if (((matrix[row] - 1) & matrix[row]) == 0)
+ return false;
+
+ // ghost exists in case same state as other row
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ if (i != row && (matrix[i] & matrix[row]) == matrix[row])
+ return true;
+ }
+ return false;
+}
+#endif
+
+inline
+static uint8_t read_col(uint8_t row)
+{
+ // For normal : Column C1 ~ C7 (PortC0-6), C0(Port E1)
+ // For modifier : B3(CNTRL)/4(SHIFT),F4(CMD/GUI)/5(OPTION,ALT)
+ // Modifier would be copied to report->mods except E4(CAPSLOCK)
+ uint8_t tmp;
+ if ( row == 10 ) {
+ tmp = 0xC0;
+ tmp |= (PINB >> 3 ) & 0b00000011; // LEFT CTRL is 0bit in modifier (HID Spec)
+ // LEFT SHIFT is 1bit in modifier (HID Spec)
+ tmp |= (PINF >> 3 ) & 0b00000100; // LEFT ALT is 2bit in modifier (HID Spec)
+ tmp |= (PINF >> 1 ) & 0b00001000; // LEFT GUI is 3bit in modifier (HID Spec)
+ tmp |= (PINA << 4 ) & 0b00010000; // CAPSLOCK
+ tmp |= (PINB << 3 ) & 0b00100000; // POWER
+ } else {
+ tmp = 0x00;
+ tmp = (PINE >> 1)&0b00000001;
+ tmp |= PINC << 1 ;
+ }
+ return tmp;
+}
+
+inline
+static void unselect_rows(void)
+{
+ // Hi-Z(DDR:0, PORT:0) to unselect
+ // DDR : 1, output 0, input
+ DDRB &= ~0b00000011; // PB: 1,0
+ PORTB &= ~0b00000011;
+ DDRD &= ~0b00010000; // PD: 4
+ PORTD &= ~0b00010000;
+ DDRE &= ~0b11000000; // PE: 7,6
+ PORTE &= ~0b11000000;
+ DDRF &= ~0b11000111; // PF: 7,6,2,1,0
+ PORTF &= ~0b11000111;
+ // to unselect virtual row(modifier), set port to output with low
+ DDRA |= 0b00000001; // PA: 0 for CAPSLOCK
+ PORTA &= ~0b00000001;
+ DDRB |= 0b00011100; // PB: 3,4 for modifier(row10)
+ PORTB &= ~0b00011100; // PB: 2 for power
+ DDRF |= 0b00110000; // PF: 4,5 for modifier
+ PORTF &= ~0b00110000;
+}
+
+inline
+static void select_row(uint8_t row)
+{
+ // Output low(DDR:1, PORT:0) to select
+ // with row enable, column could send low to AVR when pressed
+ // row: 0 1 2 3 4 5 6 7 8 9
+ // pin: PB1, PB0, PE7, PE6, PD4, PF2, PF0, PF1, PF6 PF7
+ switch (row) {
+ case 0:
+ DDRB |= (1<<1);
+ PORTB &= ~(1<<1);
+ break;
+ case 1:
+ DDRB |= (1<<0);
+ PORTB &= ~(1<<0);
+ break;
+ case 2:
+ DDRE |= (1<<7);
+ PORTE &= ~(1<<7);
+ break;
+ case 3:
+ DDRE |= (1<<6);
+ PORTE &= ~(1<<6);
+ break;
+ case 4:
+ DDRD |= (1<<4);
+ PORTD &= ~(1<<4);
+ break;
+ case 5:
+ DDRF |= (1<<2);
+ PORTF &= ~(1<<2);
+ break;
+ case 6:
+ DDRF |= (1<<0);
+ PORTF &= ~(1<<0);
+ break;
+ case 7:
+ DDRF |= (1<<1);
+ PORTF &= ~(1<<1);
+ break;
+ case 8:
+ DDRF |= (1<<6);
+ PORTF &= ~(1<<6);
+ break;
+ case 9:
+ DDRF |= (1<<7);
+ PORTF &= ~(1<<7);
+ break;
+ case 10:
+ // modifier has no row enable
+ // to select virtual row, set port as input
+ DDRA &= ~0b00000001;
+ PORTA |= 0b00000001;
+ DDRB &= ~0b00011100;
+ PORTB |= 0b00011100;
+ DDRF &= ~0b00110000;
+ PORTF |= 0b00110000;
+ break;
+
+ }
+}
+++ /dev/null
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make coff = Convert ELF to AVR COFF.
-#
-# make extcoff = Convert ELF to AVR Extended COFF.
-#
-# make program = Download the hex file to the device.
-# Please customize your programmer settings(PROGRAM_CMD)
-#
-# make teensy = Download the hex file to the device, using teensy_loader_cli.
-# (must have teensy_loader_cli installed).
-#
-# make dfu = Download the hex file to the device, using dfu-programmer (must
-# have dfu-programmer installed).
-#
-# make flip = Download the hex file to the device, using Atmel FLIP (must
-# have Atmel FLIP installed).
-#
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
-# (must have dfu-programmer installed).
-#
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
-# (must have Atmel FLIP installed).
-#
-# make debug = Start either simulavr or avarice as specified for debugging,
-# with avr-gdb or avr-insight as the front end for debugging.
-#
-# make filename.s = Just compile filename.c into the assembler code only.
-#
-# make filename.i = Create a preprocessed source file for use in submitting
-# bug reports to the GCC project.
-#
-# To rebuild project do "make clean" then "make all".
-#----------------------------------------------------------------------------
-
-# Target file name (without extension).
-TARGET = IIgs_Standard
-
-# Directory common source filess exist
-TOP_DIR = ../..
-
-# Directory keyboard dependent files exist
-TARGET_DIR = .
-
-# keyboard dependent files
-SRC = keymap.c \
- matrix.c \
- led.c
-
-CONFIG_H = config.h
-
-
-# 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 = at90usb162 # Teensy 1.0
-#MCU = atmega32u4 # Teensy 2.0
-#MCU = at90usb646 # Teensy++ 1.0
-MCU = at90usb1286 # Teensy++ 2.0
-
-
-# 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 = 16000000
-
-
-# Build Options
-# comment out to disable the options.
-#
-MOUSEKEY_ENABLE = no # Mouse keys
-#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
-EXTRAKEY_ENABLE = yes # Audio control and System control
-#NKRO_ENABLE = yes # USB Nkey Rollover
-
-
-
-#---------------- Programming Options --------------------------
-PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
-
-
-
-# Search Path
-VPATH += $(TARGET_DIR)
-VPATH += $(TOP_DIR)
-
-include $(TOP_DIR)/protocol/pjrc.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
+++ /dev/null
-Replacable USB Controller for Apple IIgs/Standard(M0116)\r
-JeffreySung(nattyman@gmail.com)\r
-\r
-===============================\r
-\r
-Feature\r
--------\r
-- Replaceable keyboard controller for Apple IIgs(A9M0330)/Standard(M0116)\r
-- Teensy++ 2.0 required\r
-- Some signal bypass required\r
-- ADB keyboard doesn't use matrix for modifier keys. With virtual row for modifier keys, \r
- these keys are merged into key matrix using virtual row.\r
- \r
-History\r
-=======\r
-- 2012.09.17 First Release\r
-- 2012.09.17 CapsLock support\r
-- 2012.09.19 Power button added\r
-Build\r
-=====\r
-0. Just Type "Make" and return.\r
-\r
-Hardware\r
-========\r
-PJRC Teensy\r
------------\r
-0. The following ports should not be connected to board.\r
- From top view of Teensy++, from GND and counter clock wise.\r
- -7,26(in keyboard PCB, these pins are VDD,GND)\r
- -30,31(in Teensy++, these pins are Ref,GND respectively)\r
- -5,6(D2,D3 for bluetooth in future)\r
-1. Bypass #31 pin(from board) to E4(Teensy)\r
-2. Bypass #30 pin(from board) to F2(Teensy)\r
-3. Bypass #6 pin(from board) to A0(Teensy)\r
-4. Refer doc directory\r
-\r
-To Do\r
-=====\r
-0. When DEBOUNCE defined, there is a errors.\r
-1. Layer Change by toggling Clear Key\r
-2. Eject Key add. (following files should be modified.)\r
- common/keycode.h\r
- common/keyboard.c\r
-3. Use bluetooth\r
-EOF\r
+++ /dev/null
-/*\r
-Copyright 2011 Jun Wako <wakojun@gmail.com>\r
-\r
-This program is free software: you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation, either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-This program is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with this program. If not, see <http://www.gnu.org/licenses/>.\r
-*/\r
-\r
-#ifndef CONFIG_H\r
-#define CONFIG_H\r
-\r
-/* controller configuration */\r
-#include "controller_teensy.h"\r
-\r
-\r
-/* USB Device descriptor parameter */\r
-/* for Apple \r
-#define VENDOR_ID 0x05AC\r
-#define PRODUCT_ID 0xBEE0\r
-*/\r
-#define VENDOR_ID 0xFEED\r
-#define PRODUCT_ID 0xBEE0\r
-#define DEVICE_VER 0x0202\r
-#define MANUFACTURER t.m.k.\r
-#define PRODUCT Apple Desktop Bus Keyboard\r
-\r
-\r
-/* message strings */\r
-#define DESCRIPTION Apple M0116/A9M0660 keyboard firmware\r
-\r
-\r
-/* matrix size */\r
-#define MATRIX_ROWS 11 // last row is virtual for modifier\r
-#define MATRIX_COLS 8\r
-/* define if matrix has ghost */\r
-#define MATRIX_HAS_GHOST\r
-/* Set 0 if need no debouncing */\r
-#define DEBOUNCE 5\r
-\r
-\r
-/* key combination for command */\r
-#define IS_COMMAND() ( \\r
- keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LCTRL) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LGUI)) || \\r
- keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \\r
-)\r
-\r
-\r
-/* layer switching */\r
-#define LAYER_SWITCH_DELAY 100\r
-#define LAYER_SEND_FN_TERM 300\r
-\r
-\r
-/* mouse keys */\r
-#ifdef MOUSEKEY_ENABLE\r
-# define MOUSEKEY_DELAY_TIME 192\r
-#endif\r
-\r
-\r
-#endif\r
+++ /dev/null
-/*\r
-Copyright 2012 Jeffrey Sung <nattyman@gmail.com>\r
-\r
-This program is free software: you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation, either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-This program is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with this program. If not, see <http://www.gnu.org/licenses/>.\r
-*/\r
-\r
-/* \r
- * Keymap for Apple IIgs/Standard Keyboard\r
- */\r
-#include <stdint.h>\r
-#include <stdbool.h>\r
-#include <avr/pgmspace.h>\r
-#include "keycode.h"\r
-#include "print.h"\r
-#include "debug.h"\r
-#include "util.h"\r
-#include "keymap.h"\r
-\r
-\r
-// Convert physical keyboard layout to matrix array.\r
-// This is a macro to define keymap easily in keyboard layout form.\r
-#define KEYMAP( R10C5, \\r
- R3C7, R3C6, R3C5, R3C4, R3C3, R3C2, R3C1, R8C1, R8C0, R3C0, R0C0, R0C1, R0C2, R0C3, R4C4, R4C5, R4C6, R4C7, \\r
- R9C7, R9C6, R9C5, R9C4, R9C3, R9C2, R9C1, R9C0, R1C0, R1C1, R1C2, R1C3, R1C4, R2C4, R2C5, R2C6, R2C3, \\r
- R10C0,R7C7, R7C6, R7C5, R7C4, R7C3, R7C2, R7C1, R7C0, R0C4, R1C6, R1C7, R1C5, R2C0, R2C1, R2C2, R2C7, \\r
- R10C1,R6C7, R6C6, R6C5, R6C4, R6C3, R6C2, R6C1, R6C0, R0C5, R0C6, R4C0, R4C1, R4C2, \\r
- R10C4,R10C2,R10C3,R5C4, R5C7, R5C5, R5C6, R5C0, R5C2, R0C7, R5C1, R5C3, R4C3 \\r
-) { \\r
- { R0C0, R0C1, R0C2, R0C3, R0C4, R0C5, R0C6, R0C7 }, \\r
- { R1C0, R1C1, R1C2, R1C3, R1C4, R1C5, R1C6, R1C7 }, \\r
- { R2C0, R2C1, R2C2, R2C3, R2C4, R2C5, R2C6, R2C7 }, \\r
- { R3C0, R3C1, R3C2, R3C3, R3C4, R3C5, R3C6, R3C7 }, \\r
- { R4C0, R4C1, R4C2, R4C3, R4C4, R4C5, R4C6, R4C7 }, \\r
- { R5C0, R5C1, R5C2, R5C3, R5C4, R5C5, R5C6, R5C7 }, \\r
- { R6C0, R6C1, R6C2, R6C3, R6C4, R6C5, R6C6, R6C7 }, \\r
- { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, R7C7 }, \\r
- { R8C0, R8C1, KC_NO, KC_NO, KC_NO,KC_NO, KC_NO, KC_NO }, \\r
- { R9C0, R9C1, R9C2, R9C3, R9C4, R9C5, R9C6, R9C7 }, \\r
- { R10C0,R10C1, R10C2, R10C3, R10C4,R10C5, KC_NO, KC_NO} \\r
-}\r
-\r
-#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))\r
-\r
-\r
-// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.\r
-static const uint8_t PROGMEM fn_layer[] = {\r
- 0, // Fn0\r
- 1, // Fn1\r
- 2, // Fn2\r
- 3, // Fn3\r
- 4, // Fn4\r
- 0, // Fn5\r
- 3, // Fn6\r
- 3 // Fn7\r
-};\r
-\r
-// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.\r
-// See layer.c for details.\r
-static const uint8_t PROGMEM fn_keycode[] = {\r
- KC_NO, // Fn0\r
- KC_NO, // Fn1\r
- KC_SLSH, // Fn2\r
- KC_SCLN, // Fn3\r
- KC_SPC, // Fn4\r
- KC_NO, // Fn5\r
- KC_NO, // Fn6\r
- KC_NO // Fn7\r
-};\r
-\r
-static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\r
- /* Layer 0: Default Layer\r
- * ,-----------------------------------------------------------. ,---------------,\r
- * | POWER | | | \r
- * |-----------------------------------------------------------| |---------------|\r
- * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |FN0| = | / | * |\r
- * |-----------------------------------------------------------| |---------------|\r
- * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7 | 8 | 9 | + |\r
- * |-----------------------------------------------------' | |---------------|\r
- * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | | 4 | 5 | 6 | - |\r
- * |-----------------------------------------------------------| |---------------|\r
- * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | | 1 | 2 | 3 | E |\r
- * |-----------------------------------------------------------| |-----------| N |\r
- * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T |\r
- * `-----------------------------------------------------------' |---------------'\r
- */\r
- KEYMAP( KC_PWR,\r
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_PAST, \\r
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PPLS, \\r
- KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_P4, KC_P5, KC_P6, KC_PMNS, \\r
- KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_P1, KC_P2, KC_P3, \\r
- KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT),\r
-\r
-\r
- /* Layer 1: Tenkey use Layer\r
- * ,-----------------------------------------------------------. ,---------------,\r
- * | POWER | | | \r
- * |-----------------------------------------------------------| |---------------|\r
- * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |NLK| = | / | * |\r
- * |-----------------------------------------------------------| |---------------|\r
- * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |INS| 8 |PGU|V+ |\r
- * |-----------------------------------------------------' | |---------------|\r
- * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | |DEL|UP |PGD|V- |\r
- * |-----------------------------------------------------------| |---------------|\r
- * |Shift | Z| X| C| V| B| N| M| ,| .| / |Shift | |LFT|DN |RGT| E |\r
- * |-----------------------------------------------------------| |-----------| N |\r
- * |CAPS|Alt |Gui |` |SPC |BSLS |LFT|RGT|DN|UP| | 0 | . | T |\r
- * `-----------------------------------------------------------' `---------------'\r
- */\r
- KEYMAP( KC_PWR, \\r
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_FN1, KC_PEQL, KC_PSLS, KC_MUTE, \\r
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_INS, KC_P8, KC_PGUP, KC_VOLU, \\r
- KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,KC_ENT, KC_DEL, KC_UP, KC_PGDN, KC_VOLD, \\r
- KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_LEFT, KC_DOWN, KC_RIGHT, \\r
- KC_CAPS,KC_LALT,KC_LGUI,KC_GRV, KC_SPC, KC_BSLS,KC_LEFT,KC_RGHT,KC_DOWN,KC_UP, KC_P0, KC_PDOT, KC_PENT),\r
-};\r
-\r
-\r
-uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)\r
-{\r
- return KEYCODE(layer, row, col);\r
-}\r
-\r
-uint8_t keymap_fn_layer(uint8_t index)\r
-{\r
- return pgm_read_byte(&fn_layer[index]);\r
-}\r
-\r
-uint8_t keymap_fn_keycode(uint8_t index)\r
-{\r
- return pgm_read_byte(&fn_keycode[index]);\r
-}\r
+++ /dev/null
-/*
-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/>.
-*/
-
-#include "stdint.h"
-#include "led.h"
-
-
-void led_set(uint8_t usb_led)
-{
-}
+++ /dev/null
-/*
-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/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "led.h"
-
-
-#if (MATRIX_COLS > 16)
-# error "MATRIX_COLS must not exceed 16"
-#endif
-#if (MATRIX_ROWS > 255)
-# error "MATRIX_ROWS must not exceed 255"
-#endif
-
-
-#ifndef DEBOUNCE
-# define DEBOUNCE 0
-#endif
-static uint8_t debouncing = DEBOUNCE;
-
-// matrix state buffer(1:on, 0:off)
-#if (MATRIX_COLS <= 8)
-static uint8_t *matrix;
-static uint8_t *matrix_prev;
-static uint8_t _matrix0[MATRIX_ROWS];
-static uint8_t _matrix1[MATRIX_ROWS];
-#else
-static uint16_t *matrix;
-static uint16_t *matrix_prev;
-static uint16_t _matrix0[MATRIX_ROWS];
-static uint16_t _matrix1[MATRIX_ROWS];
-#endif
-
-#ifdef MATRIX_HAS_GHOST
-static bool matrix_has_ghost_in_row(uint8_t row);
-#endif
-static uint8_t read_col(uint8_t row);
-static void unselect_rows(void);
-static void select_row(uint8_t row);
-
-
-inline
-uint8_t matrix_rows(void)
-{
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
- return MATRIX_COLS;
-}
-
-void matrix_init(void)
-{
- // initialize row and col
- unselect_rows();
- // Input with pull-up(DDR:0, PORT:1)
- // Column C1 ~ C7 (PortC0-6)
- // Column C0(Port E1)
- DDRC &= ~0b01111111;
- PORTC |= 0b01111111;
- DDRE &= ~0b00000010;
- PORTE |= 0b00000010;
- //DDRB &= ~0b00000100;
- //PORTB |= 0b00000100;
- // modifier B3/4,F4/5,E4 always input
- // A0
- //DDRA |= 0b00000001;
- //PORTA &= 0b00000001;
- //DDRB |= 0b00011000;
- //PORTB &= 0b00011000;
- //DDRF |= ~0b00110000;
- //PORTF &= 0b00110000;
- //DDRB &= ~0b00011000;
- //PORTB |= 0b00011000;
- //DDRF &= ~0b00110000;
- //PORTF |= 0b00110000;
- //DDRE &= ~0b00010000;
- //PORTE |= 0b00010000;
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
- for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
- matrix = _matrix0;
- matrix_prev = _matrix1;
-}
-
-uint8_t matrix_scan(void)
-{
- if (!debouncing) {
- uint8_t *tmp = matrix_prev;
- matrix_prev = matrix;
- matrix = tmp;
- }
-
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- unselect_rows();
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- if ( i == ( MATRIX_ROWS - 1 ) ) { // CHECK CAPS LOCK
- if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { // CAPS LOCK is ON on HOST
- if ( ~read_col(i) & (1<< 4) ) { // CAPS LOCK is still DOWN ( 0bXXX1_XXXX)
- matrix[i] = ~read_col(i) & 0b11101111; // change CAPS LOCK as released
- } else { // CAPS LOCK in UP
- matrix[i] = ~read_col(i) | 0b00010000; // send fake caps lock down
- }
- } else { // CAPS LOCK is OFF on HOST
- if (matrix[i] != (uint8_t)~read_col(i)) {
- matrix[i] = (uint8_t)~read_col(i);
- if (debouncing) {
- debug("bounce!: "); debug_hex(debouncing); print("\n");
- }
- debouncing = DEBOUNCE;
- }
- }
- } else {
- if (matrix[i] != (uint8_t)~read_col(i)) {
- matrix[i] = (uint8_t)~read_col(i);
- if (debouncing) {
- debug("bounce!: "); debug_hex(debouncing); print("\n");
- }
- debouncing = DEBOUNCE;
- }
- }
- }
- unselect_rows();
-
- if (debouncing) {
- debouncing--;
- }
-
- return 1;
-}
-
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- if (matrix[i] != matrix_prev[i]) {
- return true;
- }
- }
- return false;
-}
-
-inline
-bool matrix_has_ghost(void)
-{
-#ifdef MATRIX_HAS_GHOST
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- if (matrix_has_ghost_in_row(i))
- return true;
- }
-#endif
- return false;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
-// if ( row == ( MATRIX_ROWS - 1 ) && col == 4) { // CHECK CAPS LOCK
-// if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { // CAPS LOCK is ON on HOST
-// if ((matrix_prev[row] & 0b00010000) && (~matrix[row] & 0b00010000)) {
-// debug("CapsLock Reverse:");debug_hex(matrix[row]);
-// matrix[row] |= 0b00010000;
-// matrix_prev[row] &= ~0b00010000;
-// debug("->");debug_hex(matrix[row]);debug("\n");
-// }
-// }
-// }
- return (matrix[row] & (1<<col));
-}
-
-inline
-#if (MATRIX_COLS <= 8)
-uint8_t matrix_get_row(uint8_t row)
-#else
-uint16_t matrix_get_row(uint8_t row)
-#endif
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 01234567\n");
- for (uint8_t row = 0; row < matrix_rows(); row++) {
- phex(row); print(": ");
-#if (MATRIX_COLS <= 8)
- pbin_reverse(matrix_get_row(row));
-#else
- pbin_reverse16(matrix_get_row(row));
-#endif
-#ifdef MATRIX_HAS_GHOST
- if (matrix_has_ghost_in_row(row)) {
- print(" <ghost");
- }
-#endif
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-#if (MATRIX_COLS <= 8)
- count += bitpop(matrix[i]);
-#else
- count += bitpop16(matrix[i]);
-#endif
- }
- return count;
-}
-
-#ifdef MATRIX_HAS_GHOST
-inline
-static bool matrix_has_ghost_in_row(uint8_t row)
-{
- // no ghost exists in case less than 2 keys on
- if (((matrix[row] - 1) & matrix[row]) == 0)
- return false;
-
- // ghost exists in case same state as other row
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- if (i != row && (matrix[i] & matrix[row]) == matrix[row])
- return true;
- }
- return false;
-}
-#endif
-
-inline
-static uint8_t read_col(uint8_t row)
-{
- // For normal : Column C1 ~ C7 (PortC0-6), C0(Port E1)
- // For modifier : B3(CNTRL)/4(SHIFT),F4(CMD/GUI)/5(OPTION,ALT)
- // Modifier would be copied to report->mods except E4(CAPSLOCK)
- uint8_t tmp;
- if ( row == 10 ) {
- tmp = 0xC0;
- tmp |= (PINB >> 3 ) & 0b00000011; // LEFT CTRL is 0bit in modifier (HID Spec)
- // LEFT SHIFT is 1bit in modifier (HID Spec)
- tmp |= (PINF >> 3 ) & 0b00000100; // LEFT ALT is 2bit in modifier (HID Spec)
- tmp |= (PINF >> 1 ) & 0b00001000; // LEFT GUI is 3bit in modifier (HID Spec)
- tmp |= (PINA << 4 ) & 0b00010000; // CAPSLOCK
- tmp |= (PINB << 3 ) & 0b00100000; // POWER
- } else {
- tmp = 0x00;
- tmp = (PINE >> 1)&0b00000001;
- tmp |= PINC << 1 ;
- }
- return tmp;
-}
-
-inline
-static void unselect_rows(void)
-{
- // Hi-Z(DDR:0, PORT:0) to unselect
- // DDR : 1, output 0, input
- DDRB &= ~0b00000011; // PB: 1,0
- PORTB &= ~0b00000011;
- DDRD &= ~0b00010000; // PD: 4
- PORTD &= ~0b00010000;
- DDRE &= ~0b11000000; // PE: 7,6
- PORTE &= ~0b11000000;
- DDRF &= ~0b11000111; // PF: 7,6,2,1,0
- PORTF &= ~0b11000111;
- // to unselect virtual row(modifier), set port to output with low
- DDRA |= 0b00000001; // PA: 0 for CAPSLOCK
- PORTA &= ~0b00000001;
- DDRB |= 0b00011100; // PB: 3,4 for modifier(row10)
- PORTB &= ~0b00011100; // PB: 2 for power
- DDRF |= 0b00110000; // PF: 4,5 for modifier
- PORTF &= ~0b00110000;
-}
-
-inline
-static void select_row(uint8_t row)
-{
- // Output low(DDR:1, PORT:0) to select
- // with row enable, column could send low to AVR when pressed
- // row: 0 1 2 3 4 5 6 7 8 9
- // pin: PB1, PB0, PE7, PE6, PD4, PF2, PF0, PF1, PF6 PF7
- switch (row) {
- case 0:
- DDRB |= (1<<1);
- PORTB &= ~(1<<1);
- break;
- case 1:
- DDRB |= (1<<0);
- PORTB &= ~(1<<0);
- break;
- case 2:
- DDRE |= (1<<7);
- PORTE &= ~(1<<7);
- break;
- case 3:
- DDRE |= (1<<6);
- PORTE &= ~(1<<6);
- break;
- case 4:
- DDRD |= (1<<4);
- PORTD &= ~(1<<4);
- break;
- case 5:
- DDRF |= (1<<2);
- PORTF &= ~(1<<2);
- break;
- case 6:
- DDRF |= (1<<0);
- PORTF &= ~(1<<0);
- break;
- case 7:
- DDRF |= (1<<1);
- PORTF &= ~(1<<1);
- break;
- case 8:
- DDRF |= (1<<6);
- PORTF &= ~(1<<6);
- break;
- case 9:
- DDRF |= (1<<7);
- PORTF &= ~(1<<7);
- break;
- case 10:
- // modifier has no row enable
- // to select virtual row, set port as input
- DDRA &= ~0b00000001;
- PORTA |= 0b00000001;
- DDRB &= ~0b00011100;
- PORTB |= 0b00011100;
- DDRF &= ~0b00110000;
- PORTF |= 0b00110000;
- break;
-
- }
-}
* |Gui|Alt | Space |Alt |Gui|
* `-------------------------------------------'
*/
- KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, 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,TRNS, \
* |Gui|Alt | Space |Alt |Gui|
* `-------------------------------------------'
*/
- KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ KEYMAP(GRV, 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, TRNS,RSFT,NO, \
* `--------------------------------------------'
* Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
*/
- KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \
LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \
LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \
} else {
debug("kbuf: full\n");
}
+
+ // NOTE: send key strokes of Macro
+ usbPoll();
+ vusb_transfer_keyboard();
}