aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMechMerlin <30334081+mechmerlin@users.noreply.github.com>2019-07-05 04:54:59 -0700
committerDrashna Jaelre <drashna@live.com>2019-07-05 04:54:59 -0700
commitcbf76a129007d14f69fca761144c6b5fd377b150 (patch)
treee51e7b89e9169d613f53b4e7d1c2c1e57c30ffd6
parent78b9922fc427aabe5e0b2f3376982d43be878935 (diff)
downloadqmk_firmware-cbf76a129007d14f69fca761144c6b5fd377b150.tar.gz
qmk_firmware-cbf76a129007d14f69fca761144c6b5fd377b150.zip
[Keyboard] Add TGR x SINGA Unikorn 60 (#6249)
* initial commit, copied from singa * default 60_ansi LAYOUT implemented and tested workin * add rgb underglow support bounded by ifdefs * edit readme to provide information on reset procedure and on rgb underglow support * improve the default keymap to have a second layer with function keys and even a RESET * Add LAYOUT_all macro and discovered that split backspace uses an additional pin on the microcontroller * fix up last line in readme * Add QMK Configurator support
-rw-r--r--keyboards/unikorn/config.h43
-rw-r--r--keyboards/unikorn/info.json16
-rw-r--r--keyboards/unikorn/keymaps/default/config.h19
-rw-r--r--keyboards/unikorn/keymaps/default/keymap.c36
-rw-r--r--keyboards/unikorn/keymaps/default/readme.md1
-rw-r--r--keyboards/unikorn/keymaps/default/rules.mk0
-rw-r--r--keyboards/unikorn/readme.md57
-rw-r--r--keyboards/unikorn/rules.mk48
-rw-r--r--keyboards/unikorn/unikorn.c89
-rw-r--r--keyboards/unikorn/unikorn.h52
-rw-r--r--keyboards/unikorn/usbconfig.h393
11 files changed, 754 insertions, 0 deletions
diff --git a/keyboards/unikorn/config.h b/keyboards/unikorn/config.h
new file mode 100644
index 000000000..161956b88
--- /dev/null
+++ b/keyboards/unikorn/config.h
@@ -0,0 +1,43 @@
1/*
2Copyright 2017 Luiz Ribeiro <luizribeiro@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#pragma once
19
20#include "config_common.h"
21
22#define VENDOR_ID 0x20A0
23#define PRODUCT_ID 0x422D
24#define MANUFACTURER Singa and TGR
25#define PRODUCT Unikorn 60
26
27#define MATRIX_ROWS 5
28#define MATRIX_COLS 15
29
30// 0 1 2 3 4 5 6 7 8 9 A B C D E
31#define MATRIX_ROW_PINS { B1, B2, B3, B4, B5 }
32#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 }
33#define UNUSED_PINS
34
35#define DIODE_DIRECTION COL2ROW
36#define DEBOUNCE 5
37
38#define NO_BACKLIGHT_CLOCK
39#define BACKLIGHT_LEVELS 1
40#ifdef RGBLIGHT_ENABLE
41#define RGBLED_NUM 17
42#define RGBLIGHT_ANIMATIONS
43#endif
diff --git a/keyboards/unikorn/info.json b/keyboards/unikorn/info.json
new file mode 100644
index 000000000..9c82e25b4
--- /dev/null
+++ b/keyboards/unikorn/info.json
@@ -0,0 +1,16 @@
1{
2 "keyboard_name": "Unikorn 60",
3 "url": "",
4 "maintainer": "qmk",
5 "width": 15,
6 "height": 5,
7 "layouts": {
8 "LAYOUT_all": {
9 "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":2, "w":1.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
10 },
11
12 "LAYOUT_60_ansi": {
13 "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
14 }
15 }
16} \ No newline at end of file
diff --git a/keyboards/unikorn/keymaps/default/config.h b/keyboards/unikorn/keymaps/default/config.h
new file mode 100644
index 000000000..93b81b57b
--- /dev/null
+++ b/keyboards/unikorn/keymaps/default/config.h
@@ -0,0 +1,19 @@
1/* Copyright 2018 amnesia0287
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19// place overrides here
diff --git a/keyboards/unikorn/keymaps/default/keymap.c b/keyboards/unikorn/keymaps/default/keymap.c
new file mode 100644
index 000000000..d19d83c8a
--- /dev/null
+++ b/keyboards/unikorn/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
1/* Copyright 2019 MechMerlin
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include QMK_KEYBOARD_H
18
19const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
20
21 [0] = LAYOUT_60_ansi(
22 KC_GRV, KC_Q, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
23 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
24 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
25 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
26 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
27 ),
28
29 [1] = LAYOUT_60_ansi(
30 KC_TRNS, 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_DEL,
31 RESET, 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,
32 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,
33 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
34 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
35 )
36};
diff --git a/keyboards/unikorn/keymaps/default/readme.md b/keyboards/unikorn/keymaps/default/readme.md
new file mode 100644
index 000000000..1f19a96b4
--- /dev/null
+++ b/keyboards/unikorn/keymaps/default/readme.md
@@ -0,0 +1 @@
# The default keymap for singa \ No newline at end of file
diff --git a/keyboards/unikorn/keymaps/default/rules.mk b/keyboards/unikorn/keymaps/default/rules.mk
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/keyboards/unikorn/keymaps/default/rules.mk
diff --git a/keyboards/unikorn/readme.md b/keyboards/unikorn/readme.md
new file mode 100644
index 000000000..953d5be79
--- /dev/null
+++ b/keyboards/unikorn/readme.md
@@ -0,0 +1,57 @@
1# Unikorn 60
2
360% PCB made for the TGR x SINGA Unikorn60.
4
5
6Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
7Hardware Supported: Unikorn 60 PCB
8Hardware Availability: [Geekhack GB](https://geekhack.org/index.php?topic=98350.0)
9
10
11Make example for this keyboard (after setting up your build environment):
12
13 make unikorn:default
14
15This PCB can support RGB underglow. There are pads on the bottom of the PCB for the LED controller chip and for 17 RGB underglow LEDs. The Unikorn 60 case does not have acrylic pieces to properly display underglow effects.
16
17To enable RGB lighting support, install the necessary components and set RGBLIGHT features in `rules.mk` like so:
18
19```
20RGBLIGHT_ENABLE = yes
21RGBLIGHT_CUSTOM_DRIVER = yes
22```
23
24
25Flashing
26
27ps2avr(GB) boards use an atmega32a microcontroller and a different bootloader. It is not flashable using the regular QMK methods.
28
29**Reset Key:** Short the two holes labeled `FW_JP` beside the Tab key. At this time there is no reset key to press.
30
31Windows:
321. Download [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash).
332. Place your keyboard into reset.
343. Press the `Find Device` button and ensure that your keyboard is found.
354. Press the `Open .hex File` button and locate the `.hex` file you created.
365. Press the `Flash Device` button and wait for the process to complete.
37
38macOS:
391. Install homebrew by typing the following:
40 ```
41 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
42 ```
432. Install `crosspack-avr`.
44 ```
45 brew cask install crosspack-avr
46 ```
473. Install the following packages:
48 ```
49 brew install python3
50 pip3 install pyusb
51 brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb
52
534. Place your keyboard into reset.
545. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file.
55
56
57See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/unikorn/rules.mk b/keyboards/unikorn/rules.mk
new file mode 100644
index 000000000..7d6fa14e1
--- /dev/null
+++ b/keyboards/unikorn/rules.mk
@@ -0,0 +1,48 @@
1# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
2#
3# This program is free software: you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation, either version 2 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16# MCU name
17MCU = atmega32a
18PROTOCOL = VUSB
19
20# unsupported features for now
21NO_UART = yes
22NO_SUSPEND_POWER_DOWN = yes
23
24# processor frequency
25F_CPU = 12000000
26
27# Bootloader
28# This definition is optional, and if your keyboard supports multiple bootloaders of
29# different sizes, comment this out, and the correct address will be loaded
30# automatically (+60). See bootloader.mk for all options.
31BOOTLOADER = bootloadHID
32
33# build options
34BOOTMAGIC_ENABLE = no
35MOUSEKEY_ENABLE = yes
36EXTRAKEY_ENABLE = yes
37CONSOLE_ENABLE = yes
38COMMAND_ENABLE = yes
39BACKLIGHT_ENABLE = yes
40RGBLIGHT_ENABLE = no
41RGBLIGHT_CUSTOM_DRIVER = no
42
43OPT_DEFS = -DDEBUG_LEVEL=0
44
45SRC = i2c_master.c
46
47# programming options
48PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex
diff --git a/keyboards/unikorn/unikorn.c b/keyboards/unikorn/unikorn.c
new file mode 100644
index 000000000..1bd47ef9e
--- /dev/null
+++ b/keyboards/unikorn/unikorn.c
@@ -0,0 +1,89 @@
1/* Copyright 2019 MechMerlin
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "i2c_master.h"
18#include "quantum.h"
19
20#ifdef RGBLIGHT_ENABLE
21#include "rgblight.h"
22extern rgblight_config_t rgblight_config;
23
24void rgblight_set(void) {
25 if (!rgblight_config.enable) {
26 for (uint8_t i = 0; i < RGBLED_NUM; i++) {
27 led[i].r = 0;
28 led[i].g = 0;
29 led[i].b = 0;
30 }
31 }
32
33 i2c_init();
34 i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
35}
36#endif
37
38void matrix_init_kb(void) {
39#ifdef RGBLIGHT_ENABLE
40 if (rgblight_config.enable) {
41 i2c_init();
42 i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
43 }
44#endif
45 // call user level keymaps, if any
46 matrix_init_user();
47}
48
49void matrix_scan_kb(void) {
50#ifdef RGBLIGHT_ENABLE
51 rgblight_task();
52#endif
53 matrix_scan_user();
54 /* Nothing else for now. */
55}
56
57__attribute__ ((weak))
58void matrix_scan_user(void) {
59}
60
61void backlight_init_ports(void) {
62 // initialize pins D0, D1, D4 and D6 as output
63 setPinOutput(D0);
64 setPinOutput(D1);
65 setPinOutput(D4);
66 setPinOutput(D6);
67
68 // turn backlight LEDs on
69 writePinHigh(D0);
70 writePinHigh(D1);
71 writePinHigh(D4);
72 writePinHigh(D6);
73}
74
75void backlight_set(uint8_t level) {
76 if (level == 0) {
77 // turn backlight LEDs off
78 writePinLow(D0);
79 writePinLow(D1);
80 writePinLow(D4);
81 writePinLow(D6);
82 } else {
83 // turn backlight LEDs on
84 writePinHigh(D0);
85 writePinHigh(D1);
86 writePinHigh(D4);
87 writePinHigh(D6);
88 }
89}
diff --git a/keyboards/unikorn/unikorn.h b/keyboards/unikorn/unikorn.h
new file mode 100644
index 000000000..6824492e0
--- /dev/null
+++ b/keyboards/unikorn/unikorn.h
@@ -0,0 +1,52 @@
1/* Copyright 2019 MechMerlin
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#pragma once
17
18#include "quantum.h"
19
20// This a shortcut to help you visually see your layout.
21// The first section contains all of the arguments
22// The second converts the arguments into a two-dimensional array
23
24#define LAYOUT_all( \
25 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, \
26 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \
27 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
28 k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, \
29 k40, k41, k42, k44, k45, k47, k48, k49, k4B, k4D \
30){ \
31 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
32 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO }, \
33 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, KC_NO }, \
34 { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, KC_NO }, \
35 { k40, k41, k42, KC_NO, k44, k45, KC_NO, k47, k48, k49, KC_NO, k4B, KC_NO, k4D, KC_NO }, \
36}
37
38
39#define LAYOUT_60_ansi( \
40 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \
41 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \
42 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2D, \
43 k30, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, \
44 k40, k41, k42, k45, k48, k49, k4B, k4D \
45){ \
46 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, KC_NO }, \
47 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO }, \
48 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, KC_NO, k2D, KC_NO }, \
49 { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, KC_NO, KC_NO }, \
50 { k40, k41, k42, KC_NO, KC_NO, k45, KC_NO, KC_NO, k48, k49, KC_NO, k4B, KC_NO, k4D, KC_NO }, \
51}
52
diff --git a/keyboards/unikorn/usbconfig.h b/keyboards/unikorn/usbconfig.h
new file mode 100644
index 000000000..41ce167a8
--- /dev/null
+++ b/keyboards/unikorn/usbconfig.h
@@ -0,0 +1,393 @@
1/* Name: usbconfig.h
2 * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
3 * Author: Christian Starkjohann
4 * Creation Date: 2005-04-01
5 * Tabsize: 4
6 * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
7 * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
8 * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
9 */
10
11#pragma once
12
13#include "config.h"
14
15/*
16General Description:
17This file is an example configuration (with inline documentation) for the USB
18driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
19also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
20wire the lines to any other port, as long as D+ is also wired to INT0 (or any
21other hardware interrupt, as long as it is the highest level interrupt, see
22section at the end of this file).
23*/
24
25/* ---------------------------- Hardware Config ---------------------------- */
26
27#define USB_CFG_IOPORTNAME D
28/* This is the port where the USB bus is connected. When you configure it to
29 * "B", the registers PORTB, PINB and DDRB will be used.
30 */
31#define USB_CFG_DMINUS_BIT 3
32/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
33 * This may be any bit in the port.
34 */
35#define USB_CFG_DPLUS_BIT 2
36/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
37 * This may be any bit in the port. Please note that D+ must also be connected
38 * to interrupt pin INT0! [You can also use other interrupts, see section
39 * "Optional MCU Description" below, or you can connect D- to the interrupt, as
40 * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
41 * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
42 * markers every millisecond.]
43 */
44#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
45/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
46 * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
47 * require no crystal, they tolerate +/- 1% deviation from the nominal
48 * frequency. All other rates require a precision of 2000 ppm and thus a
49 * crystal!
50 * Since F_CPU should be defined to your actual clock rate anyway, you should
51 * not need to modify this setting.
52 */
53#define USB_CFG_CHECK_CRC 0
54/* Define this to 1 if you want that the driver checks integrity of incoming
55 * data packets (CRC checks). CRC checks cost quite a bit of code size and are
56 * currently only available for 18 MHz crystal clock. You must choose
57 * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
58 */
59
60/* ----------------------- Optional Hardware Config ------------------------ */
61
62/* #define USB_CFG_PULLUP_IOPORTNAME D */
63/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
64 * V+, you can connect and disconnect the device from firmware by calling
65 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
66 * This constant defines the port on which the pullup resistor is connected.
67 */
68/* #define USB_CFG_PULLUP_BIT 4 */
69/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
70 * above) where the 1.5k pullup resistor is connected. See description
71 * above for details.
72 */
73
74/* --------------------------- Functional Range ---------------------------- */
75
76#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
77/* Define this to 1 if you want to compile a version with two endpoints: The
78 * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
79 * number).
80 */
81#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
82/* Define this to 1 if you want to compile a version with three endpoints: The
83 * default control endpoint 0, an interrupt-in endpoint 3 (or the number
84 * configured below) and a catch-all default interrupt-in endpoint as above.
85 * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
86 */
87#define USB_CFG_EP3_NUMBER 3
88/* If the so-called endpoint 3 is used, it can now be configured to any other
89 * endpoint number (except 0) with this macro. Default if undefined is 3.
90 */
91/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
92/* The above macro defines the startup condition for data toggling on the
93 * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
94 * Since the token is toggled BEFORE sending any data, the first packet is
95 * sent with the oposite value of this configuration!
96 */
97#define USB_CFG_IMPLEMENT_HALT 0
98/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
99 * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
100 * it is required by the standard. We have made it a config option because it
101 * bloats the code considerably.
102 */
103#define USB_CFG_SUPPRESS_INTR_CODE 0
104/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
105 * want to send any data over them. If this macro is defined to 1, functions
106 * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
107 * you need the interrupt-in endpoints in order to comply to an interface
108 * (e.g. HID), but never want to send any data. This option saves a couple
109 * of bytes in flash memory and the transmit buffers in RAM.
110 */
111#define USB_CFG_INTR_POLL_INTERVAL 1
112/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
113 * interval. The value is in milliseconds and must not be less than 10 ms for
114 * low speed devices.
115 */
116#define USB_CFG_IS_SELF_POWERED 0
117/* Define this to 1 if the device has its own power supply. Set it to 0 if the
118 * device is powered from the USB bus.
119 */
120#define USB_CFG_MAX_BUS_POWER 500
121/* Set this variable to the maximum USB bus power consumption of your device.
122 * The value is in milliamperes. [It will be divided by two since USB
123 * communicates power requirements in units of 2 mA.]
124 */
125#define USB_CFG_IMPLEMENT_FN_WRITE 1
126/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
127 * transfers. Set it to 0 if you don't need it and want to save a couple of
128 * bytes.
129 */
130#define USB_CFG_IMPLEMENT_FN_READ 0
131/* Set this to 1 if you need to send control replies which are generated
132 * "on the fly" when usbFunctionRead() is called. If you only want to send
133 * data from a static buffer, set it to 0 and return the data from
134 * usbFunctionSetup(). This saves a couple of bytes.
135 */
136#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
137/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
138 * You must implement the function usbFunctionWriteOut() which receives all
139 * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
140 * can be found in 'usbRxToken'.
141 */
142#define USB_CFG_HAVE_FLOWCONTROL 0
143/* Define this to 1 if you want flowcontrol over USB data. See the definition
144 * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
145 * usbdrv.h.
146 */
147#define USB_CFG_DRIVER_FLASH_PAGE 0
148/* If the device has more than 64 kBytes of flash, define this to the 64 k page
149 * where the driver's constants (descriptors) are located. Or in other words:
150 * Define this to 1 for boot loaders on the ATMega128.
151 */
152#define USB_CFG_LONG_TRANSFERS 0
153/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
154 * in a single control-in or control-out transfer. Note that the capability
155 * for long transfers increases the driver size.
156 */
157/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
158/* This macro is a hook if you want to do unconventional things. If it is
159 * defined, it's inserted at the beginning of received message processing.
160 * If you eat the received message and don't want default processing to
161 * proceed, do a return after doing your things. One possible application
162 * (besides debugging) is to flash a status LED on each packet.
163 */
164/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
165/* This macro is a hook if you need to know when an USB RESET occurs. It has
166 * one parameter which distinguishes between the start of RESET state and its
167 * end.
168 */
169/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
170/* This macro (if defined) is executed when a USB SET_ADDRESS request was
171 * received.
172 */
173#define USB_COUNT_SOF 1
174/* define this macro to 1 if you need the global variable "usbSofCount" which
175 * counts SOF packets. This feature requires that the hardware interrupt is
176 * connected to D- instead of D+.
177 */
178/* #ifdef __ASSEMBLER__
179 * macro myAssemblerMacro
180 * in YL, TCNT0
181 * sts timer0Snapshot, YL
182 * endm
183 * #endif
184 * #define USB_SOF_HOOK myAssemblerMacro
185 * This macro (if defined) is executed in the assembler module when a
186 * Start Of Frame condition is detected. It is recommended to define it to
187 * the name of an assembler macro which is defined here as well so that more
188 * than one assembler instruction can be used. The macro may use the register
189 * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
190 * immediately after an SOF pulse may be lost and must be retried by the host.
191 * What can you do with this hook? Since the SOF signal occurs exactly every
192 * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
193 * designs running on the internal RC oscillator.
194 * Please note that Start Of Frame detection works only if D- is wired to the
195 * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
196 */
197#define USB_CFG_CHECK_DATA_TOGGLING 0
198/* define this macro to 1 if you want to filter out duplicate data packets
199 * sent by the host. Duplicates occur only as a consequence of communication
200 * errors, when the host does not receive an ACK. Please note that you need to
201 * implement the filtering yourself in usbFunctionWriteOut() and
202 * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
203 * for each control- and out-endpoint to check for duplicate packets.
204 */
205#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
206/* define this macro to 1 if you want the function usbMeasureFrameLength()
207 * compiled in. This function can be used to calibrate the AVR's RC oscillator.
208 */
209#define USB_USE_FAST_CRC 0
210/* The assembler module has two implementations for the CRC algorithm. One is
211 * faster, the other is smaller. This CRC routine is only used for transmitted
212 * messages where timing is not critical. The faster routine needs 31 cycles
213 * per byte while the smaller one needs 61 to 69 cycles. The faster routine
214 * may be worth the 32 bytes bigger code size if you transmit lots of data and
215 * run the AVR close to its limit.
216 */
217
218/* -------------------------- Device Description --------------------------- */
219
220#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
221/* USB vendor ID for the device, low byte first. If you have registered your
222 * own Vendor ID, define it here. Otherwise you may use one of obdev's free
223 * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
224 * *** IMPORTANT NOTE ***
225 * This template uses obdev's shared VID/PID pair for Vendor Class devices
226 * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
227 * the implications!
228 */
229#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
230/* This is the ID of the product, low byte first. It is interpreted in the
231 * scope of the vendor ID. If you have registered your own VID with usb.org
232 * or if you have licensed a PID from somebody else, define it here. Otherwise
233 * you may use one of obdev's free shared VID/PID pairs. See the file
234 * USB-IDs-for-free.txt for details!
235 * *** IMPORTANT NOTE ***
236 * This template uses obdev's shared VID/PID pair for Vendor Class devices
237 * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
238 * the implications!
239 */
240#define USB_CFG_DEVICE_VERSION 0x00, 0x02
241/* Version number of the device: Minor number first, then major number.
242 */
243#define USB_CFG_VENDOR_NAME 's', 'i', 'n', 'g', 'a', 't', 'g', 'r'
244#define USB_CFG_VENDOR_NAME_LEN 8
245/* These two values define the vendor name returned by the USB device. The name
246 * must be given as a list of characters under single quotes. The characters
247 * are interpreted as Unicode (UTF-16) entities.
248 * If you don't want a vendor name string, undefine these macros.
249 * ALWAYS define a vendor name containing your Internet domain name if you use
250 * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
251 * details.
252 */
253#define USB_CFG_DEVICE_NAME 'u', 'n', 'i', 'k', 'o', 'r', 'n'
254#define USB_CFG_DEVICE_NAME_LEN 7
255/* Same as above for the device name. If you don't want a device name, undefine
256 * the macros. See the file USB-IDs-for-free.txt before you assign a name if
257 * you use a shared VID/PID.
258 */
259/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
260/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
261/* Same as above for the serial number. If you don't want a serial number,
262 * undefine the macros.
263 * It may be useful to provide the serial number through other means than at
264 * compile time. See the section about descriptor properties below for how
265 * to fine tune control over USB descriptors such as the string descriptor
266 * for the serial number.
267 */
268#define USB_CFG_DEVICE_CLASS 0
269#define USB_CFG_DEVICE_SUBCLASS 0
270/* See USB specification if you want to conform to an existing device class.
271 * Class 0xff is "vendor specific".
272 */
273#define USB_CFG_INTERFACE_CLASS 3 /* HID */
274#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
275#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
276/* See USB specification if you want to conform to an existing device class or
277 * protocol. The following classes must be set at interface level:
278 * HID class is 3, no subclass and protocol required (but may be useful!)
279 * CDC class is 2, use subclass 2 and protocol 1 for ACM
280 */
281#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
282/* Define this to the length of the HID report descriptor, if you implement
283 * an HID device. Otherwise don't define it or define it to 0.
284 * If you use this define, you must add a PROGMEM character array named
285 * "usbHidReportDescriptor" to your code which contains the report descriptor.
286 * Don't forget to keep the array and this define in sync!
287 */
288
289/* #define USB_PUBLIC static */
290/* Use the define above if you #include usbdrv.c instead of linking against it.
291 * This technique saves a couple of bytes in flash memory.
292 */
293
294/* ------------------- Fine Control over USB Descriptors ------------------- */
295/* If you don't want to use the driver's default USB descriptors, you can
296 * provide our own. These can be provided as (1) fixed length static data in
297 * flash memory, (2) fixed length static data in RAM or (3) dynamically at
298 * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
299 * information about this function.
300 * Descriptor handling is configured through the descriptor's properties. If
301 * no properties are defined or if they are 0, the default descriptor is used.
302 * Possible properties are:
303 * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
304 * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
305 * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
306 * you want RAM pointers.
307 * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
308 * in static memory is in RAM, not in flash memory.
309 * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
310 * the driver must know the descriptor's length. The descriptor itself is
311 * found at the address of a well known identifier (see below).
312 * List of static descriptor names (must be declared PROGMEM if in flash):
313 * char usbDescriptorDevice[];
314 * char usbDescriptorConfiguration[];
315 * char usbDescriptorHidReport[];
316 * char usbDescriptorString0[];
317 * int usbDescriptorStringVendor[];
318 * int usbDescriptorStringDevice[];
319 * int usbDescriptorStringSerialNumber[];
320 * Other descriptors can't be provided statically, they must be provided
321 * dynamically at runtime.
322 *
323 * Descriptor properties are or-ed or added together, e.g.:
324 * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
325 *
326 * The following descriptors are defined:
327 * USB_CFG_DESCR_PROPS_DEVICE
328 * USB_CFG_DESCR_PROPS_CONFIGURATION
329 * USB_CFG_DESCR_PROPS_STRINGS
330 * USB_CFG_DESCR_PROPS_STRING_0
331 * USB_CFG_DESCR_PROPS_STRING_VENDOR
332 * USB_CFG_DESCR_PROPS_STRING_PRODUCT
333 * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
334 * USB_CFG_DESCR_PROPS_HID
335 * USB_CFG_DESCR_PROPS_HID_REPORT
336 * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
337 *
338 * Note about string descriptors: String descriptors are not just strings, they
339 * are Unicode strings prefixed with a 2 byte header. Example:
340 * int serialNumberDescriptor[] = {
341 * USB_STRING_DESCRIPTOR_HEADER(6),
342 * 'S', 'e', 'r', 'i', 'a', 'l'
343 * };
344 */
345
346#define USB_CFG_DESCR_PROPS_DEVICE 0
347#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
348//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
349#define USB_CFG_DESCR_PROPS_STRINGS 0
350#define USB_CFG_DESCR_PROPS_STRING_0 0
351#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
352#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
353#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
354#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
355//#define USB_CFG_DESCR_PROPS_HID 0
356#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
357//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
358#define USB_CFG_DESCR_PROPS_UNKNOWN 0
359
360#define usbMsgPtr_t unsigned short
361/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
362 * a scalar type here because gcc generates slightly shorter code for scalar
363 * arithmetics than for pointer arithmetics. Remove this define for backward
364 * type compatibility or define it to an 8 bit type if you use data in RAM only
365 * and all RAM is below 256 bytes (tiny memory model in IAR CC).
366 */
367
368/* ----------------------- Optional MCU Description ------------------------ */
369
370/* The following configurations have working defaults in usbdrv.h. You
371 * usually don't need to set them explicitly. Only if you want to run
372 * the driver on a device which is not yet supported or with a compiler
373 * which is not fully supported (such as IAR C) or if you use a differnt
374 * interrupt than INT0, you may have to define some of these.
375 */
376/* #define USB_INTR_CFG MCUCR */
377/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
378/* #define USB_INTR_CFG_CLR 0 */
379/* #define USB_INTR_ENABLE GIMSK */
380/* #define USB_INTR_ENABLE_BIT INT0 */
381/* #define USB_INTR_PENDING GIFR */
382/* #define USB_INTR_PENDING_BIT INTF0 */
383/* #define USB_INTR_VECTOR INT0_vect */
384
385/* Set INT1 for D- falling edge to count SOF */
386/* #define USB_INTR_CFG EICRA */
387#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
388/* #define USB_INTR_CFG_CLR 0 */
389/* #define USB_INTR_ENABLE EIMSK */
390#define USB_INTR_ENABLE_BIT INT1
391/* #define USB_INTR_PENDING EIFR */
392#define USB_INTR_PENDING_BIT INTF1
393#define USB_INTR_VECTOR INT1_vect