]> git.gir.st - tmk_keyboard.git/blob - converter/m0110_usb/keymap.c
Fix keymap and build option.(M0110)
[tmk_keyboard.git] / converter / m0110_usb / keymap.c
1 /*
2 Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along 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 "keycode.h"
24 #include "print.h"
25 #include "debug.h"
26 #include "util.h"
27 #include "keymap.h"
28
29
30 /*
31 * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset
32 * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist
33 * on the M0110A, but since it generates a unique scan code which is not used for some other key in
34 * the M0110A, they are totally interchangeable. In fact, the M0110A is functionally (almost)
35 * identical to the combination of the M0110 along with the M0120 keypad. The only difference
36 * (which is causing some problems as you will read below) is that the M0110+M0120 don't have
37 * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which
38 * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has
39 * substituted the [comma] key with the [=] key, however its scancode is the same.
40 *
41 * Physical layout:
42 * M0110A
43 * ,---------------------------------------------------------. ,---------------.
44 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *|
45 * |---------------------------------------------------------| |---------------|
46 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
47 * |-----------------------------------------------------' | |---------------|
48 * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
49 * |---------------------------------------------------------| |---------------|
50 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
51 * |---------------------------------------------------------' |-----------|Ent|
52 * |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
53 * `---------------------------------------------------------' `---------------'
54 *
55 * M0110 M0120
56 * ,---------------------------------------------------------. ,---------------.
57 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| -| +| *|
58 * |---------------------------------------------------------| |---------------|
59 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /|
60 * |---------------------------------------------------------| |---------------|
61 * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,|
62 * |---------------------------------------------------------| |---------------|
63 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
64 * `---------------------------------------------------------' |-----------|Ent|
65 * |Opt|Mac | Space |Ent |Opt| | 0| .| |
66 * `-----------------------------------------------' `---------------'
67 * With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down)
68 *
69 * NOTE: \ is located differently.
70 * NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A).
71 * NOTE: Left Shift and right Shift are logically same key.
72 * NOTE: Left Option and right Option are logically same key.
73 */
74
75 /* Keymap definition Macro
76 * ,---------------------------------------------------------. ,---------------.
77 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *|
78 * |---------------------------------------------------------| |---------------|
79 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
80 * |-----------------------------------------------------' | |---------------|
81 * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
82 * |---------------------------------------------------------| |---------------|
83 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
84 * |---------------------------------------------------------| |-----------|Ent|
85 * |Opt |Mac | Space |Ent| \|Lft|Rgt|Dn | | 0| .| |
86 * `---------------------------------------------------------' `---------------'
87 * NOTE: Ent between Space and \ means Enter on M0110.
88 */
89 #define KEYMAP( \
90 K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \
91 K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K4E, \
92 K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K66, \
93 K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K4D, K53,K54,K55,K4C, \
94 K3A,K37, K31, K34,K2A,K46,K42,K48, K52, K41 \
95 ) { \
96 { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
97 { KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
98 { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
99 { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
100 { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
101 { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
102 { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \
103 { KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
104 { KC_NO, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_##K47 }, \
105 { KC_##K48, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \
106 { KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
107 { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \
108 { KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \
109 { KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \
110 }
111
112 #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
113
114
115 // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
116 static const uint8_t PROGMEM fn_layer[] = {
117 1, // Fn0
118 0, // Fn1
119 0, // Fn2
120 0, // Fn3
121 0, // Fn4
122 0, // Fn5
123 0, // Fn6
124 0 // Fn7
125 };
126
127 // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
128 // See layer.c for details.
129 static const uint8_t PROGMEM fn_keycode[] = {
130 KC_NO, // Fn0
131 KC_NO, // Fn1
132 KC_NO, // Fn2
133 KC_NO, // Fn3
134 KC_NO, // Fn4
135 KC_NO, // Fn5
136 KC_NO, // Fn6
137 KC_NO // Fn7
138 };
139
140 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
141 /* Default:
142 * ,---------------------------------------------------------. ,---------------.
143 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Ctl| =| /| *|
144 * |---------------------------------------------------------| |---------------|
145 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
146 * |-----------------------------------------------------' | |---------------|
147 * |Fn0 | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
148 * |---------------------------------------------------------| |---------------|
149 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
150 * |---------------------------------------------------------| |-----------|Ent|
151 * |Alt |Gui | Space |Ctl| \|Lft|Rgt|Dn | | 0| .| |
152 * `---------------------------------------------------------' `---------------'
153 */
154 KEYMAP(
155 GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, LCTL,EQL, PSLS,PAST,
156 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
157 FN0, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS,
158 LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT,
159 LALT,LGUI, SPC, LCTL,BSLS,LEFT,RGHT,DOWN, P0, PDOT
160 ),
161 /* Cursor Layer(WASD, IJKL)
162 * ,---------------------------------------------------------. ,---------------.
163 * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| =| /| *|
164 * |---------------------------------------------------------| |---------------|
165 * |Caps |Hom| Up|PgU| | | |PgU| Up|Hom|Psc|Slk|Pau| | | 7| 8| 9| -|
166 * |-----------------------------------------------------' | |---------------|
167 * |Fn0 |Lef|Dow|Rig| | | |Lef|Dow|Rig| | |Return| | 4| 5| 6| +|
168 * |---------------------------------------------------------| |---------------|
169 * |Shift |End| |PgD| | | |PgD| |End| |Shif|PgU| | 1| 2| 3| |
170 * |---------------------------------------------------------| |-----------|Ent|
171 * |Alt |Gui | Space |Gui |Ins|Hom|End|PgD| | 0| .| |
172 * `---------------------------------------------------------' `---------------'
173 */
174 KEYMAP(
175 ESC, 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, PGUP,UP, HOME,PSCR,SLCK,PAUS, P7, P8, P9, PMNS,
177 FN0, LEFT,DOWN,RGHT,NO, NO, NO, LEFT,DOWN,RGHT,NO, NO, ENT, P4, P5, P6, PPLS,
178 LSFT,END, NO, PGDN,NO, NO, NO, PGDN,NO, END, NO, PGUP, P1, P2, P3, PENT,
179 LALT,LGUI, SPC, LCTL,INS, HOME,END, PGDN, P0, PDOT
180 ),
181 };
182
183
184 uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
185 {
186 return KEYCODE(layer, row, col);
187 }
188
189 uint8_t keymap_fn_layer(uint8_t index)
190 {
191 return pgm_read_byte(&fn_layer[index]);
192 }
193
194 uint8_t keymap_fn_keycode(uint8_t index)
195 {
196 return pgm_read_byte(&fn_keycode[index]);
197 }
Imprint / Impressum