1
0

Use software serial for Sun.

This commit is contained in:
tmk 2012-10-19 14:06:18 +09:00
parent 97ee1be59d
commit b56717b843
9 changed files with 286 additions and 281 deletions

View File

@ -45,7 +45,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MOUSEKEY_TIME_TO_MAX 20 #define MOUSEKEY_TIME_TO_MAX 20
#endif #endif
#ifndef MOUSEKEY_WHEEL_MAX_SPEED #ifndef MOUSEKEY_WHEEL_MAX_SPEED
#define MOUSEKEY_WHEEL_MAX_SPEED 16 #define MOUSEKEY_WHEEL_MAX_SPEED 8
#endif #endif
#ifndef MOUSEKEY_WHEEL_TIME_TO_MAX #ifndef MOUSEKEY_WHEEL_TIME_TO_MAX
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 #define MOUSEKEY_WHEEL_TIME_TO_MAX 40

View File

@ -1,8 +1,3 @@
#
# Makefile for PJRC Teensy
#
# Target file name (without extension). # Target file name (without extension).
TARGET = sun_usb TARGET = sun_usb
@ -16,7 +11,7 @@ TARGET_DIR = .
SRC = keymap.c \ SRC = keymap.c \
matrix.c \ matrix.c \
led.c \ led.c \
protocol/serial.c protocol/serial_soft.c
CONFIG_H = config.h CONFIG_H = config.h
@ -37,46 +32,43 @@ MCU = atmega32u4 # Teensy 2.0
F_CPU = 16000000 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 # Build Options
# *Comment out* to disable the options. # *Comment out* to disable the options.
# #
MOUSEKEY_ENABLE = yes # Mouse keys MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control EXTRAKEY_ENABLE = yes # Audio control and System control
NKRO_ENABLE = yes # USB Nkey Rollover CONSOLE_ENABLE = yes # Console for debug
#NKRO_ENABLE = yes # USB Nkey Rollover
# Boot Section Size in bytes
#---------------- Programming Options -------------------------- # Teensy halfKay 512
AVRDUDE = avrdude # Atmel DFU loader 4096
# Type: avrdude -c ? to get a full listing. # LUFA bootloader 4096
AVRDUDE_PROGRAMMER = avr109 OPT_DEFS += -DBOOT_SIZE=4096
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
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
# Search Path # Search Path
@ -84,7 +76,7 @@ VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR) VPATH += $(TOP_DIR)
include $(TOP_DIR)/protocol/pjrc.mk include $(TOP_DIR)/protocol/lufa.mk
include $(TOP_DIR)/protocol.mk include $(TOP_DIR)/protocol.mk
include $(TOP_DIR)/common.mk include $(TOP_DIR)/common.mk
include $(TOP_DIR)/rules.mk include $(TOP_DIR)/rules.mk

View File

@ -1,20 +1,15 @@
Sun to USB keyboard protocol converter Sun to USB keyboard protocol converter
====================================== ======================================
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. Target MCU is ATMega32u4 but other USB capable AVR will also work.
You can use PJRC Teensy as dev board. Supported keyboards: Sun Type 5 Keyboard, CTCSP SHORT TYPE KEYBOARD(CKUB)
http://www.pjrc.com/teensy/
CTCSP SHORT TYPE KEYBOARD: http://imgur.com/a/QIv6p
Connector Connector
---------
8Pin mini DIN 8Pin mini DIN
___ ___ ___ ___
/ |_| \ / |_| \
@ -24,118 +19,61 @@ Connector
\_____/ \_____/
(receptacle) (receptacle)
Wiring: Wiring:
Pin mini DIN Teensy Pin mini DIN MCU
---------------------------------- ----------------------------------
1 GND GND 1 GND GND
2 GND GND 2 GND GND
3 5V 3 5V
4 RX/TX(Mouse) 4 RX/TX(Mouse)
5 RX PD2 5 RX PD3
6 TX PD3 6 TX PD2
7 GND GND 7 GND GND
8 5V VCC 8 5V VCC
Protocol
Firmware
-------- --------
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 $ cd sun_usb
$ make $ make
Then, load the binary to MCU with your favorite programmer.
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| |
`---------------------------------------------' `-----------' `---------------'

View File

@ -18,11 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_H #ifndef CONFIG_H
#define CONFIG_H #define CONFIG_H
/* controller configuration */
#include "controller_teensy.h"
#define VENDOR_ID 0xFEED #define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x3333 #define PRODUCT_ID 0x3333
#define DEVICE_VER 0x0100
#define MANUFACTURER t.m.k. #define MANUFACTURER t.m.k.
#define PRODUCT Sun keyboard converter #define PRODUCT Sun keyboard converter
#define DESCRIPTION converts Sun keyboard protocol into USB #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 */ /* key combination for command */
#define IS_COMMAND() ( \ #define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ 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 * asynchronous, negative logic, 1200baud, no flow control
* 1-start bit, 8-data bit, non parity, 1-stop bit * 1-start bit, 8-data bit, non parity, 1-stop bit
*/ */
#ifdef __AVR_ATmega32U4__ #define SERIAL_NEGATIVE_LOGIC
# define SERIAL_RX_VECT USART1_RX_vect #define SERIAL_BAUD 1200
# define SERIAL_RX_DATA UDR1 #define SERIAL_RXD_DDR DDRD
# define SERIAL_RX_BAUD 1200 #define SERIAL_RXD_PORT PORTD
# define SERIAL_RX_UBBR ((F_CPU/(16UL*SERIAL_RX_BAUD))-1) #define SERIAL_RXD_PIN PIND
# define SERIAL_RX_INIT() do { \ #define SERIAL_RXD_BIT 2
UBRR1L = (uint8_t) SERIAL_RX_UBBR; \ #define SERIAL_RXD_VECT INT2_vect
UBRR1H = (uint8_t) (SERIAL_RX_UBBR>>8); \ #define SERIAL_RXD_INIT() do { \
UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); \ /* pin configuration: input with pull-up */ \
} while(0) SERIAL_RXD_DDR &= ~(1<<SERIAL_RXD_BIT); \
#else SERIAL_RXD_PORT |= (1<<SERIAL_RXD_BIT); \
# error "Serial(USART) configuration is needed." /* enable interrupt: INT2(rising edge) */ \
#endif 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 #endif

View File

@ -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. /* Sun type 5 keyboard
,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------.
/* X68000 Keyboard Scan codes | 76 | | | | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30|
,-------. ,-------------------. ,---------------. ,---------------. ,-----------. ,---------------. `-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------'
| | | 61| | | | | | 63| 65| 66| 67| | 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| | 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| | 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B | | 42| 4A| 7B| | 44| 45| 46| |
|-------| |-----------------------------------------------------------| `-----------' |-----------| | |-------| |-----------------------------------------------------------| `-----------' |-----------| 7D|
| | | | 71 | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29 | | 47| 48| 49| 4A| | 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| | | 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| |
|-------| |-----------------------------------------------------------| .-----------. |-----------| 4E| |-------| |-----------------------------------------------------------| .-----------. |-----------| 5A|
| | | | | | | 35 | | | | | | |73 | | 4F| 50| 51| | | 5F| 61| | 77 | 13| 78 |*73 | 79 |*74 |*75| 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| |
`-------' `-----------------------------------------------------------' `-----------' `---------------' `-------' `-----------------------------------------------------------' `-----------' `---------------'
*/ */
#define KEYMAP( \ #define KEYMAP( \
K61,K62, K63,K64,K65,K66,K67, K68,K69,K6A,K6B,K6C, K5A,K5B,K5C, K5D,K52,K53,K54, \ K76, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \
K01,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K0E,K0F, K36,K5E,K37, K3F,K40,K41,K42, \ K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \
K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B,K1C, K1D, K38,K39,K3A, K43,K44,K45,K46, \ K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \
K71,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29, K3C, K47,K48,K49,K4A, \ K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \
K70,K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34, K3B,K3E,K3D, K4B,K4C,K4D,K4E, \ K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \
K5F,K55,K56, K35, K57,K58,K59,K60, K72, K73, K4F,K50,K51 \ 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_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_##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_##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_##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_##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_##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_##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_##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_##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_##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_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_NO }, \
{ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_NO, KC_NO, KC_NO, KC_NO, }, \ { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ { 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. // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
static const uint8_t PROGMEM fn_layer[] = { static const uint8_t PROGMEM fn_layer[] = {
0, // Fn0 2, // Fn0
0, // Fn1 3, // Fn1
0, // Fn2 4, // Fn2
0, // Fn3 0, // Fn3
0, // Fn4 0, // Fn4
0, // Fn5 0, // Fn5
@ -86,8 +102,8 @@ static const uint8_t PROGMEM fn_layer[] = {
// See layer.c for details. // See layer.c for details.
static const uint8_t PROGMEM fn_keycode[] = { static const uint8_t PROGMEM fn_keycode[] = {
KC_NO, // Fn0 KC_NO, // Fn0
KC_NO, // Fn1 KC_SCLN, // Fn1
KC_NO, // Fn2 KC_SLSH, // Fn2
KC_NO, // Fn3 KC_NO, // Fn3
KC_NO, // Fn4 KC_NO, // Fn4
KC_NO, // Fn5 KC_NO, // Fn5
@ -97,29 +113,65 @@ static const uint8_t PROGMEM fn_keycode[] = {
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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( KEYMAP(
NO, NO, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, PSCR,SLCK,PAUS, CAPS,NO, NO, NO, HELP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,F11,F12, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,PWR,
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP, AGAIN, ESC,1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, 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, MENU, UNDO, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, 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, SELECT, COPY, LCTL, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6,
LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,GRV, LEFT,DOWN,RGHT, P1, P2, P3, PENT, EXECUTE,PASTE, LSFT, Z, X, C, V, B, N, M, COMM,DOT,SLSH, RSFT, UP, P1, P2, P3, PENT,
LGUI,LALT,NO, SPC, RALT,RGUI,RCTL,APP, NO, NO, P0, PCMM,PDOT 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)]); 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]);
} }

View File

@ -16,7 +16,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "stdint.h" #include "stdint.h"
#include "serial.h"
#include "led.h" #include "led.h"

View File

@ -21,9 +21,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <util/delay.h> #include <util/delay.h>
#include "print.h" #include "print.h"
#include "util.h" #include "util.h"
#include "serial.h"
#include "matrix.h" #include "matrix.h"
#include "debug.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| * E|70 ... 77|
* F|78 ... 7F| * 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]; static uint8_t matrix[MATRIX_ROWS];
#define ROW(code) ((code>>3)&0xF) #define ROW(code) ((code>>3)&0xF)
@ -113,14 +80,26 @@ uint8_t matrix_scan(void)
uint8_t code; uint8_t code;
code = serial_recv(); code = serial_recv();
if (code == 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; return 0;
} }
phex(code); print("(");
code = ~code;
phex(code); print(")");
return 0;
if (code&0x80) { if (code&0x80) {
// break code // break code
if (matrix_is_on(ROW(code), COL(code))) { if (matrix_is_on(ROW(code), COL(code))) {

View File

@ -38,12 +38,19 @@ POSSIBILITY OF SUCH DAMAGE.
#include <stdbool.h> #include <stdbool.h>
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <util/delay.h>
#include "serial.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) void serial_init(void)
{ {
SERIAL_RX_INIT(); SERIAL_RXD_INIT();
} }
// RX ring buffer // RX ring buffer
@ -64,12 +71,44 @@ uint8_t serial_recv(void)
return data; return data;
} }
// USART RX complete interrupt //ISR(INT2_vect)
ISR(SERIAL_RX_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; uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
if (next != rbuf_tail) { if (next != rbuf_tail) {
rbuf[rbuf_head] = SERIAL_RX_DATA; rbuf[rbuf_head] = data;
rbuf_head = next; rbuf_head = next;
} }
SERIAL_RXD_INT_EXIT();
} }

View File

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