aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/mt40/config.h207
-rw-r--r--keyboards/mt40/i2c.c104
-rw-r--r--keyboards/mt40/i2c.h25
-rw-r--r--keyboards/mt40/keymaps/default/keymap.c84
-rw-r--r--keyboards/mt40/keymaps/default/readme.md17
-rw-r--r--keyboards/mt40/matrix.c106
-rw-r--r--keyboards/mt40/mt40.c43
-rw-r--r--keyboards/mt40/mt40.h87
-rwxr-xr-xkeyboards/mt40/program74
-rw-r--r--keyboards/mt40/readme.md16
-rw-r--r--keyboards/mt40/rules.mk36
-rw-r--r--keyboards/mt40/usbconfig.h396
12 files changed, 1195 insertions, 0 deletions
diff --git a/keyboards/mt40/config.h b/keyboards/mt40/config.h
new file mode 100644
index 000000000..394cc7898
--- /dev/null
+++ b/keyboards/mt40/config.h
@@ -0,0 +1,207 @@
1/*
2Copyright 2017 REPLACE_WITH_YOUR_NAME
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#include "config_common.h"
22
23/* USB Device descriptor parameter */
24#define VENDOR_ID 0x20A0
25#define PRODUCT_ID 0x422D
26
27#define DEVICE_VER 0x0001
28
29#define MANUFACTURER ThomasDehaeze
30#define PRODUCT mt40
31
32#define DESCRIPTION A Planck clone
33
34/* key matrix size */
35#define MATRIX_ROWS 8
36#define MATRIX_COLS 15
37
38#define RGB_DI_PIN C0
39#define RGBLED_NUM 12
40#define RGBLIGHT_ANIMATIONS
41
42#define RGBLIGHT_HUE_STEP 12
43#define RGBLIGHT_SAT_STEP 15
44#define RGBLIGHT_VAL_STEP 18
45
46#define NO_UART 1
47#define BOOTLOADHID_BOOTLOADER 1
48
49#define TAPPING_TERM 200
50
51/*
52 * Keyboard Matrix Assignments
53 *
54 * Change this to how you wired your keyboard
55 * COLS: AVR pins used for columns, left to right
56 * ROWS: AVR pins used for rows, top to bottom
57 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
58 * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
59 *
60*/
61/* #define CC6 0x63 // C3 */
62/* #define CB6 0x37 // B7 */
63/* #define CC7 0x62 // C2 */
64
65#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5, B6, B7 }
66#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C2, C3, C4, C5, C6, C7, D7 }
67/* #define UNUSED_PINS */
68
69/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
70/* #define DIODE_DIRECTION COL2ROW */
71
72#define BACKLIGHT_PIN D2
73
74/* number of backlight levels */
75#define BACKLIGHT_LEVELS 3
76
77/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
78/* #define DEBOUNCING_DELAY 5 */
79
80/* define if matrix has ghost (lacks anti-ghosting diodes) */
81//#define MATRIX_HAS_GHOST
82
83
84/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
85/* #define LOCKING_SUPPORT_ENABLE */
86/* Locking resynchronize hack */
87/* #define LOCKING_RESYNC_ENABLE */
88
89/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
90 * This is userful for the Windows task manager shortcut (ctrl+shift+esc).
91 */
92// #define GRAVE_ESC_CTRL_OVERRIDE
93
94/*
95 * Force NKRO
96 *
97 * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
98 * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
99 * makefile for this to work.)
100 *
101 * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
102 * until the next keyboard reset.
103 *
104 * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
105 * fully operational during normal computer usage.
106 *
107 * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
108 * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
109 * bootmagic, NKRO mode will always be enabled until it is toggled again during a
110 * power-up.
111 *
112 */
113//#define FORCE_NKRO
114
115/*
116 * Magic Key Options
117 *
118 * Magic keys are hotkey commands that allow control over firmware functions of
119 * the keyboard. They are best used in combination with the HID Listen program,
120 * found here: https://www.pjrc.com/teensy/hid_listen.html
121 *
122 * The options below allow the magic key functionality to be changed. This is
123 * useful if your keyboard/keypad is missing keys and you want magic key support.
124 *
125 */
126
127/* key combination for magic key command */
128#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
129
130/* control how magic key switches layers */
131//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
132//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
133//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
134
135/* override magic key keymap */
136//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
137//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
138//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
139//#define MAGIC_KEY_HELP1 H
140//#define MAGIC_KEY_HELP2 SLASH
141//#define MAGIC_KEY_DEBUG D
142//#define MAGIC_KEY_DEBUG_MATRIX X
143//#define MAGIC_KEY_DEBUG_KBD K
144//#define MAGIC_KEY_DEBUG_MOUSE M
145//#define MAGIC_KEY_VERSION V
146//#define MAGIC_KEY_STATUS S
147//#define MAGIC_KEY_CONSOLE C
148//#define MAGIC_KEY_LAYER0_ALT1 ESC
149//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
150//#define MAGIC_KEY_LAYER0 0
151//#define MAGIC_KEY_LAYER1 1
152//#define MAGIC_KEY_LAYER2 2
153//#define MAGIC_KEY_LAYER3 3
154//#define MAGIC_KEY_LAYER4 4
155//#define MAGIC_KEY_LAYER5 5
156//#define MAGIC_KEY_LAYER6 6
157//#define MAGIC_KEY_LAYER7 7
158//#define MAGIC_KEY_LAYER8 8
159//#define MAGIC_KEY_LAYER9 9
160//#define MAGIC_KEY_BOOTLOADER PAUSE
161//#define MAGIC_KEY_LOCK CAPS
162//#define MAGIC_KEY_EEPROM E
163//#define MAGIC_KEY_NKRO N
164//#define MAGIC_KEY_SLEEP_LED Z
165
166/*
167 * Feature disable options
168 * These options are also useful to firmware size reduction.
169 */
170
171/* disable debug print */
172//#define NO_DEBUG
173
174/* disable print */
175//#define NO_PRINT
176
177/* disable action features */
178//#define NO_ACTION_LAYER
179//#define NO_ACTION_TAPPING
180//#define NO_ACTION_ONESHOT
181//#define NO_ACTION_MACRO
182//#define NO_ACTION_FUNCTION
183
184/*
185 * MIDI options
186 */
187
188/* Prevent use of disabled MIDI features in the keymap */
189//#define MIDI_ENABLE_STRICT 1
190
191/* enable basic MIDI features:
192 - MIDI notes can be sent when in Music mode is on
193*/
194//#define MIDI_BASIC
195
196/* enable advanced MIDI features:
197 - MIDI notes can be added to the keymap
198 - Octave shift and transpose
199 - Virtual sustain, portamento, and modulation wheel
200 - etc.
201*/
202//#define MIDI_ADVANCED
203
204/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
205//#define MIDI_TONE_KEYCODE_OCTAVES 1
206
207#endif
diff --git a/keyboards/mt40/i2c.c b/keyboards/mt40/i2c.c
new file mode 100644
index 000000000..c27f3e3d1
--- /dev/null
+++ b/keyboards/mt40/i2c.c
@@ -0,0 +1,104 @@
1/*
2Copyright 2016 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#include <avr/io.h>
19#include <util/twi.h>
20
21#include "i2c.h"
22
23void i2c_set_bitrate(uint16_t bitrate_khz) {
24 uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
25 if (bitrate_div >= 16) {
26 bitrate_div = (bitrate_div - 16) / 2;
27 }
28 TWBR = bitrate_div;
29}
30
31void i2c_init(void) {
32 // set pull-up resistors on I2C bus pins
33 PORTC |= 0b11;
34
35 i2c_set_bitrate(400);
36
37 // enable TWI (two-wire interface)
38 TWCR |= (1 << TWEN);
39
40 // enable TWI interrupt and slave address ACK
41 TWCR |= (1 << TWIE);
42 TWCR |= (1 << TWEA);
43}
44
45uint8_t i2c_start(uint8_t address) {
46 // reset TWI control register
47 TWCR = 0;
48
49 // begin transmission and wait for it to end
50 TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
51 while (!(TWCR & (1<<TWINT)));
52
53 // check if the start condition was successfully transmitted
54 if ((TWSR & 0xF8) != TW_START) {
55 return 1;
56 }
57
58 // transmit address and wait
59 TWDR = address;
60 TWCR = (1<<TWINT) | (1<<TWEN);
61 while (!(TWCR & (1<<TWINT)));
62
63 // check if the device has acknowledged the READ / WRITE mode
64 uint8_t twst = TW_STATUS & 0xF8;
65 if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
66 return 1;
67 }
68
69 return 0;
70}
71
72void i2c_stop(void) {
73 TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
74}
75
76uint8_t i2c_write(uint8_t data) {
77 TWDR = data;
78
79 // transmit data and wait
80 TWCR = (1<<TWINT) | (1<<TWEN);
81 while (!(TWCR & (1<<TWINT)));
82
83 if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
84 return 1;
85 }
86
87 return 0;
88}
89
90uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
91 if (i2c_start(address)) {
92 return 1;
93 }
94
95 for (uint16_t i = 0; i < length; i++) {
96 if (i2c_write(data[i])) {
97 return 1;
98 }
99 }
100
101 i2c_stop();
102
103 return 0;
104}
diff --git a/keyboards/mt40/i2c.h b/keyboards/mt40/i2c.h
new file mode 100644
index 000000000..27c9d3d05
--- /dev/null
+++ b/keyboards/mt40/i2c.h
@@ -0,0 +1,25 @@
1/*
2Copyright 2016 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#ifndef __I2C_H__
19#define __I2C_H__
20
21void i2c_init(void);
22void i2c_set_bitrate(uint16_t bitrate_khz);
23uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
24
25#endif
diff --git a/keyboards/mt40/keymaps/default/keymap.c b/keyboards/mt40/keymaps/default/keymap.c
new file mode 100644
index 000000000..2da5dd645
--- /dev/null
+++ b/keyboards/mt40/keymaps/default/keymap.c
@@ -0,0 +1,84 @@
1/* Copyright 2017 REPLACE_WITH_YOUR_NAME
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#include "mt40.h"
17#include "action_layer.h"
18#include "rgblight.h"
19
20#define _______ KC_TRNS
21#define OOOOOOO KC_TRNS
22
23#define C_LCTL MT(MOD_LCTL, KC_QUOT)
24#define C_RCTL MT(MOD_RCTL, KC_GRV)
25
26#define C_LGUI MT(MOD_LGUI, KC_LBRC)
27#define C_RGUI MT(MOD_RGUI, KC_RBRC)
28
29#define C_ESC MT(MOD_LCTL, KC_ESC)
30#define C_ENT MT(MOD_RCTL, KC_ENT)
31
32
33/*
34 * ,-----------------------------------------------------------------------------------.
35 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
36 * |------+------+------+------+------+------+------+------+------+------+------+------|
37 * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
38 * |------+------+------+------+------+------+------+------+------+------+------+------|
39 * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
40 * |------+------+------+------+------+------+------+------+------+------+------+------|
41 * | Brite| Ctrl | Alt | GUI |Lower | SPC | BSP |Raise | Left | Down | Up |Right |
42 * `-----------------------------------------------------------------------------------'
43 */
44const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
45 [0] = KEYMAP(
46 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
47 C_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, C_ENT, \
48 KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \
49 C_LCTL, C_LGUI, MOD_LALT, MO(3), MO(1), KC_SPC, KC_SPC, MO(2), MO(4), MOD_RALT, C_RGUI, C_RCTL),
50
51 [1] = KEYMAP(
52 _______, KC_F9, KC_F10, KC_F11, KC_F12, RGB_TOG, RGB_MOD, KC_P7, KC_P8, KC_P9, KC_PSLS, _______, \
53 _______, KC_F5, KC_F6, KC_F7, KC_F8, RGB_VAD, RGB_VAI, KC_P4, KC_P5, KC_P6, KC_PAST, _______, \
54 _______, KC_F1, KC_F2, KC_F3, KC_F4, BL_TOGG, BL_INC, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_PGUP, \
55 _______, _______, _______, _______, OOOOOOO, _______, _______, KC_P0, KC_PDOT, KC_PENT, KC_PPLS, KC_PGDN),
56
57 [2] = KEYMAP(
58 _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_EQL, KC_LBRC, KC_RBRC, KC_NUBS, \
59 KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, \
60 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
61 _______, _______, _______, _______, _______, _______, _______, OOOOOOO, KC_HOME, KC_PGDOWN, KC_PGUP, KC_END),
62
63 [3] = KEYMAP(
64 _______, _______, _______, _______, _______, _______, KC_COPY, KC_PGUP, _______, _______, KC_PASTE, KC_DEL, \
65 _______, _______, _______, KC_PGDN, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, \
66 _______, _______, KC_CUT, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
67 _______, _______, _______, OOOOOOO, _______, _______, _______, _______, _______, _______, _______, _______),
68
69 [4] = KEYMAP(
70 _______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, \
71 KC_PSCR, KC_INS, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______, \
72 KC_CAPS, _______, KC_MPLY, KC_MRWD, KC_MFFD, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, \
73 _______, _______, _______, _______, _______, _______, _______, _______, OOOOOOO, _______, _______, _______),
74
75
76};
77
78const uint16_t PROGMEM fn_actions[] = {
79 [0] = ACTION_LAYER_MOMENTARY(1),
80 [1] = ACTION_LAYER_MOMENTARY(2),
81 [2] = ACTION_LAYER_MOMENTARY(3),
82 [3] = ACTION_LAYER_MOMENTARY(4),
83};
84
diff --git a/keyboards/mt40/keymaps/default/readme.md b/keyboards/mt40/keymaps/default/readme.md
new file mode 100644
index 000000000..033b75fa2
--- /dev/null
+++ b/keyboards/mt40/keymaps/default/readme.md
@@ -0,0 +1,17 @@
1# Default Layout on a Planck Clone Keyboard
2
3## Base Layer
4[Imgur](https://i.imgur.com/XivfDS0.png)
5
6## FN1 Layer - Numpad and Function keys
7[Imgur](https://i.imgur.com/sXTYfAn.png)
8
9## FN2 Layer - Numbers and Symbols
10[Imgur](https://i.imgur.com/Z4Nqp7g.png)
11
12## FN3 Layer - Vim
13[Imgur](https://i.imgur.com/5whRGOx.png)
14
15## FN3 Layer - Multimedia
16[Imgur](https://i.imgur.com/K0jfHIO.png)
17
diff --git a/keyboards/mt40/matrix.c b/keyboards/mt40/matrix.c
new file mode 100644
index 000000000..140026013
--- /dev/null
+++ b/keyboards/mt40/matrix.c
@@ -0,0 +1,106 @@
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#include <avr/io.h>
19#include <util/delay.h>
20
21#include "matrix.h"
22
23#ifndef DEBOUNCE
24# define DEBOUNCE 5
25#endif
26
27static uint8_t debouncing = DEBOUNCE;
28
29static matrix_row_t matrix[MATRIX_ROWS];
30static matrix_row_t matrix_debouncing[MATRIX_ROWS];
31
32void matrix_init(void) {
33 // all outputs for rows high
34 DDRB = 0xFF;
35 PORTB = 0xFF;
36 // all inputs for columns
37 DDRA = 0x00;
38 DDRC &= ~(0x111111<<2);
39 DDRD &= ~(1<<PIND7);
40 // all columns are pulled-up
41 PORTA = 0xFF;
42 PORTC |= (0b111111<<2);
43 PORTD |= (1<<PIND7);
44
45 // initialize matrix state: all keys off
46 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
47 matrix[row] = 0x00;
48 matrix_debouncing[row] = 0x00;
49 }
50}
51
52void matrix_set_row_status(uint8_t row) {
53 DDRB = (1 << row);
54 PORTB = ~(1 << row);
55}
56
57uint8_t bit_reverse(uint8_t x) {
58 x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
59 x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
60 x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
61 return x;
62}
63
64uint8_t matrix_scan(void) {
65 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
66 matrix_set_row_status(row);
67 _delay_us(5);
68
69 matrix_row_t cols = (
70 // cols 0..7, PORTA 0 -> 7
71 (~PINA) & 0xFF
72 ) | (
73 // cols 8..13, PORTC 7 -> 0
74 bit_reverse((~PINC) & 0xFF) << 8
75 ) | (
76 // col 14, PORTD 7
77 ((~PIND) & (1 << PIND7)) << 7
78 );
79
80 if (matrix_debouncing[row] != cols) {
81 matrix_debouncing[row] = cols;
82 debouncing = DEBOUNCE;
83 }
84 }
85
86 if (debouncing) {
87 if (--debouncing) {
88 _delay_ms(1);
89 } else {
90 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
91 matrix[i] = matrix_debouncing[i];
92 }
93 }
94 }
95
96 matrix_scan_user();
97
98 return 1;
99}
100
101inline matrix_row_t matrix_get_row(uint8_t row) {
102 return matrix[row];
103}
104
105void matrix_print(void) {
106}
diff --git a/keyboards/mt40/mt40.c b/keyboards/mt40/mt40.c
new file mode 100644
index 000000000..0e7a30d99
--- /dev/null
+++ b/keyboards/mt40/mt40.c
@@ -0,0 +1,43 @@
1/* Copyright 2017 REPLACE_WITH_YOUR_NAME
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#include "mt40.h"
17#include "rgblight.h"
18
19#include <avr/pgmspace.h>
20
21#include "action_layer.h"
22#include "i2c.h"
23#include "quantum.h"
24
25extern rgblight_config_t rgblight_config;
26
27void rgblight_set(void) {
28 if (!rgblight_config.enable) {
29 for (uint8_t i = 0; i < RGBLED_NUM; i++) {
30 led[i].r = 0;
31 led[i].g = 0;
32 led[i].b = 0;
33 }
34 }
35
36 i2c_init();
37 i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
38}
39
40__attribute__ ((weak))
41void matrix_scan_user(void) {
42 rgblight_task();
43}
diff --git a/keyboards/mt40/mt40.h b/keyboards/mt40/mt40.h
new file mode 100644
index 000000000..18cefd827
--- /dev/null
+++ b/keyboards/mt40/mt40.h
@@ -0,0 +1,87 @@
1/* Copyright 2017 REPLACE_WITH_YOUR_NAME
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#ifndef MT40_H
17#define MT40_H
18
19#include "quantum_keycodes.h"
20#include "keycode.h"
21#include "action.h"
22
23// This a shortcut to help you visually see your layout.
24// The following is an example using the Planck MIT layout
25// The first section contains all of the arguments
26// The second converts the arguments into a two-dimensional array
27#define KEYMAP( \
28 K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
29 K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
30 K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
31 K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B \
32) { \
33 { K31, K32, K33, KC_NO, K34, K35, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K37, KC_NO, KC_NO, KC_NO }, \
34 { K20, K21, K22, K23, K24, K25, KC_NO, KC_NO, KC_NO, KC_NO, K2A, KC_NO, KC_NO, KC_NO, KC_NO }, \
35 { K30, K11, K12, K13, K14, K15, KC_NO, KC_NO, KC_NO, KC_NO, K1A, K1B, KC_NO, KC_NO, KC_NO }, \
36 { K10, K01, K02, K03, K04, K05, KC_NO, KC_NO, KC_NO, KC_NO, K0A, KC_NO, KC_NO, KC_NO, KC_NO }, \
37 { K00, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K0B }, \
38 { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
39 { KC_NO, KC_NO, K06, K16, K26, K36, K38, K3A, K39, K3B, KC_NO, KC_NO, K07, K17, K27 }, \
40 { KC_NO, KC_NO, K09, K19, K29, KC_NO, K2B, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K08, K18, K28 } \
41}
42
43/* #define KC_KEYMAP( \ */
44/* k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ */
45/* k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ */
46/* k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ */
47/* k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \ */
48/* ) \ */
49/* { \ */
50/* { KC_##k31, KC_##k32, KC_##k33, KC_NO, KC_##k34, KC_##k35, KC_NO, KC_NO, KC_NO, KC_NO, KC_##k37, KC_NO, KC_NO, KC_NO, KC_NO }, \ */
51/* { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##k2a, KC_NO, KC_NO, KC_NO }, \ */
52/* { KC_##k30, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_NO, KC_NO, KC_NO, KC_NO, KC_##k1b, KC_##k1a, KC_NO, KC_NO, KC_NO }, \ */
53/* { KC_##k10, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##k0a, KC_NO, KC_NO, KC_NO }, \ */
54/* { KC_##k00, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##k0b }, \ */
55/* { KC_NO, KC_NO, KC_##k06, KC_##k16, KC_##k26, KC_##k36, KC_##k38, KC_##k3a, KC_##k17, KC_##k07, KC_NO, KC_NO, KC_##k3b, KC_##k39, KC_##k27 } \ */
56/* { KC_NO, KC_NO, KC_##k09, KC_##k19, KC_##k29, KC_NO, KC_NO, KC_##k2b, KC_##k18, KC_##k08, KC_NO, KC_NO, KC_NO, KC_NO, KC_##k28 } \ */
57/* } */
58
59/* #define FR_A KC_A */
60/* #define FR_B KC_B */
61/* #define FR_C KC_C */
62/* #define FR_D KC_D */
63/* #define FR_E KC_E */
64/* #define FR_F KC_F */
65/* #define FR_G KC_G */
66/* #define FR_H KC_H */
67/* #define FR_I KC_I */
68/* #define FR_J KC_J */
69/* #define FR_K KC_K */
70/* #define FR_L KC_L */
71/* #define FR_M KC_M */
72/* #define FR_N KC_N */
73/* #define FR_O KC_O */
74/* #define FR_P KC_P */
75/* #define FR_Q KC_Q */
76/* #define FR_R KC_R */
77/* #define FR_S KC_S */
78/* #define FR_T KC_T */
79/* #define FR_U KC_U */
80/* #define FR_V KC_V */
81/* #define FR_W KC_W */
82/* #define FR_X KC_X */
83/* #define FR_Y KC_Y */
84/* #define FR_Z KC_Z */
85
86
87#endif
diff --git a/keyboards/mt40/program b/keyboards/mt40/program
new file mode 100755
index 000000000..e8786f566
--- /dev/null
+++ b/keyboards/mt40/program
@@ -0,0 +1,74 @@
1#!/usr/bin/env python2.7
2# Copyright 2017 Luiz Ribeiro <luizribeiro@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
17from __future__ import print_function
18
19import os
20import sys
21import time
22import usb
23
24if len(sys.argv) < 2:
25 print('Usage: %s <firmware.hex>' % sys.argv[0])
26 sys.exit(1)
27
28print('Searching for planck clone keyboard... ', end='')
29
30dev = usb.core.find(idVendor=0x20A0, idProduct=0x422D)
31if dev is None:
32 raise ValueError('Device not found')
33
34print('Found', end='\n\n')
35
36print('Device Information:')
37print(' idVendor: %d (0x%04x)' % (dev.idVendor, dev.idVendor))
38print(' idProduct: %d (0x%04x)' % (dev.idProduct, dev.idProduct))
39print('Manufacturer: %s' % (dev.iManufacturer))
40print('Serial: %s' % (dev.iSerialNumber))
41print('Product: %s' % (dev.iProduct), end='\n\n')
42
43print('Transferring control to bootloader... ', end='')
44
45dev.set_configuration()
46
47request_type = usb.util.build_request_type(
48 usb.util.CTRL_OUT,
49 usb.util.CTRL_TYPE_CLASS,
50 usb.util.CTRL_RECIPIENT_DEVICE)
51
52USBRQ_HID_SET_REPORT = 0x09
53HID_REPORT_OPTION = 0x0301
54
55
56try:
57 dev.ctrl_transfer(
58 request_type,
59 USBRQ_HID_SET_REPORT,
60 HID_REPORT_OPTION,
61 0,
62 [0, 0, 0xFF] + [0] * 5
63 )
64except usb.core.USBError:
65 # for some reason I keep getting USBError, but it works!
66 pass
67
68# wait a bit until bootloader starts up
69time.sleep(2)
70
71print('OK')
72print('Programming...')
73if os.system('bootloadHID -r "%s"' % sys.argv[1]) == 0:
74 print('\nDone!')
diff --git a/keyboards/mt40/readme.md b/keyboards/mt40/readme.md
new file mode 100644
index 000000000..aba5fa0d0
--- /dev/null
+++ b/keyboards/mt40/readme.md
@@ -0,0 +1,16 @@
1# MT40: An 40% Ortholinear Keyboard
2
3## Program
4
5`make mt40:default:program`
6
7## Pictures
8
9[PCB](https://i.imgur.com/8BeeY07.jpg)
10[Backview of the PCB](https://i.imgur.com/0opsDkt.jpg)
11[Board with Sleeve](https://i.imgur.com/44FhPU8.jpg)
12
13## Buy
14
15https://world.taobao.com/item/548335974877.htm?fromSite=main&spm=a312a.7700824.w4002-6810221593.51.670e68a08mRh69
16
diff --git a/keyboards/mt40/rules.mk b/keyboards/mt40/rules.mk
new file mode 100644
index 000000000..10023da0e
--- /dev/null
+++ b/keyboards/mt40/rules.mk
@@ -0,0 +1,36 @@
1# MCU name
2MCU = atmega32a
3PROTOCOL = VUSB
4
5# unsupported features for now
6NO_UART = yes
7NO_SUSPEND_POWER_DOWN = yes
8
9# processor frequency
10F_CPU = 12000000
11
12# build options
13BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000)
14MOUSEKEY_ENABLE ?= no # Mouse keys(+4700)
15EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
16CONSOLE_ENABLE ?= no # Console for debug(+400)
17COMMAND_ENABLE ?= no # Commands for debug and configuration
18NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ # nkro-doesnt-work
19BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality
20MIDI_ENABLE ?= no # MIDI controls
21AUDIO_ENABLE ?= no # Audio output on port C6
22UNICODE_ENABLE ?= no # Unicode
23BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
24RGBLIGHT_ENABLE ?= yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
25RGBLIGHT_CUSTOM_DRIVER = yes
26TAP_DANCE_ENABLE = no
27
28OPT_DEFS = -DDEBUG_LEVEL=0
29OPT_DEFS += -DBOOTLOADER_SIZE=2048
30
31# custom matrix setup
32CUSTOM_MATRIX = yes
33SRC = matrix.c i2c.c
34
35# programming options
36PROGRAM_CMD = ./keyboards/mt40/program $(TARGET).hex
diff --git a/keyboards/mt40/usbconfig.h b/keyboards/mt40/usbconfig.h
new file mode 100644
index 000000000..498b01fd9
--- /dev/null
+++ b/keyboards/mt40/usbconfig.h
@@ -0,0 +1,396 @@
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#ifndef __usbconfig_h_included__
12#define __usbconfig_h_included__
13
14#include "config.h"
15
16/*
17General Description:
18This file is an example configuration (with inline documentation) for the USB
19driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
20also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
21wire the lines to any other port, as long as D+ is also wired to INT0 (or any
22other hardware interrupt, as long as it is the highest level interrupt, see
23section at the end of this file).
24*/
25
26/* ---------------------------- Hardware Config ---------------------------- */
27
28#define USB_CFG_IOPORTNAME D
29/* This is the port where the USB bus is connected. When you configure it to
30 * "B", the registers PORTB, PINB and DDRB will be used.
31 */
32#define USB_CFG_DMINUS_BIT 3
33/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
34 * This may be any bit in the port.
35 */
36#define USB_CFG_DPLUS_BIT 2
37/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
38 * This may be any bit in the port. Please note that D+ must also be connected
39 * to interrupt pin INT0! [You can also use other interrupts, see section
40 * "Optional MCU Description" below, or you can connect D- to the interrupt, as
41 * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
42 * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
43 * markers every millisecond.]
44 */
45#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
46/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
47 * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
48 * require no crystal, they tolerate +/- 1% deviation from the nominal
49 * frequency. All other rates require a precision of 2000 ppm and thus a
50 * crystal!
51 * Since F_CPU should be defined to your actual clock rate anyway, you should
52 * not need to modify this setting.
53 */
54#define USB_CFG_CHECK_CRC 0
55/* Define this to 1 if you want that the driver checks integrity of incoming
56 * data packets (CRC checks). CRC checks cost quite a bit of code size and are
57 * currently only available for 18 MHz crystal clock. You must choose
58 * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
59 */
60
61/* ----------------------- Optional Hardware Config ------------------------ */
62
63/* #define USB_CFG_PULLUP_IOPORTNAME D */
64/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
65 * V+, you can connect and disconnect the device from firmware by calling
66 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
67 * This constant defines the port on which the pullup resistor is connected.
68 */
69/* #define USB_CFG_PULLUP_BIT 4 */
70/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
71 * above) where the 1.5k pullup resistor is connected. See description
72 * above for details.
73 */
74
75/* --------------------------- Functional Range ---------------------------- */
76
77#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
78/* Define this to 1 if you want to compile a version with two endpoints: The
79 * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
80 * number).
81 */
82#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
83/* Define this to 1 if you want to compile a version with three endpoints: The
84 * default control endpoint 0, an interrupt-in endpoint 3 (or the number
85 * configured below) and a catch-all default interrupt-in endpoint as above.
86 * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
87 */
88#define USB_CFG_EP3_NUMBER 3
89/* If the so-called endpoint 3 is used, it can now be configured to any other
90 * endpoint number (except 0) with this macro. Default if undefined is 3.
91 */
92/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
93/* The above macro defines the startup condition for data toggling on the
94 * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
95 * Since the token is toggled BEFORE sending any data, the first packet is
96 * sent with the oposite value of this configuration!
97 */
98#define USB_CFG_IMPLEMENT_HALT 0
99/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
100 * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
101 * it is required by the standard. We have made it a config option because it
102 * bloats the code considerably.
103 */
104#define USB_CFG_SUPPRESS_INTR_CODE 0
105/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
106 * want to send any data over them. If this macro is defined to 1, functions
107 * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
108 * you need the interrupt-in endpoints in order to comply to an interface
109 * (e.g. HID), but never want to send any data. This option saves a couple
110 * of bytes in flash memory and the transmit buffers in RAM.
111 */
112#define USB_CFG_INTR_POLL_INTERVAL 1
113/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
114 * interval. The value is in milliseconds and must not be less than 10 ms for
115 * low speed devices.
116 */
117#define USB_CFG_IS_SELF_POWERED 0
118/* Define this to 1 if the device has its own power supply. Set it to 0 if the
119 * device is powered from the USB bus.
120 */
121#define USB_CFG_MAX_BUS_POWER 500
122/* Set this variable to the maximum USB bus power consumption of your device.
123 * The value is in milliamperes. [It will be divided by two since USB
124 * communicates power requirements in units of 2 mA.]
125 */
126#define USB_CFG_IMPLEMENT_FN_WRITE 1
127/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
128 * transfers. Set it to 0 if you don't need it and want to save a couple of
129 * bytes.
130 */
131#define USB_CFG_IMPLEMENT_FN_READ 0
132/* Set this to 1 if you need to send control replies which are generated
133 * "on the fly" when usbFunctionRead() is called. If you only want to send
134 * data from a static buffer, set it to 0 and return the data from
135 * usbFunctionSetup(). This saves a couple of bytes.
136 */
137#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
138/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
139 * You must implement the function usbFunctionWriteOut() which receives all
140 * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
141 * can be found in 'usbRxToken'.
142 */
143#define USB_CFG_HAVE_FLOWCONTROL 0
144/* Define this to 1 if you want flowcontrol over USB data. See the definition
145 * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
146 * usbdrv.h.
147 */
148#define USB_CFG_DRIVER_FLASH_PAGE 0
149/* If the device has more than 64 kBytes of flash, define this to the 64 k page
150 * where the driver's constants (descriptors) are located. Or in other words:
151 * Define this to 1 for boot loaders on the ATMega128.
152 */
153#define USB_CFG_LONG_TRANSFERS 0
154/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
155 * in a single control-in or control-out transfer. Note that the capability
156 * for long transfers increases the driver size.
157 */
158/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
159/* This macro is a hook if you want to do unconventional things. If it is
160 * defined, it's inserted at the beginning of received message processing.
161 * If you eat the received message and don't want default processing to
162 * proceed, do a return after doing your things. One possible application
163 * (besides debugging) is to flash a status LED on each packet.
164 */
165/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
166/* This macro is a hook if you need to know when an USB RESET occurs. It has
167 * one parameter which distinguishes between the start of RESET state and its
168 * end.
169 */
170/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
171/* This macro (if defined) is executed when a USB SET_ADDRESS request was
172 * received.
173 */
174#define USB_COUNT_SOF 1
175/* define this macro to 1 if you need the global variable "usbSofCount" which
176 * counts SOF packets. This feature requires that the hardware interrupt is
177 * connected to D- instead of D+.
178 */
179/* #ifdef __ASSEMBLER__
180 * macro myAssemblerMacro
181 * in YL, TCNT0
182 * sts timer0Snapshot, YL
183 * endm
184 * #endif
185 * #define USB_SOF_HOOK myAssemblerMacro
186 * This macro (if defined) is executed in the assembler module when a
187 * Start Of Frame condition is detected. It is recommended to define it to
188 * the name of an assembler macro which is defined here as well so that more
189 * than one assembler instruction can be used. The macro may use the register
190 * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
191 * immediately after an SOF pulse may be lost and must be retried by the host.
192 * What can you do with this hook? Since the SOF signal occurs exactly every
193 * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
194 * designs running on the internal RC oscillator.
195 * Please note that Start Of Frame detection works only if D- is wired to the
196 * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
197 */
198#define USB_CFG_CHECK_DATA_TOGGLING 0
199/* define this macro to 1 if you want to filter out duplicate data packets
200 * sent by the host. Duplicates occur only as a consequence of communication
201 * errors, when the host does not receive an ACK. Please note that you need to
202 * implement the filtering yourself in usbFunctionWriteOut() and
203 * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
204 * for each control- and out-endpoint to check for duplicate packets.
205 */
206#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
207/* define this macro to 1 if you want the function usbMeasureFrameLength()
208 * compiled in. This function can be used to calibrate the AVR's RC oscillator.
209 */
210#define USB_USE_FAST_CRC 0
211/* The assembler module has two implementations for the CRC algorithm. One is
212 * faster, the other is smaller. This CRC routine is only used for transmitted
213 * messages where timing is not critical. The faster routine needs 31 cycles
214 * per byte while the smaller one needs 61 to 69 cycles. The faster routine
215 * may be worth the 32 bytes bigger code size if you transmit lots of data and
216 * run the AVR close to its limit.
217 */
218
219/* -------------------------- Device Description --------------------------- */
220
221#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
222/* USB vendor ID for the device, low byte first. If you have registered your
223 * own Vendor ID, define it here. Otherwise you may use one of obdev's free
224 * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
225 * *** IMPORTANT NOTE ***
226 * This template uses obdev's shared VID/PID pair for Vendor Class devices
227 * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
228 * the implications!
229 */
230#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
231/* This is the ID of the product, low byte first. It is interpreted in the
232 * scope of the vendor ID. If you have registered your own VID with usb.org
233 * or if you have licensed a PID from somebody else, define it here. Otherwise
234 * you may use one of obdev's free shared VID/PID pairs. See the file
235 * USB-IDs-for-free.txt for details!
236 * *** IMPORTANT NOTE ***
237 * This template uses obdev's shared VID/PID pair for Vendor Class devices
238 * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
239 * the implications!
240 */
241#define USB_CFG_DEVICE_VERSION 0x00, 0x03
242/* Version number of the device: Minor number first, then major number.
243 */
244#define USB_CFG_VENDOR_NAME 'T', 'h', 'o', 'm', 'a', 's', 'D', 'e', 'h', 'a', 'e', 'z', 'e'
245#define USB_CFG_VENDOR_NAME_LEN 13
246/* These two values define the vendor name returned by the USB device. The name
247 * must be given as a list of characters under single quotes. The characters
248 * are interpreted as Unicode (UTF-16) entities.
249 * If you don't want a vendor name string, undefine these macros.
250 * ALWAYS define a vendor name containing your Internet domain name if you use
251 * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
252 * details.
253 */
254#define USB_CFG_DEVICE_NAME 'c', 'u', 's', 't', 'o', 'm', '4', '8'
255#define USB_CFG_DEVICE_NAME_LEN 8
256/* Same as above for the device name. If you don't want a device name, undefine
257 * the macros. See the file USB-IDs-for-free.txt before you assign a name if
258 * you use a shared VID/PID.
259 */
260/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
261/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
262/* Same as above for the serial number. If you don't want a serial number,
263 * undefine the macros.
264 * It may be useful to provide the serial number through other means than at
265 * compile time. See the section about descriptor properties below for how
266 * to fine tune control over USB descriptors such as the string descriptor
267 * for the serial number.
268 */
269#define USB_CFG_DEVICE_CLASS 0
270#define USB_CFG_DEVICE_SUBCLASS 0
271/* See USB specification if you want to conform to an existing device class.
272 * Class 0xff is "vendor specific".
273 */
274#define USB_CFG_INTERFACE_CLASS 3 /* HID */
275#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
276#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
277/* See USB specification if you want to conform to an existing device class or
278 * protocol. The following classes must be set at interface level:
279 * HID class is 3, no subclass and protocol required (but may be useful!)
280 * CDC class is 2, use subclass 2 and protocol 1 for ACM
281 */
282#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
283/* Define this to the length of the HID report descriptor, if you implement
284 * an HID device. Otherwise don't define it or define it to 0.
285 * If you use this define, you must add a PROGMEM character array named
286 * "usbHidReportDescriptor" to your code which contains the report descriptor.
287 * Don't forget to keep the array and this define in sync!
288 */
289
290/* #define USB_PUBLIC static */
291/* Use the define above if you #include usbdrv.c instead of linking against it.
292 * This technique saves a couple of bytes in flash memory.
293 */
294
295/* ------------------- Fine Control over USB Descriptors ------------------- */
296/* If you don't want to use the driver's default USB descriptors, you can
297 * provide our own. These can be provided as (1) fixed length static data in
298 * flash memory, (2) fixed length static data in RAM or (3) dynamically at
299 * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
300 * information about this function.
301 * Descriptor handling is configured through the descriptor's properties. If
302 * no properties are defined or if they are 0, the default descriptor is used.
303 * Possible properties are:
304 * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
305 * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
306 * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
307 * you want RAM pointers.
308 * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
309 * in static memory is in RAM, not in flash memory.
310 * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
311 * the driver must know the descriptor's length. The descriptor itself is
312 * found at the address of a well known identifier (see below).
313 * List of static descriptor names (must be declared PROGMEM if in flash):
314 * char usbDescriptorDevice[];
315 * char usbDescriptorConfiguration[];
316 * char usbDescriptorHidReport[];
317 * char usbDescriptorString0[];
318 * int usbDescriptorStringVendor[];
319 * int usbDescriptorStringDevice[];
320 * int usbDescriptorStringSerialNumber[];
321 * Other descriptors can't be provided statically, they must be provided
322 * dynamically at runtime.
323 *
324 * Descriptor properties are or-ed or added together, e.g.:
325 * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
326 *
327 * The following descriptors are defined:
328 * USB_CFG_DESCR_PROPS_DEVICE
329 * USB_CFG_DESCR_PROPS_CONFIGURATION
330 * USB_CFG_DESCR_PROPS_STRINGS
331 * USB_CFG_DESCR_PROPS_STRING_0
332 * USB_CFG_DESCR_PROPS_STRING_VENDOR
333 * USB_CFG_DESCR_PROPS_STRING_PRODUCT
334 * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
335 * USB_CFG_DESCR_PROPS_HID
336 * USB_CFG_DESCR_PROPS_HID_REPORT
337 * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
338 *
339 * Note about string descriptors: String descriptors are not just strings, they
340 * are Unicode strings prefixed with a 2 byte header. Example:
341 * int serialNumberDescriptor[] = {
342 * USB_STRING_DESCRIPTOR_HEADER(6),
343 * 'S', 'e', 'r', 'i', 'a', 'l'
344 * };
345 */
346
347#define USB_CFG_DESCR_PROPS_DEVICE 0
348#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
349//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
350#define USB_CFG_DESCR_PROPS_STRINGS 0
351#define USB_CFG_DESCR_PROPS_STRING_0 0
352#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
353#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
354#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
355#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
356//#define USB_CFG_DESCR_PROPS_HID 0
357#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
358//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
359#define USB_CFG_DESCR_PROPS_UNKNOWN 0
360
361#define usbMsgPtr_t unsigned short
362/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
363 * a scalar type here because gcc generates slightly shorter code for scalar
364 * arithmetics than for pointer arithmetics. Remove this define for backward
365 * type compatibility or define it to an 8 bit type if you use data in RAM only
366 * and all RAM is below 256 bytes (tiny memory model in IAR CC).
367 */
368
369/* ----------------------- Optional MCU Description ------------------------ */
370
371/* The following configurations have working defaults in usbdrv.h. You
372 * usually don't need to set them explicitly. Only if you want to run
373 * the driver on a device which is not yet supported or with a compiler
374 * which is not fully supported (such as IAR C) or if you use a differnt
375 * interrupt than INT0, you may have to define some of these.
376 */
377/* #define USB_INTR_CFG MCUCR */
378/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
379/* #define USB_INTR_CFG_CLR 0 */
380/* #define USB_INTR_ENABLE GIMSK */
381/* #define USB_INTR_ENABLE_BIT INT0 */
382/* #define USB_INTR_PENDING GIFR */
383/* #define USB_INTR_PENDING_BIT INTF0 */
384/* #define USB_INTR_VECTOR INT0_vect */
385
386/* Set INT1 for D- falling edge to count SOF */
387/* #define USB_INTR_CFG EICRA */
388#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
389/* #define USB_INTR_CFG_CLR 0 */
390/* #define USB_INTR_ENABLE EIMSK */
391#define USB_INTR_ENABLE_BIT INT1
392/* #define USB_INTR_PENDING EIFR */
393#define USB_INTR_PENDING_BIT INTF1
394#define USB_INTR_VECTOR INT1_vect
395
396#endif /* __usbconfig_h_included__ */