# | |||||
# Makefile for PJRC Teensy | |||||
# | |||||
# Target file name (without extension). | |||||
TARGET = sun_usb | |||||
# Directory common source filess exist | |||||
TOP_DIR = ../.. | |||||
# Directory keyboard dependent files exist | |||||
TARGET_DIR = . | |||||
# keyboard dependent files | |||||
SRC = keymap.c \ | |||||
matrix.c \ | |||||
led.c \ | |||||
protocol/serial.c | |||||
CONFIG_H = config.h | |||||
# MCU name, you MUST set this to match the board you are using | |||||
# type "make clean" after changing this, so all files will be rebuilt | |||||
#MCU = at90usb162 # Teensy 1.0 | |||||
MCU = atmega32u4 # Teensy 2.0 | |||||
#MCU = at90usb646 # Teensy++ 1.0 | |||||
#MCU = at90usb1286 # Teensy++ 2.0 | |||||
# Processor frequency. | |||||
# Normally the first thing your program should do is set the clock prescaler, | |||||
# so your program will run at the correct speed. You should also set this | |||||
# variable to same clock speed. The _delay_ms() macro uses this, and many | |||||
# examples use this variable to calculate timings. Do not add a "UL" here. | |||||
F_CPU = 16000000 | |||||
# 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 | |||||
# Search Path | |||||
VPATH += $(TARGET_DIR) | |||||
VPATH += $(TOP_DIR) | |||||
include $(TOP_DIR)/protocol/pjrc.mk | |||||
include $(TOP_DIR)/protocol.mk | |||||
include $(TOP_DIR)/common.mk | |||||
include $(TOP_DIR)/rules.mk |
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. | |||||
You can use PJRC Teensy as dev board. | |||||
http://www.pjrc.com/teensy/ | |||||
Connector | |||||
8Pin mini DIN | |||||
___ ___ | |||||
/ |_| \ | |||||
/ 8 7 6 \ | |||||
| 5 4 3 | | |||||
\_ 2 1 _/ | |||||
\_____/ | |||||
(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 | |||||
Firmware | |||||
-------- | |||||
Build: | |||||
$ 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| | | |||||
`---------------------------------------------' `-----------' `---------------' |
/* | |||||
Copyright 2012 Jun Wako <[email protected]> | |||||
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 0x3333 | |||||
#define MANUFACTURER t.m.k. | |||||
#define PRODUCT Sun keyboard converter | |||||
#define DESCRIPTION converts Sun 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(KC_LALT) | MOD_BIT(KC_RALT)) || \ | |||||
keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ | |||||
) | |||||
/* Serial(USART) configuration | |||||
* 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 | |||||
#endif |
/* | |||||
Copyright 2012 Jun Wako <[email protected]> | |||||
This program is free software: you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation, either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
#include <stdint.h> | |||||
#include <stdbool.h> | |||||
#include <avr/pgmspace.h> | |||||
#include "keycode.h" | |||||
#include "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| | | | | | 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| | |||||
|-------| |-----------------------------------------------------------| |------------ |---------------| | |||||
| | | | 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| | |||||
|-------| |-----------------------------------------------------------| ,---. |-----------|---| | |||||
| | | | 70 | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 70 | | 3E| | 4B| 4C| 4D| | | |||||
|-------| |-----------------------------------------------------------| .-----------. |-----------| 4E| | |||||
| | | | | | | 35 | | | | | | |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 \ | |||||
) { \ | |||||
{ 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_##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_##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 } \ | |||||
} | |||||
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. | |||||
static const uint8_t PROGMEM fn_layer[] = { | |||||
0, // Fn0 | |||||
0, // Fn1 | |||||
0, // Fn2 | |||||
0, // Fn3 | |||||
0, // Fn4 | |||||
0, // Fn5 | |||||
0, // Fn6 | |||||
0 // Fn7 | |||||
}; | |||||
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. | |||||
// See layer.c for details. | |||||
static const uint8_t PROGMEM fn_keycode[] = { | |||||
KC_NO, // Fn0 | |||||
KC_NO, // Fn1 | |||||
KC_NO, // Fn2 | |||||
KC_NO, // Fn3 | |||||
KC_NO, // Fn4 | |||||
KC_NO, // Fn5 | |||||
KC_NO, // Fn6 | |||||
KC_NO // Fn7 | |||||
}; | |||||
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||||
/* 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))]); | |||||
} |
/* | |||||
Copyright 2012 Jun Wako <[email protected]> | |||||
This program is free software: you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation, either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
#include "stdint.h" | |||||
#include "serial.h" | |||||
#include "led.h" | |||||
void led_set(uint8_t usb_led) | |||||
{ | |||||
// not supported now | |||||
} |
/* | |||||
Copyright 2012 Jun Wako <[email protected]> | |||||
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 "serial.h" | |||||
#include "matrix.h" | |||||
#include "debug.h" | |||||
/* | |||||
* Matrix Array usage: | |||||
* | |||||
* ROW: 16(4bits) | |||||
* COL: 8(3bits) | |||||
* | |||||
* 8bit wide | |||||
* +---------+ | |||||
* 0|00 ... 07| | |||||
* 1|08 ... 0F| | |||||
* :| ... | | |||||
* :| ... | | |||||
* 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) | |||||
#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) | |||||
{ | |||||
print_enable = true; | |||||
debug_enable = true; | |||||
serial_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 = serial_recv(); | |||||
if (code == 0) { | |||||
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))) { | |||||
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; | |||||
} |
/* | |||||
Copyright 2012 Jun WAKO <[email protected]> | |||||
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 "serial.h" | |||||
void serial_init(void) | |||||
{ | |||||
SERIAL_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 serial_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(SERIAL_RX_VECT) | |||||
{ | |||||
uint8_t next = (rbuf_head + 1) % RBUF_SIZE; | |||||
if (next != rbuf_tail) { | |||||
rbuf[rbuf_head] = SERIAL_RX_DATA; | |||||
rbuf_head = next; | |||||
} | |||||
} |
/* | |||||
Copyright 2012 Jun WAKO <[email protected]> | |||||
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 SERIAL_H | |||||
#define SERIAL_H | |||||
/* host role */ | |||||
void serial_init(void); | |||||
uint8_t serial_recv(void); | |||||
#endif |