mirror of
https://github.com/openstenoproject/qmk
synced 2024-11-23 00:44:38 +00:00
Merge branch 'master' of https://github.com/jackhumbert/qmk_firmware
This commit is contained in:
commit
a4bdb0ac0e
9 changed files with 1507 additions and 0 deletions
18
README.md
18
README.md
|
@ -4,6 +4,24 @@
|
|||
|
||||
This is a keyboard firmware based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.co), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/).
|
||||
|
||||
## Official website
|
||||
|
||||
For an easy-to-read version of this document and the repository, check out [http://qmk.fm](http://qmk.fm).
|
||||
|
||||
## Included Keyboards
|
||||
|
||||
* [Planck](/keyboards/planck/)
|
||||
* [Preonic](/keyboards/preonic/)
|
||||
* [Atomic](/keyboards/atomic/)
|
||||
* [ErgoDox EZ](/keyboards/ergodox_ez/)
|
||||
* [Clueboard rev.1](/keyboards/clueboard1/)
|
||||
* [Clueboard rev.2](/keyboards/clueboard2/)
|
||||
* [Cluepad](/keyboards/cluepad/)
|
||||
|
||||
The project also includes community support for [lots of other keyboards](/keyboards/).
|
||||
|
||||
## Maintainers
|
||||
|
||||
QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, TMK. In fact, this repo used to be a fork of TMK, and we are incredibly grateful for his founding contributions to the firmware. We've had to break the fork due to purely technical reasons -- it simply became too different over time, and we've had to start refactoring some of the basic bits and pieces. We are huge fans of TMK, both the firmware and the person. :)
|
||||
|
||||
This documentation is edited and maintained by Erez Zukerman of ErgoDox EZ. If you spot any typos or inaccuracies, please [open an issue](https://github.com/jackhumbert/qmk_firmware/issues/new).
|
||||
|
|
63
keyboards/planck/keymaps/ab/Makefile
Normal file
63
keyboards/planck/keymaps/ab/Makefile
Normal file
|
@ -0,0 +1,63 @@
|
|||
#----------------------------------------------------------------------------
|
||||
# On command line:
|
||||
#
|
||||
# make all = Make software.
|
||||
#
|
||||
# make clean = Clean out built project files.
|
||||
#
|
||||
# make coff = Convert ELF to AVR COFF.
|
||||
#
|
||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||
#
|
||||
# make program = Download the hex file to the device.
|
||||
# Please customize your programmer settings(PROGRAM_CMD)
|
||||
#
|
||||
# make teensy = Download the hex file to the device, using teensy_loader_cli.
|
||||
# (must have teensy_loader_cli installed).
|
||||
#
|
||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||
# have dfu-programmer installed).
|
||||
#
|
||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||
# have Atmel FLIP installed).
|
||||
#
|
||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||
# (must have dfu-programmer installed).
|
||||
#
|
||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||
# (must have Atmel FLIP installed).
|
||||
#
|
||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||
# with avr-gdb or avr-insight as the front end for debugging.
|
||||
#
|
||||
# make filename.s = Just compile filename.c into the assembler code only.
|
||||
#
|
||||
# make filename.i = Create a preprocessed source file for use in submitting
|
||||
# bug reports to the GCC project.
|
||||
#
|
||||
# To rebuild project do "make clean" then "make all".
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
# Build Options
|
||||
# change to "no" to disable the options, or define them in the makefile.mk in
|
||||
# the appropriate keymap folder that will get included automatically
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
MIDI_ENABLE = no # MIDI controls
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
|
||||
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
18
keyboards/planck/keymaps/ab/README.md
Normal file
18
keyboards/planck/keymaps/ab/README.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Practical keymap for Planck Ortholinear 40% Mechanical Keyboard
|
||||
A practical keymap that emulates standard QWERTY keyboard for Planck. Once you get comfortable with this keymap, you may fork and customize it for your own needs.
|
||||
|
||||
![Layout](keyboard-layout.png "Practical Keymap")
|
||||
![Photo](keyboard-photo.jpg "Planck Keyboard")
|
||||
|
||||
* Online keyboard layout editor: http://goo.gl/mlLAFZ
|
||||
|
||||
# Programming Instructions:
|
||||
Enter into programming mode and run the following command.
|
||||
```
|
||||
$ sudo KEYMAP=ab make dfu
|
||||
```
|
||||
# Notes
|
||||
* Simultaneous RAISE+LOWER enters CUSTOM layer. You may add your own macros and custom keys here.
|
||||
* RAISE and LOWER also acts as PgUp and PgDn when tapped.
|
||||
* [CapsLock] also acts as [Ctrl] key when you press and hold. It is convenient for GNU Emacs users.
|
||||
* Bracket keys are placed in the center of the keyboard for programmer's convenience.
|
1139
keyboards/planck/keymaps/ab/compiled.hex
Normal file
1139
keyboards/planck/keymaps/ab/compiled.hex
Normal file
File diff suppressed because it is too large
Load diff
101
keyboards/planck/keymaps/ab/keyboard-layout.json
Normal file
101
keyboards/planck/keymaps/ab/keyboard-layout.json
Normal file
|
@ -0,0 +1,101 @@
|
|||
[
|
||||
{
|
||||
"name": "AB's Practical Keymap for Planck",
|
||||
"author": "Anand Babu Periasamy"
|
||||
},
|
||||
[
|
||||
"1\nF1\n!\n\n\n\n\n\n\nTab",
|
||||
"2\nF2\n@\n\n\n\n\n\n\nQ",
|
||||
"3\nF3\n#\n\n\n\n\n\n\nW",
|
||||
"4\nF4\n$\n\n\n\n\n\n\nE",
|
||||
"5\nF5\n%\n\n\n\n\n\n\nR",
|
||||
"6\nF6\n^\n\n\n\n\n\n\nT",
|
||||
"7\nF7\n&\n\n\n\n\n\n\nY",
|
||||
"8\nF8\n*\n\n\n\n\n\n\nU",
|
||||
"9\nF9\n(\n\n\n\n\n\n\nI",
|
||||
"0\nF10\n)\n\n\n\n\n\n\nO",
|
||||
"-\nF11\n_\n\n\n\n\n\n\nP",
|
||||
"=\nF12\n+\n\n\n\n\n\n\n<i class=\"fa fa-chevron-circle-left\" aria-hidden=\"true\"></i>"
|
||||
],
|
||||
[
|
||||
{
|
||||
"a": 7
|
||||
},
|
||||
"Ctrl",
|
||||
"A",
|
||||
"S",
|
||||
"D",
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"(\n\n\n\n\n\n\n\n\nF",
|
||||
")\n\n\n\n\n\n\n\n\nG",
|
||||
"{\n\n\n\n\n\n\n\n\nH",
|
||||
"}\n\n\n\n\n\n\n\n\nJ",
|
||||
{
|
||||
"a": 7
|
||||
},
|
||||
"K",
|
||||
"L",
|
||||
{
|
||||
"a": 6
|
||||
},
|
||||
";\n\n:",
|
||||
{
|
||||
"a": 7
|
||||
},
|
||||
"Enter"
|
||||
],
|
||||
[
|
||||
"Shift",
|
||||
"Z",
|
||||
"X",
|
||||
"C",
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"[\n`\n\n\n\n\n\n\n\nV",
|
||||
"]\n~\n\n\n\n\n\n\n\nB",
|
||||
"'\n\\\n\n\n\n\n\n\n\nN",
|
||||
"\"\n|\n\n\n\n\n\n\n\nM",
|
||||
{
|
||||
"a": 6
|
||||
},
|
||||
",\n\n<",
|
||||
".\n\n>",
|
||||
"/\n\n?",
|
||||
{
|
||||
"a": 7
|
||||
},
|
||||
"Shift\n\n\n\nEnter"
|
||||
],
|
||||
[
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"<i class='fa fa-lightbulb-o'></i>\n<i class='fa fa-download'></i>\n\n\n\n\n\n\n\nCtrl",
|
||||
{
|
||||
"a": 7
|
||||
},
|
||||
"Esc",
|
||||
"<i class='fa fa-linux'></i>",
|
||||
"Alt",
|
||||
"<i class='fa fa-sort-up'></i>",
|
||||
{
|
||||
"a": 4,
|
||||
"w": 2
|
||||
},
|
||||
"\nPgUP\n\nPgDn\n\n\n\n\n\nSpace",
|
||||
{
|
||||
"a": 7
|
||||
},
|
||||
"<i class='fa fa-sort-down'></i>",
|
||||
"<i class=\"fa fa-long-arrow-left\" aria-hidden=\"true\"></i>",
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"\n<i class='fa fa-volume-down'></i>\n\n\n\n\n\n\n\n<i class=\"fa fa-long-arrow-up\" aria-hidden=\"true\"></i>",
|
||||
"\n<i class='fa fa-volume-up'></i>\n\n\n\n\n\n\n\n<i class=\"fa fa-long-arrow-down\" aria-hidden=\"true\"></i>",
|
||||
"\n<i class='fa fa-volume-off'></i>\n\n\n\n\n\n\n\n<i class=\"fa fa-long-arrow-right\" aria-hidden=\"true\"></i>"
|
||||
]
|
||||
]
|
BIN
keyboards/planck/keymaps/ab/keyboard-layout.png
Normal file
BIN
keyboards/planck/keymaps/ab/keyboard-layout.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
BIN
keyboards/planck/keymaps/ab/keyboard-photo.jpg
Normal file
BIN
keyboards/planck/keymaps/ab/keyboard-photo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 247 KiB |
122
keyboards/planck/keymaps/ab/keymap.c
Normal file
122
keyboards/planck/keymaps/ab/keymap.c
Normal file
|
@ -0,0 +1,122 @@
|
|||
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
|
||||
// this is the style you want to emulate.
|
||||
|
||||
#include "planck.h"
|
||||
#include "action_layer.h"
|
||||
#include "eeconfig.h"
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
#include "backlight.h"
|
||||
#endif
|
||||
|
||||
extern keymap_config_t keymap_config;
|
||||
|
||||
// Symbolic names for macro IDs.
|
||||
#define _QWERTY 0 // QUERTY layer
|
||||
#define _RAISE 1 // Raise layer
|
||||
#define _LOWER 2 // Lower layer
|
||||
#define _CUSTOM 3 // Custom layer
|
||||
#define _BL 4 // Backlight
|
||||
#define _MOBILE 5 // Mobile#
|
||||
#define _CUSTOM1 6 // Custom macro 1
|
||||
#define _CUSTOM2 7 // Custom macro 2
|
||||
|
||||
// Macro shortcuts.
|
||||
#define RAISE M(_RAISE)
|
||||
#define LOWER M(_LOWER)
|
||||
#define CUSTOM M(_CUSTOM) // RAISE + LOWER
|
||||
#define BL M(_BL)
|
||||
#define MOBILE M(_MOBILE)
|
||||
#define CUSTOM1 M(_CUSTOM1)
|
||||
#define CUSTOM2 M(_CUSTOM2)
|
||||
|
||||
// This config can be found at Keyboard layout editor site: http://goo.gl/zjXL2l
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_QWERTY] = { /* QWERTY */
|
||||
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
|
||||
{KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT},
|
||||
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, FUNC(3)},
|
||||
{KC_LCTL, KC_ESC, KC_LGUI, KC_LALT, RAISE, KC_SPC, KC_SPC, LOWER, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT}
|
||||
},
|
||||
[_RAISE] = { /* RAISE */
|
||||
{KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL},
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LPRN, KC_RPRN, KC_LCBR, KC_RCBR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_QUOT, KC_DQT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
|
||||
{BL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
|
||||
},
|
||||
[_LOWER] = { /* LOWER */
|
||||
{KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12},
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LCBR, KC_LCBR, KC_BSLS, KC_TRNS},
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRV, KC_TILD, KC_BSLS, KC_PIPE, KC_LBRC, KC_LBRC, KC_TRNS, KC_TRNS},
|
||||
{RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_PGDN, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE}
|
||||
},
|
||||
[_CUSTOM] = { /* CUSTOM */
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MOBILE, KC_TRNS, CUSTOM1, CUSTOM2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
|
||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
|
||||
}
|
||||
};
|
||||
|
||||
// Enable these functions using FUNC(n) macro. They seem to be buggy mostly.
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
[0] = ACTION_LAYER_TAP_KEY(_RAISE, KC_PGUP), // Tap for PgUp, hold for RAISE
|
||||
[1] = ACTION_LAYER_TAP_KEY(_LOWER, KC_PGDN), // Tap for PgDn, hold for LOWER
|
||||
[2] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_CAPS), // Tap for Caps, hold for Ctrl
|
||||
[3] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // Tap for Enter, hold for Shift
|
||||
};
|
||||
|
||||
// Set a layer persistantly.
|
||||
void persistant_default_layer_set(uint16_t default_layer) {
|
||||
eeconfig_update_default_layer(default_layer);
|
||||
default_layer_set(default_layer);
|
||||
}
|
||||
|
||||
// Macro actions for each corresponding ID.
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
switch(id) {
|
||||
case _QWERTY: // Default QWERTY layer. // This case not used for now.
|
||||
if (record->event.pressed) {
|
||||
persistant_default_layer_set(1UL<<_QWERTY);
|
||||
}
|
||||
break;
|
||||
case _RAISE: // Raised layer.
|
||||
if (record->event.pressed) {
|
||||
layer_on(_RAISE);
|
||||
update_tri_layer(_LOWER, _RAISE, _CUSTOM);
|
||||
} else {
|
||||
layer_off(_RAISE);
|
||||
update_tri_layer(_LOWER, _RAISE, _CUSTOM);
|
||||
}
|
||||
break;
|
||||
case _LOWER: // Lowered layer.
|
||||
if (record->event.pressed) {
|
||||
layer_on(_LOWER);
|
||||
update_tri_layer(_LOWER, _RAISE, _CUSTOM);
|
||||
} else {
|
||||
layer_off(_LOWER);
|
||||
update_tri_layer(_LOWER, _RAISE, _CUSTOM);
|
||||
}
|
||||
break;
|
||||
case _BL:// Backlight
|
||||
if (record->event.pressed) {
|
||||
register_code(KC_RSFT);
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
backlight_step();
|
||||
#endif
|
||||
} else {
|
||||
unregister_code(KC_RSFT);
|
||||
}
|
||||
break;
|
||||
case _MOBILE:// Your mobile# here.
|
||||
return MACRODOWN(T(1), T(2), T(3), T(MINS),
|
||||
T(1), T(2), T(3), T(MINS),
|
||||
T(1), T(2), T(3), T(4),
|
||||
END);
|
||||
case _CUSTOM1:// Your custom macro 1
|
||||
return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(SPC), END);
|
||||
case _CUSTOM2:// Your custom macro 2
|
||||
return MACRODOWN(T(L), T(S), T(SPC), T(MINS), T(L), T(ENT), END);
|
||||
};
|
||||
return MACRO_NONE;
|
||||
}
|
46
keyboards/readme.md
Normal file
46
keyboards/readme.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Included Keyboards
|
||||
QMK runs on a diverse range of keyboards. Some of these keyboards are officially supported and see constant community contributions, while others are part of the repository for historical reasons.
|
||||
|
||||
## Official QMK Keyboards
|
||||
|
||||
These keyboards are manufactured by the maintainers of QMK.
|
||||
|
||||
### [Ortholinear Keyboards](http://olkb.com) — Jack Humbert
|
||||
|
||||
What makes OLKB keyboards shine is a combo of lean aesthetics, compact size, and killer tactile feel. These are available through [olkb.com](http://olkb.com) as well as through [Massdrop](http://massdrop.com) from time to time, as easy to assemble kits.
|
||||
|
||||
* [Planck](/keyboards/planck/) — A 40% DIY powerhouse of customizability and modification capability. It's a lean, mean, typing machine.
|
||||
* [Preonic](/keyboards/preonic/) — Like the Planck, but bigger. 50%.
|
||||
* [Atomic](/keyboards/atomic/) — Imagine the size of the Planck. Now imagine the size of the Preonic. Now imagine _bigger_. That is the Atomic. A 60% keyboard.
|
||||
|
||||
### [ErgoDox EZ](https://ergodox-ez.com) — Erez Zukerman
|
||||
|
||||
Made in Taiwan using advanced robotic manufacturing, the ErgoDox EZ is a fully-assembled, premium ergonomic keyboard. Its split design allows you to place both halves shoulder width, and its custom-made wrist rests and tilt/tent kit make for incredibly comfortable typing.
|
||||
|
||||
* [ErgoDox EZ](/keyboards/ergodox_ez/) — Our one and only product. Yes, it's that awesome. Comes with either printed or blank keycaps, and 7 different keyswitch types.
|
||||
|
||||
### [Clueboard](http://clueboard.co) — Zach White
|
||||
|
||||
Designed and built in Felton, CA, Clueboards keyboard emphasize quality and locally sourced components.
|
||||
|
||||
* [Clueboard rev.1](/keyboards/clueboard1/) — The old Clueboard.
|
||||
* [Clueboard rev.2](/keyboards/clueboard2/) — New and improved! The Clueboard, revision 2.
|
||||
* [Cluepad](/keyboards/cluepad/) — A mechanical numpad with QMK superpowers.
|
||||
|
||||
|
||||
## Community-supported QMK Keyboards
|
||||
|
||||
These keyboards are part of the QMK repository, but their manufacturers are not official maintainers of the repository.
|
||||
|
||||
* [alps64](/keyboards/alps64/) — A 60% keyboard for Alps keyswitches.
|
||||
* [arrow_pad](/keyboards/arrow_pad) — A custom creation by IBNobody.
|
||||
* [atreus](/keyboards/atreus) — Made by Technomancy.
|
||||
* [bantam44](/keyboards/bantam44) — It is a 44-key 40% staggered keyboard.
|
||||
* [gh60](/keyboards/gh60) — A 60% Geekhack community-driven project.
|
||||
* [hhkb](/keyboards/hhkb) — The Happy Hacking keyboard can be hacked with a custom controller to run QMK.
|
||||
* [jd45](/keyboards/jd45) — Another Geekhack community project, designed by jdcarpe.
|
||||
* [kc60](/keyboards/kc60) — A programmable Chinese-made keyboard, lost in the mists of time.
|
||||
* [phantom](/keyboards/phantom) — A tenkeyless kit by Teel, also from Geekhack.
|
||||
* [retro_refit](/keyboards/retro_refit) — Another creation by IBNobody.
|
||||
* [satan](/keyboards/satan) — A GH60 variant.
|
||||
* [sixkeyboard](/keyboards/sixkeyboard) — A 6-key keyboard made by TechKeys.
|
Loading…
Reference in a new issue