Merged, however now there are two debounce.h and debounce.c to mess around with and coalesce. # Conflicts: # quantum/matrix.cpull/3720/head
@ -1,100 +0,0 @@ | |||
* [Complete Newbs Guide](newbs.md) | |||
* [Getting Started](newbs_getting_started.md) | |||
* [Building Your First Firmware](newbs_building_firmware.md) | |||
* [Flashing Firmware](newbs_flashing.md) | |||
* [Testing and Debugging](newbs_testing_debugging.md) | |||
* [Best Practices](newbs_best_practices.md) | |||
* [Learning Resources](newbs_learn_more_resources.md) | |||
* [QMK Basics](README.md) | |||
* [QMK Introduction](getting_started_introduction.md) | |||
* [Contributing to QMK](contributing.md) | |||
* [How to Use Github](getting_started_github.md) | |||
* [Getting Help](getting_started_getting_help.md) | |||
* [FAQ](faq.md) | |||
* [General FAQ](faq_general.md) | |||
* [Build/Compile QMK](faq_build.md) | |||
* [Debugging/Troubleshooting QMK](faq_debug.md) | |||
* [Keymap](faq_keymap.md) | |||
* Detailed Guides | |||
* [Install Build Tools](getting_started_build_tools.md) | |||
* [Vagrant Guide](getting_started_vagrant.md) | |||
* [Build/Compile Instructions](getting_started_make_guide.md) | |||
* [Flashing Firmware](flashing.md) | |||
* [Customizing Functionality](custom_quantum_functions.md) | |||
* [Keymap Overview](keymap.md) | |||
* [Hardware](hardware.md) | |||
* [AVR Processors](hardware_avr.md) | |||
* [Drivers](hardware_drivers.md) | |||
* Reference | |||
* [Keyboard Guidelines](hardware_keyboard_guidelines.md) | |||
* [Config Options](config_options.md) | |||
* [Keycodes](keycodes.md) | |||
* [Documentation Best Practices](documentation_best_practices.md) | |||
* [Documentation Templates](documentation_templates.md) | |||
* [Glossary](reference_glossary.md) | |||
* [Unit Testing](unit_testing.md) | |||
* [Useful Functions](ref_functions.md) | |||
* [Configurator Support](reference_configurator_support.md) | |||
* [Features](features.md) | |||
* [Basic Keycodes](keycodes_basic.md) | |||
* [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) | |||
* [Quantum Keycodes](quantum_keycodes.md) | |||
* [Advanced Keycodes](feature_advanced_keycodes.md) | |||
* [Audio](feature_audio.md) | |||
* [Auto Shift](feature_auto_shift.md) | |||
* [Backlight](feature_backlight.md) | |||
* [Bluetooth](feature_bluetooth.md) | |||
* [Bootmagic](feature_bootmagic.md) | |||
* [Combos](feature_combo) | |||
* [Command](feature_command.md) | |||
* [Dynamic Macros](feature_dynamic_macros.md) | |||
* [Encoders](feature_encoders.md) | |||
* [Grave Escape](feature_grave_esc.md) | |||
* [Key Lock](feature_key_lock.md) | |||
* [Layouts](feature_layouts.md) | |||
* [Leader Key](feature_leader_key.md) | |||
* [Macros](feature_macros.md) | |||
* [Mouse Keys](feature_mouse_keys.md) | |||
* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) | |||
* [Pointing Device](feature_pointing_device.md) | |||
* [PS/2 Mouse](feature_ps2_mouse.md) | |||
* [RGB Lighting](feature_rgblight.md) | |||
* [RGB Matrix](feature_rgb_matrix.md) | |||
* [Space Cadet Shift](feature_space_cadet_shift.md) | |||
* [Space Cadet Shift Enter](feature_space_cadet_shift_enter.md) | |||
* [Stenography](feature_stenography.md) | |||
* [Swap Hands](feature_swap_hands.md) | |||
* [Tap Dance](feature_tap_dance.md) | |||
* [Terminal](feature_terminal.md) | |||
* [Thermal Printer](feature_thermal_printer.md) | |||
* [Unicode](feature_unicode.md) | |||
* [Userspace](feature_userspace.md) | |||
* For Makers and Modders | |||
* [Hand Wiring Guide](hand_wire.md) | |||
* [ISP Flashing Guide](isp_flashing_guide.md) | |||
* [ARM Debugging Guide](arm_debugging.md) | |||
* [I2C Driver](i2c_driver.md) | |||
* For a Deeper Understanding | |||
* [How Keyboards Work](how_keyboards_work.md) | |||
* [Understanding QMK](understanding_qmk.md) | |||
* Other Topics | |||
* [Using Eclipse with QMK](eclipse.md) | |||
* [Support](support.md) | |||
* QMK Internals (In Progress) | |||
* [Defines](internals_defines.md) | |||
* [Input Callback Reg](internals_input_callback_reg.md) | |||
* [Midi Device](internals_midi_device.md) | |||
* [Midi Device Setup Process](internals_midi_device_setup_process.md) | |||
* [Midi Util](internals_midi_util.md) | |||
* [Send Functions](internals_send_functions.md) | |||
* [Sysex Tools](internals_sysex_tools.md) |
@ -0,0 +1,21 @@ | |||
# Converting a board to use the Proton C | |||
If a board currently supported in QMK uses a Pro Micro (or compatible board) and you want to use the Proton C, you can generate the firmware by appending `CONVERT_TO_PROTON_C=yes` (or `CTPC=yes`) to your make argument, like this: | |||
make 40percentclub/mf68:default CTPC=yes | |||
You can add the same argument to your keymap's `rules.mk`, which will accomplish the same thing. | |||
This exposes the `CONVERT_TO_PROTON_C` flag that you can use in your code with `#ifdef`s, like this: | |||
#ifdef CONVERT_TO_PROTON_C | |||
// Proton C code | |||
#else | |||
// Pro Micro code | |||
#endif | |||
Before being able to compile, you may get some errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](internals_gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all. | |||
The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this like to your `config.h`: | |||
#define CONVERT_TO_PROTON_C_RXLED |
@ -0,0 +1,31 @@ | |||
#include QMK_KEYBOARD_H | |||
#include "switches.h" | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
LAYOUT_ortho_4x4( | |||
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, KC_NO | |||
) | |||
}; | |||
struct mechswitch switches[MATRIX_ROWS][MATRIX_COLS] = { | |||
{CHERRY_MX_BLUE, CHERRY_MX_RED, CHERRY_MX_BLACK, CHERRY_MX_BROWN}, | |||
{GATERON_BLUE, GATERON_RED, GATERON_BLACK, GATERON_BROWN}, | |||
{KAILH_BLUE, KAILH_RED, KAILH_BLACK, KAILH_BROWN}, | |||
{HAKO_CLEAR, HAKO_TRUE, HAKO_VIOLET, HAKO_ROYAL_TRUE} | |||
}; | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
uint8_t col = record->event.key.col; | |||
uint8_t row = record->event.key.row; | |||
if (record->event.pressed) { | |||
char name[MAX_SWITCH_NAME_LENGTH]; | |||
switch_name(switches[row][col], name); | |||
send_string(name); | |||
SEND_STRING("\n"); | |||
} | |||
return false; | |||
} |
@ -0,0 +1,5 @@ | |||
# Sweet16 as a switch tester | |||
This keymap uses the Sweet16 as a switch tester. The functionality outputs the switch name of whatever key the user pressed. | |||
the `switches` two-dimensional (4x4) array contains the switches attached to the macropad. The switches supported are defined as macros in the `switches.h` header file. |
@ -0,0 +1,12 @@ | |||
# Build Options | |||
# comment out to disable the options. | |||
# | |||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) | |||
MOUSEKEY_ENABLE = no # Mouse keys(+4700) | |||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | |||
CONSOLE_ENABLE = yes # Console for debug(+400) | |||
COMMAND_ENABLE = yes # Commands for debug and configuration | |||
NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | |||
RGBLIGHT_ENABLE = no | |||
SRC += switches.c |
@ -0,0 +1,99 @@ | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include "switches.h" | |||
static const char *BRAND_NAMES[] = { | |||
"Kailh", | |||
"Kailh Low Profile Choc", | |||
"Gateron", | |||
"Cherry MX", | |||
"Cherry ML", | |||
"Outemu", | |||
"Greetech", | |||
"Varmilo", | |||
"MOD", | |||
"Hako" | |||
}; | |||
static const char *COLOR_NAMES[] = { | |||
"", | |||
"White", | |||
"Black", | |||
"Blue", | |||
"Red", | |||
"Yellow", | |||
"Brown", | |||
"Green", | |||
"Clear", | |||
"Silver", | |||
"Nature White", | |||
"Grey", | |||
"Jade", | |||
"Navy", | |||
"Burnt Orange", | |||
"Pale Blue", | |||
"Dark Yellow", | |||
"Gold", | |||
"Chocolate White", | |||
"Burgundy", | |||
"Purple", | |||
"Light Green", | |||
"True", | |||
"Berry", | |||
"Plum", | |||
"Sage", | |||
"Violet", | |||
"L", | |||
"M", | |||
"H", | |||
"SH" | |||
}; | |||
static const char *VARIANT_NAMES[] = { | |||
"", | |||
"BOX", | |||
"BOX Thick", | |||
"BOX Heavy", | |||
"Silent", | |||
"Tactile", | |||
"Linear", | |||
"Speed", | |||
"Speed Heavy", | |||
"Speed Thick Click", | |||
"Pro", | |||
"Pro Heavy", | |||
"Royal", | |||
"Thick Click", | |||
"Heavy" | |||
}; | |||
const char *brand_name(struct mechswitch ms) { | |||
return BRAND_NAMES[ms.brand - 1]; | |||
} | |||
const char *variant_name(struct mechswitch ms) { | |||
return VARIANT_NAMES[ms.variant]; | |||
} | |||
const char *color_name(struct mechswitch ms) { | |||
return COLOR_NAMES[ms.color]; | |||
} | |||
void switch_name(struct mechswitch ms, char *buf) { | |||
const char *v_name = variant_name(ms); | |||
const char *c_name = color_name(ms); | |||
snprintf(buf, MAX_SWITCH_NAME_LENGTH, "%s", brand_name(ms)); | |||
strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf)); | |||
if (strlen(v_name) > 0) { | |||
strncat(buf, v_name, MAX_SWITCH_NAME_LENGTH - strlen(buf)); | |||
strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf)); | |||
} | |||
if (strlen(c_name) > 0) { | |||
strncat(buf, c_name, MAX_SWITCH_NAME_LENGTH - strlen(buf)); | |||
} | |||
} | |||
int bitfieldtoi(struct mechswitch ms) { | |||
return ((ms.brand << 9) | (ms.variant << 5) | ms.color); | |||
} |
@ -0,0 +1,189 @@ | |||
#pragma once | |||
struct mechswitch | |||
{ | |||
unsigned int brand: 4; | |||
unsigned int variant: 4; | |||
unsigned int color: 5; | |||
}; | |||
#define MAX_SWITCH_NAME_LENGTH 256 | |||
#define BRAND_KAILH 1 | |||
#define BRAND_KAILH_LOW 2 | |||
#define BRAND_GATERON 3 | |||
#define BRAND_CHERRY_MX 4 | |||
#define BRAND_CHERRY_ML 5 | |||
#define BRAND_OUTEMU 6 | |||
#define BRAND_GREETECH 7 | |||
#define BRAND_VARMILO 8 | |||
#define BRAND_MOD 9 | |||
#define BRAND_HAKO 10 | |||
#define COLOR_NO 0 | |||
#define COLOR_WHITE 1 | |||
#define COLOR_BLACK 2 | |||
#define COLOR_BLUE 3 | |||
#define COLOR_RED 4 | |||
#define COLOR_YELLOW 5 | |||
#define COLOR_BROWN 6 | |||
#define COLOR_GREEN 7 | |||
#define COLOR_CLEAR 8 | |||
#define COLOR_SILVER 9 | |||
#define COLOR_NATURE_WHITE 10 | |||
#define COLOR_GREY 11 | |||
#define COLOR_JADE 12 | |||
#define COLOR_NAVY 13 | |||
#define COLOR_BURNT_ORANGE 14 | |||
#define COLOR_PALE_BLUE 15 | |||
#define COLOR_DARK_YELLOW 16 | |||
#define COLOR_GOLD 17 | |||
#define COLOR_CHOCOLATE_WHITE 18 | |||
#define COLOR_BURGUNDY 19 | |||
#define COLOR_PURPLE 20 | |||
#define COLOR_LIGHT_GREEN 21 | |||
#define COLOR_TRUE 22 | |||
#define COLOR_BERRY 23 | |||
#define COLOR_PLUM 24 | |||
#define COLOR_SAGE 25 | |||
#define COLOR_VIOLET 26 | |||
#define COLOR_L 27 | |||
#define COLOR_M 28 | |||
#define COLOR_H 29 | |||
#define COLOR_SH 30 | |||
#define VARIANT_NO 0 | |||
#define VARIANT_BOX 1 | |||
#define VARIANT_BOX_THICK 2 | |||
#define VARIANT_BOX_HEAVY 3 | |||
#define VARIANT_SILENT 4 | |||
#define VARIANT_TACTILE 5 | |||
#define VARIANT_LINEAR 6 | |||
#define VARIANT_SPEED 7 | |||
#define VARIANT_SPEED_HEAVY 8 | |||
#define VARIANT_SPEED_CLICK_THICK 9 | |||
#define VARIANT_PRO 10 | |||
#define VARIANT_PRO_HEAVY 11 | |||
#define VARIANT_ROYAL 12 | |||
#define VARIANT_CLICK_THICK 13 | |||
#define CHERRY_MX_BLUE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BLUE} | |||
#define CHERRY_MX_RED {BRAND_CHERRY_MX, VARIANT_NO, COLOR_RED} | |||
#define CHERRY_MX_BROWN {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BROWN} | |||
#define CHERRY_MX_BLACK {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BLACK} | |||
#define CHERRY_MX_GREEN {BRAND_CHERRY_MX, VARIANT_NO, COLOR_GREEN} | |||
#define CHERRY_MX_CLEAR {BRAND_CHERRY_MX, VARIANT_NO, COLOR_CLEAR} | |||
#define CHERRY_MX_WHITE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_WHITE} | |||
#define CHERRY_MX_SILVER {BRAND_CHERRY_MX, VARIANT_NO, COLOR_SILVER} | |||
#define CHERRY_MX_NATURE_WHITE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_NATURE_WHITE} | |||
#define CHERRY_MX_SILENT_BLACK {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_BLACK} | |||
#define CHERRY_MX_SILENT_RED {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_RED} | |||
#define CHERRY_MX_TACTILE_BLACK {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_GREY} | |||
#define CHERRY_MX_LINEAR_BLACK {BRAND_CHERRY_MX, VARIANT_LINEAR, COLOR_GREY} | |||
#define CHERRY_ML {BRAND_CHERRY_ML, VARIANT_NO, COLOR_NO} | |||
#define GATERON_BLUE {BRAND_GATERON, VARIANT_NO, COLOR_BLUE} | |||
#define GATERON_BROWN {BRAND_GATERON, VARIANT_NO, COLOR_BROWN} | |||
#define GATERON_BLACK {BRAND_GATERON, VARIANT_NO, COLOR_BLACK} | |||
#define GATERON_RED {BRAND_GATERON, VARIANT_NO, COLOR_RED} | |||
#define GATERON_CLEAR {BRAND_GATERON, VARIANT_NO, COLOR_CLEAR} | |||
#define GATERON_GREEN {BRAND_GATERON, VARIANT_NO, COLOR_GREEN} | |||
#define GATERON_YELLOW {BRAND_GATERON, VARIANT_NO, COLOR_YELLOW} | |||
#define GATERON_SILENT_CLEAR {BRAND_GATERON, VARIANT_SILENT, COLOR_CLEAR} | |||
#define GATERON_SILENT_RED {BRAND_GATERON, VARIANT_SILENT, COLOR_RED} | |||
#define GATERON_SILENT_YELLOW {BRAND_GATERON, VARIANT_SILENT, COLOR_YELLOW} | |||
#define GATERON_SILENT_BLACK {BRAND_GATERON, VARIANT_SILENT, COLOR_BLACK} | |||
#define GATERON_SILENT_BROWN {BRAND_GATERON, VARIANT_SILENT, COLOR_BROWN} | |||
#define GREETECH_BLUE {BRAND_GREETECH, VARIANT_NO, COLOR_BLUE} | |||
#define GREETECH_BROWN {BRAND_GREETECH, VARIANT_NO, COLOR_BROWN} | |||
#define GREETECH_BLACK {BRAND_GREETECH, VARIANT_NO, COLOR_BLACK} | |||
#define GREETECH_RED {BRAND_GREETECH, VARIANT_NO, COLOR_RED} | |||
#define OUTEMU_BLUE {BRAND_OUTEMU, VARIANT_NO, COLOR_BLUE} | |||
#define OUTEMU_BROWN {BRAND_OUTEMU, VARIANT_NO, COLOR_BROWN} | |||
#define OUTEMU_BLACK {BRAND_OUTEMU, VARIANT_NO, COLOR_BLACK} | |||
#define OUTEMU_RED {BRAND_OUTEMU, VARIANT_NO, COLOR_RED} | |||
#define KAILH_BLUE {BRAND_KAILH, VARIANT_NO, COLOR_BLUE} | |||
#define KAILH_BROWN {BRAND_KAILH, VARIANT_NO, COLOR_BROWN} | |||
#define KAILH_BLACK {BRAND_KAILH, VARIANT_NO, COLOR_BLACK} | |||
#define KAILH_RED {BRAND_KAILH, VARIANT_NO, COLOR_RED} | |||
#define KAILH_GREEN {BRAND_KAILH, VARIANT_NO, COLOR_GREEN} | |||
#define KAILH_BOX_WHITE {BRAND_KAILH, VARIANT_BOX, COLOR_WHITE} | |||
#define KAILH_BOX_RED {BRAND_KAILH, VARIANT_BOX, COLOR_RED} | |||
#define KAILH_BOX_BLACK {BRAND_KAILH, VARIANT_BOX, COLOR_BLACK} | |||
#define KAILH_BOX_BROWN {BRAND_KAILH, VARIANT_BOX, COLOR_BROWN} | |||
#define KAILH_BOX_ROYAL {BRAND_KAILH, VARIANT_BOX, COLOR_ROYAL} | |||
#define KAILH_BOX_THICK_JADE {BRAND_KAILH, VARIANT_BOX_THICK, COLOR_JADE} | |||
#define KAILH_BOX_THICK_NAVY {BRAND_KAILH, VARIANT_BOX_THICK, COLOR_NAVY} | |||
#define KAILH_BOX_HEAVY_BURNT_ORANGE {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_BURNT_ORANGE} | |||
#define KAILH_BOX_HEAVY_PALE_BLUE {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_PALE_BLUE} | |||
#define KAILH_BOX_HEAVY_DARK_YELLOW {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_DARK_YELLOW} | |||
#define KAILH_SPEED_BRONZE {BRAND_KAILH, VARIANT_SPEED, COLOR_BRONZE} | |||
#define KAILH_SPEED_COPPER {BRAND_KAILH, VARIANT_SPEED, COLOR_COPPER} | |||
#define KAILH_SPEED_GOLD {BRAND_KAILH, VARIANT_SPEED, COLOR_GOLD} | |||
#define KAILH_SPEED_SILVER {BRAND_KAILH, VARIANT_SPEED, COLOR_SILVER} | |||
#define KAILH_SPEED_HEAVY_BURNT_ORANGE {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_BURNT_ORANGE} | |||
#define KAILH_SPEED_HEAVY_PALE_BLUE {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_PALE_BLUE} | |||
#define KAILH_SPEED_HEAVY_DARK_YELLOW {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_DARK_YELLOW} | |||
#define KAILH_SPEED_THICK_CLICK_NAVY {BRAND_KAILH, VARIANT_SPEED_CLICK_THICK, COLOR_NAVY} | |||
#define KAILH_PRO_BURGUNDY {BRAND_KAILH, VARIANT_PRO, COLOR_BURGUNDY} | |||
#define KAILH_PRO_PURPLE {BRAND_KAILH, VARIANT_PRO, COLOR_PURPLE} | |||
#define KAILH_PRO_LIGHT_GREEN {BRAND_KAILH, VARIANT_PRO, COLOR_LIGHT_GREEN} | |||
#define KAILH_PRO_HEAVY_BERRY {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_BERRY} | |||
#define KAILH_PRO_HEAVY_PLUM {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_PLUM} | |||
#define KAILH_PRO_GEAVY_SAGE {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_SAGE} | |||
#define KAILH_LOW_WHITE {BRAND_KAILH_LOW, VARIANT_NO, COLOR_WHITE} | |||
#define KAILH_LOW_BROWN {BRAND_KAILH_LOW, VARIANT_NO, COLOR_BROWN} | |||
#define KAILH_LOW_RED {BRAND_KAILH_LOW, VARIANT_NO, COLOR_RED} | |||
#define KAILH_LOW_CHOCOLATE_WHITE {BRAND_KAILH_LOW, VARIANT_NO, COLOR_CHOCOLATE_WHITE} | |||
#define KAILH_LOW_THICK_CLICK_NAVY {BRAND_KAILH_LOW, VARIANT_THICK_CLICK, COLOR_NAVY} | |||
#define KAILH_LOW_THICK_CLICK_JADE {BRAND_KAILH_LOW, VARIANT_THICK_CLICK, COLOR_JADE} | |||
#define KAILH_LOW_HEAVY_DARK_YELLOW {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_DARK_YELLOW} | |||
#define KAILH_LOW_HEAVY_BURNT_ORANGE {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_BURNT_ORANGE} | |||
#define KAILH_LOW_HEAVY_PALE_BLUE {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_PALE_BLUE} | |||
#define HAKO_ROYAL_CLEAR {BRAND_HAKO, VARIANT_ROYAL, COLOR_CLEAR} | |||
#define HAKO_ROYAL_TRUE {BRAND_HAKO, VARIANT_ROYAL, COLOR_TRUE} | |||
#define HAKO_CLEAR {BRAND_HAKO, VARIANT_NO, COLOR_CLEAR} | |||
#define HAKO_TRUE {BRAND_HAKO, VARIANT_NO, COLOR_TRUE} | |||
#define HAKO_VIOLET {BRAND_HAKO, VARIANT_NO, COLOR_VIOLET} | |||
#define MOD_L_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_L} | |||
#define MOD_M_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_M} | |||
#define MOD_H_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_H} | |||
#define MOD_SH_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_SH} | |||
#define MOD_L_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_L} | |||
#define MOD_M_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_M} | |||
#define MOD_H_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_H} | |||
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c" | |||
#define BYTE_TO_BINARY(byte) \ | |||
(byte & 0x80 ? '1' : '0'), \ | |||
(byte & 0x40 ? '1' : '0'), \ | |||
(byte & 0x20 ? '1' : '0'), \ | |||
(byte & 0x10 ? '1' : '0'), \ | |||
(byte & 0x08 ? '1' : '0'), \ | |||
(byte & 0x04 ? '1' : '0'), \ | |||
(byte & 0x02 ? '1' : '0'), \ | |||
(byte & 0x01 ? '1' : '0') | |||
const char *brand_name(struct mechswitch ms); | |||
const char *variant_name(struct mechswitch ms); | |||
const char *color_name(struct mechswitch ms); | |||
void switch_name(struct mechswitch ms, char *buf); | |||
int bitfieldtoi(struct mechswitch ms); |
@ -1,12 +1,74 @@ | |||
{ | |||
"keyboard_name": "foobar", | |||
"url": "", | |||
"maintainer": "qmk", | |||
"width": 15, | |||
"height": 5, | |||
"layouts": { | |||
"LAYOUT_60_ansi": { | |||
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] | |||
} | |||
"keyboard_name": "Luddite", | |||
"url": "", | |||
"maintainer": "qmk", | |||
"width": 15, | |||
"height": 5, | |||
"layouts": { | |||
"LAYOUT_60_ansi": { | |||
"layout": [ | |||
{"label":"`", "x":0, "y":0}, | |||
{"label":"1", "x":1, "y":0}, | |||
{"label":"2", "x":2, "y":0}, | |||
{"label":"3", "x":3, "y":0}, | |||
{"label":"4", "x":4, "y":0}, | |||
{"label":"5", "x":5, "y":0}, | |||
{"label":"6", "x":6, "y":0}, | |||
{"label":"7", "x":7, "y":0}, | |||
{"label":"8", "x":8, "y":0}, | |||
{"label":"9", "x":9, "y":0}, | |||
{"label":"0", "x":10, "y":0}, | |||
{"label":"-", "x":11, "y":0}, | |||
{"label":"=", "x":12, "y":0}, | |||
{"label":"Backspace", "x":13, "y":0, "w":2}, | |||
{"label":"Tab", "x":0, "y":1, "w":1.5}, | |||
{"label":"Q", "x":1.5, "y":1}, | |||
{"label":"W", "x":2.5, "y":1}, | |||
{"label":"E", "x":3.5, "y":1}, | |||
{"label":"R", "x":4.5, "y":1}, | |||
{"label":"T", "x":5.5, "y":1}, | |||
{"label":"Y", "x":6.5, "y":1}, | |||
{"label":"U", "x":7.5, "y":1}, | |||
{"label":"I", "x":8.5, "y":1}, | |||
{"label":"O", "x":9.5, "y":1}, | |||
{"label":"P", "x":10.5, "y":1}, | |||
{"label":"[", "x":11.5, "y":1}, | |||
{"label":"]", "x":12.5, "y":1}, | |||
{"label":"\\", "x":13.5, "y":1, "w":1.5}, | |||
{"label":"Caps Lock", "x":0, "y":2, "w":1.75}, | |||
{"label":"A", "x":1.75, "y":2}, | |||
{"label":"S", "x":2.75, "y":2}, | |||
{"label":"D", "x":3.75, "y":2}, | |||
{"label":"F", "x":4.75, "y":2}, | |||
{"label":"G", "x":5.75, "y":2}, | |||
{"label":"H", "x":6.75, "y":2}, | |||
{"label":"J", "x":7.75, "y":2}, | |||
{"label":"K", "x":8.75, "y":2}, | |||
{"label":"L", "x":9.75, "y":2}, | |||
{"label":";", "x":10.75, "y":2}, | |||
{"label":"'", "x":11.75, "y":2}, | |||
{"label":"Enter", "x":12.75, "y":2, "w":2.25}, | |||
{"label":"Shift", "x":0, "y":3, "w":2.25}, | |||
{"label":"Z", "x":2.25, "y":3}, | |||
{"label":"X", "x":3.25, "y":3}, | |||
{"label":"C", "x":4.25, "y":3}, | |||
{"label":"V", "x":5.25, "y":3}, | |||
{"label":"B", "x":6.25, "y":3}, | |||
{"label":"N", "x":7.25, "y":3}, | |||
{"label":"M", "x":8.25, "y":3}, | |||
{"label":",", "x":9.25, "y":3}, | |||
{"label":".", "x":10.25, "y":3}, | |||
{"label":"/", "x":11.25, "y":3}, | |||
{"label":"Shift", "x":12.25, "y":3, "w":2.75}, | |||
{"label":"Ctrl", "x":0, "y":4, "w":1.25}, | |||
{"label":"GUI", "x":1.25, "y":4, "w":1.25}, | |||
{"label":"Alt", "x":2.5, "y":4, "w":1.25}, | |||
{"label":"Space", "x":3.75, "y":4, "w":6.25}, | |||
{"label":"Alt", "x":10, "y":4, "w":1.25}, | |||
{"label":"GUI", "x":11.25, "y":4, "w":1.25}, | |||
{"label":"Menu", "x":12.5, "y":4, "w":1.25}, | |||
{"label":"Ctrl", "x":13.75, "y":4, "w":1.25} | |||
] | |||
} | |||
} | |||
} |
@ -1,3 +0,0 @@ | |||
ifndef QUANTUM_DIR | |||
include ../../../../Makefile | |||
endif |
@ -1,3 +0,0 @@ | |||
ifndef QUANTUM_DIR | |||
include ../../../../Makefile | |||
endif |
@ -0,0 +1,55 @@ | |||
/* | |||
Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include <string.h> | |||
#include "rgblight.h" | |||
#include "i2c_master.h" | |||
#include "quantum.h" | |||
#ifdef RGBLIGHT_ENABLE | |||
extern rgblight_config_t rgblight_config; | |||
void matrix_init_kb(void) { | |||
i2c_init(); | |||
// call user level keymaps, if any | |||
matrix_init_user(); | |||
} | |||
// custom RGB driver | |||
void rgblight_set(void) { | |||
if (!rgblight_config.enable) { | |||
memset(led, 0, 3 * RGBLED_NUM); | |||
} | |||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100); | |||
} | |||
bool rgb_init = false; | |||
void matrix_scan_kb(void) { | |||
// if LEDs were previously on before poweroff, turn them back on | |||
if (rgb_init == false && rgblight_config.enable) { | |||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100); | |||
rgb_init = true; | |||
} | |||
rgblight_task(); | |||
matrix_scan_user(); | |||
} | |||
#endif |
@ -0,0 +1,38 @@ | |||
/* | |||
Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
#include "quantum.h" | |||
#define LAYOUT( \ | |||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14, \ | |||
K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, \ | |||
K29, K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, \ | |||
K42, K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, \ | |||
K56, K57, K58, K59, K60, K61, K62, \ | |||
K63, K64, K65 \ | |||
) \ | |||
{ \ | |||
{ K00 , K01 , K02 , K03 , K04 , K05 , K06 , K07 , K08 , K09 , K10 , K11 , K12 , K13 , K14 }, \ | |||
{ K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 , K28 , KC_NO }, \ | |||
{ K29 , K30 , K31 , K32 , K33 , K34 , K35 , K36 , K37 , K38 , K39 , K40 , K41 , KC_NO, KC_NO }, \ | |||
{ K42 , K43 , K44 , K45 , K46 , K47 , K48 , K49 , K50 , K51 , K52 , K53 , K54 , K55 , KC_NO }, \ | |||
{ K56 , K57 , K58 , K59 , KC_NO, KC_NO, K60 , K61 , K62 , KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ | |||
{ K63 , K64 , K65 , KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ | |||
} | |||
@ -0,0 +1,42 @@ | |||
/* | |||
Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
#define VENDOR_ID 0x20A0 | |||
#define PRODUCT_ID 0x422E | |||
// TODO: share these strings with usbconfig.h | |||
// Edit usbconfig.h to change these. | |||
#define MANUFACTURER TGR | |||
#define PRODUCT TGR Alice | |||
/* matrix size */ | |||
#define MATRIX_ROWS 6 | |||
#define MATRIX_COLS 15 | |||
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5 } | |||
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, C1 } | |||
#define DIODE_DIRECTION COL2ROW | |||
#define RGBLED_NUM 20 | |||
#define RGBLIGHT_ANIMATIONS | |||
#define NO_UART 1 | |||
#define BOOTLOADHID_BOOTLOADER 1 | |||
/* key combination for command */ | |||
#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) |
@ -0,0 +1,12 @@ | |||
{ | |||
"keyboard_name": "TGR Alice", | |||
"url": "", | |||
"maintainer": "Felipe Coury", | |||
"width": 17.75, | |||
"height": 5, | |||
"layouts": { | |||
"LAYOUT": { | |||
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"~", "x":1.25, "y":0}, {"label":"!", "x":2.25, "y":0}, {"label":"@", "x":3.25, "y":0}, {"label":"#", "x":4.25, "y":0}, {"label":"$", "x":5.25, "y":0}, {"label":"%", "x":6.25, "y":0}, {"label":"^", "x":7.25, "y":0}, {"label":"&", "x":9.75, "y":0}, {"label":"*", "x":10.75, "y":0}, {"label":"(", "x":11.75, "y":0}, {"label":")", "x":12.75, "y":0}, {"label":"_", "x":13.75, "y":0}, {"label":"+", "x":14.75, "y":0}, {"label":"|", "x":15.75, "y":0}, {"label":"~", "x":16.75, "y":0}, {"label":"Insert", "x":0, "y":1}, {"label":"Tab", "x":1.25, "y":1, "w":1.5}, {"label":"Q", "x":2.75, "y":1}, {"label":"W", "x":3.75, "y":1}, {"label":"E", "x":4.75, "y":1}, {"label":"R", "x":5.75, "y":1}, {"label":"T", "x":6.75, "y":1}, {"label":"Y", "x":9.25, "y":1}, {"label":"U", "x":10.25, "y":1}, {"label":"I", "x":11.25, "y":1}, {"label":"O", "x":12.25, "y":1}, {"label":"P", "x":13.25, "y":1}, {"label":"{", "x":14.25, "y":1}, {"label":"}", "x":15.25, "y":1}, {"label":"Backspace", "x":16.25, "y":1, "w":1.5}, {"label":"Delete", "x":0, "y":2}, {"label":"Caps Lock", "x":1.25, "y":2, "w":1.75}, {"label":"A", "x":3, "y":2}, {"label":"S", "x":4, "y":2}, {"label":"D", "x":5, "y":2}, {"label":"F", "x":6, "y":2}, {"label":"G", "x":7, "y":2}, {"label":"H", "x":9.5, "y":2}, {"label":"J", "x":10.5, "y":2}, {"label":"K", "x":11.5, "y":2}, {"label":"L", "x":12.5, "y":2}, {"label":":", "x":13.5, "y":2}, {"label":"\"", "x":14.5, "y":2}, {"label":"Enter", "x":15.5, "y":2, "w":2.25}, {"label":"Shift", "x":1.25, "y":3, "w":2.25}, {"label":"Z", "x":3.5, "y":3}, {"label":"X", "x":4.5, "y":3}, {"label":"C", "x":5.5, "y":3}, {"label":"V", "x":6.5, "y":3}, {"label":"B", "x":9, "y":3}, {"label":"N", "x":10, "y":3}, {"label":"M", "x":11, "y":3}, {"label":"<", "x":12, "y":3}, {"label":">", "x":13, "y":3}, {"label":"?", "x":14, "y":3}, {"label":"Shift", "x":15, "y":3, "w":1.75}, {"label":"Fn", "x":16.75, "y":3}, {"label":"Ctrl", "x":1.25, "y":4, "w":1.5}, {"label":"Alt", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":2.25}, {"label":"Win", "x":7.25, "y":4, "w":1.25}, {"x":9, "y":4, "w":2.75}, {"label":"Alt", "x":11.75, "y":4, "w":1.5}, {"label":"Ctrl", "x":16.25, "y":4, "w":1.5}] | |||
} | |||
} | |||
} |
@ -0,0 +1,37 @@ | |||
/* | |||
Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT( | |||
KC_GESC, 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_GRV, KC_BSLS, \ | |||
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_BSPC, \ | |||
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ | |||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), \ | |||
KC_LGUI, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, \ | |||
KC_ESC, KC_PGUP, KC_PGDN \ | |||
), | |||
[1] = LAYOUT( | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP , _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, \ | |||
_______, _______, _______ \ | |||
), | |||
}; |
@ -0,0 +1,37 @@ | |||
/* | |||
Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT( | |||
KC_GESC, 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_GRV, KC_BSLS, \ | |||
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_BSPC, \ | |||
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ | |||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), \ | |||
KC_LGUI, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, \ | |||
KC_ESC, KC_PGUP, KC_PGDN \ | |||
), | |||
[1] = LAYOUT( | |||
KC_GRV , 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, KC_INS, \ | |||
_______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, KC_UP , _______, _______, \ | |||
_______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______, \ | |||
_______, _______, _______, _______, _______, _______, _______, \ | |||
RESET, _______, _______ \ | |||
), | |||
}; |
@ -0,0 +1,106 @@ | |||
#!/usr/bin/env python | |||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>, Sebastian Kaim <sebb@sebb767.de> | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 2 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
from __future__ import print_function | |||
import os | |||
import sys | |||
import time | |||
import usb | |||
def checkForKeyboardInNormalMode(): | |||
"""Returns a device if a ps2avrGB device in normal made (that is in keyboard mode) or None if it is not found.""" | |||
return usb.core.find(idVendor=0x20A0, idProduct=0x422D) | |||
def checkForKeyboardInBootloaderMode(): | |||
"""Returns True if a ps2avrGB device in bootloader (flashable) mode is found and False otherwise.""" | |||
return (usb.core.find(idVendor=0x16c0, idProduct=0x05df) is not None) | |||
def flashKeyboard(firmware_file): | |||
"""Calls bootloadHID to flash the given file to the device.""" | |||
print('Flashing firmware to device ...') | |||
if os.system('bootloadHID -r "%s"' % firmware_file) == 0: | |||
print('\nDone!') | |||
else: | |||
print('\nbootloadHID returned an error.') | |||
def printDeviceInfo(dev): | |||
"""Prints all infos for a given USB device""" | |||
print('Device Information:') | |||
print(' idVendor: %d (0x%04x)' % (dev.idVendor, dev.idVendor)) | |||
print(' idProduct: %d (0x%04x)' % (dev.idProduct, dev.idProduct)) | |||
print('Manufacturer: %s' % (dev.iManufacturer)) | |||
print('Serial: %s' % (dev.iSerialNumber)) | |||
print('Product: %s' % (dev.iProduct), end='\n\n') | |||
def sendDeviceToBootloaderMode(dev): | |||
"""Tries to send a given ps2avrGB keyboard to bootloader mode to allow flashing.""" | |||
try: | |||
dev.set_configuration() | |||
request_type = usb.util.build_request_type( | |||
usb.util.CTRL_OUT, | |||
usb.util.CTRL_TYPE_CLASS, | |||
usb.util.CTRL_RECIPIENT_DEVICE) | |||
USBRQ_HID_SET_REPORT = 0x09 | |||
HID_REPORT_OPTION = 0x0301 | |||
dev.ctrl_transfer(request_type, USBRQ_HID_SET_REPORT, HID_REPORT_OPTION, 0, [0, 0, 0xFF] + [0] * 5) | |||
except usb.core.USBError: | |||
# for some reason I keep getting USBError, but it works! | |||
pass | |||
if len(sys.argv) < 2: | |||
print('Usage: %s <firmware.hex>' % sys.argv[0]) | |||
sys.exit(1) | |||
kb = checkForKeyboardInNormalMode() | |||
if kb is not None: | |||
print('Found a keyboard in normal mode. Attempting to send it to bootloader mode ...', end='') | |||
printDeviceInfo(kb) | |||
sendDeviceToBootloaderMode(kb) | |||
print(' done.') | |||
print("Hint: If your keyboard can't be set to bootloader mode automatically, plug it in while pressing the bootloader key to do so manually.") | |||
print(" You can find more infos about this here: https://github.com/qmk/qmk_firmware/tree/master/keyboards/ps2avrGB#setting-the-board-to-bootloader-mode") | |||
attempts = 12 # 60 seconds | |||
found = False | |||
for attempt in range(1, attempts + 1): | |||
print("Searching for keyboard in bootloader mode (%i/%i) ... " % (attempt, attempts), end='') | |||
if checkForKeyboardInBootloaderMode(): | |||
print('Found', end='\n\n') | |||
flashKeyboard(sys.argv[1]) | |||
found = True | |||
break | |||
else: | |||
print('Nothing.', end='') | |||
if attempt != attempts: # no need to wait on the last attempt | |||
print(' Sleeping 5 seconds.', end='') | |||
time.sleep(5) | |||
# print a newline | |||
print() | |||
if not found: | |||
print("Couldn't find a flashable keyboard. Aborting.") | |||
sys.exit(2) | |||
@ -0,0 +1,60 @@ | |||
# TGR Alice | |||
![TGR Alice](https://i.imgur.com/cJohEqS.jpg) | |||
An ergonomic 60% keyboard. | |||
Keyboard Maintainer: [Felipe Coury](https://github.com/fcoury) | |||
Hardware Supported: TGR Alice | |||
Hardware Availability: Group buy finished | |||
Make example for this keyboard (after setting up your build environment): | |||
make alice:default | |||
See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. | |||
ps2avrGB keyboard firmware | |||
========================== | |||
This keyboard uses the port of the QMK firmware for boards that are based on the | |||
ps2avrGB firmware. | |||
Note that this is a complete replacement for the firmware, so you won't be | |||
using Bootmapper Client to change any keyboard settings, since not all the | |||
USB report options are supported. | |||
## Installing | |||
First, install the requirements. These commands are for OSX, but all you | |||
need is the AVR toolchain and `bootloadHID` for flashing: | |||
``` | |||
$ brew cask install crosspack-avr | |||
$ brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb | |||
$ pip install pyusb | |||
``` | |||
Then, with the keyboard plugged in, simply run this command from the | |||
`qmk_firmware` directory: | |||
``` | |||
$ make alice | |||
$ bootloadHID -r alice_default.hex | |||
``` | |||
## Setting the board to bootloader mode | |||
Hold the ESC key (the one before the 1! key, in case you remaped it). | |||
## Troubleshooting | |||
From my experience, it's really hard to brick these boards. But these | |||
tricks have been useful when it got stuck in a weird scenario. | |||
1. Try plugging the board in while holding the bootloader key. This will force | |||
it to boot only the bootloader without loading the firmware. Once this is | |||
done, just reflash the board with the original firmware. | |||
2. Sometimes USB hubs can act weird, so try connecting the board directly | |||
to your computer or plugging/unplugging the USB hub. |
@ -0,0 +1,48 @@ | |||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 2 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
# MCU name | |||
MCU = atmega32a | |||
PROTOCOL = VUSB | |||
# unsupported features for now | |||
NO_UART = yes | |||
NO_SUSPEND_POWER_DOWN = yes | |||
# processor frequency | |||
F_CPU = 12000000 | |||
# Bootloader | |||
# This definition is optional, and if your keyboard supports multiple bootloaders of | |||
# different sizes, comment this out, and the correct address will be loaded | |||
# automatically (+60). See bootloader.mk for all options. | |||
BOOTLOADER = bootloadHID | |||
# build options | |||
BOOTMAGIC_ENABLE = full | |||
MOUSEKEY_ENABLE = no | |||
EXTRAKEY_ENABLE = yes | |||
CONSOLE_ENABLE = yes | |||
COMMAND_ENABLE = yes | |||
BACKLIGHT_ENABLE = no | |||
RGBLIGHT_ENABLE = yes | |||
RGBLIGHT_CUSTOM_DRIVER = yes | |||
OPT_DEFS = -DDEBUG_LEVEL=0 | |||
SRC += i2c_master.c | |||
# programming options | |||
PROGRAM_CMD = ./keyboards/ps2avrGB/program $(TARGET).hex |
@ -0,0 +1,396 @@ | |||
/* Name: usbconfig.h | |||
* Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers | |||
* Author: Christian Starkjohann | |||
* Creation Date: 2005-04-01 | |||
* Tabsize: 4 | |||
* Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH | |||
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) | |||
* This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ | |||
*/ | |||
#ifndef __usbconfig_h_included__ | |||
#define __usbconfig_h_included__ | |||
#include "config.h" | |||
/* | |||
General Description: | |||
This file is an example configuration (with inline documentation) for the USB | |||
driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is | |||
also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may | |||
wire the lines to any other port, as long as D+ is also wired to INT0 (or any | |||
other hardware interrupt, as long as it is the highest level interrupt, see | |||
section at the end of this file). | |||
*/ | |||
/* ---------------------------- Hardware Config ---------------------------- */ | |||
#define USB_CFG_IOPORTNAME D | |||
/* This is the port where the USB bus is connected. When you configure it to | |||
* "B", the registers PORTB, PINB and DDRB will be used. | |||
*/ | |||
#define USB_CFG_DMINUS_BIT 3 | |||
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. | |||
* This may be any bit in the port. | |||
*/ | |||
#define USB_CFG_DPLUS_BIT 2 | |||
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. | |||
* This may be any bit in the port. Please note that D+ must also be connected | |||
* to interrupt pin INT0! [You can also use other interrupts, see section | |||
* "Optional MCU Description" below, or you can connect D- to the interrupt, as | |||
* it is required if you use the USB_COUNT_SOF feature. If you use D- for the | |||
* interrupt, the USB interrupt will also be triggered at Start-Of-Frame | |||
* markers every millisecond.] | |||
*/ | |||
#define USB_CFG_CLOCK_KHZ (F_CPU/1000) | |||
/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, | |||
* 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code | |||
* require no crystal, they tolerate +/- 1% deviation from the nominal | |||
* frequency. All other rates require a precision of 2000 ppm and thus a | |||
* crystal! | |||
* Since F_CPU should be defined to your actual clock rate anyway, you should | |||
* not need to modify this setting. | |||
*/ | |||
#define USB_CFG_CHECK_CRC 0 | |||
/* Define this to 1 if you want that the driver checks integrity of incoming | |||
* data packets (CRC checks). CRC checks cost quite a bit of code size and are | |||
* currently only available for 18 MHz crystal clock. You must choose | |||
* USB_CFG_CLOCK_KHZ = 18000 if you enable this option. | |||
*/ | |||
/* ----------------------- Optional Hardware Config ------------------------ */ | |||
/* #define USB_CFG_PULLUP_IOPORTNAME D */ | |||
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of | |||
* V+, you can connect and disconnect the device from firmware by calling | |||
* the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). | |||
* This constant defines the port on which the pullup resistor is connected. | |||
*/ | |||
/* #define USB_CFG_PULLUP_BIT 4 */ | |||
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined | |||
* above) where the 1.5k pullup resistor is connected. See description | |||
* above for details. | |||
*/ | |||
/* --------------------------- Functional Range ---------------------------- */ | |||
#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 | |||
/* Define this to 1 if you want to compile a version with two endpoints: The | |||
* default control endpoint 0 and an interrupt-in endpoint (any other endpoint | |||
* number). | |||
*/ | |||
#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 | |||
/* Define this to 1 if you want to compile a version with three endpoints: The | |||
* default control endpoint 0, an interrupt-in endpoint 3 (or the number | |||
* configured below) and a catch-all default interrupt-in endpoint as above. | |||
* You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. | |||
*/ | |||
#define USB_CFG_EP3_NUMBER 3 | |||
/* If the so-called endpoint 3 is used, it can now be configured to any other | |||
* endpoint number (except 0) with this macro. Default if undefined is 3. | |||
*/ | |||
/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ | |||
/* The above macro defines the startup condition for data toggling on the | |||
* interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. | |||
* Since the token is toggled BEFORE sending any data, the first packet is | |||
* sent with the oposite value of this configuration! | |||
*/ | |||
#define USB_CFG_IMPLEMENT_HALT 0 | |||
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature | |||
* for endpoint 1 (interrupt endpoint). Although you may not need this feature, | |||
* it is required by the standard. We have made it a config option because it | |||
* bloats the code considerably. | |||
*/ | |||
#define USB_CFG_SUPPRESS_INTR_CODE 0 | |||
/* Define this to 1 if you want to declare interrupt-in endpoints, but don't | |||
* want to send any data over them. If this macro is defined to 1, functions | |||
* usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if | |||
* you need the interrupt-in endpoints in order to comply to an interface | |||
* (e.g. HID), but never want to send any data. This option saves a couple | |||
* of bytes in flash memory and the transmit buffers in RAM. | |||
*/ | |||
#define USB_CFG_INTR_POLL_INTERVAL 1 | |||
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll | |||
* interval. The value is in milliseconds and must not be less than 10 ms for | |||
* low speed devices. | |||
*/ | |||
#define USB_CFG_IS_SELF_POWERED 0 | |||
/* Define this to 1 if the device has its own power supply. Set it to 0 if the | |||
* device is powered from the USB bus. | |||
*/ | |||
#define USB_CFG_MAX_BUS_POWER 500 | |||
/* Set this variable to the maximum USB bus power consumption of your device. | |||
* The value is in milliamperes. [It will be divided by two since USB | |||
* communicates power requirements in units of 2 mA.] | |||
*/ | |||
#define USB_CFG_IMPLEMENT_FN_WRITE 1 | |||
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out | |||
* transfers. Set it to 0 if you don't need it and want to save a couple of | |||
* bytes. | |||
*/ | |||
#define USB_CFG_IMPLEMENT_FN_READ 0 | |||
/* Set this to 1 if you need to send control replies which are generated | |||
* "on the fly" when usbFunctionRead() is called. If you only want to send | |||
* data from a static buffer, set it to 0 and return the data from | |||
* usbFunctionSetup(). This saves a couple of bytes. | |||
*/ | |||
#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 | |||
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. | |||
* You must implement the function usbFunctionWriteOut() which receives all | |||
* interrupt/bulk data sent to any endpoint other than 0. The endpoint number | |||
* can be found in 'usbRxToken'. | |||
*/ | |||
#define USB_CFG_HAVE_FLOWCONTROL 0 | |||
/* Define this to 1 if you want flowcontrol over USB data. See the definition | |||
* of the macros usbDisableAllRequests() and usbEnableAllRequests() in | |||
* usbdrv.h. | |||
*/ | |||
#define USB_CFG_DRIVER_FLASH_PAGE 0 | |||
/* If the device has more than 64 kBytes of flash, define this to the 64 k page | |||
* where the driver's constants (descriptors) are located. Or in other words: | |||
* Define this to 1 for boot loaders on the ATMega128. | |||
*/ | |||
#define USB_CFG_LONG_TRANSFERS 0 | |||
/* Define this to 1 if you want to send/receive blocks of more than 254 bytes | |||
* in a single control-in or control-out transfer. Note that the capability | |||
* for long transfers increases the driver size. | |||
*/ | |||
/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ | |||
/* This macro is a hook if you want to do unconventional things. If it is | |||
* defined, it's inserted at the beginning of received message processing. | |||
* If you eat the received message and don't want default processing to | |||
* proceed, do a return after doing your things. One possible application | |||
* (besides debugging) is to flash a status LED on each packet. | |||
*/ | |||
/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ | |||
/* This macro is a hook if you need to know when an USB RESET occurs. It has | |||
* one parameter which distinguishes between the start of RESET state and its | |||
* end. | |||
*/ | |||
/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ | |||
/* This macro (if defined) is executed when a USB SET_ADDRESS request was | |||
* received. | |||
*/ | |||
#define USB_COUNT_SOF 1 | |||
/* define this macro to 1 if you need the global variable "usbSofCount" which | |||
* counts SOF packets. This feature requires that the hardware interrupt is | |||
* connected to D- instead of D+. | |||
*/ | |||
/* #ifdef __ASSEMBLER__ | |||
* macro myAssemblerMacro | |||
* in YL, TCNT0 | |||
* sts timer0Snapshot, YL | |||
* endm | |||
* #endif | |||
* #define USB_SOF_HOOK myAssemblerMacro | |||
* This macro (if defined) is executed in the assembler module when a | |||
* Start Of Frame condition is detected. It is recommended to define it to | |||
* the name of an assembler macro which is defined here as well so that more | |||
* than one assembler instruction can be used. The macro may use the register | |||
* YL and modify SREG. If it lasts longer than a couple of cycles, USB messages | |||
* immediately after an SOF pulse may be lost and must be retried by the host. | |||
* What can you do with this hook? Since the SOF signal occurs exactly every | |||
* 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in | |||
* designs running on the internal RC oscillator. | |||
* Please note that Start Of Frame detection works only if D- is wired to the | |||
* interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! | |||
*/ | |||
#define USB_CFG_CHECK_DATA_TOGGLING 0 | |||
/* define this macro to 1 if you want to filter out duplicate data packets | |||
* sent by the host. Duplicates occur only as a consequence of communication | |||
* errors, when the host does not receive an ACK. Please note that you need to | |||
* implement the filtering yourself in usbFunctionWriteOut() and | |||
* usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable | |||
* for each control- and out-endpoint to check for duplicate packets. | |||
*/ | |||
#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 | |||
/* define this macro to 1 if you want the function usbMeasureFrameLength() | |||
* compiled in. This function can be used to calibrate the AVR's RC oscillator. | |||
*/ | |||
#define USB_USE_FAST_CRC 0 | |||
/* The assembler module has two implementations for the CRC algorithm. One is | |||
* faster, the other is smaller. This CRC routine is only used for transmitted | |||
* messages where timing is not critical. The faster routine needs 31 cycles | |||
* per byte while the smaller one needs 61 to 69 cycles. The faster routine | |||
* may be worth the 32 bytes bigger code size if you transmit lots of data and | |||
* run the AVR close to its limit. | |||
*/ | |||
/* -------------------------- Device Description --------------------------- */ | |||
#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) | |||
/* USB vendor ID for the device, low byte first. If you have registered your | |||
* own Vendor ID, define it here. Otherwise you may use one of obdev's free | |||
* shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! | |||
* *** IMPORTANT NOTE *** | |||
* This template uses obdev's shared VID/PID pair for Vendor Class devices | |||
* with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand | |||
* the implications! | |||
*/ | |||
#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) | |||
/* This is the ID of the product, low byte first. It is interpreted in the | |||
* scope of the vendor ID. If you have registered your own VID with usb.org | |||
* or if you have licensed a PID from somebody else, define it here. Otherwise | |||
* you may use one of obdev's free shared VID/PID pairs. See the file | |||
* USB-IDs-for-free.txt for details! | |||
* *** IMPORTANT NOTE *** | |||
* This template uses obdev's shared VID/PID pair for Vendor Class devices | |||
* with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand | |||
* the implications! | |||
*/ | |||
#define USB_CFG_DEVICE_VERSION 0x00, 0x02 | |||
/* Version number of the device: Minor number first, then major number. | |||
*/ | |||
#define USB_CFG_VENDOR_NAME 'T', 'G', 'R' | |||
#define USB_CFG_VENDOR_NAME_LEN 3 | |||
/* These two values define the vendor name returned by the USB device. The name | |||
* must be given as a list of characters under single quotes. The characters | |||
* are interpreted as Unicode (UTF-16) entities. | |||
* If you don't want a vendor name string, undefine these macros. | |||
* ALWAYS define a vendor name containing your Internet domain name if you use | |||
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for | |||
* details. | |||
*/ | |||
#define USB_CFG_DEVICE_NAME 'T', 'G', 'R', ' ', 'A', 'l', 'i', 'c', 'e' | |||
#define USB_CFG_DEVICE_NAME_LEN 9 | |||
/* Same as above for the device name. If you don't want a device name, undefine | |||
* the macros. See the file USB-IDs-for-free.txt before you assign a name if | |||
* you use a shared VID/PID. | |||
*/ | |||
/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ | |||
/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ | |||
/* Same as above for the serial number. If you don't want a serial number, | |||
* undefine the macros. | |||
* It may be useful to provide the serial number through other means than at | |||
* compile time. See the section about descriptor properties below for how | |||
* to fine tune control over USB descriptors such as the string descriptor | |||
* for the serial number. | |||
*/ | |||
#define USB_CFG_DEVICE_CLASS 0 | |||
#define USB_CFG_DEVICE_SUBCLASS 0 | |||
/* See USB specification if you want to conform to an existing device class. | |||
* Class 0xff is "vendor specific". | |||
*/ | |||
#define USB_CFG_INTERFACE_CLASS 3 /* HID */ | |||
#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ | |||
#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ | |||
/* See USB specification if you want to conform to an existing device class or | |||
* protocol. The following classes must be set at interface level: | |||
* HID class is 3, no subclass and protocol required (but may be useful!) | |||
* CDC class is 2, use subclass 2 and protocol 1 for ACM | |||
*/ | |||
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 | |||
/* Define this to the length of the HID report descriptor, if you implement | |||
* an HID device. Otherwise don't define it or define it to 0. | |||
* If you use this define, you must add a PROGMEM character array named | |||
* "usbHidReportDescriptor" to your code which contains the report descriptor. | |||
* Don't forget to keep the array and this define in sync! | |||
*/ | |||
/* #define USB_PUBLIC static */ | |||
/* Use the define above if you #include usbdrv.c instead of linking against it. | |||
* This technique saves a couple of bytes in flash memory. | |||
*/ | |||
/* ------------------- Fine Control over USB Descriptors ------------------- */ | |||
/* If you don't want to use the driver's default USB descriptors, you can | |||
* provide our own. These can be provided as (1) fixed length static data in | |||
* flash memory, (2) fixed length static data in RAM or (3) dynamically at | |||
* runtime in the function usbFunctionDescriptor(). See usbdrv.h for more | |||
* information about this function. | |||
* Descriptor handling is configured through the descriptor's properties. If | |||
* no properties are defined or if they are 0, the default descriptor is used. | |||
* Possible properties are: | |||
* + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched | |||
* at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is | |||
* used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if | |||
* you want RAM pointers. | |||
* + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found | |||
* in static memory is in RAM, not in flash memory. | |||
* + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), | |||
* the driver must know the descriptor's length. The descriptor itself is | |||
* found at the address of a well known identifier (see below). | |||
* List of static descriptor names (must be declared PROGMEM if in flash): | |||
* char usbDescriptorDevice[]; | |||
* char usbDescriptorConfiguration[]; | |||
* char usbDescriptorHidReport[]; | |||
* char usbDescriptorString0[]; | |||
* int usbDescriptorStringVendor[]; | |||
* int usbDescriptorStringDevice[]; | |||
* int usbDescriptorStringSerialNumber[]; | |||
* Other descriptors can't be provided statically, they must be provided | |||
* dynamically at runtime. | |||
* | |||
* Descriptor properties are or-ed or added together, e.g.: | |||
* #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) | |||
* | |||
* The following descriptors are defined: | |||
* USB_CFG_DESCR_PROPS_DEVICE | |||
* USB_CFG_DESCR_PROPS_CONFIGURATION | |||
* USB_CFG_DESCR_PROPS_STRINGS | |||
* USB_CFG_DESCR_PROPS_STRING_0 | |||
* USB_CFG_DESCR_PROPS_STRING_VENDOR | |||
* USB_CFG_DESCR_PROPS_STRING_PRODUCT | |||
* USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER | |||
* USB_CFG_DESCR_PROPS_HID | |||
* USB_CFG_DESCR_PROPS_HID_REPORT | |||
* USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) | |||
* | |||
* Note about string descriptors: String descriptors are not just strings, they | |||
* are Unicode strings prefixed with a 2 byte header. Example: | |||
* int serialNumberDescriptor[] = { | |||
* USB_STRING_DESCRIPTOR_HEADER(6), | |||
* 'S', 'e', 'r', 'i', 'a', 'l' | |||
* }; | |||
*/ | |||
#define USB_CFG_DESCR_PROPS_DEVICE 0 | |||
#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC | |||
//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 | |||
#define USB_CFG_DESCR_PROPS_STRINGS 0 | |||
#define USB_CFG_DESCR_PROPS_STRING_0 0 | |||
#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 | |||
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 | |||
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 | |||
#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC | |||
//#define USB_CFG_DESCR_PROPS_HID 0 | |||
#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC | |||
//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 | |||
#define USB_CFG_DESCR_PROPS_UNKNOWN 0 | |||
#define usbMsgPtr_t unsigned short | |||
/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to | |||
* a scalar type here because gcc generates slightly shorter code for scalar | |||
* arithmetics than for pointer arithmetics. Remove this define for backward | |||
* type compatibility or define it to an 8 bit type if you use data in RAM only | |||
* and all RAM is below 256 bytes (tiny memory model in IAR CC). | |||
*/ | |||
/* ----------------------- Optional MCU Description ------------------------ */ | |||
/* The following configurations have working defaults in usbdrv.h. You | |||
* usually don't need to set them explicitly. Only if you want to run | |||
* the driver on a device which is not yet supported or with a compiler | |||
* which is not fully supported (such as IAR C) or if you use a differnt | |||
* interrupt than INT0, you may have to define some of these. | |||
*/ | |||
/* #define USB_INTR_CFG MCUCR */ | |||
/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ | |||
/* #define USB_INTR_CFG_CLR 0 */ | |||
/* #define USB_INTR_ENABLE GIMSK */ | |||
/* #define USB_INTR_ENABLE_BIT INT0 */ | |||
/* #define USB_INTR_PENDING GIFR */ | |||
/* #define USB_INTR_PENDING_BIT INTF0 */ | |||
/* #define USB_INTR_VECTOR INT0_vect */ | |||
/* Set INT1 for D- falling edge to count SOF */ | |||
/* #define USB_INTR_CFG EICRA */ | |||
#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) | |||
/* #define USB_INTR_CFG_CLR 0 */ | |||
/* #define USB_INTR_ENABLE EIMSK */ | |||
#define USB_INTR_ENABLE_BIT INT1 | |||
/* #define USB_INTR_PENDING EIFR */ | |||
#define USB_INTR_PENDING_BIT INTF1 | |||
#define USB_INTR_VECTOR INT1_vect | |||
#endif /* __usbconfig_h_included__ */ |
@ -0,0 +1,35 @@ | |||
# Alpha 28-Key Keyboard Alternate Keymap | |||
Alternate keymap for [Alpha 28-key keyboard](https://github.com/qmk/qmk_firmware/tree/master/keyboards/alpha). | |||
## How-to | |||
Assuming you've followed all the instructions from the original post, put my "keymap.c" file in "$qmk-firmware-folder$/keyboards/alpha/keymaps/vderm/" and then run your make command ("make alpha:vderm" while in $qmk-firmware-folder$ where this folder is what you've downloaded from the official github page) to compile the hex file to upload to your microcontroller. I've also uploaded my hex file. | |||
## Description | |||
Instead of going up and down layers like in the original Alpha keyboard, I've made the bottom row keys all have alternate functions: | |||
+ Like in the original Alpha28 keymap, the 2U spacebar is a shift key when held down and space when tapped | |||
+ Z and M are Ctrl keys when held down or Z and M when tapped | |||
+ X and N are Alt keys | |||
+ C activates the function keys layer (arrows, page up/dn, esc, tab, etc.) | |||
+ V activates the characters and numbers layer | |||
+ C and V combined activated the F-keys layer (F1, F2, F3, etc.) | |||
+ The enter key is an enter key in the home layer, backspace in the function keys and characters/numbers layer and a delete in the F-keys layer | |||
+ While in the other layers, the bottom row acts like a "regular" bottom modified row: ctrl, alt, winkey | |||
## Keymap | |||
![keymap](https://imgur.com/ZbDz0eL.jpg) | |||
## Build Images | |||
Here is my keyboard. | |||
+ Switches: Aliaz Silent Switches (Tactile), PCB mount, 80g from [KBDfans](https://kbdfans.cn/collections/aliaz-switches/products/pre-orderaliaz-silent-switch-tactile?variant=2519899832333) | |||
+ PCB board: ordered from JLCPCB, in white | |||
+ Keycaps: ebay, can't find link :S | |||
+ Bottom plate: I cut a piece of canary wood that was laying around, needs to be varnished; I also need to actually screw the pcb to the wood instead of relying on double-sided tape | |||
![vderm_alpha0](https://imgur.com/MjjoVtr.jpg) | |||
![vderm_alpha1](https://imgur.com/mIFu9WV.jpg) | |||
![vderm_alpha2](https://imgur.com/A70Iemw.jpg) | |||
![vderm_alpha3](https://imgur.com/eYljPWh.jpg) | |||
![vderm_alpha4](https://imgur.com/OhUKowj.jpg) | |||
Good luck on your build! | |||
//vderm |
@ -0,0 +1,34 @@ | |||
#include QMK_KEYBOARD_H | |||
#define HOME 0 | |||
#define FN 1 | |||
#define FNCHAR 2 | |||
#define FKEYS 3 | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[HOME] = LAYOUT( | |||
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, | |||
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, | |||
MT(MOD_LCTL, KC_Z), MT(MOD_LALT, KC_X), LT(1, KC_C), LT(2, KC_V), MT(MOD_LSFT, KC_SPC), MT(MOD_RGUI,KC_B), MT(MOD_RALT, KC_N), MT(MOD_RCTL, KC_M)), | |||
[FN] = LAYOUT( | |||
KC_ESC, KC__MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_NO, | |||
KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_BSPC, | |||
KC_LCTL, KC_LALT, KC_TRNS, MO(3), MT(MOD_LSFT, KC_SPC), KC_RGUI, KC_RALT, KC_RCTL), | |||
[FNCHAR] = LAYOUT( | |||
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, | |||
KC_GRV,KC_NO,KC_MINS,KC_EQL,KC_BSLS,KC_LBRC,KC_RBRC,KC_SCLN,KC_QUOT,KC_BSPC, | |||
KC_LCTL, KC_LALT, MO(3), KC_TRNS, MT(MOD_LSFT, KC_SPC), KC_COMM, KC_DOT, KC_SLSH), | |||
[FKEYS] = LAYOUT( | |||
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_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_DEL, | |||
KC_LCTL, KC_LALT, KC_TRNS, KC_TRNS, MT(MOD_LSFT, KC_SPC), KC_RGUI, KC_RALT, KC_RCTL), | |||
}; | |||
void matrix_init_user(void) { | |||
} | |||
void matrix_scan_user(void) { | |||
} |
@ -0,0 +1,26 @@ | |||
#include QMK_KEYBOARD_H | |||
#include "mechmerlin.h" | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
/* 0: qwerty */ | |||
[_BL] = LAYOUT_infinity( \ | |||
KC_GESC, 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_BSLS, KC_BSPC, \ | |||
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, \ | |||
KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ | |||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, TG(_AL), \ | |||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FL), KC_RALT, KC_RGUI, KC_RCTL), | |||
[_FL] = LAYOUT_infinity( \ | |||
KC_GRV, 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_F13, KC_DEL, \ | |||
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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, \ | |||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | |||
[_AL] = LAYOUT_infinity( \ | |||
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, 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, RSFT_T(KC_UP), KC_TRNS, \ | |||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT), | |||
}; |
@ -0,0 +1,10 @@ | |||
# MechMerlin Alps64 Infinity Keymap | |||
This is the 60% infinity layout used by u/merlin36, host of the [MechMerlin](www.youtube.com/mechmerlin) | |||
YouTube channel. | |||
## Keymap Notes | |||
- `Caps Lock` can be held to act as a `Left Control` | |||
### Build | |||
To build the firmware file associated with this keymap, simply run `make alps64:mechmerlin`. |
@ -1,14 +1,15 @@ | |||
Alps64 | |||
=== | |||
# Alps64 | |||
An Alps-only 60% board designed by Hasu. | |||
An Alps only 60% board designed by Hasu. | |||
Keyboard Maintainer: QMK Community | |||
Hardware Supported: Alps64 PCB | |||
Hardware Availability: https://geekhack.org/index.php?topic=69666.0 | |||
QMK is not the Alps64 official firmware. To use the official tools, refer to [TMK Keymap Editor](http://www.tmk-kbd.com/tmk_keyboard/editor/unimap/?alps64) or [TMK Keyboard Firmware on Github](https://github.com/tmk/tmk_keyboard). | |||
Make example for this keyboard (after setting up your build environment): | |||
make alps64:default | |||
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. | |||
See 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). |