1
0

Delete unused boards

This commit is contained in:
Richard Baptist
2019-06-14 11:20:09 +02:00
parent ec7a5d3d71
commit 1b5c75c83d
8065 changed files with 0 additions and 589315 deletions

View File

@@ -1,385 +0,0 @@
flabbergast's TMK/ChibiOS port
==============================
2015/10/16
Build
-----
$ git clone -b chibios https://github.com/flabbergast/tmk_keyboard.git
$ cd tmk_keyboard
$ git submodule add -f -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
or
$ cd tmk_keyboard/tmk_core/tool/chibios
$ git clone -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
$ cd tmk_keyboard/keyboard/infinity_chibios
$ make
Chibios Configuration
---------------------
halconf.h: for HAL configuration
placed in project directory
read in chibios/os/hal/hal.mk
included in chibios/os/hal/include/hal.h
mcuconf.h: for MCU configuration
placed in project directory
included in halconf.h
Chibios Term
------------
PAL = Port Abstraction Layer
palWritePad
palReadPad
palSetPad
chibios/os/hal/include/pal.h
LLD = Low Level Driver
Makefile
--------
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = KINETIS
MCU_SERIES = KL2x
# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
# or <this_dir>/ld/
MCU_LDSCRIPT = MKL26Z64
# - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
MCU_STARTUP = kl2x
# Board: it should exist either in <chibios>/os/hal/boards/
# or <this_dir>/boards
BOARD = PJRC_TEENSY_LC
MCU = cortex-m0
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
ARMV = 6
halconf.h
---------
mcuconf.h
---------
chconf.h
--------
ld script
---------
--- ../../tmk_core/tool/chibios/chibios/os/common/ports/ARMCMx/compilers/GCC/ld/MKL26Z64.ld 2015-10-15 09:08:58.732904304 +0900
+++ ld/MKL26Z64.ld 2015-10-15 08:48:06.430215496 +0900
@@ -27,7 +27,8 @@
{
flash0 : org = 0x00000000, len = 0xc0
flashcfg : org = 0x00000400, len = 0x10
- flash : org = 0x00000410, len = 64k - 0x410
+ flash : org = 0x00000410, len = 62k - 0x410
+ eeprom_emu : org = 0x0000F800, len = 2k
ram : org = 0x1FFFF800, len = 8k
}
@@ -35,6 +36,10 @@
__ram_size__ = LENGTH(ram);
__ram_end__ = __ram_start__ + __ram_size__;
+__eeprom_workarea_start__ = ORIGIN(eeprom_emu);
+__eeprom_workarea_size__ = LENGTH(eeprom_emu);
+__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__;
+
SECTIONS
{
. = 0;
Configuration/Startup for Infinity 60%
--------------------------------------
Configuration:
Clock:
Inifinity
FEI(FLL Engaged Internal) mode with core clock:48MHz, bus clock:48MHz, flash clock:24MHz
Clock dividor:
SIM_CLKDIV1[OUTDIV1] = 0 divide-by-1 for core clock
SIM_CLKDIV1[OUTDIV2] = 0 divide-by-1 for bus clock
SIM_CLKDIV1[OUTDIV4] = 1 divide-by-2 for flash clock
Internal reference clock:
MCG_C1[IREFS] = 1 Internal Reference Select for clock source for FLL
MCG_C1[IRCLKEN] = 1 Internal Reference Clock Enable
FLL multipilication:
MCG_C4[DMX32] = 1
MCG_C4[DRST_DRS] = 01 FLL factor 1464 * 32.768kHz = 48MHz
chibios/os/hal/ports/KINETIS/K20x/hal_lld.c
k20x_clock_init(): called in __early_init() defined in board.c
disable watchdog and configure clock
configurable macros:
KINETIS_NO_INIT: whether init or not
KINETIS_MCG_MODE: clock mode
KINETIS_MCG_MODE_FEI
KINETIS_MCG_MODE_PEE
hal/ports/KINETIS/K20x/hal_lld.h
chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.h
PALConfig pal_default_config
boardInit()
__early_init()
macro definitions for board infos, freq and mcu type
chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.c
USB
Startup
-------
common/ports/ARMCMx/GCC/crt0_v[67]m.s
Reset_Handler: startup code
common/ports/ARMCMx/GCC/crt1.c
__core_init(): weak
__early_init(): weak
__late_init(): weak
__default_exit(): weak
called from Reset_Handler of crt0
common/ports/ARMCMx/GCC/vector.c
common/ports/ARMCMx/GCC/ld/*.ld
chibios/os/common/ports/ARMCMx/compilers/GCC/
├── crt0_v6m.s
├── crt0_v7m.s
├── crt1.c
├── ld
│   ├── MK20DX128BLDR3.ld
│   ├── MK20DX128BLDR4.ld
│   ├── MK20DX128.ld
│   ├── MK20DX256.ld
│   ├── MKL25Z128.ld
│   ├── MKL26Z128.ld
│   ├── MKL26Z64.ld
│   └── STM32L476xG.ld
├── mk
│   ├── startup_k20x5.mk
│   ├── startup_k20x7.mk
│   ├── startup_k20x.mk
│   ├── startup_kl2x.mk
│   └── startup_stm32l4xx.mk
├── rules.ld
├── rules.mk
└── vectors.c
chibios/os/hal/
├── boards
│   ├── FREESCALE_FREEDOM_K20D50M
│   │   ├── board.c
│   │   ├── board.h
│   │   └── board.mk
│   ├── MCHCK_K20
│   │   ├── board.c
│   │   ├── board.h
│   │   └── board.mk
│   ├── PJRC_TEENSY_3
│   │   ├── board.c
│   │   ├── board.h
│   │   └── board.mk
│   ├── PJRC_TEENSY_3_1
│   │   ├── board.c
│   │   ├── board.h
│   │   └── board.mk
│   ├── PJRC_TEENSY_LC
│   │   ├── board.c
│   │   ├── board.h
│   │   └── board.mk
│   ├── readme.txt
│   ├── simulator
│   │   ├── board.c
│   │   ├── board.h
│   │   └── board.mk
│   ├── ST_NUCLEO_F030R8
│   │   ├── board.c
│   │   ├── board.h
│   │   ├── board.mk
│   │   └── cfg
│   │   └── board.chcfg
├── hal.mk
├── include
│   ├── adc.h
│   ├── can.h
│   ├── dac.h
│   ├── ext.h
│   ├── gpt.h
│   ├── hal_channels.h
│   ├── hal_files.h
│   ├── hal.h
│   ├── hal_ioblock.h
│   ├── hal_mmcsd.h
│   ├── hal_queues.h
│   ├── hal_streams.h
│   ├── i2c.h
│   ├── i2s.h
│   ├── icu.h
│   ├── mac.h
│   ├── mii.h
│   ├── mmc_spi.h
│   ├── pal.h
│   ├── pwm.h
│   ├── rtc.h
│   ├── sdc.h
│   ├── serial.h
│   ├── serial_usb.h
│   ├── spi.h
│   ├── st.h
│   ├── uart.h
│   └── usb.h
├── lib
│   └── streams
│   ├── chprintf.c
│   ├── chprintf.h
│   ├── memstreams.c
│   ├── memstreams.h
│   ├── nullstreams.c
│   └── nullstreams.h
├── osal
│   ├── nil
│   │   ├── osal.c
│   │   ├── osal.h
│   │   └── osal.mk
│   ├── os-less
│   │   └── ARMCMx
│   │   ├── osal.c
│   │   ├── osal.h
│   │   └── osal.mk
│   └── rt
│   ├── osal.c
│   ├── osal.h
│   └── osal.mk
├── ports
│   ├── AVR
│   ├── common
│   │   └── ARMCMx
│   │   ├── mpu.h
│   │   ├── nvic.c
│   │   └── nvic.h
│   ├── KINETIS
│   │   ├── K20x
│   │   │   ├── hal_lld.c
│   │   │   ├── hal_lld.h
│   │   │   ├── kinetis_registry.h
│   │   │   ├── platform.dox
│   │   │   ├── platform.mk
│   │   │   ├── pwm_lld.c
│   │   │   ├── pwm_lld.h
│   │   │   ├── spi_lld.c
│   │   │   └── spi_lld.h
│   │   ├── KL2x
│   │   │   ├── hal_lld.c
│   │   │   ├── hal_lld.h
│   │   │   ├── kinetis_registry.h
│   │   │   ├── platform.mk
│   │   │   ├── pwm_lld.c
│   │   │   └── pwm_lld.h
│   │   ├── LLD
│   │   │   ├── adc_lld.c
│   │   │   ├── adc_lld.h
│   │   │   ├── ext_lld.c
│   │   │   ├── ext_lld.h
│   │   │   ├── gpt_lld.c
│   │   │   ├── gpt_lld.h
│   │   │   ├── i2c_lld.c
│   │   │   ├── i2c_lld.h
│   │   │   ├── pal_lld.c
│   │   │   ├── pal_lld.h
│   │   │   ├── serial_lld.c
│   │   │   ├── serial_lld.h
│   │   │   ├── st_lld.c
│   │   │   ├── st_lld.h
│   │   │   ├── usb_lld.c
│   │   │   └── usb_lld.h
│   │   └── README.md
│   ├── LPC
│   ├── simulator
│   └── STM32
├── src
│   ├── adc.c
│   ├── can.c
│   ├── dac.c
│   ├── ext.c
│   ├── gpt.c
│   ├── hal.c
│   ├── hal_mmcsd.c
│   ├── hal_queues.c
│   ├── i2c.c
│   ├── i2s.c
│   ├── icu.c
│   ├── mac.c
│   ├── mmc_spi.c
│   ├── pal.c
│   ├── pwm.c
│   ├── rtc.c
│   ├── sdc.c
│   ├── serial.c
│   ├── serial_usb.c
│   ├── spi.c
│   ├── st.c
│   ├── uart.c
│   └── usb.c
└── templates
├── adc_lld.c
├── adc_lld.h
├── can_lld.c
├── can_lld.h
├── dac_lld.c
├── dac_lld.h
├── ext_lld.c
├── ext_lld.h
├── gpt_lld.c
├── gpt_lld.h
├── halconf.h
├── hal_lld.c
├── hal_lld.h
├── i2c_lld.c
├── i2c_lld.h
├── i2s_lld.c
├── i2s_lld.h
├── icu_lld.c
├── icu_lld.h
├── mac_lld.c
├── mac_lld.h
├── mcuconf.h
├── osal
│   ├── osal.c
│   ├── osal.h
│   └── osal.mk
├── pal_lld.c
├── pal_lld.h
├── platform.mk
├── pwm_lld.c
├── pwm_lld.h
├── rtc_lld.c
├── rtc_lld.h
├── sdc_lld.c
├── sdc_lld.h
├── serial_lld.c
├── serial_lld.h
├── spi_lld.c
├── spi_lld.h
├── st_lld.c
├── st_lld.h
├── uart_lld.c
├── uart_lld.h
├── usb_lld.c
└── usb_lld.h

View File

@@ -1 +0,0 @@
#define KIIBOHD_BOOTLOADER

View File

@@ -1,524 +0,0 @@
/*
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.
*/
/**
* @file 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_
/*===========================================================================*/
/**
* @name System timers settings
* @{
*/
/*===========================================================================*/
/**
* @brief System time counter resolution.
* @note Allowed values are 16 or 32 bits.
*/
#define CH_CFG_ST_RESOLUTION 32
/**
* @brief System tick frequency.
* @details Frequency of the system timer that drives the system ticks. This
* setting also defines the system tick time unit.
*/
#define CH_CFG_ST_FREQUENCY 100000
/**
* @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.
*/
#define CH_CFG_ST_TIMEDELTA 0
/** @} */
/*===========================================================================*/
/**
* @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.
*/
#define CH_CFG_TIME_QUANTUM 20
/**
* @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.
*/
#define CH_CFG_MEMCORE_SIZE 0
/**
* @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.
*/
#define CH_CFG_NO_IDLE_THREAD FALSE
/* Use __WFI in the idle thread for waiting. Does lower the power
* consumption. */
#define CORTEX_ENABLE_WFI_IDLE TRUE
/** @} */
/*===========================================================================*/
/**
* @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.
*/
#define CH_CFG_OPTIMIZE_SPEED TRUE
/** @} */
/*===========================================================================*/
/**
* @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.
*/
#define CH_CFG_USE_TM FALSE
/**
* @brief Threads registry APIs.
* @details If enabled then the registry APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#define CH_CFG_USE_REGISTRY TRUE
/**
* @brief Threads synchronization APIs.
* @details If enabled then the @p chThdWait() function is included in
* the kernel.
*
* @note The default is @p TRUE.
*/
#define CH_CFG_USE_WAITEXIT TRUE
/**
* @brief Semaphores APIs.
* @details If enabled then the Semaphores APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#define CH_CFG_USE_SEMAPHORES TRUE
/**
* @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.
*/
#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
/**
* @brief Mutexes APIs.
* @details If enabled then the mutexes APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#define CH_CFG_USE_MUTEXES TRUE
/**
* @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.
*/
#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
/**
* @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.
*/
#define CH_CFG_USE_CONDVARS TRUE
/**
* @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.
*/
#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE
/**
* @brief Events Flags APIs.
* @details If enabled then the event flags APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#define CH_CFG_USE_EVENTS TRUE
/**
* @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.
*/
#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
/**
* @brief Synchronous Messages APIs.
* @details If enabled then the synchronous messages APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
*/
#define CH_CFG_USE_MESSAGES TRUE
/**
* @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.
*/
#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
/**
* @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.
*/
#define CH_CFG_USE_MAILBOXES TRUE
/**
* @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.
*/
#define CH_CFG_USE_MEMCORE TRUE
/**
* @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.
*/
#define CH_CFG_USE_HEAP TRUE
/**
* @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.
*/
#define CH_CFG_USE_MEMPOOLS TRUE
/**
* @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.
*/
#define CH_CFG_USE_DYNAMIC TRUE
/** @} */
/*===========================================================================*/
/**
* @name Debug options
* @{
*/
/*===========================================================================*/
/**
* @brief Debug option, kernel statistics.
*
* @note The default is @p FALSE.
*/
#define CH_DBG_STATISTICS FALSE
/**
* @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.
*/
#define CH_DBG_SYSTEM_STATE_CHECK FALSE
/**
* @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.
*/
#define CH_DBG_ENABLE_CHECKS FALSE
/**
* @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.
*/
#define CH_DBG_ENABLE_ASSERTS FALSE
/**
* @brief Debug option, trace buffer.
* @details If enabled then the trace buffer is activated.
*
* @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
*/
#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
/**
* @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.
*/
#define CH_DBG_TRACE_BUFFER_SIZE 128
/**
* @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.
*/
#define CH_DBG_ENABLE_STACK_CHECK FALSE
/**
* @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.
*/
#define CH_DBG_FILL_THREADS FALSE
/**
* @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.
*/
#define CH_DBG_THREADS_PROFILING FALSE
/** @} */
/*===========================================================================*/
/**
* @name Kernel hooks
* @{
*/
/*===========================================================================*/
/**
* @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 chThdInit() API.
*
* @note It is invoked from within @p chThdInit() 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.*/ \
}
/** @} */
/*===========================================================================*/
/* Port-specific settings (override port settings defaulted in chcore.h). */
/*===========================================================================*/
#endif /* CHCONF_H */
/** @} */

View File

@@ -1,66 +0,0 @@
/*
Copyright 2015 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
/* USB Device descriptor parameter */
#define VENDOR_ID 0x1c11
#define PRODUCT_ID 0xb04d
#define DEVICE_VER 0x0001
#define MANUFACTURER Input Club
#define PRODUCT Infinity_60%_LED/QMK
/* key matrix size */
#define MATRIX_ROWS 9
#define MATRIX_COLS 7
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
//#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
//#define LOCKING_RESYNC_ENABLE
/* Keymap for Infinity prototype */
//#define INFINITY_PROTOTYPE
/* Keymap for Infinity 1.1a (first revision with LED support) */
#define INFINITY_LED
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

View File

@@ -1,353 +0,0 @@
/*
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.
*/
/**
* @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.
*
* @addtogroup HAL_CONF
* @{
*/
#ifndef _HALCONF_H_
#define _HALCONF_H_
#include "mcuconf.h"
/**
* @brief Enables the PAL subsystem.
*/
#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
/**
* @brief Enables the CAN subsystem.
*/
#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
#define HAL_USE_CAN FALSE
#endif
/**
* @brief Enables the DAC subsystem.
*/
#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
#define HAL_USE_DAC FALSE
#endif
/**
* @brief Enables the EXT subsystem.
*/
#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
#define HAL_USE_EXT 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 TRUE
#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 FALSE
#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 SPI subsystem.
*/
#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
#define HAL_USE_SPI 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
/*===========================================================================*/
/* 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
/*===========================================================================*/
/* 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 an event sources for incoming packets.
*/
#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
/*===========================================================================*/
/* 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 64 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 64 bytes for both the transmission and receive
* buffers.
*/
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_SIZE 1
#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 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
/*===========================================================================*/
/* 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
#endif /* _HALCONF_H_ */
/** @} */

View File

@@ -1,32 +0,0 @@
/*
Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "infinity60.h"
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}

View File

@@ -1,64 +0,0 @@
/*
Copyright 2014 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
#ifdef INFINITY_PROTOTYPE
/* Infinity prototype */
#define LAYOUT_60_ansi_split_bs_rshift( \
K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K86, \
K51, K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, \
K13, K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, \
K54, K64, K74, K84, K05, K15, K25, K35, K45, K55, K65, K75, K85, \
K06, K16, K26, K36, K46, K56, K66, K76 \
) { \
{ K00, K01, K02, K03, K04, K05, K06 }, \
{ K10, K11, K12, K13, K14, K15, K16 }, \
{ K20, K21, K22, K23, K24, K25, K26 }, \
{ K30, K31, K32, K33, K34, K35, K36 }, \
{ K40, K41, K42, K43, K44, K45, K46 }, \
{ K50, K51, K52, K53, K54, K55, K56 }, \
{ K60, K61, K62, K63, K64, K65, K66 }, \
{ K70, K71, K72, K73, K74, K75, K76 }, \
{ K80, K81, K82, K83, K84, K85, K86 } \
}
#else
/* Infinity production */
#define LAYOUT_60_ansi_split_bs_rshift( \
K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K51, \
K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, K13, \
K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, K54, \
K64, K74, K84, K05, K15, K25, K35, K45, K55, K65, K75, K85, K06, \
K16, K26, K36, K46, K56, K66, K76, K86 \
) { \
{ K00, K01, K02, K03, K04, K05, K06 }, \
{ K10, K11, K12, K13, K14, K15, K16 }, \
{ K20, K21, K22, K23, K24, K25, K26 }, \
{ K30, K31, K32, K33, K34, K35, K36 }, \
{ K40, K41, K42, K43, K44, K45, K46 }, \
{ K50, K51, K52, K53, K54, K55, K56 }, \
{ K60, K61, K62, K63, K64, K65, K66 }, \
{ K70, K71, K72, K73, K74, K75, K76 }, \
{ K80, K81, K82, K83, K84, K85, K86 } \
}
#endif

View File

@@ -1,78 +0,0 @@
{
"keyboard_name": "Infinity 60%",
"keyboard_folder": "infinity60",
"url": "https://input.club/devices/infinity-keyboard/",
"maintainer": "qmk",
"width": 15,
"height": 5,
"layouts": {
"LAYOUT_60_ansi_split_bs_rshift": {
"key_count": 63,
"layout": [
{"label":"Esc", "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":"\\", "x":13, "y":0},
{"label":"`", "x":14, "y":0},
{"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":"Backspace", "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":1.75},
{"label":"Fn", "x":14, "y":3},
{"label":"Ctrl", "x":0, "y":4, "w":1.5},
{"label":"GUI", "x":1.5, "y":4},
{"label":"Alt", "x":2.5, "y":4, "w":1.5},
{"label":"Space", "x":4, "y":4, "w":6},
{"label":"Alt", "x":10, "y":4, "w":1.5},
{"label":"GUI", "x":11.5, "y":4},
{"label":"Fn", "x":12.5, "y":4},
{"label":"Ctrl", "x":13.5, "y":4, "w":1.5}
]
}
}
}

View File

@@ -1,53 +0,0 @@
#include QMK_KEYBOARD_H
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer
* ,-----------------------------------------------------------.
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
* |-----------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bksp|
* |-----------------------------------------------------------|
* |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter |
* |-----------------------------------------------------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0|
* |-----------------------------------------------------------'
* | |Gui|Alt | Space |Alt |Gui| | |
* `-----------------------------------------------------------'
*/
[0] = LAYOUT_60_ansi_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS, KC_GRV, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \
KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, \
KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,MO(1), \
KC_NO, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_NO, KC_NO),
/* Layer 1: HHKB mode (HHKB Fn)
* ,-----------------------------------------------------------.
* |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
* |-----------------------------------------------------------|
* |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
* |-----------------------------------------------------------|
* | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
* |-----------------------------------------------------------|
* | | | | | | | +| -|End|PgD|Dow| | |
* `-----------------------------------------------------------'
* | |Gui|Alt | Space |Alt |Gui| | |
* `-----------------------------------------------------------'
*/
[1] = LAYOUT_60_ansi_split_bs_rshift(
KC_PWR, 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_INS, KC_DEL, \
KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \
KC_TRNS,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_PENT, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END, KC_PGDN,KC_DOWN,KC_TRNS,KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
};

View File

@@ -1,87 +0,0 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer
* ,-----------------------------------------------------------.
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
* |-----------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bksp|
* |-----------------------------------------------------------|
* |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter |
* |-----------------------------------------------------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn2|
* |-----------------------------------------------------------'
* |Fn2 |Gui |Alt | Space |RAlt|Prv|PlPs|Next|
* `-----------------------------------------------------------'
*/
[0] = LAYOUT_60_ansi_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, LT(5, KC_ENT), \
KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, MO(4), \
MO(4), KC_LGUI, KC_LALT, LT(3, KC_SPC), KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT),
/* Layer 1: "Toggle" off SpaceFn for League of Legends
*/
[1] = LAYOUT_60_ansi_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(4), \
MO(4), KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT),
/* Layer 2: "Toggle" off SpaceFn for MapleRoyals
*/
[2] = LAYOUT_60_ansi_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_LSFT, \
MO(4), KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT),
/* Layer 3: FN layer 1
*/
[3] = LAYOUT_60_ansi_split_bs_rshift(
KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, \
KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, LALT(KC_F4), KC_HOME, KC_PGUP, KC_PSCR, KC_SLCK, KC_UP, KC_NO, KC_LPRN, KC_RPRN, KC_DEL, \
MO(6), KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_END, KC_PGDN, KC_TILD, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, \
LGUI(KC_SPC), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_CALC, KC_MENU, KC_TRNS, TG(4), \
KC_TRNS, KC_TRNS, KC_TRNS, LT(3, KC_SPC), KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU),
/* Layer 4: FN layer 2
*/
[4] = LAYOUT_60_ansi_split_bs_rshift(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PMNS, KC_PPLS, KC_PSLS, TG(2), \
KC_CAPS, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_PSCR, KC_NO, KC_P7, KC_P8, KC_P9, KC_PAST, KC_BSPC, \
KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PENT, \
KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_RSFT, MO(4), \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P0, KC_PDOT, KC_NO, TG(1)),
/* Layer 5: FN layer 3
*/
[5] = LAYOUT_60_ansi_split_bs_rshift(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
KC_TAB , KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F13, KC_F14, KC_F15, KC_F16, KC_NO, KC_TRNS, \
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F17, KC_F18, KC_F19, KC_F20, LT(5, KC_ENT), \
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F21, KC_F22, KC_F23, KC_F24, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RALT, KC_NO, KC_NO, KC_NO),
/* Layer 6: FN layer 4
*/
[6] = LAYOUT_60_ansi_split_bs_rshift(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
LCTL(LSFT(KC_TAB)), KC_NO, LGUI(KC_UP), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
MO(6), LGUI(KC_LEFT), LGUI(KC_DOWN), LGUI(KC_RGHT), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO),
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
};

View File

@@ -1,116 +0,0 @@
#include QMK_KEYBOARD_H
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer
* ,-----------------------------------------------------------.
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp|
* |-----------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
* |-----------------------------------------------------------|
* |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter |
* |-----------------------------------------------------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0|
* |-----------------------------------------------------------'
* | |Gui|Alt | Space |Alt |Gui| | |
* `-----------------------------------------------------------'
*/
[0] = LAYOUT_60_ansi_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_SCLN), KC_QUOT,MT(KC_RCTL, KC_ENT), \
OSM(MOD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, LT(2, KC_SLSH), KC_RSFT,TG(1), \
KC_NO, KC_LGUI,KC_LALT, LT(4, KC_SPC), MO(4), KC_RGUI,KC_NO, KC_NO),
/* Layer 1: HHKB mode (HHKB Fn)
* ,-----------------------------------------------------------.
* |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
* |-----------------------------------------------------------|
* |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs|
* |-----------------------------------------------------------|
* | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
* |-----------------------------------------------------------|
* | | | | | | | +| -|End|PgD|Dow| | |
* `-----------------------------------------------------------'
* | |Gui|Alt | Space |Alt |Gui| | |
* `-----------------------------------------------------------'
*/
[1] = LAYOUT_60_ansi_split_bs_rshift(
KC_PWR, 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_INS, KC_DEL, \
KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP, KC_TRNS,KC_BSPC, \
KC_LCTL,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_ENT, \
KC_LSFT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END, KC_PGDN,KC_DOWN,KC_RSFT,KC_TRNS, \
KC_TRNS,KC_LGUI,KC_LALT, KC_TRNS, KC_RALT,KC_RGUI,KC_TRNS,KC_TRNS),
/* Layer 2: Vi mode[Slash]
* ,-----------------------------------------------------------.
* |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
* |-----------------------------------------------------------|
* |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs|
* |-----------------------------------------------------------|
* |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return |
* |-----------------------------------------------------------|
* |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | |
* `-----------------------------------------------------------'
* |Gui|Alt | Space |Alt |Gui|
* `-------------------------------------------'
*/
[2] = LAYOUT_60_ansi_split_bs_rshift(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \
KC_TAB, KC_HOME,KC_PGDN,KC_UP, KC_PGUP,KC_END, KC_HOME,KC_PGDN,KC_PGUP,KC_END, KC_NO, KC_NO, KC_NO, KC_BSPC, \
KC_LCTL,KC_NO, KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,KC_NO, KC_NO, KC_ENT, \
KC_LSFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME,KC_PGDN,KC_PGUP,KC_END, LT(2, KC_SLSH), KC_RSFT,KC_TRNS, \
KC_TRNS,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_TRNS, KC_TRNS),
/* Layer 3: Mouse mode(IJKL)[Semicolon]
* ,-----------------------------------------------------------.
* |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
* |-----------------------------------------------------------|
* |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T|
* |-----------------------------------------------------------|
* |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return |
* |-----------------------------------------------------------|
* |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | |
* `-----------------------------------------------------------'
* |Gui |Alt | Mb1 |Fn |Fn |
* `--------------------------------------------'
* Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
*/
[3] = LAYOUT_60_ansi_split_bs_rshift(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \
LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L,KC_WH_D,KC_MS_U, KC_WH_U, KC_WH_R, ALT_T(KC_LEFT), ALT_T(KC_RGHT),LALT(KC_TAB), \
KC_LCTL, KC_ACL0,KC_ACL1,KC_ACL2,KC_ACL2,KC_NO, KC_NO, KC_MS_L,KC_MS_D, KC_MS_R, LT(3, KC_SCLN), KC_NO, KC_ENT, \
KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO, KC_RSFT, KC_TRNS, \
KC_TRNS, KC_LGUI,KC_LALT, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
/* Layer 4: Mouse mode(IJKL)[Space]
* ,-----------------------------------------------------------.
* |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
* |-----------------------------------------------------------|
* |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T|
* |-----------------------------------------------------------|
* |Contro| | | | | |Mb2|McL|McD|McR|Mb1| |Return |
* |-----------------------------------------------------------|
* |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | |
* `-----------------------------------------------------------'
* |Gui |Alt | Mb1 |Fn |Fn |
* `--------------------------------------------'
* Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
*/
[4] = LAYOUT_60_ansi_split_bs_rshift(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \
LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L,KC_WH_D,KC_MS_U, KC_WH_U, KC_WH_R,KC_BTN4,KC_BTN5,LALT(KC_TAB), \
KC_LCTL, KC_VOLD,KC_VOLU,KC_MUTE,KC_NO, KC_NO, KC_NO, KC_MS_L,KC_MS_D, KC_MS_R, KC_BTN1,KC_NO, KC_ENT, \
KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT),ALT_T(KC_RGHT),KC_NO, KC_RSFT,KC_TRNS, \
KC_TRNS, KC_LGUI,KC_LALT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS),
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
};

View File

@@ -1,6 +0,0 @@
#pragma once
//overrides
#undef TAPPING_TOGGLE
#define TAPPING_TOGGLE 2

View File

@@ -1,301 +0,0 @@
#include QMK_KEYBOARD_H
#include "led_controller.h"
//Define Layer Names
#define _BASE 0
#define _NUMPAD 1
#define _FNAV 2
#define _MEDIA 3
#define _TILDE 4
//IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
#define max_pages 6
enum ic60_keycodes {
NUMPAD,
FNAV,
MEDIA,
TILDE,
CTLALTDEL,
BACKLIGHT,
BRIGHT,
DIM,
ALL,
GAME,
MODE_SINGLE,
MODE_PAGE,
MODE_FLASH
};
uint8_t current_layer_global = 0;
uint8_t led_mode_global = MODE_SINGLE;
uint8_t backlight_status_global = 1; //init on/off state of backlight
uint32_t led_layer_state = 0;
/* ==================================
* KEYMAPS
* ==================================*/
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer
* ,-----------------------------------------------------------.
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backs|
* |-----------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
* |-----------------------------------------------------------|
* |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter |
* |-----------------------------------------------------------|
* |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |
* |-----------------------------------------------------------|
* |Ctrl|Gui |Alt | Space |Alt |Gui | FN | Ctrl |
* `-----------------------------------------------------------'
*/
/* default */
[_BASE] = LAYOUT_60_ansi_split_bs_rshift( \
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_NO,\
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \
TT(_FNAV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,F(TILDE),KC_NO, \
KC_LCTL, KC_LGUI,KC_LALT, LT(_FNAV, KC_SPC), KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
),
/* numpad */
[_NUMPAD] = LAYOUT_60_ansi_split_bs_rshift( \
_______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\
_______,_______,_______,_______,_______,_______,_______, KC_P4, KC_P5, KC_P6, KC_PAST, _______,_______,_______, \
MO(_FNAV),_______,_______,_______,_______,_______,_______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______,_______, \
_______,_______,_______,_______,_______,_______,_______, KC_P0,KC_COMM,KC_PDOT,KC_PPLS, _______,KC_NO, \
_______,_______,_______, TO(_BASE), _______,_______,_______,_______ \
),
/* F-, arrow, and media keys */
[_FNAV] = LAYOUT_60_ansi_split_bs_rshift( \
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,KC_NO,\
KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
_______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
_______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
_______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
),
/* media */
[_MEDIA] = LAYOUT_60_ansi_split_bs_rshift( \
_______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
_______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______, \
_______,_______,F(ALL) ,F(BRIGHT),F(DIM),F(BACKLIGHT),_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
_______,_______,_______, KC_MPLY, _______,_______, _______,_______ \
),
/* ~ */
[_TILDE] = LAYOUT_60_ansi_split_bs_rshift( \
KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
_______,_______,_______, _______, _______,_______, _______,_______ \
),
/* template */
[5] = LAYOUT_60_ansi_split_bs_rshift( \
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
_______,_______,_______, _______, _______,_______, _______,_______ \
),
};
//id for user defined functions and macros
enum function_id {
NONE,
};
enum macro_id {
ACTION_LEDS_ALL,
ACTION_LEDS_GAME,
ACTION_LEDS_BACKLIGHT,
ACTION_LEDS_BRIGHT,
ACTION_LEDS_DIM,
ACTION_LEDS_SINGLE,
ACTION_LEDS_PAGE,
ACTION_LEDS_FLASH
};
/* ==================================
* LED MAPPING
* ==================================*/
/*
Infinity60 LED MAP
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
28 31 32 33 34 35 36 37 38 41 42 43 44 45
46 47 48 51 52 53 54 55 56 57 58 61 62
63 64 65 66 67 68 71 72 73 74 75 76 77*
78 81 82 83 84 85 86 87
*Unused in Alphabet Layout
*/
//======== full page arrays =========
//any change in array size needs to be mirrored in matrix_init_user
uint8_t led_numpad[16] = {
18,21,22,23,
37,38,41,42,
55,56,57,58,
72,73,74,75
};
//LED Page 2 - _Nav
uint8_t led_nav[12] = {
38,
47,48, 55,56,57,
64,65,66
};
//LED Page 3 - _Media
uint8_t led_media[15] = {
12,13,14, 23,24,25,
65,66,67,68, 73,74,75,
83, 86
};
//LED Page 4 - _Game "WASD"
uint8_t led_game[5] = {
11,
32,
47,48,51
};
//======== qmk functions =========
const uint16_t fn_actions[] = {
[CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
[TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
[ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
[GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
[BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
[BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
[DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
[MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
[MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
[MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
};
/* custom action function */
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
msg_t msg;
switch(id) {
case ACTION_LEDS_ALL:
if(record->event.pressed) {
led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
msg=TOGGLE_ALL;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_BACKLIGHT:
if(record->event.pressed) {
backlight_status_global ^= 1;
msg=(backlight_status_global << 8) | TOGGLE_BACKLIGHT;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_GAME:
if(record->event.pressed) {
led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
msg=(4 << 8) | DISPLAY_PAGE;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_BRIGHT:
if(record->event.pressed) {
msg=(1 << 8) | STEP_BRIGHTNESS;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_DIM:
if(record->event.pressed) {
msg=(0 << 8) | STEP_BRIGHTNESS;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
//set led_mode for matrix_scan to toggle leds
case ACTION_LEDS_SINGLE:
led_mode_global = MODE_SINGLE;
break;
case ACTION_LEDS_PAGE:
led_mode_global = MODE_PAGE;
break;
case ACTION_LEDS_FLASH:
led_mode_global = MODE_FLASH;
break;
}
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
return MACRO_NONE;
};
bool process_record_user (uint16_t keycode, keyrecord_t *record) {
return true;
}
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
led_controller_init();
// Write predefined led pages.
write_led_page(_NUMPAD, led_numpad, 16);
chThdSleepMilliseconds(10);
write_led_page(_FNAV, led_nav, 12);
chThdSleepMilliseconds(10);
write_led_page(_MEDIA, led_media, 15);
chThdSleepMilliseconds(10);
write_led_page(4, led_game, 5);
chThdSleepMilliseconds(1000);
};
// Loops constantly in the background.
void matrix_scan_user(void) {
uint8_t page;
uint8_t led_pin_byte;
msg_t msg;
if (backlight_status_global == 0) {//backlight is off, skip the rest
return;
}
if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
//check mode
//Turn on layer indicator or page depending on mode
switch(led_mode_global) {
case MODE_FLASH: //flash preset page leds then single indicator
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
msg=(page << 8) | DISPLAY_PAGE;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
chThdSleepMilliseconds(500);
//flow to display single layer leds
case MODE_SINGLE: //light layer indicators for all active layers
led_pin_byte = layer_state & 0xFF;
msg=(7 << 8) | DISPLAY_PAGE;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
msg=(1 << 16) | (led_pin_byte << 8) | SET_FULL_ROW;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
break;
case MODE_PAGE: //display pre-defined led page
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
msg=(page << 8) | DISPLAY_PAGE;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
break;
}
led_layer_state = layer_state;
}
}

View File

@@ -1,87 +0,0 @@
Backlight for Infinity60
========================
## Led Controller Specs
The Infinity60 (revision 1.1a) pcb uses the IS31FL3731C matrix LED driver from ISSI [(datasheet)](http://www.issi.com/WW/pdf/31FL3731C.pdf). The IS31 has the ability to control two led matrices (A & B), each matrix controlling 9 pins, each pin controlling 8 leds. The Infinity only utilizes matrix A.
Infinity60 LED Map:
digits mean "row" and "col", i.e. 45 means pin 4, column 5 in the IS31 datasheet
```c
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
28 31 32 33 34 35 36 37 38 41 42 43 44 45
46 47 48 51 52 53 54 55 56 57 58 61 62
63 64 65 66 67 68 71 72 73 74 75 76 77*
78 81 82 83 84 85 86 87
```
*Unused in Alphabet Layout
The IS31 includes 8 led pages (or frames) 0-7 than can be displayed, and each page consists of 144 bytes.
- **bytes 0 - 17** - LED control (on/off).
* 18 bytes which alternate between A and B matrices (A1, B1, A2, B2, ..).
* Each byte controls the 8 leds on that pin with bits (8 to 1).
- **bytes 8 - 35** - Blink control.
* Same as LED control above, but sets blink on/off.
- **bytes 36 - 143** - PWM control.
* One byte per LED, sets PWM from 0 to 255.
* Same as above, the register alternates, every 8 *bytes* (not bits) between the A & B matrices.
## Led Controller Code
In the Infinity60 project folder, led_controller.c sets up ability to write led layers at startup or control leds on demand as part of fn_actions. By default led_controller.c assumes page 0 will be used for full on/off. The remaining 7 pages (1-7) are free for preset led maps or single led actions at init or on demand. Communication with the IS31 is primarily done through the led_mailbox using chMBPost described further below under "Sending messages in Keymap.c". This code is based on work matt3o and flabbergast did for tmk firmware on the [whitefox](https://github.com/tmk/whitefox).
One function is available to directly set leds without the mailbox:
```
write_led_page(page#, array of leds by address, # of addresses in array)
```
This function saves a full page to the controller using a supplied array of led locations such as:
```c
uint8_t led_numpad[16] = {
18,21,22,23,
37,38,41,42,
55,56,57,58,
72,73,74,75
}
write_led_page(5, led_numpad, 16);
```
Remaining led control is done through the led mailbox using these message types:
- **SET_FULL_ROW** (3 bytes) - message type, 8-bit mask, and row#. Sets all leds on one pin per the bit mask.
- **OFF_LED, ON_LED, TOGGLE_LED** (3 bytes) - message type, led address, and page#. Off/on/toggle specific led.
- **BLINK_OFF_LED, BLINK_ON_LED, BLINK_TOGGLE_LED** (3 bytes) - message type, led address, and page#. Set blink Off/on/toggle for specific led.
- **TOGGLE_ALL** (1 byte) - Turn on/off full backlight.
- **TOGGLE_BACKLIGHT** (2 bytes) - message type, on/off. Sets backlight completely off, no leds will display.
- **DISPLAY_PAGE** (2 bytes) - message type, page to display. Switch to specific pre-set page.
- **RESET_PAGE** (2 bytes) - message type, page to reset. Reset/erase specific page.
- **TOGGLE_NUM_LOCK** (2 bytes) - message type, on/off (NUM_LOCK_LED_ADDRESS). Toggle numlock on/off. Usually run with the `set_leds` function to check state of numlock or capslock. If all leds are on (e.i. TOGGLE_ALL) then this sets numlock to blink instead (this is still a little buggy if toggling on/off quickly).
- **TOGGLE_CAPS_LOCK** (2 bytes) - message type, on/off (CAPS_LOCK_LED_ADDRESS). Same as numlock.
- **STEP_BRIGHTNESS** (2 bytes) - message type, and step up (1) or step down (0). Increase or decrease led brightness.
## Sending messages in Keymap.c
Sending an action to the led mailbox is done using chMBPost:
```
chMBPost(&led_mailbox, message, timeout);
```
- &led_mailbox - pointer to led mailbox
- message - up to 4 bytes but most messages use only 2. First byte (LSB) is the message type, the remaining three bytes are the message to process.
- timeout is TIME_IMMEDIATE
An example:
```c
//set the message to be sent. First byte (LSB) is the message type, and second is the led address
msg=(42 << 8) | ON_LED;
//send msg to the led mailbox
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
```
Another:
```c
msg=(46 << 8) | BLINK_TOGGLE_LED;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
```
Finally, SET_FULL_ROW requires an extra byte with row information in the message so sending this message looks like:
```c
msg=(row<<16) | (led_pin_byte << 8) | SET_FULL_ROW;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
```

View File

@@ -1,54 +0,0 @@
/*
Copyright 2015 Jun Wako <wakojun@gmail.com>
Copyright 2017 jpetermans <tibcmhhm@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hal.h"
#include "led.h"
#include "led_controller.h"
/* WARNING! This function needs to be callable from
* both regular threads and ISRs, unlocked (during resume-from-sleep).
* In particular, I2C functions (interrupt-driven) should NOT be called from here.
*/
void led_set(uint8_t usb_led) {
msg_t msg;
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
chSysUnconditionalLock();
msg=(1 << 8) | TOGGLE_NUM_LOCK;
chMBPostI(&led_mailbox, msg);
chSysUnconditionalUnlock();
} else {
chSysUnconditionalLock();
msg=(0 << 8) | TOGGLE_NUM_LOCK;
chMBPostI(&led_mailbox, msg);
chSysUnconditionalUnlock();
}
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
chSysUnconditionalLock();
msg=(1 << 8) | TOGGLE_CAPS_LOCK;
chMBPostI(&led_mailbox, msg);
chSysUnconditionalUnlock();
} else {
chSysUnconditionalLock();
msg=(0 << 8) | TOGGLE_CAPS_LOCK;
chMBPostI(&led_mailbox, msg);
chSysUnconditionalUnlock();
}
}

View File

@@ -1,487 +0,0 @@
/*
Copyright 2016 flabbergast <s3+flabbergast@sdfeu.org>
Copyright 2017 jpetermans <tibcmhhm@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* LED controller code
* IS31FL3731C matrix LED driver from ISSI
* datasheet: http://www.issi.com/WW/pdf/31FL3731C.pdf
*/
#include "ch.h"
#include "hal.h"
#include "print.h"
#include "led.h"
#include "host.h"
#include "led_controller.h"
#include "suspend.h"
#include "usb_main.h"
/* Infinity60 LED MAP
- digits mean "row" and "col", i.e. 45 means C4-5 in the IS31 datasheet, matrix A
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
28 31 32 33 34 35 36 37 38 41 42 43 44 45
46 47 48 51 52 53 54 55 56 57 58 61 62
63 64 65 66 67 68 71 72 73 74 75 76 77*
78 81 82 83 84 85 86 87
*Unused in Alphabet Layout
*/
/*
each page has 0xB4 bytes
0 - 0x11: LED control (on/off):
order: CA1, CB1, CA2, CB2, .... (CA - matrix A, CB - matrix B)
CAn controls Cn-8 .. Cn-1 (LSbit)
0x12 - 0x23: blink control (like "LED control")
0x24 - 0xB3: PWM control: byte per LED, 0xFF max on
order same as above (CA 1st row (8bytes), CB 1st row (8bytes), ...)
*/
// Which LED should be used for CAPS LOCK indicator
#if !defined(CAPS_LOCK_LED_ADDRESS)
#define CAPS_LOCK_LED_ADDRESS 46
#endif
#if !defined(NUM_LOCK_LED_ADDRESS)
#define NUM_LOCK_LED_ADDRESS 85
#endif
/* Which LED should breathe during sleep */
#if !defined(BREATHE_LED_ADDRESS)
#define BREATHE_LED_ADDRESS CAPS_LOCK_LED_ADDRESS
#endif
/* =================
* ChibiOS I2C setup
* ================= */
static const I2CConfig i2ccfg = {
400000 // clock speed (Hz); 400kHz max for IS31
};
/* ==============
* variables
* ============== */
// internal communication buffers
uint8_t tx[2] __attribute__((aligned(2)));
uint8_t rx[1] __attribute__((aligned(2)));
// buffer for sending the whole page at once (used also as a temp buffer)
uint8_t full_page[0xB4+1] = {0};
// LED mask (which LEDs are present, selected by bits)
// IC60 pcb uses only CA matrix.
// Each byte is a control pin for 8 leds ordered 8-1
const uint8_t all_on_leds_mask[0x12] = {
0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0xFF, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x00
};
// array to hold brightness pwm steps
const uint8_t pwm_levels[5] = {
0x00, 0x16, 0x4E, 0xA1, 0xFF
};
// array to write to pwm register
uint8_t pwm_register_array[9] = {0};
/* ============================
* communication functions
* ============================ */
msg_t is31_select_page(uint8_t page) {
tx[0] = IS31_COMMANDREGISTER;
tx[1] = page;
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 2, NULL, 0, US2ST(IS31_TIMEOUT));
}
msg_t is31_write_data(uint8_t page, uint8_t *buffer, uint8_t size) {
is31_select_page(page);
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, buffer, size, NULL, 0, US2ST(IS31_TIMEOUT));
}
msg_t is31_write_register(uint8_t page, uint8_t reg, uint8_t data) {
is31_select_page(page);
tx[0] = reg;
tx[1] = data;
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 2, NULL, 0, US2ST(IS31_TIMEOUT));
}
msg_t is31_read_register(uint8_t page, uint8_t reg, uint8_t *result) {
is31_select_page(page);
tx[0] = reg;
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 1, result, 1, US2ST(IS31_TIMEOUT));
}
/* ========================
* initialise the IS31 chip
* ======================== */
void is31_init(void) {
// just to be sure that it's all zeroes
__builtin_memset(full_page,0,0xB4+1);
// zero function page, all registers (assuming full_page is all zeroes)
is31_write_data(IS31_FUNCTIONREG, full_page, 0xD + 1);
// disable hardware shutdown
palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(GPIOB, 16);
chThdSleepMilliseconds(10);
// software shutdown
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
chThdSleepMilliseconds(10);
// zero function page, all registers
is31_write_data(IS31_FUNCTIONREG, full_page, 0xD + 1);
chThdSleepMilliseconds(10);
// software shutdown disable (i.e. turn stuff on)
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
chThdSleepMilliseconds(10);
// zero all LED registers on all 8 pages
uint8_t i;
for(i=0; i<8; i++) {
is31_write_data(i, full_page, 0xB4 + 1);
chThdSleepMilliseconds(5);
}
}
/* ==================
* LED control thread
* ================== */
#define LED_MAILBOX_NUM_MSGS 5
static msg_t led_mailbox_queue[LED_MAILBOX_NUM_MSGS];
mailbox_t led_mailbox;
static THD_WORKING_AREA(waLEDthread, 256);
static THD_FUNCTION(LEDthread, arg) {
(void)arg;
chRegSetThreadName("LEDthread");
uint8_t i;
uint8_t control_register_word[2] = {0};//2 bytes: register address, byte to write
uint8_t led_control_reg[0x13] = {0};//led control register start address + 0x12 bytes
//persistent status variables
uint8_t pwm_step_status, page_status, capslock_status, numlock_status;
//mailbox variables
uint8_t temp, msg_type;
uint8_t msg_args[3];
msg_t msg;
// initialize persistent variables
pwm_step_status = 4; //full brightness
page_status = 0; //start frame 0 (all off/on)
numlock_status = (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? 1 : 0;
capslock_status = (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? 1 : 0;
while(true) {
// wait for a message (asynchronous)
// (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't
// be processed right away
chMBFetch(&led_mailbox, &msg, TIME_INFINITE);
msg_type = msg & 0xFF; //first byte is action information
msg_args[0] = (msg >> 8) & 0xFF;
msg_args[1] = (msg >> 16) & 0XFF;
msg_args[2] = (msg >> 24) & 0xFF;
switch (msg_type){
case SET_FULL_ROW:
//write full byte to pin address, msg_args[1] = pin #, msg_args[0] = 8 bits to write
//writes only to currently displayed page
write_led_byte(page_status, msg_args[1], msg_args[0]);
break;
case OFF_LED:
//on/off/toggle single led, msg_args[0] = row/col of led, msg_args[1] = page
set_led_bit(msg_args[1], control_register_word, msg_args[0], 0);
break;
case ON_LED:
set_led_bit(msg_args[1], control_register_word, msg_args[0], 1);
break;
case TOGGLE_LED:
set_led_bit(msg_args[1], control_register_word, msg_args[0], 2);
break;
case BLINK_OFF_LED:
//on/off/toggle single led, msg_args[0] = row/col of led
set_led_bit(msg_args[1], control_register_word, msg_args[0], 4);
break;
case BLINK_ON_LED:
set_led_bit(msg_args[1], control_register_word, msg_args[0], 5);
break;
case BLINK_TOGGLE_LED:
set_led_bit(msg_args[1], control_register_word, msg_args[0], 6);
break;
case TOGGLE_ALL:
//turn on/off all leds, msg_args = unused
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
chThdSleepMilliseconds(5);
is31_read_register(0, 0x00, &temp);
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
led_control_reg[0] = 0;
//toggle led mask based on current state (temp)
if (temp==0 || page_status > 0) {
__builtin_memcpy(led_control_reg+1, all_on_leds_mask, 0x12);
} else {
__builtin_memset(led_control_reg+1, 0, 0x12);
}
is31_write_data(0, led_control_reg, 0x13);
if (page_status > 0) {
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, 0);
page_status=0;
//maintain lock leds, reset to off and force recheck to blink of all leds toggled on
numlock_status = 0;
capslock_status = 0;
led_set(host_keyboard_leds());
}
break;
case TOGGLE_BACKLIGHT:
//msg_args[0] = on/off
//populate 9 byte rows to be written to each pin, first byte is register (pin) address
if (msg_args[0] == 1) {
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
} else {
__builtin_memset(pwm_register_array+1, 0, 8);
}
for(i=0; i<8; i++) {
//first byte is register address, every 0x10 9 bytes is A-matrix pwm pins
pwm_register_array[0] = 0x24 + (i * 0x10);
is31_write_data(0,pwm_register_array,9);
}
break;
case DISPLAY_PAGE:
//msg_args[0] = page to toggle on
if (page_status != msg_args[0]) {
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, msg_args[0]);
page_status = msg_args[0];
//maintain lock leds, reset to off and force recheck for new page
numlock_status = 0;
capslock_status = 0;
led_set(host_keyboard_leds());
}
break;
case RESET_PAGE:
//led_args[0] = page to reset
led_control_reg[0] = 0;
__builtin_memset(led_control_reg+1, 0, 0x12);
is31_write_data(msg_args[0], led_control_reg, 0x13);
//repeat for blink register
led_control_reg[0] = 0x12;
is31_write_data(msg_args[0], led_control_reg, 0x13);
break;
case TOGGLE_NUM_LOCK:
//msg_args[0] = 0 or 1, off/on
if (numlock_status != msg_args[0]) {
set_lock_leds(NUM_LOCK_LED_ADDRESS, msg_args[0], page_status);
numlock_status = msg_args[0];
}
break;
case TOGGLE_CAPS_LOCK:
//msg_args[0] = 0 or 1, off/on
if (capslock_status != msg_args[0]) {
set_lock_leds(CAPS_LOCK_LED_ADDRESS, msg_args[0], page_status);
capslock_status = msg_args[0];
}
break;
case STEP_BRIGHTNESS:
//led_args[0] = step up (1) or down (0)
switch (msg_args[0]) {
case 0:
if (pwm_step_status == 0) {
pwm_step_status = 4;
} else {
pwm_step_status--;
}
break;
case 1:
if (pwm_step_status == 4) {
pwm_step_status = 0;
} else {
pwm_step_status++;
}
break;
}
//populate 8 byte arrays to write on each pin
//first byte is register address, every 0x10 9 bytes are A-matrix pwm pins
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
for(i=0; i<8; i++) {
pwm_register_array[0] = 0x24 + (i * 0x10);
is31_write_data(0,pwm_register_array,9);
}
break;
}
}
}
/* ==============================
* led processing functions
* ============================== */
void set_led_bit (uint8_t page, uint8_t *led_control_word, uint8_t led_addr, uint8_t action) {
//returns 2 bytes: led control register address and byte to write
//action: 0 - off, 1 - on, 2 - toggle, 4 - blink on, 5 - blink off, 6 - toggle blink
uint8_t control_reg_addr, column_bit, column_byte, temp, blink_bit;
//check for valid led address
if (led_addr < 0 || led_addr > 87 || led_addr % 10 > 8) {
return;
}
blink_bit = action>>2;//check for blink bit
action &= ~(1<<2); //strip blink bit
//led_addr tens column is pin#, ones column is bit position in 8-bit mask
control_reg_addr = ((led_addr / 10) % 10 - 1 ) * 0x02;// A-matrix is every other byte
control_reg_addr += blink_bit == 1 ? 0x12 : 0x00;//if blink_bit, shift 12 bytes to blink register
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
chThdSleepMilliseconds(5);
is31_read_register(page, control_reg_addr, &temp);//maintain status of leds on this byte
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
column_bit = 1<<(led_addr % 10 - 1);
column_byte = temp;
switch(action) {
case 0:
column_byte &= ~column_bit;
break;
case 1:
column_byte |= column_bit;
break;
case 2:
column_byte ^= column_bit;
break;
}
//return word to be written in register
led_control_word[0] = control_reg_addr;
led_control_word[1] = column_byte;
is31_write_data (page, led_control_word, 0x02);
}
void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte) {
uint8_t led_control_word[2] = {0};//register address and on/off byte
led_control_word[0] = (row - 1 ) * 0x02;// A-matrix is every other byte
led_control_word[1] = led_byte;
is31_write_data(page, led_control_word, 0x02);
}
void write_led_page (uint8_t page, uint8_t *user_led_array, uint8_t led_count) {
uint8_t i;
uint8_t pin, col;
uint8_t led_control_register[0x13] = {0};
__builtin_memset(led_control_register,0,13);
for(i=0;i<led_count;i++){
//shift pin by 1 for led register 0x00 address
pin = ((user_led_array[i] / 10) % 10 - 1 ) * 2 + 1;
col = user_led_array[i] % 10 - 1;
led_control_register[pin] |= 1<<(col);
}
is31_write_data(page, led_control_register, 0x13);
}
void set_lock_leds(uint8_t led_addr, uint8_t led_action, uint8_t page) {
uint8_t temp;
uint8_t led_control_word[2] = {0};
//blink if all leds are on
if (page == 0) {
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
chThdSleepMilliseconds(5);
is31_read_register(0, 0x00, &temp);
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
if (temp == 0xFF) {
led_action |= (1<<2); //set blink bit
}
}
set_led_bit(page,led_control_word,led_addr,led_action);
}
/* =====================
* hook into user keymap
* ===================== */
void led_controller_init(void) {
uint8_t i;
/* initialise I2C */
/* I2C pins */
palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL
palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA
/* start I2C */
i2cStart(&I2CD1, &i2ccfg);
// try high drive (from kiibohd)
I2CD1.i2c->C2 |= I2Cx_C2_HDRS;
// try glitch fixing (from kiibohd)
I2CD1.i2c->FLT = 4;
chThdSleepMilliseconds(10);
/* initialise IS31 chip */
is31_init();
//set Display Option Register so all pwm intensity is controlled from page 0
//enable blink and set blink period to 0.27s x rate
is31_write_register(IS31_FUNCTIONREG, IS31_REG_DISPLAYOPT, IS31_REG_DISPLAYOPT_INTENSITY_SAME + IS31_REG_DISPLAYOPT_BLINK_ENABLE + 4);
/* set full pwm on page 1 */
pwm_register_array[0] = 0;
__builtin_memset(pwm_register_array+1, 0xFF, 8);
for(i=0; i<8; i++) {
pwm_register_array[0] = 0x24 + (i * 0x10);//first byte of 9 bytes must be register address
is31_write_data(0, pwm_register_array, 9);
chThdSleepMilliseconds(5);
}
/* enable breathing when the displayed page changes */
// Fade-in Fade-out, time = 26ms * 2^N, N=3
is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL1, (3<<4)|3);
is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL2, IS31_REG_BREATHCTRL2_ENABLE|3);
/* more time consuming LED processing should be offloaded into
* a thread, with asynchronous messaging. */
chMBObjectInit(&led_mailbox, led_mailbox_queue, LED_MAILBOX_NUM_MSGS);
chThdCreateStatic(waLEDthread, sizeof(waLEDthread), LOWPRIO, LEDthread, NULL);
}

View File

@@ -1,121 +0,0 @@
/*
Copyright 2016 flabbergast <s3+flabbergast@sdfeu.org>
Copyright 2017 jpetermans <tibcmhhm@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _LED_CONTROLLER_H_
#define _LED_CONTROLLER_H_
/* =========================
* communication functions
* ========================= */
msg_t is31_write_data(uint8_t page, uint8_t *buffer, uint8_t size);
msg_t is31_write_register(uint8_t page, uint8_t reg, uint8_t data);
msg_t is31_read_register(uint8_t page, uint8_t reg, uint8_t *result);
/* ============================
* init functions/definitions
* ============================*/
void led_controller_init(void);
#define CAPS_LOCK_LED_ADDRESS 46 //pin matrix location
#define NUM_LOCK_LED_ADDRESS 85
/* =============================
* IS31 chip related definitions
* ============================= */
#define IS31_ADDR_DEFAULT 0x74
#define IS31_REG_CONFIG 0x00
// bits in reg
#define IS31_REG_CONFIG_PICTUREMODE 0x00
#define IS31_REG_CONFIG_AUTOPLAYMODE 0x08
#define IS31_REG_CONFIG_AUDIOPLAYMODE 0x18
// D2:D0 bits are starting frame for autoplay mode
#define IS31_REG_PICTDISP 0x01 // D2:D0 frame select for picture mode
#define IS31_REG_AUTOPLAYCTRL1 0x02
// D6:D4 number of loops (000=infty)
// D2:D0 number of frames to be used
#define IS31_REG_AUTOPLAYCTRL2 0x03 // D5:D0 delay time (*11ms)
#define IS31_REG_DISPLAYOPT 0x05
#define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames
#define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x08
// D2:D0 bits blink period time (*0.27s)
#define IS31_REG_AUDIOSYNC 0x06
#define IS31_REG_AUDIOSYNC_ENABLE 0x1
#define IS31_REG_FRAMESTATE 0x07
#define IS31_REG_BREATHCTRL1 0x08
// D6:D4 fade out time (26ms*2^i)
// D2:D0 fade in time (26ms*2^i)
#define IS31_REG_BREATHCTRL2 0x09
#define IS31_REG_BREATHCTRL2_ENABLE 0x10
// D2:D0 extinguish time (3.5ms*2^i)
#define IS31_REG_SHUTDOWN 0x0A
#define IS31_REG_SHUTDOWN_OFF 0x1
#define IS31_REG_SHUTDOWN_ON 0x0
#define IS31_REG_AGCCTRL 0x0B
#define IS31_REG_ADCRATE 0x0C
#define IS31_COMMANDREGISTER 0xFD
#define IS31_FUNCTIONREG 0x0B // helpfully called 'page nine'
#define IS31_TIMEOUT 10000 // needs to be long enough to write a whole page
/* ========================================
* LED Thread related items
* ========================================*/
extern mailbox_t led_mailbox;
void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint8_t action);
void set_lock_leds (uint8_t led_addr, uint8_t led_action, uint8_t page);
void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte);
void write_led_page (uint8_t page, uint8_t *led_array, uint8_t led_count);
// constants for signaling the LED controller thread
enum led_msg_t {
KEY_LIGHT,
SET_FULL_ROW,
OFF_LED,
ON_LED,
TOGGLE_LED,
BLINK_OFF_LED,
BLINK_ON_LED,
BLINK_TOGGLE_LED,
TOGGLE_ALL,
TOGGLE_BACKLIGHT,
DISPLAY_PAGE,
RESET_PAGE,
TOGGLE_NUM_LOCK,
TOGGLE_CAPS_LOCK,
TOGGLE_BREATH,
STEP_BRIGHTNESS
};
#endif /* _LED_CONTROLLER_H_ */

View File

@@ -1,198 +0,0 @@
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "hal.h"
#include "timer.h"
#include "wait.h"
#include "print.h"
#include "matrix.h"
/*
* Infinity Pinusage:
* Column pins are input with internal pull-down. Row pins are output and strobe with high.
* Key is high or 1 when it turns on.
* INFINITY PRODUCTION (NO LED)
* col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
* row: { PTB0, PTB1, PTB2, PTB3, PTB16, PTB17, PTC4, PTC5, PTD0 }
* INFINITY PRODUCTION (WITH LED)
* col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
* row: { PTC0, PTC1, PTC2, PTC3, PTC4, PTC5, PTC6, PTC7, PTD0 }
*/
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
static bool debouncing = false;
static uint16_t debouncing_time = 0;
void matrix_init(void)
{
/* Column(sense) */
palSetPadMode(GPIOD, 1, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOD, 2, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOD, 3, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOD, 4, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOD, 5, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOD, 6, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOD, 7, PAL_MODE_INPUT_PULLDOWN);
#ifdef INFINITY_LED
/* Row(strobe) */
palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 1, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 2, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 3, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 4, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 5, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 6, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 7, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOD, 0, PAL_MODE_OUTPUT_PUSHPULL);
#else
/* Row(strobe) */
palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 17, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 4, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOC, 5, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOD, 0, PAL_MODE_OUTPUT_PUSHPULL);
#endif
memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
memset(matrix_debouncing, 0, MATRIX_ROWS * sizeof(matrix_row_t));
matrix_init_quantum();
}
uint8_t matrix_scan(void)
{
for (int row = 0; row < MATRIX_ROWS; row++) {
matrix_row_t data = 0;
#ifdef INFINITY_LED
// strobe row
switch (row) {
case 0: palSetPad(GPIOC, 0); break;
case 1: palSetPad(GPIOC, 1); break;
case 2: palSetPad(GPIOC, 2); break;
case 3: palSetPad(GPIOC, 3); break;
case 4: palSetPad(GPIOC, 4); break;
case 5: palSetPad(GPIOC, 5); break;
case 6: palSetPad(GPIOC, 6); break;
case 7: palSetPad(GPIOC, 7); break;
case 8: palSetPad(GPIOD, 0); break;
}
#else
// strobe row
switch (row) {
case 0: palSetPad(GPIOB, 0); break;
case 1: palSetPad(GPIOB, 1); break;
case 2: palSetPad(GPIOB, 2); break;
case 3: palSetPad(GPIOB, 3); break;
case 4: palSetPad(GPIOB, 16); break;
case 5: palSetPad(GPIOB, 17); break;
case 6: palSetPad(GPIOC, 4); break;
case 7: palSetPad(GPIOC, 5); break;
case 8: palSetPad(GPIOD, 0); break;
}
#endif
// need wait to settle pin state
// if you wait too short, or have a too high update rate
// the keyboard might freeze, or there might not be enough
// processing power to update the LCD screen properly.
// 20us, or two ticks at 100000Hz seems to be OK
wait_us(20);
// read col data
data = (palReadPort(GPIOD)>>1);
#ifdef INFINITY_LED
// un-strobe row
switch (row) {
case 0: palClearPad(GPIOC, 0); break;
case 1: palClearPad(GPIOC, 1); break;
case 2: palClearPad(GPIOC, 2); break;
case 3: palClearPad(GPIOC, 3); break;
case 4: palClearPad(GPIOC, 4); break;
case 5: palClearPad(GPIOC, 5); break;
case 6: palClearPad(GPIOC, 6); break;
case 7: palClearPad(GPIOC, 7); break;
case 8: palClearPad(GPIOD, 0); break;
}
#else
// un-strobe row
switch (row) {
case 0: palClearPad(GPIOB, 0); break;
case 1: palClearPad(GPIOB, 1); break;
case 2: palClearPad(GPIOB, 2); break;
case 3: palClearPad(GPIOB, 3); break;
case 4: palClearPad(GPIOB, 16); break;
case 5: palClearPad(GPIOB, 17); break;
case 6: palClearPad(GPIOC, 4); break;
case 7: palClearPad(GPIOC, 5); break;
case 8: palClearPad(GPIOD, 0); break;
}
#endif
if (matrix_debouncing[row] != data) {
matrix_debouncing[row] = data;
debouncing = true;
debouncing_time = timer_read();
}
}
if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
for (int row = 0; row < MATRIX_ROWS; row++) {
matrix[row] = matrix_debouncing[row];
}
debouncing = false;
}
matrix_scan_quantum();
return 1;
}
bool matrix_is_on(uint8_t row, uint8_t col)
{
return (matrix[row] & (1<<col));
}
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
void matrix_print(void)
{
xprintf("\nr/c 01234567\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
xprintf("%02X: ");
matrix_row_t data = matrix_get_row(row);
for (int col = 0; col < MATRIX_COLS; col++) {
if (data & (1<<col))
xprintf("1");
else
xprintf("0");
}
xprintf("\n");
}
}
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
}
__attribute__ ((weak))
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__ ((weak))
void matrix_init_user(void) {
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}

View File

@@ -1,58 +0,0 @@
/*
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 K20x_MCUCONF
/*
* HAL driver system settings.
*/
/* Select the MCU clocking mode below by enabling the appropriate block. */
#define KINETIS_NO_INIT FALSE
/* FEI mode - 48 MHz with internal 32.768 kHz crystal */
#define KINETIS_MCG_MODE KINETIS_MCG_MODE_FEI
#define KINETIS_MCG_FLL_DMX32 1 /* Fine-tune for 32.768 kHz */
#define KINETIS_MCG_FLL_DRS 1 /* 1464x FLL factor */
#define KINETIS_SYSCLK_FREQUENCY 47972352UL /* 32.768 kHz * 1464 (~48 MHz) */
#define KINETIS_CLKDIV1_OUTDIV1 1
#define KINETIS_CLKDIV1_OUTDIV2 1
#define KINETIS_CLKDIV1_OUTDIV4 2
#define KINETIS_BUSCLK_FREQUENCY KINETIS_SYSCLK_FREQUENCY
#define KINETIS_FLASHCLK_FREQUENCY KINETIS_SYSCLK_FREQUENCY/2
/*
* SERIAL driver system settings.
*/
#define KINETIS_SERIAL_USE_UART0 TRUE
/*
* USB driver settings
*/
#define KINETIS_USB_USE_USB0 TRUE
#define KINETIS_USB_USB0_IRQ_PRIORITY 5
/*
* I2C driver settings
*/
#define KINETIS_I2C_USE_I2C0 TRUE
#define KINETIS_I2C_I2C0_PRIORITY 4
#endif /* _MCUCONF_H_ */

View File

@@ -1,15 +0,0 @@
Infinity 60%
============
A compact community driven keyboard.
Keyboard Maintainer: QMK Community
Hardware Supported: Infinity 60% PCB
Hardware Availability: https://input.club/devices/infinity-keyboard/
Make example for this keyboard (after setting up your build environment):
make infinity60:default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View File

@@ -1,73 +0,0 @@
# project specific files
SRC = matrix.c \
led.c \
led_controller.c
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# - For Teensies, FAMILY = KINETIS and SERIES is either
# KL2x (LC) or K20x (3.0,3.1,3.2).
# - For Infinity KB, SERIES = K20x
MCU_FAMILY = KINETIS
MCU_SERIES = K20x
# Linker script to use
# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
# or <this_dir>/ld/
# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
# - LDSCRIPT =
# - MKL26Z64 for Teensy LC
# - MK20DX128 for Teensy 3.0
# - MK20DX256 for Teensy 3.1 and 3.2
# - MK20DX128BLDR4 for Infinity with Kiibohd bootloader
MCU_LDSCRIPT = MK20DX128BLDR4
# Startup code to use
# - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
# - STARTUP =
# - kl2x for Teensy LC
# - k20x5 for Teensy 3.0 and Infinity KB
# - k20x7 for Teensy 3.1 and 3.2
MCU_STARTUP = k20x5
# Board: it should exist either in <chibios>/os/hal/boards/
# or <this_dir>/boards
# - BOARD =
# - PJRC_TEENSY_LC for Teensy LC
# - PJRC_TEENSY_3 for Teensy 3.0
# - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2
# - MCHCK_K20 for Infinity KB
BOARD = MCHCK_K20
# Cortex version
# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
MCU = cortex-m4
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
# I.e. 6 for Teensy LC; 7 for Teensy 3.x
ARMV = 7
# Vector table for application
# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000
# Build Options
# comment out to disable the options.
#
DFU_ARGS = -d 1c11:b007
DFU_SUFFIX_ARGS = -p b007 -v 1c11
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = yes # Custom matrix file
LAYOUTS = 60_ansi_split_bs_rshift