commit
22ad6459b1
@ -0,0 +1,385 @@
|
||||
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
|
@ -0,0 +1,72 @@
|
||||
# project specific files
|
||||
SRC = matrix.c \
|
||||
led.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 60% with Kiibohd bootloader
|
||||
# - MK20DX256BLDR8 for Infinity ErgoDox with Kiibohd bootloader
|
||||
MCU_LDSCRIPT = MK20DX256BLDR8
|
||||
|
||||
# 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 60%
|
||||
# - k20x7 for Teensy 3.1, 3.2 and Infinity ErgoDox
|
||||
MCU_STARTUP = k20x7
|
||||
|
||||
# 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
|
||||
BOARD = PJRC_TEENSY_3_1
|
||||
|
||||
# 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=0x00002000
|
||||
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
BOOTMAGIC_ENABLE ?= yes # 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
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../Makefile
|
||||
endif
|
@ -0,0 +1 @@
|
||||
#define KIIBOHD_BOOTLOADER
|
@ -0,0 +1,524 @@
|
||||
/*
|
||||
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
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/**
|
||||
* @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 I/O Queues APIs.
|
||||
* @details If enabled then the I/O queues APIs are included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_QUEUES 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 context switch circular trace buffer is
|
||||
* activated.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#define CH_DBG_ENABLE_TRACE FALSE
|
||||
|
||||
/**
|
||||
* @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.
|
||||
*
|
||||
* @note It is inserted into lock zone.
|
||||
* @note It is also invoked when the threads simply return in order to
|
||||
* terminate.
|
||||
*/
|
||||
#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() { \
|
||||
}
|
||||
|
||||
/**
|
||||
* @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() { \
|
||||
}
|
||||
|
||||
/**
|
||||
* @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_ */
|
||||
|
||||
/** @} */
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
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 0xFEED
|
||||
#define PRODUCT_ID 0x6464
|
||||
#define DEVICE_VER 0x0001
|
||||
/* in python2: list(u"whatever".encode('utf-16-le')) */
|
||||
/* at most 32 characters or the ugly hack in usb_main.c borks */
|
||||
#define MANUFACTURER "TMK"
|
||||
#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00'
|
||||
#define PRODUCT "Infinity keyboard/TMK"
|
||||
#define USBSTR_PRODUCT 'I', '\x00', 'n', '\x00', 'f', '\x00', 'i', '\x00', 'n', '\x00', 'i', '\x00', 't', '\x00', 'y', '\x00', ' ', '\x00', 'k', '\x00', 'e', '\x00', 'y', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', '/', '\x00', 'T', '\x00', 'M', '\x00', 'K', '\x00'
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 18
|
||||
#define MATRIX_COLS 5
|
||||
#define LOCAL_MATRIX_ROWS 9
|
||||
|
||||
/* 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
|
||||
|
||||
/* key combination for command */
|
||||
#define IS_COMMAND() ( \
|
||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||
)
|
||||
|
||||
/* Keymap for Infiity prototype */
|
||||
#define INFINITY_PROTOTYPE
|
||||
|
||||
#define SERIAL_LINK_BAUD 562500
|
||||
#define SERIAL_LINK_THREAD_PRIORITY (NORMALPRIO - 1)
|
||||
// The visualizer needs gfx thread priorities
|
||||
#define VISUALIZER_THREAD_PRIORITY (NORMAL_PRIORITY - 2)
|
||||
|
||||
/*
|
||||
* 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
|
@ -0,0 +1,353 @@
|
||||
/*
|
||||
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 TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the SERIAL over USB subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_SERIAL_USB TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the SPI subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_SPI TRUE
|
||||
#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 128
|
||||
#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 256
|
||||
#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_ */
|
||||
|
||||
/** @} */
|
@ -0,0 +1 @@
|
||||
#include "infinity_ergodox.h"
|
@ -0,0 +1,44 @@
|
||||
#ifndef KEYBOARDS_INFINITY_ERGODOX_INFINITY_ERGODOX_H_
|
||||
#define KEYBOARDS_INFINITY_ERGODOX_INFINITY_ERGODOX_H_
|
||||
|
||||
#include "quantum.h"
|
||||
|
||||
#define KEYMAP( \
|
||||
A80, A70, A60, A50, A40, A30, A20, \
|
||||
A81, A71, A61, A51, A41, A31, A21, \
|
||||
A82, A72, A62, A52, A42, A32, \
|
||||
A83, A73, A63, A53, A43, A33, A23, \
|
||||
A84, A74, A64, A54, A44, \
|
||||
A13, A03, \
|
||||
A04, \
|
||||
A34, A24, A14, \
|
||||
B20, B30, B40, B50, B60, B70, B80, \
|
||||
B21, B31, B41, B51, B61, B71, B81, \
|
||||
B32, B42, B52, B62, B72, B82, \
|
||||
B23, B33, B43, B53, B63, B73, B83, \
|
||||
B44, B54, B64, B74, B84, \
|
||||
B03, B13, \
|
||||
B04, \
|
||||
B14, B24, B34 \
|
||||
) { \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_##A03, KC_##A04 }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_##A13, KC_##A14 }, \
|
||||
{ KC_##A20, KC_##A21, KC_NO, KC_##A23, KC_##A24 }, \
|
||||
{ KC_##A30, KC_##A31, KC_##A32, KC_##A33, KC_##A34 }, \
|
||||
{ KC_##A40, KC_##A41, KC_##A42, KC_##A43, KC_##A44 }, \
|
||||
{ KC_##A50, KC_##A51, KC_##A52, KC_##A53, KC_##A54 }, \
|
||||
{ KC_##A60, KC_##A61, KC_##A62, KC_##A63, KC_##A64 }, \
|
||||
{ KC_##A70, KC_##A71, KC_##A72, KC_##A73, KC_##A74 }, \
|
||||
{ KC_##A80, KC_##A81, KC_##A82, KC_##A83, KC_##A84 }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_##B03, KC_##B04 }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_##B13, KC_##B14 }, \
|
||||
{ KC_##B20, KC_##B21, KC_NO, KC_##B23, KC_##B24 }, \
|
||||
{ KC_##B30, KC_##B31, KC_##B32, KC_##B33, KC_##B34 }, \
|
||||
{ KC_##B40, KC_##B41, KC_##B42, KC_##B43, KC_##B44 }, \
|
||||
{ KC_##B50, KC_##B51, KC_##B52, KC_##B53, KC_##B54 }, \
|
||||
{ KC_##B60, KC_##B61, KC_##B62, KC_##B63, KC_##B64 }, \
|
||||
{ KC_##B70, KC_##B71, KC_##B72, KC_##B73, KC_##B74 }, \
|
||||
{ KC_##B80, KC_##B81, KC_##B82, KC_##B83, KC_##B84 } \
|
||||
}
|
||||
|
||||
#endif /* KEYBOARDS_INFINITY_ERGODOX_INFINITY_ERGODOX_H_ */
|
@ -0,0 +1,111 @@
|
||||
/*
|
||||
Copyright 2016 Fred Sundvik <fsundvik@gmail.com>
|
||||
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 "infinity_ergodox.h"
|
||||
|
||||
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KEYMAP( // layer 0 : default
|
||||
// left hand
|
||||
EQL, 1, 2, 3, 4, 5, ESC,
|
||||
BSLS,Q, W, E, R, T, FN1,
|
||||
TAB, A, S, D, F, G,
|
||||
LSFT,Z, X, C, V, B, FN0,
|
||||
LGUI,GRV, BSLS,LEFT,RGHT,
|
||||
LCTL,LALT,
|
||||
HOME,
|
||||
BSPC,DEL, END,
|
||||
// right hand
|
||||
FN2, 6, 7, 8, 9, 0, MINS,
|
||||
LBRC,Y, U, I, O, P, RBRC,
|
||||
H, J, K, L, SCLN,QUOT,
|
||||
FN0, N, M, COMM,DOT, SLSH,RSFT,
|
||||
LEFT,DOWN,UP, RGHT,RGUI,
|
||||
RALT,RCTL,
|
||||
PGUP,
|
||||
PGDN,ENT, SPC
|
||||
),
|
||||
|
||||
KEYMAP( // layer 1 : function and symbol keys
|
||||
// left hand
|
||||
TRNS,F1, F2, F3, F4, F5, F11,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN3,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,
|
||||
TRNS,
|
||||
TRNS,TRNS,TRNS,
|
||||
// right hand
|
||||
F12, F6, F7, F8, F9, F10, TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,
|
||||
TRNS,
|
||||
TRNS,TRNS,TRNS
|
||||
),
|
||||
|
||||
KEYMAP( // layer 2 : keyboard functions
|
||||
// left hand
|
||||
BTLD,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, FN3,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,
|
||||
TRNS,
|
||||
TRNS,TRNS,TRNS,
|
||||
// right hand
|
||||
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,
|
||||
TRNS,
|
||||
TRNS,TRNS,TRNS
|
||||
),
|
||||
|
||||
KEYMAP( // layer 3: numpad
|
||||
// left hand
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,
|
||||
TRNS,TRNS,
|
||||
TRNS,
|
||||
TRNS,TRNS,TRNS,
|
||||
// right hand
|
||||
TRNS,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
|
||||
TRNS,NO, P7, P8, P9, PMNS,BSPC,
|
||||
NO, P4, P5, P6, PPLS,PENT,
|
||||
TRNS,NO, P1, P2, P3, PPLS,PENT,
|
||||
P0, PDOT,SLSH,PENT,PENT,
|
||||
TRNS,TRNS,
|
||||
TRNS,
|
||||
TRNS,TRNS,TRNS
|
||||
),
|
||||
};
|
||||
const uint16_t fn_actions[] = {
|
||||
ACTION_LAYER_MOMENTARY(1), // FN0 - switch to Layer1
|
||||
ACTION_LAYER_SET(2, ON_PRESS), // FN1 - set Layer2
|
||||
ACTION_LAYER_TOGGLE(3), // FN2 - toggle Layer3 aka Numpad layer
|
||||
ACTION_LAYER_SET(0, ON_PRESS), // FN3 - set Layer0
|
||||
};
|
@ -0,0 +1,49 @@
|
||||
/*
|
||||
Copyright 2012 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 "hal.h"
|
||||
|
||||
#include "led.h"
|
||||
|
||||
|
||||
void led_set(uint8_t usb_led) {
|
||||
// The LCD backlight functionality conflicts with this simple
|
||||
// red backlight
|
||||
#if !defined(LCD_BACKLIGHT_ENABLE) && defined(STATUS_LED_ENABLE)
|
||||
// PTC1: LCD Backlight Red(0:on/1:off)
|
||||
GPIOC->PDDR |= (1<<1);
|
||||
PORTC->PCR[1] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1);
|
||||
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||
GPIOC->PCOR |= (1<<1);
|
||||
} else {
|
||||
GPIOC->PSOR |= (1<<1);
|
||||
}
|
||||
#elif !defined(LCD_BACKLIGHT_ENABLE)
|
||||
(void)usb_led;
|
||||
GPIOC->PDDR |= (1<<1);
|
||||
PORTC->PCR[1] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1);
|
||||
GPIOC->PSOR |= (1<<1);
|
||||
GPIOC->PDDR |= (1<<2);
|
||||
PORTC->PCR[2] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1);
|
||||
GPIOC->PSOR |= (1<<2);
|
||||
GPIOC->PDDR |= (1<<3);
|
||||
PORTC->PCR[3] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1);
|
||||
GPIOC->PSOR |= (1<<3);
|
||||
#else
|
||||
(void)usb_led;
|
||||
#endif
|
||||
}
|
@ -0,0 +1,169 @@
|
||||
/*
|
||||
Copyright 2016 Fred Sundvik <fsundvik@gmail.com>
|
||||
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 <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include "hal.h"
|
||||
#include "timer.h"
|
||||
#include "wait.h"
|
||||
#include "print.h"
|
||||
#include "debug.h"
|
||||
#include "matrix.h"
|
||||
|
||||
|
||||
/*
|
||||
* Infinity ErgoDox 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.
|
||||
*
|
||||
* col: { PTD1, PTD4, PTD5, PTD6, PTD7 }
|
||||
* row: { PTB2, PTB3, PTB18, PTB19, PTC0, PTC9, PTC10, PTC11, PTD0 }
|
||||
*/
|
||||
/* matrix state(1:on, 0:off) */
|
||||
static matrix_row_t matrix[MATRIX_ROWS];
|
||||
static matrix_row_t matrix_debouncing[LOCAL_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, 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);
|
||||
|
||||
/* Row(strobe) */
|
||||
palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOB, 18, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOB, 19, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOC, 9, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOC, 10, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOC, 11, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPadMode(GPIOD, 0, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
|
||||
memset(matrix, 0, MATRIX_ROWS);
|
||||
memset(matrix_debouncing, 0, LOCAL_MATRIX_ROWS);
|
||||
}
|
||||
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
for (int row = 0; row < LOCAL_MATRIX_ROWS; row++) {
|
||||
matrix_row_t data = 0;
|
||||
|
||||
// strobe row
|
||||
switch (row) {
|
||||
case 0: palSetPad(GPIOB, 2); break;
|
||||
case 1: palSetPad(GPIOB, 3); break;
|
||||
case 2: palSetPad(GPIOB, 18); break;
|
||||
case 3: palSetPad(GPIOB, 19); break;
|
||||
case 4: palSetPad(GPIOC, 0); break;
|
||||
case 5: palSetPad(GPIOC, 9); break;
|
||||
case 6: palSetPad(GPIOC, 10); break;
|
||||
case 7: palSetPad(GPIOC, 11); break;
|
||||
case 8: palSetPad(GPIOD, 0); break;
|
||||
}
|
||||
|
||||
// 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: { PTD1, PTD4, PTD5, PTD6, PTD7 }
|
||||
data = ((palReadPort(GPIOD) & 0xF0) >> 3) |
|
||||
((palReadPort(GPIOD) & 0x02) >> 1);
|
||||
|
||||
// un-strobe row
|
||||
switch (row) {
|
||||
case 0: palClearPad(GPIOB, 2); break;
|
||||
case 1: palClearPad(GPIOB, 3); break;
|
||||
case 2: palClearPad(GPIOB, 18); break;
|
||||
case 3: palClearPad(GPIOB, 19); break;
|
||||
case 4: palClearPad(GPIOC, 0); break;
|
||||
case 5: palClearPad(GPIOC, 9); break;
|
||||
case 6: palClearPad(GPIOC, 10); break;
|
||||
case 7: palClearPad(GPIOC, 11); break;
|
||||
case 8: palClearPad(GPIOD, 0); break;
|
||||
}
|
||||
|
||||
if (matrix_debouncing[row] != data) {
|
||||
matrix_debouncing[row] = data;
|
||||
debouncing = true;
|
||||
debouncing_time = timer_read();
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t offset = 0;
|
||||
#ifdef MASTER_IS_ON_RIGHT
|
||||
if (is_serial_link_master()) {
|
||||
offset = MATRIX_ROWS - LOCAL_MATRIX_ROWS;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
|
||||
for (int row = 0; row < LOCAL_MATRIX_ROWS; row++) {
|
||||
matrix[offset + row] = matrix_debouncing[row];
|
||||
}
|
||||
debouncing = false;
|
||||
}
|
||||
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("%X0: ", row);
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_set_remote(matrix_row_t* rows, uint8_t index) {
|
||||
uint8_t offset = 0;
|
||||
#ifdef MASTER_IS_ON_RIGHT
|
||||
offset = MATRIX_ROWS - LOCAL_MATRIX_ROWS * (index + 2);
|
||||
#else
|
||||
offset = LOCAL_MATRIX_ROWS * (index + 1);
|
||||
#endif
|
||||
for (int row = 0; row < LOCAL_MATRIX_ROWS; row++) {
|
||||
matrix[offset + row] = rows[row];
|
||||
}
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#define K20x7
|
||||
|
||||
/* Select the MCU clocking mode below by enabling the appropriate block. */
|
||||
|
||||
#define KINETIS_NO_INIT FALSE
|
||||
|
||||
/* PEE mode - 48MHz system clock driven by external crystal. */
|
||||
#define KINETIS_MCG_MODE KINETIS_MCG_MODE_PEE
|
||||
#define KINETIS_PLLCLK_FREQUENCY 72000000UL
|
||||
#define KINETIS_SYSCLK_FREQUENCY 72000000UL
|
||||
#define KINETIS_BUSCLK_FREQUENCY 36000000UL
|
||||
#define KINETIS_FLASHCLK_FREQUENCY 24000000UL
|
||||
|
||||
#if 0
|
||||
/* 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
|
||||
#endif
|
||||
|
||||
/*
|
||||
* SERIAL driver system settings.
|
||||
*/
|
||||
#define KINETIS_SERIAL_USE_UART0 TRUE
|
||||
#define KINETIS_SERIAL_USE_UART1 TRUE
|
||||
|
||||
/*
|
||||
* USB driver settings
|
||||
*/
|
||||
#define KINETIS_USB_USE_USB0 TRUE
|
||||
/* Need to redefine this, since the default is for K20x */
|
||||
/* This is for Teensy LC; you should comment it out (or change to 5)
|
||||
* for Teensy 3.x */
|
||||
#define KINETIS_USB_USB0_IRQ_PRIORITY 2
|
||||
|
||||
/*
|
||||
* SPI driver system settings.
|
||||
*/
|
||||
#define KINETIS_SPI_USE_SPI0 TRUE
|
||||
|
||||
#define KINETIS_I2C_USE_I2C0 TRUE
|
||||
|
||||
#endif /* _MCUCONF_H_ */
|
Loading…
Reference in new issue