]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
Add PC-8801 Keyboard support. (#620)
authorHaruka Inoue <yuno@tune.ocn.ne.jp>
Tue, 23 Jul 2019 01:14:59 +0000 (10:14 +0900)
committerhasu@tmk <tmk@users.noreply.github.com>
Tue, 23 Jul 2019 01:14:59 +0000 (10:14 +0900)
* Add PC-8801 Keyboard support.

* Add PC-8801 Keyboard support.

* Add PC-8801 Keyboard support.

converter/pc88_usb/Makefile [new file with mode: 0644]
converter/pc88_usb/Makefile.32u4 [new file with mode: 0644]
converter/pc88_usb/Makefile.unimap [new file with mode: 0644]
converter/pc88_usb/Makefile.unimap.32u4 [new file with mode: 0644]
converter/pc88_usb/README [new file with mode: 0644]
converter/pc88_usb/config.h [new file with mode: 0644]
converter/pc88_usb/keymap.c [new file with mode: 0644]
converter/pc88_usb/matrix.c [new file with mode: 0644]
converter/pc88_usb/unimap.c [new file with mode: 0644]
converter/pc88_usb/unimap_trans.h [new file with mode: 0644]

diff --git a/converter/pc88_usb/Makefile b/converter/pc88_usb/Makefile
new file mode 100644 (file)
index 0000000..c6af973
--- /dev/null
@@ -0,0 +1,101 @@
+# Target file name (without extension).
+TARGET ?= pc88_usb
+
+# Directory common source filess exist
+TMK_DIR ?= ../../tmk_core
+
+# Directory keyboard dependent files exist
+TARGET_DIR ?= .
+
+# keyboard dependent files
+#   Add one of lines below to select serial protocol implementation
+#      protocol/serial_uart.c
+#      protocol/serial_soft.c
+SRC ?= matrix.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 ?= atmega32u2       # TMK Converter
+
+
+# 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
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+#NKRO_ENABLE ?= yes    # USB Nkey Rollover
+##UNIMAP_ENABLE ?= yes
+
+
+# Boot Section Size in bytes
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+#
+# Keymap file
+#
+ifeq (yes,$(strip $(UNIMAP_ENABLE)))
+    KEYMAP_FILE = unimap
+else
+    ifeq (yes,$(strip $(ACTIONMAP_ENABLE)))
+        KEYMAP_FILE = actionmap
+    else
+        KEYMAP_FILE = keymap
+    endif
+endif
+ifdef KEYMAP
+    SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC)
+else
+    SRC := $(KEYMAP_FILE).c $(SRC)
+endif
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TMK_DIR)
+
+
+include $(TMK_DIR)/protocol/lufa.mk
+include $(TMK_DIR)/protocol.mk
+include $(TMK_DIR)/common.mk
+include $(TMK_DIR)/rules.mk
diff --git a/converter/pc88_usb/Makefile.32u4 b/converter/pc88_usb/Makefile.32u4
new file mode 100644 (file)
index 0000000..c27f126
--- /dev/null
@@ -0,0 +1,4 @@
+TARGET ?= pc88_usb_32u4
+MCU ?= atmega32u4
+
+include Makefile
diff --git a/converter/pc88_usb/Makefile.unimap b/converter/pc88_usb/Makefile.unimap
new file mode 100644 (file)
index 0000000..da52603
--- /dev/null
@@ -0,0 +1,101 @@
+# Target file name (without extension).
+TARGET ?= pc88_usb_unimap
+
+# Directory common source filess exist
+TMK_DIR ?= ../../tmk_core
+
+# Directory keyboard dependent files exist
+TARGET_DIR ?= .
+
+# keyboard dependent files
+#   Add one of lines below to select serial protocol implementation
+#      protocol/serial_uart.c
+#      protocol/serial_soft.c
+SRC ?= matrix.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 ?= atmega32u2       # TMK Converter
+
+
+# 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
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+#NKRO_ENABLE ?= yes    # USB Nkey Rollover
+UNIMAP_ENABLE ?= yes
+
+
+# Boot Section Size in bytes
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+#
+# Keymap file
+#
+ifeq (yes,$(strip $(UNIMAP_ENABLE)))
+    KEYMAP_FILE = unimap
+else
+    ifeq (yes,$(strip $(ACTIONMAP_ENABLE)))
+        KEYMAP_FILE = actionmap
+    else
+        KEYMAP_FILE = keymap
+    endif
+endif
+ifdef KEYMAP
+    SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC)
+else
+    SRC := $(KEYMAP_FILE).c $(SRC)
+endif
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TMK_DIR)
+
+
+include $(TMK_DIR)/protocol/lufa.mk
+include $(TMK_DIR)/protocol.mk
+include $(TMK_DIR)/common.mk
+include $(TMK_DIR)/rules.mk
diff --git a/converter/pc88_usb/Makefile.unimap.32u4 b/converter/pc88_usb/Makefile.unimap.32u4
new file mode 100644 (file)
index 0000000..11ab3ad
--- /dev/null
@@ -0,0 +1,4 @@
+TARGET ?= pc88_usb_32u4_unimap
+MCU ?= atmega32u4
+
+include Makefile.unimap
diff --git a/converter/pc88_usb/README b/converter/pc88_usb/README
new file mode 100644 (file)
index 0000000..eba2111
--- /dev/null
@@ -0,0 +1,73 @@
+PC88(Late type) to USB keyboard protocol converter
+=======================================
+Target MCU is ATMega32u2 but other USB capable AVR will also work.
+
+
+README FIRST
+---------
+This converter is for TYPE-B keyboard. For keyboards other than TYPE-B, 
+change the mode switch on the back of the keyboard.
+
+Stand the left foot on the back of the keyboard and there are two slits. 
+There is a mode change switch in the back of it.
+
+When this switch is up, TYPE-B mode is set.
+
+When connecting a keyboard to this adapter, be sure to set to TYPE-B mode.
+
+
+
+Connector
+---------
+On host/converter:
+
+    5Pin mini DIN
+       ___ ___
+      /  |_|  \
+     / 5     4 \
+    | 3   |   2 |
+     \_     1 _/
+       \_____/
+     (receptacle)
+
+
+Wiring: You can change this with editing config.h.
+
+    Pin mini DIN        MCU
+    ----------------------------------
+    1   5V              VCC
+    2   GND             GND
+    3   DATA            RD2
+    4   NC
+    5   NC
+
+
+
+
+Protocol
+--------
+Signal: Asynchronous, Positive logic, 20800bps, Least bit first
+Frame format: 1-Start bit(Lo), 8-Data bits, non-Parity, 1-Stop bit
+
+
+
+Build Firmware
+--------------
+Just use 'make' to bild firmware for TMK PC88 converter.
+
+    $ make -f Makefile.unimap clean
+    $ make -f Makefile.unimap
+
+To flash firmware
+
+    $ make -f Makefile.unimap dfu
+
+then push button on converter to flash firmware.
+
+If you are using ATMega32u4 based board instead of premade TMK PC88 converter(ATMega32u2) use following commands.
+
+    $ make -f Makefile.unimap.32u4 clean
+    $ make -f Makefile.unimap.32u4
+    $ make -f Makefile.unimap.32u4 dfu
+
+
diff --git a/converter/pc88_usb/config.h b/converter/pc88_usb/config.h
new file mode 100644 (file)
index 0000000..97ae6e3
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+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
+
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x8801
+#define DEVICE_VER      0x0101
+#define MANUFACTURER    t.m.k.
+#define PRODUCT         PC88 keyboard converter
+#define DESCRIPTION     converts PC88 keyboard protocol into USB
+
+
+/* matrix size */
+#define MATRIX_ROWS     16
+#define MATRIX_COLS     8
+
+/* key combination for command */
+#define IS_COMMAND()    ( \
+    keyboard_report->keys[0] == KC_STOP || \
+    keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) \
+)
+
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+
+/*
+ * PC88 Serial(USART) configuration
+ *     asynchronous, positive logic, 20800baud, bit order: LSB first
+ *     1-start bit, 8-data bit, non parity, 1-stop bit
+ */
+
+/*
+ * Software Serial
+ *   Add protocol/serial_soft.c to SRC in Makefile
+ */
+#define SERIAL_SOFT_BAUD                20800
+#define SERIAL_SOFT_PARITY_NONE
+#define SERIAL_SOFT_BIT_ORDER_LSB
+#define SERIAL_SOFT_LOGIC_POSITIVE
+/* RXD Port */
+#define SERIAL_SOFT_RXD_DDR             DDRD
+#define SERIAL_SOFT_RXD_PORT            PORTD
+#define SERIAL_SOFT_RXD_PIN             PIND
+#define SERIAL_SOFT_RXD_BIT             2
+#define SERIAL_SOFT_RXD_READ()          (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT))
+/* RXD Interupt */
+#define SERIAL_SOFT_RXD_VECT            INT2_vect
+#define SERIAL_SOFT_RXD_INIT()          do { \
+    /* pin configuration: input with pull-up */ \
+    SERIAL_SOFT_RXD_DDR &= ~(1<<SERIAL_SOFT_RXD_BIT); \
+    SERIAL_SOFT_RXD_PORT |= (1<<SERIAL_SOFT_RXD_BIT); \
+    /* enable interrupt: INT2(falling edge) */ \
+    EICRA |= ((1<<ISC21)|(0<<ISC20)); \
+    EIMSK |= (1<<INT2); \
+    sei(); \
+} while (0)
+#define SERIAL_SOFT_RXD_INT_ENTER()
+#define SERIAL_SOFT_RXD_INT_EXIT()      do { \
+    /* clear interrupt  flag */ \
+    EIFR = (1<<INTF2); \
+} while (0)
+/* TXD Port */
+#define SERIAL_SOFT_TXD_DDR             DDRD
+#define SERIAL_SOFT_TXD_PORT            PORTD
+#define SERIAL_SOFT_TXD_PIN             PIND
+#define SERIAL_SOFT_TXD_BIT             3
+#define SERIAL_SOFT_TXD_HI()            do { SERIAL_SOFT_TXD_PORT |=  (1<<SERIAL_SOFT_TXD_BIT); } while (0)
+#define SERIAL_SOFT_TXD_LO()            do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0)
+#define SERIAL_SOFT_TXD_INIT()          do { \
+    /* pin configuration: output */ \
+    SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \
+    /* idle */ \
+    SERIAL_SOFT_TXD_ON(); \
+} while (0)
+
+
+/*
+ * Hardware Serial(UART)
+ *   Add protocol/serial_uart.c to SRC in Makefile
+ */
+#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega32U2__)
+    #define SERIAL_UART_BAUD       20800
+    #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 |= (0<<UPM11) | (0<<UPM10);  /* parity: none(00), even(01), odd(11) */ \
+        DDRD  &= ~(1<<2); PORTD |=  (1<<2); /* Pull-up RXD pin */ \
+        sei(); \
+    } while(0)
+#else
+    #error "USART configuration is needed."
+#endif
+
+
+#endif
diff --git a/converter/pc88_usb/keymap.c b/converter/pc88_usb/keymap.c
new file mode 100644 (file)
index 0000000..ec8d074
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+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 "keycode.h"
+#include "action.h"
+#include "util.h"
+#include "serial.h"
+#include "keymap.h"
+
+
+
+
+// Following macros help you to define a keymap with the form of actual keyboard layout.
+
+/* Keyboard Scan codes
+ * ,---. ,---. ,------------------------. ,------------------------.  ,-------. 
+ * | 60| | 61| | 62 | 63 | 64 | 65 | 66 | | 67 | 68 | 69 | 6A | 6B |  | 36| 37| 
+ * `---' `---' `------------------------' `------------------------'  `-------' 
+ * ,---------------------------------------------------------------.  ,-------.  ,---------------.
+ * |  00 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E  |  | 38| 39|  | 3E| 3F| 4D| 41|
+ * |---------------------------------------------------------------|  `-------'  |---------------|
+ * |   0F  | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B|       |             | 42| 43| 44| 45|
+ * |--------------------------------------------------------`  1C  |  ,-------.  |---------------|
+ * |  74| 71| 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28|      |  |   3A  |  | 46| 47| 48| 49|
+ * |---------------------------------------------------------------|  |-------|  |---------------|
+ * |    70    | 29| 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33|  78    |  | 3B| 3C|  | 4A| 4B| 4C| 4D|
+ * `---------------------------------------------------------------'  |-------|  |---------------|
+ *        | 72| 73|   51  |   34    |   35    | 7A| 7B|               |   3D  |  | 4E| 4F| 50| 79|
+ *        `-------------------------------------------'               `-------'  `---------------'
+ */
+
+#define KEYMAP( \
+    K60,  K61,   K62, K63, K64, K65, K66,  K67, K68, K69, K6A, K6B,                    K36, K37,                        \
+    K00,      K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B,  K0C, K0D, K0E,   K38, K39,    K3E, K3F, K40, K41, \
+    K0F,      K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B,       K1C,                K42, K43, K44, K45, \
+       K74, K71, K1D, K1E, K1F, K20, K21, K22, K23, K24, K25, K26, K27,K28,                  K3A,      K46, K47, K48, K49, \
+       K70,      K29, K2A, K2B, K2C, K2D, K2E, K2F, K30, K31, K32, K33,            K78,   K3B, K3C,    K4A, K4B, K4C, K4D, \
+         K72, K73, K51,      K34,      K35,      K7A, K7B,                                K3D,      K4E, K4F, K50, K79  \
+) { \
+    { 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_##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_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_##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_NO,    KC_NO,    KC_NO    }, \
+    { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_NO,    KC_NO,    KC_NO    }, \
+    { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_NO,    KC_NO,    KC_NO,    KC_NO    }  \
+}
+
+
+const action_t fn_actions[] PROGMEM = {
+    [0] = ACTION_FUNCTION(0),   // toggle all LEDs
+};
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    static bool led = false;
+    switch (id) {
+        case 0:
+            if (record->event.pressed) {
+                if ((led = !led))
+                    serial_send(0x80);  // all on
+                else
+                    serial_send(0xff);  // all off
+            }
+            break;
+    }
+}
+
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keyboard Scan codes
+ * ,---. ,---. ,------------------------. ,------------------------.  ,-------. 
+ * | 60| | 61| | 62 | 63 | 64 | 65 | 66 | | 67 | 68 | 69 | 6A | 6B |  | 36| 37| 
+ * `---' `---' `------------------------' `------------------------'  `-------' 
+ * ,---------------------------------------------------------------.  ,-------.  ,---------------.
+ * |  00 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E  |  | 38| 39|  | 3E| 3F| 4D| 41|
+ * |---------------------------------------------------------------|  `-------'  |---------------|
+ * |   0F  | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B|       |             | 42| 43| 44| 45|
+ * |--------------------------------------------------------`  1C  |  ,-------.  |---------------|
+ * |  74| 71| 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28|      |  |   3A  |  | 46| 47| 48| 49|
+ * |---------------------------------------------------------------|  |-------|  |---------------|
+ * |    70    | 29| 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33|  78    |  | 3B| 3C|  | 4A| 4B| 4C| 4D|
+ * `---------------------------------------------------------------'  |-------|  |---------------|
+ *        | 72| 73|   51  |   34    |   35    | 7A| 7B|               |   3D  |  | 4E| 4F| 50| 79|
+ *        `-------------------------------------------'               `-------'  `---------------'
+ */
+    /* ANSI */
+    KEYMAP(
+    PAUS,PSCR,   F1,  F2,  F3,  F4,  F5,   F6,  F7,  F8,  F9,  F10,                    PGDN,PGUP,
+    ESC,      1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS, EQL, BSLS,BSPC,  INS, DEL,    HOME, END,PMNS,PSLS,
+    TAB,      Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,      ENT,                P7,  P8,  P9,  PAST,
+    LCTL,LCAP,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,F18,                 UP,       P4,  P5,  P6,  PPLS,
+    LSFT,     Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,GRV,            RSFT,  LEFT,RGHT,   P1,  P2,  P3,  PEQL,
+         F19, LGUI,LALT,     SPC,      RALT,     APP, RGUI,                              DOWN,      P0,  PCMM,PDOT,PENT
+    ),
+    /* JIS */
+    KEYMAP(
+    PAUS, PSCR,  F1,  F2,  F3,  F4,  F5,   F6,  F7,  F8,  F9,  F10,                    PGDN,PGUP,
+    ESC,      1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS, EQL, JYEN,BSPC,  INS, DEL,    HOME, END,PMNS,PSLS,
+    TAB,      Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,      ENT,                P7,  P8,  P9,  PAST,
+    LCTL,LCAP,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,NUHS,                UP,       P4,  P5,  P6,  PPLS,
+    LSFT,     Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,RO,             RSFT,  LEFT,RGHT,   P1,  P2,  P3,  PEQL,
+         KANA,LALT,MHEN,     SPC,      HENK,     RGUI,ZKHK,                              DOWN,      P0,  PCMM,PDOT,PENT
+    ),
+};
diff --git a/converter/pc88_usb/matrix.c b/converter/pc88_usb/matrix.c
new file mode 100644 (file)
index 0000000..4fb10bd
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+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/io.h>
+#include <util/delay.h>
+#include "print.h"
+#include "util.h"
+#include "matrix.h"
+#include "led.h"
+#include "debug.h"
+#include "protocol/serial.h"
+
+
+/*
+ * Matrix Array usage:
+ *
+ * ROW: 16(4bits)
+ * COL:  8(3bits)
+ *
+ *    8bit wide
+ *   +---------+
+ *  0|00 ... 07|
+ *  1|08 ... 0F|
+ *  :|   ...   |
+ *  :|   ...   |
+ *  E|70 ... 77|
+ *  F|78 ... 7F|
+ *   +---------+
+ */
+static uint8_t matrix[MATRIX_ROWS];
+#define ROW(code)      ((code>>3)&0xF)
+#define COL(code)      (code&0x07)
+
+void matrix_init(void)
+{
+    debug_keyboard = true;
+
+    serial_init();
+
+       // initialize matrix state: all keys off
+    for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
+
+       print("matrix_init done.\n");
+    return;
+}
+
+uint8_t matrix_scan(void)
+{
+    uint16_t code;
+    code = serial_recv2();
+    if (code == -1) {
+        return 0;
+    }
+
+    print_hex8(code); print(" ");
+
+    if (code&0x80) {
+        // break code
+        if (matrix_is_on(ROW(code), COL(code))) {
+            matrix[ROW(code)] &= ~(1<<COL(code));
+        }
+    } else {
+        // make code
+        if (!matrix_is_on(ROW(code), COL(code))) {
+            matrix[ROW(code)] |=  (1<<COL(code));
+        }
+    }
+       return code;
+}
+
+inline
+uint8_t matrix_get_row(uint8_t row)
+{
+    return matrix[row];
+}
+
+void led_set(uint8_t usb_led)
+{
+}
diff --git a/converter/pc88_usb/unimap.c b/converter/pc88_usb/unimap.c
new file mode 100644 (file)
index 0000000..4c2aaae
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+Copyright 2017 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 "unimap_trans.h"
+
+
+#define AC_FN0 ACTION_LAYER_MOMENTARY(1)
+
+#ifdef KEYMAP_SECTION_ENABLE
+const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
+#else
+const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
+#endif
+    UNIMAP(
+              F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24,
+    ESC,      F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,PAUS,         VOLD,VOLU,MUTE,
+    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, JYEN,BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
+    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,     BSLS,     DEL, END, PGDN,    P7,  P8,  P9,  PPLS,
+    CAPS,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     NUHS,ENT,                         P4,  P5,  P6,  COMM,
+    LSFT,NUBS,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,     RO,  RSFT,          UP,           P1,  P2,  P3,  PENT,
+    LCTL,LGUI,LALT,MHEN,          SPC,           HENK,KANA,RALT,RGUI,FN0, RCTL,     LEFT,DOWN,RGHT,    P0,       DOT, PEQL
+    ),
+    UNIMAP(
+              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+    GRV,      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,          TRNS,TRNS,TRNS,         TRNS,TRNS,TRNS,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,      TRNS,TRNS,TRNS,    TRNS,TRNS,TRNS,TRNS,
+    TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP,  INS,      TRNS,     TRNS,TRNS,TRNS,    TRNS,TRNS,TRNS,TRNS,
+    TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT,     TRNS,TRNS,                        TRNS,TRNS,TRNS,TRNS,
+    TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN,     TRNS,TRNS,          PGUP,         TRNS,TRNS,TRNS,TRNS,
+    TRNS,TRNS,TRNS,TRNS,          TRNS,          TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     HOME,PGDN,END,     TRNS,     TRNS,TRNS
+    ),
+};
diff --git a/converter/pc88_usb/unimap_trans.h b/converter/pc88_usb/unimap_trans.h
new file mode 100644 (file)
index 0000000..80f669f
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+Copyright 2018 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 _TRANS_H
+#define _TRANS_H
+
+#include <stdint.h>
+#include <avr/pgmspace.h>
+#include "unimap.h"
+
+
+/* Mapping PC88 scan codes to UNIMAP layout codes
+ *
+ * PC88 scan codes
+ * ,---. ,---. ,------------------------. ,------------------------.  ,-------. 
+ * | 60| | 61| | 62 | 63 | 64 | 65 | 66 | | 67 | 68 | 69 | 6A | 6B |  | 36| 37| 
+ * `---' `---' `------------------------' `------------------------'  `-------' 
+ * ,---------------------------------------------------------------.  ,-------.  ,---------------.
+ * |  00 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E  |  | 38| 39|  | 3E| 3F| 4D| 41|
+ * |---------------------------------------------------------------|  `-------'  |---------------|
+ * |   0F  | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B|       |             | 42| 43| 44| 45|
+ * |--------------------------------------------------------`  1C  |  ,-------.  |---------------|
+ * |  74| 71| 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28|      |  |   3A  |  | 46| 47| 48| 49|
+ * |---------------------------------------------------------------|  |-------|  |---------------|
+ * |    70    | 29| 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33|  78    |  | 3B| 3C|  | 4A| 4B| 4C| 4D|
+ * `---------------------------------------------------------------'  |-------|  |---------------|
+ *        | 72| 73|   51  |   34    |   35    | 7A| 7B|               |   3D  |  | 4E| 4F| 50| 79|
+ *        `-------------------------------------------'               `-------'  `---------------'
+ *
+ *
+ */
+const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = {
+    { UNIMAP_ESC,  UNIMAP_1,    UNIMAP_2,    UNIMAP_3,    UNIMAP_4,    UNIMAP_5,    UNIMAP_6,    UNIMAP_7     }, /* 00-07 */
+    { UNIMAP_8,    UNIMAP_9,    UNIMAP_0,    UNIMAP_MINS, UNIMAP_EQL,  UNIMAP_JYEN, UNIMAP_BSPC, UNIMAP_TAB   }, /* 08-0F */
+    { UNIMAP_Q,    UNIMAP_W,    UNIMAP_E,    UNIMAP_R,    UNIMAP_T,    UNIMAP_Y,    UNIMAP_U,    UNIMAP_I     }, /* 10-17 */
+    { UNIMAP_O,    UNIMAP_P,    UNIMAP_LBRC, UNIMAP_RBRC, UNIMAP_ENT,  UNIMAP_A,    UNIMAP_S,    UNIMAP_D     }, /* 18-1F */
+    { UNIMAP_F,    UNIMAP_G,    UNIMAP_H,    UNIMAP_J,    UNIMAP_K,    UNIMAP_L,    UNIMAP_SCLN, UNIMAP_QUOT  }, /* 20-27 */
+    { UNIMAP_BSLS, UNIMAP_Z,    UNIMAP_X,    UNIMAP_C,    UNIMAP_V,    UNIMAP_B,    UNIMAP_N,    UNIMAP_M     }, /* 28-2F */
+    { UNIMAP_COMM, UNIMAP_DOT,  UNIMAP_SLSH, UNIMAP_RO,   UNIMAP_SPC,  UNIMAP_HENK, UNIMAP_PGDN, UNIMAP_PGUP  }, /* 30-37 */
+    { UNIMAP_INS,  UNIMAP_DEL,  UNIMAP_UP,   UNIMAP_LEFT, UNIMAP_RGHT, UNIMAP_DOWN, UNIMAP_HOME, UNIMAP_END   }, /* 38-3F */
+    { UNIMAP_PMNS, UNIMAP_PSLS, UNIMAP_P7,   UNIMAP_P8,   UNIMAP_P9,   UNIMAP_PAST, UNIMAP_P4,   UNIMAP_P5    }, /* 40-47 */
+    { UNIMAP_P6,   UNIMAP_PPLS, UNIMAP_P1,   UNIMAP_P2,   UNIMAP_P3,   UNIMAP_PEQL, UNIMAP_P0,   UNIMAP_PCMM  }, /* 48-4F */
+    { UNIMAP_PDOT, UNIMAP_MHEN, UNIMAP_F11,  UNIMAP_F12,  UNIMAP_F13,  UNIMAP_F14,  UNIMAP_F15,  UNIMAP_NO    }, /* 50-57 */
+    { UNIMAP_F21,  UNIMAP_F22,  UNIMAP_F23,  UNIMAP_F24,  UNIMAP_NO,   UNIMAP_NO,   UNIMAP_APP,  UNIMAP_NO    }, /* 58-5F */
+    { UNIMAP_PAUS, UNIMAP_PSCR, UNIMAP_F1,   UNIMAP_F2,   UNIMAP_F3,   UNIMAP_F4,   UNIMAP_F5,   UNIMAP_F6    }, /* 60-67 */
+    { UNIMAP_F7,   UNIMAP_F8,   UNIMAP_F9,   UNIMAP_F10,  UNIMAP_NO,   UNIMAP_NO,   UNIMAP_NO,   UNIMAP_NO    }, /* 68-6F */
+    { UNIMAP_LSFT, UNIMAP_CAPS, UNIMAP_KANA, UNIMAP_LALT, UNIMAP_LCTL, UNIMAP_NO,   UNIMAP_NO,   UNIMAP_NO    }, /* 70-77 */
+    { UNIMAP_RSFT, UNIMAP_PENT, UNIMAP_RGUI, UNIMAP_GRV,  UNIMAP_NO,   UNIMAP_NO,   UNIMAP_NO,   UNIMAP_NO    }  /* 78-7F */
+};
+
+#endif