From 9185ad707dbaa83b01c41c67b0246180512bc291 Mon Sep 17 00:00:00 2001 From: Nathan Olivares Date: Thu, 7 Oct 2021 21:04:46 -0400 Subject: [PATCH] Updated for ChibiOS and bugs Migrated the configurations to the new ChibiOS version and fixed a bug that prevented you from capitalizing combined keys in qwerty mdoe --- keyboards/noll/ecosteno/chconf.h | 730 +----------------- keyboards/noll/ecosteno/config.h | 8 +- keyboards/noll/ecosteno/ecosteno.h | 6 - keyboards/noll/ecosteno/halconf.h | 537 +------------ keyboards/noll/ecosteno/info.json | 74 -- keyboards/noll/ecosteno/keyboard.c | 24 +- .../noll/ecosteno/keymaps/default/keymap.c | 331 ++++++-- keyboards/noll/ecosteno/mcuconf.h | 217 +----- keyboards/noll/ecosteno/readme.md | 2 +- keyboards/noll/ecosteno/rules.mk | 3 +- keyboards/noll/noll_ecosteno_default.bin | Bin 30824 -> 0 bytes .../noll/noll_ecosteno_default_gemini_pr.bin | Bin 0 -> 31528 bytes .../noll/noll_ecosteno_default_tx_bolt.bin | Bin 0 -> 31832 bytes 13 files changed, 370 insertions(+), 1562 deletions(-) delete mode 100644 keyboards/noll/ecosteno/info.json delete mode 100644 keyboards/noll/noll_ecosteno_default.bin create mode 100644 keyboards/noll/noll_ecosteno_default_gemini_pr.bin create mode 100644 keyboards/noll/noll_ecosteno_default_tx_bolt.bin diff --git a/keyboards/noll/ecosteno/chconf.h b/keyboards/noll/ecosteno/chconf.h index 851e46c..f7bcbb5 100644 --- a/keyboards/noll/ecosteno/chconf.h +++ b/keyboards/noll/ecosteno/chconf.h @@ -1,714 +1,30 @@ +/* Copyright 2020 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + /* - ChibiOS - Copyrighcolbyt (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. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 100000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 0 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM FALSE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS FALSE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. + * This file was auto-generated by: + * `qmk chibios-confmigrate -i keyboards/noll/ecosteno/chconf.h -r platforms/chibios/common/configs/chconf.h` */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES FALSE -#endif -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES FALSE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES FALSE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS FALSE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} +#pragma once -/** @} */ +// These may not be needed -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ +#define CH_CFG_ST_TIMEDELTA 0 -#endif /* CHCONF_H */ +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE -/** @} */ +#include_next diff --git a/keyboards/noll/ecosteno/config.h b/keyboards/noll/ecosteno/config.h index 7a71b41..ef26399 100644 --- a/keyboards/noll/ecosteno/config.h +++ b/keyboards/noll/ecosteno/config.h @@ -27,8 +27,10 @@ #define MATRIX_ROWS 4 #define MATRIX_COLS 12 -#define MATRIX_COL_PINS { B15, B14, B13, B12, B1, B0, B9, B8, B7, B6, B5, B4 } -#define MATRIX_ROW_PINS { A15, B3, A7, A6 } +//#define MATRIX_COL_PINS { B15, B14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4 } // old 0.12 +#define MATRIX_COL_PINS { B15, B14, B13, B12, B1, B0, B9, B8, B7, B6, B5, B4 } // gd +//#define MATRIX_ROW_PINS { A15, B3, B1, B0 } // old 0.12 +#define MATRIX_ROW_PINS { A15, B3, A7, A6 } // current 0.16 #define DIODE_DIRECTION COL2ROW /* Set 0 if debouncing isn't needed */ @@ -40,7 +42,7 @@ /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -#define COMBO_COUNT 21 +#define COMBO_COUNT 40 // 42 with uppers, 21 without #define TAPPING_TERM 137 #define COMBO_TERM 35 #define FORCE_NKRO \ No newline at end of file diff --git a/keyboards/noll/ecosteno/ecosteno.h b/keyboards/noll/ecosteno/ecosteno.h index 4fc32f6..9a18423 100644 --- a/keyboards/noll/ecosteno/ecosteno.h +++ b/keyboards/noll/ecosteno/ecosteno.h @@ -29,9 +29,3 @@ {K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B}, \ {KC_NO, KC_NO, KC_NO, KC_NO, K34, K35, K36, K37, KC_NO, KC_NO, KC_NO, KC_NO} \ } - -// we dont want open drain, we want push pull(?) -// pal.h, 7U is open drain, 6U is push pull -// but it doesn't seem to affect anything here, works in keyboard.c though -//#define GPIOA_PIN0 6U // open drain -//#define GPIOA_PIN1 6U // open drain \ No newline at end of file diff --git a/keyboards/noll/ecosteno/halconf.h b/keyboards/noll/ecosteno/halconf.h index 9218037..c9f3836 100644 --- a/keyboards/noll/ecosteno/halconf.h +++ b/keyboards/noll/ecosteno/halconf.h @@ -1,525 +1,26 @@ -/* - 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. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. +/* Copyright 2020 QMK * - * @addtogroup HAL_CONF - * @{ + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. +/* + * This file was auto-generated by: + * `qmk chibios-confmigrate -i keyboards/noll/ecosteno/chconf.h -r platforms/chibios/common/configs/halconf.h` */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif +#pragma once -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif +// I don't think I need anything? -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 1 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ +#include_next diff --git a/keyboards/noll/ecosteno/info.json b/keyboards/noll/ecosteno/info.json deleted file mode 100644 index c63774c..0000000 --- a/keyboards/noll/ecosteno/info.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "keyboard_name": "Practice 60 but I need to change this", - "url": "", - "maintainer": "qmk", - "width": 15, - "height": 5, - "layouts": { - "LAYOUT_60_ansi": { - "layout": [ - {"label":"`", "x":0, "y":0}, - {"label":"1", "x":1, "y":0}, - {"label":"2", "x":2, "y":0}, - {"label":"3", "x":3, "y":0}, - {"label":"4", "x":4, "y":0}, - {"label":"5", "x":5, "y":0}, - {"label":"6", "x":6, "y":0}, - {"label":"7", "x":7, "y":0}, - {"label":"8", "x":8, "y":0}, - {"label":"9", "x":9, "y":0}, - {"label":"0", "x":10, "y":0}, - {"label":"-", "x":11, "y":0}, - {"label":"=", "x":12, "y":0}, - {"label":"Backspace", "x":13, "y":0, "w":2}, - {"label":"Tab", "x":0, "y":1, "w":1.5}, - {"label":"Q", "x":1.5, "y":1}, - {"label":"W", "x":2.5, "y":1}, - {"label":"E", "x":3.5, "y":1}, - {"label":"R", "x":4.5, "y":1}, - {"label":"T", "x":5.5, "y":1}, - {"label":"Y", "x":6.5, "y":1}, - {"label":"U", "x":7.5, "y":1}, - {"label":"I", "x":8.5, "y":1}, - {"label":"O", "x":9.5, "y":1}, - {"label":"P", "x":10.5, "y":1}, - {"label":"[", "x":11.5, "y":1}, - {"label":"]", "x":12.5, "y":1}, - {"label":"\\", "x":13.5, "y":1, "w":1.5}, - {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, - {"label":"A", "x":1.75, "y":2}, - {"label":"S", "x":2.75, "y":2}, - {"label":"D", "x":3.75, "y":2}, - {"label":"F", "x":4.75, "y":2}, - {"label":"G", "x":5.75, "y":2}, - {"label":"H", "x":6.75, "y":2}, - {"label":"J", "x":7.75, "y":2}, - {"label":"K", "x":8.75, "y":2}, - {"label":"L", "x":9.75, "y":2}, - {"label":";", "x":10.75, "y":2}, - {"label":"'", "x":11.75, "y":2}, - {"label":"Enter", "x":12.75, "y":2, "w":2.25}, - {"label":"Shift", "x":0, "y":3, "w":2.25}, - {"label":"Z", "x":2.25, "y":3}, - {"label":"X", "x":3.25, "y":3}, - {"label":"C", "x":4.25, "y":3}, - {"label":"V", "x":5.25, "y":3}, - {"label":"B", "x":6.25, "y":3}, - {"label":"N", "x":7.25, "y":3}, - {"label":"M", "x":8.25, "y":3}, - {"label":",", "x":9.25, "y":3}, - {"label":".", "x":10.25, "y":3}, - {"label":"/", "x":11.25, "y":3}, - {"label":"Shift", "x":12.25, "y":3, "w":2.75}, - {"label":"Ctrl", "x":0, "y":4, "w":1.25}, - {"label":"GUI", "x":1.25, "y":4, "w":1.25}, - {"label":"Alt", "x":2.5, "y":4, "w":1.25}, - {"label":"Space", "x":3.75, "y":4, "w":6.25}, - {"label":"Alt", "x":10, "y":4, "w":1.25}, - {"label":"GUI", "x":11.25, "y":4, "w":1.25}, - {"label":"Menu", "x":12.5, "y":4, "w":1.25}, - {"label":"Ctrl", "x":13.75, "y":4, "w":1.25} - ] - } - } -} diff --git a/keyboards/noll/ecosteno/keyboard.c b/keyboards/noll/ecosteno/keyboard.c index 600a6be..ed5bf8b 100644 --- a/keyboards/noll/ecosteno/keyboard.c +++ b/keyboards/noll/ecosteno/keyboard.c @@ -5,14 +5,20 @@ #ifdef BOARD_STM32_F103_STM32DUINO +// next 3 lines are for the stm board .12 +// #define LED_ON() do { palClearPad(GPIOC, 13) ;} while (0) +// #define LED_OFF() do { palSetPad(GPIOC, 13); } while (0) +// #define LED_TGL() do { palTogglePad(GPIOC, 13); } while (0) -#define RED_LED_OFF() do { palClearPad(GPIOA, 1) ;} while (0) // GPIOA1 is right green LED -#define RED_LED_ON() do { palSetPad(GPIOA, 1); } while (0) -#define RED_LED_TGL() do { palTogglePad(GPIOA, 1); } while (0) +// uncomment for .16 boards +// this is fairly unnecessary +#define RED_LED_OFF() do { palClearPad(GPIOA, 0) ;} while (0) // GPIOA1 is right green LED +#define RED_LED_ON() do { palSetPad(GPIOA, 0); } while (0) +#define RED_LED_TGL() do { palTogglePad(GPIOA, 0); } while (0) -#define GREEN_LED_OFF() do { palClearPad(GPIOA, 0) ;} while (0) // GPIOA1 is right green LED -#define GREEN_LED_ON() do { palSetPad(GPIOA, 0); } while (0) -#define GREEN_LED_TGL() do { palTogglePad(GPIOA, 0); } while (0) +#define GREEN_LED_OFF() do { palClearPad(GPIOA, 1) ;} while (0) // GPIOA1 is right green LED +#define GREEN_LED_ON() do { palSetPad(GPIOA, 1); } while (0) +#define GREEN_LED_TGL() do { palTogglePad(GPIOA, 1); } while (0) #else #define LED_ON() @@ -21,15 +27,19 @@ #endif void keyboard_pre_init_user(void){ + // Initialize LED pins to correct setting palSetPadMode(GPIOA, 0, PAL_MODE_OUTPUT_PUSHPULL); // 6U correct palSetPadMode(GPIOA, 1, PAL_MODE_OUTPUT_PUSHPULL); // 6U correct + } void matrix_init_kb(void){ + RED_LED_ON(); GREEN_LED_ON(); wait_ms(500); RED_LED_OFF(); - GREEN_LED_OFF(); + //GREEN_LED_OFF(); + } diff --git a/keyboards/noll/ecosteno/keymaps/default/keymap.c b/keyboards/noll/ecosteno/keymaps/default/keymap.c index 94f53d4..20adf5e 100644 --- a/keyboards/noll/ecosteno/keymaps/default/keymap.c +++ b/keyboards/noll/ecosteno/keymaps/default/keymap.c @@ -21,6 +21,7 @@ enum layers{ STENO, NKRO, QWERTY, + QWERTY_CAPS, SYMBOL }; @@ -34,8 +35,16 @@ enum combo_events { Q_J, Q_K, Q_L, + Q_A_UPPER, + Q_S_UPPER, + Q_D_UPPER, + Q_F_UPPER, + Q_G_UPPER, + Q_H_UPPER, + Q_J_UPPER, + Q_K_UPPER, + Q_L_UPPER, Q_SCLN, - Q_ENTER, Q_ONE, Q_TWO, Q_THREE, @@ -45,7 +54,18 @@ enum combo_events { Q_SEVEN, Q_EIGHT, Q_NINE, - Q_ZERO + Q_ZERO, + Q_SCLN_UPPER, + Q_ONE_UPPER, + Q_TWO_UPPER, + Q_THREE_UPPER, + Q_FOUR_UPPER, + Q_FIVE_UPPER, + Q_SIX_UPPER, + Q_SEVEN_UPPER, + Q_EIGHT_UPPER, + Q_NINE_UPPER, + Q_ZERO_UPPER }; const uint16_t PROGMEM Qwerty_A[] = {KC_Q, KC_Z, COMBO_END}; @@ -57,19 +77,40 @@ const uint16_t PROGMEM Qwerty_H[] = {KC_Y, KC_N, COMBO_END}; const uint16_t PROGMEM Qwerty_J[] = {KC_U, KC_M, COMBO_END}; const uint16_t PROGMEM Qwerty_K[] = {KC_I, KC_COMM, COMBO_END}; const uint16_t PROGMEM Qwerty_L[] = {KC_O, KC_DOT, COMBO_END}; -const uint16_t PROGMEM Qwerty_SCLN[] = {KC_P, KC_SLASH, COMBO_END}; -const uint16_t PROGMEM Qwerty_ENTER[] = {KC_QUOT, KC_RSHIFT, COMBO_END}; -const uint16_t PROGMEM Qwerty_ONE[] = {KC_Q, KC_TAB, COMBO_END}; -const uint16_t PROGMEM Qwerty_TWO[] = {KC_W, KC_TAB, COMBO_END}; +const uint16_t PROGMEM Qwerty_A_UPPER[] = {S(KC_Q), S(KC_Z), COMBO_END}; +const uint16_t PROGMEM Qwerty_S_UPPER[] = {S(KC_W), S(KC_X), COMBO_END}; +const uint16_t PROGMEM Qwerty_D_UPPER[] = {S(KC_E), S(KC_C), COMBO_END}; +const uint16_t PROGMEM Qwerty_F_UPPER[] = {S(KC_R), S(KC_V), COMBO_END}; +const uint16_t PROGMEM Qwerty_G_UPPER[] = {S(KC_T), S(KC_B), COMBO_END}; +const uint16_t PROGMEM Qwerty_H_UPPER[] = {S(KC_Y), S(KC_N), COMBO_END}; +const uint16_t PROGMEM Qwerty_J_UPPER[] = {S(KC_U), S(KC_M), COMBO_END}; +const uint16_t PROGMEM Qwerty_K_UPPER[] = {S(KC_I), S(KC_COMM), COMBO_END}; +const uint16_t PROGMEM Qwerty_L_UPPER[] = {S(KC_O), S(KC_DOT), COMBO_END}; + +const uint16_t PROGMEM Qwerty_SCLN[] = {KC_P, KC_SLASH, COMBO_END}; +const uint16_t PROGMEM Qwerty_ONE[] = {KC_Q, KC_TAB, COMBO_END}; +const uint16_t PROGMEM Qwerty_TWO[] = {KC_W, KC_TAB, COMBO_END}; const uint16_t PROGMEM Qwerty_THREE[] = {KC_E, KC_ESC, COMBO_END}; -const uint16_t PROGMEM Qwerty_FOUR[] = {KC_R, KC_ESC, COMBO_END}; -const uint16_t PROGMEM Qwerty_FIVE[] = {KC_T, KC_ESC, COMBO_END}; -const uint16_t PROGMEM Qwerty_SIX[] = {KC_Y, KC_ENTER, COMBO_END}; +const uint16_t PROGMEM Qwerty_FOUR[] = {KC_R, KC_ESC, COMBO_END}; +const uint16_t PROGMEM Qwerty_FIVE[] = {KC_T, KC_ESC, COMBO_END}; +const uint16_t PROGMEM Qwerty_SIX[] = {KC_Y, KC_ENTER, COMBO_END}; const uint16_t PROGMEM Qwerty_SEVEN[] = {KC_U, KC_ENTER, COMBO_END}; const uint16_t PROGMEM Qwerty_EIGHT[] = {KC_I, KC_ENTER, COMBO_END}; -const uint16_t PROGMEM Qwerty_NINE[] = {KC_O, KC_BSPC, COMBO_END}; -const uint16_t PROGMEM Qwerty_ZERO[] = {KC_P, KC_BSPC, COMBO_END}; +const uint16_t PROGMEM Qwerty_NINE[] = {KC_O, KC_BSPC, COMBO_END}; +const uint16_t PROGMEM Qwerty_ZERO[] = {KC_P, KC_BSPC, COMBO_END}; + +const uint16_t PROGMEM Qwerty_SCLN_UPPER[] = {S(KC_P), S(KC_SLASH), COMBO_END}; +const uint16_t PROGMEM Qwerty_ONE_UPPER[] = {S(KC_Q), S(KC_TAB), COMBO_END}; +const uint16_t PROGMEM Qwerty_TWO_UPPER[] = {S(KC_W), S(KC_TAB), COMBO_END}; +const uint16_t PROGMEM Qwerty_THREE_UPPER[] = {S(KC_E), S(KC_ESC), COMBO_END}; +const uint16_t PROGMEM Qwerty_FOUR_UPPER[] = {S(KC_R), S(KC_ESC), COMBO_END}; +const uint16_t PROGMEM Qwerty_FIVE_UPPER[] = {S(KC_T), S(KC_ESC), COMBO_END}; +const uint16_t PROGMEM Qwerty_SIX_UPPER[] = {S(KC_Y), S(KC_ENTER), COMBO_END}; +const uint16_t PROGMEM Qwerty_SEVEN_UPPER[] = {S(KC_U), S(KC_ENTER), COMBO_END}; +const uint16_t PROGMEM Qwerty_EIGHT_UPPER[] = {S(KC_I), S(KC_ENTER), COMBO_END}; +const uint16_t PROGMEM Qwerty_NINE_UPPER[] = {S(KC_O), S(KC_BSPC), COMBO_END}; +const uint16_t PROGMEM Qwerty_ZERO_UPPER[] = {S(KC_P), S(KC_BSPC), COMBO_END}; combo_t key_combos[COMBO_COUNT] = { @@ -82,125 +123,303 @@ combo_t key_combos[COMBO_COUNT] = { [Q_J] = COMBO_ACTION(Qwerty_J), [Q_K] = COMBO_ACTION(Qwerty_K), [Q_L] = COMBO_ACTION(Qwerty_L), - [Q_SCLN] = COMBO_ACTION(Qwerty_SCLN), - [Q_ENTER] = COMBO_ACTION(Qwerty_ENTER), - [Q_ONE] = COMBO_ACTION(Qwerty_ONE), - [Q_TWO] = COMBO_ACTION(Qwerty_TWO), + [Q_A_UPPER] = COMBO_ACTION(Qwerty_A_UPPER), + [Q_S_UPPER] = COMBO_ACTION(Qwerty_S_UPPER), + [Q_D_UPPER] = COMBO_ACTION(Qwerty_D_UPPER), + [Q_F_UPPER] = COMBO_ACTION(Qwerty_F_UPPER), + [Q_G_UPPER] = COMBO_ACTION(Qwerty_G_UPPER), + [Q_H_UPPER] = COMBO_ACTION(Qwerty_H_UPPER), + [Q_J_UPPER] = COMBO_ACTION(Qwerty_J_UPPER), + [Q_K_UPPER] = COMBO_ACTION(Qwerty_K_UPPER), + [Q_L_UPPER] = COMBO_ACTION(Qwerty_L_UPPER), + [Q_SCLN] = COMBO_ACTION(Qwerty_SCLN), + [Q_ONE] = COMBO_ACTION(Qwerty_ONE), + [Q_TWO] = COMBO_ACTION(Qwerty_TWO), [Q_THREE] = COMBO_ACTION(Qwerty_THREE), - [Q_FOUR] = COMBO_ACTION(Qwerty_FOUR), - [Q_FIVE] = COMBO_ACTION(Qwerty_FIVE), - [Q_SIX] = COMBO_ACTION(Qwerty_SIX), + [Q_FOUR] = COMBO_ACTION(Qwerty_FOUR), + [Q_FIVE] = COMBO_ACTION(Qwerty_FIVE), + [Q_SIX] = COMBO_ACTION(Qwerty_SIX), [Q_SEVEN] = COMBO_ACTION(Qwerty_SEVEN), [Q_EIGHT] = COMBO_ACTION(Qwerty_EIGHT), - [Q_NINE] = COMBO_ACTION(Qwerty_NINE), - [Q_ZERO] = COMBO_ACTION(Qwerty_ZERO) + [Q_NINE] = COMBO_ACTION(Qwerty_NINE), + [Q_ZERO] = COMBO_ACTION(Qwerty_ZERO), + + [Q_SCLN_UPPER] = COMBO_ACTION(Qwerty_SCLN_UPPER), + [Q_ONE_UPPER] = COMBO_ACTION(Qwerty_ONE_UPPER), + [Q_TWO_UPPER] = COMBO_ACTION(Qwerty_TWO_UPPER), + [Q_THREE_UPPER] = COMBO_ACTION(Qwerty_THREE_UPPER), + [Q_FOUR_UPPER] = COMBO_ACTION(Qwerty_FOUR_UPPER), + [Q_FIVE_UPPER] = COMBO_ACTION(Qwerty_FIVE_UPPER), + [Q_SIX_UPPER] = COMBO_ACTION(Qwerty_SIX_UPPER), + [Q_SEVEN_UPPER] = COMBO_ACTION(Qwerty_SEVEN_UPPER), + [Q_EIGHT_UPPER] = COMBO_ACTION(Qwerty_EIGHT_UPPER), + [Q_NINE_UPPER] = COMBO_ACTION(Qwerty_NINE_UPPER), + [Q_ZERO_UPPER] = COMBO_ACTION(Qwerty_ZERO_UPPER) }; void process_combo_event(uint16_t combo_index, bool pressed){ if(pressed){ switch(combo_index) { + case Q_A_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_A)); + } + break; + case Q_S_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_S)); + } + break; + case Q_D_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_D)); + } + break; + case Q_F_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_F)); + } + break; + case Q_G_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_G)); + } + break; + case Q_H_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_H)); + } + break; + case Q_J_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_J)); + } + break; + case Q_K_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_K)); + } + break; + case Q_L_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_L)); + } + break; + + case Q_SCLN_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_SCLN)); + } + break; + case Q_ONE_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_1)); + } + break; + case Q_TWO_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_2)); + } + break; + case Q_THREE_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_3)); + } + break; + case Q_FOUR_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_4)); + } + break; + case Q_FIVE_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_5)); + } + break; + case Q_SIX_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_6)); + } + break; + case Q_SEVEN_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_7)); + } + break; + case Q_EIGHT_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_8)); + } + break; + case Q_NINE_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_9)); + } + break; + case Q_ZERO_UPPER: + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_0)); + } + break; + + // now the "normal" combos case Q_A: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_A)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_A); } break; case Q_S: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_S)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_S); } break; case Q_D: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_D)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_D); } break; case Q_F: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_F)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_F); } break; case Q_G: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_G)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_G); } break; case Q_H: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_H)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_H); } break; case Q_J: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_J)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_J); } break; case Q_K: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_K)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_K); } break; case Q_L: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_L)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_L); } break; case Q_SCLN: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_SCLN)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_SCLN); } break; - case Q_ENTER: - if (IS_LAYER_ON(QWERTY)){ - tap_code16(KC_ENTER); - } - break; case Q_ONE: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_1)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_1); } break; case Q_TWO: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_2)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_2); } break; case Q_THREE: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_3)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_3); } break; case Q_FOUR: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_4)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_4); } break; case Q_FIVE: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_5)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_5); } break; case Q_SIX: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_6)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_6); } break; case Q_SEVEN: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_7)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_7); } break; case Q_EIGHT: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_8)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_8); } break; case Q_NINE: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_9)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_9); } break; case Q_ZERO: - if (IS_LAYER_ON(QWERTY)){ + if (IS_LAYER_ON(QWERTY_CAPS)){ + tap_code16(S(KC_0)); + } + else if (IS_LAYER_ON(QWERTY)){ tap_code16(KC_0); } break; @@ -228,10 +447,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [QWERTY] = LAYOUT( KC_TAB, KC_ESC, KC_ENTER, KC_BSPC, TO(STENO), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, - MO(SYMBOL), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH, KC_RSHIFT, + MO(SYMBOL), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH, MO(QWERTY_CAPS), KC_LCTL, KC_SPACE, KC_SPACE, KC_RALT ), + [QWERTY_CAPS] = LAYOUT( + S(KC_TAB), S(KC_ESC), S(KC_ENTER), S(KC_BSPC), + TO(STENO), S(KC_Q), S(KC_W), S(KC_E), S(KC_R), S(KC_T), S(KC_Y), S(KC_U), S(KC_I), S(KC_O), S(KC_P), S(KC_QUOT), + MO(SYMBOL), S(KC_Z), S(KC_X), S(KC_C), S(KC_V), S(KC_B), S(KC_N), S(KC_M), S(KC_COMM), S(KC_DOT), S(KC_SLASH), KC_RSHIFT, + KC_LCTL, KC_SPACE, KC_SPACE, KC_RALT + ), + [SYMBOL] = LAYOUT( KC_HASH, KC_DOLLAR, KC_LPRN, KC_RPRN, _______, KC_EXLM, KC_AT, KC_LT, KC_GT, KC_BSLASH, KC_DQT, KC_PLUS, KC_MINS, KC_SLASH, KC_ASTR, KC_TAB, @@ -242,6 +468,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { void matrix_init_user(void) { steno_set_mode(STENO_MODE_BOLT); // STENO_MODE_GEMINI or STENO_MODE_BOLT + //steno_set_mode(STENO_MODE_GEMINI); + // STENO_MODE_GEMINI only works if you remove all references to STENO_MODE_BOLT and then some in QMK. + // This is a QMK problem }; layer_state_t layer_state_set_user(layer_state_t state) { @@ -260,6 +489,14 @@ layer_state_t layer_state_set_user(layer_state_t state) { // green LED off palClearPad(GPIOA, 1); break; + case (QWERTY_CAPS): + // same as QWERTY + combo_enable(); + // red LED on + palSetPad(GPIOA,0); + // green LED off + palClearPad(GPIOA,1); + break; case (NKRO): combo_disable(); palClearPad(GPIOA, 1); @@ -273,7 +510,7 @@ layer_state_t layer_state_set_user(layer_state_t state) { break; default: // shouldn't happen but just in case - combo_disable(); + //combo_disable(); palClearPad(GPIOA, 1); palClearPad(GPIOA, 0); break; diff --git a/keyboards/noll/ecosteno/mcuconf.h b/keyboards/noll/ecosteno/mcuconf.h index fced272..6a10fec 100644 --- a/keyboards/noll/ecosteno/mcuconf.h +++ b/keyboards/noll/ecosteno/mcuconf.h @@ -1,209 +1,30 @@ -/* - ChibiOS - Copyright (C) 2006..2015 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. -*/ - -#ifndef _MCUCONF_H_ -#define _MCUCONF_H_ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. +/* Copyright 2020 QMK * - * IRQ priorities: - * 15...0 Lowest...Highest. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. * - * DMA priorities: - * 0...3 Lowest...Highest. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ /* - * HAL driver system settings. + * This file was auto-generated by: + * `qmk chibios-confmigrate -i keyboards/noll/ecosteno/chconf.h -r platforms/chibios/STM32_F103_STM32DUINO/configs/mcuconf.h` */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 +#pragma once -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 +#include_next -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 +// These may not be needed -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 TRUE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - -#endif /* _MCUCONF_H_ */ +#undef STM32_PWM_USE_TIM1 +#define STM32_PWM_USE_TIM1 TRUE diff --git a/keyboards/noll/ecosteno/readme.md b/keyboards/noll/ecosteno/readme.md index 583ab85..c966059 100644 --- a/keyboards/noll/ecosteno/readme.md +++ b/keyboards/noll/ecosteno/readme.md @@ -4,7 +4,7 @@ EcoSteno ![EcoSteno](https://nolltronics.com/wp-content/uploads/2021/04/Noll-Steno-Front-Angle.jpg) * Keyboard Maintainer: [Nathan Olivares](https://github.com/nkotech) -* Hardware Supported: EcoSteno v1.0.1X +* Hardware Supported: EcoSteno v1.0.1X and v1.0.2X * Hardware Availability: [Nolltronics](https://nolltronics.com/product/ecosteno) Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/noll/ecosteno/rules.mk b/keyboards/noll/ecosteno/rules.mk index 9754f6a..95d83da 100644 --- a/keyboards/noll/ecosteno/rules.mk +++ b/keyboards/noll/ecosteno/rules.mk @@ -15,4 +15,5 @@ COMMAND_ENABLE = yes # Commands for debug and configuration SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend NKRO_ENABLE = yes # USB Nkey Rollover COMBO_ENABLE = yes # Enable Key Combos -STENO_ENABLE = yes # Stenography keys \ No newline at end of file +STENO_ENABLE = yes # Stenography keys +MOUSEKEY_ENABLE = no # Mouse keys \ No newline at end of file diff --git a/keyboards/noll/noll_ecosteno_default.bin b/keyboards/noll/noll_ecosteno_default.bin deleted file mode 100644 index a7f36c2339bc23123440c4450fab89ad22e03339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30824 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 diff --git a/keyboards/noll/noll_ecosteno_default_gemini_pr.bin b/keyboards/noll/noll_ecosteno_default_gemini_pr.bin new file mode 100644 index 0000000000000000000000000000000000000000..29f4fec1e1e2fd97deb789ddef901480d027d71b GIT binary patch literal 31528 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 literal 0 HcmV?d00001