Merge branch 'master' into akb96
This commit is contained in:
commit
c6b95b8f60
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +1,6 @@
|
||||
[submodule "protocol/usb_hid/USB_Host_Shield_2.0"]
|
||||
path = protocol/usb_hid/USB_Host_Shield_2.0
|
||||
url = git@github.com:tmk/USB_Host_Shield_2.0.git
|
||||
[submodule "protocol/lufa/LUFA-git"]
|
||||
path = protocol/lufa/LUFA-git
|
||||
url = https://github.com/abcminiuser/lufa.git
|
||||
|
19
README.md
19
README.md
@ -33,13 +33,15 @@ You can find some keyboard specific projects under `converter` and `keyboard` di
|
||||
### converter
|
||||
* [ps2_usb](converter/ps2_usb/) - [PS/2 keyboard to USB][GH_ps2]
|
||||
* [adb_usb](converter/adb_usb/) - [ADB keyboard to USB][GH_adb]
|
||||
* [m0110_usb](converter/m0110_usb) - [Machintosh 128K/512K/Plus keyboard to USB][GH_m0110]
|
||||
* [m0110_usb](converter/m0110_usb) - [Macintosh 128K/512K/Plus keyboard to USB][GH_m0110]
|
||||
* [terminal_usb](converter/terminal_usb/) - [IBM Model M terminal keyboard(PS/2 scancode set3) to USB][GH_terminal]
|
||||
* [news_usb](converter/news_usb/) - [Sony NEWS keyboard to USB][GH_news]
|
||||
* [x68k_usb](converter/x68k_usb/) - [Sharp X68000 keyboard to USB][GH_x68k]
|
||||
* [sun_usb](converter/sun_usb/) - [Sun] to USB(type4, 5 and 3?)
|
||||
* [pc98_usb](converter/pc98_usb/) - [PC98] to USB
|
||||
* [usb_usb](converter/usb_usb/) - USB to USB(experimental)
|
||||
* [ascii_usb](converter/ascii_usb/) - ASCII(Serial console terminal) to USB
|
||||
* [ibm4704_usb](converter/ibm4704_usb) - [IBM 4704 keyboard Converter][GH_ibm4704]
|
||||
|
||||
### keyboard
|
||||
* [hhkb](keyboard/hhkb/) - [Happy Hacking Keyboard pro][GH_hhkb] **my main board**
|
||||
@ -50,6 +52,7 @@ You can find some keyboard specific projects under `converter` and `keyboard` di
|
||||
* [IIgs_Standard](keyboard/IIgs/) - Apple [IIGS] keyboard mod(by JeffreySung)
|
||||
* [macway](keyboard/macway/) - [Compact keyboard mod][GH_macway] [retired]
|
||||
* [KMAC](keyboard/kmac/) - Korean custom keyboard
|
||||
* [Lightsaber](keyboard/lightsaber/) - Korean custom keyboard
|
||||
|
||||
[GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930
|
||||
[GH_hhkb]: http://geekhack.org/showwiki.php?title=Island:12047
|
||||
@ -61,6 +64,7 @@ You can find some keyboard specific projects under `converter` and `keyboard` di
|
||||
[GH_terminal]: http://geekhack.org/showwiki.php?title=Island:27272
|
||||
[GH_x68k]: http://geekhack.org/showwiki.php?title=Island:29060
|
||||
[GH_hbkb]: http://geekhack.org/showwiki.php?title=Island:29483
|
||||
[GH_ibm4704]: http://geekhack.org/index.php?topic=54706.0
|
||||
[HID_liber]: http://deskthority.net/wiki/HID_Liberation_Device_-_DIY_Instructions
|
||||
[Phantom]: http://geekhack.org/index.php?topic=26742
|
||||
[GH60]: http://geekhack.org/index.php?topic=34959
|
||||
@ -90,7 +94,7 @@ See [doc/keymap.md](doc/keymap.md).
|
||||
|
||||
|
||||
|
||||
Magic Comannds
|
||||
Magic Commands
|
||||
--------------
|
||||
To see help press `Magic` + `H`.
|
||||
|
||||
@ -121,7 +125,7 @@ Following commands can be also executed with `Magic` + key. In console mode `Mag
|
||||
**TBD**
|
||||
|
||||
### Boot Magic Configuration - Virtual DIP Switch
|
||||
Boot Magic are executed during boot up time. Press Magic key below then pulgin keyboard cable.
|
||||
Boot Magic are executed during boot up time. Press Magic key below then plug in keyboard cable.
|
||||
Note that you must use keys of **Layer 0** as Magic keys. These settings are stored in EEPROM so that retain your configure over power cycles.
|
||||
|
||||
To avoid configuring accidentally additive salt key `KC_SPACE` also needs to be pressed along with the following configuration keys. The salt key is configurable in `config.h`. See [common/bootmagic.h](common/bootmagic.h).
|
||||
@ -141,12 +145,13 @@ To avoid configuring accidentally additive salt key `KC_SPACE` also needs to be
|
||||
|
||||
#### Keymap
|
||||
- Swap Control and CapsLock(`Left Control`)
|
||||
- Change CapsLock to Control(`Casp Lock`)
|
||||
- Change CapsLock to Control(`Caps Lock`)
|
||||
- Swap LeftAlt and Gui(`Left Alt`)
|
||||
- Swap RightAlt and Gui(`Right Alt`)
|
||||
- Disable Gui(`Left Gui`)
|
||||
- Swap Grave and Escape(`Grave`)
|
||||
- Swap BackSlash and BackSpace(`Back Slash`)
|
||||
- Enable NKRO on boot(`N`)
|
||||
|
||||
#### Default Layer
|
||||
- Set Default Layer to 0(`0`)
|
||||
@ -210,7 +215,7 @@ Architecture
|
||||
|
||||
|
||||
|
||||
Debuging
|
||||
Debugging
|
||||
--------
|
||||
Use PJRC's `hid_listen` to see debug messages. You can use the tool for debug even if firmware use LUFA stack.
|
||||
|
||||
@ -227,7 +232,7 @@ Files and Directories
|
||||
* converter/ - protocol converter projects
|
||||
* doc/ - documents
|
||||
* common.mk - Makefile for common
|
||||
* protoco.mk - Makefile for protocol
|
||||
* protocol.mk - Makefile for protocol
|
||||
* rules.mk - Makefile for build rules
|
||||
|
||||
### Common
|
||||
@ -263,7 +268,7 @@ Files and Directories
|
||||
|
||||
|
||||
|
||||
Conding Style
|
||||
Coding Style
|
||||
-------------
|
||||
- Doesn't use Tab to indent, use 4-spaces instead.
|
||||
|
||||
|
61
common.mk
61
common.mk
@ -1,18 +1,18 @@
|
||||
COMMON_DIR = common
|
||||
SRC += $(COMMON_DIR)/host.c \
|
||||
$(COMMON_DIR)/keyboard.c \
|
||||
$(COMMON_DIR)/action.c \
|
||||
$(COMMON_DIR)/action_tapping.c \
|
||||
$(COMMON_DIR)/action_macro.c \
|
||||
$(COMMON_DIR)/action_layer.c \
|
||||
$(COMMON_DIR)/action_util.c \
|
||||
$(COMMON_DIR)/keymap.c \
|
||||
$(COMMON_DIR)/timer.c \
|
||||
$(COMMON_DIR)/print.c \
|
||||
$(COMMON_DIR)/bootloader.c \
|
||||
$(COMMON_DIR)/suspend.c \
|
||||
$(COMMON_DIR)/xprintf.S \
|
||||
$(COMMON_DIR)/util.c
|
||||
SRC += $(COMMON_DIR)/host.c \
|
||||
$(COMMON_DIR)/keyboard.c \
|
||||
$(COMMON_DIR)/action.c \
|
||||
$(COMMON_DIR)/action_tapping.c \
|
||||
$(COMMON_DIR)/action_macro.c \
|
||||
$(COMMON_DIR)/action_layer.c \
|
||||
$(COMMON_DIR)/action_util.c \
|
||||
$(COMMON_DIR)/keymap.c \
|
||||
$(COMMON_DIR)/timer.c \
|
||||
$(COMMON_DIR)/print.c \
|
||||
$(COMMON_DIR)/bootloader.c \
|
||||
$(COMMON_DIR)/suspend.c \
|
||||
$(COMMON_DIR)/xprintf.S \
|
||||
$(COMMON_DIR)/util.c
|
||||
|
||||
|
||||
# Option modules
|
||||
@ -22,7 +22,7 @@ ifdef BOOTMAGIC_ENABLE
|
||||
OPT_DEFS += -DBOOTMAGIC_ENABLE
|
||||
endif
|
||||
|
||||
ifdef MOUSEKEY_ENABLE
|
||||
ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
|
||||
SRC += $(COMMON_DIR)/mousekey.c
|
||||
OPT_DEFS += -DMOUSEKEY_ENABLE
|
||||
OPT_DEFS += -DMOUSE_ENABLE
|
||||
@ -48,30 +48,55 @@ ifdef NKRO_ENABLE
|
||||
OPT_DEFS += -DNKRO_ENABLE
|
||||
endif
|
||||
|
||||
ifdef USB_6KRO_ENABLE
|
||||
OPT_DEFS += -DUSB_6KRO_ENABLE
|
||||
endif
|
||||
|
||||
ifdef SLEEP_LED_ENABLE
|
||||
SRC += $(COMMON_DIR)/sleep_led.c
|
||||
OPT_DEFS += -DSLEEP_LED_ENABLE
|
||||
OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
|
||||
endif
|
||||
|
||||
ifdef SOFTPWM_LED_ENABLE
|
||||
SRC += $(COMMON_DIR)/softpwm_led.c
|
||||
OPT_DEFS += -DSOFTPWM_LED_ENABLE
|
||||
ifdef FADING_LED_ENABLE
|
||||
OPT_DEFS += -DFADING_LED_ENABLE
|
||||
endif
|
||||
ifdef BREATHING_LED_ENABLE
|
||||
OPT_DEFS += -DBREATHING_LED_ENABLE
|
||||
endif
|
||||
else
|
||||
ifdef BREATHING_LED_ENABLE
|
||||
SRC += $(COMMON_DIR)/breathing_led.c
|
||||
OPT_DEFS += -DBREATHING_LED_ENABLE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef BACKLIGHT_ENABLE
|
||||
SRC += $(COMMON_DIR)/backlight.c
|
||||
OPT_DEFS += -DBACKLIGHT_ENABLE
|
||||
endif
|
||||
|
||||
ifdef LEDMAP_ENABLE
|
||||
SRC += $(COMMON_DIR)/ledmap.c
|
||||
OPT_DEFS += -DLEDMAP_ENABLE
|
||||
ifdef LEDMAP_IN_EEPROM_ENABLE
|
||||
SRC += $(COMMON_DIR)/ledmap_in_eeprom.c
|
||||
OPT_DEFS += -DLEDMAP_IN_EEPROM_ENABLE
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
ifdef KEYMAP_SECTION_ENABLE
|
||||
OPT_DEFS += -DKEYMAP_SECTION_ENABLE
|
||||
EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x
|
||||
endif
|
||||
|
||||
ifdef KEYMAP_EX_ENABLE
|
||||
SRC += $(COMMON_DIR)/keymap_ex.c
|
||||
OPT_DEFS += -DKEYMAP_EX_ENABLE
|
||||
ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
SRC += $(COMMON_DIR)/keymap_in_eeprom.c
|
||||
OPT_DEFS += -DKEYMAP_IN_EEPROM_ENABLE
|
||||
endif
|
||||
|
||||
ifdef LED_MATRIX_ENABLE
|
||||
|
@ -43,6 +43,8 @@ void action_exec(keyevent_t event)
|
||||
|
||||
keyrecord_t record = { .event = event };
|
||||
|
||||
action_keyevent(event);
|
||||
|
||||
#ifndef NO_ACTION_TAPPING
|
||||
action_tapping_process(record);
|
||||
#else
|
||||
@ -294,7 +296,11 @@ void process_action(keyrecord_t *record)
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
case ACT_BACKLIGHT:
|
||||
if (!event.pressed) {
|
||||
switch (action.backlight.id) {
|
||||
/* Backwards compatibility */
|
||||
if (action.backlight.level != 0 && action.backlight.opt != BACKLIGHT_LEVEL) {
|
||||
action.backlight.opt = action.backlight.level;
|
||||
}
|
||||
switch (action.backlight.opt) {
|
||||
case BACKLIGHT_INCREASE:
|
||||
backlight_increase();
|
||||
break;
|
||||
@ -307,6 +313,9 @@ void process_action(keyrecord_t *record)
|
||||
case BACKLIGHT_STEP:
|
||||
backlight_step();
|
||||
break;
|
||||
case BACKLIGHT_LEVEL:
|
||||
backlight_level(action.backlight.level);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -550,3 +559,8 @@ void debug_action(action_t action)
|
||||
}
|
||||
dprintf("[%X:%02X]", action.kind.param>>8, action.kind.param&0xff);
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void action_keyevent(keyevent_t event)
|
||||
{
|
||||
}
|
||||
|
@ -55,6 +55,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
|
||||
/* user defined special function */
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt);
|
||||
|
||||
/* keyevent callback */
|
||||
void action_keyevent(keyevent_t event);
|
||||
|
||||
/* Utilities for actions. */
|
||||
void process_action(keyrecord_t *record);
|
||||
void register_code(uint8_t code);
|
||||
|
@ -87,7 +87,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* 1100|1111| id(8) Macro record?
|
||||
*
|
||||
* ACT_BACKLIGHT(1101):
|
||||
* 1101|xxxx| id(8) Backlight commands
|
||||
* 1101|opt |level(8) Backlight commands
|
||||
*
|
||||
* ACT_COMMAND(1110):
|
||||
* 1110|opt | id(8) Built-in Command exec
|
||||
@ -163,7 +163,9 @@ typedef union {
|
||||
uint8_t kind :4;
|
||||
} usage;
|
||||
struct action_backlight {
|
||||
uint8_t id :8;
|
||||
uint8_t level :8;
|
||||
uint8_t opt :4;
|
||||
uint8_t kind :4;
|
||||
} backlight;
|
||||
struct action_command {
|
||||
uint8_t id :8;
|
||||
@ -282,21 +284,23 @@ enum layer_pram_tap_op {
|
||||
/*
|
||||
* Extensions
|
||||
*/
|
||||
enum backlight_id {
|
||||
enum backlight_opt {
|
||||
BACKLIGHT_INCREASE = 0,
|
||||
BACKLIGHT_DECREASE = 1,
|
||||
BACKLIGHT_TOGGLE = 2,
|
||||
BACKLIGHT_STEP = 3,
|
||||
BACKLIGHT_LEVEL = 4,
|
||||
};
|
||||
/* Macro */
|
||||
#define ACTION_MACRO(id) ACTION(ACT_MACRO, (id))
|
||||
#define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id))
|
||||
#define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id))
|
||||
/* Backlight */
|
||||
#define ACTION_BACKLIGHT_INCREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE)
|
||||
#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE)
|
||||
#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE)
|
||||
#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP)
|
||||
#define ACTION_BACKLIGHT_INCREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE << 8)
|
||||
#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8)
|
||||
#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8)
|
||||
#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8)
|
||||
#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | level)
|
||||
/* Command */
|
||||
#define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr))
|
||||
/* Function */
|
||||
|
@ -22,6 +22,9 @@ static void default_layer_state_set(uint32_t state)
|
||||
default_layer_debug(); debug(" to ");
|
||||
default_layer_state = state;
|
||||
default_layer_debug(); debug("\n");
|
||||
#ifdef LEDMAP_ENABLE
|
||||
default_layer_state_change(state);
|
||||
#endif
|
||||
clear_keyboard_but_mods(); // To avoid stuck keys
|
||||
}
|
||||
|
||||
@ -63,6 +66,9 @@ static void layer_state_set(uint32_t state)
|
||||
layer_debug(); dprint(" to ");
|
||||
layer_state = state;
|
||||
layer_debug(); dprintln();
|
||||
#ifdef LEDMAP_ENABLE
|
||||
layer_state_change(state);
|
||||
#endif
|
||||
clear_keyboard_but_mods(); // To avoid stuck keys
|
||||
#ifdef ON_LAYER_CHANGE
|
||||
layer_change(layer_state);
|
||||
|
@ -72,6 +72,14 @@ void layer_change(uint32_t state);
|
||||
#define layer_change(state)
|
||||
#endif
|
||||
|
||||
#ifdef LEDMAP_ENABLE
|
||||
void default_layer_state_change(uint32_t state);
|
||||
void layer_state_change(uint32_t state);
|
||||
#else
|
||||
#define default_layer_state_change()
|
||||
#define layer_state_change()
|
||||
#endif
|
||||
|
||||
|
||||
/* return action depending on current layer status */
|
||||
action_t layer_switch_get_action(key_t key);
|
||||
|
@ -16,6 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <util/delay.h>
|
||||
#include "action.h"
|
||||
#include "action_util.h"
|
||||
#include "action_macro.h"
|
||||
|
||||
#ifdef DEBUG_ACTION
|
||||
@ -39,12 +40,20 @@ void action_macro_play(const macro_t *macro_p)
|
||||
case KEY_DOWN:
|
||||
MACRO_READ();
|
||||
dprintf("KEY_DOWN(%02X)\n", macro);
|
||||
register_code(macro);
|
||||
if (IS_MOD(macro)) {
|
||||
add_weak_mods(MOD_BIT(macro));
|
||||
} else {
|
||||
register_code(macro);
|
||||
}
|
||||
break;
|
||||
case KEY_UP:
|
||||
MACRO_READ();
|
||||
dprintf("KEY_UP(%02X)\n", macro);
|
||||
unregister_code(macro);
|
||||
if (IS_MOD(macro)) {
|
||||
del_weak_mods(MOD_BIT(macro));
|
||||
} else {
|
||||
unregister_code(macro);
|
||||
}
|
||||
break;
|
||||
case WAIT:
|
||||
MACRO_READ();
|
||||
|
@ -30,6 +30,15 @@ static inline void del_key_bit(uint8_t code);
|
||||
static uint8_t real_mods = 0;
|
||||
static uint8_t weak_mods = 0;
|
||||
|
||||
#ifdef USB_6KRO_ENABLE
|
||||
#define RO_ADD(a, b) ((a + b) % REPORT_KEYS)
|
||||
#define RO_SUB(a, b) ((a - b + REPORT_KEYS) % REPORT_KEYS)
|
||||
#define RO_INC(a) RO_ADD(a, 1)
|
||||
#define RO_DEC(a) RO_SUB(a, 1)
|
||||
static int8_t cb_head = 0;
|
||||
static int8_t cb_tail = 0;
|
||||
static int8_t cb_count = 0;
|
||||
#endif
|
||||
|
||||
// TODO: pointer variable is not needed
|
||||
//report_keyboard_t keyboard_report = {};
|
||||
@ -135,12 +144,22 @@ void clear_oneshot_mods(void)
|
||||
*/
|
||||
uint8_t has_anykey(void)
|
||||
{
|
||||
#ifdef USB_6KRO_ENABLE
|
||||
#ifdef NKRO_ENABLE
|
||||
if (!keyboard_nkro) {
|
||||
#endif
|
||||
return cb_count;
|
||||
#ifdef NKRO_ENABLE
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
uint8_t cnt = 0;
|
||||
for (uint8_t i = 1; i < REPORT_SIZE; i++) {
|
||||
if (keyboard_report->raw[i])
|
||||
cnt++;
|
||||
}
|
||||
return cnt;
|
||||
#endif
|
||||
}
|
||||
|
||||
uint8_t has_anymod(void)
|
||||
@ -158,14 +177,88 @@ uint8_t get_first_key(void)
|
||||
return i<<3 | biton(keyboard_report->nkro.bits[i]);
|
||||
}
|
||||
#endif
|
||||
#ifdef USB_6KRO_ENABLE
|
||||
uint8_t i = cb_head;
|
||||
do {
|
||||
if (keyboard_report->keys[i] != 0) {
|
||||
break;
|
||||
}
|
||||
i = RO_INC(i);
|
||||
} while (i != cb_tail);
|
||||
return keyboard_report->keys[i];
|
||||
#else
|
||||
return keyboard_report->keys[0];
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef USB_6KRO_ENABLE
|
||||
#ifdef DEBUG
|
||||
static void dump_report_keys(void) {
|
||||
dprintf("\n");
|
||||
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
|
||||
dprintf("%02X ", keyboard_report->keys[i]);
|
||||
}
|
||||
dprintf("\n");
|
||||
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
|
||||
dprintf("%c%c ", i==cb_head?'H':' ', i==cb_tail?'T':' ');
|
||||
}
|
||||
dprintf("\n");
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* local functions */
|
||||
static inline void add_key_byte(uint8_t code)
|
||||
{
|
||||
#ifdef USB_6KRO_ENABLE
|
||||
int8_t i = cb_head;
|
||||
int8_t empty = -1;
|
||||
if (cb_count) {
|
||||
do {
|
||||
if (keyboard_report->keys[i] == code) {
|
||||
return;
|
||||
}
|
||||
if (empty == -1 && keyboard_report->keys[i] == 0) {
|
||||
empty = i;
|
||||
}
|
||||
i = RO_INC(i);
|
||||
} while (i != cb_tail);
|
||||
if (i == cb_tail) {
|
||||
if (cb_tail == cb_head) {
|
||||
// buffer is full
|
||||
if (empty == -1) {
|
||||
// pop head when has no empty space
|
||||
cb_head = RO_INC(cb_head);
|
||||
cb_count--;
|
||||
}
|
||||
else {
|
||||
// left shift when has empty space
|
||||
uint8_t offset = 1;
|
||||
i = RO_INC(empty);
|
||||
do {
|
||||
if (keyboard_report->keys[i] != 0) {
|
||||
keyboard_report->keys[empty] = keyboard_report->keys[i];
|
||||
keyboard_report->keys[i] = 0;
|
||||
empty = RO_INC(empty);
|
||||
}
|
||||
else {
|
||||
offset++;
|
||||
}
|
||||
i = RO_INC(i);
|
||||
} while (i != cb_tail);
|
||||
cb_tail = RO_SUB(cb_tail, offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// add to tail
|
||||
keyboard_report->keys[cb_tail] = code;
|
||||
cb_tail = RO_INC(cb_tail);
|
||||
cb_count++;
|
||||
#ifdef DEBUG
|
||||
dump_report_keys();
|
||||
#endif
|
||||
#else
|
||||
int8_t i = 0;
|
||||
int8_t empty = -1;
|
||||
for (; i < REPORT_KEYS; i++) {
|
||||
@ -181,15 +274,46 @@ static inline void add_key_byte(uint8_t code)
|
||||
keyboard_report->keys[empty] = code;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void del_key_byte(uint8_t code)
|
||||
{
|
||||
#ifdef USB_6KRO_ENABLE
|
||||
uint8_t i = cb_head;
|
||||
if (cb_count) {
|
||||
do {
|
||||
if (keyboard_report->keys[i] == code) {
|
||||
keyboard_report->keys[i] = 0;
|
||||
cb_count--;
|
||||
if (cb_count == 0) {
|
||||
// reset head and tail
|
||||
cb_tail = cb_head = 0;
|
||||
}
|
||||
if (i == RO_DEC(cb_tail)) {
|
||||
// left shift when next to tail
|
||||
do {
|
||||
cb_tail = RO_DEC(cb_tail);
|
||||
if (keyboard_report->keys[RO_DEC(cb_tail)] != 0) {
|
||||
break;
|
||||
}
|
||||
} while (cb_tail != cb_head);
|
||||
}
|
||||
break;
|
||||
}
|
||||
i = RO_INC(i);
|
||||
} while (i != cb_tail);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
dump_report_keys();
|
||||
#endif
|
||||
#else
|
||||
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
|
||||
if (keyboard_report->keys[i] == code) {
|
||||
keyboard_report->keys[i] = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef NKRO_ENABLE
|
||||
|
@ -104,3 +104,19 @@ void backlight_step(void)
|
||||
dprintf("backlight step: %u\n", backlight_config.level);
|
||||
backlight_set(backlight_config.level);
|
||||
}
|
||||
|
||||
void backlight_level(uint8_t level)
|
||||
{
|
||||
backlight_config.level = level;
|
||||
backlight_config.enable = !!backlight_config.level;
|
||||
eeconfig_write_backlight(backlight_config.raw);
|
||||
backlight_set(backlight_config.level);
|
||||
}
|
||||
|
||||
void backlight_xor(uint8_t level)
|
||||
{
|
||||
backlight_config.level ^= level;
|
||||
backlight_config.enable = !!backlight_config.level;
|
||||
eeconfig_write_backlight(backlight_config.raw);
|
||||
backlight_set(backlight_config.level);
|
||||
}
|
||||
|
@ -24,18 +24,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
typedef union {
|
||||
uint8_t raw;
|
||||
struct {
|
||||
bool enable:1;
|
||||
uint8_t level:7;
|
||||
bool enable :1;
|
||||
uint8_t level :7;
|
||||
};
|
||||
} backlight_config_t;
|
||||
|
||||
void backlight_init(void);
|
||||
|
||||
void backlight_increase(void);
|
||||
void backlight_decrease(void);
|
||||
void backlight_toggle(void);
|
||||
void backlight_step(void);
|
||||
|
||||
void backlight_set(uint8_t level);
|
||||
void backlight_level(uint8_t level);
|
||||
void backlight_xor(uint8_t level);
|
||||
|
||||
#endif
|
||||
|
@ -5,8 +5,11 @@
|
||||
#include "bootloader.h"
|
||||
#include "debug.h"
|
||||
#include "keymap.h"
|
||||
#include "host.h"
|
||||
#include "action_layer.h"
|
||||
#include "eeconfig.h"
|
||||
#include "keymap_in_eeprom.h"
|
||||
#include "ledmap_in_eeprom.h"
|
||||
#include "bootmagic.h"
|
||||
|
||||
|
||||
@ -32,6 +35,12 @@ void bootmagic(void)
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_EEPROM_CLEAR)) {
|
||||
eeconfig_disable();
|
||||
eeconfig_init();
|
||||
#ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
write_keymap_to_eeprom();
|
||||
#endif
|
||||
#ifdef LEDMAP_IN_EEPROM_ENABLE
|
||||
write_ledmap_to_eeprom();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* bootloader */
|
||||
@ -77,8 +86,15 @@ void bootmagic(void)
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) {
|
||||
keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_HOST_NKRO)) {
|
||||
keymap_config.nkro = !keymap_config.nkro;
|
||||
}
|
||||
eeconfig_write_keymap(keymap_config.raw);
|
||||
|
||||
#ifdef NKRO_ENABLE
|
||||
keyboard_nkro = keymap_config.nkro;
|
||||
#endif
|
||||
|
||||
/* default layer */
|
||||
uint8_t default_layer = 0;
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_0)) { default_layer |= (1<<0); }
|
||||
|
@ -60,6 +60,9 @@
|
||||
#ifndef BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE
|
||||
#define BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE KC_BSLASH
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_HOST_NKRO
|
||||
#define BOOTMAGIC_HOST_NKRO KC_N
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
|
@ -10,6 +10,18 @@ static uint8_t breathing_led_duration = 0;
|
||||
|
||||
void breathing_led_init(void)
|
||||
{
|
||||
#ifdef BREATHING_LED_TIMER1
|
||||
/* Timer1 setup */
|
||||
/* CTC mode */
|
||||
TCCR1B |= (1<<WGM12);
|
||||
/* Clock selelct: clk/8 */
|
||||
TCCR1B |= (1<<CS10);
|
||||
/* Set TOP value */
|
||||
uint8_t sreg = SREG;
|
||||
cli();
|
||||
OCR1AH = (BREATHING_LED_TIMER_TOP>>8)&0xff;
|
||||
OCR1AL = BREATHING_LED_TIMER_TOP&0xff;
|
||||
#else
|
||||
/* Timer3 setup */
|
||||
/* CTC mode */
|
||||
TCCR3B |= (1<<WGM32);
|
||||
@ -20,28 +32,44 @@ void breathing_led_init(void)
|
||||
cli();
|
||||
OCR3AH = (BREATHING_LED_TIMER_TOP>>8)&0xff;
|
||||
OCR3AL = BREATHING_LED_TIMER_TOP&0xff;
|
||||
#endif
|
||||
SREG = sreg;
|
||||
}
|
||||
|
||||
void breathing_led_enable(void)
|
||||
{
|
||||
/* Enable Compare Match Interrupt */
|
||||
#ifdef BREATHING_LED_TIMER1
|
||||
TIMSK1 |= (1<<OCIE1A);
|
||||
dprintf("breathing led on: %u\n", TIMSK1 & (1<<OCIE1A));
|
||||
#else
|
||||
TIMSK3 |= (1<<OCIE3A);
|
||||
dprintf("breathing led on: %u\n", TIMSK3 & (1<<OCIE3A));
|
||||
#endif
|
||||
}
|
||||
|
||||
void breathing_led_disable(void)
|
||||
{
|
||||
/* Disable Compare Match Interrupt */
|
||||
#ifdef BREATHING_LED_TIMER1
|
||||
TIMSK1 &= ~(1<<OCIE1A);
|
||||
dprintf("breathing led off: %u\n", TIMSK1 & (1<<OCIE1A));
|
||||
#else
|
||||
TIMSK3 &= ~(1<<OCIE3A);
|
||||
dprintf("breathing led off: %u\n", TIMSK3 & (1<<OCIE3A));
|
||||
#endif
|
||||
}
|
||||
|
||||
void breathing_led_toggle(void)
|
||||
{
|
||||
/* Disable Compare Match Interrupt */
|
||||
#ifdef BREATHING_LED_TIMER1
|
||||
TIMSK1 ^= (1<<OCIE1A);
|
||||
dprintf("breathing led toggle: %u\n", TIMSK1 & (1<<OCIE1A));
|
||||
#else
|
||||
TIMSK3 ^= (1<<OCIE3A);
|
||||
dprintf("breathing led toggle: %u\n", TIMSK3 & (1<<OCIE3A));
|
||||
#endif
|
||||
}
|
||||
|
||||
void breathing_led_set_duration(uint8_t dur)
|
||||
@ -60,7 +88,11 @@ static const uint8_t breathing_table[256] PROGMEM = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 32, 34, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 56, 58, 61, 63, 66, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 102, 105, 108, 112, 116, 119, 123, 126, 130, 134, 138, 142, 145, 149, 153, 157, 161, 165, 169, 173, 176, 180, 184, 188, 192, 195, 199, 203, 206, 210, 213, 216, 219, 223, 226, 228, 231, 234, 236, 239, 241, 243, 245, 247, 248, 250, 251, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 254, 253, 252, 251, 250, 248, 247, 245, 243, 241, 239, 236, 234, 231, 228, 226, 223, 219, 216, 213, 210, 206, 203, 199, 195, 192, 188, 184, 180, 176, 173, 169, 165, 161, 157, 153, 149, 145, 142, 138, 134, 130, 126, 123, 119, 116, 112, 108, 105, 102, 98, 95, 92, 89, 86, 83, 80, 77, 74, 71, 68, 66, 63, 61, 58, 56, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 34, 32, 30, 29, 27, 26, 25, 23, 22, 21, 19, 18, 17, 16, 15, 14, 13, 12, 11, 11, 10, 9, 8, 8, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
#ifdef BREATHING_LED_TIMER1
|
||||
ISR(TIMER1_COMPA_vect)
|
||||
#else
|
||||
ISR(TIMER3_COMPA_vect)
|
||||
#endif
|
||||
{
|
||||
static uint8_t index = 0;
|
||||
static uint8_t step = 0;
|
||||
|
@ -151,6 +151,7 @@ static void print_eeconfig(void)
|
||||
print(".no_gui: "); print_dec(kc.no_gui); print("\n");
|
||||
print(".swap_grave_esc: "); print_dec(kc.swap_grave_esc); print("\n");
|
||||
print(".swap_backslash_backspace: "); print_dec(kc.swap_backslash_backspace); print("\n");
|
||||
print(".nkro: "); print_dec(kc.nkro); print("\n");
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
backlight_config_t bc;
|
||||
@ -301,13 +302,13 @@ static bool command_common(uint8_t code)
|
||||
case KC_S:
|
||||
print("\n\n----- Status -----\n");
|
||||
print_val_hex8(host_keyboard_leds());
|
||||
print_val_hex8(keyboard_protocol);
|
||||
print_val_hex8(keyboard_idle);
|
||||
#ifdef PROTOCOL_PJRC
|
||||
print_val_hex8(UDCON);
|
||||
print_val_hex8(UDIEN);
|
||||
print_val_hex8(UDINT);
|
||||
print_val_hex8(usb_keyboard_leds);
|
||||
print_val_hex8(usb_keyboard_protocol);
|
||||
print_val_hex8(usb_keyboard_idle_config);
|
||||
print_val_hex8(usb_keyboard_idle_count);
|
||||
#endif
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
#include <stdbool.h>
|
||||
#include <avr/eeprom.h>
|
||||
#include "eeconfig.h"
|
||||
#include "keymap_ex.h"
|
||||
|
||||
void eeconfig_init(void)
|
||||
{
|
||||
@ -14,9 +13,6 @@ void eeconfig_init(void)
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
eeprom_write_byte(EECONFIG_BACKLIGHT, 0);
|
||||
#endif
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
keymap_ex_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
void eeconfig_enable(void)
|
||||
@ -26,9 +22,6 @@ void eeconfig_enable(void)
|
||||
|
||||
void eeconfig_disable(void)
|
||||
{
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
keymap_ex_disable();
|
||||
#endif
|
||||
eeprom_write_word(EECONFIG_MAGIC, 0xFFFF);
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define EECONFIG_KEYMAP_NO_GUI (1<<4)
|
||||
#define EECONFIG_KEYMAP_SWAP_GRAVE_ESC (1<<5)
|
||||
#define EECONFIG_KEYMAP_SWAP_BACKSLASH_BACKSPACE (1<<6)
|
||||
#define EECONFIG_KEYMAP_NKRO (1<<7)
|
||||
|
||||
|
||||
bool eeconfig_is_enabled(void);
|
||||
|
@ -24,7 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
#ifdef NKRO_ENABLE
|
||||
bool keyboard_nkro = false;
|
||||
bool keyboard_nkro = true;
|
||||
#endif
|
||||
|
||||
static host_driver_t *driver;
|
||||
|
@ -32,6 +32,9 @@ extern "C" {
|
||||
extern bool keyboard_nkro;
|
||||
#endif
|
||||
|
||||
uint8_t keyboard_idle;
|
||||
uint8_t keyboard_protocol;
|
||||
|
||||
|
||||
/* host driver */
|
||||
void host_set_driver(host_driver_t *driver);
|
||||
|
@ -31,7 +31,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "bootmagic.h"
|
||||
#include "eeconfig.h"
|
||||
#include "backlight.h"
|
||||
#include "keymap_ex.h"
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
#include "softpwm_led.h"
|
||||
#else
|
||||
#include "breathing_led.h"
|
||||
#endif
|
||||
#include "ledmap.h"
|
||||
#include "ledmap_in_eeprom.h"
|
||||
#include "keymap_in_eeprom.h"
|
||||
#ifdef MOUSEKEY_ENABLE
|
||||
# include "mousekey.h"
|
||||
#endif
|
||||
@ -77,16 +84,27 @@ void keyboard_init(void)
|
||||
bootmagic();
|
||||
#endif
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
backlight_init();
|
||||
#ifdef LEDMAP_ENABLE
|
||||
#ifdef LEDMAP_IN_EEPROM_ENABLE
|
||||
ledmap_in_eeprom_init();
|
||||
#endif
|
||||
ledmap_init();
|
||||
#endif
|
||||
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
softpwm_init();
|
||||
#endif
|
||||
|
||||
#ifdef BREATHING_LED_ENABLE
|
||||
breathing_led_init();
|
||||
#endif
|
||||
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
keymap_ex_init();
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
backlight_init();
|
||||
#endif
|
||||
|
||||
#ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
keymap_in_eeprom_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ typedef union {
|
||||
bool no_gui:1;
|
||||
bool swap_grave_esc:1;
|
||||
bool swap_backslash_backspace:1;
|
||||
bool reserved:1;
|
||||
bool nkro:1;
|
||||
};
|
||||
} keymap_config_t;
|
||||
keymap_config_t keymap_config;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2013 Kai Ryu <kai1103@gmail.com>
|
||||
Copyright 2013,2014 Kai Ryu <kai1103@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
|
||||
@ -18,29 +18,32 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include <avr/pgmspace.h>
|
||||
#include <avr/eeprom.h>
|
||||
#include "eeconfig.h"
|
||||
#include "keymap_ex.h"
|
||||
#include "keymap_in_eeprom.h"
|
||||
#include "matrix.h"
|
||||
#include "debug.h"
|
||||
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
#ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
|
||||
void keymap_ex_init(void) {
|
||||
void keymap_in_eeprom_init(void) {
|
||||
if (!check_keymap_in_eeprom()) {
|
||||
write_keymap_to_eeprom();
|
||||
}
|
||||
}
|
||||
|
||||
void keymap_ex_disable(void) {
|
||||
eeprom_write_word((void*)EECONFIG_KEYMAP_CHECKSUM, eeprom_read_word((void*)EECONFIG_KEYMAP_CHECKSUM) + 1);
|
||||
void keymap_in_eeprom_disable(void) {
|
||||
eeprom_write_word(EECONFIG_KEYMAP_CHECKSUM, eeprom_read_word(EECONFIG_KEYMAP_CHECKSUM) + 1);
|
||||
}
|
||||
|
||||
bool check_keymap_in_eeprom(void) {
|
||||
uint16_t checksum_in_eeprom = eeprom_read_word(&((keymap_ex_t*)EECONFIG_KEYMAP_EX)->checksum);
|
||||
uint16_t checksum_in_eeprom = eeprom_read_word(EECONFIG_KEYMAP_CHECKSUM);
|
||||
uint16_t checksum = EECONFIG_MAGIC_NUMBER;
|
||||
for (uint16_t i = 0; i < KEYMAP_SIZE; i += 2) {
|
||||
checksum += eeprom_read_word((void*)(EECONFIG_KEYMAP_FN_ACTIONS + i));
|
||||
for (uint16_t i = 0; i < KEYMAP_SIZE; i++) {
|
||||
uint8_t byte = eeprom_read_byte((uint8_t *)EECONFIG_KEYMAP_FN_ACTIONS + i);
|
||||
uint16_t word = (i & 1) ? byte << 8 : byte;
|
||||
checksum += word;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
eeprom_write_word((void*)(EECONFIG_KEYMAP_DEBUG), checksum);
|
||||
eeprom_write_word(EECONFIG_KEYMAP_DEBUG, checksum);
|
||||
#endif
|
||||
return (checksum_in_eeprom == checksum);
|
||||
}
|
||||
@ -78,37 +81,31 @@ void write_keymap_to_eeprom(void) {
|
||||
}
|
||||
}
|
||||
// write checksum
|
||||
eeprom_write_word(&((keymap_ex_t*)EECONFIG_KEYMAP_EX)->checksum, checksum);
|
||||
}
|
||||
|
||||
uint8_t eeconfig_read_keymap_key(uint8_t layer, uint8_t row, uint8_t col) {
|
||||
//return eeprom_read_byte(&((keymap_ex_t*)(EECONFIG_KEYMAP_EX))->keymaps[layer][row][col]);
|
||||
return eeprom_read_byte((void*)(EECONFIG_KEYMAP_KEYMAPS + KEY_OFFSET(layer, row, col)));
|
||||
}
|
||||
|
||||
void eeconfig_write_keymap_key(uint8_t layer, uint8_t row, uint8_t col, uint8_t key) {
|
||||
//return eeprom_write_byte(&((keymap_ex_t*)(EECONFIG_KEYMAP_EX))->keymaps[layer][row][col], key);
|
||||
return eeprom_write_byte((void*)(EECONFIG_KEYMAP_KEYMAPS + KEY_OFFSET(layer, row, col)), key);
|
||||
}
|
||||
|
||||
uint8_t eeconfig_read_keymap_key_by_index(uint16_t index) {
|
||||
//return eeprom_read_byte(((keymap_ex_t*)(EECONFIG_KEYMAP_EX)) + index);
|
||||
return eeprom_read_byte((void*)(EECONFIG_KEYMAP_KEYMAPS + index));
|
||||
}
|
||||
|
||||
void eeconfig_write_keymap_key_by_index(uint16_t index, uint8_t key) {
|
||||
//return eeprom_write_byte(((keymap_ex_t*)(EECONFIG_KEYMAP_EX)) + index, key);
|
||||
return eeprom_write_byte((void*)(EECONFIG_KEYMAP_KEYMAPS + index), key);
|
||||
eeprom_write_word(EECONFIG_KEYMAP_CHECKSUM, checksum);
|
||||
}
|
||||
|
||||
uint16_t eeconfig_read_keymap_fn_action(uint8_t index) {
|
||||
//return eeprom_read_word(&((keymap_ex_t*)(EECONFIG_KEYMAP_EX))->fn_actions[index]);
|
||||
return eeprom_read_word((void*)(EECONFIG_KEYMAP_FN_ACTIONS + FN_ACTION_OFFSET(index)));
|
||||
return eeprom_read_word(EECONFIG_KEYMAP_FN_ACTIONS + index);
|
||||
}
|
||||
|
||||
void eeconfig_write_keymap_fn_action(uint8_t index, uint16_t fn_action) {
|
||||
//return eeprom_write_word(&((keymap_ex_t*)(EECONFIG_KEYMAP_EX))->fn_actions[index], fn_action);
|
||||
return eeprom_write_word((void*)(EECONFIG_KEYMAP_FN_ACTIONS + FN_ACTION_OFFSET(index)), fn_action);
|
||||
return eeprom_write_word(EECONFIG_KEYMAP_FN_ACTIONS + index, fn_action);
|
||||
}
|
||||
|
||||
uint8_t eeconfig_read_keymap_key(uint8_t layer, uint8_t row, uint8_t col) {
|
||||
return eeprom_read_byte(EECONFIG_KEYMAP_KEYMAPS + KEY_OFFSET(layer, row, col));
|
||||
}
|
||||
|
||||
void eeconfig_write_keymap_key(uint8_t layer, uint8_t row, uint8_t col, uint8_t key) {
|
||||
return eeprom_write_byte(EECONFIG_KEYMAP_KEYMAPS + KEY_OFFSET(layer, row, col), key);
|
||||
}
|
||||
|
||||
uint8_t eeconfig_read_keymap_key_by_index(uint16_t index) {
|
||||
return eeprom_read_byte(EECONFIG_KEYMAP_KEYMAPS + index);
|
||||
}
|
||||
|
||||
void eeconfig_write_keymap_key_by_index(uint16_t index, uint8_t key) {
|
||||
return eeprom_write_byte(EECONFIG_KEYMAP_KEYMAPS + index, key);
|
||||
}
|
||||
|
||||
#endif
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2013 Kai Ryu <kai1103@gmail.com>
|
||||
Copyright 2013,2014 Kai Ryu <kai1103@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
|
||||
@ -15,40 +15,45 @@ 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 KEYMAP_EX_H
|
||||
#define KEYMAP_EX_H
|
||||
#ifndef KEYMAP_IN_EEPROM_H
|
||||
#define KEYMAP_IN_EEPROM_H
|
||||
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
#ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define EECONFIG_KEYMAP_EX 0x10
|
||||
#ifndef EECONFIG_KEYMAP_IN_EEPROM
|
||||
#define EECONFIG_KEYMAP_IN_EEPROM 0x10
|
||||
#endif
|
||||
#ifndef FN_ACTIONS_COUNT
|
||||
#define FN_ACTIONS_COUNT 32
|
||||
#endif
|
||||
#ifndef KEYMAPS_COUNT
|
||||
#define KEYMAPS_COUNT 8
|
||||
#define KEYMAPS_COUNT 1
|
||||
#endif
|
||||
#ifndef MATRIX_SIZE
|
||||
#define MATRIX_SIZE (matrix_rows() * matrix_cols())
|
||||
#endif
|
||||
#define KEYS_COUNT (KEYMAPS_COUNT * MATRIX_SIZE)
|
||||
|
||||
typedef struct {
|
||||
uint16_t checksum;
|
||||
uint16_t fn_actions[FN_ACTIONS_COUNT];
|
||||
uint8_t keymaps[KEYMAPS_COUNT][MATRIX_ROWS][MATRIX_COLS];
|
||||
} keymap_ex_t;
|
||||
} keymap_in_eeprom_t;
|
||||
|
||||
#define EECONFIG_KEYMAP_DEBUG (EECONFIG_KEYMAP_EX - sizeof(uint16_t))
|
||||
#define EECONFIG_KEYMAP_CHECKSUM (EECONFIG_KEYMAP_EX)
|
||||
#define EECONFIG_KEYMAP_FN_ACTIONS (EECONFIG_KEYMAP_EX + sizeof(uint16_t))
|
||||
#define EECONFIG_KEYMAP_KEYMAPS (EECONFIG_KEYMAP_FN_ACTIONS + sizeof(uint16_t) * FN_ACTIONS_COUNT)
|
||||
#define EECONFIG_KEYMAP_CHECKSUM (uint16_t *)(EECONFIG_KEYMAP_IN_EEPROM)
|
||||
#define EECONFIG_KEYMAP_FN_ACTIONS (uint16_t *)(EECONFIG_KEYMAP_CHECKSUM + 1)
|
||||
#define EECONFIG_KEYMAP_KEYMAPS (uint8_t *)(EECONFIG_KEYMAP_FN_ACTIONS + FN_ACTIONS_COUNT)
|
||||
#define EECONFIG_KEYMAP_DEBUG (uint16_t *)(EECONFIG_KEYMAP_CHECKSUM - 1)
|
||||
|
||||
#define KEYS_COUNT (KEYMAPS_COUNT * MATRIX_ROWS * MATRIX_COLS)
|
||||
#define KEYMAP_SIZE (sizeof(uint16_t) * FN_ACTIONS_COUNT + sizeof(uint8_t) * KEYS_COUNT)
|
||||
#define FN_ACTION_OFFSET(index) (sizeof(uint16_t) * index)
|
||||
#define KEY_OFFSET(layer, row, col) (sizeof(uint8_t) * (layer * MATRIX_ROWS * MATRIX_COLS + row * MATRIX_COLS + col))
|
||||
#define KEYMAP_WORD_SIZE ((KEYMAP_SIZE + 1) / 2)
|
||||
#define KEY_OFFSET(layer, row, col) (layer * matrix_rows() * matrix_cols() + row * matrix_cols() + col)
|
||||
|
||||
void keymap_ex_init(void);
|
||||
void keymap_ex_disable(void);
|
||||
void keymap_in_eeprom_init(void);
|
||||
void keymap_in_eeprom_disable(void);
|
||||
bool check_keymap_in_eeprom(void);
|
||||
void write_keymap_to_eeprom(void);
|
||||
uint8_t eeconfig_read_keymap_key(uint8_t layer, uint8_t row, uint8_t col);
|
26
common/led.h
26
common/led.h
@ -19,6 +19,32 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define LED_H
|
||||
#include "stdint.h"
|
||||
|
||||
#ifndef LED_COUNT
|
||||
#define LED_COUNT 1
|
||||
#endif
|
||||
|
||||
#if (LED_COUNT <= 8)
|
||||
typedef uint8_t led_pack_t;
|
||||
#elif (LED_COUNT <= 16)
|
||||
typedef uint16_t led_pack_t;
|
||||
#elif (LED_COUNT <= 32)
|
||||
typedef uint32_t led_pack_t;
|
||||
#else
|
||||
#error "LED_COUNT: invalid value"
|
||||
#endif
|
||||
|
||||
#if (LED_COUNT <= 16)
|
||||
#define LED_BIT(i) (1U<<(i))
|
||||
#elif (LED_COUNT <= 32)
|
||||
#define LED_BIT(i) (1UL<<(i))
|
||||
#else
|
||||
#error "LED_COUNT: invalid value"
|
||||
#endif
|
||||
|
||||
#define LED_BIT_SET(x, i) ((x) |= LED_BIT(i))
|
||||
#define LED_BIT_CLEAR(x, i) ((x) &= ~LED_BIT(i))
|
||||
#define LED_BIT_XOR(x, i) ((x) ^= LED_BIT(i))
|
||||
#define LED_BIT_IS_SET(x, i) ((x) & LED_BIT(i))
|
||||
|
||||
/* keyboard LEDs */
|
||||
#define USB_LED_NUM_LOCK 0
|
||||
|
135
common/ledmap.c
Normal file
135
common/ledmap.c
Normal file
@ -0,0 +1,135 @@
|
||||
#include "ledmap.h"
|
||||
#include "ledmap_in_eeprom.h"
|
||||
#include "led.h"
|
||||
#include "softpwm_led.h"
|
||||
#include "action_layer.h"
|
||||
#include "debug.h"
|
||||
|
||||
static led_state_t led_state_last = 0;
|
||||
static led_binding_t usb_led_binding = 0;
|
||||
static led_binding_t default_layer_binding = 0;
|
||||
static led_binding_t layer_binding = 0;
|
||||
static led_binding_t backlight_binding = 0;
|
||||
|
||||
static void update_led_state(led_state_t state);
|
||||
|
||||
void ledmap_init(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
uint8_t code = ledmap_get_code(i);
|
||||
if (code & LEDMAP_BACKLIGHT) {
|
||||
LED_BIT_SET(backlight_binding, i);
|
||||
}
|
||||
code &= LEDMAP_MASK;
|
||||
if (code >= LEDMAP_DEFAULT_LAYER_0 && code <= LEDMAP_DEFAULT_LAYER_31) {
|
||||
LED_BIT_SET(default_layer_binding, i);
|
||||
}
|
||||
else if (code >= LEDMAP_LAYER_0 && code <= LEDMAP_LAYER_31) {
|
||||
LED_BIT_SET(layer_binding, i);
|
||||
}
|
||||
else if (code >= LEDMAP_NUM_LOCK && code <= LEDMAP_KANA) {
|
||||
LED_BIT_SET(usb_led_binding, i);
|
||||
}
|
||||
}
|
||||
ledmap_led_init();
|
||||
}
|
||||
|
||||
void led_set(uint8_t usb_led)
|
||||
{
|
||||
if (usb_led_binding) {
|
||||
led_state_t led_state = led_state_last;
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
if (usb_led_binding & LED_BIT(i)) {
|
||||
uint8_t code = ledmap_get_code(i) & LEDMAP_MASK;
|
||||
for (uint8_t j = USB_LED_NUM_LOCK; j <= USB_LED_KANA; j++) {
|
||||
if (code - LEDMAP_NUM_LOCK == j) {
|
||||
(usb_led & (1 << j)) ? LED_BIT_SET(led_state, i) : LED_BIT_CLEAR(led_state, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
update_led_state(led_state);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NO_ACTION_LAYER
|
||||
void default_layer_state_change(uint32_t state)
|
||||
{
|
||||
if (default_layer_binding) {
|
||||
led_state_t led_state = led_state_last;
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
if (default_layer_binding & LED_BIT(i)) {
|
||||
uint8_t code = ledmap_get_code(i) & LEDMAP_MASK;
|
||||
(state & (1UL << (code - LEDMAP_DEFAULT_LAYER_0))) ? LED_BIT_SET(led_state, i) : LED_BIT_CLEAR(led_state, i);
|
||||
}
|
||||
}
|
||||
update_led_state(led_state);
|
||||
}
|
||||
}
|
||||
|
||||
void layer_state_change(uint32_t state)
|
||||
{
|
||||
if (layer_binding) {
|
||||
led_state_t led_state = led_state_last;
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
if (layer_binding & LED_BIT(i)) {
|
||||
uint8_t code = ledmap_get_code(i) & LEDMAP_MASK;
|
||||
(state & (1UL << (code - LEDMAP_LAYER_0))) ? LED_BIT_SET(led_state, i) : LED_BIT_CLEAR(led_state, i);
|
||||
}
|
||||
}
|
||||
update_led_state(led_state);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
void softpwm_led_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
void softpwm_led_on(uint8_t index)
|
||||
{
|
||||
if (backlight_binding & LED_BIT(index)) {
|
||||
ledmap_led_on(index);
|
||||
}
|
||||
}
|
||||
|
||||
void softpwm_led_off(uint8_t index)
|
||||
{
|
||||
if (backlight_binding & LED_BIT(index)) {
|
||||
ledmap_led_off(index);
|
||||
}
|
||||
}
|
||||
|
||||
void softpwm_led_state_change(uint8_t state)
|
||||
{
|
||||
if (state) {
|
||||
}
|
||||
else {
|
||||
led_state_t led_state = led_state_last;
|
||||
led_state_last &= ~(backlight_binding);
|
||||
update_led_state(led_state);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void update_led_state(led_state_t state)
|
||||
{
|
||||
uint8_t diff = led_state_last ^ state;
|
||||
if (diff) {
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
if (softpwm_led_get_state() && (backlight_binding & LED_BIT(i))) {
|
||||
continue;
|
||||
}
|
||||
if (diff & LED_BIT(i)) {
|
||||
if (state & LED_BIT(i)) {
|
||||
ledmap_led_on(i);
|
||||
}
|
||||
else {
|
||||
ledmap_led_off(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
led_state_last = state;
|
||||
}
|
||||
}
|
53
common/ledmap.h
Normal file
53
common/ledmap.h
Normal file
@ -0,0 +1,53 @@
|
||||
#ifndef LEDMAP_H
|
||||
#define LEDMAP_H
|
||||
|
||||
#include "stdint.h"
|
||||
#include "stdbool.h"
|
||||
#include "led.h"
|
||||
|
||||
typedef led_pack_t led_state_t;
|
||||
typedef led_pack_t led_binding_t;
|
||||
|
||||
typedef enum {
|
||||
LEDMAP_NO = 0,
|
||||
LEDMAP_DEFAULT_LAYER_0,
|
||||
LEDMAP_DEFAULT_LAYER_31 = LEDMAP_DEFAULT_LAYER_0 + 31,
|
||||
LEDMAP_LAYER_0,
|
||||
LEDMAP_LAYER_31 = LEDMAP_LAYER_0 + 31,
|
||||
LEDMAP_NUM_LOCK,
|
||||
LEDMAP_CAPS_LOCK,
|
||||
LEDMAP_SCROLL_LOCK,
|
||||
LEDMAP_COMPOSE,
|
||||
LEDMAP_KANA,
|
||||
LEDMAP_BACKLIGHT = 0x80
|
||||
} ledmap_code_t;
|
||||
|
||||
#define LEDMAP_MASK 0x7F
|
||||
|
||||
typedef union {
|
||||
uint8_t raw;
|
||||
struct {
|
||||
uint8_t binding : 7;
|
||||
bool backlight : 1;
|
||||
};
|
||||
} ledmap_t;
|
||||
|
||||
#define LEDMAP_DEFAULT_LAYER(x) (LEDMAP_DEFAULT_LAYER_0 + x)
|
||||
#define LEDMAP_LAYER(x) (LEDMAP_LAYER_0 + x)
|
||||
|
||||
void ledmap_init(void);
|
||||
|
||||
#ifdef LEDMAP_ENABLE
|
||||
uint8_t ledmap_get_code(uint8_t index);
|
||||
void ledmap_led_init(void);
|
||||
void ledmap_led_on(uint8_t index);
|
||||
void ledmap_led_off(uint8_t index);
|
||||
#else
|
||||
#define ledmaps
|
||||
#define ledmap_get()
|
||||
#define ledmap_led_init()
|
||||
#define ledmap_led_on()
|
||||
#define ledmap_led_off()
|
||||
#endif
|
||||
|
||||
#endif
|
36
common/ledmap_in_eeprom.c
Normal file
36
common/ledmap_in_eeprom.c
Normal file
@ -0,0 +1,36 @@
|
||||
#include <avr/pgmspace.h>
|
||||
#include <avr/eeprom.h>
|
||||
#include "ledmap.h"
|
||||
#include "ledmap_in_eeprom.h"
|
||||
|
||||
#ifdef LEDMAP_IN_EEPROM_ENABLE
|
||||
|
||||
#undef ledmap_get_code
|
||||
|
||||
static uint8_t ledmap[LED_COUNT];
|
||||
|
||||
void ledmap_in_eeprom_init(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
ledmap[i] = eeprom_read_byte(EECONFIG_LEDMAP + i);
|
||||
//ledmap[i] = LEDMAP_UNCONFIGURED;
|
||||
if (ledmap[i] == LEDMAP_UNCONFIGURED) {
|
||||
ledmap[i] = ledmap_get_code(i);
|
||||
eeprom_write_byte(EECONFIG_LEDMAP + i, ledmap[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void write_ledmap_to_eeprom(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
eeprom_write_byte(EECONFIG_LEDMAP + i, ledmap_get_code(i));
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t ledmap_in_eeprom_get_code(uint8_t i)
|
||||
{
|
||||
return ledmap[i];
|
||||
}
|
||||
|
||||
#endif
|
24
common/ledmap_in_eeprom.h
Normal file
24
common/ledmap_in_eeprom.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef LEDMAP_IN_EEPROM_H
|
||||
#define LEDMAP_IN_EEPROM_H
|
||||
|
||||
#ifndef EECONFIG_LEDMAP_IN_EEPROM
|
||||
#define EECONFIG_LEDMAP_IN_EEPROM 7
|
||||
#endif
|
||||
|
||||
#define EECONFIG_LEDMAP (uint8_t*)EECONFIG_LEDMAP_IN_EEPROM
|
||||
#define LEDMAP_SIZE (sizeof(uint8_t) * LED_COUNT)
|
||||
|
||||
#define LEDMAP_UNCONFIGURED 0xFF
|
||||
|
||||
#ifdef LEDMAP_IN_EEPROM_ENABLE
|
||||
#define ledmap_get_code ledmap_in_eeprom_get_code
|
||||
void ledmap_in_eeprom_init(void);
|
||||
void write_ledmap_to_eeprom(void);
|
||||
uint8_t ledmap_in_eeprom_get_code(uint8_t index);
|
||||
#else
|
||||
#define ledmap_in_eeprom_init()
|
||||
#define write_ledmap_to_eeprom()
|
||||
#define ledmap_in_eeprom_get_code()
|
||||
#endif
|
||||
|
||||
#endif
|
@ -94,6 +94,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* keyboard report is 8-byte array retains state of 8 modifiers and 6 keys.
|
||||
*
|
||||
* byte |0 |1 |2 |3 |4 |5 |6 |7
|
||||
* -----+--------+--------+--------+--------+--------+--------+--------+--------
|
||||
* desc |mods |reserved|keys[0] |keys[1] |keys[2] |keys[3] |keys[4] |keys[5]
|
||||
*
|
||||
* It is exended to 16 bytes to retain 120keys+8mods when NKRO mode.
|
||||
*
|
||||
* byte |0 |1 |2 |3 |4 |5 |6 |7 ... |15
|
||||
* -----+--------+--------+--------+--------+--------+--------+--------+-------- +--------
|
||||
* desc |mods |bits[0] |bits[1] |bits[2] |bits[3] |bits[4] |bits[5] |bits[6] ... |bit[14]
|
||||
*
|
||||
* mods retains state of 8 modifiers.
|
||||
*
|
||||
* bit |0 |1 |2 |3 |4 |5 |6 |7
|
||||
* -----+--------+--------+--------+--------+--------+--------+--------+--------
|
||||
* desc |Lcontrol|Lshift |Lalt |Lgui |Rcontrol|Rshift |Ralt |Rgui
|
||||
*
|
||||
*/
|
||||
typedef union {
|
||||
uint8_t raw[REPORT_SIZE];
|
||||
struct {
|
||||
|
329
common/softpwm_led.c
Normal file
329
common/softpwm_led.c
Normal file
@ -0,0 +1,329 @@
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include "led.h"
|
||||
#include "softpwm_led.h"
|
||||
#include "debug.h"
|
||||
|
||||
#define SOFTPWM_LED_FREQ 64
|
||||
#define SOFTPWM_LED_TIMER_TOP F_CPU / (256 * SOFTPWM_LED_FREQ)
|
||||
|
||||
static uint8_t softpwm_led_state = 0;
|
||||
static uint8_t softpwm_led_ocr[LED_COUNT] = {0};
|
||||
static uint8_t softpwm_led_ocr_buff[LED_COUNT] = {0};
|
||||
|
||||
void softpwm_init(void)
|
||||
{
|
||||
#ifdef SOFTPWM_LED_TIMER3
|
||||
/* Timer3 setup */
|
||||
/* CTC mode */
|
||||
TCCR3B |= (1<<WGM32);
|
||||
/* Clock selelct: clk/8 */
|
||||
TCCR3B |= (1<<CS30);
|
||||
/* Set TOP value */
|
||||
uint8_t sreg = SREG;
|
||||
cli();
|
||||
OCR3AH = (SOFTPWM_LED_TIMER_TOP >> 8) & 0xff;
|
||||
OCR3AL = SOFTPWM_LED_TIMER_TOP & 0xff;
|
||||
SREG = sreg;
|
||||
#else
|
||||
/* Timer1 setup */
|
||||
/* CTC mode */
|
||||
TCCR1B |= (1<<WGM12);
|
||||
/* Clock selelct: clk/8 */
|
||||
TCCR1B |= (1<<CS10);
|
||||
/* Set TOP value */
|
||||
uint8_t sreg = SREG;
|
||||
cli();
|
||||
OCR1AH = (SOFTPWM_LED_TIMER_TOP >> 8) & 0xff;
|
||||
OCR1AL = SOFTPWM_LED_TIMER_TOP & 0xff;
|
||||
SREG = sreg;
|
||||
#endif
|
||||
softpwm_led_init();
|
||||
}
|
||||
|
||||
void softpwm_led_enable(void)
|
||||
{
|
||||
/* Enable Compare Match Interrupt */
|
||||
#ifdef SOFTPWM_LED_TIMER3
|
||||
TIMSK3 |= (1<<OCIE3A);
|
||||
//dprintf("softpwm led on: %u\n", TIMSK3 & (1<<OCIE3A));
|
||||
#else
|
||||
TIMSK1 |= (1<<OCIE1A);
|
||||
//dprintf("softpwm led on: %u\n", TIMSK1 & (1<<OCIE1A));
|
||||
#endif
|
||||
softpwm_led_state = 1;
|
||||
#ifdef LEDMAP_ENABLE
|
||||
softpwm_led_state_change(softpwm_led_state);
|
||||
#endif
|
||||
}
|
||||
|
||||
void softpwm_led_disable(void)
|
||||
{
|
||||
/* Disable Compare Match Interrupt */
|
||||
#ifdef SOFTPWM_LED_TIMER3
|
||||
TIMSK3 &= ~(1<<OCIE3A);
|
||||
//dprintf("softpwm led off: %u\n", TIMSK3 & (1<<OCIE3A));
|
||||
#else
|
||||
TIMSK1 &= ~(1<<OCIE1A);
|
||||
//dprintf("softpwm led off: %u\n", TIMSK1 & (1<<OCIE1A));
|
||||
#endif
|
||||
softpwm_led_state = 0;
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
softpwm_led_off(i);
|
||||
}
|
||||
#ifdef LEDMAP_ENABLE
|
||||
softpwm_led_state_change(softpwm_led_state);
|
||||
#endif
|
||||
}
|
||||
|
||||
void softpwm_led_toggle(void)
|
||||
{
|
||||
if (softpwm_led_state) {
|
||||
softpwm_led_disable();
|
||||
}
|
||||
else {
|
||||
softpwm_led_enable();
|
||||
}
|
||||
}
|
||||
|
||||
void softpwm_led_set(uint8_t index, uint8_t val)
|
||||
{
|
||||
softpwm_led_ocr_buff[index] = val;
|
||||
}
|
||||
|
||||
void softpwm_led_set_all(uint8_t val)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
softpwm_led_ocr_buff[i] = val;
|
||||
}
|
||||
}
|
||||
|
||||
void softpwm_led_increase(uint8_t index, uint8_t offset)
|
||||
{
|
||||
if (softpwm_led_ocr_buff[index] > 0xFF - offset) {
|
||||
softpwm_led_ocr_buff[index] = 0xFF;
|
||||
}
|
||||
else {
|
||||
softpwm_led_ocr_buff[index] += offset;
|
||||
}
|
||||
}
|
||||
|
||||
void softpwm_led_increase_all(uint8_t offset)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
softpwm_led_increase(i, offset);
|
||||
}
|
||||
}
|
||||
|
||||
void softpwm_led_decrease(uint8_t index, uint8_t offset)
|
||||
{
|
||||
if (softpwm_led_ocr_buff[index] < offset) {
|
||||
softpwm_led_ocr_buff[index] = 0;
|
||||
}
|
||||
else {
|
||||
softpwm_led_ocr_buff[index] -= offset;
|
||||
}
|
||||
}
|
||||
|
||||
void softpwm_led_decrease_all(uint8_t offset)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
softpwm_led_decrease(i, offset);
|
||||
}
|
||||
}
|
||||
|
||||
inline uint8_t softpwm_led_get_state(void)
|
||||
{
|
||||
return softpwm_led_state;
|
||||
}
|
||||
|
||||
#ifdef FADING_LED_ENABLE
|
||||
|
||||
static led_pack_t fading_led_state = 0;
|
||||
static led_pack_t fading_led_direction = 0;
|
||||
static uint8_t fading_led_duration = 0;
|
||||
|
||||
void fading_led_enable(uint8_t index)
|
||||
{
|
||||
LED_BIT_SET(fading_led_state, index);
|
||||
}
|
||||
|
||||
void fading_led_enable_all(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
LED_BIT_SET(fading_led_state, i);
|
||||
}
|
||||
}
|
||||
|
||||
void fading_led_disable(uint8_t index)
|
||||
{
|
||||
LED_BIT_CLEAR(fading_led_state, index);
|
||||
}
|
||||
|
||||
void fading_led_disable_all(void)
|
||||
{
|
||||
fading_led_state = 0;
|
||||
}
|
||||
|
||||
void fading_led_toggle(uint8_t index)
|
||||
{
|
||||
LED_BIT_XOR(fading_led_state, index);
|
||||
}
|
||||
|
||||
void fading_led_toggle_all(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
LED_BIT_XOR(fading_led_state, i);
|
||||
}
|
||||
}
|
||||
|
||||
void fading_led_set_direction(uint8_t dir)
|
||||
{
|
||||
fading_led_direction = dir;
|
||||
}
|
||||
|
||||
void fading_led_set_duration(uint8_t dur)
|
||||
{
|
||||
fading_led_duration = dur;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef BREATHING_LED_ENABLE
|
||||
|
||||
/* Breathing LED brighness(PWM On period) table
|
||||
*
|
||||
* http://www.wolframalpha.com/input/?i=Table%5Bfloor%28%28exp%28sin%28x%2F256*2*pi%2B3%2F2*pi%29%29-1%2Fe%29*%28256%2F%28e-1%2Fe%29%29%29%2C+%7Bx%2C0%2C255%2C1%7D%5D
|
||||
* Table[floor((exp(sin(x/256*2*pi+3/2*pi))-1/e)*(256/(e-1/e))), {x,0,255,1}]
|
||||
* (0..255).each {|x| print ((exp(sin(x/256.0*2*PI+3.0/2*PI))-1/E)*(256/(E-1/E))).to_i, ', ' }
|
||||
*/
|
||||
static const uint8_t breathing_table[128] PROGMEM = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 32, 34, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 56, 58, 61, 63, 66, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 102, 105, 108, 112, 116, 119, 123, 126, 130, 134, 138, 142, 145, 149, 153, 157, 161, 165, 169, 173, 176, 180, 184, 188, 192, 195, 199, 203, 206, 210, 213, 216, 219, 223, 226, 228, 231, 234, 236, 239, 241, 243, 245, 247, 248, 250, 251, 252, 253, 254, 255, 255, 255
|
||||
};
|
||||
|
||||
static led_pack_t breathing_led_state = 0;
|
||||
static uint8_t breathing_led_duration = 0;
|
||||
|
||||
void breathing_led_enable(uint8_t index)
|
||||
{
|
||||
LED_BIT_SET(breathing_led_state, index);
|
||||
}
|
||||
|
||||
void breathing_led_enable_all(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
LED_BIT_SET(breathing_led_state, i);
|
||||
}
|
||||
}
|
||||
|
||||
void breathing_led_disable(uint8_t index)
|
||||
{
|
||||
LED_BIT_CLEAR(breathing_led_state, index);
|
||||
}
|
||||
|
||||
void breathing_led_disable_all(void)
|
||||
{
|
||||
breathing_led_state = 0;
|
||||
}
|
||||
|
||||
void breathing_led_toggle(uint8_t index)
|
||||
{
|
||||
LED_BIT_XOR(breathing_led_state, index);
|
||||
}
|
||||
|
||||
void breathing_led_toggle_all(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
LED_BIT_XOR(breathing_led_state, i);
|
||||
}
|
||||
}
|
||||
|
||||
void breathing_led_set_duration(uint8_t dur)
|
||||
{
|
||||
breathing_led_duration = dur;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef SOFTPWM_LED_TIMER3
|
||||
ISR(TIMER3_COMPA_vect)
|
||||
#else
|
||||
ISR(TIMER1_COMPA_vect)
|
||||
#endif
|
||||
{
|
||||
static uint8_t pwm = 0;
|
||||
pwm++;
|
||||
// LED on
|
||||
if (pwm == 0) {
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
softpwm_led_on(i);
|
||||
softpwm_led_ocr[i] = softpwm_led_ocr_buff[i];
|
||||
}
|
||||
}
|
||||
// LED off
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
if (pwm == softpwm_led_ocr[i]) {
|
||||
softpwm_led_off(i);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef FADING_LED_ENABLE
|
||||
static uint8_t fading_led_counter = 0;
|
||||
static uint8_t fading_led_step = 0;
|
||||
if (fading_led_state) {
|
||||
if (++fading_led_counter > SOFTPWM_LED_FREQ) {
|
||||
fading_led_counter = 0;
|
||||
if (++fading_led_step > fading_led_duration) {
|
||||
fading_led_step = 0;
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
if (fading_led_state & LED_BIT(i)) {
|
||||
if (fading_led_direction) {
|
||||
softpwm_led_decrease(i, 1);
|
||||
}
|
||||
else {
|
||||
softpwm_led_increase(i, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BREATHING_LED_ENABLE
|
||||
static uint8_t breathing_led_counter = 0;
|
||||
static uint8_t breathing_led_step = 0;
|
||||
static uint8_t breathing_led_index = 0;
|
||||
static uint8_t breathing_led_direction = 0;
|
||||
if (breathing_led_state) {
|
||||
if (++breathing_led_counter > SOFTPWM_LED_FREQ) {
|
||||
breathing_led_counter = 0;
|
||||
if (++breathing_led_step > breathing_led_duration) {
|
||||
breathing_led_step = 0;
|
||||
uint8_t value = pgm_read_byte(&breathing_table[breathing_led_index]);
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
if (breathing_led_state & LED_BIT(i)) {
|
||||
softpwm_led_ocr_buff[i] = value;
|
||||
}
|
||||
}
|
||||
if (breathing_led_direction) {
|
||||
if (breathing_led_index == 0) {
|
||||
breathing_led_direction = 0;
|
||||
}
|
||||
else {
|
||||
breathing_led_index--;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (breathing_led_index == 0x7F) {
|
||||
breathing_led_direction = 1;
|
||||
}
|
||||
else {
|
||||
breathing_led_index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
92
common/softpwm_led.h
Normal file
92
common/softpwm_led.h
Normal file
@ -0,0 +1,92 @@
|
||||
#ifndef SOFTPWM_LED_H
|
||||
#define SOFTPWM_LED_H
|
||||
|
||||
#include "stdint.h"
|
||||
#include "led.h"
|
||||
|
||||
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
|
||||
void softpwm_init(void);
|
||||
void softpwm_led_init(void);
|
||||
void softpwm_led_enable(void);
|
||||
void softpwm_led_disable(void);
|
||||
void softpwm_led_toggle(void);
|
||||
void softpwm_led_set(uint8_t index, uint8_t val);
|
||||
void softpwm_led_set_all(uint8_t val);
|
||||
void softpwm_led_increase(uint8_t index, uint8_t offset);
|
||||
void softpwm_led_increase_all(uint8_t offset);
|
||||
void softpwm_led_decrease(uint8_t index, uint8_t offset);
|
||||
void softpwm_led_decrease_all(uint8_t offset);
|
||||
void softpwm_led_on(uint8_t index);
|
||||
void softpwm_led_off(uint8_t index);
|
||||
uint8_t softpwm_led_get_state(void);
|
||||
void softpwm_led_state_change(uint8_t state);
|
||||
|
||||
enum {
|
||||
FADING_LED_FADE_IN = 0,
|
||||
FADING_LED_FADE_OUT
|
||||
};
|
||||
#ifdef FADING_LED_ENABLE
|
||||
void fading_led_enable(uint8_t index);
|
||||
void fading_led_enable_all(void);
|
||||
void fading_led_disable(uint8_t index);
|
||||
void fading_led_disable_all(void);
|
||||
void fading_led_toggle(uint8_t index);
|
||||
void fading_led_toggle_all(void);
|
||||
void fading_led_set_direction(uint8_t dir);
|
||||
void fading_led_set_duration(uint8_t dur);
|
||||
#else
|
||||
#define fading_led_enable()
|
||||
#define fading_led_enable_all()
|
||||
#define fading_led_disable()
|
||||
#define fading_led_disable_all()
|
||||
#define fading_led_toggle()
|
||||
#define fading_led_toggle_all()
|
||||
#define fading_led_set_direction()
|
||||
#define fading_led_set_direction_all()
|
||||
#define fading_led_set_duration()
|
||||
#endif
|
||||
|
||||
#ifdef BREATHING_LED_ENABLE
|
||||
#define breathing_led_init()
|
||||
void breathing_led_enable(uint8_t index);
|
||||
void breathing_led_enable_all(void);
|
||||
void breathing_led_disable(uint8_t index);
|
||||
void breathing_led_disable_all(void);
|
||||
void breathing_led_toggle(uint8_t index);
|
||||
void breathing_led_toggle_all(void);
|
||||
void breathing_led_set_duration(uint8_t dur);
|
||||
#else
|
||||
#define breathing_led_init()
|
||||
#define breathing_led_enable()
|
||||
#define breathing_led_enable_all()
|
||||
#define breathing_led_disable()
|
||||
#define breathing_led_disable_all()
|
||||
#define breathing_led_toggle()
|
||||
#define breathing_led_toggle_all()
|
||||
#define breathing_led_set_duration()
|
||||
#define breathing_led_set_duration_all()
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#define softpwm_init()
|
||||
#define softpwm_led_init()
|
||||
#define softpwm_led_enable()
|
||||
#define softpwm_led_disable()
|
||||
#define softpwm_led_toggle()
|
||||
#define softpwm_led_set()
|
||||
#define softpwm_led_set_all()
|
||||
#define softpwm_led_increase()
|
||||
#define softpwm_led_increase_all()
|
||||
#define softpwm_led_decrease()
|
||||
#define softpwm_led_decrease_all()
|
||||
#define softpwm_led_on()
|
||||
#define softpwm_led_off()
|
||||
#define softpwm_led_get_state()
|
||||
#define softpwm_led_state_change()
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
@ -48,11 +48,17 @@ TOP_DIR = ../..
|
||||
TARGET_DIR = .
|
||||
|
||||
# project specific files
|
||||
SRC = keymap.c \
|
||||
SRC = keymap_common.c \
|
||||
matrix.c \
|
||||
led.c \
|
||||
adb.c
|
||||
|
||||
ifdef KEYMAP
|
||||
SRC := keymap_$(KEYMAP).c $(SRC)
|
||||
else
|
||||
SRC := keymap_ansi.c $(SRC)
|
||||
endif
|
||||
|
||||
CONFIG_H = config.h
|
||||
|
||||
|
||||
|
@ -8,11 +8,17 @@ TOP_DIR = ../..
|
||||
TARGET_DIR = .
|
||||
|
||||
# keyboard dependent files
|
||||
SRC = keymap.c \
|
||||
SRC = keymap_common.c \
|
||||
matrix.c \
|
||||
led.c \
|
||||
adb.c
|
||||
|
||||
ifdef KEYMAP
|
||||
SRC := keymap_$(KEYMAP).c $(SRC)
|
||||
else
|
||||
SRC := keymap_ansi.c $(SRC)
|
||||
endif
|
||||
|
||||
CONFIG_H = config.h
|
||||
|
||||
|
||||
|
@ -7,17 +7,29 @@ But binary size is about 10KB or more it doesn't fit into 8K flash like ATMega8U
|
||||
Discuss: http://geekhack.org/showwiki.php?title=Island:14290
|
||||
|
||||
|
||||
Build
|
||||
-----
|
||||
0. Connect ADB keyboard to Teensy by 3 lines(Vcc, GND, Data). By default Data line uses port D0.
|
||||
Wiring
|
||||
------
|
||||
0. Connect ADB keyboard to Teensy by 3 lines(Vcc, GND, Data). By default Data line uses port PD0.
|
||||
This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable.
|
||||
The external pull-up resistor(1K-10K Ohm) on Data is strongly recommended.
|
||||
1. Define following macros for ADB connection in config.h if you use other than port D0.
|
||||
1. Define following macros for ADB connection in config.h if you use other than port PD0.
|
||||
ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT
|
||||
2. make
|
||||
3. program Teensy
|
||||
|
||||
|
||||
Build
|
||||
-----
|
||||
Just make
|
||||
|
||||
$ make clean
|
||||
$ make
|
||||
|
||||
If your keyboard is ISO layout
|
||||
|
||||
$ make KEYMAP=iso
|
||||
|
||||
|
||||
LOCKING CAPSLOCK
|
||||
----------------
|
||||
Many of old ADB keyboards have mechanical push-lock switch for Capslock key and this converter supports the locking Capslock key by default. See README in top directory for more detail about this feature.
|
||||
@ -48,7 +60,7 @@ effort at this time.
|
||||
* |-----------------------------------------------------------| ,---. |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| |
|
||||
* |-----------------------------------------------------------| ,-----------. |-----------|Ent|
|
||||
* |Ctrl |Gui |Alt | Space | | | | |Lef|Dow|Rig| | 0| .| |
|
||||
* |Ctrl |Alt |Gui | Space |Gui |Alt |Ctrl | |Lef|Dow|Rig| | 0| .| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*/
|
||||
KEYMAP(
|
||||
@ -68,11 +80,17 @@ To get help press `h` holding Magic key. Magic key is `Power key`.
|
||||
|
||||
Notes
|
||||
-----
|
||||
Many ADB keyboards has no discrimination between right modifier and left one,
|
||||
Not-extended ADB keyboards have no discrimination between right modifier and left one,
|
||||
you will always see left control even if you press right control key.
|
||||
Apple Extended Keyboard and Apple Extended Keyboard II are the examples.
|
||||
Though ADB protocol itsef has the ability of distinction between right and left.
|
||||
And most ADB keyboard has no NKRO functionality, though ADB protocol itsef has that.
|
||||
See protocol/adb.c for more info.
|
||||
Apple Extended Keyboard and Apple Extended Keyboard II can discriminate both side
|
||||
modifiers except for GUI key(Windows/Command).
|
||||
|
||||
And most ADB keyboard has no diodes in its matrix so they are not NKRO,
|
||||
though ADB protocol itself supports it. See protocol/adb.c for more info.
|
||||
|
||||
If keyobard has ISO layout you need to use ISO keymap with `make KEYMAP=iso`. With ANSI
|
||||
keymap you will suffer from swapped keys problem.
|
||||
|
||||
https://github.com/tmk/tmk_keyboard/issues/35
|
||||
|
||||
EOF
|
||||
|
16
converter/adb_usb/keymap_ansi.c
Normal file
16
converter/adb_usb/keymap_ansi.c
Normal file
@ -0,0 +1,16 @@
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KEYMAP_EXT_ANSI(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, PWR,
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PEQL,PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, PMNS,
|
||||
LCAP,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, RSFT, UP, P1, P2, P3,
|
||||
LCTL,LALT,LGUI, SPC, RALT,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
30
converter/adb_usb/keymap_common.c
Normal file
30
converter/adb_usb/keymap_common.c
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
Copyright 2011,2012,2013 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 "keymap_common.h"
|
||||
|
||||
|
||||
/* translates key to keycode */
|
||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
|
||||
{
|
||||
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
|
||||
}
|
||||
|
||||
/* translates Fn keycode to action */
|
||||
action_t keymap_fn_to_action(uint8_t keycode)
|
||||
{
|
||||
return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2011 Jun Wako <wakojun@gmail.com>
|
||||
Copyright 2011,2012,2013 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
|
||||
@ -14,64 +14,26 @@ 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 KEYMAP_COMMON_H
|
||||
#define KEYMAP_COMMON_H
|
||||
|
||||
/*
|
||||
* Keymap for ADB keyboard
|
||||
*/
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "keycode.h"
|
||||
#include "action.h"
|
||||
#include "action_macro.h"
|
||||
#include "report.h"
|
||||
#include "print.h"
|
||||
#include "debug.h"
|
||||
#include "util.h"
|
||||
#include "keymap.h"
|
||||
|
||||
|
||||
#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
|
||||
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
||||
extern const uint16_t fn_actions[];
|
||||
|
||||
#define KEYMAP_ALL( \
|
||||
K35, K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71, K7F, \
|
||||
K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \
|
||||
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \
|
||||
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \
|
||||
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \
|
||||
K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C, \
|
||||
/* for ISO/JIS keyboard */ \
|
||||
K0A, /* NON-US \ and | 0x64 */ \
|
||||
K34, /* Keypad ENTER 0x58 */ \
|
||||
K40, /* F17 0x6C */ \
|
||||
K44, /* F18? 0x6d */ \
|
||||
K4F, /* F18 0x6d */ \
|
||||
K50, /* F19 0x6e */ \
|
||||
K5A, /* F20 0x6f */ \
|
||||
K5D, /* INTL3(Yen) 0x89 */ \
|
||||
K5E, /* INTL1(Ro) 0x87 */ \
|
||||
K5F, /* Keypad Comma 0x85 */ \
|
||||
K66, /* LANG2(Eisu) 0x91 */ \
|
||||
K68, /* LANG1(Kana) 0x90 */ \
|
||||
K6A, /* F16 0x6B */ \
|
||||
K6E /* Application 0x65 */ \
|
||||
) { \
|
||||
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
|
||||
{ KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
|
||||
{ KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
|
||||
{ KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \
|
||||
{ KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \
|
||||
{ KC_##K40, KC_##K41, KC_NO, KC_##K43, KC_##K44, KC_##K45, KC_NO, KC_##K47 }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_##K4B, KC_##K4C, KC_NO, KC_##K4E, KC_##K4F }, \
|
||||
{ KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
|
||||
{ KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \
|
||||
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \
|
||||
{ KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_NO, KC_##K6D, KC_##K6E, KC_##K6F }, \
|
||||
{ KC_NO, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
|
||||
{ KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO, KC_##K7F } \
|
||||
}
|
||||
|
||||
/* Apple Extended Keyboard US
|
||||
/* M0115 Apple Extended Keyboard ANSI
|
||||
* ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---.
|
||||
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|
|
||||
* `---' `---------------' `---------------' `---------------' `-----------' `---'
|
||||
@ -87,38 +49,78 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* |Ctrl |Opt |Cmd | Space | |Opt |Ctrl | |Lef|Dow|Rig| | 0| .| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*/
|
||||
#define KEYMAP_EXTENDED_US( \
|
||||
#define KEYMAP_EXT_ANSI( \
|
||||
K35, K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71, K7F, \
|
||||
K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \
|
||||
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \
|
||||
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \
|
||||
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \
|
||||
K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \
|
||||
) KEYMAP_ALL( \
|
||||
) { \
|
||||
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
|
||||
{ KC_##K08, KC_##K09, KC_NUBS, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
|
||||
{ KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
|
||||
{ KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_PENT, KC_##K35, KC_##K36, KC_##K37 }, \
|
||||
{ KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \
|
||||
{ KC_F17, KC_##K41, KC_NO, KC_##K43, KC_F18, KC_##K45, KC_NO, KC_##K47 }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_##K4B, KC_##K4C, KC_NO, KC_##K4E, KC_F18 }, \
|
||||
{ KC_F19, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
|
||||
{ KC_##K58, KC_##K59, KC_F20, KC_##K5B, KC_##K5C, KC_INT3, KC_INT1, KC_PCMM }, \
|
||||
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_LANG2, KC_##K67 }, \
|
||||
{ KC_LANG1, KC_##K69, KC_F16, KC_##K6B, KC_NO, KC_##K6D, KC_APP, KC_##K6F }, \
|
||||
{ KC_NO, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
|
||||
{ KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO, KC_##K7F } \
|
||||
}
|
||||
|
||||
/* M0115 Apple Extended Keyboard ISO
|
||||
* ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---.
|
||||
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|
|
||||
* `---' `---------------' `---------------' `---------------' `-----------' `---'
|
||||
* ,-----------------------------------------------------------. ,-----------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *|
|
||||
* |-----------------------------------------------------------| |-----------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Retur| |Del|End|PgD| | 7| 8| 9| -|
|
||||
* |------------------------------------------------------` | `-----------' |---------------|
|
||||
* |CapsLo| A| S| D| F| G| H| J| K| L| ;| '| #| | | 4| 5| 6| +|
|
||||
* |-----------------------------------------------------------| ,---. |---------------|
|
||||
* |Shif| \| Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| |
|
||||
* |-----------------------------------------------------------| ,-----------. |-----------|Ent|
|
||||
* |Ctrl |Opt |Cmd | Space | |Opt |Ctrl | |Lef|Dow|Rig| | 0| .| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*/
|
||||
#define KEYMAP_EXT_ISO( \
|
||||
K35, K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71, K7F, \
|
||||
K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \
|
||||
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \
|
||||
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \
|
||||
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \
|
||||
K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C, \
|
||||
/* for ISO/JIS keyboard */ \
|
||||
NONUS_BSLASH, /* NON-US \ and | 0x64 */ \
|
||||
KP_ENTER, /* Keypad ENTER 0x58 */ \
|
||||
F17, /* F17 0x6C */ \
|
||||
F18, /* F18? 0x6d */ \
|
||||
F18, /* F18 0x6d */ \
|
||||
F19, /* F19 0x6e */ \
|
||||
F20, /* F20 0x6f */ \
|
||||
INT3, /* INTL3(Yen) 0x89 */ \
|
||||
INT1, /* INTL1(Ro) 0x87 */ \
|
||||
KP_COMMA, /* Keypad Comma 0x85 */ \
|
||||
LANG2, /* LANG2(Eisu) 0x91 */ \
|
||||
LANG1, /* LANG1(Kana) 0x90 */ \
|
||||
F16, /* F16 0x6B */ \
|
||||
APPLICATION /* Application 0x65 */ \
|
||||
)
|
||||
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K24, K75,K77,K79, K59,K5B,K5C,K4E, \
|
||||
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,K2A, K56,K57,K58,K45, \
|
||||
K38,K0A,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \
|
||||
K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \
|
||||
) { \
|
||||
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
|
||||
{ KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
|
||||
{ KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
|
||||
{ KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_PENT, KC_##K35, KC_##K36, KC_##K37 }, \
|
||||
{ KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \
|
||||
{ KC_F17, KC_##K41, KC_NO, KC_##K43, KC_F18, KC_##K45, KC_NO, KC_##K47 }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_##K4B, KC_##K4C, KC_NO, KC_##K4E, KC_F18 }, \
|
||||
{ KC_F19, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
|
||||
{ KC_##K58, KC_##K59, KC_F20, KC_##K5B, KC_##K5C, KC_INT3, KC_INT1, KC_PCMM }, \
|
||||
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_LANG2, KC_##K67 }, \
|
||||
{ KC_LANG1, KC_##K69, KC_F16, KC_##K6B, KC_NO, KC_##K6D, KC_APP, KC_##K6F }, \
|
||||
{ KC_NO, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
|
||||
{ KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO, KC_##K7F } \
|
||||
}
|
||||
|
||||
/* M0116
|
||||
|
||||
|
||||
|
||||
/* M0116 Apple Standard Keyboard ANSI
|
||||
* +-------+
|
||||
* | power |
|
||||
* +-------+
|
||||
@ -134,7 +136,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* |cap|opt|comnd| ` | | \ |lef|rig|dwn|up | | 0 | . | |
|
||||
* +---------------------------------------------------------+ +-------+---+---+
|
||||
*/
|
||||
#define KEYMAP_M0116( \
|
||||
#define KEYMAP_M0116_ANSI( \
|
||||
K7F, \
|
||||
K35,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K51,K4B,K43, \
|
||||
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K45, \
|
||||
@ -160,55 +162,51 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
{ KC_NO , KC_NO, KC_NO , KC_##K7B, KC_NO, KC_NO, KC_NO, KC_##K7F } \
|
||||
}
|
||||
|
||||
|
||||
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
|
||||
static const uint8_t PROGMEM fn_layer[] = {
|
||||
0, // Fn0
|
||||
0, // Fn1
|
||||
0, // Fn2
|
||||
0, // Fn3
|
||||
0, // Fn4
|
||||
0, // Fn5
|
||||
0, // Fn6
|
||||
0 // Fn7
|
||||
};
|
||||
|
||||
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
|
||||
// See layer.c for details.
|
||||
static const uint8_t PROGMEM fn_keycode[] = {
|
||||
KC_NO, // Fn0
|
||||
KC_NO, // Fn1
|
||||
KC_NO, // Fn2
|
||||
KC_NO, // Fn3
|
||||
KC_NO, // Fn4
|
||||
KC_NO, // Fn5
|
||||
KC_NO, // Fn6
|
||||
KC_NO // Fn7
|
||||
};
|
||||
|
||||
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KEYMAP_EXTENDED_US(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, PWR,
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PEQL,PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, PMNS,
|
||||
LCAP,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, RSFT, UP, P1, P2, P3,
|
||||
LCTL,LGUI,LALT, SPC, RGUI,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT
|
||||
),
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
|
||||
{
|
||||
return KEYCODE(layer, row, col);
|
||||
}
|
||||
/*
|
||||
ADB ANSI/ISO Keymapping Note
|
||||
============================
|
||||
ANSI
|
||||
,----------- ----------.
|
||||
| *a| 1| 2 =|Backspa|
|
||||
|----------- ----------|
|
||||
|Tab | Q| | ]| *c|
|
||||
|----------- ----------|
|
||||
|CapsLo| A| '|Return |
|
||||
|----------- ----------|
|
||||
|Shift | Shift |
|
||||
`----------- ----------'
|
||||
|
||||
uint8_t keymap_fn_layer(uint8_t index)
|
||||
{
|
||||
return pgm_read_byte(&fn_layer[index]);
|
||||
}
|
||||
ISO
|
||||
,----------- ----------.
|
||||
| *a| 1| 2 =|Backspa|
|
||||
|----------- ----------|
|
||||
|Tab | Q| | ]|Retur|
|
||||
|----------- -----` |
|
||||
|CapsLo| A| '| *c| |
|
||||
|----------- ----------|
|
||||
|Shif| *b| Shift |
|
||||
`----------- ----------'
|
||||
|
||||
uint8_t keymap_fn_keycode(uint8_t index)
|
||||
{
|
||||
return pgm_read_byte(&fn_keycode[index]);
|
||||
}
|
||||
ADB Keyboard scan code:
|
||||
ADB scan code USB usage
|
||||
------------- ---------
|
||||
Key ANSI ISO ANSI ISO
|
||||
---------------------------------------------
|
||||
*a 0x32 0x0A 0x35 0x35
|
||||
*b ---- 0x32 ---- 0x64
|
||||
*c 0x2A 0x2A 0x31 0x31(or 0x32)
|
||||
|
||||
|
||||
TMK ADB-USB mapping:
|
||||
ADB USB(ANSI) USB(ISO)
|
||||
---------------------------------
|
||||
0x32 0x35 0x64
|
||||
0x0A ---- 0x35
|
||||
0x2A 0x31 0x31(or 0x32)
|
||||
|
||||
Note that mappings of ADB code 0x32 are diffrent between ANSI and ISO keyboard.
|
||||
https://github.com/tmk/tmk_keyboard/issues/35
|
||||
*/
|
58
converter/adb_usb/keymap_hasu.c
Normal file
58
converter/adb_usb/keymap_hasu.c
Normal file
@ -0,0 +1,58 @@
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Default Layer: plain keymap
|
||||
* ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---.
|
||||
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| | |
|
||||
* `---' `---------------' `---------------' `---------------' `-----------' `---'
|
||||
* ,-----------------------------------------------------------. ,-----------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *|
|
||||
* |-----------------------------------------------------------| |-----------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Fn0| |Del|End|PgD| | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------------| `-----------' |---------------|
|
||||
* |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +|
|
||||
* |-----------------------------------------------------------| ,---. |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| |
|
||||
* |-----------------------------------------------------------| ,-----------. |-----------|Ent|
|
||||
* |Ctrl |Gui |Alt | Space |Alt |Gui |Ctrl | |Lef|Dow|Rig| | 0| .| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*/
|
||||
KEYMAP_EXT_ANSI(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, NO,
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,EQL, PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,FN0, DEL, END, PGDN, P7, P8, P9, PMNS,
|
||||
CAPS,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, RSFT, UP, P1, P2, P3,
|
||||
LCTL,LGUI,LALT, SPC, RGUI,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT
|
||||
),
|
||||
|
||||
/* Default Layer: plain keymap
|
||||
* ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---.
|
||||
* |` | |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| | |
|
||||
* `---' `---------------' `---------------' `---------------' `-----------' `---'
|
||||
* ,-----------------------------------------------------------. ,-----------. ,---------------.
|
||||
* |Esc|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Delete | |Ins|Hom|PgU| |NmL|Mb1|Mb2|Mb3|
|
||||
* |-----------------------------------------------------------| |-----------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U|PrS|ScL|Pau|Up |Ins| Fn0| |Del|End|PgD| |MwD|McU|MwU|MwD|
|
||||
* |-----------------------------------------------------------| `-----------' |---------------|
|
||||
* |CapsLo|VoD|VoU|Mut| F| G| H| J|Hom|PgU|Lef|Rig|Return | |McL|McD|McR|MwU|
|
||||
* |-----------------------------------------------------------| ,---. |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M|End|PgD|Dow|Shift | |PgU| |MwL|McD|MwR| |
|
||||
* |-----------------------------------------------------------| ,-----------. |-----------|Mb3|
|
||||
* |Ctrl |Gui |Alt | Space |Alt |Gui |Ctrl | |Hom|PgD|End| | Mb1|Mb2| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*/
|
||||
KEYMAP_EXT_ANSI(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, NO,
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,BTN1,BTN2,BTN3,
|
||||
TAB, Q, W, E, R, T, Y, U, PSCR,SLCK,PAUS,UP, INS, FN0, DEL, END, PGDN, WH_D,MS_U,WH_U,WH_D,
|
||||
CAPS,VOLD,VOLU,MUTE,F, G, H, J, HOME,PGUP,LEFT,RGHT, ENT, MS_L,MS_D,MS_R,WH_U,
|
||||
LSFT,Z, X, C, V, B, N, M, END, PGDN,DOWN, RSFT, PGUP, WH_L,MS_D,WH_R,
|
||||
LCTL,LGUI,LALT, SPC, RGUI,RCTL, HOME,PGDN,END, BTN1, BTN2,BTN3
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
[0] = ACTION_LAYER_TAP_KEY(1, KC_BSLS),
|
||||
};
|
16
converter/adb_usb/keymap_iso.c
Normal file
16
converter/adb_usb/keymap_iso.c
Normal file
@ -0,0 +1,16 @@
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KEYMAP_EXT_ISO(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, PWR,
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PEQL,PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, DEL, END, PGDN, P7, P8, P9, PMNS,
|
||||
LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, PPLS,
|
||||
LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3,
|
||||
LCTL,LALT,LGUI, SPC, RALT,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
82
converter/ascii_usb/Makefile
Normal file
82
converter/ascii_usb/Makefile
Normal file
@ -0,0 +1,82 @@
|
||||
# Target file name (without extension).
|
||||
TARGET = ascii_usb
|
||||
|
||||
# Directory common source filess exist
|
||||
TOP_DIR = ../..
|
||||
|
||||
# Directory keyboard dependent files exist
|
||||
TARGET_DIR = .
|
||||
|
||||
# keyboard dependent files
|
||||
SRC = keymap.c \
|
||||
matrix.c \
|
||||
led.c \
|
||||
protocol/serial_uart.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
|
||||
#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 += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
|
||||
# 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
|
38
converter/ascii_usb/README
Normal file
38
converter/ascii_usb/README
Normal file
@ -0,0 +1,38 @@
|
||||
ASCII to USB keyboard protocol converter
|
||||
========================================
|
||||
This converts serial console terminal into USB keyboard, tested with TRS-80 model 100 TELCOM application.
|
||||
Target MCU is ATMega32u4 but other USB capable AVR will also work.
|
||||
|
||||
|
||||
Hardware
|
||||
--------
|
||||
Connect RX, TX and GND to UART pin of AVR. Note that you may need line driver/level shifter like MAX232 to interface high voltage of RS-232C.
|
||||
|
||||
|
||||
|
||||
Build Firmware
|
||||
--------------
|
||||
Configure UART setting and Just use 'make'
|
||||
|
||||
$ cd ascii_usb
|
||||
$ make
|
||||
|
||||
Then, load the binary to MCU with your favorite programmer.
|
||||
|
||||
|
||||
|
||||
Limitation
|
||||
----------
|
||||
- This cannot see key up event, you cannot hold a key.
|
||||
- Alt, Gui(Win/Mac) modifier key are not available.
|
||||
|
||||
|
||||
|
||||
TRS-80 model 100
|
||||
----------------
|
||||
Use TELCOM program with setting: 19200bps/8bit/odd parity/1stop bit
|
||||
To set this configuration push Stat(F3) and input '9801D,10'. Then push Term(F4) to connect.
|
||||
|
||||
|
||||
|
||||
|
70
converter/ascii_usb/config.h
Normal file
70
converter/ascii_usb/config.h
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
Copyright 2014 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 0x5C01
|
||||
#define DEVICE_VER 0x0100
|
||||
#define MANUFACTURER t.m.k.
|
||||
#define PRODUCT ASCII keyboard converter
|
||||
#define DESCRIPTION converts Serial Console Terminal into USB keyboard
|
||||
|
||||
|
||||
/* matrix size */
|
||||
#define MATRIX_ROWS 16
|
||||
#define MATRIX_COLS 16
|
||||
|
||||
/* key combination for command */
|
||||
#define IS_COMMAND() ( \
|
||||
host_get_first_key() == KC_BRK \
|
||||
)
|
||||
|
||||
|
||||
/*
|
||||
* Serial(USART) configuration
|
||||
* asynchronous, positive logic, 19200baud, bit order: LSB first
|
||||
* 1-start bit, 8-data bit, odd parity, 1-stop bit
|
||||
*/
|
||||
#ifdef __AVR_ATmega32U4__
|
||||
#define SERIAL_UART_BAUD 19200
|
||||
#define SERIAL_UART_DATA UDR1
|
||||
#define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1)
|
||||
#define SERIAL_UART_RXD_VECT USART1_RX_vect
|
||||
#define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
|
||||
#define SERIAL_UART_INIT() do { \
|
||||
UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
|
||||
UBRR1H = (uint8_t) (SERIAL_UART_UBRR>>8); /* baud rate */ \
|
||||
UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); /* RX interrupt, RX: enable */ \
|
||||
UCSR1B |= (0<<TXCIE1) | (1<<TXEN1); /* TX interrupt, TX: enable */ \
|
||||
UCSR1C |= (1<<UPM11) | (1<<UPM10); /* parity: none(00), even(01), odd(11) */ \
|
||||
sei(); \
|
||||
} while(0)
|
||||
#else
|
||||
#error "USART configuration is needed."
|
||||
#endif
|
||||
|
||||
/* disable action features */
|
||||
#define NO_ACTION_LAYER
|
||||
#define NO_ACTION_TAPPING
|
||||
#define NO_ACTION_ONESHOT
|
||||
#define NO_ACTION_MACRO
|
||||
#define NO_ACTION_FUNCTION
|
||||
|
||||
|
||||
#endif
|
42
converter/ascii_usb/keymap.c
Normal file
42
converter/ascii_usb/keymap.c
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
Copyright 2012 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 <stdbool.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "keycode.h"
|
||||
#include "action.h"
|
||||
#include "action_macro.h"
|
||||
#include "action_util.h"
|
||||
#include "util.h"
|
||||
#include "print.h"
|
||||
#include "keymap.h"
|
||||
|
||||
|
||||
// Keymap is not used. See matrix.c.
|
||||
|
||||
/* translates key to keycode */
|
||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
|
||||
{
|
||||
return KC_NO;
|
||||
}
|
||||
|
||||
/* translates Fn keycode to action */
|
||||
action_t keymap_fn_to_action(uint8_t keycode)
|
||||
{
|
||||
return (action_t) { .code = ACTION_NO };
|
||||
}
|
25
converter/ascii_usb/led.c
Normal file
25
converter/ascii_usb/led.c
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
Copyright 2012 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 "serial.h"
|
||||
#include "led.h"
|
||||
|
||||
|
||||
void led_set(uint8_t usb_led)
|
||||
{
|
||||
}
|
195
converter/ascii_usb/matrix.c
Normal file
195
converter/ascii_usb/matrix.c
Normal file
@ -0,0 +1,195 @@
|
||||
/*
|
||||
Copyright 2014 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 <stdbool.h>
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
#include "print.h"
|
||||
#include "util.h"
|
||||
#include "matrix.h"
|
||||
#include "debug.h"
|
||||
#include "action_util.h"
|
||||
#include "protocol/serial.h"
|
||||
|
||||
|
||||
/*
|
||||
* Not use Matrix.
|
||||
*
|
||||
* ROW: 16(4bits)
|
||||
* COL: 16(4bits)
|
||||
*
|
||||
* 8bit wide
|
||||
* +---------+
|
||||
* 0|00 ... 0F|
|
||||
* 1|08 ... 1F|
|
||||
* :| ... |
|
||||
* :| ... |
|
||||
* E|E0 ... EF|
|
||||
* F|F0 ... FF|
|
||||
* +---------+
|
||||
*/
|
||||
|
||||
|
||||
inline
|
||||
uint8_t matrix_rows(void)
|
||||
{
|
||||
return MATRIX_ROWS;
|
||||
}
|
||||
|
||||
inline
|
||||
uint8_t matrix_cols(void)
|
||||
{
|
||||
return MATRIX_COLS;
|
||||
}
|
||||
|
||||
void matrix_init(void)
|
||||
{
|
||||
debug_matrix = true;
|
||||
serial_init();
|
||||
|
||||
debug("init\n");
|
||||
return;
|
||||
}
|
||||
|
||||
static void type_key(uint16_t keycode)
|
||||
{
|
||||
if (keycode == 0) return;
|
||||
|
||||
uint8_t mods = keycode>>8;
|
||||
uint8_t key = keycode&0xFF;
|
||||
if (mods) {
|
||||
add_mods(mods);
|
||||
send_keyboard_report();
|
||||
}
|
||||
|
||||
add_key(key);
|
||||
send_keyboard_report();
|
||||
|
||||
del_key(key);
|
||||
send_keyboard_report();
|
||||
|
||||
if (mods) {
|
||||
del_mods(mods);
|
||||
send_keyboard_report();
|
||||
}
|
||||
}
|
||||
static uint16_t code2key(uint8_t code)
|
||||
{
|
||||
// ASCII to key combination in US laout
|
||||
switch (code) {
|
||||
case 0x01 ... 0x08: // Ctrl-[a-z]
|
||||
return MOD_BIT(KC_LCTRL)<<8 | (KC_A + (code-0x01));
|
||||
case 0x09: return KC_TAB; // TAB(Ctrl-i)
|
||||
case 0x0A ... 0x0C: // Ctrl-[a-z]
|
||||
return MOD_BIT(KC_LCTRL)<<8 | (KC_A + (code-0x01));
|
||||
case 0x0D: return KC_ENTER; // Enter(Ctrl-m)
|
||||
case 0x0E ... 0x1A: // Ctrl-[a-z]
|
||||
return MOD_BIT(KC_LCTRL)<<8 | (KC_A + (code-0x01));
|
||||
case 0x1B: return KC_ESC;
|
||||
case 0x1C: return KC_RIGHT;
|
||||
case 0x1D: return KC_LEFT;
|
||||
case 0x1E: return KC_UP;
|
||||
case 0x1F: return KC_DOWN;
|
||||
case 0x20: return KC_SPACE;
|
||||
case 0x21: return MOD_BIT(KC_LSHIFT)<<8 | KC_1; // !
|
||||
case 0x22: return MOD_BIT(KC_LSHIFT)<<8 | KC_QUOTE; // "
|
||||
case 0x23: return MOD_BIT(KC_LSHIFT)<<8 | KC_3; // #
|
||||
case 0x24: return MOD_BIT(KC_LSHIFT)<<8 | KC_4; // $
|
||||
case 0x25: return MOD_BIT(KC_LSHIFT)<<8 | KC_5; // %
|
||||
case 0x26: return MOD_BIT(KC_LSHIFT)<<8 | KC_7; // &
|
||||
case 0x27: return KC_QUOTE; // '
|
||||
case 0x28: return MOD_BIT(KC_LSHIFT)<<8 | KC_9; // (
|
||||
case 0x29: return MOD_BIT(KC_LSHIFT)<<8 | KC_0; // )
|
||||
case 0x2A: return MOD_BIT(KC_LSHIFT)<<8 | KC_8; // *
|
||||
case 0x2B: return MOD_BIT(KC_LSHIFT)<<8 | KC_EQUAL; // +
|
||||
case 0x2C: return KC_COMMA; // ,
|
||||
case 0x2D: return KC_MINUS; // -
|
||||
case 0x2E: return KC_DOT; // .
|
||||
case 0x2F: return KC_SLASH; // /
|
||||
case 0x30: return KC_0;
|
||||
case 0x31 ... 0x39: // 1-9
|
||||
return KC_1 + (code-0x31);
|
||||
case 0x3A: return MOD_BIT(KC_LSHIFT)<<8 | KC_SCLN; // :
|
||||
case 0x3B: return KC_SCLN; // ;
|
||||
case 0x3C: return MOD_BIT(KC_LSHIFT)<<8 | KC_COMMA; // <
|
||||
case 0x3D: return KC_EQUAL; // =
|
||||
case 0x3E: return MOD_BIT(KC_LSHIFT)<<8 | KC_DOT; // >
|
||||
case 0x3F: return MOD_BIT(KC_LSHIFT)<<8 | KC_SLASH; // ?
|
||||
case 0x40: return MOD_BIT(KC_LSHIFT)<<8 | KC_2; // @
|
||||
case 0x41 ... 0x5A: // A-Z
|
||||
return MOD_BIT(KC_LSHIFT)<<8 | (KC_A + (code-0x41));
|
||||
case 0x5B: return KC_LBRACKET; // [
|
||||
case 0x5C: return KC_BSLASH; //
|
||||
case 0x5D: return KC_RBRACKET; // ]
|
||||
case 0x5E: return MOD_BIT(KC_LSHIFT)<<8 | KC_6; // ^
|
||||
case 0x5F: return MOD_BIT(KC_LSHIFT)<<8 | KC_MINUS; // _
|
||||
case 0x61 ... 0x7A: // a-z
|
||||
return KC_A + (code-0x61);
|
||||
case 0x7B: return MOD_BIT(KC_LSHIFT)<<8 | KC_LBRACKET; // {
|
||||
case 0x7C: return MOD_BIT(KC_LSHIFT)<<8 | KC_BSLASH; // |
|
||||
case 0x7D: return MOD_BIT(KC_LSHIFT)<<8 | KC_RBRACKET; // }
|
||||
case 0x7E: return MOD_BIT(KC_LSHIFT)<<8 | KC_GRAVE; // }
|
||||
case 0x7F: return KC_DELETE; //
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
uint16_t code = serial_recv2();
|
||||
if (code == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
print_hex8(code); print(" ");
|
||||
|
||||
// echo back
|
||||
serial_send(code);
|
||||
type_key(code2key(code));
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
inline
|
||||
bool matrix_has_ghost(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
inline
|
||||
bool matrix_is_on(uint8_t row, uint8_t col)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
inline
|
||||
matrix_row_t matrix_get_row(uint8_t row)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void matrix_print(void)
|
||||
{
|
||||
print("\nr/c 0123456789ABCDEF\n");
|
||||
for (uint8_t row = 0; row < matrix_rows(); row++) {
|
||||
phex(row); print(": ");
|
||||
pbin_reverse(matrix_get_row(row));
|
||||
print("\n");
|
||||
}
|
||||
}
|
93
converter/ibm4704_usb/Makefile
Normal file
93
converter/ibm4704_usb/Makefile
Normal file
@ -0,0 +1,93 @@
|
||||
# Target file name (without extension).
|
||||
TARGET = ibm4704_usb
|
||||
|
||||
# Directory common source filess exist
|
||||
TOP_DIR = ../..
|
||||
|
||||
# Directory keyboard dependent files exist
|
||||
TARGET_DIR = .
|
||||
|
||||
# project specific files
|
||||
SRC = keymap_common.c \
|
||||
matrix.c \
|
||||
led.c \
|
||||
protocol/ibm4704.c
|
||||
|
||||
ifdef KEYMAP
|
||||
SRC := keymap_$(KEYMAP).c $(SRC)
|
||||
else
|
||||
SRC := keymap_plain.c $(SRC)
|
||||
endif
|
||||
|
||||
CONFIG_H = config.h
|
||||
|
||||
|
||||
# MCU name
|
||||
#MCU = at90usb1287
|
||||
MCU = atmega32u4
|
||||
|
||||
# Processor frequency.
|
||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
#
|
||||
# This will be an integer division of F_USB below, as it is sourced by
|
||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||
# does not *change* the processor frequency - it should merely be updated to
|
||||
# reflect the processor speed set externally so that the code can use accurate
|
||||
# software delays.
|
||||
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(+60)
|
||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
|
||||
|
||||
# Boot Section Size in *bytes*
|
||||
# Teensy halfKay 512
|
||||
# Teensy++ halfKay 1024
|
||||
# Atmel DFU loader 4096
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
|
||||
|
||||
# Search Path
|
||||
VPATH += $(TARGET_DIR)
|
||||
VPATH += $(TOP_DIR)
|
||||
|
||||
include $(TOP_DIR)/protocol.mk
|
||||
include $(TOP_DIR)/protocol/lufa.mk
|
||||
include $(TOP_DIR)/common.mk
|
||||
include $(TOP_DIR)/rules.mk
|
62
converter/ibm4704_usb/README.md
Normal file
62
converter/ibm4704_usb/README.md
Normal file
@ -0,0 +1,62 @@
|
||||
IBM 4704 to USB keyboard converter
|
||||
==================================
|
||||
This firmware converts IBM 4704 keyboard protocol to USB HID.
|
||||
|
||||
Keyboard initialization process takes a few seconds at start up. During that you will hear buzzer from the keyboard. **You need to plug USB cable after hooking up your keyboard to the converter.**
|
||||
|
||||
|
||||
Supported Keyboard
|
||||
------------------
|
||||
### IBM capacitive switch models:
|
||||
- 6019273 Model 100 50-key (grid layout) http://kishy.dyndns.org/?p=977
|
||||
- 6019284 Model 200 62-key Alpha(60% layout) http://kishy.dyndns.org/?p=894
|
||||
- 6019303 Model 300 77-key Expanded Alpha http://kbtalking.cool3c.com/article/23272
|
||||
- 6020218 Model 400 107-key Full key http://kishy.dyndns.org/?p=980
|
||||
|
||||
### Alps switch(vintage Green) models:
|
||||
|
||||
- 5954339 Japanese 102-key http://deskthority.net/post87127.html#p87127
|
||||
- 6112883 Japanese 102-key http://geekhack.org/index.php?topic=52888.msg1194489#msg1194489
|
||||
- 6112884 Japanese 102-key http://geekhack.org/index.php?topic=50437.msg1193047#msg1193047
|
||||
- 6341739 Chinese 102-key http://geekhack.org/index.php?topic=52888.msg1176566#msg1176566
|
||||
|
||||
|
||||
Connector
|
||||
---------
|
||||
Keyboard Plug from front:
|
||||
|
||||
DSUB-9
|
||||
-------------
|
||||
\ N 2 3 4 5 /
|
||||
\ N N N N /
|
||||
---------
|
||||
2 GND
|
||||
3 VCC 5V
|
||||
4 DATA
|
||||
5 CLOCK
|
||||
N No connection/No pin.
|
||||
|
||||
|
||||
Connection
|
||||
----------
|
||||
In case of using ATMega32U4(Teensy2.0):
|
||||
|
||||
1. Supply power with VCC and GND.
|
||||
2. Connect CLOCK to PD1 and DATA to PD0. You can change pin with config.h.
|
||||
3. Optionally you may need pull-up register. 1KOhm probably work.
|
||||
|
||||
|
||||
Build Firmware
|
||||
--------------
|
||||
Just run `make`:
|
||||
|
||||
$ make
|
||||
|
||||
To select keymap:
|
||||
|
||||
$ make KEYMAP=[plain|...]
|
||||
|
||||
|
||||
Keymap
|
||||
------
|
||||
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document(you can find in top README.md) and existent keymap files.
|
74
converter/ibm4704_usb/config.h
Normal file
74
converter/ibm4704_usb/config.h
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
Copyright 2014 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
|
||||
|
||||
#include <avr/interrupt.h>
|
||||
|
||||
#define VENDOR_ID 0xFEED
|
||||
#define PRODUCT_ID 0x4707
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER t.m.k.
|
||||
#define PRODUCT IBM 4704 keyboard converter
|
||||
#define DESCRIPTION convert IBM 4704 keyboard to USB
|
||||
|
||||
|
||||
/* matrix size */
|
||||
#define MATRIX_ROWS 16 // keycode bit3-6
|
||||
#define MATRIX_COLS 8 // keycode bit0-2
|
||||
|
||||
|
||||
/* key combination for command */
|
||||
#define IS_COMMAND() ( \
|
||||
keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RCTRL)) || \
|
||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Busywait
|
||||
*/
|
||||
#define IBM4704_CLOCK_PORT PORTD
|
||||
#define IBM4704_CLOCK_PIN PIND
|
||||
#define IBM4704_CLOCK_DDR DDRD
|
||||
#define IBM4704_CLOCK_BIT 1
|
||||
#define IBM4704_DATA_PORT PORTD
|
||||
#define IBM4704_DATA_PIN PIND
|
||||
#define IBM4704_DATA_DDR DDRD
|
||||
#define IBM4704_DATA_BIT 0
|
||||
|
||||
/*
|
||||
* Pin interrupt
|
||||
*/
|
||||
#ifdef IBM4704_USE_INT
|
||||
#define IBM4704_INT_INIT() do { \
|
||||
EICRA |= ((1<<ISC11) | \
|
||||
(0<<ISC10)); \
|
||||
} while (0)
|
||||
#define IBM4704_INT_ON() do { \
|
||||
EIMSK |= (1<<INT1); \
|
||||
} while (0)
|
||||
#define IBM4704_INT_OFF() do { \
|
||||
EIMSK &= ~(1<<INT1); \
|
||||
} while (0)
|
||||
#define IBM4704_INT_VECT INT1_vect
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
181
converter/ibm4704_usb/ibm4704.txt
Normal file
181
converter/ibm4704_usb/ibm4704.txt
Normal file
@ -0,0 +1,181 @@
|
||||
IBM 4704 Keyboard
|
||||
=================
|
||||
IBM capacitive switch models:
|
||||
6019273 Model 100 50-key (grid layout) http://kishy.dyndns.org/?p=977
|
||||
6019284 Model 200 62-key Alpha(60% layout) http://kishy.dyndns.org/?p=894
|
||||
6019303 Model 300 77-key Expanded Alpha http://kbtalking.cool3c.com/article/23272
|
||||
6020218 Model 400 107-key Full key http://kishy.dyndns.org/?p=980
|
||||
|
||||
Alps switch(vintage Green) models:
|
||||
5954339 Japanese 102-key http://deskthority.net/post87127.html#p87127
|
||||
6112883 Japanese 102-key http://geekhack.org/index.php?topic=52888.msg1194489#msg1194489
|
||||
6112884 Japanese 102-key http://geekhack.org/index.php?topic=50437.msg1193047#msg1193047
|
||||
6341739 Chinese 102-key http://geekhack.org/index.php?topic=52888.msg1176566#msg1176566
|
||||
|
||||
Resourse
|
||||
--------
|
||||
The IBM 4704: lots of pictures and info
|
||||
http://kishy.dyndns.org/?p=648#more-648
|
||||
|
||||
Brochure:
|
||||
http://ed-thelen.org/comp-hist/IBM-ProdAnn/4700.pdf
|
||||
|
||||
|
||||
|
||||
IBM 4704 Keyboard Protocol
|
||||
==========================
|
||||
On powering up keyboard sends keyboard ID; A3h for 6019284(62-key), for example.
|
||||
After that the keyboard enters FC command mode and waits for parameter data from host
|
||||
so that it doesn't send any scancode until you send 'FF'(End of FC command mode).
|
||||
|
||||
Keyboard ID
|
||||
-------------------------------
|
||||
Model 100 50-key A2h
|
||||
Model 200 62-key A3h
|
||||
Model 300 77-key A4h
|
||||
Model 400 107-key ??
|
||||
Japanese/Chinese 102-key A6h
|
||||
|
||||
|
||||
Connector
|
||||
---------
|
||||
Keyboard Plug from front
|
||||
|
||||
DSUB-9
|
||||
-------------
|
||||
\ N 2 3 4 5 /
|
||||
\ N N N N /
|
||||
---------
|
||||
2 GND
|
||||
3 VCC 5V
|
||||
4 DATA
|
||||
5 CLOCK
|
||||
N No connection/No pin.
|
||||
|
||||
|
||||
Keyboard to Host
|
||||
----------------
|
||||
Data bits are LSB first and Pairty is odd. Clock has around 60us high and 30us low part.
|
||||
|
||||
____ __ __ __ __ __ __ __ __ __ ________
|
||||
Clock \____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
|
||||
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
|
||||
Data ____/ X____X____X____X____X____X____X____X____X____X________
|
||||
Start 0 1 2 3 4 5 6 7 P Stop
|
||||
|
||||
Start bit: can be long as 300-350us.
|
||||
Inhibit: Pull Data line down to inhibit keyboard to send.
|
||||
Timing: Host reads bit while Clock is hi.
|
||||
Stop bit: Keyboard pulls down Data line to lo after 9th clock.
|
||||
|
||||
|
||||
Host to Keyboard
|
||||
----------------
|
||||
Data bits are LSB first and Pairty is odd. Clock has around 60us high and 30us low part.
|
||||
|
||||
____ __ __ __ __ __ __ __ __ __ ________
|
||||
Clock \______/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
|
||||
^ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___
|
||||
Data ____|__/ X____X____X____X____X____X____X____X____X____X \___
|
||||
| Start 0 1 2 3 4 5 6 7 P Stop
|
||||
Request by host
|
||||
|
||||
Start bit: can be long as 300-350us.
|
||||
Request: Host pulls Clock line down to request to send a command.
|
||||
Timing: After Request keyboard pull up Data and down Clock line to low for start bit.
|
||||
After request host release Clock line once Data line becomes hi.
|
||||
Host wirtes a bit while Clock is hi and Keyboard reads while low.
|
||||
Stop bit: Host releases or pulls up Data line to hi after 9th clock and waits for keybaord pull down the line to lo.
|
||||
|
||||
|
||||
Scancodes
|
||||
---------
|
||||
Keyboard doesn't send Break code for all keys except for Alt by default.
|
||||
|
||||
6019284 62-key:
|
||||
,-----------------------------------------------------------.
|
||||
| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|???|BS |
|
||||
|-----------------------------------------------------------|
|
||||
|Tab | Q| W| E| R| T| Y| U| I| O| P| ¢| \| PD2|
|
||||
|-----------------------------------------------------------|
|
||||
|Ctrl | A| S| D| F| G| H| J| K| L| ;| '| {}| PD3|
|
||||
|-----------------------------------------------------------|
|
||||
|Shif| <>| Z| X| C| V| B| N| M| ,| ,| /|???|Shift |
|
||||
|-----------------------------------------------------------|
|
||||
|Reset|blk|Alt | Space |Alt |blk|Enter|
|
||||
`-----------------------------------------------------------'
|
||||
+----------+---------------------+----------+----------+
|
||||
|` 00|PD1 04|Caps 20|LShift 30|Reset 31|
|
||||
|1 18|q 05|a 21|<> 3E|Rblank 41|
|
||||
|2 19|w 06|s 22|z 32|Alt 3F|
|
||||
|3 1A|e 13|d 23|x 33|Space 40|
|
||||
|4 10|r 14|f 24|c 34|Alt 3F|
|
||||
|5 11|t 15|g 25|v 35|Lblank 42|
|
||||
|6 12|y 16|h 26|b 36|Enter 2F|
|
||||
|7 08|u 17|j 27|n 37| |
|
||||
|8 09|i 01|k 28|m 38| |
|
||||
|9 0A|o 02|l 29|, 39| |
|
||||
|0 0F|p 03|; 2A|. 3A| |
|
||||
|- 1F|¢ 1B|' 2B|/ 3B| |
|
||||
|= 0D|\ 1C|{} 2C|??? 3C| |
|
||||
|??? 0C|PD2 1D|PD3 2D|RShift 3D| |
|
||||
|BS 0E| | | | |
|
||||
+----------+---------------------+----------+----------+
|
||||
Bit7 is 'press flag' which set 1 on press and 0 on release when break code is enabled.
|
||||
|
||||
NOTE: When break code is enabled the key sends scancode with setting 7th bit on press
|
||||
and without it on release. That is, '`' sends 80h on press and 00h on release.
|
||||
|
||||
|
||||
Keyboard command
|
||||
----------------
|
||||
Keyboard accepts these commands from host.
|
||||
|
||||
Description Entry point
|
||||
-----------------------------------------------------------
|
||||
FF Soft Reset 0008h
|
||||
FE Resend 00e8h
|
||||
FD Buzzer(emits a short beep) 00edh
|
||||
FC Set Key Flag 00f6h
|
||||
FB Soft Reset 0008h
|
||||
FA Reset 0000h
|
||||
|
||||
|
||||
Keyboard response
|
||||
-----------------
|
||||
Keyobard sends these bytes to host.
|
||||
|
||||
Description Entry point
|
||||
-----------------------------------------------------------
|
||||
FE Overflow(key event/receive data) 00c5h, 0346h
|
||||
Memory test error 0224h
|
||||
FD Command out of bound 00d8h
|
||||
Key out of bound
|
||||
7E Read/Parity error in receive from host 00bch
|
||||
|
||||
|
||||
Set Key Flag command(FC)
|
||||
------------------------
|
||||
After 'Power on Reset' firmware enters this command mode and waits for data from host,
|
||||
so that you don't need to send 'FC' and it doesn't send any scancode until you send 'FF'.
|
||||
|
||||
Data sent from host:
|
||||
|
||||
bit: 7 6 ... 0
|
||||
en | |
|
||||
| `-----`--- scan code
|
||||
`------------- enable bit(0: enable repeat, 1: enable break)
|
||||
|
||||
00-77 Enable repeat(78-7F: invalid scancode)
|
||||
80-F7 Enable break(F8-FF: invalid scancode)
|
||||
FE Resend(011ah) no need to use
|
||||
FF End(0114h) exits FC command mode.
|
||||
|
||||
Response from keyboard:
|
||||
FD Out of bound - Invalid scancode
|
||||
|
||||
Examples:
|
||||
To enable break code of all keys.
|
||||
|
||||
FC 80 81 ... F7 FF
|
||||
|
30
converter/ibm4704_usb/keymap_common.c
Normal file
30
converter/ibm4704_usb/keymap_common.c
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
Copyright 2011,2012,2013 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 "keymap_common.h"
|
||||
|
||||
|
||||
/* translates key to keycode */
|
||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
|
||||
{
|
||||
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
|
||||
}
|
||||
|
||||
/* translates Fn keycode to action */
|
||||
action_t keymap_fn_to_action(uint8_t keycode)
|
||||
{
|
||||
return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
|
||||
}
|
73
converter/ibm4704_usb/keymap_common.h
Normal file
73
converter/ibm4704_usb/keymap_common.h
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
Copyright 2011,2012,2013 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 KEYMAP_COMMON_H
|
||||
#define KEYMAP_COMMON_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "keycode.h"
|
||||
#include "action.h"
|
||||
#include "action_macro.h"
|
||||
#include "report.h"
|
||||
#include "print.h"
|
||||
#include "debug.h"
|
||||
#include "keymap.h"
|
||||
|
||||
|
||||
// 32*8(256) byte array which converts PS/2 code into USB code
|
||||
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
||||
extern const uint16_t fn_actions[];
|
||||
|
||||
|
||||
/* Original keys */
|
||||
#define KEYMAP( \
|
||||
K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, \
|
||||
K04,K05,K06,K13,K14,K15,K16,K17,K01,K02,K03,K1B,K1C,K1D, \
|
||||
K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K2A,K2B,K2C,K2D, \
|
||||
K30,K3E,K32,K33,K34,K35,K36,K37,K38,K39,K3A,K3B,K3C,K3D, \
|
||||
K31,K41,K3F, K40, K42,K2F \
|
||||
) { \
|
||||
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_NO }, \
|
||||
{ KC_##K08, KC_##K09, KC_##K0A, KC_NO, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
|
||||
{ KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_NO, KC_##K1F }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
|
||||
{ KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_NO, KC_##K2F }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \
|
||||
{ KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \
|
||||
{ KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
{ K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \
|
||||
{ K50, K51, K52, K53, K54, K55, K56, K57 }, \
|
||||
{ K58, K59, K5A, K5B, K5C, K5D, K5E, K5F }, \
|
||||
{ K60, K61, K62, K63, K64, K65, K66, K67 }, \
|
||||
{ K68, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \
|
||||
{ K70, K71, K72, K73, K74, K75, K76, K77 }, \
|
||||
{ K78, K79, K7A, K7B, K7C, K7D, K7E, K7F }, \
|
||||
*/
|
85
converter/ibm4704_usb/keymap_hasu.c
Normal file
85
converter/ibm4704_usb/keymap_hasu.c
Normal file
@ -0,0 +1,85 @@
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* 0: default
|
||||
* ,-----------------------------------------------------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|???|BS |
|
||||
* |-----------------------------------------------------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
|
||||
* |-----------------------------------------------------------|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|xxx|Ret |
|
||||
* |-----------------------------------------------------------|
|
||||
* |Shif|xxx| Z| X| C| V| B| N| M| ,| ,| /|xxx|Shift |
|
||||
* |-----------------------------------------------------------|
|
||||
* |Ctrl |Gui|Alt | Space |Alt |Gui|Ctrl |
|
||||
* `-----------------------------------------------------------'
|
||||
*/
|
||||
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, FN1, QUOT,NO, ENT, \
|
||||
LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, FN2, NO, FN0, \
|
||||
LCTL,LGUI,LALT, FN3, RGUI,RCTL \
|
||||
),
|
||||
|
||||
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,PAUS, UP, NO, BSPC, \
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,NO, ENT, \
|
||||
LSFT,NO, NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,NO, TRNS, \
|
||||
LCTL,LGUI,LALT, SPC, RGUI,RCTL \
|
||||
),
|
||||
|
||||
KEYMAP(
|
||||
ESC, 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,WSTP,WBAK,WFWD,BSPC, \
|
||||
LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,NO, NO, ENT, \
|
||||
LSFT,NO, NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, NO, RSFT,\
|
||||
LCTL,LGUI,LALT, BTN1, RGUI,RCTL \
|
||||
),
|
||||
|
||||
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, NO, ENT, \
|
||||
LSFT,NO, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS,NO, RSFT, \
|
||||
LCTL,LGUI,LALT, SPC, RGUI,RCTL \
|
||||
),
|
||||
|
||||
KEYMAP(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
|
||||
TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5,FN4, \
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,BTN1,NO, NO, ENT, \
|
||||
LSFT,NO, NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, NO, NO, \
|
||||
LCTL,LGUI,LALT, TRNS, RGUI,RCTL \
|
||||
),
|
||||
};
|
||||
|
||||
enum macro_id {
|
||||
ALT_TAB,
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
[0] = ACTION_LAYER_MOMENTARY(1),
|
||||
[1] = ACTION_LAYER_TAP_KEY(2, KC_SCLN),
|
||||
[2] = ACTION_LAYER_TAP_KEY(3, KC_SLASH),
|
||||
[3] = ACTION_LAYER_TAP_KEY(4, KC_SPC),
|
||||
[4] = ACTION_MACRO(ALT_TAB),
|
||||
};
|
||||
|
||||
/*
|
||||
* Macro definition
|
||||
*/
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
keyevent_t event = record->event;
|
||||
|
||||
switch (id) {
|
||||
case ALT_TAB:
|
||||
return (event.pressed ?
|
||||
MACRO( D(LALT), D(TAB), END ) :
|
||||
MACRO( U(TAB), END ));
|
||||
}
|
||||
return MACRO_NONE;
|
||||
}
|
38
converter/ibm4704_usb/keymap_plain.c
Normal file
38
converter/ibm4704_usb/keymap_plain.c
Normal file
@ -0,0 +1,38 @@
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* 0: default
|
||||
* ,-----------------------------------------------------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|???|BS |
|
||||
* |-----------------------------------------------------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
|
||||
* |-----------------------------------------------------------|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| #|Ret |
|
||||
* |-----------------------------------------------------------|
|
||||
* |Shif| \| Z| X| C| V| B| N| M| ,| ,| /|???|Shift |
|
||||
* |-----------------------------------------------------------|
|
||||
* |Ctrl |Gui|Alt | Space |Alt* |Gui|Ctrl |
|
||||
* `-----------------------------------------------------------'
|
||||
*/
|
||||
KEYMAP(
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,BSPC, \
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
|
||||
LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS,ENT, \
|
||||
LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,NO, FN0, \
|
||||
LCTL,LGUI,LALT, SPC, RGUI,RCTL \
|
||||
),
|
||||
|
||||
/* 1: HHKB */
|
||||
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,PAUS, UP, NO, INS, \
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,NO, ENT, \
|
||||
LSFT,NO, NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,NO, TRNS, \
|
||||
LCTL,LGUI,LALT, SPC, RGUI,RCTL \
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
[0] = ACTION_LAYER_MOMENTARY(1),
|
||||
};
|
24
converter/ibm4704_usb/led.c
Normal file
24
converter/ibm4704_usb/led.c
Normal file
@ -0,0 +1,24 @@
|
||||
/*
|
||||
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)
|
||||
{
|
||||
}
|
170
converter/ibm4704_usb/matrix.c
Normal file
170
converter/ibm4704_usb/matrix.c
Normal file
@ -0,0 +1,170 @@
|
||||
/*
|
||||
Copyright 2014 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 <stdbool.h>
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
#include "action.h"
|
||||
#include "print.h"
|
||||
#include "debug.h"
|
||||
#include "util.h"
|
||||
#include "ibm4704.h"
|
||||
#include "matrix.h"
|
||||
|
||||
|
||||
static void matrix_make(uint8_t code);
|
||||
static void matrix_break(uint8_t code);
|
||||
static void matrix_clear(void);
|
||||
|
||||
|
||||
/*
|
||||
* Matrix Array usage:
|
||||
* IBM 4704 scan codes are assigned into 128(16x8)-cell matrix.
|
||||
*
|
||||
* 8bit wide
|
||||
* +---------+
|
||||
* 0| |
|
||||
* :| XX | 00-7F
|
||||
* f| |
|
||||
* +---------+
|
||||
*
|
||||
* Exceptions:
|
||||
*/
|
||||
static uint8_t matrix[MATRIX_ROWS];
|
||||
|
||||
// scan code bits 7654 3210
|
||||
// R:row/C:column -RRR RCCC
|
||||
#define ROW(code) ((code>>3)&0x0f)
|
||||
#define COL(code) (code&0x07)
|
||||
|
||||
|
||||
inline
|
||||
uint8_t matrix_rows(void)
|
||||
{
|
||||
return MATRIX_ROWS;
|
||||
}
|
||||
|
||||
inline
|
||||
uint8_t matrix_cols(void)
|
||||
{
|
||||
return MATRIX_COLS;
|
||||
}
|
||||
|
||||
static void enable_break(void)
|
||||
{
|
||||
uint8_t ret;
|
||||
print("Enable break: ");
|
||||
// valid scancode: 00-77h
|
||||
for (uint8_t code = 0; code < 0x78; code++) {
|
||||
while (ibm4704_send(0x80|code) != 0) {
|
||||
print("z");
|
||||
_delay_us(500);
|
||||
}
|
||||
_delay_us(2000);
|
||||
ret = ibm4704_recv();
|
||||
if (ret != 0xff) {
|
||||
xprintf("c%02X:r%02X ", code, ret);
|
||||
}
|
||||
_delay_us(1000);
|
||||
}
|
||||
_delay_us(1000);
|
||||
while (ibm4704_send(0xFF) != 0) { _delay_us(500); } // End
|
||||
print("End\n");
|
||||
}
|
||||
|
||||
void matrix_init(void)
|
||||
{
|
||||
uint8_t ret;
|
||||
debug_enable = true;
|
||||
|
||||
ibm4704_init();
|
||||
matrix_clear();
|
||||
|
||||
// read keyboard id
|
||||
while ((ret = ibm4704_recv()) == 0xFF) {
|
||||
ibm4704_send(0xFE);
|
||||
_delay_us(100);
|
||||
}
|
||||
|
||||
_delay_ms(2000); // wait for starting up debug console
|
||||
print("IBM 4704 converter\n");
|
||||
xprintf("Keyboard ID: %02X\n", ret);
|
||||
enable_break();
|
||||
}
|
||||
|
||||
/*
|
||||
* IBM 4704 Scan Code
|
||||
*/
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
uint8_t code = ibm4704_recv();
|
||||
if (code==0xFF) {
|
||||
// Not receivd
|
||||
return 0;
|
||||
} else if ((code&0x78)==0x78) {
|
||||
// 0xFF-F8 and 0x7F-78 is not scancode
|
||||
xprintf("Error: %0X\n", code);
|
||||
matrix_clear();
|
||||
return 0;
|
||||
} else if (code&0x80) {
|
||||
matrix_make(code);
|
||||
} else {
|
||||
matrix_break(code);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
inline
|
||||
bool matrix_is_on(uint8_t row, uint8_t col)
|
||||
{
|
||||
return (matrix[row] & (1<<col));
|
||||
}
|
||||
|
||||
inline
|
||||
uint8_t matrix_get_row(uint8_t row)
|
||||
{
|
||||
return matrix[row];
|
||||
}
|
||||
|
||||
void matrix_print(void)
|
||||
{
|
||||
print("\nr/c 01234567\n");
|
||||
for (uint8_t row = 0; row < matrix_rows(); row++) {
|
||||
xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
inline
|
||||
static void matrix_make(uint8_t code)
|
||||
{
|
||||
matrix[ROW(code)] |= 1<<COL(code);
|
||||
}
|
||||
|
||||
inline
|
||||
static void matrix_break(uint8_t code)
|
||||
{
|
||||
matrix[ROW(code)] &= ~(1<<COL(code));
|
||||
}
|
||||
|
||||
inline
|
||||
static void matrix_clear(void)
|
||||
{
|
||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
|
||||
}
|
@ -10,13 +10,14 @@ TARGET_DIR = .
|
||||
# keyboard dependent files
|
||||
SRC = matrix.c \
|
||||
led.c \
|
||||
keymap_common.c \
|
||||
m0110.c
|
||||
|
||||
# To use own keymap file run make like: make keymap=hasu
|
||||
ifdef keymap
|
||||
SRC += keymap_$(keymap).c
|
||||
ifdef KEYMAP
|
||||
SRC += keymap_$(KEYMAP).c
|
||||
else
|
||||
SRC += keymap.c
|
||||
SRC += keymap_plain.c
|
||||
endif
|
||||
|
||||
CONFIG_H = config.h
|
||||
@ -71,14 +72,14 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
# Build Options
|
||||
# *Comment out* to disable the options.
|
||||
#
|
||||
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
|
||||
#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor
|
||||
#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor
|
||||
|
||||
|
||||
|
||||
|
@ -2,7 +2,9 @@ M0110/M0110A to USB keyboard converter
|
||||
======================================
|
||||
This firmware converts the protocol of Apple Macintosh keyboard **M0110**, **M0110A** and **M0120** into USB. Target of this project is USB AVR controller **ATmega32U4**. Using this converter you can revive these retro keyboards with modern computer.
|
||||
|
||||
Pics of **M0110 + M0120** and **M0110A**.
|
||||
Read README of top directory too.
|
||||
|
||||
Pictures of **M0110 + M0120** and **M0110A**.
|
||||
|
||||

|
||||

|
||||
@ -17,6 +19,7 @@ Update
|
||||
------
|
||||
- 2013/08: Change port for signals `PF` to `PD`
|
||||
- 2013/09: Change port again, it uses inversely `PD0` for data and `PD1` for clock line now.
|
||||
- 2014/06: Change keymaps
|
||||
|
||||
|
||||
|
||||
@ -31,7 +34,7 @@ Note that original cable used with Mac is **straight** while phone handset cable
|
||||
|
||||
<http://en.wikipedia.org/wiki/Modular_connector#4P4C>
|
||||
|
||||
Close-up pic of handset cable. You can see one end of plug has reverse color codes against the other. Click to enlarge.
|
||||
Close-up picture of handset cable. You can see one end of plug has reverse color codes against the other. Click to enlarge.
|
||||
[](http://i.imgur.com/3S9P1mY.jpg?1)
|
||||
|
||||
[Teensy]: http://www.pjrc.com/teensy/
|
||||
@ -43,87 +46,33 @@ Close-up pic of handset cable. You can see one end of plug has reverse color cod
|
||||

|
||||
|
||||
|
||||
### Pull-up Registor
|
||||
You may need pull-up registors on signal lines(`CLOCK`, `DATA`) in particular when you have long or coiled cable. **1k-10k Ohm** will be OK for this purpose. In that case the converter may not read signal from keyboard correctly without pull-up resistors.
|
||||
### Pull-up Resistor
|
||||
You may need pull-up resistors on signal lines(`CLOCK`, `DATA`) in particular when you have long or coiled cable. **1k-10k Ohm** will be OK for this purpose. In that case the converter may not read signal from keyboard correctly without pull-up resistors.
|
||||
|
||||
|
||||
|
||||
Building Frimware
|
||||
Building Firmware
|
||||
-----------------
|
||||
To compile firmware you need AVR GCC. You can edit *Makefile* and *config.h* to change compile options and pin configuration.
|
||||
|
||||
$ git clone git://github.com/tmk/tmk_keyboard.git (or download source)
|
||||
$ cd m0110_usb
|
||||
$ make -f Makefile clean
|
||||
$ make -f Makefile
|
||||
$ make clean
|
||||
$ make
|
||||
|
||||
and program your Teensy with [PJRC Teensy loader](http://www.pjrc.com/teensy/loader.html).
|
||||
To select keymap use `KEYMAP` option.
|
||||
|
||||
$ make clean
|
||||
$ make KEYMAP={plain|spacefn|hasu}
|
||||
|
||||
|
||||
|
||||
Keymap
|
||||
------
|
||||
You can change keymaps by editing *keymap.c*.
|
||||
To create your own keymap copy existent keymap file to `keymap_name.c` and edit it. You can build it like this.
|
||||
|
||||
### M0110 & M0120
|
||||
#### *Default Layer*
|
||||
,---------------------------------------------------------. ,---------------.
|
||||
| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| -|Lft|Rgt|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| Up|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| Dn|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
|
||||
`---------------------------------------------------------' |-----------|Ent|
|
||||
|Ctl|Gui | Space |Alt |Ctl| | 0| .| |
|
||||
`-----------------------------------------------' `---------------'
|
||||
|
||||
- `Space` and `Enter` also work as `Fn` layer switch key when holding down.
|
||||
|
||||
#### *Function Layer(WASD/HHKB)*
|
||||
,---------------------------------------------------------. ,---------------.
|
||||
|Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| -|Lft|Rgt|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |Ins| \| | 7| 8| 9| Up|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Caps |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Enter | | 4| 5| 6| Dn|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Shift |End| |PgD| | | | |End|PgD|Dow|Shift | | 1| 2| 3| |
|
||||
`---------------------------------------------------------' |-----------|Ent|
|
||||
|Ctl|Gui | Space |Alt |Ctl| | 0| .| |
|
||||
`-----------------------------------------------' `---------------'
|
||||
|
||||
|
||||
### M0110A
|
||||
#### *Default Layer*
|
||||
,---------------------------------------------------------. ,---------------.
|
||||
| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
|-----------------------------------------------------' | |---------------|
|
||||
|Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft| Up| | 1| 2| 3| |
|
||||
|---------------------------------------------------------| |-----------|Ent|
|
||||
|Ctrl |Gui | Space | \|Lft|Rgt|Dwn| | 0| .| |
|
||||
`---------------------------------------------------------' `---------------'
|
||||
|
||||
- `Space` and `Enter` also work as `Fn` layer switch key when holding down.
|
||||
- `Backslash(\)` also works as `Alt` when holding down.
|
||||
|
||||
#### *Function Layer(WASD/HHKB)*
|
||||
,---------------------------------------------------------. ,---------------.
|
||||
|Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| =| /| *|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |Ins| | | 7| 8| 9| -|
|
||||
|-----------------------------------------------------' | |---------------|
|
||||
|Caps |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Enter | | 4| 5| 6| +|
|
||||
|---------------------------------------------------------| |---------------|
|
||||
|Shift |End| |PgD| | | | |End|PgD|Dow|Shif|PgU| | 1| 2| 3| |
|
||||
|---------------------------------------------------------| |-----------|Ent|
|
||||
|Ctrl |Gui | Space | \|Hom|End|PgD| | 0| .| |
|
||||
`---------------------------------------------------------' `---------------'
|
||||
$ make clean
|
||||
$ make KEYMAP=name
|
||||
|
||||
|
||||
|
||||
|
37
converter/m0110_usb/keymap_common.c
Normal file
37
converter/m0110_usb/keymap_common.c
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
Copyright 2011,2012,2014 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 <avr/pgmspace.h>
|
||||
#include "action.h"
|
||||
#include "keycode.h"
|
||||
#include "keymap.h"
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
/* translates key to keycode */
|
||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
|
||||
{
|
||||
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
|
||||
}
|
||||
|
||||
/* translates Fn index to action */
|
||||
action_t keymap_fn_to_action(uint8_t keycode)
|
||||
{
|
||||
action_t action;
|
||||
action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
|
||||
return action;
|
||||
}
|
107
converter/m0110_usb/keymap_common.h
Normal file
107
converter/m0110_usb/keymap_common.h
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
Copyright 2011,2012,2014 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 <avr/pgmspace.h>
|
||||
#include "keycode.h"
|
||||
#include "keymap.h"
|
||||
|
||||
|
||||
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
||||
extern const uint16_t fn_actions[];
|
||||
|
||||
|
||||
/*
|
||||
* The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset
|
||||
* of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist
|
||||
* on the M0110A, but since it generates a unique scan code which is not used for some other key in
|
||||
* the M0110A, they are totally interchangeable. In fact, the M0110A is functionally (almost)
|
||||
* identical to the combination of the M0110 along with the M0120 keypad. The only difference
|
||||
* (which is causing some problems as you will read below) is that the M0110+M0120 don't have
|
||||
* dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which
|
||||
* doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has
|
||||
* substituted the [comma] key with the [=] key, however its scancode is the same.
|
||||
*
|
||||
* Physical layout:
|
||||
* M0110A
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|
||||
* |---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
*
|
||||
* M0110 M0120
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| -| +| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
|
||||
* `---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt|Mac | Space |Ent |Opt| | 0| .| |
|
||||
* `-----------------------------------------------' `---------------'
|
||||
* With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down)
|
||||
*
|
||||
* NOTE: \ is located differently.
|
||||
* NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A).
|
||||
* NOTE: Left Shift and right Shift are logically same key.
|
||||
* NOTE: Left Option and right Option are logically same key.
|
||||
*/
|
||||
|
||||
/* Keymap definition Macro
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|
||||
* |---------------------------------------------------------| |-----------|Ent|
|
||||
* |Opt |Mac | Space |Ent| \|Lft|Rgt|Dn | | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
* NOTE: Ent between Space and \ means Enter on M0110.
|
||||
*/
|
||||
#define KEYMAP( \
|
||||
K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \
|
||||
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K4E, \
|
||||
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K66, \
|
||||
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K4D, K53,K54,K55,K4C, \
|
||||
K3A,K37, K31, K34,K2A,K46,K42,K48, K52, K41 \
|
||||
) { \
|
||||
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
|
||||
{ KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
|
||||
{ KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
|
||||
{ KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \
|
||||
{ KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_##K47 }, \
|
||||
{ KC_##K48, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
|
||||
{ KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \
|
||||
{ KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \
|
||||
}
|
118
converter/m0110_usb/keymap_for_editor.c
Normal file
118
converter/m0110_usb/keymap_for_editor.c
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
Copyright 2014 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 "keycode.h"
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
#ifdef KEYMAP_SECTION_ENABLE
|
||||
const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
|
||||
#else
|
||||
const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {
|
||||
#endif
|
||||
/* Default:
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|
||||
* |---------------------------------------------------------| |-----------|Ent|
|
||||
* |Ctl |Gui | Space |Alt| \|Lft|Rgt|Dn | | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
*/
|
||||
[0] = KEYMAP(
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, CLR, EQL, PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
|
||||
LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT, FN15, P4, P5, P6, PPLS,
|
||||
LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT,
|
||||
LCTL,LGUI, FN16, LALT,FN31,LEFT,RGHT,DOWN, P0, PDOT
|
||||
),
|
||||
/* Cursor Layer(WASD, IJKL)
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |Ins| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Enter | | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift |End| |PgD| | | | |End|PgD|Dow|Shif|PgU| | 1| 2| 3| |
|
||||
* |---------------------------------------------------------| |-----------|Ent|
|
||||
* |Ctl |Gui | Space |Alt | \|Hom|End|PgD| | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
*/
|
||||
[3] = KEYMAP(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, INS, P7, P8, P9, PMNS,
|
||||
LCAP,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN15, P4, P5, P6, PPLS,
|
||||
LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT,
|
||||
LCTL,LGUI, FN16, LALT,FN31,HOME,END, PGDN, P0, PDOT
|
||||
),
|
||||
[4] = KEYMAP(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, INS, P7, P8, P9, PMNS,
|
||||
LCAP,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN15, P4, P5, P6, PPLS,
|
||||
LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT,
|
||||
LCTL,LGUI, FN16, LALT,FN31,HOME,END, PGDN, P0, PDOT
|
||||
),
|
||||
[7] = {},
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Fn action definition
|
||||
*/
|
||||
#ifdef KEYMAP_SECTION_ENABLE
|
||||
const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = {
|
||||
#else
|
||||
const uint16_t fn_actions[] PROGMEM = {
|
||||
#endif
|
||||
[0] = ACTION_LAYER_MOMENTARY(1),
|
||||
[1] = ACTION_LAYER_MOMENTARY(2),
|
||||
[2] = ACTION_LAYER_MOMENTARY(3),
|
||||
[3] = ACTION_LAYER_MOMENTARY(4),
|
||||
[4] = ACTION_LAYER_MOMENTARY(5),
|
||||
[5] = ACTION_LAYER_MOMENTARY(6),
|
||||
[6] = ACTION_LAYER_MOMENTARY(7),
|
||||
[7] = ACTION_LAYER_TOGGLE(1),
|
||||
[8] = ACTION_LAYER_TOGGLE(2),
|
||||
[9] = ACTION_LAYER_TOGGLE(3),
|
||||
[10] = ACTION_LAYER_TAP_TOGGLE(1),
|
||||
[11] = ACTION_LAYER_TAP_TOGGLE(2),
|
||||
[12] = ACTION_LAYER_TAP_TOGGLE(3),
|
||||
[13] = ACTION_LAYER_TAP_KEY(1, KC_F),
|
||||
[14] = ACTION_LAYER_TAP_KEY(2, KC_J),
|
||||
[15] = ACTION_LAYER_TAP_KEY(3, KC_ENTER),
|
||||
[16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE),
|
||||
[17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON),
|
||||
[18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE),
|
||||
[19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH),
|
||||
[20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE),
|
||||
[21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE),
|
||||
[22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE),
|
||||
[23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER),
|
||||
[24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC),
|
||||
[25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE),
|
||||
[26] = ACTION_MODS_ONESHOT(MOD_LCTL),
|
||||
[27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC),
|
||||
[28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE),
|
||||
[29] = ACTION_MODS_ONESHOT(MOD_LSFT),
|
||||
[30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRAVE),
|
||||
[31] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_BSLASH),
|
||||
};
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
|
||||
Copyright 2014 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
|
||||
@ -14,188 +14,74 @@ 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/>.
|
||||
*/
|
||||
/* M0110A Support was contributed by skagon@github */
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "keycode.h"
|
||||
#include "print.h"
|
||||
#include "debug.h"
|
||||
#include "util.h"
|
||||
#include "keymap.h"
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Default:
|
||||
* M0110
|
||||
* ,---------------------------------------------------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs|
|
||||
* |---------------------------------------------------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
|
||||
* |---------------------------------------------------------|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| Fn| '|Return|
|
||||
* |---------------------------------------------------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| Fn|Shift |
|
||||
* `---------------------------------------------------------'
|
||||
* |Fn |alt | Fn |Gui |Fn |
|
||||
* `-----------------------------------------------'
|
||||
*/
|
||||
[0] = KEYMAP(
|
||||
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
|
||||
LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT, ENT, P4, P5, P6, PPLS,
|
||||
LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, UP, P1, P2, P3, PENT,
|
||||
FN0, LALT, FN2, LGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT
|
||||
),
|
||||
// IJKL cursor
|
||||
[1] = KEYMAP(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,NO, NO, NO, NO, NO, HOME,PGDN,UP, PGUP,END, NO, NO, P7, P8, P9, PMNS,
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, HOME,LEFT,DOWN,RGHT,END, NO, ENT, P4, P5, P6, PPLS,
|
||||
LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, PGUP, P1, P2, P3, PENT,
|
||||
TRNS,LALT, SPC, LGUI,BSLS,HOME,END, PGDN, P0, PDOT
|
||||
),
|
||||
// HJKL cursor
|
||||
[2] = KEYMAP(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,NO, NO, NO, NO, NO, HOME,PGDN,UP, PGUP,END, NO, NO, P7, P8, P9, PMNS,
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS,
|
||||
LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, PGUP, P1, P2, P3, PENT,
|
||||
TRNS,LALT, SPC, LGUI,BSLS,HOME,END, PGDN, P0, PDOT
|
||||
),
|
||||
// Mousekey
|
||||
[3] = KEYMAP(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,Q, W, E, R, T, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD, P7, P8, P9, PMNS,
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,BTN1,NO, ENT, P4, P5, P6, PPLS,
|
||||
LSFT,Z, X, C, V, B, BTN2,BTN1,BTN4,BTN5,NO, PGUP, P1, P2, P3, PENT,
|
||||
NO, LALT, TRNS, LGUI,BSLS,HOME,END, PGDN, P0, PDOT
|
||||
),
|
||||
// Mousekey
|
||||
[4] = KEYMAP(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,Q, W, E, R, T, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD, P7, P8, P9, PMNS,
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,TRNS,NO, ENT, P4, P5, P6, PPLS,
|
||||
LSFT,Z, X, C, V, B, BTN2,BTN1,BTN4,BTN5,NO, PGUP, P1, P2, P3, PENT,
|
||||
NO, LALT, BTN1, LGUI,BSLS,HOME,END, PGDN, P0, PDOT
|
||||
),
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset
|
||||
* of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist
|
||||
* on the M0110A, but since it generates a unique scan code which is not used for some other key in
|
||||
* the M0110A, they are totally interchangeable. In fact, the M0110A is functionally (almost)
|
||||
* identical to the combination of the M0110 along with the M0120 keypad. The only difference
|
||||
* (which is causing some problems as you will read below) is that the M0110+M0120 don't have
|
||||
* dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which
|
||||
* doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has
|
||||
* substituted the [comma] key with the [=] key, however its scancode is the same.
|
||||
*
|
||||
* Physical layout:
|
||||
* M0110A
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|
||||
* |---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
*
|
||||
* M0110 M0120
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| -| +| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
|
||||
* `---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt|Mac | Space |Ent |Opt| | 0| .| |
|
||||
* `-----------------------------------------------' `---------------'
|
||||
* With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down)
|
||||
*
|
||||
* NOTE: \ is located differently.
|
||||
* NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A).
|
||||
* NOTE: Left Shift and right Shift are logically same key.
|
||||
* NOTE: Left Option and right Option are logically same key.
|
||||
* Fn action definition
|
||||
*/
|
||||
|
||||
/* Keymap definition Macro
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|
||||
* |---------------------------------------------------------| |-----------|Ent|
|
||||
* |Opt |Mac | Space |Ent| \|Lft|Rgt|Dn | | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
* NOTE: Ent between Space and \ means Enter on M0110.
|
||||
*/
|
||||
#define KEYMAP( \
|
||||
K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \
|
||||
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K4E, \
|
||||
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K66, \
|
||||
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K4D, K53,K54,K55,K4C, \
|
||||
K3A,K37, K31, K34,K2A,K46,K42,K48, K52, K41 \
|
||||
) { \
|
||||
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
|
||||
{ KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
|
||||
{ KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
|
||||
{ KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \
|
||||
{ KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_##K47 }, \
|
||||
{ KC_##K48, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
|
||||
{ KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \
|
||||
{ KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \
|
||||
}
|
||||
|
||||
#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
|
||||
|
||||
|
||||
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
|
||||
static const uint8_t PROGMEM fn_layer[] = {
|
||||
1, // Fn0
|
||||
2, // Fn1
|
||||
3, // Fn2
|
||||
1, // Fn3
|
||||
2, // Fn4
|
||||
0, // Fn5
|
||||
0, // Fn6
|
||||
0 // Fn7
|
||||
const uint16_t fn_actions[] PROGMEM = {
|
||||
[0] = ACTION_LAYER_MOMENTARY(1),
|
||||
[1] = ACTION_LAYER_TAP_KEY(2, KC_SLASH),
|
||||
[2] = ACTION_LAYER_TAP_KEY(3, KC_SPACE),
|
||||
[3] = ACTION_LAYER_TAP_KEY(4, KC_SCOLON),
|
||||
};
|
||||
|
||||
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
|
||||
// See layer.c for details.
|
||||
static const uint8_t PROGMEM fn_keycode[] = {
|
||||
KC_ENTER, // Fn0
|
||||
KC_SCOLON, // Fn1
|
||||
KC_SLASH, // Fn2
|
||||
KC_UP, // Fn3
|
||||
KC_NO, // Fn4
|
||||
KC_NO, // Fn5
|
||||
KC_NO, // Fn6
|
||||
KC_NO // Fn7
|
||||
};
|
||||
|
||||
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Default:
|
||||
* M0110 M0120
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Gui| -| +| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| Fn| '|Return| | 4| 5| 6| ,|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| Fn|Shift | | 1| 2| 3| |
|
||||
* `---------------------------------------------------------' |-----------|Ent|
|
||||
* |Fn |alt | Space |Gui |Fn | | 0| .| |
|
||||
* `-----------------------------------------------' `---------------'
|
||||
*/
|
||||
KEYMAP(
|
||||
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
|
||||
LCTL,A, S, D, F, G, H, J, K, L, FN1, QUOT, FN0, P4, P5, P6, PPLS,
|
||||
LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, FN3, P1, P2, P3, PENT,
|
||||
FN4, LALT, SPC, LGUI,BSLS,LGUI,RCTL,RCTL, LGUI, PDOT
|
||||
),
|
||||
// HHKB & WASD
|
||||
KEYMAP(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, P7, P8, P9, PMNS,
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN0, P4, P5, P6, PPLS,
|
||||
LSFT,NO, NO, NO, NO, NO, NO, NO, END, PGDN,DOWN, FN3, P1, P2, P3, PENT,
|
||||
LCTL,LALT, SPC, LGUI,INS, LGUI,RCTL,RCTL, P0, PDOT
|
||||
),
|
||||
// vi mousekeys
|
||||
KEYMAP(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,PSCR,SLCK,PAUS, P7, P8, P9, PMNS,
|
||||
LCTL,VOLD,VOLU,MUTE,NO, NO, MS_L,MS_D,MS_U,MS_R,FN1, NO, ENT, P4, P5, P6, PPLS,
|
||||
LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,NO, NO, NO, NO, P1, P2, P3, PENT,
|
||||
FN4, LALT, BTN1, LGUI,NO, LGUI,RCTL,RCTL, P0, PDOT
|
||||
),
|
||||
// vi cusorkeys
|
||||
KEYMAP(
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
CAPS,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, PSCR,SLCK,PAUS, P7, P8, P9, PMNS,
|
||||
LCTL,NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS,
|
||||
LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, NO, P1, P2, P3, PENT,
|
||||
LCTL,LALT, SPC, LGUI,INS, LGUI,RCTL,RCTL, P0, PDOT
|
||||
),
|
||||
};
|
||||
|
||||
|
||||
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
|
||||
{
|
||||
return KEYCODE(layer, row, col);
|
||||
}
|
||||
|
||||
uint8_t keymap_fn_layer(uint8_t index)
|
||||
{
|
||||
return pgm_read_byte(&fn_layer[index]);
|
||||
}
|
||||
|
||||
uint8_t keymap_fn_keycode(uint8_t index)
|
||||
{
|
||||
return pgm_read_byte(&fn_keycode[index]);
|
||||
}
|
||||
|
64
converter/m0110_usb/keymap_plain.c
Normal file
64
converter/m0110_usb/keymap_plain.c
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
Copyright 2014 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 "keycode.h"
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Default:
|
||||
* M0110 M0120
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| -| +| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
|
||||
* `---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt|Mac | Space |Mac |Opt| | 0| .| |
|
||||
* `-----------------------------------------------' `---------------'
|
||||
* M0110A
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Nlk| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|
||||
* |---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
*/
|
||||
[0] = KEYMAP(
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,PEQL,PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
|
||||
LCAP,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, RGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT
|
||||
),
|
||||
};
|
||||
|
||||
/*
|
||||
* Fn action definition
|
||||
*/
|
||||
const uint16_t fn_actions[] PROGMEM = {
|
||||
};
|
||||
|
||||
|
71
converter/m0110_usb/keymap_spacefn.c
Normal file
71
converter/m0110_usb/keymap_spacefn.c
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
Copyright 2014 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 "keycode.h"
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Default:
|
||||
* M0110 M0120
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| -| +| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
|
||||
* `---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt|Mac | Space |Mac |Opt| | 0| .| |
|
||||
* `-----------------------------------------------' `---------------'
|
||||
* M0110A
|
||||
* ,---------------------------------------------------------. ,---------------.
|
||||
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Nlk| =| /| *|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | |---------------|
|
||||
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|
||||
* |---------------------------------------------------------| |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|
||||
* |---------------------------------------------------------' |-----------|Ent|
|
||||
* |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
|
||||
* `---------------------------------------------------------' `---------------'
|
||||
*/
|
||||
[0] = KEYMAP(
|
||||
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,PEQL,PSLS,PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
|
||||
LCTL,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, FN0, RGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT
|
||||
),
|
||||
[1] = KEYMAP(
|
||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
|
||||
TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, P7, P8, P9, PMNS,
|
||||
LCTL,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS, P4, P5, P6, PPLS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, PGUP, P1, P2, P3, PENT,
|
||||
TRNS,TRNS, TRNS, TRNS,INS, HOME,END, PGDN, P0, PDOT
|
||||
),
|
||||
};
|
||||
|
||||
/*
|
||||
* Fn action definition
|
||||
*/
|
||||
const uint16_t fn_actions[] PROGMEM = {
|
||||
[0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE),
|
||||
[1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde
|
||||
};
|
@ -1,5 +1,5 @@
|
||||
# Target file name (without extension).
|
||||
TARGET = ps2_usb_jis
|
||||
TARGET = next_usb
|
||||
|
||||
# Directory common source filess exist
|
||||
TOP_DIR = ../..
|
||||
@ -7,6 +7,12 @@ 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
|
||||
@ -24,44 +30,26 @@ MCU = atmega32u4 # Teensy 2.0
|
||||
F_CPU = 16000000
|
||||
|
||||
|
||||
# Boot Section Size in *bytes*
|
||||
# Teensy halfKay 512
|
||||
# Teensy++ halfKay 1024
|
||||
# Atmel DFU loader 4096
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
|
||||
# Build Options
|
||||
# *Comment out* to disable the options.
|
||||
#
|
||||
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
#NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
|
||||
#PS2_USE_USART = yes # uses hardware USART engine for PS/2 signal receive(recomened)
|
||||
#PS2_USE_INT = yes # uses external interrupt for falling edge of PS/2 clock pin
|
||||
PS2_USE_BUSYWAIT = yes # uses primitive reference code
|
||||
|
||||
|
||||
# keyboard dependent files
|
||||
SRC = keymap_jis.c \
|
||||
matrix.c \
|
||||
led.c
|
||||
|
||||
|
||||
ifdef PS2_USE_USART
|
||||
SRC += protocol/ps2_usart.c
|
||||
OPT_DEFS += -DPS2_USE_USART
|
||||
endif
|
||||
ifdef PS2_USE_INT
|
||||
SRC += protocol/ps2.c
|
||||
OPT_DEFS += -DPS2_USE_INT
|
||||
endif
|
||||
ifdef PS2_USE_BUSYWAIT
|
||||
SRC += protocol/ps2.c
|
||||
OPT_DEFS += -DPS2_USE_BUSYWAIT
|
||||
endif
|
||||
|
||||
|
||||
#CONFIG_H = config_pjrc_usart.h
|
||||
CONFIG_H = config.h
|
||||
|
||||
|
||||
#---------------- Programming Options --------------------------
|
||||
PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
|
||||
SRC += next_kbd.c
|
||||
|
||||
|
||||
# Search Path
|
||||
@ -69,7 +57,7 @@ VPATH += $(TARGET_DIR)
|
||||
VPATH += $(TOP_DIR)
|
||||
|
||||
|
||||
include $(TOP_DIR)/protocol/pjrc.mk
|
||||
include $(TOP_DIR)/protocol.mk
|
||||
include $(TOP_DIR)/protocol/pjrc.mk
|
||||
include $(TOP_DIR)/common.mk
|
||||
include $(TOP_DIR)/rules.mk
|
45
converter/next_usb/README
Normal file
45
converter/next_usb/README
Normal file
@ -0,0 +1,45 @@
|
||||
NeXT non-ADB Keyboard Converter
|
||||
-------------------------------
|
||||
|
||||
Cable connector inside keyboard case:
|
||||
+-----+
|
||||
|Black|\
|
||||
|Green|-\
|
||||
|Yello|--\-------- to computer via Mini-Din 5a Connector
|
||||
|Orang|--/--------
|
||||
|Red |-/
|
||||
|Brown|/
|
||||
+-----+
|
||||
|
||||
Black - Ground to outer metal part of Mini Din 5a connector (not used)
|
||||
Green - Ground
|
||||
Yellow - Power button signal
|
||||
Orange - Keyboard Out
|
||||
Red - Keyboard In
|
||||
Brown - Vcc
|
||||
|
||||
ATmega32u4 connections (pinout provided for Arduino Pro Micro):
|
||||
|
||||
Keyboard out (orange) : PD0 (pin 3)
|
||||
Keyboard in (red) : PD1 (pin 2)
|
||||
Power Button (yellow) : PD4 (pin 4)
|
||||
Ground (black) : GND
|
||||
Vcc (brown) : VCC
|
||||
|
||||
See attached next_timings.jpg file for a detailed illustration of NeXT keyboard protocol timings.
|
||||
|
||||
Power button signal line is normally high when the keyboard is powered/initialized. It is pulled to ground when pressed. The converter automatically translates this to a "normal" keypress with code 0x5A. This connection is technically optional, the only side effect of not making this connection is the power key will do nothing.
|
||||
|
||||
Converter is based heavily on Ladyada's original "USB NeXT Keyboard with Arduino Micro" tutorial (http://learn.adafruit.com/usb-next-keyboard-with-arduino-micro/overview). If you build this converter, show Adafruit some love and do it using an Arduino Micro (http://www.adafruit.com/products/1315) or their ATmega 32u4 Breakout Board (http://www.adafruit.com/products/296). Arduino Micro should work fine using the Arduino Pro Micro configuration above, same pins numbers and everything.
|
||||
|
||||
TODO:
|
||||
-----
|
||||
|
||||
I believe it might be possible to run the keyboard off of 3V; during testing I observed that the keyboard could sometimes function even without Vcc connected as long as the ground connection was good and the Keyboard In line was connected. If that works it should be easy to do a Bluetooth conversion and run the keyboard right off of a LiPo battery without a boost circuit
|
||||
|
||||
Utilize second LED as status indicator for good initialization; also try to make hot plugging much more robust.
|
||||
|
||||
Figure a better use for the Power button. Too easy to hit it by mistake to use for Suspend or Power Off - maybe move cap to different part of the board and consider that
|
||||
|
||||
Figure out a better use for the lock LEDs. Right now they just light up when you press shift. Lame. Maybe implement proper Caps/Num/Scroll Locks
|
||||
|
150
converter/next_usb/config.h
Normal file
150
converter/next_usb/config.h
Normal file
@ -0,0 +1,150 @@
|
||||
/*
|
||||
NeXT non-ADB Keyboard USB Converter
|
||||
|
||||
Copyright 2013, Benjamin Gould (bgould@github.com)
|
||||
|
||||
Based on:
|
||||
TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
|
||||
Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
|
||||
|
||||
Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
|
||||
Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
|
||||
Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#define VENDOR_ID 0xBCBC
|
||||
#define PRODUCT_ID 0xBCBC
|
||||
#define DEVICE_VER 0x0500
|
||||
#define MANUFACTURER t.m.k.
|
||||
#define PRODUCT NeXT Keyboard to USB converter
|
||||
#define DESCRIPTION USB converter for NeXT non-ADB Keyboard
|
||||
|
||||
/* matrix size */
|
||||
#define MATRIX_ROWS 12 // keycode bit: 3-0
|
||||
#define MATRIX_COLS 8 // keycode bit: 6-4
|
||||
|
||||
//#define DEBUG_ON_INIT 1
|
||||
|
||||
//#define TEENSY_CONFIG 1
|
||||
#define PRO_MICRO_CONFIG 1
|
||||
|
||||
// comment out if you don't want the keyboard's LEDs to flash upon initialization
|
||||
#define NEXT_KBD_INIT_FLASH_LEDS
|
||||
|
||||
//============= Start of Arduino Pro Micro Configuration ==============
|
||||
#ifdef PRO_MICRO_CONFIG
|
||||
|
||||
// this is the debugging LED that flashes when a key is being pressed
|
||||
// comment out in order to disable debugging LED
|
||||
#define NEXT_KBD_LED1_PORT PORTD
|
||||
#define NEXT_KBD_LED1_PIN PIND
|
||||
#define NEXT_KBD_LED1_DDR DDRD
|
||||
#define NEXT_KBD_LED1_BIT 5
|
||||
|
||||
#define NEXT_KBD_LED1_ON NEXT_KBD_LED1_PORT &= ~(1<<NEXT_KBD_LED1_BIT);
|
||||
#define NEXT_KBD_LED1_OFF NEXT_KBD_LED1_PORT |= (1<<NEXT_KBD_LED1_BIT);
|
||||
|
||||
// reserved for future use
|
||||
#define NEXT_KBD_LED2_PORT PORTB
|
||||
#define NEXT_KBD_LED2_PIN PINB
|
||||
#define NEXT_KBD_LED2_DDR DDRB
|
||||
#define NEXT_KBD_LED2_BIT 6
|
||||
|
||||
#define NEXT_KBD_LED2_ON NEXT_KBD_LED2_PORT &= ~(1<<NEXT_KBD_LED2_BIT);
|
||||
#define NEXT_KBD_LED2_OFF NEXT_KBD_LED2_PORT |= (1<<NEXT_KBD_LED2_BIT);
|
||||
|
||||
// corresponds to the Keyboard In wire on the NeXT connector
|
||||
// (red wire in NeXT connector) - pin 2 on the Pro Micro
|
||||
#define NEXT_KBD_OUT_PORT PORTD
|
||||
#define NEXT_KBD_OUT_PIN PIND
|
||||
#define NEXT_KBD_OUT_DDR DDRD
|
||||
#define NEXT_KBD_OUT_BIT 1
|
||||
|
||||
// corresponds to the Keyboard Out wire on the NeXT connector
|
||||
// (orange wire in NeXT connector) - pin 3 on the Pro Micro
|
||||
#define NEXT_KBD_IN_PORT PORTD
|
||||
#define NEXT_KBD_IN_PIN PIND
|
||||
#define NEXT_KBD_IN_DDR DDRD
|
||||
#define NEXT_KBD_IN_BIT 0
|
||||
|
||||
// this pin is an input for the power key on the NeXT keyboard
|
||||
// as the keyboard is powered on this should be normally high;
|
||||
// if it is pulled low it means the power button is being preseed
|
||||
// (yellow wire in NeXT connector) - pin 4 on the Pro Micro
|
||||
#define NEXT_KBD_PWR_PORT PORTD
|
||||
#define NEXT_KBD_PWR_PIN PIND
|
||||
#define NEXT_KBD_PWR_DDR DDRD
|
||||
#define NEXT_KBD_PWR_BIT 4
|
||||
|
||||
#endif
|
||||
//============== End of Arduino Pro Micro Configuration ===============
|
||||
|
||||
|
||||
//================ Start of Teensy 2.0 Configuration =================
|
||||
#ifdef TEENSY_CONFIG
|
||||
|
||||
// this is the debugging LED that flashes when a key is being pressed
|
||||
// comment out in order to disable debugging LED
|
||||
#define NEXT_KBD_LED_PORT PORTD
|
||||
#define NEXT_KBD_LED_PIN PIND
|
||||
#define NEXT_KBD_LED_DDR DDRD
|
||||
#define NEXT_KBD_LED_BIT 6
|
||||
|
||||
#define NEXT_KBD_LED_ON NEXT_KBD_LED_PORT |= (1<<NEXT_KBD_LED_BIT);
|
||||
#define NEXT_KBD_LED_OFF NEXT_KBD_LED_PORT &= ~(1<<NEXT_KBD_LED_BIT);
|
||||
|
||||
// corresponds to the Keyboard In wire on the NeXT connector
|
||||
// (red wire in NeXT connector)
|
||||
#define NEXT_KBD_OUT_PORT PORTB
|
||||
#define NEXT_KBD_OUT_PIN PINB
|
||||
#define NEXT_KBD_OUT_DDR DDRB
|
||||
#define NEXT_KBD_OUT_BIT 1
|
||||
|
||||
// corresponds to the Keyboard Out wire on the NeXT connector
|
||||
// (orange wire in NeXT connector)
|
||||
#define NEXT_KBD_IN_PORT PORTB
|
||||
#define NEXT_KBD_IN_PIN PINB
|
||||
#define NEXT_KBD_IN_DDR DDRB
|
||||
#define NEXT_KBD_IN_BIT 0
|
||||
|
||||
#endif
|
||||
//================= End of Teensy 2.0 Configuration ==================
|
||||
|
||||
/* key combination for command */
|
||||
#define IS_COMMAND() ( \
|
||||
(keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))|| \
|
||||
(keyboard_report->mods == (MOD_BIT(KC_RALT) | MOD_BIT(KC_RCTL))) \
|
||||
)
|
177
converter/next_usb/keymap.c
Normal file
177
converter/next_usb/keymap.c
Normal file
@ -0,0 +1,177 @@
|
||||
/*
|
||||
NeXT non-ADB Keyboard USB Converter
|
||||
|
||||
Copyright 2013, Benjamin Gould (bgould@github.com)
|
||||
|
||||
Based on:
|
||||
---------
|
||||
* TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
|
||||
* Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/) \
|
||||
released under BSD license \
|
||||
https://github.com/adafruit/USB-NeXT-Keyboard
|
||||
|
||||
Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
|
||||
Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
|
||||
Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "keycode.h"
|
||||
#include "print.h"
|
||||
#include "debug.h"
|
||||
#include "util.h"
|
||||
#include "keymap.h"
|
||||
#include "keycode.h"
|
||||
|
||||
// 32*8(256) byte array which converts PS/2 code into USB code
|
||||
static const uint16_t PROGMEM fn_actions[] = {
|
||||
ACTION_LAYER_MOMENTARY(1), // FN0 - left command key
|
||||
ACTION_LAYER_MOMENTARY(1), // FN1 - right command key
|
||||
ACTION_KEY(KC_BSLS), // FN2 - number pad slash & backslash
|
||||
ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN3 - number pad equals & pipe
|
||||
ACTION_MODS_KEY(MOD_LCTL, KC_Z), // FN4 - cmd+undo on layer 1
|
||||
ACTION_MODS_KEY(MOD_LCTL, KC_X), // FN5 - cmd+cut on layer 1
|
||||
ACTION_MODS_KEY(MOD_LCTL, KC_C), // FN6 - cmd+copy on layer 1
|
||||
ACTION_MODS_KEY(MOD_LCTL, KC_V), // FN7 - cmd+paste on layer 1
|
||||
};
|
||||
|
||||
/* This is the physical layout that I am starting with:
|
||||
* Note: there is some strangeness on the number pad;
|
||||
* the equal sign shifts to pipe and forward slash shifts to backslash
|
||||
* ,-----------------------------------------------------------. ,-----------. ,---------------.
|
||||
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS | |VUp|Pwr|BrU| |` | =| /| *|
|
||||
* |-----------------------------------------------------------| |-----------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |VDn| |BrD| | 7| 8| 9| -|
|
||||
* |------------------------------------------------------ | `---' `---' |-----------|---|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +|
|
||||
* |-----------------------------------------------------------| ,---. |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| |
|
||||
* |-----------------------------------------------------------| ,-----------. |-----------|Ent|
|
||||
* |Alt |Cmd | Space |Cmd |Alt | |Lef|Dow|Rig| | 0| .| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*
|
||||
* Keymap array:
|
||||
* 8 bytes
|
||||
* +---------+
|
||||
* 0| |
|
||||
* :| | 0x00-0x87
|
||||
* ;| |
|
||||
* 11| |
|
||||
* +---------+
|
||||
*/
|
||||
#define KEYMAP( \
|
||||
K49,K4A,K4B,K4C,K4D,K50,K4F,K4E,K1E,K1F,K20,K1D,K1C,K1B, K1A,K58,K19, K26,K27,K28,K25, \
|
||||
K41,K42,K43,K44,K45,K48,K47,K46,K06,K07,K08,K05,K04,K03, K02, K01, K21,K22,K23,K24, \
|
||||
K57,K39,K3A,K3B,K3C,K3D,K40,K3F,K3E,K2D,K2C,K2B, K2A, K12,K18,K13,K15, \
|
||||
K56, K31,K32,K33,K34,K35,K37,K36,K2E,K2F,K30, K55, K16, K11,K17,K14, \
|
||||
K52,K54, K38, K53,K51, K09,K0F,K10, K0B, K0C,K0D \
|
||||
) { \
|
||||
{ KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
|
||||
{ KC_##K08, KC_##K09, KC_##K10, KC_##K0B, KC_##K0C, KC_##K0D, KC_NO, KC_##K0F }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
|
||||
{ KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
|
||||
{ KC_##K28, KC_NO, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \
|
||||
{ KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \
|
||||
{ KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \
|
||||
{ KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \
|
||||
{ KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
|
||||
{ KC_##K58, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \
|
||||
}
|
||||
|
||||
|
||||
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
/* Layer 0: default
|
||||
* ,-----------------------------------------------------------. ,-----------. ,---------------.
|
||||
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS | |Ins|Ref|Hom| |` | =| /| *|
|
||||
* |-----------------------------------------------------------| |-----------| |---------------|
|
||||
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |Del| |End| | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | `---' `---' |-----------|---|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +|
|
||||
* |-----------------------------------------------------------| ,---. |---------------|
|
||||
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| |
|
||||
* |-----------------------------------------------------------| ,-----------. |-----------|Ent|
|
||||
* |Fn0 |Alt | Space |LGui |Fn1 | |Lef|Dow|Rig| | 0| .| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*/
|
||||
KEYMAP(
|
||||
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, WREF,HOME, GRV, FN3, FN2, PAST,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,NO, DEL, END, P7, P8, P9, PMNS,
|
||||
LCTL,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, RSFT, UP, P1, P2, P3,
|
||||
FN0, LALT, SPC, LGUI,FN1, LEFT,DOWN,RGHT, P0, PDOT,PENT
|
||||
|
||||
),
|
||||
|
||||
/* Layer 1: extra keys
|
||||
* ,-----------------------------------------------------------. ,-----------. ,---------------.
|
||||
* |Grv| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| BS | |VUp|VMu|PgU| |` | =| /| *|
|
||||
* |-----------------------------------------------------------| |-----------| |---------------|
|
||||
* |Tab |Pau| W| E| R| T| Y| U| I| O|PSc| \| ]| | |VDn| |PgD| | 7| 8| 9| -|
|
||||
* |-----------------------------------------------------' | `---' `---' |-----------|---|
|
||||
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +|
|
||||
* |-----------------------------------------------------------| ,---. |---------------|
|
||||
* |Shift |UND|CUT|COP|PST| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| |
|
||||
* |-----------------------------------------------------------| ,-----------. |-----------|Ent|
|
||||
* |Fn0 |Alt | Space |RGui |Fn1 | |Lef|Dow|Rig| | 0| .| |
|
||||
* `-----------------------------------------------------------' `-----------' `---------------'
|
||||
*/
|
||||
KEYMAP(
|
||||
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, VOLU,MUTE,PGUP, TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,PAUS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,FN3, BSLS,TRNS, VOLD, PGDN, BTN1,MS_U,BTN2,WH_U,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, MS_L,MS_D,MS_R,WH_D,
|
||||
TRNS, FN4, FN5, FN6, FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS,TRNS,TRNS,
|
||||
TRNS,RALT, TRNS, RGUI,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS
|
||||
|
||||
)
|
||||
};
|
||||
|
||||
/* translates key to keycode */
|
||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
|
||||
{
|
||||
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
|
||||
}
|
||||
|
||||
/* translates Fn keycode to action */
|
||||
action_t keymap_fn_to_action(uint8_t keycode)
|
||||
{
|
||||
return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
|
||||
}
|
55
converter/next_usb/led.c
Normal file
55
converter/next_usb/led.c
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
NeXT non-ADB Keyboard USB Converter
|
||||
|
||||
Copyright 2013, Benjamin Gould (bgould@github.com)
|
||||
|
||||
Based on:
|
||||
TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
|
||||
Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
|
||||
|
||||
Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
|
||||
Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
|
||||
Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include "stdint.h"
|
||||
#include "led.h"
|
||||
|
||||
|
||||
void led_set(uint8_t usb_led)
|
||||
{
|
||||
|
||||
}
|
269
converter/next_usb/matrix.c
Normal file
269
converter/next_usb/matrix.c
Normal file
@ -0,0 +1,269 @@
|
||||
/*
|
||||
NeXT non-ADB Keyboard USB Converter
|
||||
|
||||
Copyright 2013, Benjamin Gould (bgould@github.com)
|
||||
|
||||
Based on:
|
||||
TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
|
||||
Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
|
||||
|
||||
Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
|
||||
Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
|
||||
Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
#include "print.h"
|
||||
#include "util.h"
|
||||
#include "serial.h"
|
||||
#include "matrix.h"
|
||||
#include "debug.h"
|
||||
#include "matrix.h"
|
||||
#include "next_kbd.h"
|
||||
|
||||
static void matrix_make(uint8_t code);
|
||||
static void matrix_break(uint8_t code);
|
||||
|
||||
static uint8_t matrix[MATRIX_ROWS];
|
||||
#define ROW(code) ((code>>3)&0xF)
|
||||
#define COL(code) (code&0x07)
|
||||
|
||||
static bool is_modified = false;
|
||||
|
||||
/* number of matrix rows */
|
||||
inline
|
||||
uint8_t matrix_rows(void)
|
||||
{
|
||||
return MATRIX_ROWS;
|
||||
}
|
||||
|
||||
/* number of matrix columns */
|
||||
inline
|
||||
uint8_t matrix_cols(void)
|
||||
{
|
||||
return MATRIX_COLS;
|
||||
}
|
||||
|
||||
#ifndef NEXT_KBD_LED1_ON
|
||||
#define NEXT_KBD_LED1_ON
|
||||
#endif
|
||||
|
||||
#ifndef NEXT_KBD_LED1_OFF
|
||||
#define NEXT_KBD_LED1_OFF
|
||||
#endif
|
||||
|
||||
#define NEXT_KBD_PWR_READ (NEXT_KBD_PWR_PIN&(1<<NEXT_KBD_PWR_BIT))
|
||||
|
||||
static bool power_state = false;
|
||||
|
||||
/* intialize matrix for scanning. should be called once. */
|
||||
void matrix_init(void)
|
||||
{
|
||||
#ifdef DEBUG_ON_INIT
|
||||
debug_enable = true;
|
||||
#endif
|
||||
|
||||
// I've found that the matrix likes a little while for things to
|
||||
// settle down before it gets started. Not sure why :)
|
||||
_delay_ms(250);
|
||||
|
||||
dprintf("[ Intializing NeXT keyboard ]\n");
|
||||
NEXT_KBD_LED1_DDR |= (1<<NEXT_KBD_LED1_BIT); // LED pin to output
|
||||
NEXT_KBD_LED1_ON;
|
||||
|
||||
NEXT_KBD_PWR_DDR &= ~(1<<NEXT_KBD_PWR_BIT); // Power Button pin to input
|
||||
NEXT_KBD_PWR_PIN |= (1<<NEXT_KBD_PWR_BIT); // KBD_PWR pull up
|
||||
|
||||
power_state = NEXT_KBD_PWR_READ ? false : true;
|
||||
dprintf("Initial power button state: %b\n", power_state);
|
||||
|
||||
next_kbd_init();
|
||||
|
||||
// initialize matrix state: all keys off
|
||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
|
||||
|
||||
#ifdef NEXT_KBD_INIT_FLASH_LEDS
|
||||
dprintf("flashing LEDs:");
|
||||
// flash the LEDs after initialization
|
||||
bool leds_on = true;
|
||||
for (uint8_t i = 0; i <= 6; i++)
|
||||
{
|
||||
leds_on = leds_on ? false : true;
|
||||
dprintf(" %b", leds_on);
|
||||
next_kbd_set_leds(leds_on, leds_on);
|
||||
_delay_ms(250);
|
||||
}
|
||||
dprintf("\n");
|
||||
#endif
|
||||
|
||||
dprintf("[ NeXT keyboard initialized ]\n");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#define NEXT_KBD_KEYCODE(response) (uint8_t)((response&0xFF)>>1)
|
||||
#define NEXT_KBD_PRESSED_KEYCODE(response) (uint8_t)(((response)&0xF00)==0x400)
|
||||
#define NEXT_KBD_PRESSED(response, mask) (uint8_t)(((response)&mask)>0)
|
||||
#define NEXT_KBD_PRESSED_CONTROL(response) NEXT_KBD_PRESSED(response,0x01000)
|
||||
#define NEXT_KBD_PRESSED_SHIFT_LEFT(response) NEXT_KBD_PRESSED(response,0x02000)
|
||||
#define NEXT_KBD_PRESSED_SHIFT_RGHT(response) NEXT_KBD_PRESSED(response,0x04000)
|
||||
#define NEXT_KBD_PRESSED_CMD_LEFT(response) NEXT_KBD_PRESSED(response,0x08000)
|
||||
#define NEXT_KBD_PRESSED_CMD_RGHT(response) NEXT_KBD_PRESSED(response,0x10000)
|
||||
#define NEXT_KBD_PRESSED_ALT_LEFT(response) NEXT_KBD_PRESSED(response,0x20000)
|
||||
#define NEXT_KBD_PRESSED_ALT_RGHT(response) NEXT_KBD_PRESSED(response,0x40000)
|
||||
#define NEXT_KBD_MAKE_OR_BREAK(key, code) \
|
||||
do { \
|
||||
if (NEXT_KBD_PRESSED_##key(resp) > 0) \
|
||||
matrix_make(code); \
|
||||
else \
|
||||
matrix_break(code); \
|
||||
} while (0);
|
||||
|
||||
#define NEXT_KBD_PWR_KEYCODE 0x58
|
||||
|
||||
/* scan all key states on matrix */
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
_delay_ms(20);
|
||||
|
||||
//next_kbd_set_leds(false, false);
|
||||
NEXT_KBD_LED1_OFF;
|
||||
|
||||
is_modified = false;
|
||||
|
||||
if (!NEXT_KBD_PWR_READ) {
|
||||
matrix_make(NEXT_KBD_PWR_KEYCODE);
|
||||
power_state = 1;
|
||||
if (is_modified)
|
||||
{
|
||||
dprintf("Power state 1\n");
|
||||
|
||||
}
|
||||
} else {
|
||||
matrix_break(NEXT_KBD_PWR_KEYCODE);
|
||||
power_state = 0;
|
||||
if (is_modified)
|
||||
{
|
||||
dprintf("Power state 0\n");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t resp = (next_kbd_recv());
|
||||
|
||||
if (resp == NEXT_KBD_KMBUS_IDLE)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
NEXT_KBD_LED1_ON;
|
||||
|
||||
next_kbd_set_leds(
|
||||
NEXT_KBD_PRESSED_SHIFT_LEFT(resp) ? true : false,
|
||||
NEXT_KBD_PRESSED_SHIFT_RGHT(resp) ? true : false
|
||||
);
|
||||
|
||||
dprintf("[ r=%04lX keycode=%02X pressed=%X CTRL=%X SHIFT_LEFT=%X SHIFT_RGHT=%X CMD_LEFT=%X CMD_RGHT=%X ALT_LEFT=%X ALT_RGHT=%X ]\n", \
|
||||
resp, \
|
||||
NEXT_KBD_KEYCODE(resp), \
|
||||
NEXT_KBD_PRESSED_KEYCODE(resp), \
|
||||
NEXT_KBD_PRESSED_CONTROL(resp), \
|
||||
NEXT_KBD_PRESSED_SHIFT_LEFT(resp), \
|
||||
NEXT_KBD_PRESSED_SHIFT_RGHT(resp), \
|
||||
NEXT_KBD_PRESSED_CMD_LEFT(resp), \
|
||||
NEXT_KBD_PRESSED_CMD_RGHT(resp), \
|
||||
NEXT_KBD_PRESSED_ALT_LEFT(resp), \
|
||||
NEXT_KBD_PRESSED_ALT_RGHT(resp) \
|
||||
);
|
||||
|
||||
// Modifier keys don't return keycode; have to check the upper bits
|
||||
NEXT_KBD_MAKE_OR_BREAK(ALT_RGHT, 0x51);
|
||||
NEXT_KBD_MAKE_OR_BREAK(ALT_LEFT, 0x52);
|
||||
NEXT_KBD_MAKE_OR_BREAK(CMD_RGHT, 0x53);
|
||||
NEXT_KBD_MAKE_OR_BREAK(CMD_LEFT, 0x54);
|
||||
NEXT_KBD_MAKE_OR_BREAK(SHIFT_RGHT, 0x55);
|
||||
NEXT_KBD_MAKE_OR_BREAK(SHIFT_LEFT, 0x56);
|
||||
NEXT_KBD_MAKE_OR_BREAK(CONTROL, 0x57);
|
||||
NEXT_KBD_MAKE_OR_BREAK(KEYCODE, NEXT_KBD_KEYCODE(resp));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* whether modified from previous scan. used after matrix_scan. */
|
||||
bool matrix_is_modified()
|
||||
{
|
||||
return is_modified;
|
||||
}
|
||||
|
||||
/* whether a switch is on */
|
||||
inline
|
||||
bool matrix_is_on(uint8_t row, uint8_t col)
|
||||
{
|
||||
return (matrix[row] & (1<<col));
|
||||
}
|
||||
|
||||
/* matrix state on row */
|
||||
inline
|
||||
uint8_t matrix_get_row(uint8_t row)
|
||||
{
|
||||
return matrix[row];
|
||||
}
|
||||
|
||||
/* print matrix for debug */
|
||||
void matrix_print(void)
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
static void matrix_make(uint8_t code)
|
||||
{
|
||||
if (!matrix_is_on(ROW(code), COL(code))) {
|
||||
matrix[ROW(code)] |= 1<<COL(code);
|
||||
is_modified = true;
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
static void matrix_break(uint8_t code)
|
||||
{
|
||||
if (matrix_is_on(ROW(code), COL(code))) {
|
||||
matrix[ROW(code)] &= ~(1<<COL(code));
|
||||
is_modified = true;
|
||||
}
|
||||
}
|
BIN
converter/next_usb/next_timings.jpg
Normal file
BIN
converter/next_usb/next_timings.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 398 KiB |
@ -16,11 +16,11 @@ Connector
|
||||
(receptacle)
|
||||
|
||||
|
||||
Wiring: You can change this with ediging config.h.
|
||||
Wiring: You can change this with editing config.h.
|
||||
|
||||
Pin mini DIN MCU
|
||||
----------------------------------
|
||||
1 ~RST PD1
|
||||
1 ~RST(TXD) PD3
|
||||
2 GND GND
|
||||
3 ~RDY PD4
|
||||
4 RXD PD2
|
||||
@ -34,12 +34,9 @@ Wiring: You can change this with ediging config.h.
|
||||
|
||||
Protocol
|
||||
--------
|
||||
Singnal: Asynchronous, Positive logic, 19200baud, Least bit first
|
||||
Signal: Asynchronous, Positive logic, 19200baud, Least bit first
|
||||
Frame format: 1-Start bit(Lo), 8-Data bits, Odd-Parity, 1-Stop bit
|
||||
|
||||
This converter uses software method for testing purpose. AVR UART engine will work better.
|
||||
|
||||
|
||||
|
||||
|
||||
Build Firmware
|
||||
|
@ -1,3 +1,6 @@
|
||||
#
|
||||
# Makefile for Teensy
|
||||
#
|
||||
# Target file name (without extension).
|
||||
TARGET = ps2_usb_lufa
|
||||
|
||||
@ -59,7 +62,7 @@ ARCH = AVR8
|
||||
F_USB = $(F_CPU)
|
||||
|
||||
# Interrupt driven control endpoint task(+60)
|
||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
#OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
|
||||
|
||||
# Boot Section Size in *bytes*
|
||||
@ -68,7 +71,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
# Atmel DFU loader 4096
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=512
|
||||
|
||||
|
||||
# Build Options
|
||||
|
98
converter/ps2_usb/Makefile.tmk_rev1
Normal file
98
converter/ps2_usb/Makefile.tmk_rev1
Normal file
@ -0,0 +1,98 @@
|
||||
#
|
||||
# Makefile for TMK keyboard converter rev2
|
||||
# https://github.com/tmk/keyboard_converter#pcb-rev1
|
||||
#
|
||||
# Target file name (without extension).
|
||||
TARGET = ps2_usb_tmk_rev1
|
||||
|
||||
# Directory common source filess exist
|
||||
TOP_DIR = ../..
|
||||
|
||||
# Directory keyboard dependent files exist
|
||||
TARGET_DIR = .
|
||||
|
||||
# project specific files
|
||||
SRC = keymap_common.c \
|
||||
matrix.c \
|
||||
led.c
|
||||
|
||||
ifdef KEYMAP
|
||||
SRC := keymap_$(KEYMAP).c $(SRC)
|
||||
else
|
||||
SRC := keymap_plain.c $(SRC)
|
||||
endif
|
||||
|
||||
CONFIG_H = config_tmk_rev1.h
|
||||
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Processor frequency.
|
||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
#
|
||||
# This will be an integer division of F_USB below, as it is sourced by
|
||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||
# does not *change* the processor frequency - it should merely be updated to
|
||||
# reflect the processor speed set externally so that the code can use accurate
|
||||
# software delays.
|
||||
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)
|
||||
|
||||
|
||||
# Boot Section Size in *bytes*
|
||||
# Teensy halfKay 512
|
||||
# Teensy++ halfKay 1024
|
||||
# Atmel DFU loader 4096
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
|
||||
|
||||
# PS/2 Options
|
||||
#
|
||||
PS2_USE_USART = yes # uses hardware USART engine for PS/2 signal receive(recomened)
|
||||
#PS2_USE_BUSYWAIT = yes # uses primitive reference code
|
||||
|
||||
|
||||
# Search Path
|
||||
VPATH += $(TARGET_DIR)
|
||||
VPATH += $(TOP_DIR)
|
||||
|
||||
include $(TOP_DIR)/protocol.mk
|
||||
include $(TOP_DIR)/protocol/lufa.mk
|
||||
include $(TOP_DIR)/common.mk
|
||||
include $(TOP_DIR)/rules.mk
|
98
converter/ps2_usb/Makefile.tmk_rev2
Normal file
98
converter/ps2_usb/Makefile.tmk_rev2
Normal file
@ -0,0 +1,98 @@
|
||||
#
|
||||
# Makefile for TMK keyboard converter rev2
|
||||
# https://github.com/tmk/keyboard_converter#pcb-rev2
|
||||
#
|
||||
# Target file name (without extension).
|
||||
TARGET = ps2_usb_tmk_rev2
|
||||
|
||||
# Directory common source filess exist
|
||||
TOP_DIR = ../..
|
||||
|
||||
# Directory keyboard dependent files exist
|
||||
TARGET_DIR = .
|
||||
|
||||
# project specific files
|
||||
SRC = keymap_common.c \
|
||||
matrix.c \
|
||||
led.c
|
||||
|
||||
ifdef KEYMAP
|
||||
SRC := keymap_$(KEYMAP).c $(SRC)
|
||||
else
|
||||
SRC := keymap_plain.c $(SRC)
|
||||
endif
|
||||
|
||||
CONFIG_H = config_tmk_rev2.h
|
||||
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32u2
|
||||
|
||||
# Processor frequency.
|
||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
#
|
||||
# This will be an integer division of F_USB below, as it is sourced by
|
||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||
# does not *change* the processor frequency - it should merely be updated to
|
||||
# reflect the processor speed set externally so that the code can use accurate
|
||||
# software delays.
|
||||
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)
|
||||
|
||||
|
||||
# Boot Section Size in *bytes*
|
||||
# Teensy halfKay 512
|
||||
# Teensy++ halfKay 1024
|
||||
# Atmel DFU loader 4096
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
|
||||
|
||||
# PS/2 Options
|
||||
#
|
||||
PS2_USE_INT = yes # uses external interrupt for falling edge of PS/2 clock pin
|
||||
#PS2_USE_BUSYWAIT = yes # uses primitive reference code
|
||||
|
||||
|
||||
# Search Path
|
||||
VPATH += $(TARGET_DIR)
|
||||
VPATH += $(TOP_DIR)
|
||||
|
||||
include $(TOP_DIR)/protocol.mk
|
||||
include $(TOP_DIR)/protocol/lufa.mk
|
||||
include $(TOP_DIR)/common.mk
|
||||
include $(TOP_DIR)/rules.mk
|
@ -1,50 +1,59 @@
|
||||
PS/2 to USB keyboard converter
|
||||
==============================
|
||||
This firmware converts PS/2 keyboard protocol to USB and supports only Scan Code Set 2.
|
||||
|
||||
|
||||
PS/2 signal handling implementations
|
||||
------------------------------------
|
||||
Following three methods are used to implement PS/2 signal handling.
|
||||
|
||||
### Simple and stupid busy-wait(ps2_busywait.c)
|
||||
This is expected to implemented with portable C code for reference.
|
||||
### Interrupt driven(ps2_interrupt.c)
|
||||
Uses pin interrupt to detect falling edge of clock line.
|
||||
### USART hardware module(ps2_usart.c)
|
||||
Uses AVR USART engine to recevie PS/2 signal.
|
||||
|
||||
To select method edit Makefile.
|
||||
This firmware converts PS/2 keyboard protocol to USB.(It supports Scan Code Set 2.)
|
||||
|
||||
|
||||
Connect Wires
|
||||
-------------
|
||||
In case of Teensy2.0(ATMega32U4):
|
||||
|
||||
1. Connect Vcc and GND.
|
||||
2. Connect Clock and Data line.
|
||||
- Busywait: Clock is on PD5 and Data on PD2.
|
||||
- Interrupt: Clock is on PD1 and Data on PD2.
|
||||
- USART: Clock is on PD5 and Data on PD2.
|
||||
3. Optionally you need pull-up register. 1K-10K Ohm is OK.
|
||||
1. Connect **Vcc** and **GND**.
|
||||
2. Connect **Clock** and **Data** line.
|
||||
- **Interrupt**: **Clock** is on `PD1` and **Data** on `PD0`.(Recommended. Soarer's converter compatible)
|
||||
- **Busywait**: **Clock** is on `PD1` and **Data** on `PD0`.
|
||||
- **USART**: **Clock** is on `PD5` and **Data** on `PD2`.
|
||||
3. Optionally you need pull-up resistor. 1K-10K Ohm is OK.
|
||||
|
||||
To change pin configuration edit config.h.
|
||||
|
||||
|
||||
Build Frimware
|
||||
Build Firmware
|
||||
--------------
|
||||
Just run `make`:
|
||||
For **PJRC Teensy** just run `make`:
|
||||
|
||||
$ make clean
|
||||
$ make
|
||||
|
||||
To select keymap:
|
||||
|
||||
$ make clean
|
||||
$ make KEYMAP=[plain|jis|spacefn|...]
|
||||
|
||||
After that you will find HEX file `ps2_usb_lufa.hex` in current directory.
|
||||
|
||||
|
||||
- For **TMK converter Rev.1** use `make -f Makefile.tmk_rev1` instead of `make` and HEX file is `ps2_usb_tmk_rev1.hex`.
|
||||
|
||||
- For **TMK converter Rev.2** use `make -f Makefile.tmk_rev2` instead of `make` and HEX file is `ps2_usb_tmk_rev2.hex`.
|
||||
|
||||
|
||||
Keymap
|
||||
------
|
||||
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document(you can find in top README.md) and existent keymap files.
|
||||
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document(you can find in README.md of top directory) and existent keymap files.
|
||||
|
||||
|
||||
PS/2 signal handling implementations
|
||||
------------------------------------
|
||||
Following three methods can be used to implement PS/2 signal handling.
|
||||
|
||||
### Simple and stupid busy-wait(ps2_busywait.c)
|
||||
This is expected to implemented with portable C code for reference.
|
||||
### Interrupt driven(ps2_interrupt.c)
|
||||
Uses pin interrupt to detect falling edge of clock line.
|
||||
### USART hardware module(ps2_usart.c)
|
||||
Uses AVR USART engine to receive PS/2 signal.
|
||||
|
||||
To select method edit Makefile.
|
||||
|
||||
|
||||
V-USB Support
|
||||
|
147
converter/ps2_usb/config_tmk_rev1.h
Normal file
147
converter/ps2_usb/config_tmk_rev1.h
Normal file
@ -0,0 +1,147 @@
|
||||
/*
|
||||
Copyright 2012 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
|
||||
|
||||
#include <avr/interrupt.h>
|
||||
|
||||
#define VENDOR_ID 0xFEED
|
||||
#define PRODUCT_ID 0x6512
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER t.m.k.
|
||||
#define PRODUCT PS/2 keyboard converter
|
||||
#define DESCRIPTION convert PS/2 keyboard to USB
|
||||
|
||||
|
||||
/* matrix size */
|
||||
#define MATRIX_ROWS 32 // keycode bit: 3-0
|
||||
#define MATRIX_COLS 8 // keycode bit: 6-4
|
||||
|
||||
|
||||
/* key combination for command */
|
||||
#define IS_COMMAND() ( \
|
||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \
|
||||
keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \
|
||||
)
|
||||
|
||||
|
||||
//#define NO_SUSPEND_POWER_DOWN
|
||||
|
||||
|
||||
/*
|
||||
* PS/2 Busywait
|
||||
*/
|
||||
#ifdef PS2_USE_BUSYWAIT
|
||||
#define PS2_CLOCK_PORT PORTD
|
||||
#define PS2_CLOCK_PIN PIND
|
||||
#define PS2_CLOCK_DDR DDRD
|
||||
#define PS2_CLOCK_BIT 5
|
||||
#define PS2_DATA_PORT PORTD
|
||||
#define PS2_DATA_PIN PIND
|
||||
#define PS2_DATA_DDR DDRD
|
||||
#define PS2_DATA_BIT 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PS/2 USART
|
||||
*/
|
||||
#ifdef PS2_USE_USART
|
||||
#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
|
||||
/* XCK for clock line and RXD for data line */
|
||||
#define PS2_CLOCK_PORT PORTD
|
||||
#define PS2_CLOCK_PIN PIND
|
||||
#define PS2_CLOCK_DDR DDRD
|
||||
#define PS2_CLOCK_BIT 5
|
||||
#define PS2_DATA_PORT PORTD
|
||||
#define PS2_DATA_PIN PIND
|
||||
#define PS2_DATA_DDR DDRD
|
||||
#define PS2_DATA_BIT 2
|
||||
/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */
|
||||
/* set DDR of CLOCK as input to be slave */
|
||||
#define PS2_USART_INIT() do { \
|
||||
PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT); \
|
||||
PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT); \
|
||||
UCSR1C = ((1 << UMSEL10) | \
|
||||
(3 << UPM10) | \
|
||||
(0 << USBS1) | \
|
||||
(3 << UCSZ10) | \
|
||||
(0 << UCPOL1)); \
|
||||
UCSR1A = 0; \
|
||||
UBRR1H = 0; \
|
||||
UBRR1L = 0; \
|
||||
} while (0)
|
||||
#define PS2_USART_RX_INT_ON() do { \
|
||||
UCSR1B = ((1 << RXCIE1) | \
|
||||
(1 << RXEN1)); \
|
||||
} while (0)
|
||||
#define PS2_USART_RX_POLL_ON() do { \
|
||||
UCSR1B = (1 << RXEN1); \
|
||||
} while (0)
|
||||
#define PS2_USART_OFF() do { \
|
||||
UCSR1C = 0; \
|
||||
UCSR1B &= ~((1 << RXEN1) | \
|
||||
(1 << TXEN1)); \
|
||||
} while (0)
|
||||
#define PS2_USART_RX_READY (UCSR1A & (1<<RXC1))
|
||||
#define PS2_USART_RX_DATA UDR1
|
||||
#define PS2_USART_ERROR (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
|
||||
#define PS2_USART_RX_VECT USART1_RX_vect
|
||||
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__)
|
||||
/* XCK for clock line and RXD for data line */
|
||||
#define PS2_CLOCK_PORT PORTD
|
||||
#define PS2_CLOCK_PIN PIND
|
||||
#define PS2_CLOCK_DDR DDRD
|
||||
#define PS2_CLOCK_BIT 4
|
||||
#define PS2_DATA_PORT PORTD
|
||||
#define PS2_DATA_PIN PIND
|
||||
#define PS2_DATA_DDR DDRD
|
||||
#define PS2_DATA_BIT 0
|
||||
/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */
|
||||
/* set DDR of CLOCK as input to be slave */
|
||||
#define PS2_USART_INIT() do { \
|
||||
PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT); \
|
||||
PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT); \
|
||||
UCSR0C = ((1 << UMSEL00) | \
|
||||
(3 << UPM00) | \
|
||||
(0 << USBS0) | \
|
||||
(3 << UCSZ00) | \
|
||||
(0 << UCPOL0)); \
|
||||
UCSR0A = 0; \
|
||||
UBRR0H = 0; \
|
||||
UBRR0L = 0; \
|
||||
} while (0)
|
||||
#define PS2_USART_RX_INT_ON() do { \
|
||||
UCSR0B = ((1 << RXCIE0) | \
|
||||
(1 << RXEN0)); \
|
||||
} while (0)
|
||||
#define PS2_USART_RX_POLL_ON() do { \
|
||||
UCSR0B = (1 << RXEN0); \
|
||||
} while (0)
|
||||
#define PS2_USART_OFF() do { \
|
||||
UCSR0C = 0; \
|
||||
UCSR0B &= ~((1 << RXEN0) | \
|
||||
(1 << TXEN0)); \
|
||||
} while (0)
|
||||
#define PS2_USART_RX_READY (UCSR0A & (1<<RXC0))
|
||||
#define PS2_USART_RX_DATA UDR0
|
||||
#define PS2_USART_ERROR (UCSR0A & ((1<<FE0) | (1<<DOR0) | (1<<UPE0)))
|
||||
#define PS2_USART_RX_VECT USART_RX_vect
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
85
converter/ps2_usb/config_tmk_rev2.h
Normal file
85
converter/ps2_usb/config_tmk_rev2.h
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
Copyright 2012 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
|
||||
|
||||
#include <avr/interrupt.h>
|
||||
|
||||
#define VENDOR_ID 0xFEED
|
||||
#define PRODUCT_ID 0x6512
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER t.m.k.
|
||||
#define PRODUCT PS/2 keyboard converter
|
||||
#define DESCRIPTION convert PS/2 keyboard to USB
|
||||
|
||||
|
||||
/* matrix size */
|
||||
#define MATRIX_ROWS 32 // keycode bit: 3-0
|
||||
#define MATRIX_COLS 8 // keycode bit: 6-4
|
||||
|
||||
|
||||
/* key combination for command */
|
||||
#define IS_COMMAND() ( \
|
||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||
)
|
||||
|
||||
|
||||
//#define NO_SUSPEND_POWER_DOWN
|
||||
|
||||
|
||||
/*
|
||||
* PS/2 Busywait
|
||||
*/
|
||||
#ifdef PS2_USE_BUSYWAIT
|
||||
#define PS2_CLOCK_PORT PORTD
|
||||
#define PS2_CLOCK_PIN PIND
|
||||
#define PS2_CLOCK_DDR DDRD
|
||||
#define PS2_CLOCK_BIT 1
|
||||
#define PS2_DATA_PORT PORTD
|
||||
#define PS2_DATA_PIN PIND
|
||||
#define PS2_DATA_DDR DDRD
|
||||
#define PS2_DATA_BIT 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PS/2 Pin interrupt
|
||||
*/
|
||||
#ifdef PS2_USE_INT
|
||||
/* uses INT1 for clock line(ATMega32U4) */
|
||||
#define PS2_CLOCK_PORT PORTD
|
||||
#define PS2_CLOCK_PIN PIND
|
||||
#define PS2_CLOCK_DDR DDRD
|
||||
#define PS2_CLOCK_BIT 1
|
||||
#define PS2_DATA_PORT PORTD
|
||||
#define PS2_DATA_PIN PIND
|
||||
#define PS2_DATA_DDR DDRD
|
||||
#define PS2_DATA_BIT 0
|
||||
#define PS2_INT_INIT() do { \
|
||||
EICRA |= ((1<<ISC11) | \
|
||||
(0<<ISC10)); \
|
||||
} while (0)
|
||||
#define PS2_INT_ON() do { \
|
||||
EIMSK |= (1<<INT1); \
|
||||
} while (0)
|
||||
#define PS2_INT_OFF() do { \
|
||||
EIMSK &= ~(1<<INT1); \
|
||||
} while (0)
|
||||
#define PS2_INT_VECT INT1_vect
|
||||
#endif
|
||||
|
||||
#endif
|
@ -35,11 +35,11 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
* ,-----------------------------------------------------------.
|
||||
* |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete |
|
||||
* |-----------------------------------------------------------|
|
||||
* | | | | | | | |Hom|Up |End|Psc|Slk|Pau|Ins |
|
||||
* | | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins |
|
||||
* |-----------------------------------------------------------|
|
||||
* | | | | | | |PgU|Lef|Dow|Rig| | | |
|
||||
* |-----------------------------------------------------------|
|
||||
* | | | | | |Spc|PgD|` |~ | | | |
|
||||
* | | | | | |Spc|PgD|` |~ | |Men| |
|
||||
* |-----------------------------------------------------------|
|
||||
* | | | | | | | | |
|
||||
* `-----------------------------------------------------------'
|
||||
@ -49,7 +49,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS,
|
||||
TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS,INS, DEL, END, PGDN, P7, P8, P9,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS, P4, P5, P6, PPLS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,TRNS, TRNS, UP, P1, P2, P3,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS, UP, P1, P2, P3,
|
||||
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, LEFT,DOWN,RGHT, P0, PDOT,PENT
|
||||
),
|
||||
};
|
||||
|
@ -20,9 +20,10 @@ 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 = atmega32u4 # Teensy 2.0
|
||||
#MCU = at90usb646 # Teensy++ 1.0
|
||||
#MCU = at90usb1286 # Teensy++ 2.0
|
||||
MCU = atmega32u2
|
||||
|
||||
|
||||
# Processor frequency.
|
||||
|
@ -34,11 +34,11 @@ Connector
|
||||
|
||||
Protocol
|
||||
--------
|
||||
Singnal: Asynchronous, Negative logic, 1200baud, No Flow control
|
||||
Signal: Asynchronous, Negative logic, 1200baud, No Flow control
|
||||
Frame format: 1-Start bit, 8-Data bits, No-Parity, 1-Stop bit
|
||||
|
||||
AVR USART engine expects positive logic while Sun keyboard signal is negative.
|
||||
To use AVR UART engine you need exteral inverter in front of RX and TX pin.
|
||||
To use AVR UART engine you need external inverter in front of RX and TX pin.
|
||||
Otherwise you can software serial routine to communicate the keyboard.
|
||||
|
||||
This converter uses software method, you doesn't need any inverter part.
|
||||
|
@ -77,12 +77,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K0D,K14,K6E, \
|
||||
K77,K13, K78, K79, K7A,K43,K62,K18,K1B,K1C \
|
||||
) KEYMAP( \
|
||||
HELP, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,PWR, \
|
||||
HELP, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \
|
||||
K01, AGAIN, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C, K34, K60, K62, PSLS,PAST,PMNS, \
|
||||
MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \
|
||||
SELECT, COPY, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \
|
||||
EXECUTE,PASTE, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \
|
||||
FIND, CUT, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \
|
||||
SELECT, K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \
|
||||
EXECUTE,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \
|
||||
FIND, K61, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \
|
||||
)
|
||||
|
||||
|
||||
|
@ -63,7 +63,8 @@ uint8_t matrix_cols(void)
|
||||
|
||||
void matrix_init(void)
|
||||
{
|
||||
print_enable = true;
|
||||
DDRD |= (1<<6);
|
||||
PORTD |= (1<<6);
|
||||
debug_enable = true;
|
||||
|
||||
serial_init();
|
||||
|
@ -6,7 +6,7 @@ Hardware requirement
|
||||
Arduino Leonardo
|
||||
http://arduino.cc/en/Main/ArduinoBoardLeonardo
|
||||
|
||||
Circuit@Home USB Host Sheild 2.0
|
||||
Circuit@Home USB Host Shield 2.0
|
||||
http://www.circuitsathome.com/products-page/arduino-shields/usb-host-shield-2-0-for-arduino
|
||||
|
||||
|
||||
|
@ -12,7 +12,7 @@ X68000 keyboard has ALPS linear switches.
|
||||
Hardware
|
||||
--------
|
||||
Target MCU is ATMega32u4 but other USB capable AVR will also work.
|
||||
You can use PJRC Teensy as dev board.
|
||||
You can use PJRC Teensy as development board.
|
||||
http://www.pjrc.com/teensy/
|
||||
|
||||
Wiring:
|
||||
@ -83,7 +83,7 @@ bit 6-0 following scan code
|
||||
|
||||
Data from computer
|
||||
------------------
|
||||
- LED contorol ON/OFF(0/1)
|
||||
- LED control ON/OFF(0/1)
|
||||
bit 7 1(fixed)
|
||||
bit 6 全角
|
||||
bit 5 ひらがな
|
||||
|
@ -14,7 +14,7 @@ dfj's NKRO(2010/06)
|
||||
http://geekhack.org/showthread.php?p=204389#post204389
|
||||
|
||||
|
||||
Terminogy
|
||||
Terminology
|
||||
---------
|
||||
NKRO
|
||||
ghost
|
||||
@ -26,7 +26,7 @@ membrane
|
||||
OS Support Status
|
||||
-----------------
|
||||
USB NKRO is possible *without* a custom driver.
|
||||
At least following OSes supports.
|
||||
At least following OS's supports.
|
||||
Windows7 64bit
|
||||
WindowsXP
|
||||
Windows2000 SP4
|
||||
@ -37,7 +37,7 @@ At least following OSes supports.
|
||||
Custom Driver for USB NKRO
|
||||
--------------------------
|
||||
NOT NEEDED
|
||||
at least when using fllowing report formats on Windows, Linux or MacOSX.
|
||||
at least when using following report formats on Windows, Linux or MacOSX.
|
||||
|
||||
|
||||
USB NKRO methods
|
||||
@ -47,8 +47,8 @@ USB NKRO methods
|
||||
If the keyboard has 2 virtual keyboard with Standard report(6KRO), it gets 12KRO.
|
||||
Using this method means the keyboard is a composite device.
|
||||
|
||||
2. Exteded report
|
||||
It needs large report size for this method to achive NKRO.
|
||||
2. Extended report
|
||||
It needs large report size for this method to achieve NKRO.
|
||||
If a keyboard has 101keys, it needs 103byte report. It seems to be inefficient.
|
||||
|
||||
3. Bitmap report
|
||||
@ -122,8 +122,8 @@ Considerations
|
||||
Compatibility
|
||||
boot protocol
|
||||
minor/old system
|
||||
Some BIOS doesn't send SET_PROTCOL request, a keyboard can't switch to boot protocol mode.
|
||||
This may cuase a problem on a keyboard which uses other report than Standard.
|
||||
Some BIOS doesn't send SET_PROTOCOL request, a keyboard can't switch to boot protocol mode.
|
||||
This may cause a problem on a keyboard which uses other report than Standard.
|
||||
Reactivity
|
||||
USB polling time
|
||||
OS/Driver processing time
|
||||
|
31
doc/build.md
31
doc/build.md
@ -5,13 +5,12 @@ Build Firmware and Program Controller
|
||||
Download and Install
|
||||
--------------------
|
||||
### 1. Install Tools
|
||||
First, you need tools to build firmware and program your controller. I assume you are on Windows here.
|
||||
|
||||
1. **Toolchain** Install [WinAVR][winavr]. This is old but works well for this purpose. `WinAVR` is a tool set to build firmware including C compiler(gcc) and make commands. You can use [CrossPack][crosspack] instead if you are on Mac.
|
||||
1. **Toolchain** On Windows install [MHV AVR Tools][mhv] for AVR GCC compiler and [Cygwin][cygwin](or [MinGW][mingw]) for shell terminal. On Mac you can use [CrossPack][crosspack]. On Linux you can install AVR GCC with your favorite package manager.
|
||||
|
||||
2. **Programmer** Install [Atmel FLIP][flip]. `FLIP` is a tool to program(load) firmware into AVR controller via DFU bootloader. AVR USB chips including ATmega32U4 has DFU bootloader by factory default. You can also use [dfu-programmer][dfu-prog] instead if you are on Mac or Linux.
|
||||
2. **Programmer** On Windows install [Atmel FLIP][flip]. On Mac and Linux install [dfu-programmer][dfu-prog].
|
||||
|
||||
3. **Driver** At first time you start DFU bootloader on Chip 'Found New Hardware Wizard' will come up on Windows. If you install device driver properly you can find chip name like 'ATmega32U4' under 'LibUSB-Win32 Devices' tree on 'Device Manager'. If not you shall need to update its driver on 'Device Manager'. You will find the driver in `FLIP` install directory like: C:\Program Files (x86)\Atmel\Flip 3.4.5\usb\. If you use `dfu-programmer` install its driver.
|
||||
3. **Driver** On Windows you start DFU bootloader on the chip first time you will see 'Found New Hardware Wizard' to install driver. If you install device driver properly you can find chip name like 'ATmega32U4' under 'LibUSB-Win32 Devices' tree on 'Device Manager'. If not you shall need to update its driver on 'Device Manager'. You will find the driver in `FLIP` install directory like: C:\Program Files (x86)\Atmel\Flip 3.4.5\usb\. In case of `dfu-programmer` use its driver.
|
||||
|
||||
If you use PJRC Teensy you don't need step 2 and 3 above, just get [Teensy loader][teensy-loader].
|
||||
|
||||
@ -29,7 +28,7 @@ If you are familiar with `Git` tools you are recommended to use it but you can a
|
||||
Build firmware
|
||||
--------------
|
||||
### 1. Open terminal
|
||||
Open terminal window to get access to commands. You can use `cmd` in Windows or `Terminal.app` on Mac OSX. In Windows press `Windows` key and `R` then enter `cmd` in 'Run command' dialog showing up.
|
||||
Open terminal window to get access to commands. Use Cygwin(or MingGW) `shell terminal` in Windows or `Terminal.app` on Mac OSX. In Windows press `Windows` key and `R` then enter `cmd` in 'Run command' dialog showing up.
|
||||
|
||||
### 2. Change directory
|
||||
Move to project directory in the firmware source.
|
||||
@ -40,7 +39,7 @@ Move to project directory in the firmware source.
|
||||
Build firmware using GNU `make` command. You'll see `<project>_<variant>.hex` file in that directory unless something unexpected occurs in build process.
|
||||
|
||||
|
||||
mkae -f Makefile.<variant> clean
|
||||
make -f Makefile.<variant> clean
|
||||
make -f Makefile.<variant>
|
||||
|
||||
|
||||
@ -71,14 +70,14 @@ Or to program with `dfu-programmer` run:
|
||||
#### FLIP GUI tutorial
|
||||
1. On menu bar click Device -> Select, then. `ATmega32u4`.
|
||||
2. On menu bar click Settings -> Communication -> USB, then click 'Open' button on 'USB Port Connection' dialog.
|
||||
At this point you'll see greyouted widgets on the app get colored and ready.
|
||||
At this point you'll see grey-outed widgets on the app get colored and ready.
|
||||
|
||||
3. On menu bar click File -> Load HEX File, then select your firmware hex file on File Selector dialog.
|
||||
4. On 'Operations Flow' panel click 'Run' button to load the firmware binary to the chip. Note that you should keep 'Erase', 'Blank Check', 'Program' and 'Verify' check boxes selected.
|
||||
5. Re-plug USB cord or click 'Start Application' button to restart your controller.
|
||||
Done.
|
||||
|
||||
See also these instaructions if you need.
|
||||
See also these instructions if you need.
|
||||
|
||||
- <http://code.google.com/p/micropendous/wiki/LoadingFirmwareWithFLIP>
|
||||
- <http://www.atmel.com/Images/doc7769.pdf>
|
||||
@ -95,11 +94,14 @@ Or use this command if you have command line version of Teensy Loader installed.
|
||||
|
||||
|
||||
### 4. Program with Other programmer
|
||||
You may want to use other programmer like `avrdude` with AVRISPmkII, Aruduino or USBasp. In that case you can still use make target `program` for build with configuring `PROGRAM_CMD` in Makefile.
|
||||
You may want to use other programmer like `avrdude` with AVRISPmkII, Arduino or USBasp. In that case you can still use make target `program` for build with configuring `PROGRAM_CMD` in Makefile.
|
||||
|
||||
$ make -f Makefile.<variant> program
|
||||
|
||||
|
||||
[cygwin]: https://www.cygwin.com/
|
||||
[mingw]: http://www.mingw.org/
|
||||
[mhv]: https://infernoembedded.com/products/avr-tools
|
||||
[winavr]: http://winavr.sourceforge.net/
|
||||
[crosspack]: http://www.obdev.at/products/crosspack/index.html
|
||||
[flip]: http://www.atmel.com/tools/FLIP.aspx
|
||||
@ -116,14 +118,18 @@ Makefile Options
|
||||
#MCU = at90usb1286 # Teensy++ 2.0
|
||||
F_CPU = 16000000
|
||||
|
||||
Set your MCU and its clock in Hz.
|
||||
|
||||
# Boot Section Size in *bytes*
|
||||
# Teensy halfKay 512
|
||||
# Atmel DFU loader 4096
|
||||
# LUFA bootloader 4096
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
If you are using PJRC Teensy use `512` for `BOOTLOADER_SIZE`, otherwise use `4096` unless you are sure.
|
||||
|
||||
### 2. Features
|
||||
Optional. Note that ***comment out*** to disable them.
|
||||
Optional. Note that ***comment out*** with `#` to disable them.
|
||||
|
||||
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
@ -133,9 +139,10 @@ Optional. Note that ***comment out*** to disable them.
|
||||
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
|
||||
#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
#BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
#KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom
|
||||
|
||||
### 3. Programmer
|
||||
Optional. Set proper command for your controller, bootloader and programmer. This command can be used with `make program`. Not needed if you use `FLIP`, `dfu-programmer` or `Teesy Loader`.
|
||||
Optional. Set proper command for your controller, bootloader and programmer. This command can be used with `make program`. Not needed if you use `FLIP`, `dfu-programmer` or `Teensy Loader`.
|
||||
|
||||
# avrdude with AVRISPmkII
|
||||
PROGRAM_CMD = avrdude -p $(MCU) -c avrispmkII -P USB -U flash:w:$(TARGET).hex
|
||||
@ -158,7 +165,7 @@ Config.h Options
|
||||
|
||||
/* Mechanical locking CapsLock support. Use KC_LCAP instead of KC_CAPS in keymap */
|
||||
#define CAPSLOCK_LOCKING_ENABLE
|
||||
/* Locking CapsLock resynchronize hack */
|
||||
/* Locking CapsLock re-synchronize hack */
|
||||
#define CAPSLOCK_LOCKING_RESYNC_ENABLE
|
||||
|
||||
### 3. Disable Debug and Print
|
||||
|
@ -68,7 +68,7 @@ On the other hand, you shall change `layer_state` to overlay base layer with som
|
||||
Note that ***higher layer has higher priority on stack of layers***, namely firmware falls down from top layer to bottom to look up keycode. Once it spots keycode other than **`KC_TRNS`**(transparent) on a layer it stops searching and lower layers aren't referred.
|
||||
|
||||
You can place `KC_TRNS` on overlay layer changes just part of layout to fall back on lower or base layer.
|
||||
Key with `KC_TRANS` doen't has its own keycode and refers to lower valid layers for keycode, instead.
|
||||
Key with `KC_TRANS` doesn't has its own keycode and refers to lower valid layers for keycode, instead.
|
||||
See example below.
|
||||
|
||||
|
||||
@ -155,12 +155,12 @@ You can find other keymap definitions in file `keymap.c` located on project dire
|
||||
|
||||
|
||||
## 1. Keycode
|
||||
See [`common/keycode.h`](../common/keycode.h) or keycode table below for the detail. Keycode is internal **8bit code** to inidicate action performed on key in keymap. Keycode has `KC_` prefixed symbol respectively. Most of keycodes like `KC_A` have simple action registers key to host on press and unregister on release, while some of other keycodes has some special actions like `Fn` keys, Media contorl keys, System control keys and Mousekeys.
|
||||
See [`common/keycode.h`](../common/keycode.h) or keycode table below for the detail. Keycode is internal **8bit code** to indicate action performed on key in keymap. Keycode has `KC_` prefixed symbol respectively. Most of keycodes like `KC_A` have simple action registers key to host on press and unregister on release, while some of other keycodes has some special actions like `Fn` keys, Media control keys, System control keys and Mousekeys.
|
||||
|
||||
***In `KEYMAP()` macro you should omit prefix part `KC_` of keycode to keep keymap compact.*** For example, just use `A` instead you place `KC_A` in `KEYMAP()`. Some keycodes has 4-letter **short name** in addition to descriptive name, you'll prefer short one in `KEYMAP()`.
|
||||
|
||||
### 1.0 Other key
|
||||
- `KC_NO` for no aciton
|
||||
- `KC_NO` for no action
|
||||
- `KC_TRNS` for layer transparency (See above)
|
||||
|
||||
### 1.1 Normal key
|
||||
@ -192,7 +192,7 @@ There are 8 modifiers which has discrimination between left and right.
|
||||
- `KC_WSCH`, `KC_WHOM`, `KC_WBAK`, `KC_WFWD`, `KC_WSTP`, `KC_WREF`, `KC_WFAV` for web browser operation
|
||||
|
||||
### 1.5 Fn key
|
||||
`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keyocde indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.***
|
||||
`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.***
|
||||
|
||||
### 1.6 Keycode Table
|
||||
See keycode table in [`doc/keycode.txt`](./keycode.txt) for description of keycodes.
|
||||
@ -205,7 +205,7 @@ There are 8 modifiers which has discrimination between left and right.
|
||||
## 2. Action
|
||||
See [`common/action_code.h`](../common/action_code.h). Action is a **16bit code** and defines function to perform on events of a key like press, release, holding and tapping.
|
||||
|
||||
Most of keys just register 8bit scancode to host, but to support other complex features needs 16bit extended action codes internally. However, using 16bit action codes in keymap results in double size in memory compared to using jsut keycodes. To avoid this waste 8bit keycodes are used in `KEYMAP()` instead of action codes.
|
||||
Most of keys just register 8bit scancode to host, but to support other complex features needs 16bit extended action codes internally. However, using 16bit action codes in keymap results in double size in memory compared to using just keycodes. To avoid this waste 8bit keycodes are used in `KEYMAP()` instead of action codes.
|
||||
|
||||
***You can just use keycodes of `Normal key`, `Modifier`, `Mousekey` and `System & Media key` in keymap*** to indicate corresponding actions instead of using action codes. While ***to use other special actions you should use keycode of `Fn` key defined in `fn_actions[]`.***
|
||||
|
||||
@ -230,7 +230,7 @@ You can define these actions on *'A'* key and *'left shift'* modifier with:
|
||||
#### 2.1.2 Modified key
|
||||
This action is comprised of strokes of modifiers and a key. `Macro` action is needed if you want more complex key strokes.
|
||||
|
||||
Say you want to assign a key to `Shift + 1` to get charactor *'!'* or `Alt + Tab` to switch application windows.
|
||||
Say you want to assign a key to `Shift + 1` to get character *'!'* or `Alt + Tab` to switch application windows.
|
||||
|
||||
ACTION_MODS_KEY(MOD_LSFT, KC_1)
|
||||
ACTION_MODS_KEY(MOD_LALT, KC_TAB)
|
||||
@ -269,10 +269,10 @@ Default Layer is a layer which always is valid and referred to when actions is n
|
||||
|
||||
This sets Default Layer to given parameter `layer` and activate it.
|
||||
|
||||
ACTION_DEFAULT_LAYER(layer)
|
||||
ACTION_DEFAULT_LAYER_SET(layer)
|
||||
|
||||
|
||||
#### 2.2.2 Momentary Switch
|
||||
#### 2.2.2 Momentary
|
||||
Turns on `layer` momentarily while holding, in other words it activates when key is pressed and deactivate when released.
|
||||
|
||||
ACTION_LAYER_MOMENTARY(layer)
|
||||
@ -342,7 +342,7 @@ Turns on layer only and clear all layer on release..
|
||||
ACTION_LAYER_BIT_XOR(part, bits, on)
|
||||
ACTION_LAYER_BIT_SET(part, bits, on)
|
||||
|
||||
These actions works with prameters as following code.
|
||||
These actions works with parameters as following code.
|
||||
|
||||
uint8_t shift = part*4;
|
||||
uint32_t mask = (bits&0x10) ? ~(0xf<<shift) : 0;
|
||||
@ -368,7 +368,7 @@ Default Layer also has bitwise operations, they are executed when key is release
|
||||
MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END )
|
||||
|
||||
#### 2.3.1 Macro Commands
|
||||
- **I()** change interavl of stroke.
|
||||
- **I()** change interval of stroke.
|
||||
- **D()** press key
|
||||
- **U()** release key
|
||||
- **T()** type key(press and release)
|
||||
@ -377,7 +377,7 @@ Default Layer also has bitwise operations, they are executed when key is release
|
||||
|
||||
#### 2.3.2 Examples
|
||||
|
||||
***TODO: sample impl***
|
||||
***TODO: sample implementation***
|
||||
See `keyboard/hhkb/keymap.c` for sample.
|
||||
|
||||
|
||||
@ -403,7 +403,7 @@ To define tappable `Function` action in keymap use this.
|
||||
|
||||
void keymap_call_function(keyrecord_t *event, uint8_t id, uint8_t opt)
|
||||
|
||||
This C function is called every time key is operated, argument `id` selects action to be performed and `opt` can be used for option. Functon `id` can be 0-255 and `opt` can be 0-15.
|
||||
This C function is called every time key is operated, argument `id` selects action to be performed and `opt` can be used for option. Function `id` can be 0-255 and `opt` can be 0-15.
|
||||
|
||||
`keyrecord_t` is comprised of key event and tap count. `keyevent_t` indicates which and when key is pressed or released. From `tap_count` you can know tap state, 0 means no tap. These information will be used in user function to decide how action of key is performed.
|
||||
|
||||
@ -423,7 +423,7 @@ This C function is called every time key is operated, argument `id` selects acti
|
||||
uint8_t row;
|
||||
} key_t;
|
||||
|
||||
***TODO: sample impl***
|
||||
***TODO: sample implementation***
|
||||
See `keyboard/hhkb/keymap.c` for sample.
|
||||
|
||||
|
||||
@ -444,6 +444,10 @@ Step through backlight levels.
|
||||
|
||||
ACTION_BACKLIGHT_STEP()
|
||||
|
||||
Turn a specific backlight level on or off.
|
||||
|
||||
ACTION_BACKLIGHT_LEVEL(1)
|
||||
|
||||
#### 2.5.2 Turn on / off backlight
|
||||
Turn the backlight on and off without changing level.
|
||||
|
||||
@ -462,8 +466,8 @@ This action makes 'Layer 1' active(valid) on key press event and inactive on rel
|
||||
ACTION_LAYER_MOMENTARY(1)
|
||||
|
||||
|
||||
Note that after switching on press the actions on destinaton layer(Layer 1) are perfomed.
|
||||
***Thus you shall need to place an action to go back on destination layer***, or you will be stuck in destination layer without way to get back. Usually you need to palce same action or 'KC_TRNS` on destination layer to get back.
|
||||
Note that after switching on press the actions on destination layer(Layer 1) are performed.
|
||||
***Thus you shall need to place an action to go back on destination layer***, or you will be stuck in destination layer without way to get back. Usually you need to place same action or 'KC_TRNS` on destination layer to get back.
|
||||
|
||||
|
||||
### 3.2 Toggle switching
|
||||
@ -480,7 +484,7 @@ These actions switch a layer only while holding a key but register the key on ta
|
||||
|
||||
ACTION_LAYER_TAP_KEY(2, KC_SCLN)
|
||||
|
||||
With this you can place a layer switching action on normal key like ';' without losing its original key register function. This action allows you to have layer switchig action without necessity of a dedicated key. It means you can have it even on home row of keyboard.
|
||||
With this you can place a layer switching action on normal key like ';' without losing its original key register function. This action allows you to have layer switching action without necessity of a dedicated key. It means you can have it even on home row of keyboard.
|
||||
|
||||
|
||||
|
||||
@ -511,17 +515,17 @@ Layer switching with tap key:
|
||||
|
||||
|
||||
### 4.2 Tap Toggle
|
||||
This is a feature to assign both toggle layer and momentary switch layer action to just same one physical key. It works as mementary layer switch when holding a key but toggle switch with several taps.
|
||||
This is a feature to assign both toggle layer and momentary switch layer action to just same one physical key. It works as momentary layer switch when holding a key but toggle switch with several taps.
|
||||
|
||||
ACTION_LAYER_TAP_TOGGLE(1)
|
||||
|
||||
|
||||
### 4.3 Oneshot Modifier
|
||||
This runs onetime effect swhich modify only on just one following key. It works as normal modifier key when holding down while oneshot modifier when tapping.
|
||||
This runs onetime effects which modify only on just one following key. It works as normal modifier key when holding down while oneshot modifier when tapping.
|
||||
|
||||
ACTION_MODS_ONESHOT(MOD_LSFT)
|
||||
|
||||
Say you want to type 'The', you have to push and hold Shift key before type 't' then release it before type 'h' and 'e', otherwise you'll get 'THe' or 'the' unintentionally. With Oneshot Modifier you can tap Shift then type 't', 'h' and 'e' normally, you don't need to holding Shift key properly here. This mean you can realease Shift before 't' is pressed down.
|
||||
Say you want to type 'The', you have to push and hold Shift key before type 't' then release it before type 'h' and 'e', otherwise you'll get 'THe' or 'the' unintentionally. With Oneshot Modifier you can tap Shift then type 't', 'h' and 'e' normally, you don't need to holding Shift key properly here. This mean you can release Shift before 't' is pressed down.
|
||||
|
||||
Oneshot effect is cancel unless following key is pressed down within `ONESHOT_TIMEOUT` of `config.h`. No timeout when it is `0` or not defined.
|
||||
|
||||
|
@ -48,7 +48,7 @@ Other Keyboard Firmware Projects
|
||||
- <http://geekhack.org/index.php?topic=19458.0>
|
||||
|
||||
## kbdbabel.org[converter][vintage][protocol][8051]
|
||||
Great resourse of vintage keyboard protocol information and code
|
||||
Great resource of vintage keyboard protocol information and code
|
||||
|
||||
- <http://www.kbdbabel.org/>
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
Replacable USB Controller for Apple IIgs/Standard(M0116)
|
||||
Replaceable USB Controller for Apple IIgs/Standard(M0116)
|
||||
JeffreySung(nattyman@gmail.com)
|
||||
|
||||
===============================
|
||||
@ -32,7 +32,7 @@ PJRC Teensy
|
||||
1. Bypass #31 pin(from board) to E4(Teensy)
|
||||
2. Bypass #30 pin(from board) to F2(Teensy)
|
||||
3. Bypass #6 pin(from board) to A0(Teensy)
|
||||
4. Refer doc directory
|
||||
4. Refer to documentation directory
|
||||
|
||||
To Do
|
||||
=====
|
||||
|
@ -50,8 +50,8 @@ TARGET_DIR = .
|
||||
# project specific files
|
||||
SRC = keymap_common.c \
|
||||
matrix.c \
|
||||
led.c \
|
||||
backlight.c \
|
||||
ledmap.c \
|
||||
led_matrix.c
|
||||
|
||||
ifdef KEYMAP
|
||||
@ -132,13 +132,19 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
USB_6KRO_ENABLE = yes # USB 6key Rollover
|
||||
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
|
||||
#PS2_USE_BUSYWAIT = yes
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
KEYMAP_EX_ENABLE = yes # External keymap in eeprom
|
||||
KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor
|
||||
KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom
|
||||
#KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor
|
||||
SOFTPWM_LED_ENABLE = yes # Enable SoftPWM to drive backlight
|
||||
FADING_LED_ENABLE = yes # Enable fading backlight
|
||||
BREATHING_LED_ENABLE = yes # Enable breathing backlight
|
||||
LEDMAP_ENABLE = yes # Enable LED mapping
|
||||
LEDMAP_IN_EEPROM_ENABLE = yes # Read LED mapping from eeprom
|
||||
|
||||
|
||||
# Optimize size but this may cause error "relocation truncated to fit"
|
||||
#EXTRALDFLAGS = -Wl,--relax
|
||||
|
@ -101,12 +101,11 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
|
||||
#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
|
||||
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
KEYMAP_EX_ENABLE = yes # External keymap in eeprom
|
||||
KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor
|
||||
|
||||
KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom
|
||||
|
||||
|
||||
# Search Path
|
||||
|
@ -80,7 +80,7 @@ See [keymap_plain.c](keymap_plain.c) for detail.
|
||||
|
||||
|
||||
### 3. Hasu
|
||||
This is my favourite keymap with HHKB Fn, Vi cursor and Mousekey layer. See [keymap_hasu.c](keymap_hasu.c) for detail.
|
||||
This is my favorite keymap with HHKB Fn, Vi cursor and Mousekey layer. See [keymap_hasu.c](keymap_hasu.c) for detail.
|
||||
|
||||
|
||||
### 4. SpaceFN
|
||||
|
@ -19,14 +19,29 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "backlight.h"
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
#include "softpwm_led.h"
|
||||
#else
|
||||
#include "breathing_led.h"
|
||||
#endif
|
||||
#include "action.h"
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
|
||||
static uint8_t backlight_mode;
|
||||
|
||||
void backlight_enable(void);
|
||||
void backlight_disable(void);
|
||||
inline void backlight_set_raw(uint8_t raw);
|
||||
|
||||
#ifndef SOFTPWM_LED_ENABLE
|
||||
#ifdef GH60_REV_CHN
|
||||
#else
|
||||
#define SOFTPWM_TIMER_TOP F_CPU/(256*64)
|
||||
uint8_t softpwm_ocr = 0;
|
||||
uint8_t softpwm_ocr_buff = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static const uint8_t backlight_table[] PROGMEM = {
|
||||
0, 16, 128, 255
|
||||
@ -38,6 +53,9 @@ static const uint8_t backlight_table[] PROGMEM = {
|
||||
*/
|
||||
void backlight_enable(void)
|
||||
{
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
softpwm_led_enable();
|
||||
#else
|
||||
#if defined(GH60_REV_CHN)
|
||||
// Turn on PWM
|
||||
DDRB |= (1<<PB6);
|
||||
@ -56,10 +74,14 @@ void backlight_enable(void)
|
||||
TIMSK1 |= (1<<OCIE1A);
|
||||
sei();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void backlight_disable(void)
|
||||
{
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
softpwm_led_disable();
|
||||
#else
|
||||
#if defined(GH60_REV_CHN)
|
||||
// Turn off PWM
|
||||
cli();
|
||||
@ -69,7 +91,7 @@ void backlight_disable(void)
|
||||
sei();
|
||||
OCR1B = 0;
|
||||
#else
|
||||
DDRF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
|
||||
DDRF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
|
||||
cli();
|
||||
TCCR1B &= ~(1<<WGM12);
|
||||
TCCR1B &= ~(1<<CS10);
|
||||
@ -77,29 +99,61 @@ void backlight_disable(void)
|
||||
sei();
|
||||
OCR1A = 0;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level)
|
||||
{
|
||||
backlight_mode = level;
|
||||
#ifdef BREATHING_LED_ENABLE
|
||||
switch (level) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
backlight_enable();
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
fading_led_disable_all();
|
||||
breathing_led_disable_all();
|
||||
#else
|
||||
breathing_led_disable();
|
||||
#endif
|
||||
backlight_set_raw(pgm_read_byte(&backlight_table[level]));
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
backlight_enable();
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
breathing_led_enable_all();
|
||||
fading_led_disable_all();
|
||||
breathing_led_set_duration(6 - level);
|
||||
#else
|
||||
breathing_led_enable();
|
||||
breathing_led_set_duration(6 - level);
|
||||
#endif
|
||||
break;
|
||||
case 7:
|
||||
backlight_enable();
|
||||
fading_led_enable_all();
|
||||
breathing_led_disable_all();
|
||||
fading_led_set_direction(FADING_LED_FADE_IN);
|
||||
fading_led_set_duration(3);
|
||||
break;
|
||||
case 8:
|
||||
backlight_enable();
|
||||
fading_led_enable_all();
|
||||
breathing_led_disable_all();
|
||||
fading_led_set_direction(FADING_LED_FADE_OUT);
|
||||
fading_led_set_duration(3);
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
fading_led_disable_all();
|
||||
breathing_led_disable_all();
|
||||
#else
|
||||
breathing_led_disable();
|
||||
#endif
|
||||
backlight_disable();
|
||||
break;
|
||||
}
|
||||
@ -114,22 +168,79 @@ void backlight_set(uint8_t level)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef SOFTPWM_LED_ENABLE
|
||||
#ifdef BREATHING_LED_ENABLE
|
||||
void breathing_led_set_raw(uint8_t raw)
|
||||
{
|
||||
backlight_set_raw(raw);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
inline void backlight_set_raw(uint8_t raw)
|
||||
{
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
for (uint8_t i = 0; i < LED_COUNT; i++) {
|
||||
softpwm_led_set(i, raw);
|
||||
}
|
||||
#else
|
||||
#if defined(GH60_REV_CHN)
|
||||
OCR1B = raw;
|
||||
#else
|
||||
softpwm_ocr_buff = raw;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef SOFTPWM_LED_ENABLE
|
||||
#ifndef LEDMAP_ENABLE
|
||||
|
||||
void softpwm_led_init(void)
|
||||
{
|
||||
#if defined(GH60_REV_CHN)
|
||||
DDRB |= (1<<PB6);
|
||||
#else
|
||||
DDRF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
|
||||
#endif
|
||||
}
|
||||
|
||||
void softpwm_led_on(uint8_t index)
|
||||
{
|
||||
#if defined(GH60_REV_CHN)
|
||||
PORTB |= (1<<PB6);
|
||||
#else
|
||||
PORTF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
|
||||
#endif
|
||||
}
|
||||
|
||||
void softpwm_led_off(uint8_t index)
|
||||
{
|
||||
#if defined(GH60_REV_CHN)
|
||||
PORTB &= ~(1<<PB6);
|
||||
#else
|
||||
PORTF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void action_keyevent(keyevent_t event)
|
||||
{
|
||||
if (backlight_mode == 7) {
|
||||
if (event.pressed) {
|
||||
softpwm_led_decrease_all(32);
|
||||
}
|
||||
}
|
||||
if (backlight_mode == 8) {
|
||||
if (event.pressed) {
|
||||
softpwm_led_increase_all(32);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifndef SOFTPWM_LED_ENABLE
|
||||
#if defined(GH60_REV_CHN)
|
||||
#else
|
||||
ISR(TIMER1_COMPA_vect)
|
||||
@ -149,3 +260,6 @@ ISR(TIMER1_COMPA_vect)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -43,7 +43,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/* number of backlight levels */
|
||||
#ifdef BREATHING_LED_ENABLE
|
||||
#define BACKLIGHT_LEVELS 6
|
||||
#define BACKLIGHT_LEVELS 8
|
||||
#else
|
||||
#define BACKLIGHT_LEVELS 3
|
||||
#endif
|
||||
@ -53,6 +53,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define LED_MATRIX_COLS 14
|
||||
#endif
|
||||
|
||||
/* LED mapping */
|
||||
#ifdef LEDMAP_ENABLE
|
||||
#if defined(GH60_REV_CHN)
|
||||
#define LED_COUNT 2
|
||||
#else
|
||||
#define LED_COUNT 5
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
#define LOCKING_SUPPORT_ENABLE
|
||||
|
||||
|
@ -16,10 +16,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
/* translates key to keycode */
|
||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
|
||||
{
|
||||
#ifndef KEYMAP_EX_ENABLE
|
||||
#ifndef KEYMAP_IN_EEPROM_ENABLE
|
||||
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
|
||||
#else
|
||||
return eeconfig_read_keymap_key(layer, key.row, key.col);
|
||||
@ -30,7 +31,7 @@ uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
|
||||
action_t keymap_fn_to_action(uint8_t keycode)
|
||||
{
|
||||
return (action_t) {
|
||||
#ifndef KEYMAP_EX_ENABLE
|
||||
#ifndef KEYMAP_IN_EEPROM_ENABLE
|
||||
.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)])
|
||||
#else
|
||||
.code = eeconfig_read_keymap_fn_action(FN_INDEX(keycode))
|
||||
@ -38,7 +39,7 @@ action_t keymap_fn_to_action(uint8_t keycode)
|
||||
};
|
||||
}
|
||||
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
#ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
const uint8_t* keymaps_pointer(void) {
|
||||
return (const uint8_t*)keymaps;
|
||||
}
|
||||
|
@ -28,18 +28,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "print.h"
|
||||
#include "debug.h"
|
||||
#include "keymap.h"
|
||||
#include "keymap_ex.h"
|
||||
#include "keymap_in_eeprom.h"
|
||||
|
||||
|
||||
/*
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
extern const uint8_t keymaps[KEYMAPS_COUNT][MATRIX_ROWS][MATRIX_COLS];
|
||||
extern const uint16_t fn_actions[FN_ACTIONS_COUNT];
|
||||
#else
|
||||
*/
|
||||
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
||||
extern const uint16_t fn_actions[];
|
||||
//#endif
|
||||
|
||||
|
||||
/* GH60 keymap definition macro
|
||||
@ -50,13 +43,13 @@ extern const uint16_t fn_actions[];
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
|
||||
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
|
||||
) { \
|
||||
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
|
||||
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
|
||||
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
|
||||
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
|
||||
{ KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \
|
||||
{ KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \
|
||||
}
|
||||
|
||||
/* ANSI valiant. No extra keys for ISO */
|
||||
@ -71,22 +64,7 @@ extern const uint16_t fn_actions[];
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
|
||||
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO, K3D, \
|
||||
K40, K41, K42, K45, NO, K4A, K4B, K4C, K4D \
|
||||
)
|
||||
|
||||
|
||||
#define KEYMAP_HHKB( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
|
||||
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
|
||||
) KEYMAP( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
|
||||
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
|
||||
)
|
||||
|
||||
#endif
|
||||
|
@ -103,7 +103,7 @@ const uint16_t PROGMEM fn_actions[] = {
|
||||
[8] = ACTION_DEFAULT_LAYER_SET(3), // set workman layout
|
||||
};
|
||||
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
#ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
uint16_t keys_count(void) {
|
||||
return sizeof(keymaps) / sizeof(keymaps[0]) * MATRIX_ROWS * MATRIX_COLS;
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
|
||||
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NO, ENT, \
|
||||
LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, RSFT, \
|
||||
LCTL,LGUI,LALT, SPC, NO, RALT,FN0, RGUI,RCTL),
|
||||
LCTL,LGUI,LALT, SPC, RALT,FN0, RGUI,RCTL),
|
||||
/* Keymap 1: Fn Layer
|
||||
* ,-----------------------------------------------------------.
|
||||
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete |
|
||||
@ -43,7 +43,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {
|
||||
TRNS,TRNS,UP, TRNS,TRNS,TRNS,CALC,TRNS,INS, TRNS,PSCR,SLCK,PAUS,TRNS, \
|
||||
TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,NO, TRNS, \
|
||||
TRNS,NO, TRNS,APP, FN1, FN2, FN3, VOLD,VOLU,MUTE,END, PGDN,TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS, TRNS, NO, TRNS,TRNS,TRNS,TRNS),
|
||||
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
|
||||
};
|
||||
|
||||
/*
|
||||
@ -61,7 +61,7 @@ const uint16_t fn_actions[] PROGMEM = {
|
||||
[3] = ACTION_BACKLIGHT_INCREASE()
|
||||
};
|
||||
|
||||
#ifdef KEYMAP_EX_ENABLE
|
||||
#ifdef KEYMAP_IN_EEPROM_ENABLE
|
||||
uint16_t keys_count(void) {
|
||||
return sizeof(keymaps) / sizeof(keymaps[0]) * MATRIX_ROWS * MATRIX_COLS;
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "led.h"
|
||||
|
||||
|
||||
#ifndef LEDMAP_ENABLE
|
||||
void led_set(uint8_t usb_led)
|
||||
{
|
||||
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||
@ -32,3 +33,4 @@ void led_set(uint8_t usb_led)
|
||||
PORTB &= ~(1<<2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user