~ruther/qmk_firmware

b56717b843859aa3188f9a40532b077241269482 — tmk 12 years ago 97ee1be
Use software serial for Sun.
M common/mousekey.h => common/mousekey.h +1 -1
@@ 45,7 45,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define MOUSEKEY_TIME_TO_MAX 20
#endif
#ifndef MOUSEKEY_WHEEL_MAX_SPEED
#define MOUSEKEY_WHEEL_MAX_SPEED 16
#define MOUSEKEY_WHEEL_MAX_SPEED 8
#endif
#ifndef MOUSEKEY_WHEEL_TIME_TO_MAX
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40

M converter/sun_usb/Makefile => converter/sun_usb/Makefile +32 -40
@@ 1,8 1,3 @@
#
# Makefile for PJRC Teensy
#


# Target file name (without extension).
TARGET = sun_usb



@@ 16,7 11,7 @@ TARGET_DIR = .
SRC =	keymap.c \
	matrix.c \
	led.c \
	protocol/serial.c
	protocol/serial_soft.c

CONFIG_H = config.h



@@ 37,46 32,43 @@ MCU = atmega32u4       # Teensy 2.0
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
NKRO_ENABLE = yes	# USB Nkey Rollover



#---------------- Programming Options --------------------------
AVRDUDE = avrdude
# Type: avrdude -c ? to get a full listing.
AVRDUDE_PROGRAMMER = avr109
AVRDUDE_PORT = /dev/ttyACM0
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep

# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE_COUNTER = -y

# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_NO_VERIFY = -V

# Increase verbosity level.  Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> 
# to submit bug reports.
#AVRDUDE_VERBOSE = -v -v
CONSOLE_ENABLE = yes	# Console for debug
#NKRO_ENABLE = yes	# USB Nkey Rollover

AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
#AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)

#PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
#PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
PROGRAM_CMD = dfu-programmer atmega32u4 flash $(TARGET).hex
# Boot Section Size in bytes
#   Teensy halfKay   512
#   Atmel DFU loader 4096
#   LUFA bootloader  4096
OPT_DEFS += -DBOOT_SIZE=4096


# Search Path


@@ 84,7 76,7 @@ VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)


include $(TOP_DIR)/protocol/pjrc.mk
include $(TOP_DIR)/protocol/lufa.mk
include $(TOP_DIR)/protocol.mk
include $(TOP_DIR)/common.mk
include $(TOP_DIR)/rules.mk

M converter/sun_usb/README => converter/sun_usb/README +58 -120
@@ 1,20 1,15 @@
Sun to USB keyboard protocol converter
======================================
Target MCU is ATMega32u4 but other USB capable AVR will also work.
Supported keyboards: Sun Type 5 Keyboard, CTCSP SHORT TYPE KEYBOARD(CKUB)

CTCSP SHORT TYPE KEYBOARD: http://imgur.com/a/QIv6p

TODO
----
AVR UART engine expect positive logic while Sun keyboard signal is inverted serial.
To use AVR UART engine you need inverter in front of RX and TX pin.
Otherwise you can software serial routine to communicate the keyboard.


Hardware
--------
Target MCU is ATMega32u4 but other USB capable AVR will also work.
You can use PJRC Teensy as dev board.
    http://www.pjrc.com/teensy/

Connector
---------
  8Pin mini DIN
     ___ ___
    /  |_|  \


@@ 24,118 19,61 @@ Connector
     \_____/  
   (receptacle)

Wiring:
Pin mini DIN        Teensy
----------------------------------
1   GND             GND
2   GND             GND
3   5V
4   RX/TX(Mouse)
5   RX              PD2
6   TX              PD3
7   GND             GND
8   5V              VCC

    Wiring:
    Pin mini DIN        MCU
    ----------------------------------
    1   GND             GND
    2   GND             GND
    3   5V
    4   RX/TX(Mouse)
    5   RX              PD3
    6   TX              PD2
    7   GND             GND
    8   5V              VCC


Firmware
Protocol
--------
Build:
Singnal: 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.
    Otherwise you can software serial routine to communicate the keyboard.

This converter uses software method, you doesn't need any inverter part.


Commands From System To Keyboard
    0x01 Reset
            Keyboard responds with following byte sequence:
            Success: 0xFF 0x04 0x7F
            Fail:    0x7E 0x01 0x7F
    0x02 Bell On
    0x03 Bell Off
    0x0A Click On
    0x0B Click Off
    0x0E LED
            followed by LED status byte:
            bit: 3       2       1       0
            LED: CapsLk  ScrLk   Compose NumLk
    0x0F Layout
            Keyboard responds with 'Layout Response' 0xFE 0xXX

Commands From Keyboard To System
    0x7F Idle
            means no keys pressed.
    0xFE Layout Response
    0xFF Reset Response(followed by 0x04)
     
Reference
    http://kentie.net/article/sunkbd/page2.htm
    http://kentie.net/article/sunkbd/KBD.pdf


Build Firmware
--------------
Just use 'make'
    $ cd sun_usb
    $ make

And load the binary to MCU with your favorite programmer.
If you use Teensy you can load with PJRC Teensy Loader tool.
    http://www.pjrc.com/teensy/loader.html


*   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *


X68000 Keyboard Protocol
========================
http://kyoutan.jpn.org/uts/pc/pic/x68key/


Connector
---------
Mini DIN 7pin(female connector on computer side)
       7 6 5
       o o o
    4 o  =  o 3
        o o
        2 1

    Mini-DIN
    -------------
    pin1   +5V
    pin2   MOUSE
    pin3   RXD
    pin4   TXD
    pin5   READY
    pin6   REMOTE
    pin7   GND


Signaling
---------
- TXD,RXD
    Asynchronous, 2400baud, 1-startbit(L), 8-databit, 1-stopbit(H)

- READY
    ready/not ready(1/0)


Data from keyboard
------------------
bit 7       make/break flag(0/1)
bit 6-0     following scan code


Data from computer
------------------
- LED contorol ON/OFF(0/1)
    bit 7   1(fixed)
    bit 6   全角
    bit 5   ひらがな
    bit 4   INS
    bit 3   CAPS
    bit 2   コード入力
    bit 1   ローマ字
    bit 0   かな

- Repeat delay
    bit 7   0(fixed)
    bit 6   1(fixed)
    bit 5   1(fixed)
    bit 4   0(fixed)
    bit 3-0 delay
    REPEAT_DELAY = 200+delay*100 ms
    default: 500ms
 
-  Repeat time
    bit 7   0(fixed)
    bit 6   1(fixed)
    bit 5   1(fixed)
    bit 4   1(fixed)
    bit 3-0 time
    REPEAT_TIME = 30+time^2*5 ms
    default: 110ms


Scan Codes
----------
,---. ,---.    ,-------------------,    ,-------------------.  ,-----------. ,---------------.
| 61| | 62|    | 63| 64| 65| 66| 67|    | 68| 69| 6A| 6B| 6C|  | 5A| 5B| 5C| | 5D| 52| 53| 54|
`---' `---'    `-------------------'    `-------------------'  `-----------' `---------------'
,-----------------------------------------------------------.  ,-----------. ,---------------.
| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F|  | 36| 5E| 37| | 3F| 40| 41| 42|
|-----------------------------------------------------------|  |------------ |---------------|
|  10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C|     |  | 38| 39| 3A| | 43| 44| 45| 46|
|------------------------------------------------------. 1D |  `---=====---' |---------------|
|  71  | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29|    |   ___| 3C|___  | 47| 48| 49| 4A|
|-----------------------------------------------------------|  | 3B|---| 3D| |-----------|---|
|  70    | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34|   70 |  `---| 3E|---' | 4B| 4C| 4D|   |
`-----------------------------------------------------------|  .---=====---. |-----------| 4E|
       | 5F| 55 | 56 |     35     | 57 | 58 | 59 | 60|         |  72 |  73 | | 4F| 50| 51|   |
       `---------------------------------------------'         `-----------' `---------------'
Then, load the binary to MCU with your favorite programmer.

M converter/sun_usb/config.h => converter/sun_usb/config.h +23 -17
@@ 18,11 18,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_H
#define CONFIG_H

/* controller configuration */
#include "controller_teensy.h"

#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x3333
#define DEVICE_VER      0x0100
#define MANUFACTURER    t.m.k.
#define PRODUCT         Sun keyboard converter
#define DESCRIPTION     converts Sun keyboard protocol into USB


@@ 36,7 34,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
/* key combination for command */
#define IS_COMMAND() ( \
    keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \
    keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \
    keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \
    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)




@@ 44,18 43,25 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *     asynchronous, negative logic, 1200baud, no flow control
 *     1-start bit, 8-data bit, non parity, 1-stop bit
 */
#ifdef __AVR_ATmega32U4__
#   define SERIAL_RX_VECT        USART1_RX_vect
#   define SERIAL_RX_DATA        UDR1
#   define SERIAL_RX_BAUD        1200
#   define SERIAL_RX_UBBR        ((F_CPU/(16UL*SERIAL_RX_BAUD))-1)
#   define SERIAL_RX_INIT()      do { \
        UBRR1L = (uint8_t) SERIAL_RX_UBBR; \
        UBRR1H = (uint8_t) (SERIAL_RX_UBBR>>8); \
        UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); \
    } while(0)
#else
#   error "Serial(USART) configuration is needed."
#endif
#define SERIAL_NEGATIVE_LOGIC
#define SERIAL_BAUD 1200
#define SERIAL_RXD_DDR  DDRD
#define SERIAL_RXD_PORT PORTD
#define SERIAL_RXD_PIN  PIND
#define SERIAL_RXD_BIT  2
#define SERIAL_RXD_VECT INT2_vect
#define SERIAL_RXD_INIT()  do { \
    /* pin configuration: input with pull-up */ \
    SERIAL_RXD_DDR &= ~(1<<SERIAL_RXD_BIT);     \
    SERIAL_RXD_PORT |= (1<<SERIAL_RXD_BIT);     \
    /* enable interrupt: INT2(rising edge) */   \
    EICRA |= ((1<<ISC21)|(1<<ISC20));           \
    EIMSK |= (1<<INT2);                         \
} while (0)
#define SERIAL_RXD_INT_ENTER()
#define SERIAL_RXD_INT_EXIT() do {  \
    /* clear interrupt  flag */     \
    EIFR = (1<<INTF2);              \
} while (0)

#endif

M converter/sun_usb/keymap.c => converter/sun_usb/keymap.c +107 -55
@@ 25,34 25,32 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.



// Following macros help you to define a keymap with the form of actual keyboard layout.

/* X68000 Keyboard Scan codes
,-------.  ,-------------------. ,---------------. ,---------------.  ,-----------. ,---------------.
|       |  | 61|   |   |   |   | | 63| 65| 66| 67| | 69| 6A| 6B| 6C|  | 5A| 5B| 5C| | 5D| 52| 53| 54|
`-------'  `-------------------' `---------------' `---------------'  `-----------' `---------------'
/* Sun type 5 keyboard
,-------.  ,---,  ,---------------. ,---------------. ,---------------.   ,-----------. ,---------------.
|   76  |  |   |  | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B|   | 16| 17| 15| | 2D| 02| 04| 30|
`-------'  `---'  `---------------' `---------------' `---------------'   `-----------' `---------------'
,-------.  ,-----------------------------------------------------------.  ,-----------. ,---------------.
|   |   |  | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F|  | 36| 5E| 37| | 3F| 40| 41| 42|
| 01| 03|  | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A|  | 2C| 34| 60| | 62| 2E| 2F| 47|
|-------|  |-----------------------------------------------------------|  |------------ |---------------|
|   |   |  |  10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C|     |  | 38| 39| 3A| | 43| 44| 45| 46|
|-------|  |-----------------------------------------------------------|  `-----------' |-----------|   |
|   |   |  |  71  | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29     |                | 47| 48| 49| 4A|
| 19| 1A|  |  35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B  |  | 42| 4A| 7B| | 44| 45| 46|   |
|-------|  |-----------------------------------------------------------|  `-----------' |-----------| 7D|
| 31| 33|  |  4C  | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57|   59   |                | 5B| 5C| 5D|   |
|-------|  |-----------------------------------------------------------|      ,---.     |-----------|---|
|   |   |  |  70    | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33|       70 |      | 3E|     | 4B| 4C| 4D|   |
|-------|  |-----------------------------------------------------------|  .-----------. |-----------| 4E|
|   |   |  |    |   |    |            35                  |    |   |   |  |   |   |73 | | 4F| 50| 51|   |
| 48| 49|  |   63   | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D|    6E    |      | 14|     | 70| 71| 72|   |
|-------|  |-----------------------------------------------------------|  .-----------. |-----------| 5A|
| 5F| 61|  | 77 | 13| 78 |*73 |       79         |*74 |*75| 7A | 43| 0D|  | 18| 1B| 1C| |   5E  | 32|   |
`-------'  `-----------------------------------------------------------'  `-----------' `---------------'
*/
#define KEYMAP( \
    K61,K62,        K63,K64,K65,K66,K67,    K68,K69,K6A,K6B,K6C,  K5A,K5B,K5C,  K5D,K52,K53,K54, \
    K01,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K0E,K0F,  K36,K5E,K37,  K3F,K40,K41,K42, \
    K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B,K1C,    K1D,  K38,K39,K3A,  K43,K44,K45,K46, \
    K71,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,              K3C,      K47,K48,K49,K4A, \
    K70,K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34,              K3B,K3E,K3D,  K4B,K4C,K4D,K4E, \
        K5F,K55,K56,    K35,        K57,K58,K59,K60,              K72,    K73,  K4F,K50,K51      \
      K76,        K05,K06,K08,K0A,    K0C,K0E,K10,K11,    K12,K07,K09,K0B,  K16,K17,K15,  K2D,K02,K04,K30, \
    K01,K03,  K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A,  K2C,K34,K60,  K62,K2E,K2F,K47, \
    K19,K1A,  K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,   K2B,  K42,K4A,K7B,  K44,K45,K46,K7D, \
    K31,K33,  K4C,  K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57,      K59,                K5B,K5C,K5D,     \
    K48,K49,  K63,   K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D,         K6E,      K14,      K70,K71,K72,K5A, \
    K5F,K61,  K77,K13, K78, K73,        K79,      K74, K75, K7A, K43, K0D,  K18,K1B,K1C,  K5E,    K32      \
) { \
    { KC_NO,    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_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_NO,   }, \
    { 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 }, \


@@ 60,21 58,39 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
    { 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_##K48, KC_##K49, KC_##K4A, KC_NO,    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_##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_##K6C, KC_NO,    KC_NO,    KC_NO    }, \
    { KC_##K70, KC_##K71, KC_##K72, KC_##K73, 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_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_NO    }, \
    { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
    { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_NO,    KC_##K7D, KC_NO,    KC_NO    }  \
}

/* CTCSP SHORT TYPE KEYBOARD */
#define SHORT_TYPE( \
    K01, K05,K06,K08,K0A,K0C,K0E, K61,K49,K33, K30, K2C,K34,K60, \
         K10,K11,K12,K07,K09,K0B,                   K42,K4A,K7B, \
    K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, \
    K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,   K2B, \
    K4C,  K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57,      K59, \
    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,  \
    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        \
)


// 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
    2,              // Fn0
    3,              // Fn1
    4,              // Fn2
    0,              // Fn3
    0,              // Fn4
    0,              // Fn5


@@ 86,8 102,8 @@ static const uint8_t PROGMEM fn_layer[] = {
// See layer.c for details.
static const uint8_t PROGMEM fn_keycode[] = {
    KC_NO,          // Fn0
    KC_NO,          // Fn1
    KC_NO,          // Fn2
    KC_SCLN,        // Fn1
    KC_SLSH,        // Fn2
    KC_NO,          // Fn3
    KC_NO,          // Fn4
    KC_NO,          // Fn5


@@ 97,29 113,65 @@ static const uint8_t PROGMEM fn_keycode[] = {


static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* X68000 Keyboard Scan codes
    ,---. ,---.    ,-------------------,    ,-------------------.  ,-----------. ,---------------.
    | 61| | 62|    | 63| 64| 65| 66| 67|    | 68| 69| 6A| 6B| 6C|  | 5A| 5B| 5C| | 5D| 52| 53| 54|
    `---' `---'    `-------------------'    `-------------------'  `-----------' `---------------'
    ,-----------------------------------------------------------.  ,-----------. ,---------------.
    | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F|  | 36| 5E| 37| | 3F| 40| 41| 42|
    |-----------------------------------------------------------|  |------------ |---------------|
    |  10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C|     |  | 38| 39| 3A| | 43| 44| 45| 46|
    |------------------------------------------------------. 1D |  `---=====---' |---------------|
    |  71  | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29|    |   ___| 3C|___  | 47| 48| 49| 4A|
    |-----------------------------------------------------------|  | 3B|---| 3D| |-----------|---|
    |  70    | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34|   70 |  `---| 3E|---' | 4B| 4C| 4D|   |
    `-----------------------------------------------------------|  .---=====---. |-----------| 4E|
           | 5F| 55 | 56 |     35     | 57 | 58 | 59 | 60|         |  72 |  73 | | 4F| 50| 51|   |
           `---------------------------------------------'         `-----------' `---------------'
*/
/*
    KEYMAP(
    NO,  NO,  F1,  F2,  F3,  F4,  F5,       F6,  F7,  F8,  F9,  F10,              PSCR,SLCK,PAUS,     CAPS,NO,  NO,  NO,
    ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSLS,BSPC,   INS, HOME,PGUP,     NLCK,PSLS,PAST,PMNS,
    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,     ENT,    DEL, END, PGDN,     P7,  P8,  P9,  PPLS,
    LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,ENT,                   UP,            P4,  P5,  P6,  PEQL,
    LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,GRV,                   LEFT,DOWN,RGHT,     P1,  P2,  P3,  PENT,
         LGUI,LALT,NO,       SPC,      RALT,RGUI,RCTL,APP,                        NO,       NO,       P0,  PCMM,PDOT
         HELP,       F1, F2, F3, F4,         F5, F6, F7, F8,         F9, F10,F11,F12,   PSCR,SLCK,PAUS,  MUTE,VOLD,VOLU,PWR,
    STOP,   AGAIN,   ESC,1,  2,  3,  4,  5,  6,  7,  8,  9,  0,   MINS,EQL, BSLS,GRV,   INS, HOME,PGUP,  NLCK,PSLS,PAST,PMNS,
    MENU,   UNDO,    TAB, Q,  W,  E,  R,  T,  Y,  U,  I,  O,  P,   LBRC,RBRC,    BSPC,  DEL, END, PGDN,  P7,  P8, P9,  PPLS,
    SELECT, COPY,    LCTL, A,  S,  D,  F,  G,  H,  J,  K,  L,  SCLN,QUOT,        ENT,                    P4,  P5, P6,
    EXECUTE,PASTE,   LSFT,  Z,  X,  C,  V,  B,  N,  M,  COMM,DOT,SLSH,           RSFT,       UP,         P1,  P2, P3,  PENT,
    FIND,   CUT,     CAPS, LALT, LGUI,HENK,  SPC,            MHEN,KANA,RGUI,APP, RALT,  LEFT,DOWN,RGHT,  P0,      PDOT
    ),
*/
    // 0: default
    SHORT_TYPE(
        STOP, F1,F2,F3,F4, F5, F6,   CUT,PASTE,COPY,PWR,    INS, HOME,PGUP,
              F7,F8,F9,F10,F11,F12,                         DEL, END, PGDN,
        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,   SCLN,QUOT,        ENT,
        LSFT,   Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,  RALT,UP,  RSFT,
        CAPS,LALT,LGUI,            SPC,              RGUI,APP, NLCK,LEFT,DOWN,RGHT
    ),
    // 1: with layer keys
    SHORT_TYPE(
        ESC,  F1,F2,F3,F4, F5, F6,   CUT,PASTE,COPY,PWR,    INS, HOME,PGUP,
              F7,F8,F9,F10,F11,F12,                         DEL, END, PGDN,
        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,        ENT,
        LSFT,   Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN2,   RSFT,UP,  FN0,
        CAPS,LALT,LGUI,            SPC,              RGUI,RALT,FN0, LEFT,DOWN,RGHT
    ),
    // 2: HHKB
    SHORT_TYPE(
        ESC,  F1,F2,F3,F4, F5, F6,   CUT,PASTE,COPY,PWR,    INS, HOME,PGUP,
              F7,F8,F9,F10,F11,F12,                         DEL, END, PGDN,
        GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,
        CAPS, NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,PAUS,UP,  NO,      BSPC,
        LCTL,  VOLD,VOLU,MUTE,NO,  NO,  NO,  NO,  HOME,PGUP,LEFT,RGHT,        ENT,
        LSFT,   Z,   X,   C,   V,   B,   NO,  NO,  END, PGDN,DOWN,  RSFT,PGUP,FN0,
        CAPS,LALT,LGUI,            SPC,              RGUI,RALT,FN0, HOME,PGDN,END
    ),
    // 3: Mousekey
    SHORT_TYPE(
        ESC,  F1,F2,F3,F4, F5, F6,   CUT,PASTE,COPY,PWR,    INS, HOME,PGUP,
              F7,F8,F9,F10,F11,F12,                         DEL, END, PGDN,
        GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,
        CAPS, NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,WH_U,WH_R,NO,  NO,  NO,      BSPC,
        LCTL,  NO,  ACL0,ACL1,ACL2,NO,  MS_L,MS_D,MS_U,MS_R,FN1, NO,          ENT,
        LSFT,   NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,NO,  NO,  NO,    RSFT,UP,  NO,
        CAPS,LALT,LGUI,            BTN1,             RGUI,RALT,NO,  LEFT,DOWN,RGHT
    ),
    // 4: Cursor
    SHORT_TYPE(
        ESC,  F1,F2,F3,F4, F5, F6,   CUT,PASTE,COPY,PWR,    INS, HOME,PGUP,
              F7,F8,F9,F10,F11,F12,                         DEL, END, PGDN,
        GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,
        CAPS, NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, NO,  NO,  NO,      BSPC,
        LCTL,  NO,  NO,  NO,  NO,  NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,          ENT,
        LSFT,   NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, FN2,   RSFT,UP,  NO,
        CAPS,LALT,LGUI,            BTN1,             RGUI,RALT,NO,  LEFT,DOWN,RGHT
    ),
};



@@ 129,12 181,12 @@ uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
    return pgm_read_byte(&keymaps[(layer)][(row)][(col)]);
}

uint8_t keymap_fn_layer(uint8_t fn_bits)
uint8_t keymap_fn_layer(uint8_t index)
{
    return pgm_read_byte(&fn_layer[biton(fn_bits)]);
    return pgm_read_byte(&fn_layer[index]);
}

uint8_t keymap_fn_keycode(uint8_t fn_bits)
uint8_t keymap_fn_keycode(uint8_t index)
{
    return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
    return pgm_read_byte(&fn_keycode[index]);
}

M converter/sun_usb/led.c => converter/sun_usb/led.c +0 -1
@@ 16,7 16,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "stdint.h"
#include "serial.h"
#include "led.h"



M converter/sun_usb/matrix.c => converter/sun_usb/matrix.c +19 -40
@@ 21,9 21,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include <util/delay.h>
#include "print.h"
#include "util.h"
#include "serial.h"
#include "matrix.h"
#include "debug.h"
#include "protocol/serial.h"


/*


@@ 41,39 41,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *  E|70 ... 77|
 *  F|78 ... 7F|
 *   +---------+
 *
 * Command From System To Keyboard
 * 0x01 Reset
 * 0x02 Bell On
 * 0x03 Bell Off
 * 0x0A Click On
 * 0x0B Click Off
 * 0x0E LED
 * 0x0F Layout
 *
 * Command From Keyboard To System
 * 0x7F Idle
 * 0xFE Layout Response
 * 0xFF Reset Response(followed by 0x04)
 *
 * bit: 3       2       1       0
 * LED: CapsLk  ScrLk   Compose NumLk
 *      
 * Connector
 *   8Pin mini DIN
 *      8  7  6
 *     5    4  3
 *       2   1
 *     receptacle
 *
 * 1: GND
 * 2: GND
 * 3: 5V
 * 4: RX/TX(Mouse)
 * 5: RX
 * 6: TX
 * 7: GND
 * 8: 5V
 */
static uint8_t matrix[MATRIX_ROWS];
#define ROW(code)      ((code>>3)&0xF)


@@ 113,14 80,26 @@ uint8_t matrix_scan(void)

    uint8_t code;
    code = serial_recv();
    if (code == 0) {
        return 0;
    if (!code) return 0;

    debug_hex(code); debug(" ");

    switch (code) {
        case 0x7E:  // reset fail
        case 0xFE:  // layout
        case 0xFF:  // reset success
            _delay_ms(500);
            // ignore response byte
            debug("(response ignored:");
            while ((code = serial_recv())) { debug(" "); debug_hex(code); }
            debug(") ");
            // FALL THROUGH
        case 0x7F:
            // all keys up
            for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
            return 0;
    }

    phex(code); print("(");
    code = ~code;
    phex(code); print(")");
return 0;
    if (code&0x80) {
        // break code
        if (matrix_is_on(ROW(code), COL(code))) {

R protocol/serial.c => protocol/serial_soft.c +43 -4
@@ 38,12 38,19 @@ POSSIBILITY OF SUCH DAMAGE.
#include <stdbool.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "serial.h"

/*
 *  Stupid Inefficient Busy-wait Software Serial
 *  is still useful for negative logic signal like Sun protocol not supported by hardware USART.
 */

#define WAIT_US     (1000000/SERIAL_BAUD)

void serial_init(void)
{
    SERIAL_RX_INIT();
    SERIAL_RXD_INIT();
}

// RX ring buffer


@@ 64,12 71,44 @@ uint8_t serial_recv(void)
    return data;
}

// USART RX complete interrupt
ISR(SERIAL_RX_VECT)
//ISR(INT2_vect)
ISR(SERIAL_RXD_VECT)
{
    SERIAL_RXD_INT_ENTER()

    uint8_t data = 0;
#ifdef SERIAL_BIT_ORDER_MSB
    uint8_t pos = 0x80;
#else
    uint8_t pos = 0x01;
#endif
    // to center of start bit
    _delay_us(WAIT_US/2);
    do {
        // to center of next bit
        _delay_us(WAIT_US);

        if (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) {
            data |= pos;
        }
#ifdef SERIAL_BIT_ORDER_MSB
        pos >>= 1;
#else
        pos <<= 1;
#endif
    } while (pos);
    // to center of stop bit
    _delay_us(WAIT_US);

#ifdef SERIAL_NEGATIVE_LOGIC
    data = ~data;
#endif

    uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
    if (next != rbuf_tail) {
        rbuf[rbuf_head] = SERIAL_RX_DATA;
        rbuf[rbuf_head] = data;
        rbuf_head = next;
    }

    SERIAL_RXD_INT_EXIT();
}

M rules.mk => rules.mk +1 -1
@@ 252,7 252,7 @@ EXTMEMOPTS =
# 	(.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
#
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += -Wl,--relax
#LDFLAGS += -Wl,--relax
LDFLAGS += -Wl,--gc-sections
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))