-
-
Notifications
You must be signed in to change notification settings - Fork 39.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adds haven65 pcbs to the repo includes haven65 solder haven65 hotswap
- Loading branch information
1 parent
15fa4d0
commit f75dd95
Showing
15 changed files
with
778 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// Copyright 2023 Freather | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#pragma once | ||
|
||
|
||
#define EECONFIG_USER_DATA_SIZE 4 | ||
|
||
// generated by KBFirmware JSON to QMK Parser | ||
// https://noroadsleft.github.io/kbf_qmk_converter/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
{ | ||
"keyboard_name": "HAVEN65_HOTSWAP", | ||
"manufacturer": "Atelier_Haven", | ||
"url": "https://keyspensory.store/products/gb-haven65-by-atelier-haven?_pos=1&_sid=5e7dcb0e4&_ss=r&variant=41788985868461", | ||
"maintainer": "Freather", | ||
"usb": { | ||
"vid": "0x4446", | ||
"pid": "0x4665", | ||
"device_version": "1.0.0" | ||
}, | ||
"processor": "atmega32u4", | ||
"bootloader": "atmel-dfu", | ||
"matrix_pins": { | ||
"rows": ["B5", "B6", "C6", "F1", "D6"], | ||
"cols": ["F7", "F6", "F5", "F4", "F0", "B4", "D0", "D1", "D2", "D3", "D5", "B0", "B1", "B2", "B3"] | ||
}, | ||
"diode_direction": "COL2ROW", | ||
"features": { | ||
"bootmagic": true, | ||
"mousekey": true, | ||
"extrakey": true, | ||
"console": false, | ||
"command": true, | ||
"nkro": true, | ||
"backlight": false, | ||
"rgblight": true, | ||
"audio": false, | ||
"key_lock": false | ||
}, | ||
"rgblight": { | ||
"pin": "C7", | ||
"led_count": 1, | ||
"hue_steps": 8, | ||
"saturation_steps": 8, | ||
"brightness_steps": 8, | ||
"max_brightness": 255, | ||
"sleep": true, | ||
"animations": { | ||
"alternating": true, | ||
"breathing": true, | ||
"christmas": true, | ||
"knight": true, | ||
"rainbow_mood": true, | ||
"rainbow_swirl": true, | ||
"rgb_test": true, | ||
"snake": true, | ||
"static_gradient": true, | ||
"twinkle": true | ||
} | ||
}, | ||
"layouts": { | ||
"LAYOUT": { | ||
"layout": [ | ||
{ "label": "Esc", "matrix":[0,0],"x": 0, "y": 0 }, | ||
{ "label": "1", "matrix":[0,1],"x": 1, "y": 0 }, | ||
{ "label": "2", "matrix":[0,2],"x": 2, "y": 0 }, | ||
{ "label": "3", "matrix":[0,3],"x": 3, "y": 0 }, | ||
{ "label": "4", "matrix":[0,4],"x": 4, "y": 0 }, | ||
{ "label": "5", "matrix":[0,5],"x": 5, "y": 0 }, | ||
{ "label": "6", "matrix":[0,6],"x": 6, "y": 0 }, | ||
{ "label": "7", "matrix":[0,7],"x": 7, "y": 0 }, | ||
{ "label": "8", "matrix":[0,8],"x": 8, "y": 0 }, | ||
{ "label": "9", "matrix":[0,9],"x": 9, "y": 0 }, | ||
{ "label": "0", "matrix":[0,10],"x": 10, "y": 0 }, | ||
{ "label": "-", "matrix":[0,11],"x": 11, "y": 0 }, | ||
{ "label": "=", "matrix":[0,12],"x": 12, "y": 0 }, | ||
{ "label": "backspace", "matrix":[0,13],"x": 13, "y": 0, "w": 2 }, | ||
{ "label": "home", "matrix":[0,14],"x": 15, "y": 0 }, | ||
|
||
{ "label": "tab", "matrix":[1,0],"x": 0, "y": 1, "w": 1.5 }, | ||
{ "label": "q", "matrix":[1,1],"x": 1.5, "y": 1 }, | ||
{ "label": "w", "matrix":[1,2],"x": 2.5, "y": 1 }, | ||
{ "label": "e", "matrix":[1,3],"x": 3.5, "y": 1 }, | ||
{ "label": "r", "matrix":[1,4],"x": 4.5, "y": 1 }, | ||
{ "label": "t", "matrix":[1,5],"x": 5.5, "y": 1 }, | ||
{ "label": "y", "matrix":[1,6],"x": 6.5, "y": 1 }, | ||
{ "label": "u", "matrix":[1,7],"x": 7.5, "y": 1 }, | ||
{ "label": "i", "matrix":[1,8],"x": 8.5, "y": 1 }, | ||
{ "label": "o", "matrix":[1,9],"x": 9.5, "y": 1 }, | ||
{ "label": "p", "matrix":[1,10],"x": 10.5, "y": 1 }, | ||
{ "label": "{", "matrix":[1,11],"x": 11.5, "y": 1 }, | ||
{ "label": "}", "matrix":[1,12],"x": 12.5, "y": 1 }, | ||
{ "label": "|", "matrix":[2,13],"x": 13.5, "y": 1, "w": 1.5 }, | ||
{ "label": "insert", "matrix":[1,14],"x": 15, "y": 1 }, | ||
|
||
{ "label": "capslock", "matrix":[2,0],"x": 0, "y": 2, "w": 1.75 }, | ||
{ "label": "a", "matrix":[2,1],"x": 1.75, "y": 2 }, | ||
{ "label": "s", "matrix":[2,2],"x": 2.75, "y": 2 }, | ||
{ "label": "d", "matrix":[2,3],"x": 3.75, "y": 2 }, | ||
{ "label": "f", "matrix":[2,4],"x": 4.75, "y": 2 }, | ||
{ "label": "g", "matrix":[2,5],"x": 5.75, "y": 2 }, | ||
{ "label": "h", "matrix":[2,6],"x": 6.75, "y": 2 }, | ||
{ "label": "j", "matrix":[2,7],"x": 7.75, "y": 2 }, | ||
{ "label": "k", "matrix":[2,8],"x": 8.75, "y": 2 }, | ||
{ "label": "l", "matrix":[2,9],"x": 9.75, "y": 2 }, | ||
{ "label": ";", "matrix":[2,10],"x": 10.75, "y": 2 }, | ||
{ "label": "'", "matrix":[2,11],"x": 11.75, "y": 2 }, | ||
{ "label": "enter", "matrix":[2,12],"x": 12.75, "y": 2, "w": 2.25 }, | ||
{ "label": "delete", "matrix":[2,14],"x": 15, "y": 2 }, | ||
|
||
{ "label": "leftshift", "matrix":[3,0],"x": 0, "y": 3, "w": 2.25 }, | ||
{ "label": "z", "matrix":[3,2],"x": 2.25, "y": 3 }, | ||
{ "label": "x", "matrix":[3,3],"x": 3.25, "y": 3 }, | ||
{ "label": "c", "matrix":[3,4],"x": 4.25, "y": 3 }, | ||
{ "label": "v", "matrix":[3,5],"x": 5.25, "y": 3 }, | ||
{ "label": "b", "matrix":[3,6],"x": 6.25, "y": 3 }, | ||
{ "label": "n", "matrix":[3,7],"x": 7.25, "y": 3 }, | ||
{ "label": "m", "matrix":[3,8],"x": 8.25, "y": 3 }, | ||
{ "label": ",", "matrix":[3,9],"x": 9.25, "y": 3 }, | ||
{ "label": ".", "matrix":[3,10],"x": 10.25, "y": 3 }, | ||
{ "label": "/", "matrix":[3,11],"x": 11.25, "y": 3 }, | ||
{ "label": "rightshift", "matrix":[3,12],"x": 12.25, "y": 3, "w": 1.75 }, | ||
{ "label": "up", "matrix":[3,13],"x": 14, "y": 3 }, | ||
{ "label": "end", "matrix":[3,14],"x": 15, "y": 3 }, | ||
|
||
{ "label": "lctrl", "matrix":[4,0],"x": 0, "y": 4, "w": 1.25 }, | ||
{ "label": "lwin", "matrix":[4,1],"x": 1.25, "y": 4, "w": 1.25 }, | ||
{ "label": "lalt", "matrix":[4,2],"x": 2.5, "y": 4, "w": 1.25 }, | ||
{ "label": "space", "matrix":[4,6],"x": 3.75, "y": 4, "w": 6.25 }, | ||
{ "label": "ralt", "matrix":[4,9],"x": 10, "y": 4, "w": 1.25 }, | ||
{ "label": "MO(1)", "matrix":[4,10],"x": 11.25, "y": 4, "w": 1.25 }, | ||
{ "label": "left", "matrix":[4,11],"x": 13, "y": 4 }, | ||
{ "label": "down", "matrix":[4,12],"x": 14, "y": 4 }, | ||
{ "label": "right", "matrix":[4,13],"x": 15, "y": 4 } | ||
] | ||
} | ||
}, | ||
"meta": "https://noroadsleft.github.io/kbf_qmk_converter/" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
// Copyright 2023 Freather | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#include QMK_KEYBOARD_H | ||
|
||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
[0] = LAYOUT( | ||
KC_ESC, 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_BACKSPACE, KC_HOME, | ||
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_INS, | ||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_DEL, | ||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, | ||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT | ||
), | ||
|
||
[1] = LAYOUT( | ||
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_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, KC_TRNS | ||
) | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,205 @@ | ||
// Copyright 2023 Freather | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#include QMK_KEYBOARD_H | ||
|
||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
[0] = LAYOUT( | ||
KC_ESC, 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_BACKSPACE, KC_HOME, | ||
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_INS, | ||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_DEL, | ||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, | ||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT | ||
), | ||
|
||
[1] = LAYOUT( | ||
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_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, KC_TRNS | ||
), | ||
[2] = LAYOUT( | ||
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, 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 | ||
), | ||
[3] = LAYOUT( | ||
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, 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 | ||
) | ||
}; | ||
|
||
//indicator variables | ||
bool caps_is_active = false; | ||
int mode = 5; | ||
|
||
//to change color if the caps lock is on | ||
void freather_set_color(bool capslock_is_on); | ||
bool process_record_user(uint16_t keycode, keyrecord_t *record); | ||
|
||
|
||
|
||
// Declaring a _freather_config_t struct that will store data | ||
typedef struct _indicator_config_t { | ||
uint8_t h; | ||
uint8_t s; | ||
uint8_t v; | ||
bool enabled; | ||
} indicator_config; | ||
|
||
// Board memory layout | ||
typedef struct _freather_config_t { | ||
indicator_config caps; | ||
} freather_config; | ||
|
||
|
||
|
||
// Check if the size of the reserved persistent memory is the same as the size of struct freather_config | ||
_Static_assert(sizeof(indicator_config) == EECONFIG_USER_DATA_SIZE, "Mismatch in keyboard EECONFIG stored data"); | ||
|
||
// Declaring a new variable freather of type freather_config | ||
freather_config freather; | ||
|
||
// Declaring enums for VIA config menu | ||
enum via_freather_enums { | ||
|
||
id_freather_indicator_enabled = 1, | ||
id_freather_indicator_color = 2 | ||
|
||
}; | ||
|
||
// Initializing persistent memory configuration: default values are declared and stored in PMEM | ||
void eeconfig_init_user(void) { | ||
// Default values | ||
freather.caps.h = 100; | ||
freather.caps.s = 100; | ||
freather.caps.v = 100; | ||
freather.caps.enabled = true; | ||
rgblight_set_effect_range(0,1); | ||
// Write default value to EEPROM now | ||
eeconfig_update_user_datablock(&freather); | ||
} | ||
|
||
// On Keyboard startup | ||
void keyboard_post_init_user(void) { | ||
// Read custom menu variables from memory | ||
eeconfig_read_user_datablock(&freather); | ||
} | ||
|
||
// Handle the data received by the keyboard from the VIA menus | ||
void freather_config_set_value(uint8_t *data) { | ||
// data = [ value_id, value_data ] | ||
uint8_t *value_id = &(data[0]); | ||
uint8_t *value_data = &(data[1]); | ||
|
||
switch (*value_id) { | ||
case id_freather_indicator_enabled: { | ||
freather.caps.enabled = value_data[0]; | ||
rgblight_sethsv_at(0,0,0,0); | ||
break; | ||
} | ||
case id_freather_indicator_color: { | ||
freather.caps.h = value_data[0]; | ||
freather.caps.s = value_data[1]; | ||
freather_set_color(true); | ||
break; | ||
} | ||
} | ||
} | ||
|
||
// Handle the data sent by the keyboard to the VIA menus | ||
void freather_config_get_value(uint8_t *data) { | ||
// data = [ value_id, value_data ] | ||
uint8_t *value_id = &(data[0]); | ||
uint8_t *value_data = &(data[1]); | ||
|
||
switch (*value_id) { | ||
case id_freather_indicator_enabled: { | ||
value_data[0] = freather.caps.enabled; | ||
break; | ||
} | ||
case id_freather_indicator_color: { | ||
value_data[0] = freather.caps.h; | ||
value_data[1] = freather.caps.s; | ||
break; | ||
} | ||
} | ||
} | ||
|
||
//save data to memory | ||
void freather_config_save(void) { | ||
eeconfig_update_user_datablock(&freather); | ||
} | ||
|
||
|
||
|
||
void via_custom_value_command_kb(uint8_t *data, uint8_t length) { | ||
// data = [ command_id, channel_id, value_id, value_data ] | ||
uint8_t *command_id = &(data[0]); | ||
uint8_t *channel_id = &(data[1]); | ||
uint8_t *value_id_and_data = &(data[2]); | ||
|
||
if (*channel_id == id_custom_channel) { | ||
switch (*command_id) { | ||
case id_custom_set_value: { | ||
freather_config_set_value(value_id_and_data); | ||
break; | ||
} | ||
case id_custom_get_value: { | ||
freather_config_get_value(value_id_and_data); | ||
break; | ||
} | ||
case id_custom_save: { | ||
freather_config_save(); | ||
break; | ||
} | ||
default: { | ||
// Unhandled message. | ||
*command_id = id_unhandled; | ||
break; | ||
} | ||
} | ||
return; | ||
} | ||
|
||
*command_id = id_unhandled; | ||
} | ||
|
||
|
||
void freather_set_color(bool capslock_is_on) | ||
{ | ||
if(capslock_is_on == true && freather.caps.enabled == true) | ||
{ | ||
rgblight_sethsv_range(freather.caps.h, freather.caps.s, freather.caps.v,0,1); //0 is the location of caps light indicator | ||
} | ||
else{ | ||
rgblight_sethsv_at(0,0,0,0); //if is off, then turn off the caps lock indicator | ||
} | ||
} | ||
|
||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
|
||
switch (keycode) { | ||
case KC_CAPS: | ||
if (record->event.pressed && caps_is_active == false &&freather.caps.enabled == true) { //turn on caps | ||
caps_is_active = true; | ||
mode = rgblight_get_mode(); | ||
rgblight_mode(1); | ||
rgblight_sethsv_range(freather.caps.h, freather.caps.s, freather.caps.v, 0, 1); //needs a way to override the effect | ||
return true; | ||
}else if(record->event.pressed && caps_is_active == true ){ | ||
rgblight_set_effect_range(0,1); | ||
rgblight_mode(mode); | ||
|
||
caps_is_active = false; | ||
} | ||
default: | ||
return true; // Process all other keycodes normally | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
VIA_ENABLE = yes |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#Haven65 Hotswap | ||
|
||
![haven 65 hotswap](https://i.imgur.com/M1l1DaO.png) | ||
|
||
|
||
* Keyboard Maintainer: [Freather](https://github.com/CMMS-Freather) | ||
* Hardware Supported: PCB, Atmega32u4 | ||
|
||
Make example for this keyboard (after setting up your build environment): | ||
|
||
make ah/haven65_hotswap:default | ||
|
||
Flashing example for this keyboard: | ||
|
||
make ah/haven65_hotswap:default:flash | ||
|
||
##Bootloader Atmel-DFU | ||
|
||
For reset instruction, use the physical reset button on the back of the keyboard to enter bootloader mode | ||
|
||
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). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# This file intentionally left blank |
Oops, something went wrong.