[Keyboard] mlego fix product id and sync oled code (#16237)

* sync oled code over the keymaps

* put different product ids

* put different product ids for the rest

* put different product ids for the rest

* try to reduce code duplication

* make ifdefs nice and correct

* move the leds code out of keymap

* try to reduce code duplication

* move the rgb code outside the keymaps for reuse

* Update keyboards/mlego/m65/m65.c

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Update keyboards/mlego/m65/m65.c

Co-authored-by: Drashna Jaelre <drashna@live.com>

* move more code outside keymaps for reuse

* add few more xps

* add mic mute

* update to new name of macros for reset

* style for matrix

* clean split

* use tinyuf2 as bootloader

* Update keyboards/mlego/m65/rev4/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* radionalise product id and device version

* add tinyuf2 as default bootloader for stm32f4

* update tinyuf2

* update tinyuf2 and via. f411 remove tinyuf2 since is not really working. make the config more conditional

* sync the keymap with default

* revert via non building with gcc 11

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
This commit is contained in:
Alin Marin Elena 2022-06-11 19:18:45 +01:00 committed by GitHub
parent dbd4ac5a3f
commit 51cfb1b457
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 913 additions and 528 deletions

View file

@ -27,6 +27,9 @@
#define DEBOUNCE 5 #define DEBOUNCE 5
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE #define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */ /* Locking resynchronize hack */

View file

@ -39,32 +39,77 @@ const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(m
// clang-format off // clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_QW] = LAYOUT_ortho_4x12( [_QW] = LAYOUT_ortho_4x12(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_BSPC,
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, 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_ENT KC_TRNS,KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
), ),
/* Lower
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LWR] = LAYOUT_ortho_4x12( [_LWR] = LAYOUT_ortho_4x12(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
), ),
/* Raise
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_RSE] = LAYOUT_ortho_4x12( [_RSE] = LAYOUT_ortho_4x12(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
), ),
/* Adjust (Lower + Raise)
* v------------------------RGB CONTROL--------------------v
* ,-----------------------------------------------------------------------------------.
* | | Reset|Debug | RGB |RGBMOD| HUE+ | HUE- | SAT+ | SAT- |BRGTH+|BRGTH-| Del |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | |MUSmod|Aud on|Audoff|AGnorm|AGswap| | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|TermOn|TermOf| | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJ] = LAYOUT_ortho_4x12( [_ADJ] = LAYOUT_ortho_4x12(
_______, QK_BOOT, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_G, QK_BOOT, _______, _______, QK_BOOT, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL ,
_______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
) )
}; };

View file

@ -15,16 +15,3 @@
*/ */
#include "m48.h" #include "m48.h"
/*
void keyboard_pre_init_kb(void){
// Workaround for reversible pcb/mcu
palSetLineMode(C13, PAL_MODE_INPUT_PULLUP);
palSetLineMode(C15, PAL_MODE_INPUT_PULLUP);
palSetLineMode(B7, PAL_MODE_OUTPUT_OPENDRAIN);
palSetLineMode(A0, PAL_MODE_OUTPUT_OPENDRAIN);
palSetLineMode(A1, PAL_MODE_OUTPUT_OPENDRAIN);
keyboard_pre_init_user();
}
*/

View file

@ -18,7 +18,7 @@
#include "config_common.h" #include "config_common.h"
/* USB Device descriptor parameter */ /* USB Device descriptor parameter */
#define PRODUCT_ID 0x0001 #define PRODUCT_ID 0x6261
#define DEVICE_VER 0x0001 #define DEVICE_VER 0x0001
#define MATRIX_ROW_PINS \ #define MATRIX_ROW_PINS \
@ -26,24 +26,21 @@
#define MATRIX_COL_PINS \ #define MATRIX_COL_PINS \
{ A10, A15, B3, B4, B5, B7, B6, A1, A2, A3, A4, A5 } { A10, A15, B3, B4, B5, B7, B6, A1, A2, A3, A4, A5 }
#ifdef ENCODER_ENABLE
#define ENCODERS_PAD_A \ #define ENCODERS_PAD_A \
{ A0 } { A0 }
#define ENCODERS_PAD_B \ #define ENCODERS_PAD_B \
{ B8 } { B8 }
#define ENCODER_RESOLUTION 4
#endif
#define LED_NUM_LOCK_PIN B12 #define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13 #define LED_SCROLL_LOCK_PIN B13
#define LED_CAPS_LOCK_PIN C13 #define LED_CAPS_LOCK_PIN C13
#define RGB_DI_PIN B15 #ifdef RGBLIGHT_ENABLE
#define UNUSED_PINS
#define RGBLIGHT_LAYERS #define RGBLIGHT_LAYERS
#define RGB_DI_PIN B15
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define MATRIX_IO_DELAY 5
#define RGBLED_NUM 20 #define RGBLED_NUM 20
#define RGBLIGHT_EFFECT_BREATHING #define RGBLIGHT_EFFECT_BREATHING
@ -56,3 +53,9 @@
#define RGBLIGHT_EFFECT_RGB_TEST #define RGBLIGHT_EFFECT_RGB_TEST
#define RGBLIGHT_EFFECT_ALTERNATING #define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_TWINKLE #define RGBLIGHT_EFFECT_TWINKLE
#endif
#define UNUSED_PINS
// you want to comment this if using stm32-dfu as bootloader
#define FEE_PAGE_BASE_ADDRESS 0x08008000

View file

@ -0,0 +1,88 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* STM32F401xE memory setup.
*/
MEMORY
{
flash0 (rx) : org = 0x08000000, len = 16k /* tinyuf2 bootloader requires app to be located at 64k offset for this MCU */
flash1 (rx) : org = 0x08004000, len = 16k
flash2 (rx) : org = 0x08008000, len = 16k /* emulated eeprom */
flash3 (rx) : org = 0x0800C000, len = 16k
flash4 (rx) : org = 0x08010000, len = 512k - 64k
flash5 (rx) : org = 0x00000000, len = 0
flash6 (rx) : org = 0x00000000, len = 0
flash7 (rx) : org = 0x00000000, len = 0
ram0 (wx) : org = 0x20000000, len = 96k
ram1 (wx) : org = 0x00000000, len = 0
ram2 (wx) : org = 0x00000000, len = 0
ram3 (wx) : org = 0x00000000, len = 0
ram4 (wx) : org = 0x00000000, len = 0
ram5 (wx) : org = 0x00000000, len = 0
ram6 (wx) : org = 0x00000000, len = 0
ram7 (wx) : org = 0x00000000, len = 0
}
/* For each data/text section two region are defined, a virtual region
and a load region (_LMA suffix).*/
/* Flash region to be used for exception vectors.*/
REGION_ALIAS("VECTORS_FLASH", flash4);
REGION_ALIAS("VECTORS_FLASH_LMA", flash4);
/* Flash region to be used for constructors and destructors.*/
REGION_ALIAS("XTORS_FLASH", flash4);
REGION_ALIAS("XTORS_FLASH_LMA", flash4);
/* Flash region to be used for code text.*/
REGION_ALIAS("TEXT_FLASH", flash4);
REGION_ALIAS("TEXT_FLASH_LMA", flash4);
/* Flash region to be used for read only data.*/
REGION_ALIAS("RODATA_FLASH", flash4);
REGION_ALIAS("RODATA_FLASH_LMA", flash4);
/* Flash region to be used for various.*/
REGION_ALIAS("VARIOUS_FLASH", flash4);
REGION_ALIAS("VARIOUS_FLASH_LMA", flash4);
/* Flash region to be used for RAM(n) initialization data.*/
REGION_ALIAS("RAM_INIT_FLASH_LMA", flash4);
/* RAM region to be used for Main stack. This stack accommodates the processing
of all exceptions and interrupts.*/
REGION_ALIAS("MAIN_STACK_RAM", ram0);
/* RAM region to be used for the process stack. This is the stack used by
the main() function.*/
REGION_ALIAS("PROCESS_STACK_RAM", ram0);
/* RAM region to be used for data segment.*/
REGION_ALIAS("DATA_RAM", ram0);
REGION_ALIAS("DATA_RAM_LMA", flash4);
/* RAM region to be used for BSS segment.*/
REGION_ALIAS("BSS_RAM", ram0);
/* RAM region to be used for the default heap.*/
REGION_ALIAS("HEAP_RAM", ram0);
/* Generic rules inclusion.*/
INCLUDE rules.ld
/* TinyUF2 bootloader reset support */
_board_dfu_dbl_tap = ORIGIN(ram0) + 64k - 4; /* this is based off the linker file for tinyuf2 */

View file

@ -2,7 +2,10 @@
MCU = STM32F401 MCU = STM32F401
# Bootloader selection # Bootloader selection
BOOTLOADER = stm32-dfu BOOTLOADER = tinyuf2
MCU_LDSCRIPT = STM32F401xE
EEPROM_DRIVER = vendor
#BOOTLOADER = stm32-dfu
# Build Options # Build Options
# change yes to no to disable # change yes to no to disable

View file

@ -25,6 +25,9 @@
#define MATRIX_ROWS 5 #define MATRIX_ROWS 5
#define MATRIX_COLS 12 #define MATRIX_COLS 12
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define DEBOUNCE 5 #define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */

View file

@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
), ),
[_ADJ] = LAYOUT_ortho_5x12( [_ADJ] = LAYOUT_ortho_5x12(
_______, QK_BOOT, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_G, QK_BOOT, _______, _______, QK_BOOT, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_G, QK_BOOT, _______,
_______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______,
_______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,

View file

@ -15,16 +15,3 @@
*/ */
#include "m60.h" #include "m60.h"
/*
void keyboard_pre_init_kb(void){
// Workaround for reversible pcb/mcu
palSetLineMode(C13, PAL_MODE_INPUT_PULLUP);
palSetLineMode(C15, PAL_MODE_INPUT_PULLUP);
palSetLineMode(B7, PAL_MODE_OUTPUT_OPENDRAIN);
palSetLineMode(A0, PAL_MODE_OUTPUT_OPENDRAIN);
palSetLineMode(A1, PAL_MODE_OUTPUT_OPENDRAIN);
keyboard_pre_init_user();
}
*/

View file

@ -46,12 +46,7 @@ static inline void led_rse(const bool on) {
} }
static inline void led_caps(const bool on) { static inline void led_caps(const bool on) {
#ifdef LED_CAPS_LOCK_PIN #ifdef LED_CAPS_LOCK_PIN
if ((DEVICE_VER == 0x0001) || (DEVICE_VER == 0x0003)) {
writePin(LED_CAPS_LOCK_PIN, !on); writePin(LED_CAPS_LOCK_PIN, !on);
}
if (DEVICE_VER == 0x0002) {
writePin(LED_CAPS_LOCK_PIN, on);
}
#endif #endif
} }

View file

@ -18,9 +18,14 @@
#include "config_common.h" #include "config_common.h"
/* USB Device descriptor parameter */ /* USB Device descriptor parameter */
#define PRODUCT_ID 0x0001 #define PRODUCT_ID 0x6161
#define DEVICE_VER 0x0001 #define DEVICE_VER 0x0001
#define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13
#define LED_CAPS_LOCK_PIN C13
#ifdef ENCODER_ENABLE
#define MATRIX_ROW_PINS \ #define MATRIX_ROW_PINS \
{ A6, A7, B0, B1, B10 } { A6, A7, B0, B1, B10 }
#define MATRIX_COL_PINS \ #define MATRIX_COL_PINS \
@ -31,20 +36,13 @@
#define ENCODERS_PAD_B \ #define ENCODERS_PAD_B \
{ B8 } { B8 }
#define LED_NUM_LOCK_PIN B12 #endif
#define LED_SCROLL_LOCK_PIN B13
#define LED_CAPS_LOCK_PIN C13 #ifdef RGBLIGHT_ENABLE
#define RGB_DI_PIN B15 #define RGB_DI_PIN B15
#define UNUSED_PINS
#define RGBLIGHT_LAYERS #define RGBLIGHT_LAYERS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define MATRIX_IO_DELAY 5
#define RGBLED_NUM 20 #define RGBLED_NUM 20
#define RGBLIGHT_EFFECT_BREATHING #define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD #define RGBLIGHT_EFFECT_RAINBOW_MOOD
@ -56,3 +54,8 @@
#define RGBLIGHT_EFFECT_RGB_TEST #define RGBLIGHT_EFFECT_RGB_TEST
#define RGBLIGHT_EFFECT_ALTERNATING #define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_TWINKLE #define RGBLIGHT_EFFECT_TWINKLE
#endif
#define UNUSED_PINS
// you want to comment this if using stm32-dfu as bootloader
#define FEE_PAGE_BASE_ADDRESS 0x08008000

View file

@ -0,0 +1,88 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* STM32F401xE memory setup.
*/
MEMORY
{
flash0 (rx) : org = 0x08000000, len = 16k /* tinyuf2 bootloader requires app to be located at 64k offset for this MCU */
flash1 (rx) : org = 0x08004000, len = 16k
flash2 (rx) : org = 0x08008000, len = 16k /* emulated eeprom */
flash3 (rx) : org = 0x0800C000, len = 16k
flash4 (rx) : org = 0x08010000, len = 512k - 64k
flash5 (rx) : org = 0x00000000, len = 0
flash6 (rx) : org = 0x00000000, len = 0
flash7 (rx) : org = 0x00000000, len = 0
ram0 (wx) : org = 0x20000000, len = 96k
ram1 (wx) : org = 0x00000000, len = 0
ram2 (wx) : org = 0x00000000, len = 0
ram3 (wx) : org = 0x00000000, len = 0
ram4 (wx) : org = 0x00000000, len = 0
ram5 (wx) : org = 0x00000000, len = 0
ram6 (wx) : org = 0x00000000, len = 0
ram7 (wx) : org = 0x00000000, len = 0
}
/* For each data/text section two region are defined, a virtual region
and a load region (_LMA suffix).*/
/* Flash region to be used for exception vectors.*/
REGION_ALIAS("VECTORS_FLASH", flash4);
REGION_ALIAS("VECTORS_FLASH_LMA", flash4);
/* Flash region to be used for constructors and destructors.*/
REGION_ALIAS("XTORS_FLASH", flash4);
REGION_ALIAS("XTORS_FLASH_LMA", flash4);
/* Flash region to be used for code text.*/
REGION_ALIAS("TEXT_FLASH", flash4);
REGION_ALIAS("TEXT_FLASH_LMA", flash4);
/* Flash region to be used for read only data.*/
REGION_ALIAS("RODATA_FLASH", flash4);
REGION_ALIAS("RODATA_FLASH_LMA", flash4);
/* Flash region to be used for various.*/
REGION_ALIAS("VARIOUS_FLASH", flash4);
REGION_ALIAS("VARIOUS_FLASH_LMA", flash4);
/* Flash region to be used for RAM(n) initialization data.*/
REGION_ALIAS("RAM_INIT_FLASH_LMA", flash4);
/* RAM region to be used for Main stack. This stack accommodates the processing
of all exceptions and interrupts.*/
REGION_ALIAS("MAIN_STACK_RAM", ram0);
/* RAM region to be used for the process stack. This is the stack used by
the main() function.*/
REGION_ALIAS("PROCESS_STACK_RAM", ram0);
/* RAM region to be used for data segment.*/
REGION_ALIAS("DATA_RAM", ram0);
REGION_ALIAS("DATA_RAM_LMA", flash4);
/* RAM region to be used for BSS segment.*/
REGION_ALIAS("BSS_RAM", ram0);
/* RAM region to be used for the default heap.*/
REGION_ALIAS("HEAP_RAM", ram0);
/* Generic rules inclusion.*/
INCLUDE rules.ld
/* TinyUF2 bootloader reset support */
_board_dfu_dbl_tap = ORIGIN(ram0) + 64k - 4; /* this is based off the linker file for tinyuf2 */

View file

@ -2,7 +2,10 @@
MCU = STM32F401 MCU = STM32F401
# Bootloader selection # Bootloader selection
BOOTLOADER = stm32-dfu BOOTLOADER = tinyuf2
#BOOTLOADER = stm32-dfu
MCU_LDSCRIPT = STM32F401xE
EEPROM_DRIVER = vendor
# Build Options # Build Options
# change yes to no to disable # change yes to no to disable

View file

@ -26,6 +26,8 @@
#define MATRIX_COLS 6 #define MATRIX_COLS 6
#define DEBOUNCE 5 #define DEBOUNCE 5
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE #define LOCKING_SUPPORT_ENABLE

View file

@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
), ),
[_ADJ] = LAYOUT_ortho_5x12( [_ADJ] = LAYOUT_ortho_5x12(
_______, QK_BOOT, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_G, QK_BOOT, _______, _______, QK_BOOT, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_G, QK_BOOT, _______,
_______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______,
_______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,

View file

@ -18,7 +18,7 @@
#include "config_common.h" #include "config_common.h"
/* USB Device descriptor parameter */ /* USB Device descriptor parameter */
#define PRODUCT_ID 0x0001 #define PRODUCT_ID 0x6361
#define DEVICE_VER 0x0001 #define DEVICE_VER 0x0001
#define MATRIX_ROW_PINS \ #define MATRIX_ROW_PINS \
@ -32,12 +32,14 @@
#define MATRIX_COL_PINS_RIGHT \ #define MATRIX_COL_PINS_RIGHT \
{ B0, A3, A2, A1, B7, B5 } // cols are from right to left to match the layout { B0, A3, A2, A1, B7, B5 } // cols are from right to left to match the layout
#ifdef ENCODER_ENABLE
#define ENCODERS_PAD_A \ #define ENCODERS_PAD_A \
{ A0 } { A0 }
#define ENCODERS_PAD_B \ #define ENCODERS_PAD_B \
{ B8 } { B8 }
#define ENCODER_RESOLUTIONS \ #define ENCODER_RESOLUTIONS \
{ 4 } { 4 }
#endif
#define LED_NUM_LOCK_PIN B12 #define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13 #define LED_SCROLL_LOCK_PIN B13
@ -46,20 +48,15 @@
#define SPLIT_LAYER_STATE_ENABLE #define SPLIT_LAYER_STATE_ENABLE
#define SPLIT_LED_STATE_ENABLE #define SPLIT_LED_STATE_ENABLE
#define RGB_DI_PIN B15
#define SPLIT_HAND_PIN B9 #define SPLIT_HAND_PIN B9
#define SERIAL_USART_TX_PIN B6 #define SERIAL_USART_TX_PIN B6
#define RGBLIGHT_SPLIT
#define RGBLIGHT_LAYERS
#define UNUSED_PINS
#define SERIAL_USART_SPEED 921600 #define SERIAL_USART_SPEED 921600
/* COL2ROW, ROW2COL*/ #ifdef RGBLIGHT_ENABLE
#define DIODE_DIRECTION COL2ROW #define RGB_DI_PIN B15
#define RGBLIGHT_SPLIT
#define MATRIX_IO_DELAY 5 #define RGBLIGHT_LAYERS
#define RGBLIGHT_LIMIT_VAL 128 #define RGBLIGHT_LIMIT_VAL 128
#define RGBLIGHT_DEFAULT_HUE 213 #define RGBLIGHT_DEFAULT_HUE 213
@ -84,3 +81,8 @@
#define BOOTMAGIC_LITE_COLUMN 0 #define BOOTMAGIC_LITE_COLUMN 0
#define BOOTMAGIC_LITE_ROW_RIGHT 5 #define BOOTMAGIC_LITE_ROW_RIGHT 5
#define BOOTMAGIC_LITE_COLUMN_RIGHT 0 #define BOOTMAGIC_LITE_COLUMN_RIGHT 0
#endif
#define UNUSED_PINS
// you want to comment this if using stm32-dfu as bootloader
#define FEE_PAGE_BASE_ADDRESS 0x08008000

View file

@ -0,0 +1,88 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* STM32F401xE memory setup.
*/
MEMORY
{
flash0 (rx) : org = 0x08000000, len = 16k /* tinyuf2 bootloader requires app to be located at 64k offset for this MCU */
flash1 (rx) : org = 0x08004000, len = 16k
flash2 (rx) : org = 0x08008000, len = 16k /* emulated eeprom */
flash3 (rx) : org = 0x0800C000, len = 16k
flash4 (rx) : org = 0x08010000, len = 512k - 64k
flash5 (rx) : org = 0x00000000, len = 0
flash6 (rx) : org = 0x00000000, len = 0
flash7 (rx) : org = 0x00000000, len = 0
ram0 (wx) : org = 0x20000000, len = 96k
ram1 (wx) : org = 0x00000000, len = 0
ram2 (wx) : org = 0x00000000, len = 0
ram3 (wx) : org = 0x00000000, len = 0
ram4 (wx) : org = 0x00000000, len = 0
ram5 (wx) : org = 0x00000000, len = 0
ram6 (wx) : org = 0x00000000, len = 0
ram7 (wx) : org = 0x00000000, len = 0
}
/* For each data/text section two region are defined, a virtual region
and a load region (_LMA suffix).*/
/* Flash region to be used for exception vectors.*/
REGION_ALIAS("VECTORS_FLASH", flash4);
REGION_ALIAS("VECTORS_FLASH_LMA", flash4);
/* Flash region to be used for constructors and destructors.*/
REGION_ALIAS("XTORS_FLASH", flash4);
REGION_ALIAS("XTORS_FLASH_LMA", flash4);
/* Flash region to be used for code text.*/
REGION_ALIAS("TEXT_FLASH", flash4);
REGION_ALIAS("TEXT_FLASH_LMA", flash4);
/* Flash region to be used for read only data.*/
REGION_ALIAS("RODATA_FLASH", flash4);
REGION_ALIAS("RODATA_FLASH_LMA", flash4);
/* Flash region to be used for various.*/
REGION_ALIAS("VARIOUS_FLASH", flash4);
REGION_ALIAS("VARIOUS_FLASH_LMA", flash4);
/* Flash region to be used for RAM(n) initialization data.*/
REGION_ALIAS("RAM_INIT_FLASH_LMA", flash4);
/* RAM region to be used for Main stack. This stack accommodates the processing
of all exceptions and interrupts.*/
REGION_ALIAS("MAIN_STACK_RAM", ram0);
/* RAM region to be used for the process stack. This is the stack used by
the main() function.*/
REGION_ALIAS("PROCESS_STACK_RAM", ram0);
/* RAM region to be used for data segment.*/
REGION_ALIAS("DATA_RAM", ram0);
REGION_ALIAS("DATA_RAM_LMA", flash4);
/* RAM region to be used for BSS segment.*/
REGION_ALIAS("BSS_RAM", ram0);
/* RAM region to be used for the default heap.*/
REGION_ALIAS("HEAP_RAM", ram0);
/* Generic rules inclusion.*/
INCLUDE rules.ld
/* TinyUF2 bootloader reset support */
_board_dfu_dbl_tap = ORIGIN(ram0) + 64k - 4; /* this is based off the linker file for tinyuf2 */

View file

@ -2,7 +2,10 @@
MCU = STM32F401 MCU = STM32F401
# Bootloader selection # Bootloader selection
BOOTLOADER = stm32-dfu BOOTLOADER = tinyuf2
#BOOTLOADER = stm32-dfu
MCU_LDSCRIPT = STM32F401xE
EEPROM_DRIVER = vendor
# Build Options # Build Options
# change yes to no to disable # change yes to no to disable

View file

@ -18,7 +18,7 @@
#include "config_common.h" #include "config_common.h"
/* USB Device descriptor parameter */ /* USB Device descriptor parameter */
#define PRODUCT_ID 0x0001 #define PRODUCT_ID 0x6362
#define DEVICE_VER 0x0001 #define DEVICE_VER 0x0001
#define MATRIX_ROW_PINS \ #define MATRIX_ROW_PINS \
@ -32,6 +32,8 @@
#define MATRIX_COL_PINS_RIGHT \ #define MATRIX_COL_PINS_RIGHT \
{ B0, A3, A2, A1, B7, B5 } // cols are from right to left to match the layout { B0, A3, A2, A1, B7, B5 } // cols are from right to left to match the layout
#ifdef ENCODER_ENABLE
#define ENCODERS_PAD_A \ #define ENCODERS_PAD_A \
{ A0 } { A0 }
#define ENCODERS_PAD_B \ #define ENCODERS_PAD_B \
@ -39,28 +41,25 @@
#define ENCODER_RESOLUTIONS \ #define ENCODER_RESOLUTIONS \
{ 4 } { 4 }
#endif
#define LED_NUM_LOCK_PIN B12 #define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13 #define LED_SCROLL_LOCK_PIN B13
#define LED_CAPS_LOCK_PIN C13 #define LED_CAPS_LOCK_PIN C13
#define SPLIT_LAYER_STATE_ENABLE #define SPLIT_LAYER_STATE_ENABLE
#define SPLIT_LED_STATE_ENABLE #define SPLIT_LED_STATE_ENABLE
#define RGB_DI_PIN B15
#define SPLIT_HAND_PIN B9 #define SPLIT_HAND_PIN B9
#define SERIAL_USART_TX_PIN B6 #define SERIAL_USART_TX_PIN B6
#define RGBLIGHT_SPLIT
#define UNUSED_PINS
#define SERIAL_USART_SPEED 921600 #define SERIAL_USART_SPEED 921600
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define MATRIX_IO_DELAY 5
#ifdef RGBLIGHT_ENABLE
#define RGB_DI_PIN B15
#define RGBLIGHT_SPLIT
#define RGBLIGHT_LAYERS #define RGBLIGHT_LAYERS
#define RGBLED_NUM 16 #define RGBLED_NUM 16
#define RGBLED_SPLIT \ #define RGBLED_SPLIT \
{ 8, 8 } { 8, 8 }
@ -74,9 +73,12 @@
#define RGBLIGHT_EFFECT_RGB_TEST #define RGBLIGHT_EFFECT_RGB_TEST
#define RGBLIGHT_EFFECT_ALTERNATING #define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_TWINKLE #define RGBLIGHT_EFFECT_TWINKLE
#endif
/* Bootmagic Lite key configuration */ /* Bootmagic Lite key configuration */
#define BOOTMAGIC_LITE_ROW 0 #define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0 #define BOOTMAGIC_LITE_COLUMN 0
#define BOOTMAGIC_LITE_ROW_RIGHT 5 #define BOOTMAGIC_LITE_ROW_RIGHT 5
#define BOOTMAGIC_LITE_COLUMN_RIGHT 0 #define BOOTMAGIC_LITE_COLUMN_RIGHT 0
#define UNUSED_PINS

View file

@ -17,23 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
enum layer_names {
_QW = 0,
_LWR,
_RSE,
_ADJ
};
#ifdef RGBLIGHT_ENABLE
const rgblight_segment_t PROGMEM my_qwerty_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_PURPLE});
const rgblight_segment_t PROGMEM my_lwr_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_CYAN});
const rgblight_segment_t PROGMEM my_rse_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_RED});
const rgblight_segment_t PROGMEM my_adj_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_GREEN});
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_qwerty_layer, my_lwr_layer, my_rse_layer, my_adj_layer);
#endif
// clang-format off // clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@ -68,24 +51,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
}; };
// clang-format on // clang-format on
// let us assume we start with both layers off
static bool toggle_lwr = false;
static bool toggle_rse = false;
bool led_update_user(led_t led_state) { bool led_update_user(led_t led_state) {
// Disable the default LED update code, so that lock LEDs could be reused to show layer status. // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
return false; return false;
} }
void matrix_scan_user(void) { void matrix_scan_user(void) {
led_lwr(toggle_lwr);
led_rse(toggle_rse); toggle_leds();
led_t led_state = host_keyboard_led_state();
led_caps(led_state.caps_lock);
if (layer_state_is(_ADJ)) {
led_lwr(true);
led_rse(true);
}
} }
bool process_record_user(uint16_t keycode, keyrecord_t* record) { bool process_record_user(uint16_t keycode, keyrecord_t* record) {
@ -93,13 +67,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
case (TT(_LWR)): case (TT(_LWR)):
if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
// This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle. // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
toggle_lwr = !layer_state_is(_LWR); set_led_toggle(_LWR, !layer_state_is(_LWR));
} }
return true; return true;
break; break;
case (TT(_RSE)): case (TT(_RSE)):
if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
toggle_rse = !layer_state_is(_RSE); set_led_toggle(_RSE, !layer_state_is(_RSE));
} }
return true; return true;
break; break;
@ -109,61 +83,37 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
} }
layer_state_t layer_state_set_user(layer_state_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); set_rgb_layers(state);
rgblight_set_layer_state(1, layer_state_cmp(state, _LWR));
rgblight_set_layer_state(2, layer_state_cmp(state, _RSE));
rgblight_set_layer_state(3, layer_state_cmp(state, _ADJ));
#endif #endif
return update_tri_layer_state(state, _LWR, _RSE, _ADJ); return update_tri_layer_state(state, _LWR, _RSE, _ADJ);
} }
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
layer_state_t default_layer_state_set_user(layer_state_t state) { layer_state_t default_layer_state_set_user(layer_state_t state) {
rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); set_default_rgb_layers(state);
return state; return state;
} }
#endif
void keyboard_post_init_user(void) { void keyboard_post_init_user(void) {
#ifdef RGBLIGHT_ENABLE
// Enable the LED layers // Enable the LED layers
rgblight_layers = my_rgb_layers; rgblight_layers = my_rgb();
}
#endif #endif
#ifdef ENCODER_ENABLE #ifdef OLED_ENABLE
# define MEDIA_KEY_DELAY 10 init_timer();
static inline void my_encoders(const uint8_t index, const bool clockwise) {
if (index == 0) { /* First encoder */
if (IS_LAYER_ON(_LWR)) {
if (clockwise) {
rgblight_decrease_val_noeeprom();
} else {
rgblight_increase_val_noeeprom();
}
} else if (IS_LAYER_ON(_RSE)) {
if (clockwise) {
rgblight_decrease_hue_noeeprom();
} else {
rgblight_increase_hue_noeeprom();
}
} else {
if (clockwise) {
tap_code_delay(KC_VOLD, MEDIA_KEY_DELAY);
} else {
tap_code_delay(KC_VOLU, MEDIA_KEY_DELAY);
}
}
}
}
bool encoder_update_user(uint8_t index, bool clockwise) {
my_encoders(index, clockwise);
return true;
}
#endif #endif
}

View file

@ -18,23 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
#include "keymap_danish.h" #include "keymap_danish.h"
enum layer_names {
_QW = 0,
_LWR,
_RSE,
_ADJ
};
#ifdef RGBLIGHT_ENABLE
const rgblight_segment_t PROGMEM my_qwerty_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_PURPLE});
const rgblight_segment_t PROGMEM my_lwr_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_CYAN});
const rgblight_segment_t PROGMEM my_rse_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_RED});
const rgblight_segment_t PROGMEM my_adj_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_GREEN});
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_qwerty_layer, my_lwr_layer, my_rse_layer, my_adj_layer);
#endif
// clang-format off // clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@ -61,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJ] = LAYOUT_ortho_5x13( [_ADJ] = LAYOUT_ortho_5x13(
RGB_MOD,RGB_RMOD, A(KC_F2), _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_T, RGB_M_SW , RGB_MOD,RGB_RMOD, A(KC_F2), _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_T, RGB_M_SW ,
RGB_HUI, RGB_HUD, RGB_M_P , _______, RESET , _______, _______, _______, _______, _______, _______, _______, RGB_M_SN , RGB_HUI, RGB_HUD, RGB_M_P , _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, RGB_M_SN ,
RGB_SAI, RGB_SAD, RGB_M_B , _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_K , RGB_SAI, RGB_SAD, RGB_M_B , _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_K ,
RGB_VAI, RGB_VAD, RGB_M_R , _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_X , RGB_VAI, RGB_VAD, RGB_M_R , _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_X ,
RGB_TOG, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_TW, RGB_M_G), RGB_TOG, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_TW, RGB_M_G),
@ -69,24 +52,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
}; };
// clang-format on // clang-format on
// let us assume we start with both layers off
static bool toggle_lwr = false;
static bool toggle_rse = false;
bool led_update_user(led_t led_state) { bool led_update_user(led_t led_state) {
// Disable the default LED update code, so that lock LEDs could be reused to show layer status. // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
return false; return false;
} }
void matrix_scan_user(void) { void matrix_scan_user(void) {
led_lwr(toggle_lwr);
led_rse(toggle_rse); toggle_leds();
led_t led_state = host_keyboard_led_state();
led_caps(led_state.caps_lock);
if (layer_state_is(_ADJ)) {
led_lwr(true);
led_rse(true);
}
} }
bool process_record_user(uint16_t keycode, keyrecord_t* record) { bool process_record_user(uint16_t keycode, keyrecord_t* record) {
@ -94,13 +68,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
case (TT(_LWR)): case (TT(_LWR)):
if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
// This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle. // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
toggle_lwr = !layer_state_is(_LWR); set_led_toggle(_LWR, !layer_state_is(_LWR));
} }
return true; return true;
break; break;
case (TT(_RSE)): case (TT(_RSE)):
if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
toggle_rse = !layer_state_is(_RSE); set_led_toggle(_RSE, !layer_state_is(_RSE));
} }
return true; return true;
break; break;
@ -110,61 +84,38 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
} }
layer_state_t layer_state_set_user(layer_state_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); set_rgb_layers(state);
rgblight_set_layer_state(1, layer_state_cmp(state, _LWR));
rgblight_set_layer_state(2, layer_state_cmp(state, _RSE));
rgblight_set_layer_state(3, layer_state_cmp(state, _ADJ));
#endif #endif
return update_tri_layer_state(state, _LWR, _RSE, _ADJ); return update_tri_layer_state(state, _LWR, _RSE, _ADJ);
} }
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
layer_state_t default_layer_state_set_user(layer_state_t state) { layer_state_t default_layer_state_set_user(layer_state_t state) {
rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); set_default_rgb_layers(state);
return state; return state;
} }
#endif
void keyboard_post_init_user(void) { void keyboard_post_init_user(void) {
#ifdef RGBLIGHT_ENABLE
// Enable the LED layers // Enable the LED layers
rgblight_layers = my_rgb_layers; rgblight_layers = my_rgb();
}
#endif #endif
#ifdef ENCODER_ENABLE #ifdef OLED_ENABLE
# define MEDIA_KEY_DELAY 10 init_timer();
static inline void my_encoders(const uint8_t index, const bool clockwise) {
if (index == 0) { /* First encoder */
if (IS_LAYER_ON(_LWR)) {
if (clockwise) {
rgblight_decrease_val_noeeprom();
} else {
rgblight_increase_val_noeeprom();
}
} else if (IS_LAYER_ON(_RSE)) {
if (clockwise) {
rgblight_decrease_hue_noeeprom();
} else {
rgblight_increase_hue_noeeprom();
}
} else {
if (clockwise) {
tap_code_delay(KC_VOLD, MEDIA_KEY_DELAY);
} else {
tap_code_delay(KC_VOLU, MEDIA_KEY_DELAY);
}
}
}
}
bool encoder_update_user(uint8_t index, bool clockwise) {
my_encoders(index, clockwise);
return true;
}
#endif #endif
}

View file

@ -18,40 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
#include "keymap_uk.h" #include "keymap_uk.h"
enum layer_names {
_QW = 0,
_LWR,
_RSE,
_ADJ
};
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
#include "print.h" #include "print.h"
#endif #endif
#ifdef OLED_ENABLE
static uint32_t oled_logo_timer = 0;
static bool clear_logo = true;
static const char PROGMEM m65_logo[] = {
0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
0};
#endif
#ifdef RGBLIGHT_ENABLE
const rgblight_segment_t PROGMEM my_qwerty_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_PURPLE});
const rgblight_segment_t PROGMEM my_lwr_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_CYAN});
const rgblight_segment_t PROGMEM my_rse_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_RED});
const rgblight_segment_t PROGMEM my_adj_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_GREEN});
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_qwerty_layer, my_lwr_layer, my_rse_layer, my_adj_layer);
#endif
const uint32_t PROGMEM unicode_map[] = { const uint32_t PROGMEM unicode_map[] = {
[la] = 0x03B1 , // α [la] = 0x03B1 , // α
[lA] = 0x0391 , // Α [lA] = 0x0391 , // Α
@ -254,7 +226,7 @@ raise layer shifted
KC_ESC , 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_ESC , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 ,
_______,XP(ra1,rA1), _______, _______, _______,XP(rt,rT), _______, _______,XP(ri,rI), _______, _______, _______, _______ , _______,XP(ra1,rA1), _______, _______, _______,XP(rt,rT), _______, _______,XP(ri,rI), _______, _______, _______, _______ ,
KC_CAPS, XP(ra,rA), XP(rs,rS), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , KC_CAPS, XP(ra,rA), XP(rs,rS), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
_______, _______, _______, _______,XP(rc,rC), _______, _______, _______, _______, _______, _______, KC_WH_U, _______ , _______, KC_F20 , _______, _______,XP(rc,rC), _______, _______, _______, _______, _______, _______, KC_WH_U, _______ ,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R),
/* /*
adj layer adj layer
@ -272,49 +244,43 @@ adj layer
*/ */
[_ADJ] = LAYOUT_ortho_5x13( [_ADJ] = LAYOUT_ortho_5x13(
RGB_MOD, RGB_RMOD, A(KC_F2), _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_T , RGB_M_SW, RGB_MOD, RGB_RMOD, A(KC_F2), _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_T , RGB_M_SW,
RGB_HUI, RGB_HUD , RGB_M_P , _______, RESET , _______, _______, _______, _______, _______, _______, _______ , RGB_M_SN, RGB_HUI, RGB_HUD , RGB_M_P , _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______ , RGB_M_SN,
RGB_SAI, RGB_SAD , RGB_M_B , _______, _______, _______, _______, _______, _______, _______, _______, _______ , RGB_M_K , RGB_SAI, RGB_SAD , RGB_M_B , _______, _______, _______, _______, _______, _______, _______, _______, _______ , RGB_M_K ,
RGB_VAI, RGB_VAD , RGB_M_R , _______, _______, _______, _______, _______, _______, _______, _______, _______ , RGB_M_X , RGB_VAI, RGB_VAD , RGB_M_R , _______, _______, _______, _______, _______, _______, _______, _______, _______ , RGB_M_X ,
RGB_TOG, _______ , _______ , _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_TW, RGB_M_G), RGB_TOG, _______ , _______ , _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_TW, RGB_M_G),
}; };
// clang-format on // clang-format on
// let us assume we start with both layers off
static bool toggle_lwr = false;
static bool toggle_rse = false;
bool led_update_user(led_t led_state) { bool led_update_user(led_t led_state) {
// Disable the default LED update code, so that lock LEDs could be reused to show layer status. // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
return false; return false;
} }
void matrix_scan_user(void) { void matrix_scan_user(void) {
led_lwr(toggle_lwr);
led_rse(toggle_rse); toggle_leds();
led_t led_state = host_keyboard_led_state();
led_caps(led_state.caps_lock);
if (layer_state_is(_ADJ)) {
led_lwr(true);
led_rse(true);
}
} }
bool process_record_user(uint16_t keycode, keyrecord_t* record) { bool process_record_user(uint16_t keycode, keyrecord_t* record) {
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
uprintf("KL: kc: 0x%04X, col: %u, row: %u, pressed: %b, time: %u, interrupt: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); uprintf("KL: kc: 0x%04X, col: %u, row: %u, pressed: %b, time: %u, interrupt: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count);
#endif #endif
switch (keycode) { switch (keycode) {
case (TT(_LWR)): case (TT(_LWR)):
if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
// This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle. // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
toggle_lwr = !layer_state_is(_LWR); set_led_toggle(_LWR, !layer_state_is(_LWR));
} }
return true; return true;
break; break;
case (TT(_RSE)): case (TT(_RSE)):
if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
toggle_rse = !layer_state_is(_RSE); set_led_toggle(_RSE, !layer_state_is(_RSE));
} }
return true; return true;
break; break;
@ -324,29 +290,38 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
} }
layer_state_t layer_state_set_user(layer_state_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); set_rgb_layers(state);
rgblight_set_layer_state(1, layer_state_cmp(state, _LWR));
rgblight_set_layer_state(2, layer_state_cmp(state, _RSE));
rgblight_set_layer_state(3, layer_state_cmp(state, _ADJ));
#endif #endif
return update_tri_layer_state(state, _LWR, _RSE, _ADJ); return update_tri_layer_state(state, _LWR, _RSE, _ADJ);
} }
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
layer_state_t default_layer_state_set_user(layer_state_t state) { layer_state_t default_layer_state_set_user(layer_state_t state) {
rgblight_set_layer_state(0, layer_state_cmp(state, _QW));
set_default_rgb_layers(state);
return state; return state;
} }
#endif
void keyboard_post_init_user(void) { void keyboard_post_init_user(void) {
// Enable the LED layers #ifdef RGBLIGHT_ENABLE
rgblight_layers = my_rgb_layers;
// Enable the LED layers
rgblight_layers = my_rgb();
#endif
#ifdef OLED_ENABLE #ifdef OLED_ENABLE
oled_logo_timer = timer_read32();
init_timer();
#endif #endif
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
@ -354,109 +329,6 @@ void keyboard_post_init_user(void) {
debug_enable = true; debug_enable = true;
debug_matrix = true; debug_matrix = true;
debug_keyboard = true; debug_keyboard = true;
#endif
}
#endif
#ifdef ENCODER_ENABLE
# define MEDIA_KEY_DELAY 10
static inline void my_encoders(const uint8_t index, const bool clockwise) {
if (index == 0) { /* First encoder */
if (IS_LAYER_ON(_LWR)) {
if (clockwise) {
rgblight_decrease_val_noeeprom();
} else {
rgblight_increase_val_noeeprom();
}
} else if (IS_LAYER_ON(_RSE)) {
if (clockwise) {
rgblight_decrease_hue_noeeprom();
} else {
rgblight_increase_hue_noeeprom();
}
} else {
if (clockwise) {
tap_code_delay(KC_VOLD, MEDIA_KEY_DELAY);
} else {
tap_code_delay(KC_VOLU, MEDIA_KEY_DELAY);
}
}
}
}
bool encoder_update_user(uint8_t index, bool clockwise) {
my_encoders(index, clockwise);
return true;
}
#endif
#ifdef OLED_ENABLE
static void render_logo(void) {
oled_write_P(m65_logo, false);
}
void user_oled_magic(void) {
// Host Keyboard Layer Status
oled_write_P(PSTR("Layer: "), false);
switch (get_highest_layer(layer_state)) {
case _QW:
oled_write_P(PSTR("Default\n"), false);
break;
case _LWR:
oled_write_P(PSTR("Lower\n"), false);
break;
case _RSE:
oled_write_P(PSTR("Raise\n"), false);
break;
case _ADJ:
oled_write_P(PSTR("ADJ\n"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("Undefined"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(led_state.num_lock ? PSTR("Lower ") : PSTR(" "), false);
oled_write_P(led_state.scroll_lock ? PSTR("Raise ") : PSTR(" "), false);
oled_write_P(led_state.caps_lock ? PSTR("CapsLock ") : PSTR(" "), false);
#ifdef WPM_ENABLE
oled_write_P(PSTR("\nwpm: "), false);
uint8_t wpm = get_current_wpm();
oled_write_P(wpm != 0 ? get_u8_str(wpm,' ') : PSTR(" "), false);
#endif
}
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180;
}
void clear_screen(void) {
if (clear_logo){
for (uint8_t i = 0; i < OLED_DISPLAY_HEIGHT; ++i) {
for (uint8_t j = 0; j < OLED_DISPLAY_WIDTH; ++j) {
oled_write_raw_byte(0x0, i*OLED_DISPLAY_WIDTH + j);
}
}
clear_logo = false;
}
}
# define SHOW_LOGO 5000
bool oled_task_user(void) {
if ((timer_elapsed32(oled_logo_timer) < SHOW_LOGO)){
render_logo();
}else{
clear_screen();
user_oled_magic();
}
return false;
}
#endif #endif
}

View file

@ -17,23 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
enum layer_names {
_QW = 0,
_LWR,
_RSE,
_ADJ
};
#ifdef RGBLIGHT_ENABLE
const rgblight_segment_t PROGMEM my_qwerty_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_PURPLE});
const rgblight_segment_t PROGMEM my_lwr_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_CYAN});
const rgblight_segment_t PROGMEM my_rse_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_RED});
const rgblight_segment_t PROGMEM my_adj_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_GREEN});
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_qwerty_layer, my_lwr_layer, my_rse_layer, my_adj_layer);
#endif
// clang-format off // clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@ -67,24 +50,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
}; };
// clang-format on // clang-format on
// let us assume we start with both layers off
static bool toggle_lwr = false;
static bool toggle_rse = false;
bool led_update_user(led_t led_state) { bool led_update_user(led_t led_state) {
// Disable the default LED update code, so that lock LEDs could be reused to show layer status. // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
return false; return false;
} }
void matrix_scan_user(void) { void matrix_scan_user(void) {
led_lwr(toggle_lwr);
led_rse(toggle_rse); toggle_leds();
led_t led_state = host_keyboard_led_state();
led_caps(led_state.caps_lock);
if (layer_state_is(_ADJ)) {
led_lwr(true);
led_rse(true);
}
} }
bool process_record_user(uint16_t keycode, keyrecord_t* record) { bool process_record_user(uint16_t keycode, keyrecord_t* record) {
@ -92,13 +66,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
case (TT(_LWR)): case (TT(_LWR)):
if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
// This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle. // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
toggle_lwr = !layer_state_is(_LWR); set_led_toggle(_LWR, !layer_state_is(_LWR));
} }
return true; return true;
break; break;
case (TT(_RSE)): case (TT(_RSE)):
if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) { if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
toggle_rse = !layer_state_is(_RSE); set_led_toggle(_RSE, !layer_state_is(_RSE));
} }
return true; return true;
break; break;
@ -108,118 +82,37 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
} }
layer_state_t layer_state_set_user(layer_state_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); set_rgb_layers(state);
rgblight_set_layer_state(1, layer_state_cmp(state, _LWR));
rgblight_set_layer_state(2, layer_state_cmp(state, _RSE));
rgblight_set_layer_state(3, layer_state_cmp(state, _ADJ));
#endif #endif
return update_tri_layer_state(state, _LWR, _RSE, _ADJ); return update_tri_layer_state(state, _LWR, _RSE, _ADJ);
} }
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
layer_state_t default_layer_state_set_user(layer_state_t state) { layer_state_t default_layer_state_set_user(layer_state_t state) {
rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); set_default_rgb_layers(state);
return state; return state;
} }
void keyboard_post_init_user(void) {
// Enable the LED layers
rgblight_layers = my_rgb_layers;
}
#endif #endif
#ifdef ENCODER_ENABLE void keyboard_post_init_user(void) {
# define MEDIA_KEY_DELAY 10 #ifdef RGBLIGHT_ENABLE
static inline void my_encoders(const uint8_t index, const bool clockwise) { // Enable the LED layers
if (index == 0) { /* First encoder */ rgblight_layers = my_rgb();
if (IS_LAYER_ON(_LWR)) {
if (clockwise) {
rgblight_decrease_val_noeeprom();
} else {
rgblight_increase_val_noeeprom();
}
} else if (IS_LAYER_ON(_RSE)) {
if (clockwise) {
rgblight_decrease_hue_noeeprom();
} else {
rgblight_increase_hue_noeeprom();
}
} else {
if (clockwise) {
tap_code_delay(KC_VOLD, MEDIA_KEY_DELAY);
} else {
tap_code_delay(KC_VOLU, MEDIA_KEY_DELAY);
}
}
}
}
bool encoder_update_user(uint8_t index, bool clockwise) {
my_encoders(index, clockwise);
return true;
}
#endif #endif
#ifdef OLED_ENABLE #ifdef OLED_ENABLE
static void render_logo(void) { init_timer();
static const char PROGMEM m65_logo[] = {
// 'slon', 128x32px
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0xc0, 0xa0, 0xa0,
0xa0, 0xd0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0c, 0xc3, 0x3c, 0x0f, 0x05, 0x14, 0x14,
0x04, 0xfc, 0x9f, 0x88, 0x80, 0x81, 0xe7, 0xfc, 0x03, 0x03, 0x07, 0x05, 0x06, 0x06, 0x08, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x04, 0x10, 0x18, 0x30, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xe0, 0xde, 0xc1, 0xf0, 0x89, 0x0b, 0x18, 0x08, 0x04, 0x04,
0x01, 0x1a, 0x0f, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x20, 0x20, 0x60, 0x40, 0x40, 0x42, 0x40, 0x40,
0x40, 0x40, 0x40, 0xe0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x13, 0x7c, 0xe0, 0xc0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05,
0x05, 0x05, 0x07, 0x05, 0x07, 0x07, 0x07, 0x07, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x07,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x04, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00
};
oled_write_raw_P(m65_logo, sizeof(m65_logo));
}
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return rotation;
}
bool oled_task_user(void) {
//user_oled_magic();
render_logo();
return false;
}
#endif #endif
}

View file

@ -16,3 +16,189 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "m65.h" #include "m65.h"
// let us assume we start with both layers off
static bool toggle_lwr = false;
static bool toggle_rse = false;
#ifdef RGBLIGHT_ENABLE
const rgblight_segment_t PROGMEM my_qwerty_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_PURPLE});
const rgblight_segment_t PROGMEM my_lwr_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_CYAN});
const rgblight_segment_t PROGMEM my_rse_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_RED});
const rgblight_segment_t PROGMEM my_adj_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLED_NUM, HSV_GREEN});
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_qwerty_layer, my_lwr_layer, my_rse_layer, my_adj_layer);
#endif
#ifdef OLED_ENABLE
static uint32_t oled_logo_timer = 0;
static bool clear_logo = true;
static const char PROGMEM m65_logo[] = {
0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
0};
#endif
#ifdef RGBLIGHT_ENABLE
void set_rgb_layers(layer_state_t state){
rgblight_set_layer_state(0, layer_state_cmp(state, _QW));
rgblight_set_layer_state(1, layer_state_cmp(state, _LWR));
rgblight_set_layer_state(2, layer_state_cmp(state, _RSE));
rgblight_set_layer_state(3, layer_state_cmp(state, _ADJ));
}
void set_default_rgb_layers(layer_state_t state){
rgblight_set_layer_state(0, layer_state_cmp(state, _QW));
}
const rgblight_segment_t * const* my_rgb(void){
return my_rgb_layers;
}
#endif
void set_led_toggle(const uint8_t layer, const bool state){
switch (layer) {
case _LWR:
toggle_lwr = state;
break;
case _RSE:
toggle_rse = state;
break;
default:
break;
}
}
void toggle_leds(void){
led_lwr(toggle_lwr);
led_rse(toggle_rse);
led_t led_state = host_keyboard_led_state();
led_caps(led_state.caps_lock);
if (layer_state_is(_ADJ)) {
led_lwr(true);
led_rse(true);
}
}
#ifdef ENCODER_ENABLE
# define MEDIA_KEY_DELAY 10
void my_encoders(const uint8_t index, const bool clockwise) {
if (index == 0) { /* First encoder */
if (IS_LAYER_ON(_LWR)) {
if (clockwise) {
rgblight_decrease_val_noeeprom();
} else {
rgblight_increase_val_noeeprom();
}
} else if (IS_LAYER_ON(_RSE)) {
if (clockwise) {
rgblight_decrease_hue_noeeprom();
} else {
rgblight_increase_hue_noeeprom();
}
} else {
if (clockwise) {
tap_code_delay(KC_VOLD, MEDIA_KEY_DELAY);
} else {
tap_code_delay(KC_VOLU, MEDIA_KEY_DELAY);
}
}
}
}
bool encoder_update_kb(uint8_t index, bool clockwise) {
if (!encoder_update_user(index, clockwise)) { return false; }
my_encoders(index, clockwise);
return false;
}
#endif
#ifdef OLED_ENABLE
void init_timer(void){
oled_logo_timer = timer_read32();
};
void user_oled_magic(void) {
// Host Keyboard Layer Status
oled_write_P(PSTR("Layer: "), false);
switch (get_highest_layer(layer_state)) {
case _QW:
oled_write_P(PSTR("Default\n"), false);
break;
case _LWR:
oled_write_P(PSTR("Lower\n"), false);
break;
case _RSE:
oled_write_P(PSTR("Raise\n"), false);
break;
case _ADJ:
oled_write_P(PSTR("ADJ\n"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("Undefined"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(led_state.num_lock ? PSTR("Lower ") : PSTR(" "), false);
oled_write_P(led_state.scroll_lock ? PSTR("Raise ") : PSTR(" "), false);
oled_write_P(led_state.caps_lock ? PSTR("CapsLock ") : PSTR(" "), false);
#ifdef WPM_ENABLE
oled_write_P(PSTR("\nwpm: "), false);
uint8_t wpm = get_current_wpm();
oled_write_P(wpm != 0 ? get_u8_str(wpm,' ') : PSTR(" "), false);
#endif
}
void render_logo(void) {
oled_write_P(m65_logo, false);
}
void clear_screen(void) {
if (clear_logo){
for (uint8_t i = 0; i < OLED_DISPLAY_HEIGHT; ++i) {
for (uint8_t j = 0; j < OLED_DISPLAY_WIDTH; ++j) {
oled_write_raw_byte(0x0, i*OLED_DISPLAY_WIDTH + j);
}
}
clear_logo = false;
}
}
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180;
}
# define SHOW_LOGO 5000
bool oled_task_kb(void) {
if (!oled_task_user()) { return false; }
if ((timer_elapsed32(oled_logo_timer) < SHOW_LOGO)){
render_logo();
}else{
clear_screen();
user_oled_magic();
}
return false;
}
#endif

View file

@ -108,8 +108,44 @@ enum unicode_names {
rS, rS,
rt, rt,
rT, rT,
ro,
rO,
ra2,
rA2,
ra3,
rA3
}; };
enum layer_names {
_QW = 0,
_LWR,
_RSE,
_ADJ
};
#ifdef OLED_ENABLE
void user_oled_magic(void);
void render_logo(void);
void clear_screen(void);
void init_timer(void);
#endif
#ifdef ENCODER_ENABLE
void my_encoders(const uint8_t, const bool);
bool encoder_update_user(uint8_t, bool);
#endif
#ifdef RGBLIGHT_ENABLE
void set_rgb_layers(layer_state_t);
const rgblight_segment_t * const* my_rgb(void);
void set_default_rgb_layers(layer_state_t);
#endif
void toggle_leds(void);
void set_led_toggle(const uint8_t, const bool);
static inline void led_lwr(const bool on) { static inline void led_lwr(const bool on) {
#ifdef LED_NUM_LOCK_PIN #ifdef LED_NUM_LOCK_PIN
writePin(LED_NUM_LOCK_PIN, on); writePin(LED_NUM_LOCK_PIN, on);
@ -123,11 +159,10 @@ static inline void led_rse(const bool on) {
} }
static inline void led_caps(const bool on) { static inline void led_caps(const bool on) {
#ifdef LED_CAPS_LOCK_PIN #ifdef LED_CAPS_LOCK_PIN
if ((DEVICE_VER == 0x0001) || (DEVICE_VER == 0x0003) || (DEVICE_VER == 0x0004)) { if ((PRODUCT_ID == 0x6061) && (DEVICE_VER == 0x0002)) {
writePin(LED_CAPS_LOCK_PIN, !on);
}
if (DEVICE_VER == 0x0002) {
writePin(LED_CAPS_LOCK_PIN, on); writePin(LED_CAPS_LOCK_PIN, on);
} else {
writePin(LED_CAPS_LOCK_PIN, !on);
} }
#endif #endif
} }

View file

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define DEVICE_VER 0x0001 #define DEVICE_VER 0x0001
#define PRODUCT_ID 0x6060 #define PRODUCT_ID 0x6061
#define LED_NUM_LOCK_PIN B12 #define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13 #define LED_SCROLL_LOCK_PIN B13

View file

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define DEVICE_VER 0x0002 #define DEVICE_VER 0x0002
#define PRODUCT_ID 0x6060 #define PRODUCT_ID 0x6061
#define LED_NUM_LOCK_PIN B12 #define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13 #define LED_SCROLL_LOCK_PIN B13

View file

@ -17,8 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define DEVICE_VER 0x0003 #define DEVICE_VER 0x0001
#define PRODUCT_ID 0x6060 #define PRODUCT_ID 0x6062
#define LED_NUM_LOCK_PIN B12 #define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13 #define LED_SCROLL_LOCK_PIN B13
@ -31,18 +31,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COL_PINS \ #define MATRIX_COL_PINS \
{ A10, A15, B3, B4, B5, B9, B8, B7, A1, A2, A3, A4, B1 } { A10, A15, B3, B4, B5, B9, B8, B7, A1, A2, A3, A4, B1 }
#ifdef ENCODER_ENABLE
#define ENCODERS_PAD_A \ #define ENCODERS_PAD_A \
{ A0 } { A0 }
#define ENCODERS_PAD_B \ #define ENCODERS_PAD_B \
{ B6 } { B6 }
#define ENCODER_RESOLUTION 4
#endif
#ifdef RGBLIGHT_ENABLE
#define RGB_DI_PIN B15 #define RGB_DI_PIN B15
#define UNUSED_PINS
#define RGBLIGHT_LAYERS #define RGBLIGHT_LAYERS
#define ENCODER_RESOLUTION 4
#undef RGBLED_NUM #undef RGBLED_NUM
#define RGBLED_NUM 20 #define RGBLED_NUM 20
#define RGBLIGHT_EFFECT_BREATHING #define RGBLIGHT_EFFECT_BREATHING
@ -57,3 +57,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define RGBLIGHT_EFFECT_TWINKLE #define RGBLIGHT_EFFECT_TWINKLE
#define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_SAT_STEP 8
#endif
#define UNUSED_PINS
// you want to comment this if using stm32-dfu as bootloader
#define FEE_PAGE_BASE_ADDRESS 0x08008000

View file

@ -0,0 +1,88 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* STM32F401xE memory setup.
*/
MEMORY
{
flash0 (rx) : org = 0x08000000, len = 16k /* tinyuf2 bootloader requires app to be located at 64k offset for this MCU */
flash1 (rx) : org = 0x08004000, len = 16k
flash2 (rx) : org = 0x08008000, len = 16k /* emulated eeprom */
flash3 (rx) : org = 0x0800C000, len = 16k
flash4 (rx) : org = 0x08010000, len = 512k - 64k
flash5 (rx) : org = 0x00000000, len = 0
flash6 (rx) : org = 0x00000000, len = 0
flash7 (rx) : org = 0x00000000, len = 0
ram0 (wx) : org = 0x20000000, len = 96k
ram1 (wx) : org = 0x00000000, len = 0
ram2 (wx) : org = 0x00000000, len = 0
ram3 (wx) : org = 0x00000000, len = 0
ram4 (wx) : org = 0x00000000, len = 0
ram5 (wx) : org = 0x00000000, len = 0
ram6 (wx) : org = 0x00000000, len = 0
ram7 (wx) : org = 0x00000000, len = 0
}
/* For each data/text section two region are defined, a virtual region
and a load region (_LMA suffix).*/
/* Flash region to be used for exception vectors.*/
REGION_ALIAS("VECTORS_FLASH", flash4);
REGION_ALIAS("VECTORS_FLASH_LMA", flash4);
/* Flash region to be used for constructors and destructors.*/
REGION_ALIAS("XTORS_FLASH", flash4);
REGION_ALIAS("XTORS_FLASH_LMA", flash4);
/* Flash region to be used for code text.*/
REGION_ALIAS("TEXT_FLASH", flash4);
REGION_ALIAS("TEXT_FLASH_LMA", flash4);
/* Flash region to be used for read only data.*/
REGION_ALIAS("RODATA_FLASH", flash4);
REGION_ALIAS("RODATA_FLASH_LMA", flash4);
/* Flash region to be used for various.*/
REGION_ALIAS("VARIOUS_FLASH", flash4);
REGION_ALIAS("VARIOUS_FLASH_LMA", flash4);
/* Flash region to be used for RAM(n) initialization data.*/
REGION_ALIAS("RAM_INIT_FLASH_LMA", flash4);
/* RAM region to be used for Main stack. This stack accommodates the processing
of all exceptions and interrupts.*/
REGION_ALIAS("MAIN_STACK_RAM", ram0);
/* RAM region to be used for the process stack. This is the stack used by
the main() function.*/
REGION_ALIAS("PROCESS_STACK_RAM", ram0);
/* RAM region to be used for data segment.*/
REGION_ALIAS("DATA_RAM", ram0);
REGION_ALIAS("DATA_RAM_LMA", flash4);
/* RAM region to be used for BSS segment.*/
REGION_ALIAS("BSS_RAM", ram0);
/* RAM region to be used for the default heap.*/
REGION_ALIAS("HEAP_RAM", ram0);
/* Generic rules inclusion.*/
INCLUDE rules.ld
/* TinyUF2 bootloader reset support */
_board_dfu_dbl_tap = ORIGIN(ram0) + 64k - 4; /* this is based off the linker file for tinyuf2 */

View file

@ -2,7 +2,10 @@
MCU = STM32F401 MCU = STM32F401
# Bootloader selection # Bootloader selection
BOOTLOADER = stm32-dfu BOOTLOADER = tinyuf2
#BOOTLOADER = stm32-dfu
MCU_LDSCRIPT = STM32F401xE
EEPROM_DRIVER = vendor
# Build Options # Build Options
# change yes to no to disable # change yes to no to disable

View file

@ -17,8 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define DEVICE_VER 0x0004 #define DEVICE_VER 0x0002
#define PRODUCT_ID 0x6060 #define PRODUCT_ID 0x6062
#define LED_NUM_LOCK_PIN B12 #define LED_NUM_LOCK_PIN B12
#define LED_SCROLL_LOCK_PIN B13 #define LED_SCROLL_LOCK_PIN B13
@ -31,18 +31,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COL_PINS \ #define MATRIX_COL_PINS \
{ B14, A8, A10, A15, B3, B4, B5, B7, A1, A2, A3, A4, B1 } { B14, A8, A10, A15, B3, B4, B5, B7, A1, A2, A3, A4, B1 }
#ifdef ENCODER_ENABLE
#define ENCODERS_PAD_A \ #define ENCODERS_PAD_A \
{ A0 } { A0 }
#define ENCODERS_PAD_B \ #define ENCODERS_PAD_B \
{ B6 } { B6 }
#define ENCODER_RESOLUTION 4
#endif
#ifdef RGBLIGHT_ENABLE
#define RGB_DI_PIN B15 #define RGB_DI_PIN B15
#define UNUSED_PINS
#define RGBLIGHT_LAYERS #define RGBLIGHT_LAYERS
#define ENCODER_RESOLUTION 4
#undef RGBLED_NUM #undef RGBLED_NUM
#define RGBLED_NUM 20 #define RGBLED_NUM 20
#define RGBLIGHT_EFFECT_BREATHING #define RGBLIGHT_EFFECT_BREATHING
@ -58,6 +58,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_SAT_STEP 8
#endif
#ifdef OLED_ENABLE #ifdef OLED_ENABLE
# define OLED_DISPLAY_128X32 # define OLED_DISPLAY_128X32
#define I2C1_SCL_PIN B9 #define I2C1_SCL_PIN B9
@ -65,3 +67,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define OLED_BRIGHTNESS 128 #define OLED_BRIGHTNESS 128
#define OLED_FONT_H "keyboards/mlego/m65/lib/glcdfont.c" #define OLED_FONT_H "keyboards/mlego/m65/lib/glcdfont.c"
#endif #endif
#define UNUSED_PINS
// you want to comment this if using stm32-dfu as bootloader
#define FEE_PAGE_BASE_ADDRESS 0x08008000

View file

@ -0,0 +1,88 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* STM32F401xE memory setup.
*/
MEMORY
{
flash0 (rx) : org = 0x08000000, len = 16k /* tinyuf2 bootloader requires app to be located at 64k offset for this MCU */
flash1 (rx) : org = 0x08004000, len = 16k
flash2 (rx) : org = 0x08008000, len = 16k /* emulated eeprom */
flash3 (rx) : org = 0x0800C000, len = 16k
flash4 (rx) : org = 0x08010000, len = 512k - 64k
flash5 (rx) : org = 0x00000000, len = 0
flash6 (rx) : org = 0x00000000, len = 0
flash7 (rx) : org = 0x00000000, len = 0
ram0 (wx) : org = 0x20000000, len = 96k
ram1 (wx) : org = 0x00000000, len = 0
ram2 (wx) : org = 0x00000000, len = 0
ram3 (wx) : org = 0x00000000, len = 0
ram4 (wx) : org = 0x00000000, len = 0
ram5 (wx) : org = 0x00000000, len = 0
ram6 (wx) : org = 0x00000000, len = 0
ram7 (wx) : org = 0x00000000, len = 0
}
/* For each data/text section two region are defined, a virtual region
and a load region (_LMA suffix).*/
/* Flash region to be used for exception vectors.*/
REGION_ALIAS("VECTORS_FLASH", flash4);
REGION_ALIAS("VECTORS_FLASH_LMA", flash4);
/* Flash region to be used for constructors and destructors.*/
REGION_ALIAS("XTORS_FLASH", flash4);
REGION_ALIAS("XTORS_FLASH_LMA", flash4);
/* Flash region to be used for code text.*/
REGION_ALIAS("TEXT_FLASH", flash4);
REGION_ALIAS("TEXT_FLASH_LMA", flash4);
/* Flash region to be used for read only data.*/
REGION_ALIAS("RODATA_FLASH", flash4);
REGION_ALIAS("RODATA_FLASH_LMA", flash4);
/* Flash region to be used for various.*/
REGION_ALIAS("VARIOUS_FLASH", flash4);
REGION_ALIAS("VARIOUS_FLASH_LMA", flash4);
/* Flash region to be used for RAM(n) initialization data.*/
REGION_ALIAS("RAM_INIT_FLASH_LMA", flash4);
/* RAM region to be used for Main stack. This stack accommodates the processing
of all exceptions and interrupts.*/
REGION_ALIAS("MAIN_STACK_RAM", ram0);
/* RAM region to be used for the process stack. This is the stack used by
the main() function.*/
REGION_ALIAS("PROCESS_STACK_RAM", ram0);
/* RAM region to be used for data segment.*/
REGION_ALIAS("DATA_RAM", ram0);
REGION_ALIAS("DATA_RAM_LMA", flash4);
/* RAM region to be used for BSS segment.*/
REGION_ALIAS("BSS_RAM", ram0);
/* RAM region to be used for the default heap.*/
REGION_ALIAS("HEAP_RAM", ram0);
/* Generic rules inclusion.*/
INCLUDE rules.ld
/* TinyUF2 bootloader reset support */
_board_dfu_dbl_tap = ORIGIN(ram0) + 64k - 4; /* this is based off the linker file for tinyuf2 */

View file

@ -2,7 +2,10 @@
MCU = STM32F401 MCU = STM32F401
# Bootloader selection # Bootloader selection
BOOTLOADER = stm32-dfu BOOTLOADER = tinyuf2
#BOOTLOADER = stm32-dfu
MCU_LDSCRIPT = STM32F401xE
EEPROM_DRIVER = vendor
# Build Options # Build Options
# change yes to no to disable # change yes to no to disable