aboutsummaryrefslogtreecommitdiff
path: root/converter/m0110_usb
diff options
context:
space:
mode:
Diffstat (limited to 'converter/m0110_usb')
-rw-r--r--converter/m0110_usb/Makefile57
-rw-r--r--converter/m0110_usb/README.md124
-rw-r--r--converter/m0110_usb/config.h61
-rw-r--r--converter/m0110_usb/doc/m0110.jpgbin0 -> 49360 bytes
-rw-r--r--converter/m0110_usb/doc/teensy.jpgbin0 -> 50081 bytes
-rw-r--r--converter/m0110_usb/keymap.c214
-rw-r--r--converter/m0110_usb/led.c24
-rw-r--r--converter/m0110_usb/matrix.c169
8 files changed, 649 insertions, 0 deletions
diff --git a/converter/m0110_usb/Makefile b/converter/m0110_usb/Makefile
new file mode 100644
index 000000000..4a687b933
--- /dev/null
+++ b/converter/m0110_usb/Makefile
@@ -0,0 +1,57 @@
1# Target file name (without extension).
2TARGET = m0110
3
4# Directory common source filess exist
5TOP_DIR = ../..
6
7# Directory keyboard dependent files exist
8TARGET_DIR = .
9
10# keyboard dependent files
11SRC = main.c \
12 keymap.c \
13 matrix.c \
14 led.c \
15 m0110.c
16
17CONFIG_H = config.h
18
19
20# MCU name, you MUST set this to match the board you are using
21# type "make clean" after changing this, so all files will be rebuilt
22#MCU = at90usb162 # Teensy 1.0
23MCU = atmega32u4 # Teensy 2.0
24#MCU = at90usb646 # Teensy++ 1.0
25#MCU = at90usb1286 # Teensy++ 2.0
26
27
28# Processor frequency.
29# Normally the first thing your program should do is set the clock prescaler,
30# so your program will run at the correct speed. You should also set this
31# variable to same clock speed. The _delay_ms() macro uses this, and many
32# examples use this variable to calculate timings. Do not add a "UL" here.
33F_CPU = 16000000
34
35
36# Build Options
37# *Comment out* to disable the options.
38#
39MOUSEKEY_ENABLE = yes # Mouse keys
40#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
41EXTRAKEY_ENABLE = yes # Audio control and System control
42#NKRO_ENABLE = yes # USB Nkey Rollover
43
44
45
46#---------------- Programming Options --------------------------
47PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
48
49
50
51include $(TOP_DIR)/protocol/pjrc.mk
52include $(TOP_DIR)/protocol.mk
53include $(TOP_DIR)/common.mk
54include $(TOP_DIR)/rules.mk
55
56hasu: EXTRAFLAGS += -DHASU
57hasu: all
diff --git a/converter/m0110_usb/README.md b/converter/m0110_usb/README.md
new file mode 100644
index 000000000..0ad3631f7
--- /dev/null
+++ b/converter/m0110_usb/README.md
@@ -0,0 +1,124 @@
1M0110/M0110A to USB keyboard converter
2======================================
3This firmware converts the protocol of Apple Macintosh keyboard M0110/M0110A into USB.
4Target board of this project is [PJRC Teensy](http://www.pjrc.com/teensy/), though,
5you can use other board with USB AVR like `ATmega32U4` and `AT90USB`.
6
7![M0110](https://github.com/tmk/tmk_keyboard/raw/master/m0110_usb/doc/m0110.jpg)
8
9M0110A support was contributed by [skagon@github](https://github.com/skagon).
10
11
12
13Connection
14----------
15You need 4P4C plug and cable to connect Teensy or other AVR dev board into the keyboard.
16Teensy port `PF0` is assigned for `CLOCK` line and `PF1` for `DATA` by default,
17you can change pin configuration with editing *config.h*.
18
19You can find 4P4C plugs on telephone handset cable. Note that it is *crossover* connection
20while Macintosh keyboard cable is *straight*.
21
22[![Conection](http://i.imgur.com/vJoVOm.jpg)](http://i.imgur.com/vJoVO.jpg)
23
24In this pic:
25
261. `GND`(Black)
272. `CLOCK`(Red)
283. `DATA`(Green)
294. `+5V`(Yellow)
30
31Not that wire colors may vary in your cable.
32
33
34### Pinout
35- <http://pinouts.ru/Inputs/MacKeyboard_pinout.shtml>
36- <http://en.wikipedia.org/wiki/Modular_connector#4P4C>
37
38![Jack fig](http://www.kbdbabel.org/conn/kbd_connector_macplus.png)
39
40
41### Pull-up Registor
42You may need pull-up registors on signal lines(`CLOCK`, `DATA`) in particular
43when you have long or coiled cable. 1k-10k Ohm will be OK for this purpose.
44In some cases MCU can't read signal from keyboard correctly without pull-up resistors.
45
46
47
48Building Frimware
49-----------------
50To compile firmware you need AVR GCC. You can use [WinAVR](http://winavr.sourceforge.net/) on Windows.
51You can edit *Makefile* and *config.h* to change compile options and pin configuration.
52
53 $ git clone git://github.com/tmk/tmk_keyboard.git (or download source)
54 $ cd m0110_usb
55 $ make
56
57and program your Teensy with [PJRC Teensy loader](http://www.pjrc.com/teensy/loader.html).
58
59
60
61Keymap
62------
63You can change keymaps by editing *keymap.c*.
64
65### M0110
66#### *Default*
67 ,---------------------------------------------------------.
68 | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs|
69 |---------------------------------------------------------|
70 |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
71 |---------------------------------------------------------|
72 |Fn0 | A| S| D| F| G| H| J| K| L| ;| '|Return|
73 |---------------------------------------------------------|
74 |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift |
75 `---------------------------------------------------------'
76 |Ctr|Alt | Space |Gui |Ctr|
77 `-----------------------------------------------'
78#### *HHKB/WASD Layer*
79 ,---------------------------------------------------------.
80 |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet|
81 |---------------------------------------------------------|
82 |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up | |Ins|
83 |---------------------------------------------------------|
84 |Fn0 |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return|
85 |---------------------------------------------------------|
86 |Shift |End| |PgD| |VoD|VoU|Mut|End|PgD|Dow|Shift |
87 `---------------------------------------------------------'
88 |Ctr|Alt | Space |Gui |Ctr|
89 `-----------------------------------------------'
90
91### M0110A
92#### *Default*
93 ,---------------------------------------------------------. ,---------------.
94 | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Gui| =| /| *|
95 |---------------------------------------------------------| |---------------|
96 |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
97 |-----------------------------------------------------' | |---------------|
98 |Fn0 | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
99 |---------------------------------------------------------| |---------------|
100 |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
101 |---------------------------------------------------------| |-----------|Ent|
102 |Ctrl |Alt | Space | \|Lft|Rgt|Dn | | 0| .| |
103 `---------------------------------------------------------' `---------------'
104#### *HHKB/WASD/mousekey Layer*
105 ,---------------------------------------------------------. ,---------------.
106 |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|Mb1|Mb3|Mb2|
107 |---------------------------------------------------------| |---------------|
108 |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up | | | |MwD|McU|MwU|MwU|
109 |-----------------------------------------------------' | |---------------|
110 |Fn0 |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return| |McL|McD|McR|MwD|
111 |---------------------------------------------------------| |---------------|
112 |Shift |End| |PgD| |VoD|VoU|Mut|End|PgD|Dow|Shif|Up | |MwL|McD|MwR| |
113 |---------------------------------------------------------| |-----------|Mb2|
114 |Ctrl |Alt | Space |Ins|Lft|Rgt|Dn | | Mb1|Mb3| |
115 `---------------------------------------------------------' `---------------'
116
117
118
119Debug
120-----
121You can use [PJRC HID listen](http://www.pjrc.com/teensy/hid_listen.html) to see debug output.
122
123The converter has some functions for debug, press `Alt+Gui+H` simultaneously to get help.
124These function is totally undocumented, tentative, inconsistent and buggy.
diff --git a/converter/m0110_usb/config.h b/converter/m0110_usb/config.h
new file mode 100644
index 000000000..4563d6da5
--- /dev/null
+++ b/converter/m0110_usb/config.h
@@ -0,0 +1,61 @@
1/*
2Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#ifndef CONFIG_H
19#define CONFIG_H
20
21/* controller configuration */
22#include "controller_teensy.h"
23
24
25#define VENDOR_ID 0xFEED
26#define PRODUCT_ID 0x0110
27#define MANUFACTURER t.m.k.
28#define PRODUCT M0110 keyboard converter
29#define DESCRIPTION convert M0110 keyboard to USB
30
31
32/* matrix size */
33#define MATRIX_ROWS 14
34#define MATRIX_COLS 8
35
36/* Locking Caps Lock support */
37//#define MATRIX_HAS_LOCKING_CAPS
38
39/* key combination for command */
40#define IS_COMMAND() ( \
41 keyboard_report->mods == (MOD_BIT(KB_LALT) | MOD_BIT(KB_LGUI)) \
42)
43
44
45/* mouse keys */
46#ifdef MOUSEKEY_ENABLE
47# define MOUSEKEY_DELAY_TIME 192
48#endif
49
50
51/* ports */
52#define M0110_CLOCK_PORT PORTF
53#define M0110_CLOCK_PIN PINF
54#define M0110_CLOCK_DDR DDRF
55#define M0110_CLOCK_BIT 0
56#define M0110_DATA_PORT PORTF
57#define M0110_DATA_PIN PINF
58#define M0110_DATA_DDR DDRF
59#define M0110_DATA_BIT 1
60
61#endif
diff --git a/converter/m0110_usb/doc/m0110.jpg b/converter/m0110_usb/doc/m0110.jpg
new file mode 100644
index 000000000..ef9a123ab
--- /dev/null
+++ b/converter/m0110_usb/doc/m0110.jpg
Binary files differ
diff --git a/converter/m0110_usb/doc/teensy.jpg b/converter/m0110_usb/doc/teensy.jpg
new file mode 100644
index 000000000..96e93e7e2
--- /dev/null
+++ b/converter/m0110_usb/doc/teensy.jpg
Binary files differ
diff --git a/converter/m0110_usb/keymap.c b/converter/m0110_usb/keymap.c
new file mode 100644
index 000000000..b5cdd300b
--- /dev/null
+++ b/converter/m0110_usb/keymap.c
@@ -0,0 +1,214 @@
1/*
2Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17/* M0110A Support was contributed by skagon@github */
18
19#include <stdint.h>
20#include <stdbool.h>
21#include <avr/pgmspace.h>
22#include "usb_keyboard.h"
23#include "usb_keycodes.h"
24#include "print.h"
25#include "debug.h"
26#include "util.h"
27#include "keymap.h"
28
29
30#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
31
32#define KEYMAP( \
33 K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \
34 K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K4E, \
35 K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K66, \
36 K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K4D, K53,K54,K55,K4C, \
37 K3A,K37, K31, K34,K2A,K46,K42,K48, K52, K41 \
38) { \
39 { KB_##K00, KB_##K01, KB_##K02, KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \
40 { KB_##K08, KB_##K09, KB_NO, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_##K0F }, \
41 { KB_##K10, KB_##K11, KB_##K12, KB_##K13, KB_##K14, KB_##K15, KB_##K16, KB_##K17 }, \
42 { KB_##K18, KB_##K19, KB_##K1A, KB_##K1B, KB_##K1C, KB_##K1D, KB_##K1E, KB_##K1F }, \
43 { KB_##K20, KB_##K21, KB_##K22, KB_##K23, KB_##K24, KB_##K25, KB_##K26, KB_##K27 }, \
44 { KB_##K28, KB_##K29, KB_##K2A, KB_##K2B, KB_##K2C, KB_##K2D, KB_##K2E, KB_##K2F }, \
45 { KB_##K30, KB_##K31, KB_##K32, KB_##K33, KB_##K34, KB_NO, KB_NO, KB_##K37 }, \
46 { KB_##K38, KB_##K39, KB_##K3A, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \
47 { KB_NO, KB_##K41, KB_##K42, KB_NO, KB_NO, KB_NO, KB_##K46, KB_##K47 }, \
48 { KB_##K48, KB_NO, KB_NO, KB_NO, KB_##K4C, KB_##K4D, KB_##K4E, KB_NO }, \
49 { KB_NO, KB_NO, KB_##K52, KB_##K53, KB_##K54, KB_##K55, KB_##K56, KB_##K57 }, \
50 { KB_##K58, KB_##K59, KB_NO, KB_##K5B, KB_##K5C, KB_NO, KB_NO, KB_NO }, \
51 { KB_NO, KB_NO, KB_##K62, KB_NO, KB_NO, KB_NO, KB_##K66, KB_NO }, \
52 { KB_##K68, KB_NO, KB_NO, KB_NO, KB_NO, KB_##K6D, KB_NO, KB_NO }, \
53}
54
55
56// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
57static const uint8_t PROGMEM fn_layer[] = {
58#ifndef HASU
59 1, // Fn0
60 0, // Fn1
61 0, // Fn2
62 0, // Fn3
63 0, // Fn4
64 0, // Fn5
65 0, // Fn6
66 0 // Fn7
67#else
68 1, // Fn0
69 2, // Fn1
70 3, // Fn2
71 1, // Fn3
72 2, // Fn4
73 0, // Fn5
74 0, // Fn6
75 0 // Fn7
76#endif
77};
78
79// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
80// See layer.c for details.
81static const uint8_t PROGMEM fn_keycode[] = {
82#ifndef HASU
83 KB_NO, // Fn0
84 KB_NO, // Fn1
85 KB_NO, // Fn2
86 KB_NO, // Fn3
87 KB_NO, // Fn4
88 KB_NO, // Fn5
89 KB_NO, // Fn6
90 KB_NO // Fn7
91#else
92 KB_ENTER, // Fn0
93 KB_SCOLON, // Fn1
94 KB_SLASH, // Fn2
95 KB_UP, // Fn3
96 KB_NO, // Fn4
97 KB_NO, // Fn5
98 KB_NO, // Fn6
99 KB_NO // Fn7
100#endif
101};
102
103static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
104 /*
105 * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset
106 * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist
107 * on the M0110A, but since it generates a unique scan code which is not used for some other key in
108 * the M0110A, they are totally interchangeable. In fact, the M0110A is functionally (almost)
109 * identical to the combination of the M0110 along with the M0120 keypad. The only difference
110 * (which is causing some problems as you will read below) is that the M0110+M0120 don't have
111 * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which
112 * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has
113 * substituted the [comma] key with the [=] key, however its scancode is the same.
114 *
115 * Default:
116 * ,---------------------------------------------------------. ,---------------.
117 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Gui| =| /| *|
118 * |---------------------------------------------------------| |---------------|
119 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
120 * |-----------------------------------------------------' | |---------------|
121 * |Fn0 | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
122 * |---------------------------------------------------------| |---------------|
123 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
124 * |---------------------------------------------------------| |-----------|Ent|
125 * |Ctrl |Alt | Space |Gui| \|Lft|Rgt|Dn | | 0| .| |
126 * `---------------------------------------------------------' `---------------'
127 *
128 * HHKB/WASD/Mouse Layer(Fn0):
129 * ,---------------------------------------------------------. ,---------------.
130 * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|Mb1|Mb3|Mb2|
131 * |---------------------------------------------------------| |---------------|
132 * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |Ins| | |MwD|McU|MwU|MwU|
133 * |-----------------------------------------------------' | |---------------|
134 * |Fn0 |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return| |McL|McD|McR|MwD|
135 * |---------------------------------------------------------| |---------------|
136 * |Shift |End| |PgD| |VoD|VoU|Mut|End|PgD|Dow|Shif|Up | |MwL|McD|MwR| |
137 * |---------------------------------------------------------| |-----------|Mb2|
138 * |Ctrl |Alt | Space |Gui | \|Lft|Rgt|Dn | | Mb1|Mb3| |
139 * `---------------------------------------------------------' `---------------'
140 * Mb: Mouse Button / Mc: Mouse Cursor / Mw: Mouse Wheel
141 *
142 * NOTE: M0110 has no arrow and keypad keys.
143 * NOTE: \ is located next to ] on M0110.
144 * NOTE: Gui between Space and \ is Enter on M0110 not exists on M0110A.
145 * NOTE: LShift and RShift are logically same key. (M0110, M0110A)
146 * NOTE: LOption and ROption are logically same key. (M0110)
147 */
148#ifndef HASU
149 KEYMAP(
150 GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, LGUI,EQL, PSLS,PAST,
151 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
152 FN0, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS,
153 LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT,
154 LCTL,LALT, SPC, LGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT
155 ),
156 // HHKB & WASD
157 KEYMAP(
158 ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,BTN1,BTN3,BTN2,
159 CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, WH_D,MS_U,WH_U,WH_U,
160 FN0, LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, ENT, MS_L,MS_D,MS_R,WH_D,
161 LSFT,END, NO, PGDN,NO, VOLD,VOLU,MUTE,END, PGDN,DOWN, UP, WH_L,MS_D,WH_R,BTN2,
162 LCTL,LALT, SPC, LGUI,INS, LEFT,RGHT,DOWN, BTN1, BTN3
163 ),
164#else
165 // hasu's keymap(To enable this use 'make hasu' to add option flag: EXTRAFLAGS=-DHASU)
166 KEYMAP(
167 ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, LGUI,EQL, PSLS,PAST,
168 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
169 LCTL,A, S, D, F, G, H, J, K, L, FN1, QUOT, FN0, P4, P5, P6, PPLS,
170 LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, FN3, P1, P2, P3, PENT,
171 FN4, LALT, SPC, LGUI,BSLS,LEFT,RGHT,DOWN, LGUI, PDOT
172 ),
173 // HHKB & WASD
174 KEYMAP(
175 GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
176 CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, P7, P8, P9, PMNS,
177 LCTL,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN0, P4, P5, P6, PPLS,
178 LSFT,END, NO, PGDN,NO, VOLD,VOLU,MUTE,END, PGDN,DOWN, FN3, P1, P2, P3, PENT,
179 LCTL,LALT, SPC, LGUI,INS, LEFT,RGHT,DOWN, P0, PDOT
180 ),
181 // vi mousekeys
182 KEYMAP(
183 GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
184 CAPS,NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, P7, P8, P9, PMNS,
185 NO, VOLD,VOLU,MUTE,NO, NO, MS_L,MS_D,MS_U,MS_R,FN1, NO, ENT, P4, P5, P6, PPLS,
186 LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,NO, NO, NO, UP, P1, P2, P3, PENT,
187 FN4, LALT, BTN1, LGUI,NO, LEFT,RGHT,DOWN, P0, PDOT
188 ),
189 // vi cusorkeys
190 KEYMAP(
191 GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
192 CAPS,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, PSCR,SLCK,PAUS, P7, P8, P9, PMNS,
193 NO, NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS,
194 LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, UP, P1, P2, P3, PENT,
195 LCTL,LALT, SPC, LGUI,INS, LEFT,RGHT,DOWN, P0, PDOT
196 ),
197#endif
198};
199
200
201uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
202{
203 return KEYCODE(layer, row, col);
204}
205
206uint8_t keymap_fn_layer(uint8_t fn_bits)
207{
208 return pgm_read_byte(&fn_layer[biton(fn_bits)]);
209}
210
211uint8_t keymap_fn_keycode(uint8_t fn_bits)
212{
213 return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
214}
diff --git a/converter/m0110_usb/led.c b/converter/m0110_usb/led.c
new file mode 100644
index 000000000..f76545f0b
--- /dev/null
+++ b/converter/m0110_usb/led.c
@@ -0,0 +1,24 @@
1/*
2Copyright 2011 Jun Wako <wakojun@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#include "stdint.h"
19#include "led.h"
20
21
22void led_set(uint8_t usb_led)
23{
24}
diff --git a/converter/m0110_usb/matrix.c b/converter/m0110_usb/matrix.c
new file mode 100644
index 000000000..1ca6894c4
--- /dev/null
+++ b/converter/m0110_usb/matrix.c
@@ -0,0 +1,169 @@
1/*
2Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18/*
19 * scan matrix
20 */
21#include <stdint.h>
22#include <stdbool.h>
23#include <avr/io.h>
24#include <util/delay.h>
25#include "print.h"
26#include "util.h"
27#include "debug.h"
28#include "host.h"
29#include "led.h"
30#include "m0110.h"
31#include "matrix.h"
32
33
34#define CAPS 0x39
35#define CAPS_BREAK (CAPS | 0x80)
36#define ROW(key) ((key)>>3&0x0F)
37#define COL(key) ((key)&0x07)
38
39
40static bool is_modified = false;
41
42// matrix state buffer(1:on, 0:off)
43static uint8_t *matrix;
44static uint8_t _matrix0[MATRIX_ROWS];
45
46static void register_key(uint8_t key);
47
48
49inline
50uint8_t matrix_rows(void)
51{
52 return MATRIX_ROWS;
53}
54
55inline
56uint8_t matrix_cols(void)
57{
58 return MATRIX_COLS;
59}
60
61void matrix_init(void)
62{
63 print_enable = true;
64 debug_enable = true;
65 debug_matrix = false;
66 debug_keyboard = false;
67 debug_mouse = false;
68 print("debug enabled.\n");
69
70 m0110_init();
71 // initialize matrix state: all keys off
72 for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
73 matrix = _matrix0;
74 return;
75}
76
77uint8_t matrix_scan(void)
78{
79 uint8_t key;
80
81 is_modified = false;
82 key = m0110_recv_key();
83
84#ifdef MATRIX_HAS_LOCKING_CAPS
85 // Send Caps key up event
86 if (matrix_is_on(ROW(CAPS), COL(CAPS))) {
87 is_modified = true;
88 register_key(CAPS_BREAK);
89 }
90#endif
91 if (key == M0110_NULL) {
92 return 0;
93 } else if (key == M0110_ERROR) {
94 return 0;
95 } else {
96#ifdef MATRIX_HAS_LOCKING_CAPS
97 if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
98 // CAPS LOCK on:
99 // Ignore LockingCaps key down event
100 if (key == CAPS) return 0;
101 // Convert LockingCaps key up event into down event
102 if (key == CAPS_BREAK) key = CAPS;
103 } else {
104 // CAPS LOCK off:
105 // Ignore LockingCaps key up event
106 if (key == CAPS_BREAK) return 0;
107 }
108#endif
109 is_modified = true;
110 register_key(key);
111 }
112
113 if (debug_enable) {
114 print("["); phex(key); print("]\n");
115 }
116 return 1;
117}
118
119bool matrix_is_modified(void)
120{
121 return is_modified;
122}
123
124inline
125bool matrix_has_ghost(void)
126{
127 return false;
128}
129
130inline
131bool matrix_is_on(uint8_t row, uint8_t col)
132{
133 return (matrix[row] & (1<<col));
134}
135
136inline
137uint8_t matrix_get_row(uint8_t row)
138{
139 return matrix[row];
140}
141
142void matrix_print(void)
143{
144 print("\nr/c 01234567\n");
145 for (uint8_t row = 0; row < matrix_rows(); row++) {
146 phex(row); print(": ");
147 pbin_reverse(matrix_get_row(row));
148 print("\n");
149 }
150}
151
152uint8_t matrix_key_count(void)
153{
154 uint8_t count = 0;
155 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
156 count += bitpop(matrix[i]);
157 }
158 return count;
159}
160
161inline
162static void register_key(uint8_t key)
163{
164 if (key&0x80) {
165 matrix[ROW(key)] &= ~(1<<COL(key));
166 } else {
167 matrix[ROW(key)] |= (1<<COL(key));
168 }
169}