Added SHARP X68000 keyboard support.
parent
446f87f9e8
commit
38d61ee1b1
|
@ -0,0 +1,85 @@
|
||||||
|
#
|
||||||
|
# Makefile for PJRC Teensy
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = x68k_usb_pjrc
|
||||||
|
|
||||||
|
# Directory common source filess exist
|
||||||
|
COMMON_DIR = ..
|
||||||
|
|
||||||
|
# Directory keyboard dependent files exist
|
||||||
|
TARGET_DIR = .
|
||||||
|
|
||||||
|
# keyboard dependent files
|
||||||
|
SRC = main.c \
|
||||||
|
keymap.c \
|
||||||
|
matrix.c \
|
||||||
|
led.c \
|
||||||
|
x68k.c
|
||||||
|
|
||||||
|
CONFIG_H = config_pjrc.h
|
||||||
|
|
||||||
|
|
||||||
|
# MCU name, you MUST set this to match the board you are using
|
||||||
|
# type "make clean" after changing this, so all files will be rebuilt
|
||||||
|
#MCU = at90usb162 # Teensy 1.0
|
||||||
|
MCU = atmega32u4 # Teensy 2.0
|
||||||
|
#MCU = at90usb646 # Teensy++ 1.0
|
||||||
|
#MCU = at90usb1286 # Teensy++ 2.0
|
||||||
|
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# Normally the first thing your program should do is set the clock prescaler,
|
||||||
|
# so your program will run at the correct speed. You should also set this
|
||||||
|
# variable to same clock speed. The _delay_ms() macro uses this, and many
|
||||||
|
# examples use this variable to calculate timings. Do not add a "UL" here.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# *Comment out* to disable the options.
|
||||||
|
#
|
||||||
|
MOUSEKEY_ENABLE = 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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
include $(COMMON_DIR)/pjrc.mk
|
||||||
|
include $(COMMON_DIR)/common.mk
|
|
@ -0,0 +1,129 @@
|
||||||
|
X68000 to USB keyboard protocol converter
|
||||||
|
=========================================
|
||||||
|
SHARP X68000 is a hobby computer released in Japan.(1987-93)
|
||||||
|
http://en.wikipedia.org/wiki/Sharp_X68000
|
||||||
|
|
||||||
|
X68000 keyboard has ALPS linear switches.
|
||||||
|
- DSETK0016CE01 green linear
|
||||||
|
- DSETK0023CE03 yellow linear
|
||||||
|
|
||||||
|
|
||||||
|
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/
|
||||||
|
|
||||||
|
Wiring:
|
||||||
|
Mini-DIN Teensy
|
||||||
|
-----------------------------------------------------
|
||||||
|
pin1 +5V VCC
|
||||||
|
pin2 MOUSE -
|
||||||
|
pin3 RXD PD2(RXD)
|
||||||
|
pin4 TXD PD3(TXD) NOTE: Not supported yet.
|
||||||
|
pin5 READY -
|
||||||
|
pin6 REMOTE -
|
||||||
|
pin7 GND GND
|
||||||
|
|
||||||
|
|
||||||
|
Firmware
|
||||||
|
--------
|
||||||
|
Build:
|
||||||
|
$ cd x68k_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| |
|
||||||
|
`---------------------------------------------' `-----------' `---------------'
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
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
|
||||||
|
|
||||||
|
/* controller configuration */
|
||||||
|
#include "controller_teensy.h"
|
||||||
|
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6800
|
||||||
|
#define MANUFACTURER t.m.k.
|
||||||
|
#define PRODUCT SHARP X68000 keyboard converter
|
||||||
|
#define DESCRIPTION converts SHARP X68000 keyboard protocol into USB
|
||||||
|
|
||||||
|
|
||||||
|
/* matrix size */
|
||||||
|
#define MATRIX_ROWS 16
|
||||||
|
#define MATRIX_COLS 8
|
||||||
|
|
||||||
|
|
||||||
|
/* key combination for command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KB_LALT) | MOD_BIT(KB_RALT)) || \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KB_LCTRL) | MOD_BIT(KB_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
/* mouse keys */
|
||||||
|
#ifdef MOUSEKEY_ENABLE
|
||||||
|
# define MOUSEKEY_DELAY_TIME 255
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* USART configuration
|
||||||
|
* asynchronous, 2400baud, 8-data bit, non parity, 1-stop bit, no flow control
|
||||||
|
*/
|
||||||
|
#ifdef __AVR_ATmega32U4__
|
||||||
|
# define KBD_RX_VECT USART1_RX_vect
|
||||||
|
# define KBD_RX_DATA UDR1
|
||||||
|
# define KBD_RX_BAUD 2400
|
||||||
|
# define KBD_RX_UBBR ((F_CPU/(16UL*KBD_RX_BAUD))-1)
|
||||||
|
# define KBD_RX_INIT() do { \
|
||||||
|
UBRR1L = (uint8_t) KBD_RX_UBBR; \
|
||||||
|
UBRR1H = (uint8_t) (KBD_RX_UBBR>>8); \
|
||||||
|
UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); \
|
||||||
|
} while(0)
|
||||||
|
#else
|
||||||
|
# error "USART configuration is needed."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,140 @@
|
||||||
|
/*
|
||||||
|
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 "usb_keycodes.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "keymap.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Following macros help you to define a keymap with the form of actual keyboard layout.
|
||||||
|
|
||||||
|
/* 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| |
|
||||||
|
`---------------------------------------------' `-----------' `---------------'
|
||||||
|
*/
|
||||||
|
#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 \
|
||||||
|
) { \
|
||||||
|
{ KB_NO, KB_##K01, KB_##K02, KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \
|
||||||
|
{ KB_##K08, KB_##K09, KB_##K0A, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_##K0F }, \
|
||||||
|
{ KB_##K10, KB_##K11, KB_##K12, KB_##K13, KB_##K14, KB_##K15, KB_##K16, KB_##K17 }, \
|
||||||
|
{ KB_##K18, KB_##K19, KB_##K1A, KB_##K1B, KB_##K1C, KB_##K1D, KB_##K1E, KB_##K1F }, \
|
||||||
|
{ KB_##K20, KB_##K21, KB_##K22, KB_##K23, KB_##K24, KB_##K25, KB_##K26, KB_##K27 }, \
|
||||||
|
{ KB_##K28, KB_##K29, KB_##K2A, KB_##K2B, KB_##K2C, KB_##K2D, KB_##K2E, KB_##K2F }, \
|
||||||
|
{ KB_##K30, KB_##K31, KB_##K32, KB_##K33, KB_##K34, KB_##K35, KB_##K36, KB_##K37 }, \
|
||||||
|
{ KB_##K38, KB_##K39, KB_##K3A, KB_##K3B, KB_##K3C, KB_##K3D, KB_##K3E, KB_##K3F }, \
|
||||||
|
{ KB_##K40, KB_##K41, KB_##K42, KB_##K43, KB_##K44, KB_##K45, KB_##K46, KB_##K47 }, \
|
||||||
|
{ KB_##K48, KB_##K49, KB_##K4A, KB_##K4B, KB_##K4C, KB_##K4D, KB_##K4E, KB_##K4F }, \
|
||||||
|
{ KB_##K50, KB_##K51, KB_##K52, KB_##K53, KB_##K54, KB_##K55, KB_##K56, KB_##K57 }, \
|
||||||
|
{ KB_##K58, KB_##K59, KB_##K5A, KB_##K5B, KB_##K5C, KB_##K5D, KB_##K5E, KB_##K5F }, \
|
||||||
|
{ KB_##K60, KB_##K61, KB_##K62, KB_##K63, KB_##K64, KB_##K65, KB_##K66, KB_##K67 }, \
|
||||||
|
{ KB_##K68, KB_##K69, KB_##K6A, KB_##K6B, KB_##K6C, KB_NO, KB_NO, KB_NO }, \
|
||||||
|
{ KB_##K70, KB_##K71, KB_##K72, KB_##K73, KB_NO, KB_NO, KB_NO, KB_NO, }, \
|
||||||
|
{ KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO } \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 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[] = {
|
||||||
|
KB_NO, // Fn0
|
||||||
|
KB_NO, // Fn1
|
||||||
|
KB_NO, // Fn2
|
||||||
|
KB_NO, // Fn3
|
||||||
|
KB_NO, // Fn4
|
||||||
|
KB_NO, // Fn5
|
||||||
|
KB_NO, // Fn6
|
||||||
|
KB_NO // Fn7
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return pgm_read_byte(&fn_layer[biton(fn_bits)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t keymap_fn_keycode(uint8_t fn_bits)
|
||||||
|
{
|
||||||
|
return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
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 "x68k.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
|
||||||
|
void led_set(uint8_t usb_led)
|
||||||
|
{
|
||||||
|
// not supported now
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
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 "x68k.h"
|
||||||
|
#include "matrix.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)
|
||||||
|
|
||||||
|
static bool is_modified = false;
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint8_t matrix_rows(void)
|
||||||
|
{
|
||||||
|
return MATRIX_ROWS;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint8_t matrix_cols(void)
|
||||||
|
{
|
||||||
|
return MATRIX_COLS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init(void)
|
||||||
|
{
|
||||||
|
x68k_init();
|
||||||
|
|
||||||
|
// initialize matrix state: all keys off
|
||||||
|
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_scan(void)
|
||||||
|
{
|
||||||
|
is_modified = false;
|
||||||
|
|
||||||
|
uint8_t code;
|
||||||
|
code = x68k_recv();
|
||||||
|
if (code == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
phex(code); print(" ");
|
||||||
|
if (code&0x80) {
|
||||||
|
// break code
|
||||||
|
if (matrix_is_on(ROW(code), COL(code))) {
|
||||||
|
matrix[ROW(code)] &= ~(1<<COL(code));
|
||||||
|
is_modified = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// make code
|
||||||
|
if (!matrix_is_on(ROW(code), COL(code))) {
|
||||||
|
matrix[ROW(code)] |= (1<<COL(code));
|
||||||
|
is_modified = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool matrix_is_modified(void)
|
||||||
|
{
|
||||||
|
return is_modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool matrix_has_ghost(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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++) {
|
||||||
|
phex(row); print(": ");
|
||||||
|
pbin_reverse(matrix_get_row(row));
|
||||||
|
print("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_key_count(void)
|
||||||
|
{
|
||||||
|
uint8_t count = 0;
|
||||||
|
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
||||||
|
count += bitpop(matrix[i]);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 Jun WAKO <wakojun@gmail.com>
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include "x68k.h"
|
||||||
|
|
||||||
|
|
||||||
|
void x68k_init(void)
|
||||||
|
{
|
||||||
|
KBD_RX_INIT();
|
||||||
|
}
|
||||||
|
|
||||||
|
// RX ring buffer
|
||||||
|
#define RBUF_SIZE 8
|
||||||
|
static uint8_t rbuf[RBUF_SIZE];
|
||||||
|
static uint8_t rbuf_head = 0;
|
||||||
|
static uint8_t rbuf_tail = 0;
|
||||||
|
|
||||||
|
uint8_t x68k_recv(void)
|
||||||
|
{
|
||||||
|
uint8_t data = 0;
|
||||||
|
if (rbuf_head == rbuf_tail) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = rbuf[rbuf_tail];
|
||||||
|
rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// USART RX complete interrupt
|
||||||
|
ISR(KBD_RX_VECT)
|
||||||
|
{
|
||||||
|
uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
|
||||||
|
if (next != rbuf_tail) {
|
||||||
|
rbuf[rbuf_head] = KBD_RX_DATA;
|
||||||
|
rbuf_head = next;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 Jun WAKO <wakojun@gmail.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef X68K_H
|
||||||
|
#define X68K_H
|
||||||
|
|
||||||
|
/* host role */
|
||||||
|
void x68k_init(void);
|
||||||
|
uint8_t x68k_recv(void);
|
||||||
|
|
||||||
|
/* device role */
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue