forked from Github/qmk_firmware
Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4cfe36d6d0 |
21
.github/workflows/api.yml
vendored
21
.github/workflows/api.yml
vendored
@@ -25,13 +25,18 @@ jobs:
|
||||
- name: Generate API Data
|
||||
run: qmk generate-api
|
||||
|
||||
- name: Install rsync
|
||||
run: |
|
||||
apt-get update && apt-get install -y rsync
|
||||
|
||||
- name: Upload API Data
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ secrets.API_SPACE_MASTER }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||
SOURCE_DIR: 'api_data'
|
||||
ACCESS_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: main
|
||||
FOLDER: api_data/v1
|
||||
CLEAN: true
|
||||
GIT_CONFIG_EMAIL: hello@qmk.fm
|
||||
REPOSITORY_NAME: qmk/qmk_keyboards
|
||||
TARGET_FOLDER: v1
|
||||
|
21
.github/workflows/develop_api.yml
vendored
21
.github/workflows/develop_api.yml
vendored
@@ -25,13 +25,18 @@ jobs:
|
||||
- name: Generate API Data
|
||||
run: qmk generate-api
|
||||
|
||||
- name: Install rsync
|
||||
run: |
|
||||
apt-get update && apt-get install -y rsync
|
||||
|
||||
- name: Upload API Data
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ secrets.API_SPACE_DEVELOP }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||
SOURCE_DIR: 'api_data'
|
||||
ACCESS_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: main
|
||||
FOLDER: api_data/v1
|
||||
CLEAN: true
|
||||
GIT_CONFIG_EMAIL: hello@qmk.fm
|
||||
REPOSITORY_NAME: qmk/qmk_keyboards_devel
|
||||
TARGET_FOLDER: v1
|
||||
|
22
.github/workflows/format.yaml
vendored
22
.github/workflows/format.yaml
vendored
@@ -4,7 +4,6 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
format:
|
||||
@@ -15,8 +14,6 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: rlespinasse/github-slug-action@v3.x
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
token: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
@@ -31,17 +28,10 @@ jobs:
|
||||
bin/qmk pyformat
|
||||
bin/qmk fileformat
|
||||
|
||||
- name: Become QMK Bot
|
||||
run: |
|
||||
git config user.name 'QMK Bot'
|
||||
git config user.email 'hello@qmk.fm'
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
- name: Commit files
|
||||
uses: stefanzweifel/git-auto-commit-action@v4
|
||||
with:
|
||||
delete-branch: true
|
||||
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }}
|
||||
author: QMK Bot <hello@qmk.fm>
|
||||
committer: QMK Bot <hello@qmk.fm>
|
||||
commit-message: Format code according to conventions
|
||||
title: '[CI] Format code according to conventions'
|
||||
commit_message: Format code according to conventions for $GITHUB_SHA
|
||||
commit_user_name: QMK Bot
|
||||
commit_user_email: hello@qmk.fm
|
||||
commit_author: QMK Bot <hello@qmk.fm>
|
||||
|
3
bin/qmk
3
bin/qmk
@@ -27,8 +27,7 @@ def _check_modules(requirements):
|
||||
line = line.split('#')[0]
|
||||
|
||||
module = dict()
|
||||
module['name'] = line.split('=')[0] if '=' in line else line
|
||||
module['import'] = module['name'].replace('-', '_')
|
||||
module['name'] = module['import'] = line.split('=')[0] if '=' in line else line
|
||||
|
||||
# Not every module is importable by its own name.
|
||||
if module['name'] == "pep8-naming":
|
||||
|
@@ -97,7 +97,7 @@ MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
|
||||
|
||||
# Pull in rules from info.json
|
||||
INFO_RULES_MK = $(shell bin/qmk generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk)
|
||||
INFO_RULES_MK = $(shell bin/qmk generate-rules-mk --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk)
|
||||
include $(INFO_RULES_MK)
|
||||
|
||||
# Check for keymap.json first, so we can regenerate keymap.c
|
||||
|
@@ -17,8 +17,6 @@ SERIAL_PATH := $(QUANTUM_PATH)/serial_link
|
||||
|
||||
QUANTUM_SRC += \
|
||||
$(QUANTUM_DIR)/quantum.c \
|
||||
$(QUANTUM_DIR)/send_string.c \
|
||||
$(QUANTUM_DIR)/bitwise.c \
|
||||
$(QUANTUM_DIR)/led.c \
|
||||
$(QUANTUM_DIR)/keymap_common.c \
|
||||
$(QUANTUM_DIR)/keycode_config.c
|
||||
@@ -38,36 +36,12 @@ ifeq ($(strip $(API_SYSEX_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/api.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(COMMAND_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/command.c
|
||||
OPT_DEFS += -DCOMMAND_ENABLE
|
||||
endif
|
||||
|
||||
AUDIO_ENABLE ?= no
|
||||
ifeq ($(strip $(AUDIO_ENABLE)), yes)
|
||||
ifeq ($(PLATFORM),CHIBIOS)
|
||||
AUDIO_DRIVER ?= dac_basic
|
||||
ifeq ($(strip $(AUDIO_DRIVER)), dac_basic)
|
||||
OPT_DEFS += -DAUDIO_DRIVER_DAC
|
||||
else ifeq ($(strip $(AUDIO_DRIVER)), dac_additive)
|
||||
OPT_DEFS += -DAUDIO_DRIVER_DAC
|
||||
## stm32f2 and above have a usable DAC unit, f1 do not, and need to use pwm instead
|
||||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_software)
|
||||
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
||||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_hardware)
|
||||
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
||||
endif
|
||||
else
|
||||
# fallback for all other platforms is pwm
|
||||
AUDIO_DRIVER ?= pwm_hardware
|
||||
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
||||
endif
|
||||
OPT_DEFS += -DAUDIO_ENABLE
|
||||
MUSIC_ENABLE = yes
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
|
||||
SRC += $(QUANTUM_DIR)/audio/audio.c ## common audio code, hardware agnostic
|
||||
SRC += $(QUANTUM_DIR)/audio/driver_$(PLATFORM_KEY)_$(strip $(AUDIO_DRIVER)).c
|
||||
SRC += $(QUANTUM_DIR)/audio/audio_$(PLATFORM_KEY).c
|
||||
SRC += $(QUANTUM_DIR)/audio/voices.c
|
||||
SRC += $(QUANTUM_DIR)/audio/luts.c
|
||||
endif
|
||||
@@ -100,10 +74,9 @@ ifeq ($(strip $(VIRTSER_ENABLE)), yes)
|
||||
OPT_DEFS += -DVIRTSER_ENABLE
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
|
||||
OPT_DEFS += -DMOUSEKEY_ENABLE
|
||||
OPT_DEFS += -DMOUSE_ENABLE
|
||||
SRC += $(QUANTUM_DIR)/mousekey.c
|
||||
ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes)
|
||||
OPT_DEFS += -DFAUXCLICKY_ENABLE
|
||||
SRC += $(QUANTUM_DIR)/fauxclicky.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
||||
@@ -162,7 +135,7 @@ else
|
||||
# This ensures that the EEPROM page buffer fits into RAM
|
||||
USE_PROCESS_STACKSIZE = 0x600
|
||||
USE_EXCEPTIONS_STACKSIZE = 0x300
|
||||
|
||||
|
||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
|
||||
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
|
||||
OPT_DEFS += -DEEPROM_EMU_STM32F042x6
|
||||
@@ -217,6 +190,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
LED_MATRIX_ENABLE ?= no
|
||||
VALID_LED_MATRIX_TYPES := IS31FL3731 custom
|
||||
# TODO: IS31FL3733 IS31FL3737 IS31FL3741
|
||||
@@ -509,7 +483,7 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
|
||||
|
||||
# Determine which (if any) transport files are required
|
||||
ifneq ($(strip $(SPLIT_TRANSPORT)), custom)
|
||||
QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/transport.c
|
||||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c
|
||||
# Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called.
|
||||
# Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
|
||||
ifeq ($(PLATFORM),AVR)
|
||||
@@ -650,27 +624,3 @@ endif
|
||||
ifeq ($(strip $(JOYSTICK_ENABLE)), digital)
|
||||
OPT_DEFS += -DDIGITAL_JOYSTICK_ENABLE
|
||||
endif
|
||||
|
||||
USBPD_ENABLE ?= no
|
||||
VALID_USBPD_DRIVER_TYPES = custom vendor
|
||||
USBPD_DRIVER ?= vendor
|
||||
ifeq ($(strip $(USBPD_ENABLE)), yes)
|
||||
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),)
|
||||
$(error USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver)
|
||||
else
|
||||
OPT_DEFS += -DUSBPD_ENABLE
|
||||
ifeq ($(strip $(USBPD_DRIVER)), vendor)
|
||||
# Vendor-specific implementations
|
||||
OPT_DEFS += -DUSBPD_VENDOR
|
||||
ifeq ($(strip $(MCU_SERIES)), STM32G4xx)
|
||||
OPT_DEFS += -DUSBPD_STM32G4
|
||||
SRC += usbpd_stm32g4.c
|
||||
else
|
||||
$(error There is no vendor-provided USBPD driver available)
|
||||
endif
|
||||
else ifeq ($(strip $(USBPD_DRIVER)), custom)
|
||||
OPT_DEFS += -DUSBPD_CUSTOM
|
||||
# Board designers can add their own driver to $(SRC)
|
||||
endif
|
||||
endif
|
||||
endif
|
@@ -1,46 +0,0 @@
|
||||
# This file maps keys between `config.h` and `info.json`. It is used by QMK
|
||||
# to correctly and consistently map back and forth between the two systems.
|
||||
{
|
||||
# Format:
|
||||
# <config.h key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
||||
# value_type: one of "array", "array.int", "int", "hex", "list", "mapping"
|
||||
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
||||
# to_c: Default `true`. Set to `false` to exclude this mapping from config.h
|
||||
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"}
|
||||
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
|
||||
"DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
|
||||
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
||||
"LAYOUTS": {"info_key": "layout_aliases", "value_type": "mapping"},
|
||||
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
||||
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
||||
"LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"},
|
||||
"MANUFACTURER": {"info_key": "manufacturer"},
|
||||
"RGB_DI_PIN": {"info_key": "rgblight.pin"},
|
||||
"RGBLED_NUM": {"info_key": "rgblight.led_count", "value_type": "int"},
|
||||
"RGBLED_SPLIT": {"info_key": "rgblight.split_count", "value_type": "array.int"},
|
||||
"RGBLIGHT_ANIMATIONS": {"info_key": "rgblight.animations.all", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_ALTERNATING": {"info_key": "rgblight.animations.alternating", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_BREATHING": {"info_key": "rgblight.animations.breathing", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_CHRISTMAS": {"info_key": "rgblight.animations.christmas", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_KNIGHT": {"info_key": "rgblight.animations.knight", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_RAINBOW_MOOD": {"info_key": "rgblight.animations.rainbow_mood", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_RAINBOW_SWIRL": {"info_key": "rgblight.animations.rainbow_swirl", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_RGB_TEST": {"info_key": "rgblight.animations.rgb_test", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_SNAKE": {"info_key": "rgblight.animations.snake", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_STATIC_GRADIENT": {"info_key": "rgblight.animations.static_gradient", "value_type": "bool"},
|
||||
"RGBLIGHT_EFFECT_TWINKLE": {"info_key": "rgblight.animations.twinkle"},
|
||||
"RGBLIGHT_LIMIT_VAL": {"info_key": "rgblight.max_brightness", "value_type": "int"},
|
||||
"RGBLIGHT_HUE_STEP": {"info_key": "rgblight.hue_steps", "value_type": "int"},
|
||||
"RGBLIGHT_SAT_STEP": {"info_key": "rgblight.saturation_steps", "value_type": "int"},
|
||||
"RGBLIGHT_VAL_STEP": {"info_key": "rgblight.brightness_steps", "value_type": "int"},
|
||||
"RGBLIGHT_SLEEP": {"info_key": "rgblight.sleep", "value_type": "bool"},
|
||||
"RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "bool"},
|
||||
"PRODUCT": {"info_key": "keyboard_folder", "to_json": false},
|
||||
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex"},
|
||||
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"},
|
||||
"QMK_ESC_OUTPUT": {"info_key": "qmk_lufa_bootloader.esc_output"},
|
||||
"QMK_ESC_INPUT": {"info_key": "qmk_lufa_bootloader.esc_input"},
|
||||
"QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
|
||||
"QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"}
|
||||
}
|
@@ -1,15 +0,0 @@
|
||||
# This file maps keys between `rules.mk` and `info.json`. It is used by QMK
|
||||
# to correctly and consistently map back and forth between the two systems.
|
||||
{
|
||||
# Format:
|
||||
# <rules.mk key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
||||
# value_type: one of "array", "array.int", "int", "list", "hex", "mapping"
|
||||
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
||||
# to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
|
||||
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||
"BOARD": {"info_key": "board"},
|
||||
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
|
||||
"LAYOUTS": {"info_key": "community_layouts", "value_type": "list"},
|
||||
"LED_MATRIX_DRIVER": {"info_key": "led_matrix.driver"},
|
||||
"MCU": {"info_key": "processor", "warn_duplicate": false},
|
||||
}
|
@@ -1,443 +0,0 @@
|
||||
{
|
||||
# Format for each entry:
|
||||
# <alias>: {
|
||||
# target: <keyboard_folder>,
|
||||
# layouts: {
|
||||
# <layout_alias>: <layout_target>
|
||||
# }
|
||||
# }
|
||||
#
|
||||
# Both target and layouts are optional.
|
||||
'2_milk': {
|
||||
target: 'spaceman/2_milk'
|
||||
},
|
||||
'aeboards/ext65': {
|
||||
target: 'aeboards/ext65/rev1'
|
||||
},
|
||||
'ai03/equinox': {
|
||||
target: 'ai03/equinox/rev1'
|
||||
},
|
||||
aleth42: {
|
||||
target: 'aleth42/rev1'
|
||||
},
|
||||
alice: {
|
||||
target: 'tgr/alice'
|
||||
},
|
||||
angel17: {
|
||||
target: 'angel17/alpha'
|
||||
},
|
||||
angel64: {
|
||||
target: 'angel64/alpha'
|
||||
},
|
||||
at101_blackheart: {
|
||||
target: 'at101_bh'
|
||||
},
|
||||
'atom47/rev2': {
|
||||
target: 'maartenwut/atom47/rev2'
|
||||
},
|
||||
'atom47/rev3': {
|
||||
target: 'maartenwut/atom47/rev3'
|
||||
},
|
||||
bear_face: {
|
||||
target: 'bear_face/v1'
|
||||
},
|
||||
'bpiphany/pegasushoof': {
|
||||
target: 'bpiphany/pegasushoof/2013'
|
||||
},
|
||||
chavdai40: {
|
||||
target: 'chavdai40/rev1'
|
||||
},
|
||||
'candybar/lefty': {
|
||||
target: 'tkc/candybar/lefty'
|
||||
},
|
||||
'candybar/righty': {
|
||||
target: 'tkc/candybar/righty'
|
||||
},
|
||||
canoe: {
|
||||
target: 'percent/canoe'
|
||||
},
|
||||
'cmm_studio/saka68': {
|
||||
target: 'cmm_studio/saka68/solder'
|
||||
},
|
||||
'crkbd/rev1': {
|
||||
target: 'crkbd/rev1/legacy'
|
||||
},
|
||||
'doro67/multi': {
|
||||
layouts: {
|
||||
LAYOUT_ansi: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
'doro67/regular': {
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
'doro67/rgb': {
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
drakon: {
|
||||
target: 'jagdpietr/drakon'
|
||||
},
|
||||
'dztech/dz60rgb': {
|
||||
target: 'dztech/dz60rgb/v1'
|
||||
},
|
||||
'dztech/dz60rgb_ansi': {
|
||||
target: 'dztech/dz60rgb_ansi/v1'
|
||||
},
|
||||
'dztech/dz60rgb_wkl': {
|
||||
target: 'dztech/dz60rgb_wkl/v1'
|
||||
},
|
||||
'dztech/dz65rgb': {
|
||||
target: 'dztech/dz65rgb/v1'
|
||||
},
|
||||
eek: {
|
||||
target: 'eek/silk_down'
|
||||
},
|
||||
ergoinu: {
|
||||
target: 'dm9records/ergoinu'
|
||||
},
|
||||
'exclusive/e85': {
|
||||
target: 'exclusive/e85/hotswap'
|
||||
},
|
||||
gh60: {
|
||||
target: 'gh60/revc'
|
||||
},
|
||||
'handwired/ferris': {
|
||||
target: 'ferris/0_1'
|
||||
},
|
||||
'helix/pico/sc/back': {
|
||||
target: 'helix/pico/sc'
|
||||
},
|
||||
'helix/pico/sc/under': {
|
||||
target: 'helix/pico/sc'
|
||||
},
|
||||
'helix/rev2/back/oled': {
|
||||
target: 'helix/rev2/back'
|
||||
},
|
||||
'helix/rev2/oled': {
|
||||
target: 'helix/rev2'
|
||||
},
|
||||
'helix/rev2/oled/back': {
|
||||
target: 'helix/rev2/back'
|
||||
},
|
||||
'helix/rev2/oled/under': {
|
||||
target: 'helix/rev2/under'
|
||||
},
|
||||
'helix/rev2/sc/back': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/oled': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/oledback': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/oledunder': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/sc/under': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/under': {
|
||||
target: 'helix/rev2/sc'
|
||||
},
|
||||
'helix/rev2/under/oled': {
|
||||
target: 'helix/rev2/under'
|
||||
},
|
||||
id80: {
|
||||
target: 'id80/ansi'
|
||||
},
|
||||
idb_60: {
|
||||
target: 'idb/idb_60',
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_all'
|
||||
}
|
||||
},
|
||||
jones: {
|
||||
target: 'jones/v03_1'
|
||||
},
|
||||
katana60: {
|
||||
target: 'rominronin/katana60/rev1'
|
||||
},
|
||||
'kbdfans/kbd67mkiirgb': {
|
||||
target: 'kbdfans/kbd67/mkiirgb',
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
'kbdfans/kbd67/mkiirgb': {
|
||||
target: 'kbdfans/kbd67/mkiirgb/v1'
|
||||
},
|
||||
'keebio/dsp40': {
|
||||
target: 'keebio/dsp40/rev1'
|
||||
},
|
||||
'keycapsss/plaid_pad': {
|
||||
target: 'keycapsss/plaid_pad/rev1'
|
||||
},
|
||||
kudox: {
|
||||
target: 'kudox/rev1'
|
||||
},
|
||||
'lfkeyboards/lfk78': {
|
||||
target: 'lfkeyboards/lfk78/revj'
|
||||
},
|
||||
'lfkeyboards/smk65': {
|
||||
target: 'lfkeyboards/smk65/revb'
|
||||
},
|
||||
'maartenwut/atom47/rev2': {
|
||||
target: 'evyd13/atom47/rev2'
|
||||
},
|
||||
'maartenwut/atom47/rev3': {
|
||||
target: 'evyd13/atom47/rev3'
|
||||
},
|
||||
'maartenwut/eon40': {
|
||||
target: 'evyd13/eon40'
|
||||
},
|
||||
'maartenwut/eon65': {
|
||||
target: 'evyd13/eon65'
|
||||
},
|
||||
'maartenwut/eon75': {
|
||||
target: 'evyd13/eon75'
|
||||
},
|
||||
'maartenwut/eon87': {
|
||||
target: 'evyd13/eon87'
|
||||
},
|
||||
'maartenwut/eon95': {
|
||||
target: 'evyd13/eon95'
|
||||
},
|
||||
'maartenwut/gh80_1800': {
|
||||
target: 'evyd13/gh80_1800'
|
||||
},
|
||||
'maartenwut/gh80_3700': {
|
||||
target: 'evyd13/gh80_3700'
|
||||
},
|
||||
'maartenwut/minitomic': {
|
||||
target: 'evyd13/minitomic'
|
||||
},
|
||||
'maartenwut/mx5160': {
|
||||
target: 'evyd13/mx5160'
|
||||
},
|
||||
'maartenwut/nt660': {
|
||||
target: 'evyd13/nt660'
|
||||
},
|
||||
'maartenwut/omrontkl': {
|
||||
target: 'evyd13/omrontkl'
|
||||
},
|
||||
'maartenwut/plain60': {
|
||||
target: 'evyd13/plain60'
|
||||
},
|
||||
'maartenwut/pockettype': {
|
||||
target: 'evyd13/pockettype'
|
||||
},
|
||||
'maartenwut/quackfire': {
|
||||
target: 'evyd13/quackfire'
|
||||
},
|
||||
'maartenwut/solheim68': {
|
||||
target: 'evyd13/solheim68'
|
||||
},
|
||||
'maartenwut/ta65': {
|
||||
target: 'evyd13/ta65'
|
||||
},
|
||||
'maartenwut/wasdat': {
|
||||
target: 'evyd13/wasdat'
|
||||
},
|
||||
'maartenwut/wasdat_code': {
|
||||
target: 'evyd13/wasdat_code'
|
||||
},
|
||||
'maartenwut/wonderland': {
|
||||
target: 'evyd13/wonderland'
|
||||
},
|
||||
'mechlovin/hannah910': {
|
||||
target: 'mechlovin/hannah910/rev1'
|
||||
},
|
||||
'mechlovin/adelais/rgb_led': {
|
||||
target: 'mechlovin/adelais/rgb_led/rev1'
|
||||
},
|
||||
'mechlovin/adelais/standard_led': {
|
||||
target: 'mechlovin/adelais/standard_led/rev2'
|
||||
},
|
||||
'mechlovin/delphine': {
|
||||
target: 'mechlovin/delphine/mono_led'
|
||||
},
|
||||
'mechlovin/hannah60rgb': {
|
||||
target: 'mechlovin/hannah60rgb/rev1'
|
||||
},
|
||||
'melgeek/z70ultra': {
|
||||
target: 'melgeek/z70ultra/rev1'
|
||||
},
|
||||
'mechlovin/hannah65': {
|
||||
target: 'mechlovin/hannah65/rev1'
|
||||
},
|
||||
model01: {
|
||||
target: 'keyboardio/model01'
|
||||
},
|
||||
m0lly: {
|
||||
target: 'tkc/m0lly'
|
||||
},
|
||||
'montsinger/rebound': {
|
||||
target: 'montsinger/rebound/rev1'
|
||||
},
|
||||
nomu30: {
|
||||
target: 'nomu30/rev1'
|
||||
},
|
||||
'noxary/268_2': {
|
||||
layouts: {
|
||||
LAYOUT: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
oddball: {
|
||||
target: 'oddball/v1'
|
||||
},
|
||||
omnikey_blackheart: {
|
||||
target: 'omnikey_bh'
|
||||
},
|
||||
'pabile/p20': {
|
||||
target: 'pabile/p20/ver1'
|
||||
},
|
||||
'pancake/feather': {
|
||||
target: 'spaceman/pancake/feather'
|
||||
},
|
||||
'pancake/promicro': {
|
||||
target: 'spaceman/pancake/promicro'
|
||||
},
|
||||
'percent/canoe': {
|
||||
layouts: {
|
||||
LAYOUT_iso: 'LAYOUT_65_iso_blocker'
|
||||
}
|
||||
},
|
||||
plaid: {
|
||||
target: 'dm9records/plaid'
|
||||
},
|
||||
plain60: {
|
||||
target: 'maartenwut/plain60'
|
||||
},
|
||||
'ploopyco/trackball': {
|
||||
target: 'ploopyco/trackball/rev1_005'
|
||||
},
|
||||
polilla: {
|
||||
target: 'polilla/rev1'
|
||||
},
|
||||
'preonic/rev1': {
|
||||
layouts: {
|
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
|
||||
}
|
||||
},
|
||||
'preonic/rev2': {
|
||||
layouts: {
|
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
|
||||
}
|
||||
},
|
||||
'preonic/rev3': {
|
||||
layouts: {
|
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
|
||||
}
|
||||
},
|
||||
'primekb/prime_l': {
|
||||
target: 'primekb/prime_l/v1'
|
||||
},
|
||||
'primekb/prime_l_v2': {
|
||||
target: 'primekb/prime_l/v2'
|
||||
},
|
||||
'projectkb/alice': {
|
||||
target: 'projectkb/alice/rev1'
|
||||
},
|
||||
'rama/koyu': {
|
||||
target: 'wilba_tech/rama_works_koyu'
|
||||
},
|
||||
'rama/m6_a': {
|
||||
target: 'wilba_tech/rama_works_m6_a'
|
||||
},
|
||||
'rama/m6_b': {
|
||||
target: 'wilba_tech/rama_works_m6_b'
|
||||
},
|
||||
'rama/m10_b': {
|
||||
target: 'wilba_tech/rama_works_m10_b'
|
||||
},
|
||||
'rama/m60_a': {
|
||||
target: 'wilba_tech/rama_works_m60_a'
|
||||
},
|
||||
'rama/u80_a': {
|
||||
target: 'wilba_tech/rama_works_u80_a'
|
||||
},
|
||||
'ramonimbao/herringbone': {
|
||||
target: 'ramonimbao/herringbone/v1'
|
||||
},
|
||||
'rgbkb/pan': {
|
||||
target: 'rgbkb/pan/rev1/32a'
|
||||
},
|
||||
'rgbkb/pan/rev1': {
|
||||
target: 'rgbkb/pan/rev1/32a'
|
||||
},
|
||||
romac: {
|
||||
target: 'kingly_keys/romac'
|
||||
},
|
||||
ropro: {
|
||||
target: 'kingly_keys/ropro'
|
||||
},
|
||||
satan: {
|
||||
target: 'gh60/satan'
|
||||
},
|
||||
skog: {
|
||||
target: 'percent/skog'
|
||||
},
|
||||
speedo: {
|
||||
target: 'cozykeys/speedo/v2'
|
||||
},
|
||||
stoutgat: {
|
||||
target: 'tkw/stoutgat/v1'
|
||||
},
|
||||
suihankey: {
|
||||
target: 'suihankey/split/alpha'
|
||||
},
|
||||
ta65: {
|
||||
target: 'maartenwut/ta65'
|
||||
},
|
||||
tartan: {
|
||||
target: 'dm9records/tartan'
|
||||
},
|
||||
tkc1800: {
|
||||
target: 'tkc/tkc1800'
|
||||
},
|
||||
'tkw/stoutgat/v2': {
|
||||
target: 'tkw/stoutgat/v2/f411'
|
||||
},
|
||||
underscore33: {
|
||||
target: 'underscore33/rev1'
|
||||
},
|
||||
vinta: {
|
||||
layouts: {
|
||||
LAYOUT_67_ansi: 'LAYOUT_65_ansi_blocker'
|
||||
}
|
||||
},
|
||||
wasdat: {
|
||||
target: 'maartenwut/wasdat'
|
||||
},
|
||||
'westfoxtrot/cypher': {
|
||||
target: 'westfoxtrot/cypher/rev1'
|
||||
},
|
||||
'whale/sk': {
|
||||
target: 'whale/sk/v3'
|
||||
},
|
||||
'xelus/dawn60': {
|
||||
target: 'xelus/dawn60/rev1'
|
||||
},
|
||||
'xelus/valor': {
|
||||
target: 'xelus/valor/rev1'
|
||||
},
|
||||
yd60mq: {
|
||||
target: 'yd60mq/12led'
|
||||
},
|
||||
ymd75: {
|
||||
target: 'ymd75/rev1'
|
||||
},
|
||||
z150_blackheart: {
|
||||
target: 'z150_bh'
|
||||
},
|
||||
zeal60: {
|
||||
target: 'wilba_tech/zeal60'
|
||||
},
|
||||
zeal65: {
|
||||
target: 'wilba_tech/zeal65'
|
||||
}
|
||||
}
|
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"processor": {
|
||||
"type": "string",
|
||||
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F411", "STM32G431", "STM32G474", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
||||
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F411", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
||||
},
|
||||
"board": {
|
||||
"type": "string",
|
||||
@@ -85,16 +85,8 @@
|
||||
"layout_aliases": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"enum": ["LAYOUT", "LAYOUT_planck_1x2uC"]
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^LAYOUT_[0-9a-z_]*$"
|
||||
}
|
||||
]
|
||||
"type": "string",
|
||||
"pattern": "^LAYOUT_[0-9a-z_]*$"
|
||||
}
|
||||
},
|
||||
"layouts": {
|
||||
@@ -299,28 +291,6 @@
|
||||
"pattern": "^[0-9A-F]x[0-9A-F][0-9A-F][0-9A-F][0-9A-F]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"qmk_lufa_bootloader": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"esc_output": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
},
|
||||
"esc_input": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
},
|
||||
"led": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
},
|
||||
"speaker": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-K]\\d{1,2}$"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,169 +0,0 @@
|
||||
# QMK Breaking Changes - 2021 February 27 Changelog
|
||||
|
||||
## Changes Requiring User Action
|
||||
|
||||
The following keyboards have had their source moved within QMK:
|
||||
|
||||
Old Keyboard Name | New Keyboard Name
|
||||
:---------------- | :----------------
|
||||
bear_65 | jacky_studio/bear_65
|
||||
s7_elephant/rev1 | jacky_studio/s7_elephant/rev1
|
||||
s7_elephant/rev2 | jacky_studio/s7_elephant/rev2
|
||||
aplx6 | aplyard/aplx6/rev1
|
||||
southpaw75 | fr4/southpaw75
|
||||
|
||||
The [Aplyard Aplx6 rev2](https://github.com/qmk/qmk_firmware/tree/0.12.0/keyboards/aplyard/aplx6/rev1) and the [FR4Boards Unix60](https://github.com/qmk/qmk_firmware/tree/0.12.0/keyboards/fr4/unix60) have also been added as part of these changes.
|
||||
|
||||
Additionally, the `handwired/bluepill/bluepill70` keyboard has been removed.
|
||||
|
||||
## Core Changes
|
||||
|
||||
### ChibiOS Update and Config Migration
|
||||
|
||||
QMK's ChibiOS and ChibiOS-Contrib submodules have been updated to version 20.3.2.
|
||||
|
||||
Along with this, QMK now provides default configuration files for all commonly-supported ARM microcontrollers running on ChibiOS. As such, keyboards are now only required to define settings which differ from the defaults, thereby reducing the size of pull requests for keyboards running atop ChibiOS.
|
||||
|
||||
### QMK Infrastructure and Internals
|
||||
|
||||
Python is now required to build QMK. The minimum Python version has been increased to 3.7.
|
||||
|
||||
The power of `info.json` has been massively expanded. Most keyboard parameters can now be expressed in `info.json` instead of `config.h`/`rules.mk`. This should make maintaining keyboards easier, and will enable tooling that can allow non-technical users to add and maintain QMK keyboards without writing any code.
|
||||
|
||||
To ease migration a new command has been provided, `qmk generate-info-json -kb <keyboard>`. You can use this command to generate a complete `info.json` file for a keyboard and then remove the duplicate information from `config.h` and `rules.mk`.
|
||||
|
||||
Detailed example showing how to generate a new info.json and identify duplicate keys:
|
||||
|
||||
```
|
||||
user@hostname:~/qmk_firmware/keyboards/lets_split:0$ qmk generate-info-json > new-info.json
|
||||
user@hostname:~/qmk_firmware/keyboards/lets_split:0$ mv new-info.json info.json
|
||||
user@hostname:~/qmk_firmware/keyboards/lets_split:0$ qmk info
|
||||
⚠ lets_split/rev2: DEBOUNCE in config.h is overwriting debounce in info.json
|
||||
⚠ lets_split/rev2: DEVICE_VER in config.h is overwriting usb.device_ver in info.json
|
||||
⚠ lets_split/rev2: DIODE_DIRECTION in config.h is overwriting diode_direction in info.json
|
||||
⚠ lets_split/rev2: MANUFACTURER in config.h is overwriting manufacturer in info.json
|
||||
⚠ lets_split/rev2: RGB_DI_PIN in config.h is overwriting rgblight.pin in info.json
|
||||
⚠ lets_split/rev2: RGBLED_NUM in config.h is overwriting rgblight.led_count in info.json
|
||||
⚠ lets_split/rev2: PRODUCT_ID in config.h is overwriting usb.pid in info.json
|
||||
⚠ lets_split/rev2: VENDOR_ID in config.h is overwriting usb.vid in info.json
|
||||
⚠ lets_split/rev2: Matrix pins are specified in both info.json and config.h, the config.h values win.
|
||||
⚠ lets_split/rev2: LAYOUTS in rules.mk is overwriting community_layouts in info.json
|
||||
⚠ lets_split/rev2: Feature bootmagic is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature mousekey is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature extrakey is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature console is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature command is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature nkro is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature backlight is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature midi is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature audio is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature unicode is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature bluetooth is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature rgblight is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
⚠ lets_split/rev2: Feature sleep_led is specified in both info.json and rules.mk, the rules.mk value wins.
|
||||
Keyboard Name: Let's Split
|
||||
Manufacturer: Wootpatoot
|
||||
Website:
|
||||
Maintainer: QMK Community
|
||||
Keyboard Folder: lets_split/rev2
|
||||
Layouts: LAYOUT, LAYOUT_ortho_4x12
|
||||
Size: 13 x 4
|
||||
Processor: atmega32u4
|
||||
Bootloader: caterina
|
||||
```
|
||||
|
||||
## Detailed Change List
|
||||
|
||||
### Changes Requiring User Action
|
||||
|
||||
* Refactor Jacky's boards (Bear65 and S7 Elephant) ([#10528](https://github.com/qmk/qmk_firmware/pull/10528), [#11981](https://github.com/qmk/qmk_firmware/pull/11981))
|
||||
* Remove handwired/bluepill ([#11415](https://github.com/qmk/qmk_firmware/pull/11415))
|
||||
* Aplyard Aplx6 Added rev2 & move rev1+rev2 to parent folder ([#10973](https://github.com/qmk/qmk_firmware/pull/10973))
|
||||
* added `unix60`, moved together with `southpaw75` into `fr4` folder ([#11195](https://github.com/qmk/qmk_firmware/pull/11195))
|
||||
|
||||
### Fixes
|
||||
|
||||
* GCC 10 can now compile Drop Alt firmware ([#9485](https://github.com/qmk/qmk_firmware/pull/9485))
|
||||
* Fix compiling on `develop` branch ([#11409](https://github.com/qmk/qmk_firmware/pull/11409))
|
||||
* Fix broken keyboards and keymaps ([#11412](https://github.com/qmk/qmk_firmware/pull/11412), [#11427](https://github.com/qmk/qmk_firmware/pull/11427), [#11448](https://github.com/qmk/qmk_firmware/pull/11448), [#11447](https://github.com/qmk/qmk_firmware/pull/11447), [#11473](https://github.com/qmk/qmk_firmware/pull/11473), [#11584](https://github.com/qmk/qmk_firmware/pull/11584), [#11600](https://github.com/qmk/qmk_firmware/pull/11600))
|
||||
* Fixed up build dependencies so that generated files are made available before compiling any object files ([#11435](https://github.com/qmk/qmk_firmware/pull/11435))
|
||||
* Formatting fixes ([`378edd9`](https://github.com/qmk/qmk_firmware/commit/378edd9491f2ab0d3d8a970c9a8e64bc03ca15cf), [#11594](https://github.com/qmk/qmk_firmware/pull/11594), [`27749e1`](https://github.com/qmk/qmk_firmware/commit/27749e1c967c02c05e62a89a0ae2776dd7e5158c))
|
||||
* Include `stdbool.h` in `uart.h` to fix compiler errors ([#11728](https://github.com/qmk/qmk_firmware/pull/11728))
|
||||
* Decouple USB events from the USB interrupt handler in ChibiOS ([#10437](https://github.com/qmk/qmk_firmware/pull/10437))
|
||||
* Fixes an issue while using Backlight and External EEPROM at the same time that would cause the MCU to lock up.
|
||||
* Address wake from sleep instability ([#11450](https://github.com/qmk/qmk_firmware/pull/11450))
|
||||
* Fix pressing media key on a momentarily activated layer may lead to missing key up events ([#11162](https://github.com/qmk/qmk_firmware/pull/11162))
|
||||
* Fix an RGB initialisation bug on Massdrop keyboards ([#12022](https://github.com/qmk/qmk_firmware/pull/12022))
|
||||
* Fix file encoding errors on Windows, and layouts not correctly merging into info.json ([#12039](https://github.com/qmk/qmk_firmware/pull/12039))
|
||||
|
||||
### Additions and Enhancements
|
||||
|
||||
* Allow configuration of serial USART timeout ([#11057](https://github.com/qmk/qmk_firmware/pull/11057))
|
||||
* Added Sync Timer feature for Split Common keyboards ([#10997](https://github.com/qmk/qmk_firmware/pull/10997))
|
||||
* Add modifier state to the Split Common transport ([#10400](https://github.com/qmk/qmk_firmware/pull/10400))
|
||||
* Add Pix keyboard by sendz (`sendyyeah/pix`) ([#11154](https://github.com/qmk/qmk_firmware/pull/11154))
|
||||
* Implement option for kinetic mouse movement algorithm for mouse keys ([#6739](https://github.com/qmk/qmk_firmware/pull/6739))
|
||||
* Improved Language Specific Keycodes for US International and Extended Layouts ([#11307](https://github.com/qmk/qmk_firmware/pull/11307))
|
||||
* Modified `QWIIC_ENABLE` in `rules.mk` to be yes/no choice, adding `QWIIC_DRIVERS` to allow for inclusion of specific drivers ([#11426](https://github.com/qmk/qmk_firmware/pull/11426))
|
||||
* Allow AVR-based keyboards to override the `bootloader_jump` function ([#11418](https://github.com/qmk/qmk_firmware/pull/11418))
|
||||
* Refine RGBLight Twinkle effect to be smoother (use breathing curve) ([#11350](https://github.com/qmk/qmk_firmware/pull/11350))
|
||||
* Keep track of last matrix activity ([#10730](https://github.com/qmk/qmk_firmware/pull/10730), [`ab375d3`](https://github.com/qmk/qmk_firmware/commit/ab375d3d075c105f09a1ddd0e155f178225518bc), [#11552](https://github.com/qmk/qmk_firmware/pull/11552))
|
||||
* fix `matrix_io_delay()` timing in `quantum/matrix.c` ([#9603](https://github.com/qmk/qmk_firmware/pull/9603))
|
||||
* Keep track of encoder activity ([#11595](https://github.com/qmk/qmk_firmware/pull/11595))
|
||||
* Backport ChibiOS Audio changes from ZSA ([#11687](https://github.com/qmk/qmk_firmware/pull/11687))
|
||||
* Add support for 8 buttons to mouse report ([#10807](https://github.com/qmk/qmk_firmware/pull/10807))
|
||||
* Allow `post_config.h` to be implemented in userspace ([#11519](https://github.com/qmk/qmk_firmware/pull/11519))
|
||||
* Adds AT90USB162 support ([#11570](https://github.com/qmk/qmk_firmware/pull/11570))
|
||||
* Stop sounds when suspended ([#11553](https://github.com/qmk/qmk_firmware/pull/11553))
|
||||
* Revamp spidey3 userspace and keymaps ([#11768](https://github.com/qmk/qmk_firmware/pull/11768))
|
||||
* Add support for analog USBPD on STM32G4xx ([#11824](https://github.com/qmk/qmk_firmware/pull/11824))
|
||||
* Master matrix can now be transported to the slave side in Split Common keyboards ([#11046](https://github.com/qmk/qmk_firmware/pull/11046))
|
||||
* RGBLight: Allow configurable default settings ([#11912](https://github.com/qmk/qmk_firmware/pull/11912))
|
||||
* Add `tap_code_delay(code, delay)` ([#11913](https://github.com/qmk/qmk_firmware/pull/11913), [#11938](https://github.com/qmk/qmk_firmware/pull/11938))
|
||||
|
||||
### Clean-ups and Optimizations
|
||||
|
||||
* Fix duplicate `I2C_KEYMAP_START` define ([#11237](https://github.com/qmk/qmk_firmware/pull/11237))
|
||||
* Rewrite APA102 support for RGBLight ([#10894](https://github.com/qmk/qmk_firmware/pull/10894))
|
||||
* Update ADB Protocol implementation in TMK Core ([#11168](https://github.com/qmk/qmk_firmware/pull/11168))
|
||||
* Remove unused `action_get_macro()` usages in user files ([#11165](https://github.com/qmk/qmk_firmware/pull/11165))
|
||||
* Remove `QMK_KEYBOARD_CONFIG_H` ([#11576](https://github.com/qmk/qmk_firmware/pull/11576))
|
||||
* Remove duplicated housekeeping in `arm_atsam` ([#11672](https://github.com/qmk/qmk_firmware/pull/11672))
|
||||
* UART driver refactor ([#11637](https://github.com/qmk/qmk_firmware/pull/11637))
|
||||
* Move `transport.c` to `QUANTUM_LIB_SRC` ([#11751](https://github.com/qmk/qmk_firmware/pull/11751))
|
||||
* Remove `MIDI_ENABLE_STRICT` from user keymaps ([#11750](https://github.com/qmk/qmk_firmware/pull/11750))
|
||||
* Remove legacy print backward compatiblitly ([#11805](https://github.com/qmk/qmk_firmware/pull/11805))
|
||||
* Migrate mousekey to quantum ([#11804](https://github.com/qmk/qmk_firmware/pull/11804))
|
||||
* remove deprecated `qmk json-keymap` ([#11823](https://github.com/qmk/qmk_firmware/pull/11823))
|
||||
* Remove FAUXCLICKY feature (deprecated) ([#11829](https://github.com/qmk/qmk_firmware/pull/11829))
|
||||
* Refactor platform logic within `print.h` ([#11863](https://github.com/qmk/qmk_firmware/pull/11863))
|
||||
* Audio system overhaul ([#11820](https://github.com/qmk/qmk_firmware/pull/11820))
|
||||
* Output selection: Remove "USB and BT" option for Bluetooth ([#11940](https://github.com/qmk/qmk_firmware/pull/11940))
|
||||
* `tmk_core/common/action.c`: refactor for code size; merge multiple `case`s into one ([#11943](https://github.com/qmk/qmk_firmware/pull/11943))
|
||||
* Remove rules and settings from user keymaps that are already defined at keyboard level ([#11966](https://github.com/qmk/qmk_firmware/pull/11966))
|
||||
|
||||
### QMK Infrastructure and Internals
|
||||
|
||||
* bump to python 3.7 ([#11408](https://github.com/qmk/qmk_firmware/pull/11408))
|
||||
* `develop` branch is now formatted as part of CI tasks ([#11893](https://github.com/qmk/qmk_firmware/pull/11893), [#11905](https://github.com/qmk/qmk_firmware/pull/11905), [#11907](https://github.com/qmk/qmk_firmware/pull/11907), [#11928](https://github.com/qmk/qmk_firmware/pull/11928), [#11936](https://github.com/qmk/qmk_firmware/pull/11936))
|
||||
* Configure keyboard matrix from info.json ([#10817](https://github.com/qmk/qmk_firmware/pull/10817))
|
||||
* Validate our JSON data using json_schema ([#11101](https://github.com/qmk/qmk_firmware/pull/11101))
|
||||
* Use the schema to eliminate custom code ([#11108](https://github.com/qmk/qmk_firmware/pull/11108))
|
||||
* Add support for specifying BOARD in `info.json` ([#11492](https://github.com/qmk/qmk_firmware/pull/11492))
|
||||
* Document how to add data driven configurations ([#11502](https://github.com/qmk/qmk_firmware/pull/11502))
|
||||
* Process info.json rules ahead of userspace rules ([#11542](https://github.com/qmk/qmk_firmware/pull/11542))
|
||||
* Remove duplicate manufacturer definitions ([#11544](https://github.com/qmk/qmk_firmware/pull/11544))
|
||||
* Update list of MCUs in `keyboard.jsonschema` to mirror `qmk.constants.py` ([#11688](https://github.com/qmk/qmk_firmware/pull/11688))
|
||||
* Create a system to map between `info.json` and `config.h`/`rules.mk` ([#11548](https://github.com/qmk/qmk_firmware/pull/11548))
|
||||
* Make LAYOUT parsing more robust ([#12000](https://github.com/qmk/qmk_firmware/pull/12000))
|
||||
|
||||
|
||||
### ChibiOS Update and Config Migration
|
||||
|
||||
* Add board specific to Proton-C, with usual defaults turned on to match Pro-Micro ([#10976](https://github.com/qmk/qmk_firmware/pull/10976))
|
||||
* Disable almost all ChibiOS subsystems in default configs ([#11111](https://github.com/qmk/qmk_firmware/pull/11111))
|
||||
* Config Migrations ([#10418](https://github.com/qmk/qmk_firmware/pull/10418), [#11123](https://github.com/qmk/qmk_firmware/pull/11123), [#11261](https://github.com/qmk/qmk_firmware/pull/11261), [#11413](https://github.com/qmk/qmk_firmware/pull/11413), [#11414](https://github.com/qmk/qmk_firmware/pull/11414), [#11495](https://github.com/qmk/qmk_firmware/pull/11495), [#11504](https://github.com/qmk/qmk_firmware/pull/11504), [#11529](https://github.com/qmk/qmk_firmware/pull/11529), [#11588](https://github.com/qmk/qmk_firmware/pull/11588), [#11598](https://github.com/qmk/qmk_firmware/pull/11598), [#11607](https://github.com/qmk/qmk_firmware/pull/11607), [#11617](https://github.com/qmk/qmk_firmware/pull/11617), [#11620](https://github.com/qmk/qmk_firmware/pull/11620), [#11630](https://github.com/qmk/qmk_firmware/pull/11630), [#11646](https://github.com/qmk/qmk_firmware/pull/11646), [#11689](https://github.com/qmk/qmk_firmware/pull/11689), [#11846](https://github.com/qmk/qmk_firmware/pull/11846), [#11927](https://github.com/qmk/qmk_firmware/pull/11927), [#12001](https://github.com/qmk/qmk_firmware/pull/12001))
|
||||
* Disable subsystems repo-wide ([#11449](https://github.com/qmk/qmk_firmware/pull/11449))
|
||||
* Leftover early initialisation conversions ([#11615](https://github.com/qmk/qmk_firmware/pull/11615))
|
||||
* Fix up comments showing how to execute config migration ([#11621](https://github.com/qmk/qmk_firmware/pull/11621))
|
||||
* Add STM32G431 and STM32G474 board definitions ([#11793](https://github.com/qmk/qmk_firmware/pull/11793))
|
813
docs/ChangeLog/20210228.md
Normal file
813
docs/ChangeLog/20210228.md
Normal file
@@ -0,0 +1,813 @@
|
||||
#### Include stdbool.h in uart.h ([#11728](https://github.com/qmk/qmk_firmware/pull/11728))
|
||||
|
||||
Include stdbool.h in uart.h to fix compiler errors.
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
* Travis CI errors
|
||||
#### ChibiOS conf migrations... take 12 ([#11689](https://github.com/qmk/qmk_firmware/pull/11689))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
durgod/k320 - 168c88d401381d9a29166d3b07967e6f0752532d
|
||||
```
|
||||
#### Update list of MCUs in keyboard.jsonschema to mirror qmk.constants.py ([#11688](https://github.com/qmk/qmk_firmware/pull/11688))
|
||||
|
||||
Mirroring checked values between python and jsonschema.
|
||||
#### Backport ChibiOS Audio changes from ZSA ([#11687](https://github.com/qmk/qmk_firmware/pull/11687))
|
||||
|
||||
Should disable the pins for audio when not in use (playing notes). Added due to issues found with the Planck EZ.
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
* Issues found on planck ez.
|
||||
#### Remove duplicated housekeeping call from `arm_atsam` ([#11672](https://github.com/qmk/qmk_firmware/pull/11672))
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
|
||||
Patch for https://github.com/qmk/qmk_firmware/pull/10530#discussion_r549612205
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
None
|
||||
#### ChibiOS conf migrations... take 11 ([#11646](https://github.com/qmk/qmk_firmware/pull/11646))
|
||||
|
||||
Final pass on all configs, now that the defaults have correctly been set.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
acheron/arctic - 2aedbe9103fff6c37e596c33c9ed337957647368
|
||||
acheron/austin - c2f4e3b7fc9f1c3d64f47d139bc58367afeca1b7
|
||||
acheron/keebspcb - 1ba976e409732bfa5c0487dd33e20bec06852ce4
|
||||
acheron/lasgweloth - 01a2e70d0d86de0ff05d0b898a6e3b4428ee1581
|
||||
aeboards/ext65/rev2 - 3c9a45cafb4ed6d9672aaff4548b105193633a87
|
||||
ai03/vega - 1bd0dfccb99baa69bacd2d55f2bfa72019b8bf80
|
||||
akegata_denki/device_one - a013823188660f5fca37c5763f160f8646aed7a7
|
||||
at_at/660m - 9999583e8bec2772046132a22818482d24e18c84
|
||||
box75 - 1126206109a942237eea96f3a9608e3c9ed55f8e
|
||||
bt66tech/bt66tech60 - b69120638a8b2c86c008fd0592be918383d8a454
|
||||
cannonkeys/an_c - c755f6caaccbe2b30d95661a3d441b836534c29f
|
||||
cannonkeys/atlas - 1a18c55492a834b82715516ea4cd4d3d94508743
|
||||
cannonkeys/chimera65 - 6bf226ef353da9106c381a8ac95a9b90529327e5
|
||||
cannonkeys/db60 - 07e3246f8e3adc5b6918809e6a5aa1ad064b9a09
|
||||
cannonkeys/devastatingtkl - 907d258e29eb7e35b1f868c1ea6148bfd1e3a3f2
|
||||
cannonkeys/instant60 - ac876ff6746b08839a3936dd4126b52683b763f4
|
||||
cannonkeys/instant65 - 3b8c89ec5fecbdb35cccb00c45e64a798528dbda
|
||||
cannonkeys/iron165 - 0814ec4067d9857b0134e38384f272cf7172fb03
|
||||
cannonkeys/obliterated75 - 0f376e5d9a232c62e9c60f8fdc81d12732352ddc
|
||||
cannonkeys/onyx - d35134ebe09046b91ab176035d3742d80b23ed8e
|
||||
cannonkeys/ortho48 - 828dbfbb013ff4fefe75044b3c9fd31fec5e95a1
|
||||
cannonkeys/ortho60 - 2aca4dd4234e0dac828f5fa15ae5b3bc3c0605dc
|
||||
cannonkeys/ortho75 - 4af8aaaded0ff53e9c01473f5968cc169f268647
|
||||
cannonkeys/practice60 - e01df551d9483eeb3f825fcc453317fe65f674b5
|
||||
cannonkeys/practice65 - 156163789d4c96cdd4787895788c1d02a2367f5c
|
||||
cannonkeys/rekt1800 - 15882afb6373dea3e5f7ed13c19744ee2463f3bf
|
||||
cannonkeys/sagittarius - f49fee611ffcc02cb3dc7f249fc8c83f136907b9
|
||||
cannonkeys/satisfaction75 - 2c9fbbea3a38820774f6ff436ef51017b545475a
|
||||
cannonkeys/savage65 - ddd764be363c46f3e9b1a16151bd02d8f66b2dd4
|
||||
cannonkeys/tmov2 - 7af36cd2a42015838b77697624e90008ffa72778
|
||||
cannonkeys/tsukuyomi - a120bea5dacb2cd6f143458cece46d2860ea196d
|
||||
cheshire/curiosity - 93d8fe3b7a8e028d4b015941ee71b50afe86bc8a
|
||||
coarse/cordillera - 7d986d3f534786f302cbf74a5e6b7e51ffe60093
|
||||
converter/siemens_tastatur - 3f79f1467bbc56f284aceafd76ab5c6a1cbb68f4
|
||||
cutie_club/borsdorf - f8c6015b7aacfd5edef4f22f719eea30660005e7
|
||||
dekunukem/duckypad - d9c162d0867d3925cca2e653a3a3870eac2d23d2
|
||||
ebastler/isometria_75/rev1 - 2ecdd00b8c6cc794a7014747185b88374d5766c0
|
||||
ergodox_infinity - 76736c701db22e890764481c25bd38badf32a1cf
|
||||
ergodox_stm32 - a7bdb0b7822617ca0f9d316a082874ac0fef5964
|
||||
function96 - 1b9e394a86dab24b85d160afe9281b5e7652afe2
|
||||
geekboards/macropad_v2 - de261e46a42cc7b7ff793e26200669f94b1dbb18
|
||||
generic_panda/panda65_01 - 592d2443033875e0309506aa8cb5212389054458
|
||||
handwired/ck4x4 - 9d7d4af7f2d787afd638e976334cd37c490040d7
|
||||
handwired/onekey/blackpill_f401 - c9257a30203b3a0e5aa18b35e07281fcd043ab5d
|
||||
handwired/onekey/blackpill_f411 - dfccc2c6b245cfb561faba60c9f3fc7af8c3db30
|
||||
handwired/onekey/bluepill - 393f4b94e9a0fbc9cd00de1acde346ad72250b4a
|
||||
handwired/onekey/stm32f0_disco - d827881f9bed09fd41c7c4e9d066e96b6643a099
|
||||
handwired/onekey/teensy_32 - dd90f6c823da80ba43afa41249a2bdbbab98b04c
|
||||
handwired/onekey/teensy_lc - 34596f2eeb62403cce532d20cf893ebd77fe2d05
|
||||
handwired/pill60/blackpill_f401 - 20bbccb5058085076357f4fa956eede2c0af86e8
|
||||
handwired/pill60/blackpill_f411 - e03a4c3ec3b9ba65b8067126a039a8eb2cd10e51
|
||||
handwired/pill60/bluepill - 2fb721fb4376cde2067eed1c0c8acbf3bf5851c3
|
||||
handwired/riblee_f401 - 2823cd98d64c91b146dae343a32176d51772952b
|
||||
handwired/riblee_f411 - 5cf7589c9a11c4ed14e7d28676ac836fbb07d013
|
||||
handwired/sono1 - d972acee03efb4917fc42f7d72c0a416b67ebd4a
|
||||
handwired/t111 - f947c1d59025fe04e7d7b999d80e20277be4366c
|
||||
handwired/twadlee/tp69 - 48ab62464ba1f2651f4468cbec7c6058e3b8c158
|
||||
handwired/z150 - 35e85696845e965d7f2dcdb372ed20c17d42c2bb
|
||||
hub20 - f094036a182169b5a73f89f09f2ccaa3e5fc9e7e
|
||||
iron180 - 5efb6f21c848b3c964795d9debddceac7628933d
|
||||
jm60 - dbbdbe8b27b3c1d0a25981b2f75728d163d5d299
|
||||
keebio/bdn9/rev2 - 0031632523dddfc8f7b3a02cf9c5990ebbb3856d
|
||||
keebio/choconum - 4484ef6936a497610ca5ae4d378bc07b2bc1b1c7
|
||||
matrix/m20add - 6068aeff5b14c26de8838180f4397800abe9f1aa
|
||||
matrix/noah - fcde175fb1d3f5bf0716ac5a880c2cc9ab4bbf7f
|
||||
misterknife/knife66 - e7f3ceffb94fb8e680da2af27fa7cb1a0a52b699
|
||||
misterknife/knife66_iso - ee027db939c098f908f70f02ffa9cc3952139f70
|
||||
nebula12 - 2f3a25b6675dcd0fabe75e7bb63038d3cac19610
|
||||
nemui - 4030faa372512f766fd747876cb28176302453f9
|
||||
nibiria/stream15 - fd7b09affa208403099ef9bff1b756fac0d4f918
|
||||
nightingale_studios/hailey - 496a44b2f789cc59a6110c7c1c41d57e59c722be
|
||||
planck/rev6 - 6fb8f0bc21b4ab774ce3d339fdf6f25d96059f10
|
||||
primekb/meridian - 8021ed99e8bdf92faab806780186cc924dd59e50
|
||||
projectkb/alice - ad7678d475a14c54f28b62d1c1b15f5b4c4448bc
|
||||
projectkb/signature87 - de61338b0a5c477f39c000df8117dd3017c2643d
|
||||
ramonimbao/squishy65 - 2ea1a8b18c39d0e193bbbf5836191874d3aafc53
|
||||
ramonimbao/wete - a80b3b309f06566adcdf20234d81c1d5aa599b00
|
||||
rart/rartlice - c8c80c302428d62bb8b08e3185509a233a94f5f0
|
||||
retro_75 - 7434e266bba43ded8ca1ff75d77faa506473ca91
|
||||
rocketboard_16 - 1182a8730a84b58eba5a470286b6db6134d36f54
|
||||
satt/vision - c85a28a8d7e321511a17a7e7084d0a7876d1779a
|
||||
technika - 7c59de348f0ec5f6ac9e260806a87aaf16fbafa2
|
||||
tkc/godspeed75 - e447b39dca393736fbf289049699d5b4748bb8c6
|
||||
tkw/stoutgat/v2/f411 - 58e9b909379ad107affbff0508e3923264b75426
|
||||
viktus/styrka - 36bf0921be79a8b037fdc25343584574a312be60
|
||||
westfoxtrot/prophet - 80036c8f986c8d3261d6b0748d2057eccab6430b
|
||||
whitefox - c9eccac0196c3e2e2ea6c90d3036283a3eabff2c
|
||||
wolfmarkclub/wm1 - 0d22a426255b829a7805bd6a3ff927198b1e31b4
|
||||
xelus/kangaroo - fdb1ffb66f4841f662e968929f058d4fd403c97e
|
||||
xelus/trinityxttkl - a9641e5b39b7bb38351b9109f0f381837b2e8e79
|
||||
xelus/valor_frl_tkl - 6c3b577852736a68727ec319c30712b3088e65cd
|
||||
xiaomi/mk02 - 4c1406ebfee73551a844ef7ab29fc5788d7e875c
|
||||
zoo/wampus - 930c903e85478e220a235f45593c03512c66bc2a
|
||||
zvecr/split_blackpill - c0e3e1583262e4cb0ebfe2efa6356ed6c5c957ca
|
||||
|
||||
```
|
||||
#### UART driver refactor ([#11637](https://github.com/qmk/qmk_firmware/pull/11637))
|
||||
|
||||
Moves the existing `uart.[ch]` driver to `drivers/`, and adds a ChibiOS counterpart (which may need some QA from someone more versed in the ARM side of things).
|
||||
|
||||
It would also be good to get some `puts()` and `gets()` implementations added, if possible. And I'm not really sure what to do with `uart_available()` on ARM.
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### Enforce memory allocator for ChibiOS builds with allocating debounce algorithms ([#11630](https://github.com/qmk/qmk_firmware/pull/11630))
|
||||
|
||||
Using one of the alternate debounce algorithms requires a memory allocator.
|
||||
ChibiOS allows you to disable said memory allocator.
|
||||
|
||||
This puts some compile-time checks to enforce that the allocator has been enabled -- during testing with it set to FALSE, the keyboard would run and function correctly from a visible standpoint, but no keypresses would register. The fun part was, if the slave side had a firmware that had an allocator enabled, the master would still report keypresses on the slave, but not itself!
|
||||
#### Fix up comments showing how to execute config migration ([#11621](https://github.com/qmk/qmk_firmware/pull/11621))
|
||||
|
||||
Looks like an older version of the migration command had a different name. Fixes up the comments as well as the generator to ensure consistency.
|
||||
#### ChibiOS enable memory allocations ([#11620](https://github.com/qmk/qmk_firmware/pull/11620))
|
||||
|
||||
ChibiOS config consolidation inadvertently disabled memory allocations, so any malloc calls (such as for debounce algorithms) would fail. Typing would not function!
|
||||
#### ChibiOS conf migrations... take 10 ([#11617](https://github.com/qmk/qmk_firmware/pull/11617))
|
||||
|
||||
Config migrations and custom board removals for the last batch of boards left outstanding in the repository.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
akegata_denki/device_one - 0d9f891416decbbb533c6c1147632ef7c55a2d9f
|
||||
chavdai40/rev1 - 06bca6ec34948c8005e73254299488cdba3429f8
|
||||
chavdai40/rev2 - f55650a8d7aa755eb72564e95a144910dd902a73
|
||||
ergodox_stm32 - 04433b80e4cd231c15163ace77428db72b5483ad
|
||||
jm60 - a127e6cfccad74ed1a9e47e9213dc41cf0d26f1d
|
||||
matrix/m20add - e2e556dad666ed9b1eea09e46d0eb14e19bda8b8
|
||||
matrix/noah - c6fd3caf0b7d444085283d4f0a9204ab283d5202
|
||||
```
|
||||
#### Leftover early initialisation conversions ([#11615](https://github.com/qmk/qmk_firmware/pull/11615))
|
||||
|
||||
This brings the last batch of stragglers over to use the early initialisation code.
|
||||
#### Switch to nano specs on ChibiOS builds - Round 2 ([#11607](https://github.com/qmk/qmk_firmware/pull/11607))
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
With #11573, this could be worth another try... maybe (#9044 for the previous iteration).
|
||||
#### Fixup builds on develop branch. ([#11600](https://github.com/qmk/qmk_firmware/pull/11600))
|
||||
|
||||
Fixes failing builds on develop after the change to the default set of enabled ChibiOS peripherals.
|
||||
#### ChibiOS conf migrations... take 9 ([#11598](https://github.com/qmk/qmk_firmware/pull/11598))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
This batch includes the list of boards which still contain their own board definitions.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
akegata_denki/device_one - 0d9f891416decbbb533c6c1147632ef7c55a2d9f
|
||||
ergodox_stm32 - 72aeab1612ef73555a73dd60d005e671a90d7e2f
|
||||
jm60 - cc75e97727fadd939be4bdf7fa3714320465d3ef
|
||||
matrix/m20add - b0dee0b4e8c0a94d55fea51c8699972f15483209
|
||||
matrix/noah - 57a1c09cd24716863ce862e0b9cbca2a9c6fcebf
|
||||
nibiria/stream15 - 610b151b02f5cac681c65fbd3f94a12312f99b82
|
||||
xiaomi/mk02 - f92fcee777acc159c0af268e88b751fd1e33f74f
|
||||
```
|
||||
#### Keep track of encoder activity ([#11595](https://github.com/qmk/qmk_firmware/pull/11595))
|
||||
|
||||
Addition to the "last matrix activity" PR, this time around it keeps track of encoder activity too.
|
||||
|
||||
Adds four new APIs:
|
||||
```c
|
||||
uint32_t last_input_activity_time(void); // Timestamp of the last matrix or encoder activity
|
||||
uint32_t last_input_activity_elapsed(void); // Number of milliseconds since the last matrix or encoder activity
|
||||
|
||||
uint32_t last_encoder_activity_time(void); // Timestamp of the last encoder activity
|
||||
uint32_t last_encoder_activity_elapsed(void); // Number of milliseconds since the last encoder activity
|
||||
```
|
||||
|
||||
Tested on the Djinn rev1.
|
||||
#### `qmk cformat` ([#11594](https://github.com/qmk/qmk_firmware/pull/11594))
|
||||
|
||||
Execution of `qmk cformat` against `develop`.
|
||||
#### ChibiOS conf migrations... take 8 ([#11588](https://github.com/qmk/qmk_firmware/pull/11588))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
hub20 - 089b49b233c4e9b8ab643c6b338c91f5c3136e32
|
||||
```
|
||||
#### Fix user keymaps that aren't compiling ([#11584](https://github.com/qmk/qmk_firmware/pull/11584))
|
||||
|
||||
A number of user keymaps don't compile. I've been compiling `all:all` a lot lately so having these cleaned up will help me a lot.
|
||||
#### Remove QMK_KEYBOARD_CONFIG_H ([#11576](https://github.com/qmk/qmk_firmware/pull/11576))
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
Given that all `config.h` files are automatically injected as part of the build process, this PR removes `QMK_KEYBOARD_CONFIG_H` which only functions some of the time.
|
||||
#### Adds AT90USB162 support ([#11570](https://github.com/qmk/qmk_firmware/pull/11570))
|
||||
|
||||
Adds support for the AT90USB162.
|
||||
|
||||
After my previous PR failure I hope this one is smoother. I've ran `make all:default` and there are failures with some boards but they appear to happen on develop as well. I've compiled and flashed AT90USB162, ATmega32u4 and STM32F401 boards using this branch.
|
||||
|
||||
I've added preliminary support into spi_master, uart and serial but I've not tested these features but the registers, bits and pins line up with the datasheet. I've been able to test the changes to backlight_avr on a couple of accessible pins with hardware pwm. I'm a little unsure about the edit I've made to the max eeprom address in dynamic_keymap.c as it doesn't make an exception for the 16u2?
|
||||
|
||||
The MCU has no ADCs or support for I2C. I found a [datasheet](http://ww1.microchip.com/downloads/en/AppNotes/doc8224.pdf) while creating a the first pull request stating the ATmega16u2 is functional equivalent to the AT90USB162 which lines up with the edits I've made.
|
||||
|
||||
I'm expecting to have missed something but hopefully not too much.
|
||||
|
||||
Edit:
|
||||
For context this is to port existing hardware to QMK, I appreciate there's not likely going to be much call for this MCU. Any who thanks for your help and time.
|
||||
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### Keep track of last matrix activity ([#11552](https://github.com/qmk/qmk_firmware/pull/11552))
|
||||
|
||||
Re-submission of #10730 -- there was a logic issue that only seemed to manifest on some AVR builds.
|
||||
@daskygit has graciously performed the investigation on their end, as I was unable to reproduce.
|
||||
|
||||
This PR adds support for recording the last time matrix activity was detected.
|
||||
Two new APIs have been added:
|
||||
```c
|
||||
uint32_t last_matrix_activity_time(void); // Timestamp of the last matrix activity
|
||||
uint32_t last_matrix_activity_elapsed(void); // Number of milliseconds since the last matrix activity
|
||||
```
|
||||
|
||||
These values are compatible with normal matrix scanning, as well as split_common.
|
||||
#### Remove duplicate manufacturer definitions ([#11544](https://github.com/qmk/qmk_firmware/pull/11544))
|
||||
|
||||
Now that the integration between info.json and config.h is tighter we should define these variables in only one place. I chose to leave this in `config.h` under the principle of least surprise.
|
||||
#### Process info.json rules ahead of userspace rules ([#11542](https://github.com/qmk/qmk_firmware/pull/11542))
|
||||
|
||||
Fixes the import order so that keyboard-level vars don't overwrite userspace.
|
||||
#### ChibiOS conf migrations... take 7 ([#11529](https://github.com/qmk/qmk_firmware/pull/11529))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
alpine65 - 91e88b87653234a9023f4ad98913a6ea52c8b3fb
|
||||
cannonkeys/onyx - 2adf507afd4e288761a675de9cfbb6e34c540e29
|
||||
ck60i - 98be5d22a3cd1b38d92e080f32c4795260db181b
|
||||
cutie_club/borsdorf - 81734ebf770ab731ca8dcfac6fce5574e948890e
|
||||
```
|
||||
#### Allow post_config.h to be implemented in userspace ([#11519](https://github.com/qmk/qmk_firmware/pull/11519))
|
||||
|
||||
Allow `post_config.h` to be defined in userspace directories.
|
||||
|
||||
At present, we pay attention to it in keyboard and keymap directories, but not in the userspace.
|
||||
#### ChibiOS conf migrations... take 6 ([#11504](https://github.com/qmk/qmk_firmware/pull/11504))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
cannonkeys/sagittarius - 953626d1b87574290016ed09caaf5e3fa7b73189
|
||||
evolv - c2f56a35ef1d11b002f9306ed2814ac0447e68c4
|
||||
```
|
||||
#### Document how to add data driven configurations ([#11502](https://github.com/qmk/qmk_firmware/pull/11502))
|
||||
|
||||
This describes how to add configuration values to info.json so they work in the build system as well.
|
||||
#### ChibiOS 20.3.2 ([#11495](https://github.com/qmk/qmk_firmware/pull/11495))
|
||||
|
||||
The long-awaited upgrade to ChibiOS 20.3.2.
|
||||
|
||||
```
|
||||
-------------------------------
|
||||
Successful builds: 121
|
||||
Warning builds: 21
|
||||
Failing builds: 0
|
||||
-------------------------------
|
||||
```
|
||||
#### Add support for specifying BOARD in info.json ([#11492](https://github.com/qmk/qmk_firmware/pull/11492))
|
||||
|
||||
`BOARD` was added while I was working on my data driven qmk project. This adds support for specifying it in info.json like everything else.
|
||||
#### Another round of develop fixing ([#11473](https://github.com/qmk/qmk_firmware/pull/11473))
|
||||
|
||||
Somehow these things broke even though my last PR was compiling clean.
|
||||
#### Disable ChibiOS subsystems repo-wide. ([#11449](https://github.com/qmk/qmk_firmware/pull/11449))
|
||||
|
||||
Disables a bunch of unused ChibiOS subsystems across the repository.
|
||||
File checksums do change, as things like condvars aren't being imported into the build any more.
|
||||
#### Fix compiling squiggle/rev1 ([#11448](https://github.com/qmk/qmk_firmware/pull/11448))
|
||||
|
||||
The structure for squiggle/rev1 was incorrect and needed to be fixed.
|
||||
#### Fix compiling treadstone32/rev1 ([#11447](https://github.com/qmk/qmk_firmware/pull/11447))
|
||||
|
||||
The structure for treadstone32/rev1 was incorrect and needed to be fixed.
|
||||
#### Fix up build dependencies. ([#11435](https://github.com/qmk/qmk_firmware/pull/11435))
|
||||
|
||||
Fixes up build dependencies so that the generated files are correctly made available previous to compiling any object files.
|
||||
#### Fix broken keyboards on develop ([#11427](https://github.com/qmk/qmk_firmware/pull/11427))
|
||||
|
||||
A few keyboards were broken by my info.json work.
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### Split up QWIIC makefile variables to have _ENABLE and _DRIVERS ([#11426](https://github.com/qmk/qmk_firmware/pull/11426))
|
||||
|
||||
As per the description, this splits up `QWIIC_ENABLE=<drivers>` to both `QWIIC_ENABLE=yes/no` and `QWIIC_DRIVERS=<drivers>`.
|
||||
This is broken on `develop` since the addition of `qmk generate-rules-mk`.
|
||||
#### AVR weak bootloader_jump ([#11418](https://github.com/qmk/qmk_firmware/pull/11418))
|
||||
|
||||
Allows for a custom implementation of bootloader_jump() for non-standard bootloaders on AVR.
|
||||
|
||||
This allows for a cleaner override compared to catching RESET in process_record_* and implementing bootmagic_lite().
|
||||
<!--- Describe your changes in detail here. -->
|
||||
#### Remove handwired/bluepill. ([#11415](https://github.com/qmk/qmk_firmware/pull/11415))
|
||||
|
||||
As discussed, remove legacy code.
|
||||
#### ChibiOS conf migrations... take 5 ([#11414](https://github.com/qmk/qmk_firmware/pull/11414))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
handwired/sono1 - cca23170d69383fd0fc4b21bdfacb32ee57e1305
|
||||
```
|
||||
#### ChibiOS conf migrations... take 4 ([#11413](https://github.com/qmk/qmk_firmware/pull/11413))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
cannonkeys/tsukuyomi - 7beddc74b03d652481198843a178177de5da3ddb
|
||||
misterknife/knife66_iso - f2dd6e6c54258ae9d09a88215b36fba34947fc23
|
||||
mode/eighty/m80h - 4bbbee01a89a5b4ab5f4de36e0dd2044cf54a698
|
||||
mode/eighty/m80s - 6de4a1affab4ed8f08423eb511393ed797e3ea77
|
||||
```
|
||||
#### Fix broken keyboards ([#11412](https://github.com/qmk/qmk_firmware/pull/11412))
|
||||
|
||||
My recent PR broke a few keyboards, this addresses the breakage.
|
||||
#### Fix compiling on develop ([#11409](https://github.com/qmk/qmk_firmware/pull/11409))
|
||||
|
||||
A merging error led to uncompilable keyboards.
|
||||
#### Refine twinkle to be smoother (use breathing curve) ([#11350](https://github.com/qmk/qmk_firmware/pull/11350))
|
||||
|
||||
This pull request updates the RGB Lighting "Twinkle" effect to be smoother, similar to the "Breathing" effect. To do this, the Twinkle code has been updated to use the same table that the Breathing uses (but "stretched" mathematically), and the default cycle intervals & twinkle life have been adjusted. There are also some changes to make the effect look nicer when lower brightness settings are configured.
|
||||
|
||||
To avoid bloat, I've done some minor refactoring so that Twinkle and Breathe can share some code. There is no significant impact on either firmware size, or on matrix scan rate. Nevertheless, since this is change to an effect that folks may have customized, I am targeting the develop branch.
|
||||
#### Improved Language Specific Keycodes for US International and Extended Layouts ([#11307](https://github.com/qmk/qmk_firmware/pull/11307))
|
||||
|
||||
This pull request improves a corner of the Language Specific Keycodes:
|
||||
|
||||
- Improvement for the **US International** keyboard layout [aka _`xkb:us:intl:eng` - English (US, international with dead keys)_]
|
||||
- Support for more symbols added
|
||||
- Fixed some confusion between dead-key accents and standalone counterparts (`US_DGRV` vs. `US_GRV`, `US_DTIL` vs. `US_TILD`, etc.)
|
||||
- Adds `sendstring_us_international.h` that will (if included) make `send_char()` / `send_string()` work correctly when the host is configured for this keyboard
|
||||
- Adds support for **US Extended** keyboard layout [aka _`xkb:us:altgr-intl:eng` - English (international AltGr dead keys)_]
|
||||
- Adds support in `send_char()` / `send_string()` for ASCII characters that can only be entered by typing a dead key followed by a space.
|
||||
|
||||
I've targeted this at the `develop` branch, because:
|
||||
- The change to `send_char()` increases firmware size slightly (by about 62 bytes) for all keyboards.
|
||||
- The changes in `keymap_us_international.h` make it more correct, but may break keymaps that depend on it (although I note, there doesn't seem to be anything in the `qmk/qmk_firmware` tree that uses it at present).
|
||||
#### ChibiOS conf migrations... take 3 ([#11261](https://github.com/qmk/qmk_firmware/pull/11261))
|
||||
|
||||
Config migrations for the newest batch of boards merged from `master` into `develop`.
|
||||
|
||||
sha1sums all match.
|
||||
|
||||
```
|
||||
acheron/lasgweloth - 3bedb0fe1f1b542b4d90daeaeab8905cd9ee992c
|
||||
box75 - ff91bacf5cec0b42df02967eb0ecbf4bd1b56928
|
||||
geekboards/macropad_v2 - 1c205720d47f7e636173064b1aef1637860a9134
|
||||
iron180 - 867929d78361a50e34671e4e167cafd927d8982b
|
||||
technika - cb9295b90980eb8dfdc63d6031533edbb344c045
|
||||
```
|
||||
#### Fix duplicate I2C_KEYMAP_START define ([#11237](https://github.com/qmk/qmk_firmware/pull/11237))
|
||||
|
||||
And moved the sync timer define to match its placement in the struct.
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### Update ADB impelemtation in TMK Core ([#11168](https://github.com/qmk/qmk_firmware/pull/11168))
|
||||
|
||||
The ADB protocol implementation enables the ADB-USB converter in QMK. However it was ported from TMK some time ago and not updated since then. This is what this PR does. The updated and more complete ADB implementation is needed in order to enable some features on older Apple keyborads:
|
||||
|
||||
- automatic detection of ISO keyboards and swapping key codes accordingly [see](https://github.com/tmk/tmk_keyboard/issues/35)
|
||||
- enable right modifier keys on AEK keyboards [see](https://geekhack.org/index.php?topic=14290.msg736664#msg736664) and [this](https://deskthority.net/viewtopic.php?t=254)
|
||||
|
||||
I tested the changes with an Arduino Pro Micro and my AEK II and M0116 keyboards, both in ISO layout. Some testing with the ANSI versions might be needed. Also, I could not test how JIS versions of the keyboards are affected by these changes. I assume not at all, as they do not swap key codes.
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### Remove unused `action_get_macro()` usages in user keymaps & layouts ([#11165](https://github.com/qmk/qmk_firmware/pull/11165))
|
||||
|
||||
This is all the `action_get_macro()` functions that either define no macro handlers, or do but which are not referenced anywhere in the keymap as `M()` keycodes or in `fn_actions`. There are still a ton of keymaps to be converted over to `process_record_user()`.
|
||||
|
||||
Also removes "the old way" macro documentation.
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### [Keyboard] Add Pix ([#11154](https://github.com/qmk/qmk_firmware/pull/11154))
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
Add Pix keyboard, a single row macropad with Encoder and OLED Screen, can be mounted under your monitor
|
||||
|
||||

|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### ChibiOS conf migration: dekunukem/duckypad ([#11123](https://github.com/qmk/qmk_firmware/pull/11123))
|
||||
|
||||
Same as other conf migrations, sha1sum matches: `0014c2a10913fad7b71f5fc8a0d6adb6b3c4b128`
|
||||
|
||||
```sh
|
||||
make -j$(nproc) dekunukem/duckypad:default COMMAND_ENABLE=no SKIP_VERSION=yes SKIP_GIT=yes
|
||||
```
|
||||
#### Disable almost all ChibiOS subsystems in default configs ([#11111](https://github.com/qmk/qmk_firmware/pull/11111))
|
||||
|
||||
Disables most ChibiOS subsystems, or using ChibiOS-supplied default values where appropriate.
|
||||
No config migration has occurred yet, so nothing is using these files.... yet.
|
||||
|
||||
Also moves out the configuration files from the F4x1 blackpills, such that they're actually part of the keyboards in question.
|
||||
|
||||
All F4's built, compared against develop, using sha1sum to validate binary reproducibility:
|
||||
```
|
||||
handwired/onekey/blackpill_f401:default - 8387bfd56888fc1605d293dc0071b4ec94b23991
|
||||
handwired/onekey/blackpill_f411:default - 855efdb2f60c384edf64773c0f4ff4b7ea8ae4c9
|
||||
handwired/pill60/blackpill_f401:default - 5b652354ae957e86e211dcef29f8f27320b31180
|
||||
handwired/pill60/blackpill_f411:default - 580255c171e95b5bca53b14a13ae018a73d18414
|
||||
handwired/riblee_f401:default - dc68c31d7ca8ae0fad7e7ad8bdd63406155ff363
|
||||
handwired/riblee_f411:default - cf0fadff4c98d41cf9bdddbe1ead15c79be941b9
|
||||
matrix/m20add:default - 2bad5fc486e640a97d7197d03caf8762d36dc1b0
|
||||
matrix/noah:default - e52979ce61a24594346cd7031ffd3f788ab423e7
|
||||
phoenix:default - 21bfb14c52451899dadf545b78a8e88b22a420f0
|
||||
tkw/stoutgat/v2/f411:default - b094651ec61c79099de3e6e4991319816ac464c1
|
||||
zvecr/zv48/f401:default - 8b1766a24f943b9b0ba756c6fe340ba69d5e14e3
|
||||
zvecr/zv48/f411:default - 09ba645092eb7f3d41da0d5e6727f2f4f97033c0
|
||||
```
|
||||
|
||||
Running `make all-chibios:default`:
|
||||
```
|
||||
-------------------------------
|
||||
Successful builds: 147
|
||||
Skipped builds: 1110
|
||||
Warning builds: 9
|
||||
Failing builds: 0
|
||||
-------------------------------
|
||||
```
|
||||
#### Use the schema to eliminate custom code ([#11108](https://github.com/qmk/qmk_firmware/pull/11108))
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
#### Validate our JSON data using json_schema ([#11101](https://github.com/qmk/qmk_firmware/pull/11101))
|
||||
|
||||
This builds on #10817, and should be merged after that one.
|
||||
#### Sync Timer feature ([#10997](https://github.com/qmk/qmk_firmware/pull/10997))
|
||||
|
||||
Added a sync_timer set of apis that will keep their value in sync across split common keyboards. This helps keeps led animation effects in sync when run in split modes (RGBLIGHT_SPLIT or the upcoming RGB_MATRIX_SPLIT). This PR is targeting the development branch as this is a change to the Transport code which will require users to flash both master and slave halves.
|
||||
|
||||
~~Spent quite a bit of time poking at RGBLIGHT fixing the hitching of the previous attempts at a sync timer. Solved all the hitching, but it still does not stay in sync as well as I would like (when RGBLIGHT_SPLIT_NO_ANIMATION_SYNC is defined) due to how animation ticks are handled in RGBLIGHT. So while it's using the sync timer, it's not any better than what it was before. Additionally an option to disable the sync timer and fall back to normal timer is possible using the #define DISABLE_SYNC_TIMER~~
|
||||
|
||||
All hitching for RGBLIGHT with sync_timer has been fixed. Additionally RGBLIGHT now stays in sync with RGBLIGHT_SPLIT_NO_ANIMATION_SYNC defined Only remaining issue: boot / startup time hitching causes the animations to start out of sync. So there needs to be an initial sync event to get them lined up. RGBLIGHT_SPLIT_NO_ANIMATION_SYNC not defined still fixes this.
|
||||
|
||||
Note: In testing, this was used in conjunction with https://github.com/qmk/qmk_firmware/pull/10996
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### Configuration minimisation (phase 1) ([#10976](https://github.com/qmk/qmk_firmware/pull/10976))
|
||||
|
||||
ChibiOS configuration files are used in order to enable or disable access to certain subsystems in order to provide support for things such as audio or I2C/SPI -- as per standard Proton-C. In the past, Proton-C has provided a "config-less" setup, which provided these configuration files and turned on all the required subsystems in order to support them.
|
||||
|
||||
These configuration files were moved to a common area, and effectively enable subsystems like SPI, PWM or DAC, regardless of whether they're targeting F303, with or without a Proton-C.
|
||||
|
||||
This PR modifies the way F303's are built, allowing for a build target of a board called `QMK_PROTON_C` -- this contains the usual fully-fledged configurations, and disables the majority of the subsystems on the `GENERIC_STM32_F303XC` board.
|
||||
|
||||
All F303-targeting keyboards have been migrated across to the `QMK_PROTON_C` board in this PR, specifically to validate that SHA-1 checksums match what's currently on the `develop` branch:
|
||||
```
|
||||
1upkeyboards/sweet16/v2/proton_c:default - 8c01a546f9101a1306fedc501f375ba167364572
|
||||
acheron/shark:default - ee3d9ab5285a62d6764db984f5fce29a072823cc
|
||||
atreus:ridingqwerty - 2a32c64e54f743aea3d2662526213ca1224a2d16
|
||||
boston_meetup/2019:default - d17230c17f6f3b791272d01825b78a6e531f0450
|
||||
c39:drashna - b75040aa31fdb4ae663973c6d2d1194ddf5addb4
|
||||
ckeys/thedora:default - e62922bc5dac220d4287070859140f97b831def2
|
||||
clueboard/60:default - bb5057d4a2976b6530fe2e345a4153de2f7c042d
|
||||
clueboard/66/rev4:default - 878e38a34f97b32d9d109a6d98f98bc385d84864
|
||||
clueboard/66_hotswap/gen1:default - 03fe10f4de7b67e5f1cf0a7d576f82676adf4261
|
||||
clueboard/california:default - b10e51183dd1f5891faeef3e44ec325cb4e194fa
|
||||
dztech/dz60rgb/v1:default - eade21047afb40d903e548c38ab4671d956282c2
|
||||
dztech/dz60rgb_ansi/v1:default - 61e275467ce256a1f5d2a719aad642c6c7b3a6b2
|
||||
dztech/dz60rgb_wkl/v1:default - 6858c2c8fa322d23932402ca761e9c37ff3dedc0
|
||||
dztech/dz65rgb/v1:default - d7543c7be51c9932624b455fd71d3a1e45537469
|
||||
hadron/ver3:default - 632af7727b767720c699abdff770edc9682928ee
|
||||
handwired/co60/rev6:default - be1688eeabd83a7f576d9e4e23e24d56b8dc251b
|
||||
handwired/co60/rev7:default - d196c5772859ddee695bda5b0e9f0944a0f350f8
|
||||
handwired/d48:default - 24c4e7fee59ceed78400091e3134239ad5b8c662
|
||||
handwired/ddg_56:default - c65d1eeb891795edc889e7e84dce5fe098471dc4
|
||||
handwired/floorboard:default - 8b007072e49f461fdcd818b7f95a4da0c6c053b4
|
||||
handwired/onekey/proton_c:default - 076611ec2a181ab20e6f418b1e72240b625e366a
|
||||
handwired/onekey/pytest:default - d12db66a81cd0d4afb96e026f8b2a95ca77ee176
|
||||
handwired/selene:default - fdba0edd6ce2526adf1a7ae9eb3b07fd20f6076f
|
||||
handwired/sick_pad:default - 3cf8b00dd8bfb0c26ba601d58d5fce28298f912e
|
||||
handwired/steamvan/rev1:default - 743b395ac87b918b6be4614c9e120e80a9f049d4
|
||||
handwired/wulkan:default - 629359dae610138096e09daaba3556209b4107ef
|
||||
hs60/v2/ansi:default - 7bcd152c269803de8f96416ba26e939c0420ceae
|
||||
hs60/v2/hhkb:default - d77f393d2811bd104b05c4530bf1083d75856b7a
|
||||
hs60/v2/iso:default - 5d3d20de919fca3b64cb7548cad46e8d35d7cc04
|
||||
kbdfans/kbd67/mkiirgb/v1:default - 15877ecb90c9c7ed2823bf4637c69edd2a8bc45b
|
||||
keebio/bdn9:codecoffeecode - 2b2844e60da163b5dc0d190c7aa8e98218890833
|
||||
keebwerk/mega/ansi:default - 10e32718c7bfff2f6bd8dd2159a15bef0f4acbf9
|
||||
kingly_keys/little_foot:yanfali - 87383c1296f6d16178864cee67c11292ea60ddde
|
||||
kv/revt:default - 2d806f2cb95a26e35238fcc1541f63896ebdfdd0
|
||||
mechlovin/adelais:default - 9de468d5836cda082918498cf644a872c249bc29
|
||||
mechlovin/hannah60rgb:default - 22119e8e0cbbe0340b4ebe7d860a83efbc9d6c0d
|
||||
mechlovin/hannah65:default - 0a209d9c018b7c33e14bca26ad1f99c363e67118
|
||||
mechlovin/infinity87:default - 9c7a2eea08a9b6dd9f9dc888ee04a53f15b60e0a
|
||||
mechlovin/infinity88:default - 79677fed5264a45e776ce23467e0258cd161f6d5
|
||||
melgeek/mj61/rev1:default - 4b4e15a164bb215c7de163248fdbd15ca3939121
|
||||
melgeek/mj63/rev1:default - a59aaf5d6bd260299878547489a6ab8888d4758e
|
||||
melgeek/mj64/rev1:default - 765287938c4bc0774b62795717f600ccc6bd058b
|
||||
melgeek/mj64/rev2:default - d8603e5406d25f6ff51f0ed003765626189af56c
|
||||
melgeek/mojo75/rev1:default - 7aed878a64d5cc39d9a09aa5d42178391d9e2c1d
|
||||
melgeek/z70ultra/rev1:default - f93c1bcfb4f7732f40bac8f9917ee43db99bea70
|
||||
montsinger/rebound/rev1:curry - 7540ac725e2de6b155b9961a73aab5e949263c53
|
||||
moonlander:default - d33b143f995aaf9751e9403ef99d6134940e15b8
|
||||
nack:default - ba7f421d5670e672c5c14fd5f80c0f86447c1468
|
||||
nebula68:default - 6bed6afb2fd84ef9069b757f1d1e87fc1cbe290c
|
||||
nk65:default - 75b2484741a96dcbff14e94c44443bb33ad73dce
|
||||
nk87:default - f719a739a3d2c0969c79c1ace5fe9a7d6f05cc22
|
||||
default - 9338d2fb97d6005b53a93d0c43453b535a4255c1
|
||||
planck/rev6:default - cb19e7f473183e040406c710b7bf797356d6dec3
|
||||
preonic/rev3:default - 5a2bce8227691b84107e7757a1ccee03e56577fb
|
||||
rgbkb/pan/rev1/proton_c:default - 2724e0d7c7e9b7a77bb58bc33516f462c4e75182
|
||||
yugo_m/model_m_101:default - c338c93888cd50aa69453e0bd2b4394f1c09ffc8
|
||||
rgbkb/zen/rev1:default (CTPC=yes) - edbf80fc4f3680fa55cefc410c01c2ba360676d1
|
||||
rgbkb/zen/rev2:default (CTPC=yes) - e2aea7fd02e5d36d1c7aa58006b3442363b7a005
|
||||
```
|
||||
#### Added rev2 & move rev1+rev2 to parent folder ([#10973](https://github.com/qmk/qmk_firmware/pull/10973))
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
Aplx6 has a new rev and a new pcb with encoder & oled display support.
|
||||
Made a parent folder named aplx, renamed aplx6 to rev and added rev2 folder and files.
|
||||
Edited old rev1 readme.md to correct the make: example.
|
||||
Sorry for any bad coding in advance :P
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
*
|
||||
#### Rewrite APA102 support ([#10894](https://github.com/qmk/qmk_firmware/pull/10894))
|
||||
|
||||
The APA102 source was broken by commit 16a15c1cfcbfd0feb2c2cf1383676747e2f97d73 as it did not include the quantum header. This PR addresses that, as well as other issues with transferring bytes over the SPI interface, i.e. it was not setting the clock pin back to low after sending a bit.
|
||||
|
||||
The deviation when sending the end frame is kept, but updated to the latest from the referenced project.
|
||||
|
||||
Additionally, these changes expose the global LED brightness parameter of the APA102. Brightness values are configurable through `APA102_DEFAULT_BRIGHTNESS` and `APA102_MAX_BRIGHTNESS`.
|
||||
|
||||
Question: Since it is using the QMK macros, does this still belong in under `drivers/avr`?
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
* #10026
|
||||
#### Configure keyboard matrix from info.json ([#10817](https://github.com/qmk/qmk_firmware/pull/10817))
|
||||
|
||||
This PR will generate `#define`'s based on information found in info.json. This is a big step towards making QMK easier to work with for non-programmers, and making it easier for collaborators to maintain a large number of keyboards using automated tooling.
|
||||
#### Add support for 8 buttons to mouse report ([#10807](https://github.com/qmk/qmk_firmware/pull/10807))
|
||||
|
||||
|
||||
#### Keep track of last matrix activity ([#10730](https://github.com/qmk/qmk_firmware/pull/10730))
|
||||
|
||||
This PR adds support for recording the last time matrix activity was detected.
|
||||
Two new APIs have been added:
|
||||
```c
|
||||
uint32_t last_matrix_activity_time(void); // Timestamp of the last matrix activity
|
||||
uint32_t last_matrix_activity_elapsed(void); // Number of milliseconds since the last matrix activity
|
||||
```
|
||||
|
||||
These values are compatible with normal matrix scanning, as well as split_common.
|
||||
#### Moved s7_elephant and bear65 into 1 folder ([#10528](https://github.com/qmk/qmk_firmware/pull/10528))
|
||||
|
||||
<!--- Describe your changes in detail here. -->
|
||||
The 2 boards are now moved into the folder jacky_studio/
|
||||
I have checked with Jacky, and he is ok with this naming convention
|
||||
#### ChibiOS upgrade: keyboard conf migrations (phase 1) ([#10418](https://github.com/qmk/qmk_firmware/pull/10418))
|
||||
|
||||
Performs the config migrations for ChibiOS-based boards.
|
||||
|
||||
This PR includes the set of keyboards which do not require board changes, or even if the board has changed the resulting binary has a sha1 match before and after the configuration file migration has occurred.
|
||||
|
||||
All builds have been executed with the following command:
|
||||
```sh
|
||||
make -j$(nproc) ${KEYBOARD_BUILD}:default COMMAND_ENABLE=no SKIP_GIT=yes
|
||||
```
|
||||
|
||||
The keyboards listed at the end do require modification, and will result in further PRs to allow for board-specific validation without holding up other merges.
|
||||
|
||||
Listing of boards successfully migrated:
|
||||
```
|
||||
acheron/arctic - 8d3d233f15bf5d396e29abb94f943a89b0b828d1
|
||||
acheron/austin - beabc6204533de80704684de9ff7790895f319e1
|
||||
acheron/keebspcb - e14a96e99aab54aefebc1d3d24d64b0082db7842
|
||||
aeboards/ext65/rev2 - 0b97daef994903585be2768b6aaffc4da97ec617
|
||||
ai03/vega - 7e5f208278309681fd1db8b2629890b813fdf938
|
||||
at_at/660m - e30393b6546454f9939c1187aa9c6539f1ef76c1
|
||||
bt66tech/bt66tech60 - a7f4e8a224132830447d12c92d146997f9b56b7d
|
||||
cannonkeys/an_c - e7320dc09377fdad749e382b3986f2241633214b
|
||||
cannonkeys/atlas - 063a8eaea7e68607b725ad06777c49d34686b433
|
||||
cannonkeys/chimera65 - 01ce66c862a5cd98183b10e992939a55038779bc
|
||||
cannonkeys/db60 - 45636d0b3cf951cef51a5b19678e2da549efd14f
|
||||
cannonkeys/devastatingtkl - 709e0155c421991fad283d38c28f850320ed4730
|
||||
cannonkeys/instant60 - 7e530e10794183d684a328f01b9b0743907440c7
|
||||
cannonkeys/instant65 - c8de288708d0586337cb7137ae54d97e1ddc90a6
|
||||
cannonkeys/iron165 - 3a3c0273e227fd15ab3527e4aa557b94d0b69248
|
||||
cannonkeys/obliterated75 - cdf834802ae77b1bbd4876eb8c34c19a83ad95cd
|
||||
cannonkeys/ortho48 - 3432ff13c83a6358eca44b37f72b18882eeda699
|
||||
cannonkeys/ortho60 - 95be42a23798cc8f9b04175d4892b712d871a52d
|
||||
cannonkeys/ortho75 - e1149893fd01e853124808b45d521b61a7638eb9
|
||||
cannonkeys/practice60 - 6e4da87f0a766cf2665e9b4aa8e3ab33017cf745
|
||||
cannonkeys/practice65 - c436c06829123503073b3a9c5a1c0acfc2dbe2e5
|
||||
cannonkeys/rekt1800 - 43e8e21b62531534afeaa241f4c683fbdb60a8e0
|
||||
cannonkeys/satisfaction75 - 28ff9a8a11ad1de9d09ec85fab2af906b7c27d6a
|
||||
cannonkeys/savage65 - 53eaefae56020b536d4934686506d5d1fe51b6e0
|
||||
cannonkeys/tmov2 - 8b1ced8ff7dc368afa268104cd5192bb1bfc8a1c
|
||||
chavdai40/rev1 - b166af66b084077764b705c9428725cde0b0ce51
|
||||
chavdai40/rev2 - 0048c8ec8c28f1dfa5d1a37348524899595d8325
|
||||
cheshire/curiosity - f1636e53638ce2e798070e6e622fd88a08982d5a
|
||||
clueboard/60 - bb5057d4a2976b6530fe2e345a4153de2f7c042d
|
||||
clueboard/66_hotswap/gen1 - 03fe10f4de7b67e5f1cf0a7d576f82676adf4261
|
||||
clueboard/66/rev4 - 878e38a34f97b32d9d109a6d98f98bc385d84864
|
||||
coarse/cordillera - 5cae5c643e96d03bddcbb73e76e225ea5f82fef3
|
||||
converter/siemens_tastatur - 48f82cd227836878967dfa0fe0411f7d877a124c
|
||||
ergodox_infinity - 8df21d6129eef47d7a5ced92715e5bdbfb0151e5
|
||||
function96 - deecdcdca34c88058f820f0e2bc9f112458c85c5
|
||||
generic_panda/panda65_01 - 8522d8107edcf71758f3be7298c0bc18fa7f6706
|
||||
hadron/ver3 - 632af7727b767720c699abdff770edc9682928ee
|
||||
handwired/ck4x4 - a4cb9b5b8c3a162083677b14b105edbc1bca2baf
|
||||
handwired/co60/rev6 - be1688eeabd83a7f576d9e4e23e24d56b8dc251b
|
||||
handwired/co60/rev7 - d196c5772859ddee695bda5b0e9f0944a0f350f8
|
||||
handwired/onekey/blackpill_f401 - 8387bfd56888fc1605d293dc0071b4ec94b23991
|
||||
handwired/onekey/blackpill_f411 - 855efdb2f60c384edf64773c0f4ff4b7ea8ae4c9
|
||||
handwired/onekey/bluepill - 60d8555b174dbdabae196a4cc5eccfee4bdd9529
|
||||
handwired/onekey/stm32f0_disco - 9bc12e29f5a4e4b9ec0f34987559e5e11de4bb48
|
||||
handwired/onekey/teensy_32 - 17459dd8e71b3a33270037878bdbd04151af196b
|
||||
handwired/onekey/teensy_lc - 3a9aed4681c287176efe31c988340ca43ad27a9d
|
||||
handwired/pill60/blackpill_f401 - 5b652354ae957e86e211dcef29f8f27320b31180
|
||||
handwired/pill60/blackpill_f411 - 580255c171e95b5bca53b14a13ae018a73d18414
|
||||
handwired/pill60/bluepill - 29109b54137ea94ac266c604991cff87516689ff
|
||||
handwired/riblee_f401 - dc68c31d7ca8ae0fad7e7ad8bdd63406155ff363
|
||||
handwired/riblee_f411 - cf0fadff4c98d41cf9bdddbe1ead15c79be941b9
|
||||
handwired/steamvan/rev1 - 743b395ac87b918b6be4614c9e120e80a9f049d4
|
||||
handwired/t111 - 99b61ae5692ee4b2101673d1a896cd7a5831bcfa
|
||||
handwired/twadlee/tp69 - 3ab2753c40e947a726ece6c825493ebc87ecf20e
|
||||
handwired/z150 - 78808b0c8671e2386b9ba65dbd647d613d92f253
|
||||
hs60/v2/ansi - 7bcd152c269803de8f96416ba26e939c0420ceae
|
||||
hs60/v2/hhkb - d77f393d2811bd104b05c4530bf1083d75856b7a
|
||||
hs60/v2/iso - 5d3d20de919fca3b64cb7548cad46e8d35d7cc04
|
||||
infinity60 - dbcbb2f58ee499252b0879d68d9beec08a8433bc
|
||||
k_type - 492f476177da95495442d1e173391e3c17324a70
|
||||
keebio/bdn9/rev2 - 4dbb5d606b3d9060ad01a437978220fe0f1fc5b2
|
||||
keebio/choconum - 1521e634088a30114cd12b7b6bbd2cca5331c822
|
||||
keebwerk/mega/ansi - 10e32718c7bfff2f6bd8dd2159a15bef0f4acbf9
|
||||
misterknife/knife66 - cf2f3d26103036d79bf7fcec204e13899e33fbe3
|
||||
nack - ba7f421d5670e672c5c14fd5f80c0f86447c1468
|
||||
nebula12 - aedb11fa894dc19513462f054a9fa00f5c195adc
|
||||
nebula68 - 6bed6afb2fd84ef9069b757f1d1e87fc1cbe290c
|
||||
nemui - 86ed80ea8565d7d0f39512a9032cc5e1b306fcff
|
||||
nk65 - 75b2484741a96dcbff14e94c44443bb33ad73dce
|
||||
nk87 - f719a739a3d2c0969c79c1ace5fe9a7d6f05cc22
|
||||
peiorisboards/ixora - b5adf1090fb4c6278d8990ce9132727a13ca3cd7
|
||||
phoenix - 21bfb14c52451899dadf545b78a8e88b22a420f0
|
||||
polilla - 3ba5f326b268362c9aba570b1510e1c61009ba96
|
||||
primekb/meridian - df266e25c682a8ed3318faa186805683014ccec4
|
||||
projectkb/alice - eee7210f618588b2c5c6367c8a0318427d09da52
|
||||
projectkb/signature87 - 617430e601981f0bb5fbcce42eee53107d5161b8
|
||||
ramonimbao/squishy65 - 88e4cd3db8db61ccf9daed5405cf5eeb32f8043e
|
||||
ramonimbao/wete - f0e90d943d8749e802b6bba619ce943b568a7f65
|
||||
rart/rartlice - f7a6b58e6cadd4102fcf5f89d054d1fbdc5809d0
|
||||
retro_75 - 34c7b291fb2443bf8cb69fb9ee676190c736bf00
|
||||
rocketboard_16 - 24e6503a7a5259934a80dd96dd37d3281b4240d3
|
||||
satt/vision - c926d6433d8b2dc1d74623184255016bdd36ae22
|
||||
tkc/candybar/lefty - 2f269cbed5dcec61bb0c7904a46436f110dc0ae1
|
||||
tkc/candybar/righty - 9b1448b2ccbcf8a4d1e5ad74d8ad5933003ee9a2
|
||||
tkc/godspeed75 - 2cfed58d44a7eef8f341ff24e0136511e03aa78d
|
||||
tkw/stoutgat/v2/f411 - b094651ec61c79099de3e6e4991319816ac464c1
|
||||
viktus/styrka - f3f678ea55126c9965f24da6fffc9bbbd8b24aa9
|
||||
vinta - e5403dc6bbf47f35a53cf43b1b1d130f05552f16
|
||||
westfoxtrot/prophet - 0e4d6987ffa6430720804e7bc1502ab6c3dcb879
|
||||
whitefox - 5ca6de6fb09d8c2cfa996b65732fcd55391053ff
|
||||
wolfmarkclub/wm1 - 2d8294e29b08f5af5406988a284483d1694ed36c
|
||||
xelus/kangaroo - f9697ba27d4e6c36a1cfd9e2657eac35dfa3be99
|
||||
xelus/trinityxttkl - a457601b446ea9b4e9e28d2ba304a4bcdb934257
|
||||
xelus/valor_frl_tkl - 27ec14b9ee0e5cb2d026af500d16b17d4c2885e2
|
||||
zoo/wampus - 926487c1f50c1c5eb0608ca7dc1184881d54d35e
|
||||
zvecr/split_blackpill - 02f4393d01e0a70c94af48fa979ff0229732e8ca
|
||||
zvecr/zv48/f401 - 8b1766a24f943b9b0ba756c6fe340ba69d5e14e3
|
||||
zvecr/zv48/f411 - 09ba645092eb7f3d41da0d5e6727f2f4f97033c0
|
||||
```
|
||||
|
||||
Listing of boards left outstanding:
|
||||
```
|
||||
8 boards outstanding:
|
||||
akegata_denki/device_one: BOARD=DEVICE_ONE
|
||||
dekunukem/duckypad: BOARD=GENERIC_STM32_F072XB
|
||||
ergodox_stm32: BOARD=ERGODOX_STM32_BOARD
|
||||
handwired/bluepill/bluepill70: BOARD=GENERIC_STM32_F103
|
||||
jm60: BOARD=JM60_BOARD
|
||||
matrix/m20add: BOARD=m20add_bd
|
||||
matrix/noah: BOARD=noah_bd
|
||||
xiaomi/mk02: BOARD=ST_STM32F072B_DISCOVERY
|
||||
```
|
||||
#### Add modifier state to the split keyboard transport ([#10400](https://github.com/qmk/qmk_firmware/pull/10400))
|
||||
|
||||
This adds modifier state to the i2c and serial transport for split
|
||||
keyboards. The purpose of this is to allow e.g. displaying modifier
|
||||
state on the slave side of a split keyboard on an oled. This adds two
|
||||
or three bytes to the data transferred between split halves.
|
||||
|
||||
This also fixes a missing ifdef guard for BACKLIGHT_ENABLE.
|
||||
#### fix matrix_io_delay() timing in quantum/matrix.c ([#9603](https://github.com/qmk/qmk_firmware/pull/9603))
|
||||
|
||||
~~The timing of the call to matrix_io_delay() has been changed to the appropriate time. With this change, we can reduce the number of times we call matrix_io_delay() by one.~~
|
||||
|
||||
**Separated `matrix_io_delay()` into the following two functions so that you can set the appropriate delay value for each.**
|
||||
|
||||
* `matrix_output_select_delay()` - after `select_row()/select_col()`
|
||||
The delay is a small number of clocks specific to the MCU.
|
||||
The default implementation is as follows:
|
||||
```c
|
||||
__attribute__((weak)) void matrix_output_select_delay(void) { waitInputPinDelay(); }
|
||||
```
|
||||
See below for more information on `waitInputPinDelay()`.
|
||||
|
||||
* `matrix_output_unselect_delay()` - after `unselect_row()/unselect_col()`
|
||||
The delay is in the range of a few microseconds, depending on the capacitance and resistance of the entire keyboard circuitry.
|
||||
The default implementation is as follows:
|
||||
```c
|
||||
__attribute__((weak)) void matrix_io_delay(void) { wait_us(MATRIX_IO_DELAY); }
|
||||
__attribute__((weak)) void matrix_output_unselect_delay(void) { matrix_io_delay(); }
|
||||
```
|
||||
|
||||
**Added `waitInputPinDelay()` into `quantum/quantum.h`.**
|
||||
|
||||
On AVR's GPIO and ARM's GPIO, the input signal changes need some clock time to be read into the input pins.
|
||||
|
||||
The `waitInputPinDelay()` will wait the necessary time. The wait time is set to `GPIO_INPUT_PIN_DELAY` in units of the clock.
|
||||
|
||||
If `GPIO_INPUT_PIN_DELAY` is not set, the following values are used.
|
||||
|
||||
* AVR
|
||||
The datasheets for ATmega32u4/16u4, ATmega32u2/16u2, ATmega328p, AT90usb646/1286, etc. say that a delay of one clock is required after a change in the input signal. Therefore, the default value of GPIO_INPUT_PIN_DELAY can be set to 1, but we'll set it to 2 to allow for some leeway.
|
||||
|
||||
* ARM-based MCUs
|
||||
For GPIOs on ARM-based MCUs, the input pins are sampled by the clock of the bus to which the GPIO is connected.
|
||||
The connected buses differ depending on the various series of MCUs.
|
||||
Also, since the CPU instruction execution clock and GPIO bus clock can vary depending on the MCU GPIO bus configuration and MCU internal register settings, the optimal delay value cannot be determined. Therefore, GPIO_INPUT_PIN_DELAY defaults to a rather large value of 0.25 microseconds.
|
||||
|
||||
<details>
|
||||
<summary><strong>Current matrix.c timing (click)</strong></summary>
|
||||
#### gcc 10 compatibility for Drop alt ([#9485](https://github.com/qmk/qmk_firmware/pull/9485))
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
* #9268 (This issue tracks multiple problems, this fixes part of it)
|
||||
#### Implement kinetic mouse movement algorithm ([#6739](https://github.com/qmk/qmk_firmware/pull/6739))
|
||||
|
||||
I implemented the kinetic/quadratic mouse acceleration algorithm. The algorithm is not the one from the UHK but a newly created one that's able to compute the current speed at any given time instead of relying on a compounding mechanism that just computes the increment.
|
||||
Overall, the cursor acceleration feels very similar to the UHK. However, feedback and improvements are welcome in order to make it as usable as possible.
|
||||
|
||||
This algorithm requires a very low `MOUSEKEY_INTERVAL` in order to produce smooth movements. What's possible highly depends on the micro processor. I did my tests on the elite-c which is pro micro compatible. It was able to deliver 125 events per second which I set as the default value if `MK_KINETIC_SPEED` is defined.
|
||||
|
||||
I wrote a small utility https://github.com/jceb/bin/blob/master/mouseevents that helps to measure the maximum number of mouse events that can be sent by the micro processor. If you try out this algorithm it should help find the right setting for `MOUSEKEY_INTERVAL`.
|
||||
|
||||
##### Issues Fixed or Closed by This PR
|
||||
|
||||
* Add UHK's kinetic mouse movement #6738
|
@@ -119,8 +119,12 @@
|
||||
* Breaking Changes
|
||||
* [Overview](breaking_changes.md)
|
||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||
* [Most Recent ChangeLog](ChangeLog/20210227.md "QMK v0.12.0 - 2021 Feb 27")
|
||||
* [Past Breaking Changes](breaking_changes_history.md)
|
||||
* History
|
||||
* [2020 Nov 28](ChangeLog/20201128.md)
|
||||
* [2020 Aug 29](ChangeLog/20200829.md)
|
||||
* [2020 May 30](ChangeLog/20200530.md)
|
||||
* [2020 Feb 29](ChangeLog/20200229.md)
|
||||
* [2019 Aug 30](ChangeLog/20190830.md)
|
||||
|
||||
* C Development
|
||||
* [ARM Debugging Guide](arm_debugging.md)
|
||||
@@ -129,7 +133,6 @@
|
||||
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
||||
* [Drivers](hardware_drivers.md)
|
||||
* [ADC Driver](adc_driver.md)
|
||||
* [Audio Driver](audio_driver.md)
|
||||
* [I2C Driver](i2c_driver.md)
|
||||
* [SPI Driver](spi_driver.md)
|
||||
* [WS2812 Driver](ws2812_driver.md)
|
||||
|
@@ -1,221 +0,0 @@
|
||||
# Audio Driver :id=audio-driver
|
||||
|
||||
The [Audio feature](feature_audio.md) breaks the hardware specifics out into separate, exchangeable driver units, with a common interface to the audio-"core" - which itself handles playing songs and notes while tracking their progress in an internal state, initializing/starting/stopping the driver as needed.
|
||||
|
||||
Not all MCUs support every available driver, either the platform-support is not there (yet?) or the MCU simply does not have the required hardware peripheral.
|
||||
|
||||
|
||||
## AVR :id=avr
|
||||
|
||||
Boards built around an Atmega32U4 can use two sets of PWM capable pins, each driving a separate speaker.
|
||||
The possible configurations are:
|
||||
|
||||
| | Timer3 | Timer1 |
|
||||
|--------------|-------------|--------------|
|
||||
| one speaker | C4,C5 or C6 | |
|
||||
| one speaker | | B4, B5 or B7 |
|
||||
| two speakers | C4,C5 or C6 | B4, B5 or B7 |
|
||||
|
||||
Currently there is only one/default driver for AVR based boards, which is automatically configured to:
|
||||
|
||||
```make
|
||||
AUDIO_DRIVER = pwm_hardware
|
||||
```
|
||||
|
||||
|
||||
## ARM :id=arm
|
||||
|
||||
For Arm based boards, QMK depends on ChibiOS - hence any MCU supported by the later is likely usable, as long as certain hardware peripherals are available.
|
||||
|
||||
Supported wiring configurations, with their ChibiOS/MCU peripheral requirement are listed below;
|
||||
piezo speakers are marked with :one: for the first/primary and :two: for the secondary.
|
||||
|
||||
| driver | GPTD6<br>Tim6 | GPTD7<br>Tim7 | GPTD8<br>Tim8 | PWMD1<sup>1</sup><br>Tim1_Ch1 |
|
||||
|--------------|------------------------------------------|------------------------|---------------|-------------------------------|
|
||||
| dac_basic | A4+DACD1 = :one: | A5+DACD2 = :one: | state | |
|
||||
| | A4+DACD1 = :one: + Gnd | A5+DACD2 = :two: + Gnd | state | |
|
||||
| | A4+DACD1 = :two: + Gnd | A5+DACD2 = :one: + Gnd | state | |
|
||||
| | A4+DACD1 = :one: + Gnd | | state | |
|
||||
| | | A5+DACD2 = :one: + Gnd | state | |
|
||||
| dac_additive | A4+DACD1 = :one: + Gnd | | | |
|
||||
| | A5+DACD2 = :one: + Gnd | | | |
|
||||
| | A4+DACD1 + A5+DACD2 = :one: <sup>2</sup> | | | |
|
||||
| pwm_software | state-update | | | any = :one: |
|
||||
| pwm hardware | state-update | | | A8 = :one: <sup>3</sup> |
|
||||
|
||||
|
||||
<sup>1</sup>: the routing and alternate functions for PWM differ sometimes between STM32 MCUs, if in doubt consult the data-sheet
|
||||
<sup>2</sup>: one piezo connected to A4 and A5, with AUDIO_PIN_ALT_AS_NEGATIVE set
|
||||
<sup>3</sup>: TIM1_CH1 = A8 on STM32F103C8, other combinations are possible, see Data-sheet. configured with: AUDIO_PWM_DRIVER and AUDIO_PWM_CHANNEL
|
||||
|
||||
|
||||
|
||||
### DAC basic :id=dac-basic
|
||||
|
||||
The default driver for ARM boards, in absence of an overriding configuration.
|
||||
This driver needs one Timer per enabled/used DAC channel, to trigger conversion; and a third timer to trigger state updates with the audio-core.
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timers 6, 7 and 8:
|
||||
|
||||
``` c
|
||||
//halconf.h:
|
||||
#define HAL_USE_DAC TRUE
|
||||
#define HAL_USE_GPT TRUE
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
``` c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_DAC_USE_DAC1_CH1
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
||||
#undef STM32_DAC_USE_DAC1_CH2
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
||||
#undef STM32_GPT_USE_TIM6
|
||||
#define STM32_GPT_USE_TIM6 TRUE
|
||||
#undef STM32_GPT_USE_TIM7
|
||||
#define STM32_GPT_USE_TIM7 TRUE
|
||||
#undef STM32_GPT_USE_TIM8
|
||||
#define STM32_GPT_USE_TIM8 TRUE
|
||||
```
|
||||
|
||||
?> Note: DAC1 (A4) uses TIM6, DAC2 (A5) uses TIM7, and the audio state timer uses TIM8 (configurable).
|
||||
|
||||
You can also change the timer used for the overall audio state by defining the driver. For instance:
|
||||
|
||||
```c
|
||||
#define AUDIO_STATE_TIMER GPTD9
|
||||
```
|
||||
|
||||
### DAC additive :id=dac-additive
|
||||
|
||||
only needs one timer (GPTD6, Tim6) to trigger the DAC unit to do a conversion; the audio state updates are in turn triggered during the DAC callback.
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timer 6:
|
||||
|
||||
``` c
|
||||
//halconf.h:
|
||||
#define HAL_USE_DAC TRUE
|
||||
#define HAL_USE_GPT TRUE
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
``` c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_DAC_USE_DAC1_CH1
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
||||
#undef STM32_DAC_USE_DAC1_CH2
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
||||
#undef STM32_GPT_USE_TIM6
|
||||
#define STM32_GPT_USE_TIM6 TRUE
|
||||
```
|
||||
|
||||
### DAC Config
|
||||
|
||||
| Define | Defaults | Description --------------------------------------------------------------------------------------------- |
|
||||
| `AUDIO_DAC_SAMPLE_MAX` | `4095U` | Highest value allowed. Lower value means lower volume. And 4095U is the upper limit, since this is limited to a 12 bit value. Only effects non-pregenerated samples. |
|
||||
| `AUDIO_DAC_OFF_VALUE` | `AUDIO_DAC_SAMPLE_MAX / 2` | The value of the DAC when notplaying anything. Some setups may require a high (`AUDIO_DAC_SAMPLE_MAX`) or low (`0`) value here. |
|
||||
| `AUDIO_MAX_SIMULTANEOUS_TONES` | __see next table__ | The number of tones that can be played simultaneously. A value that is too high may freeze the controller or glitch out when too many tones are being played. |
|
||||
| `AUDIO_DAC_SAMPLE_RATE` | __see next table__ | Effective bit rate of the DAC (in hertz), higher limits simultaneous tones, and lower sacrifices quality. |
|
||||
|
||||
There are a number of predefined quality settings that you can use, with "sane minimum" being the default. You can use custom values by simply defining the sample rate and number of simultaneous tones, instead of using one of the listed presets.
|
||||
|
||||
| Define | Sample Rate | Simultaneous tones |
|
||||
| `AUDIO_DAC_QUALITY_VERY_LOW` | `11025U` | `8` |
|
||||
| `AUDIO_DAC_QUALITY_LOW` | `22040U` | `4` |
|
||||
| `AUDIO_DAC_QUALITY_HIGH` | `44100U` | `2` |
|
||||
| `AUDIO_DAC_QUALITY_VERY_HIGH` | `88200U` | `1` |
|
||||
| `AUDIO_DAC_QUALITY_SANE_MINIMUM` | `16384U` | `8` |
|
||||
|
||||
|
||||
```c
|
||||
/* zero crossing (or approach, whereas zero == DAC_OFF_VALUE, which can be configured to anything from 0 to DAC_SAMPLE_MAX)
|
||||
* ============================*=*========================== AUDIO_DAC_SAMPLE_MAX
|
||||
* * *
|
||||
* * *
|
||||
* ---------------------------------------------------------
|
||||
* * * } AUDIO_DAC_SAMPLE_MAX/100
|
||||
* --------------------------------------------------------- AUDIO_DAC_OFF_VALUE
|
||||
* * * } AUDIO_DAC_SAMPLE_MAX/100
|
||||
* ---------------------------------------------------------
|
||||
* *
|
||||
* * *
|
||||
* * *
|
||||
* =====*=*================================================= 0x0
|
||||
*/
|
||||
```
|
||||
|
||||
|
||||
### PWM hardware :id=pwm-hardware
|
||||
|
||||
This driver uses the ChibiOS-PWM system to produce a square-wave on specific output pins that are connected to the PWM hardware.
|
||||
The hardware directly toggles the pin via its alternate function. See your MCU's data-sheet for which pin can be driven by what timer - looking for TIMx_CHy and the corresponding alternate function.
|
||||
|
||||
A configuration example for the STM32F103C8 would be:
|
||||
``` c
|
||||
//halconf.h:
|
||||
#define HAL_USE_PWM TRUE
|
||||
#define HAL_USE_PAL TRUE
|
||||
#define HAL_USE_GPT TRUE
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
``` c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_PWM_USE_TIM1
|
||||
#define STM32_PWM_USE_TIM1 TRUE
|
||||
#undef STM32_GPT_USE_TIM4
|
||||
#define STM32_GPT_USE_TIM4 TRUE
|
||||
```
|
||||
|
||||
If we now target pin A8, looking through the data-sheet of the STM32F103C8, for the timers and alternate functions
|
||||
- TIM1_CH1 = PA8 <- alternate0
|
||||
- TIM1_CH2 = PA9
|
||||
- TIM1_CH3 = PA10
|
||||
- TIM1_CH4 = PA11
|
||||
|
||||
with all this information, the configuration would contain these lines:
|
||||
``` c
|
||||
//config.h:
|
||||
#define AUDIO_PIN A8
|
||||
#define AUDIO_PWM_DRIVER PWMD1
|
||||
#define AUDIO_PWM_CHANNEL 1
|
||||
#define AUDIO_STATE_TIMER GPTD4
|
||||
```
|
||||
|
||||
ChibiOS uses GPIOv1 for the F103, which only knows of one alternate function.
|
||||
On 'larger' STM32s, GPIOv2 or GPIOv3 are used; with them it is also necessary to configure `AUDIO_PWM_PAL_MODE` to the correct alternate function for the selected pin, timer and timer-channel.
|
||||
|
||||
|
||||
### PWM software :id=pwm-software
|
||||
|
||||
This driver uses the PWM callbacks from PWMD1 with TIM1_CH1 to toggle the selected AUDIO_PIN in software.
|
||||
During the same callback, with AUDIO_PIN_ALT_AS_NEGATIVE set, the AUDIO_PIN_ALT is toggled inversely to AUDIO_PIN. This is useful for setups that drive a piezo from two pins (instead of one and Gnd).
|
||||
|
||||
You can also change the timer used for software PWM by defining the driver. For instance:
|
||||
|
||||
```c
|
||||
#define AUDIO_STATE_TIMER GPTD8
|
||||
```
|
||||
|
||||
|
||||
### Testing Notes :id=testing-notes
|
||||
|
||||
While not an exhaustive list, the following table provides the scenarios that have been partially validated:
|
||||
|
||||
| | DAC basic | DAC additive | PWM hardware | PWM software |
|
||||
|--------------------------|--------------------|--------------------|--------------------|--------------------|
|
||||
| Atmega32U4 | :o: | :o: | :heavy_check_mark: | :o: |
|
||||
| STM32F103C8 (bluepill) | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| STM32F303CCT6 (proton-c) | :heavy_check_mark: | :heavy_check_mark: | ? | :heavy_check_mark: |
|
||||
| STM32F405VG | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| L0xx | :x: (no Tim8) | ? | ? | ? |
|
||||
|
||||
|
||||
:heavy_check_mark: : works and was tested
|
||||
:o: : does not apply
|
||||
:x: : not supported by MCU
|
||||
|
||||
*Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.*
|
@@ -6,7 +6,6 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
||||
|
||||
## What has been included in past Breaking Changes?
|
||||
|
||||
* [2021 Feb 27](ChangeLog/20210227.md)
|
||||
* [2020 Nov 28](ChangeLog/20201128.md)
|
||||
* [2020 Aug 29](ChangeLog/20200829.md)
|
||||
* [2020 May 30](ChangeLog/20200530.md)
|
||||
@@ -19,12 +18,12 @@ The next Breaking Change is scheduled for February 27, 2021.
|
||||
|
||||
### Important Dates
|
||||
|
||||
* [x] 2021 Feb 27 - `develop` is created. Each push to `master` is subsequently merged to `develop`
|
||||
* [ ] 2021 May 01 - `develop` closed to new PR's.
|
||||
* [ ] 2021 May 01 - Call for testers.
|
||||
* [ ] 2021 May 27 - `master` is locked, no PR's merged.
|
||||
* [ ] 2021 May 29 - Merge `develop` to `master`.
|
||||
* [ ] 2021 May 29 - `master` is unlocked. PR's can be merged again.
|
||||
* [x] 2020 Nov 28 - `develop` is created. Each push to `master` is subsequently merged to `develop`
|
||||
* [ ] 2021 Jan 30 - `develop` closed to new PR's.
|
||||
* [ ] 2021 Jan 30 - Call for testers.
|
||||
* [ ] 2021 Feb 25 - `master` is locked, no PR's merged.
|
||||
* [ ] 2021 Feb 27 - Merge `develop` to `master`.
|
||||
* [ ] 2021 Feb 27 - `master` is unlocked. PR's can be merged again.
|
||||
|
||||
## What changes will be included?
|
||||
|
||||
|
@@ -1,10 +0,0 @@
|
||||
# Past Breaking Changes
|
||||
|
||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||
|
||||
* [2021 Feb 27](ChangeLog/20210227.md) - version 0.12.0
|
||||
* [2020 Nov 28](ChangeLog/20201128.md) - version 0.11.0
|
||||
* [2020 Aug 29](ChangeLog/20200829.md) - version 0.10.0
|
||||
* [2020 May 30](ChangeLog/20200530.md) - version 0.9.0
|
||||
* [2020 Feb 29](ChangeLog/20200229.md) - version 0.8.0
|
||||
* [2019 Aug 30](ChangeLog/20190830.md) - version 0.7.0
|
@@ -170,7 +170,7 @@ qmk json2c [-o OUTPUT] filename
|
||||
## `qmk c2json`
|
||||
|
||||
Creates a keymap.json from a keymap.c.
|
||||
**Note:** Parsing C source files is not easy, therefore this subcommand may not work with your keymap. In some cases not using the C pre-processor helps.
|
||||
**Note:** Parsing C source files is not easy, therefore this subcommand may not work your keymap. In some cases not using the C pre-processor helps.
|
||||
|
||||
**Usage**:
|
||||
|
||||
|
@@ -26,10 +26,6 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
||||
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
||||
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
||||
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
||||
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
||||
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
||||
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
||||
|
||||
### NXP (Kinetis)
|
||||
|
||||
|
@@ -67,22 +67,16 @@ This is a C header file that is one of the first things included, and will persi
|
||||
* turns on the alternate audio voices (to cycle through)
|
||||
* `#define C4_AUDIO`
|
||||
* enables audio on pin C4
|
||||
* Deprecated. Use `#define AUDIO_PIN C4`
|
||||
* `#define C5_AUDIO`
|
||||
* enables audio on pin C5
|
||||
* Deprecated. Use `#define AUDIO_PIN C5`
|
||||
* `#define C6_AUDIO`
|
||||
* enables audio on pin C6
|
||||
* Deprecated. Use `#define AUDIO_PIN C6`
|
||||
* `#define B5_AUDIO`
|
||||
* enables audio on pin B5 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* Deprecated. Use `#define AUDIO_PIN B5`, or use `#define AUDIO_PIN_ALT B5` if a `C` pin is enabled with `AUDIO_PIN`
|
||||
* enables audio on pin B5 (duophony is enables if one of B[5-7]\_AUDIO is enabled along with one of C[4-6]\_AUDIO)
|
||||
* `#define B6_AUDIO`
|
||||
* enables audio on pin B5 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* Deprecated. Use `#define AUDIO_PIN B6`, or use `#define AUDIO_PIN_ALT B6` if a `C` pin is enabled with `AUDIO_PIN`
|
||||
* enables audio on pin B6 (duophony is enables if one of B[5-7]\_AUDIO is enabled along with one of C[4-6]\_AUDIO)
|
||||
* `#define B7_AUDIO`
|
||||
* enables audio on pin B5 (duophony is enabled if one of B pins is enabled along with one of C pins)
|
||||
* Deprecated. Use `#define AUDIO_PIN B7`, or use `#define AUDIO_PIN_ALT B7` if a `C` pin is enabled with `AUDIO_PIN`
|
||||
* enables audio on pin B7 (duophony is enables if one of B[5-7]\_AUDIO is enabled along with one of C[4-6]\_AUDIO)
|
||||
* `#define BACKLIGHT_PIN B7`
|
||||
* pin of the backlight
|
||||
* `#define BACKLIGHT_LEVELS 3`
|
||||
@@ -103,8 +97,6 @@ This is a C header file that is one of the first things included, and will persi
|
||||
* sets the maximum power (in mA) over USB for the device (default: 500)
|
||||
* `#define USB_POLLING_INTERVAL_MS 10`
|
||||
* sets the USB polling rate in milliseconds for the keyboard, mouse, and shared (NKRO/media keys) interfaces
|
||||
* `#define USB_SUSPEND_WAKEUP_DELAY 200`
|
||||
* set the number of milliseconde to pause after sending a wakeup packet
|
||||
* `#define F_SCL 100000L`
|
||||
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
|
||||
|
||||
|
@@ -12,18 +12,17 @@ Now we have support for generating `rules.mk` and `config.h` values from `info.j
|
||||
|
||||
## Overview
|
||||
|
||||
On the C side of things nothing changes. When you need to create a new rule or define you follow the same process:
|
||||
On the C side of things nothing really changes. When you need to create a new rule or define you follow the same process:
|
||||
|
||||
1. Add it to `docs/config_options.md`
|
||||
1. Set a default in the appropriate core file
|
||||
1. Add your ifdef statements as needed
|
||||
1. Add your `ifdef` and/or `#ifdef` statements as needed
|
||||
|
||||
You will then need to add support for your new configuration to `info.json`. The basic process is:
|
||||
|
||||
1. Add it to the schema in `data/schemas/keyboards.jsonschema`
|
||||
1. Add a mapping in `data/maps`
|
||||
1. (optional and discoraged) Add code to extract/generate it to:
|
||||
* `lib/python/qmk/info.py`
|
||||
1. Add code to extract it from `config.h`/`rules.mk` to `lib/python/qmk/info.py`
|
||||
1. Add code to generate it to one of:
|
||||
* `lib/python/qmk/cli/generate/config_h.py`
|
||||
* `lib/python/qmk/cli/generate/rules_mk.py`
|
||||
|
||||
@@ -33,43 +32,12 @@ This section describes adding support for a `config.h`/`rules.mk` value to info.
|
||||
|
||||
### Add it to the schema
|
||||
|
||||
QMK maintains [jsonschema](https://json-schema.org/) files in `data/schemas`. The values that go into keyboard-specific `info.json` files are kept in `keyboard.jsonschema`. Any value you want to make available to end users to edit must go in here.
|
||||
QMK maintains schema files in `data/schemas`. The values that go into keyboard-specific `info.json` files are kept in `keyboard.jsonschema`. Any value you want to make available to end users to edit must go in here.
|
||||
|
||||
In some cases you can simply add a new top-level key. Some examples to follow are `keyboard_name`, `maintainer`, `processor`, and `url`. This is appropriate when your option is self-contained and not directly related to other options.
|
||||
|
||||
In other cases you should group like options together in an `object`. This is particularly true when adding support for a feature. Some examples to follow for this are `indicators`, `matrix_pins`, and `rgblight`. If you are not sure how to integrate your new option(s) [open an issue](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=) or [join #cli on Discord](https://discord.gg/heQPAgy) and start a conversation there.
|
||||
|
||||
### Add a mapping
|
||||
|
||||
In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
|
||||
|
||||
* `info_key`: (required) The location within `info.json` for this value. See below.
|
||||
* `value_type`: (optional) Default `str`. The format for this variable's value. See below.
|
||||
* `to_json`: (optional) Default `true`. Set to `false` to exclude this mapping from info.json
|
||||
* `to_c`: (optional) Default `true`. Set to `false` to exclude this mapping from config.h
|
||||
* `warn_duplicate`: (optional) Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||
|
||||
#### Info Key
|
||||
|
||||
We use JSON dot notation to address variables within info.json. For example, to access `info_json["rgblight"]["split_count"]` I would specify `rgblight.split_count`. This allows you to address deeply nested keys with a simple string.
|
||||
|
||||
Under the hood we use [Dotty Dict](https://dotty-dict.readthedocs.io/en/latest/), you can refer to that documentation for how these strings are converted to object access.
|
||||
|
||||
#### Value Types
|
||||
|
||||
By default we treat all values as simple strings. If your value is more complex you can use one of these types to intelligently parse the data:
|
||||
|
||||
* `array`: A comma separated array of strings
|
||||
* `array.int`: A comma separated array of integers
|
||||
* `int`: An integer
|
||||
* `hex`: A number formatted as hex
|
||||
* `list`: A space separate array of strings
|
||||
* `mapping`: A hash of key/value pairs
|
||||
In some cases you can simply add a new top-level key. Some examples to follow are `keyboard_name`, `maintainer`, `processor`, and `url`. This is appropriate when your option is self-contained and not directly related to other options. In other cases you should group like options together in an `object`. This is particularly true when adding support for a feature. Some examples to follow for this are `indicators`, `matrix_pins`, and `rgblight`. If you are not sure how to integrate your new option(s) [open an issue](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=) or [join #cli on Discord](https://discord.gg/heQPAgy) and start a conversation there.
|
||||
|
||||
### Add code to extract it
|
||||
|
||||
Most use cases can be solved by the mapping files described above. If yours can't you can instead write code to extract your config values.
|
||||
|
||||
Whenever QMK generates a complete `info.json` it extracts information from `config.h` and `rules.mk`. You will need to add code for your new config value to `lib/python/qmk/info.py`. Typically this means adding a new `_extract_<feature>()` function and then calling your function in either `_extract_config_h()` or `_extract_rules_mk()`.
|
||||
|
||||
If you are not sure how to edit this file or are not comfortable with Python [open an issue](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=) or [join #cli on Discord](https://discord.gg/heQPAgy) and someone can help you with this part.
|
||||
|
@@ -109,19 +109,6 @@ If you can't get this 'Listening:' message try building with `CONSOLE_ENABLE=yes
|
||||
|
||||
You may need privileges to access the device an OS like Linux. Try `sudo hid_listen`.
|
||||
|
||||
On many Linux distros you can avoid having to run hid_listen as root
|
||||
by creating a file called `/etc/udev/rules.d/70-hid-listen.rules` with
|
||||
the following content:
|
||||
|
||||
```
|
||||
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="def1", TAG+="uaccess", RUN{builtin}+="uaccess"
|
||||
```
|
||||
|
||||
Replace abcd and def1 with your keyboard's vendor and product id,
|
||||
letters must be lowercase. The `RUN{builtin}+="uaccess"` part is only
|
||||
needed for older distros.
|
||||
|
||||
|
||||
## Can't Get Message on Console
|
||||
Check:
|
||||
- *hid_listen* finds your device. See above.
|
||||
|
@@ -23,141 +23,6 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown
|
||||
|
||||
You can also chain them, for example `LCTL(LALT(KC_DEL))` or `C(A(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
|
||||
|
||||
# Checking Modifier State :id=checking-modifier-state
|
||||
|
||||
The current modifier state can mainly be accessed with two functions: `get_mods()` for normal modifiers and modtaps and `get_oneshot_mods()` for one-shot modifiers (unless they're held, in which case they act like normal modifier keys).
|
||||
|
||||
The presence of one or more specific modifiers in the current modifier state can be detected by ANDing the modifier state with a mod mask corresponding to the set of modifiers you want to match for. The reason why bitwise operators are used is that the modifier state is stored as a single byte in the format (GASC)<sub>R</sub>(GASC)<sub>L</sub>.
|
||||
|
||||
Thus, to give an example, `01000010` would be the internal representation of LShift+RAlt.
|
||||
For more information on bitwise operators in C, click [here](https://en.wikipedia.org/wiki/Bitwise_operations_in_C) to open the Wikipedia page on the topic.
|
||||
|
||||
In practice, this means that you can check whether a given modifier is active with `get_mods() & MOD_BIT(KC_<modifier>)` (see the [list of modifier keycodes](keycodes_basic.md#modifiers)) or with `get_mods() & MOD_MASK_<modifier>` if the difference between left and right hand modifiers is not important and you want to match both. Same thing can be done for one-shot modifiers if you replace `get_mods()` with `get_oneshot_mods()`.
|
||||
|
||||
To check that *only* a specific set of mods is active at a time, AND the modifier state and your desired mod mask as explained above and compare the result to the mod mask itself: `get_mods() & <mod mask> == <mod mask>`.
|
||||
|
||||
For example, let's say you want to trigger a piece of custom code if one-shot left control and one-shot left shift are on but every other one-shot mods are off. To do so, you can compose the desired mod mask by combining the mod bits for left control and shift with `(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))` and then plug it in: `get_oneshot_mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT)) == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))`. Using `MOD_MASK_CS` instead for the mod bitmask would have forced you to press four modifier keys (both versions of control and shift) to fulfill the condition.
|
||||
|
||||
The full list of mod masks is as follows:
|
||||
|
||||
| Mod Mask Name | Matching Modifiers |
|
||||
|--------------------|------------------------------------------------|
|
||||
| `MOD_MASK_CTRL` | LCTRL , RCTRL |
|
||||
| `MOD_MASK_SHIFT` | LSHIFT , RSHIFT |
|
||||
| `MOD_MASK_ALT` | LALT , RALT |
|
||||
| `MOD_MASK_GUI` | LGUI , RGUI |
|
||||
| `MOD_MASK_CS` | CTRL , SHIFT |
|
||||
| `MOD_MASK_CA` | (L/R)CTRL , (L/R)ALT |
|
||||
| `MOD_MASK_CG` | (L/R)CTRL , (L/R)GUI |
|
||||
| `MOD_MASK_SA` | (L/R)SHIFT , (L/R)ALT |
|
||||
| `MOD_MASK_SG` | (L/R)SHIFT , (L/R)GUI |
|
||||
| `MOD_MASK_AG` | (L/R)ALT , (L/R)GUI |
|
||||
| `MOD_MASK_CSA` | (L/R)CTRL , (L/R)SHIFT , (L/R)ALT |
|
||||
| `MOD_MASK_CSG` | (L/R)CTRL , (L/R)SHIFT , (L/R)GUI |
|
||||
| `MOD_MASK_CAG` | (L/R)CTRL , (L/R)ALT , (L/R)GUI |
|
||||
| `MOD_MASK_SAG` | (L/R)SHIFT , (L/R)ALT , (L/R)GUI |
|
||||
| `MOD_MASK_CSAG` | (L/R)CTRL , (L/R)SHIFT , (L/R)ALT , (L/R)GUI |
|
||||
|
||||
Aside from accessing the currently active modifiers using `get_mods()`, there exists some other functions you can use to modify the modifier state, where the `mods` argument refers to the modifiers bitmask.
|
||||
|
||||
* `add_mods(mods)`: Enable `mods` without affecting any other modifiers
|
||||
* `register_mods(mods)`: Like `add_mods` but send a keyboard report immediately.
|
||||
* `del_mods(mods)`: Disable `mods` without affecting any other modifiers
|
||||
* `unregister_mods(mods)`: Like `del_mods` but send a keyboard report immediately.
|
||||
* `set_mods(mods)`: Overwrite current modifier state with `mods`
|
||||
* `clear_mods()`: Reset the modifier state by disabling all modifiers
|
||||
|
||||
Similarly, in addition to `get_oneshot_mods()`, there also exists these functions for one-shot mods:
|
||||
|
||||
* `add_oneshot_mods(mods)`: Enable `mods` without affecting any other one-shot modifiers
|
||||
* `del_oneshot_mods(mods)`: Disable `mods` without affecting any other one-shot modifiers
|
||||
* `set_oneshot_mods(mods)`: Overwrite current one-shot modifier state with `mods`
|
||||
* `clear_oneshot_mods()`: Reset the one-shot modifier state by disabling all one-shot modifiers
|
||||
|
||||
## Examples :id=examples
|
||||
|
||||
The following examples use [advanced macro functions](feature_macros.md#advanced-macro-functions) which you can read more about in the [documentation page on macros](feature_macros.md).
|
||||
|
||||
### Alt + Escape for Alt + Tab :id=alt-escape-for-alt-tab
|
||||
|
||||
Simple example where chording Left Alt with `KC_ESC` makes it behave like `KC_TAB` for alt-tabbing between applications. This example strictly checks if only Left Alt is active, meaning you can't do Alt+Shift+Esc to switch between applications in reverse order. Also keep in mind that this removes the ability to trigger the actual Alt+Escape keyboard shortcut, though it keeps the ability to do AltGr+Escape.
|
||||
|
||||
```c
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
|
||||
case KC_ESC:
|
||||
// Detect the activation of only Left Alt
|
||||
if ((get_mods() & MOD_BIT(KC_LALT)) == MOD_BIT(KC_LALT)) {
|
||||
if (record->event.pressed) {
|
||||
// No need to register KC_LALT because it's already active.
|
||||
// The Alt modifier will apply on this KC_TAB.
|
||||
register_code(KC_TAB);
|
||||
} else {
|
||||
unregister_code(KC_TAB);
|
||||
}
|
||||
// Do not let QMK process the keycode further
|
||||
return false;
|
||||
}
|
||||
// Else, let QMK process the KC_ESC keycode as usual
|
||||
return true;
|
||||
|
||||
}
|
||||
return true;
|
||||
};
|
||||
```
|
||||
|
||||
### Shift + Backspace for Delete :id=shift-backspace-for-delete
|
||||
|
||||
Advanced example where the original behaviour of shift is cancelled when chorded with `KC_BSPC` and is instead fully replaced by `KC_DEL`. Two main variables are created to make this work well: `mod_state` and `delkey_registered`. The first one stores the modifier state and is used to restore it after registering `KC_DEL`. The second variable is a boolean variable (true or false) which keeps track of the status of `KC_DEL` to manage the release of the whole Backspace/Delete key correctly.
|
||||
|
||||
As opposed to the previous example, this doesn't use strict modifier checking. Pressing `KC_BSPC` while one or two shifts are active is enough to trigger this custom code, regardless of the state of other modifiers. That approach offers some perks: Ctrl+Shift+Backspace lets us delete the next word (Ctrl+Delete) and Ctrl+Alt+Shift+Backspace lets us execute the Ctrl+Alt+Del keyboard shortcut.
|
||||
|
||||
```c
|
||||
// Initialize variable holding the binary
|
||||
// representation of active modifiers.
|
||||
uint8_t mod_state;
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
// Store the current modifier state in the variable for later reference
|
||||
mod_state = get_mods();
|
||||
switch (keycode) {
|
||||
|
||||
case KC_BSPC:
|
||||
{
|
||||
// Initialize a boolean variable that keeps track
|
||||
// of the delete key status: registered or not?
|
||||
static bool delkey_registered;
|
||||
if (record->event.pressed) {
|
||||
// Detect the activation of either shift keys
|
||||
if (mod_state & MOD_MASK_SHIFT) {
|
||||
// First temporarily canceling both shifts so that
|
||||
// shift isn't applied to the KC_DEL keycode
|
||||
del_mods(MOD_MASK_SHIFT);
|
||||
register_code(KC_DEL);
|
||||
// Update the boolean variable to reflect the status of KC_DEL
|
||||
delkey_registered = true;
|
||||
// Reapplying modifier state so that the held shift key(s)
|
||||
// still work even after having tapped the Backspace/Delete key.
|
||||
set_mods(mod_state);
|
||||
return false;
|
||||
}
|
||||
} else { // on release of KC_BSPC
|
||||
// In case KC_DEL is still being sent even after the release of KC_BSPC
|
||||
if (delkey_registered) {
|
||||
unregister_code(KC_DEL);
|
||||
delkey_registered = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Let QMK process the KC_BSPC keycode as usual outside of shift
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
};
|
||||
```
|
||||
|
||||
# Legacy Content :id=legacy-content
|
||||
|
||||
This page used to encompass a large set of features. We have moved many sections that used to be part of this page to their own pages. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
|
||||
|
@@ -1,117 +1,21 @@
|
||||
# Audio
|
||||
|
||||
Your keyboard can make sounds! If you've got a spare pin you can hook up a simple speaker and make it beep. You can use those beeps to indicate layer transitions, modifiers, special keys, or just to play some funky 8bit tunes.
|
||||
Your keyboard can make sounds! If you've got a Planck, Preonic, or basically any AVR keyboard that allows access to certain PWM-capable pins, you can hook up a simple speaker and make it beep. You can use those beeps to indicate layer transitions, modifiers, special keys, or just to play some funky 8bit tunes.
|
||||
|
||||
To activate this feature, add `AUDIO_ENABLE = yes` to your `rules.mk`.
|
||||
Up to two simultaneous audio voices are supported, one driven by timer 1 and another driven by timer 3. The following pins can be defined as audio outputs in config.h:
|
||||
|
||||
## AVR based boards
|
||||
On Atmega32U4 based boards, up to two simultaneous tones can be rendered.
|
||||
With one speaker connected to a PWM capable pin on PORTC driven by timer 3 and the other on one of the PWM pins on PORTB driven by timer 1.
|
||||
Timer 1:
|
||||
`#define B5_AUDIO`
|
||||
`#define B6_AUDIO`
|
||||
`#define B7_AUDIO`
|
||||
|
||||
The following pins can be configured as audio outputs in `config.h` - for one speaker set eiter one out of:
|
||||
Timer 3:
|
||||
`#define C4_AUDIO`
|
||||
`#define C5_AUDIO`
|
||||
`#define C6_AUDIO`
|
||||
|
||||
* `#define AUDIO_PIN C4`
|
||||
* `#define AUDIO_PIN C5`
|
||||
* `#define AUDIO_PIN C6`
|
||||
* `#define AUDIO_PIN B5`
|
||||
* `#define AUDIO_PIN B6`
|
||||
* `#define AUDIO_PIN B7`
|
||||
If you add `AUDIO_ENABLE = yes` to your `rules.mk`, there's a couple different sounds that will automatically be enabled without any other configuration:
|
||||
|
||||
and *optionally*, for a second speaker, one of:
|
||||
* `#define AUDIO_PIN_ALT B5`
|
||||
* `#define AUDIO_PIN_ALT B6`
|
||||
* `#define AUDIO_PIN_ALT B7`
|
||||
|
||||
### Wiring
|
||||
per speaker is - for example with a piezo buzzer - the black lead to Ground, and the red lead connected to the selected AUDIO_PIN for the primary; and similarly with AUDIO_PIN_ALT for the secondary.
|
||||
|
||||
|
||||
## ARM based boards
|
||||
for more technical details, see the notes on [Audio driver](audio_driver.md).
|
||||
|
||||
<!-- because I'm not sure where to fit this in: https://waveeditonline.com/ -->
|
||||
### DAC (basic)
|
||||
Most STM32 MCUs have DAC peripherals, with a notable exception of the STM32F1xx series. Generally, the DAC peripheral drives pins A4 or A5. To enable DAC-based audio output on STM32 devices, add `AUDIO_DRIVER = dac_basic` to `rules.mk` and set in `config.h` either:
|
||||
|
||||
`#define AUDIO_PIN A4` or `#define AUDIO_PIN A5`
|
||||
|
||||
the other DAC channel can optionally be used with a secondary speaker, just set:
|
||||
|
||||
`#define AUDIO_PIN_ALT A4` or `#define AUDIO_PIN_ALT A5`
|
||||
|
||||
Do note though that the dac_basic driver is only capable of reproducing one tone per speaker/channel at a time, for more tones simultaneously, try the dac_additive driver.
|
||||
|
||||
#### Wiring:
|
||||
for two piezos, for example configured as `AUDIO_PIN A4` and `AUDIO_PIN_ALT A5` would be: red lead to A4 and black to Ground, and similarly with the second one: A5 = red, and Ground = black
|
||||
|
||||
another alternative is to drive *one* piezo with both DAC pins - for an extra "push".
|
||||
wiring red to A4 and black to A5 (or the other way round) and add `#define AUDIO_PIN_ALT_AS_NEGATIVE` to `config.h`
|
||||
|
||||
##### Proton-C Example:
|
||||
The Proton-C comes (optionally) with one 'builtin' piezo, which is wired to A4+A5.
|
||||
For this board `config.h` would include these defines:
|
||||
|
||||
```c
|
||||
#define AUDIO_PIN A5
|
||||
#define AUDIO_PIN_ALT A4
|
||||
#define AUDIO_PIN_ALT_AS_NEGATIVE
|
||||
```
|
||||
|
||||
### DAC (additive)
|
||||
Another option, besides dac_basic (which produces sound through a square-wave), is to use the DAC to do additive wave synthesis.
|
||||
With a number of predefined wave-forms or by providing your own implementation to generate samples on the fly.
|
||||
To use this feature set `AUDIO_DRIVER = dac_additive` in your `rules.mk`, and select in `config.h` EITHER `#define AUDIO_PIN A4` or `#define AUDIO_PIN A5`.
|
||||
|
||||
The used waveform *defaults* to sine, but others can be selected by adding one of the following defines to `config.h`:
|
||||
|
||||
* `#define AUDIO_DAC_SAMPLE_WAVEFORM_SINE`
|
||||
* `#define AUDIO_DAC_SAMPLE_WAVEFORM_TRIANGLE`
|
||||
* `#define AUDIO_DAC_SAMPLE_WAVEFORM_TRAPEZOID`
|
||||
* `#define AUDIO_DAC_SAMPLE_WAVEFORM_SQUARE`
|
||||
|
||||
Should you rather choose to generate and use your own sample-table with the DAC unit, implement `uint16_t dac_value_generate(void)` with your keyboard - for an example implementation see keyboards/planck/keymaps/synth_sample or keyboards/planck/keymaps/synth_wavetable
|
||||
|
||||
|
||||
### PWM (software)
|
||||
if the DAC pins are unavailable (or the MCU has no usable DAC at all, like STM32F1xx); PWM can be an alternative.
|
||||
Note that there is currently only one speaker/pin supported.
|
||||
|
||||
set in `rules.mk`:
|
||||
|
||||
`AUDIO_DRIVER = pwm_software` and in `config.h`:
|
||||
`#define AUDIO_PIN C13` (can be any pin) to have the selected pin output a pwm signal, generated from a timer callback which toggles the pin in software.
|
||||
|
||||
#### Wiring
|
||||
the usual piezo wiring: red goes to the selected AUDIO_PIN, black goes to ground.
|
||||
|
||||
OR if you can chose to drive one piezo with two pins, for example `#define AUDIO_PIN B1`, `#define AUDIO_PIN_ALT B2` in `config.h`, with `#define AUDIO_PIN_ALT_AS_NEGATIVE` - then the red lead could go to B1, the black to B2.
|
||||
|
||||
### PWM (hardware)
|
||||
STM32F1xx have to fall back to using PWM, but can do so in hardware; but again on currently only one speaker/pin.
|
||||
|
||||
`AUDIO_DRIVER = pwm_hardware` in `rules.mk`, and in `config.h`:
|
||||
`#define AUDIO_PIN A8`
|
||||
`#define AUDIO_PWM_DRIVER PWMD1`
|
||||
`#define AUDIO_PWM_CHANNEL 1`
|
||||
(as well as `#define AUDIO_PWM_PAL_MODE 42` if you are on STM32F2 or larger)
|
||||
which will use Timer 1 to directly drive pin PA8 through the PWM hardware (TIM1_CH1 = PA8).
|
||||
Should you want to use the pwm-hardware on another pin and timer - be ready to dig into the STM32 data-sheet to pick the right TIMx_CHy and pin-alternate function.
|
||||
|
||||
|
||||
## Tone Multiplexing
|
||||
Since most drivers can only render one tone per speaker at a time (with the one exception: arm dac-additive) there also exists a "workaround-feature" that does time-slicing/multiplexing - which does what the name implies: cycle through a set of active tones (e.g. when playing chords in Music Mode) at a given rate, and put one tone at a time out through the one/few speakers that are available.
|
||||
|
||||
To enable this feature, and configure a starting-rate, add the following defines to `config.h`:
|
||||
```c
|
||||
#define AUDIO_ENABLE_TONE_MULTIPLEXING
|
||||
#define AUDIO_TONE_MULTIPLEXING_RATE_DEFAULT 10
|
||||
```
|
||||
|
||||
The audio core offers interface functions to get/set/change the tone multiplexing rate from within `keymap.c`.
|
||||
|
||||
|
||||
## Songs
|
||||
There's a couple of different sounds that will automatically be enabled without any other configuration:
|
||||
```
|
||||
STARTUP_SONG // plays when the keyboard starts up (audio.c)
|
||||
GOODBYE_SONG // plays when you press the RESET key (quantum.c)
|
||||
@@ -163,34 +67,15 @@ The available keycodes for audio are:
|
||||
* `AU_OFF` - Turn Audio Feature off
|
||||
* `AU_TOG` - Toggle Audio Feature state
|
||||
|
||||
!> These keycodes turn all of the audio functionality on and off. Turning it off means that audio feedback, audio clicky, music mode, etc. are disabled, completely.
|
||||
|
||||
## Tempo
|
||||
the 'speed' at which SONGs are played is dictated by the set Tempo, which is measured in beats-per-minute. Note lenghts are defined relative to that.
|
||||
The initial/default tempo is set to 120 bpm, but can be configured by setting `TEMPO_DEFAULT` in `config.c`.
|
||||
There is also a set of functions to modify the tempo from within the user/keymap code:
|
||||
```c
|
||||
void audio_set_tempo(uint8_t tempo);
|
||||
void audio_increase_tempo(uint8_t tempo_change);
|
||||
void audio_decrease_tempo(uint8_t tempo_change);
|
||||
```
|
||||
!> These keycodes turn all of the audio functionality on and off. Turning it off means that audio feedback, audio clicky, music mode, etc. are disabled, completely.
|
||||
|
||||
## ARM Audio Volume
|
||||
|
||||
For ARM devices, you can adjust the DAC sample values. If your board is too loud for you or your coworkers, you can set the max using `AUDIO_DAC_SAMPLE_MAX` in your `config.h`:
|
||||
For ARM devices, you can adjust the DAC sample values. If your board is too loud for you or your coworkers, you can set the max using `DAC_SAMPLE_MAX` in your `config.h`:
|
||||
|
||||
```c
|
||||
#define AUDIO_DAC_SAMPLE_MAX 4095U
|
||||
#define DAC_SAMPLE_MAX 65535U
|
||||
```
|
||||
the DAC usually runs in 12Bit mode, hence a volume of 100% = 4095U
|
||||
|
||||
Note: this only adjusts the volume aka 'works' if you stick to WAVEFORM_SQUARE, since its samples are generated on the fly - any other waveform uses a hardcoded/precomputed sample-buffer.
|
||||
|
||||
## Voices
|
||||
Aka "audio effects", different ones can be enabled by setting in `config.h` these defines:
|
||||
`#define AUDIO_VOICES` to enable the feature, and `#define AUDIO_VOICE_DEFAULT something` to select a specific effect
|
||||
for details see quantum/audio/voices.h and .c
|
||||
|
||||
|
||||
## Music Mode
|
||||
|
||||
@@ -330,6 +215,12 @@ This is still a WIP, but check out `quantum/process_keycode/process_midi.c` to s
|
||||
AU_OFF,
|
||||
AU_TOG,
|
||||
|
||||
#ifdef FAUXCLICKY_ENABLE
|
||||
FC_ON,
|
||||
FC_OFF,
|
||||
FC_TOG,
|
||||
#endif
|
||||
|
||||
// Music mode on/off/toggle
|
||||
MU_ON,
|
||||
MU_OFF,
|
||||
|
@@ -39,7 +39,7 @@ Not all keycodes below will work depending on which haptic mechanism you have ch
|
||||
|
||||
First you will need a build a circuit to drive the solenoid through a mosfet as most MCU will not be able to provide the current needed to drive the coil in the solenoid.
|
||||
|
||||
[Wiring diagram provided by Adafruit](https://cdn-shop.adafruit.com/product-files/412/solenoid_driver.pdf)
|
||||
[Wiring diagram provided by Adafruit](https://playground.arduino.cc/uploads/Learning/solenoid_driver.pdf)
|
||||
|
||||
|
||||
| Settings | Default | Description |
|
||||
|
@@ -92,7 +92,7 @@ void leader_start(void) {
|
||||
}
|
||||
|
||||
void leader_end(void) {
|
||||
// sequence ended (no success/failure detection)
|
||||
// sequence ended (no success/failuer detection)
|
||||
}
|
||||
```
|
||||
|
||||
|
@@ -10,11 +10,9 @@ If you want to use RGB LED's you should use the [RGB Matrix Subsystem](feature_r
|
||||
|
||||
There is basic support for addressable LED matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
LED_MATRIX_ENABLE = yes
|
||||
LED_MATRIX_DRIVER = IS31FL3731
|
||||
```
|
||||
|
||||
LED_MATRIX_ENABLE = yes
|
||||
LED_MATRIX_DRIVER = IS31FL3731
|
||||
|
||||
You can use between 1 and 4 IS31FL3731 IC's. Do not specify `LED_DRIVER_ADDR_<N>` defines for IC's that are not present on your keyboard. You can define the following items in `config.h`:
|
||||
|
||||
| Variable | Description | Default |
|
||||
@@ -22,7 +20,7 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `LED_DRIVER_ADDR_<N>
|
||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages | 100 |
|
||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `LED_DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
|
||||
| `DRIVER_LED_TOTAL` | (Required) How many LED lights are present across all drivers | |
|
||||
| `LED_DRIVER_LED_COUNT` | (Required) How many LED lights are present across all drivers | |
|
||||
| `LED_DRIVER_ADDR_1` | (Required) Address for the first LED driver | |
|
||||
| `LED_DRIVER_ADDR_2` | (Optional) Address for the second LED driver | |
|
||||
| `LED_DRIVER_ADDR_3` | (Optional) Address for the third LED driver | |
|
||||
@@ -30,38 +28,33 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `LED_DRIVER_ADDR_<N>
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
```c
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 0b1110100 AD <-> GND
|
||||
// 0b1110111 AD <-> VCC
|
||||
// 0b1110101 AD <-> SCL
|
||||
// 0b1110110 AD <-> SDA
|
||||
#define LED_DRIVER_ADDR_1 0b1110100
|
||||
#define LED_DRIVER_ADDR_2 0b1110110
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 0b1110100 AD <-> GND
|
||||
// 0b1110111 AD <-> VCC
|
||||
// 0b1110101 AD <-> SCL
|
||||
// 0b1110110 AD <-> SDA
|
||||
#define LED_DRIVER_ADDR_1 0b1110100
|
||||
#define LED_DRIVER_ADDR_2 0b1110110
|
||||
|
||||
#define LED_DRIVER_COUNT 2
|
||||
#define LED_DRIVER_1_LED_COUNT 25
|
||||
#define LED_DRIVER_2_LED_COUNT 24
|
||||
#define DRIVER_LED_TOTAL LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL
|
||||
```
|
||||
#define LED_DRIVER_COUNT 2
|
||||
#define LED_DRIVER_1_LED_COUNT 25
|
||||
#define LED_DRIVER_2_LED_COUNT 24
|
||||
#define LED_DRIVER_LED_COUNT LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL
|
||||
|
||||
Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
|
||||
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | LED address
|
||||
* | | */
|
||||
{ 0, C1_1 },
|
||||
{ 0, C1_15 },
|
||||
// ...
|
||||
}
|
||||
```
|
||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | LED address
|
||||
* | | */
|
||||
{0, C3_3},
|
||||
....
|
||||
}
|
||||
|
||||
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731-simple.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
|
||||
|
||||
@@ -73,28 +66,26 @@ All LED matrix keycodes are currently shared with the [backlight system](feature
|
||||
|
||||
Currently no LED matrix effects have been created.
|
||||
|
||||
## Custom Layer Effects
|
||||
## Custom layer effects
|
||||
|
||||
Custom layer effects can be done by defining this in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
void led_matrix_indicators_kb(void) {
|
||||
led_matrix_set_index_value(index, value);
|
||||
}
|
||||
```
|
||||
void led_matrix_indicators_kb(void) {
|
||||
led_matrix_set_index_value(index, value);
|
||||
}
|
||||
|
||||
A similar function works in the keymap as `led_matrix_indicators_user`.
|
||||
|
||||
## Suspended State
|
||||
## Suspended state
|
||||
|
||||
To use the suspend feature, add this to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
void suspend_power_down_kb(void) {
|
||||
led_matrix_set_suspend_state(true);
|
||||
}
|
||||
void suspend_power_down_kb(void)
|
||||
{
|
||||
led_matrix_set_suspend_state(true);
|
||||
}
|
||||
|
||||
void suspend_wakeup_init_kb(void) {
|
||||
led_matrix_set_suspend_state(false);
|
||||
}
|
||||
```
|
||||
void suspend_wakeup_init_kb(void)
|
||||
{
|
||||
led_matrix_set_suspend_state(false);
|
||||
}
|
||||
|
@@ -209,7 +209,7 @@ SEND_STRING(".."SS_TAP(X_END));
|
||||
|
||||
There are some functions you may find useful in macro-writing. Keep in mind that while you can write some fairly advanced code within a macro, if your functionality gets too complex you may want to define a custom keycode instead. Macros are meant to be simple.
|
||||
|
||||
?> You can also use the functions described in [Useful function](ref_functions.md) and [Checking modifier state](feature_advanced_keycodes#checking-modifier-state) for additional functionality. For example, `reset_keyboard()` allows you to reset the keyboard as part of a macro and `get_mods() & MOD_MASK_SHIFT` lets you check for the existence of active shift modifiers.
|
||||
?> You can also use the functions described in [Useful functions](ref_functions.md) for additional functionality. For example `reset_keyboard()` allows you to reset the keyboard as part of a macro.
|
||||
|
||||
### `record->event.pressed`
|
||||
|
||||
@@ -233,15 +233,9 @@ Parallel to `register_code` function, this sends the `<kc>` keyup event to the c
|
||||
|
||||
### `tap_code(<kc>);`
|
||||
|
||||
Sends `register_code(<kc>)` and then `unregister_code(<kc>)`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it).
|
||||
This will send `register_code(<kc>)` and then `unregister_code(<kc>)`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it).
|
||||
|
||||
If `TAP_CODE_DELAY` is defined (default 0), this function waits that many milliseconds before calling `unregister_code(<kc>)`. This can be useful when you are having issues with taps (un)registering.
|
||||
|
||||
If the keycode is `KC_CAPS`, it waits `TAP_HOLD_CAPS_DELAY` milliseconds instead (default 80), as macOS prevents accidental Caps Lock activation by waiting for the key to be held for a certain amount of time.
|
||||
|
||||
### `tap_code_delay(<kc>, <delay>);`
|
||||
|
||||
Like `tap_code(<kc>)`, but with a `delay` parameter for specifying arbitrary intervals before sending the unregister event.
|
||||
If you're having issues with taps (un)registering, you can add a delay between the register and unregister events by setting `#define TAP_CODE_DELAY 100` in your `config.h` file. The value is in milliseconds.
|
||||
|
||||
### `register_code16(<kc>);`, `unregister_code16(<kc>);` and `tap_code16(<kc>);`
|
||||
|
||||
|
@@ -27,10 +27,6 @@ Once you have made the necessary changes to the mouse report, you need to send i
|
||||
|
||||
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in `pointing_device_send()`, which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
|
||||
|
||||
Additionally, by default, `pointing_device_send()` will only send a report when the report has actually changed. This prevents it from continuously sending mouse reports, which will keep the host system awake. This behavior can be changed by creating your own `pointing_device_send()` function.
|
||||
|
||||
Also, you use the `has_mouse_report_changed(new, old)` function to check to see if the report has changed.
|
||||
|
||||
In the following example, a custom key is used to click the mouse and scroll 127 units vertically and horizontally, then undo all of that when released - because that's a totally useful function. Listen, this is an example:
|
||||
|
||||
```c
|
||||
|
@@ -281,10 +281,8 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
|
||||
|
||||
|Define |Description |
|
||||
|-------------------------------------------------------|-----------------------------------------------|
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_COLOR` |Disables `RGB_MATRIX_SOLID_COLOR` |
|
||||
|`#define DISABLE_RGB_MATRIX_ALPHAS_MODS` |Disables `RGB_MATRIX_ALPHAS_MODS` |
|
||||
|`#define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN` |Disables `RGB_MATRIX_GRADIENT_UP_DOWN` |
|
||||
|`#define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT` |Disables `MATRIX_GRADIENT_LEFT_RIGHT` |
|
||||
|`#define DISABLE_RGB_MATRIX_BREATHING` |Disables `RGB_MATRIX_BREATHING` |
|
||||
|`#define DISABLE_RGB_MATRIX_BAND_SAT` |Disables `RGB_MATRIX_BAND_SAT` |
|
||||
|`#define DISABLE_RGB_MATRIX_BAND_VAL` |Disables `RGB_MATRIX_BAND_VAL` |
|
||||
@@ -295,20 +293,20 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_ALL` |Disables `RGB_MATRIX_CYCLE_ALL` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT` |Disables `RGB_MATRIX_CYCLE_LEFT_RIGHT` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN` |Disables `RGB_MATRIX_CYCLE_UP_DOWN` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |Disables `RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN` |Disables `RGB_MATRIX_CYCLE_OUT_IN` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL` |Disables `RGB_MATRIX_CYCLE_OUT_IN_DUAL` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |Disables `RGB_MATRIX_RAINBOW_MOVING_CHEVRON` |
|
||||
|`#define DISABLE_RGB_MATRIX_DUAL_BEACON` |Disables `RGB_MATRIX_DUAL_BEACON` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL` |Disables `RGB_MATRIX_CYCLE_PINWHEEL` |
|
||||
|`#define DISABLE_RGB_MATRIX_CYCLE_SPIRAL` |Disables `RGB_MATRIX_CYCLE_SPIRAL` |
|
||||
|`#define DISABLE_RGB_MATRIX_DUAL_BEACON` |Disables `RGB_MATRIX_DUAL_BEACON` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_BEACON` |Disables `RGB_MATRIX_RAINBOW_BEACON` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS` |Disables `RGB_MATRIX_RAINBOW_PINWHEELS` |
|
||||
|`#define DISABLE_RGB_MATRIX_RAINDROPS` |Disables `RGB_MATRIX_RAINDROPS` |
|
||||
|`#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS` |Disables `RGB_MATRIX_JELLYBEAN_RAINDROPS` |
|
||||
|`#define DISABLE_RGB_MATRIX_TYPING_HEATMAP` |Disables `RGB_MATRIX_TYPING_HEATMAP` |
|
||||
|`#define DISABLE_RGB_MATRIX_DIGITAL_RAIN` |Disables `RGB_MATRIX_DIGITAL_RAIN` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |Disables `RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE` |Disables `RGB_MATRIX_SOLID_REACTIVE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |Disables `RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE` |Disables `RGB_MATRIX_SOLID_REACTIVE_WIDE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE` |Disables `RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE` |
|
||||
|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS` |Disables `RGB_MATRIX_SOLID_REACTIVE_CROSS` |
|
||||
|
@@ -82,20 +82,15 @@ Changing the **Value** sets the overall brightness.<br>
|
||||
|
||||
Your RGB lighting can be configured by placing these `#define`s in your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|---------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------------------|
|
||||
|`RGBLIGHT_HUE_STEP` |`10` |The number of steps to cycle through the hue by |
|
||||
|`RGBLIGHT_SAT_STEP` |`17` |The number of steps to increment the saturation by |
|
||||
|`RGBLIGHT_VAL_STEP` |`17` |The number of steps to increment the brightness by |
|
||||
|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
|
||||
|`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep |
|
||||
|`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added |
|
||||
|`RGBLIGHT_DISABLE_KEYCODES`|*Not defined* |If defined, disables the ability to control RGB Light from the keycodes. You must use code functions to control the feature|
|
||||
|`RGBLIGHT_DEFAULT_MODE` |`RGBLIGHT_MODE_STATIC_LIGHT`|The default mode to use upon clearing the EEPROM |
|
||||
|`RGBLIGHT_DEFAULT_HUE` |`0` (red) |The default hue to use upon clearing the EEPROM |
|
||||
|`RGBLIGHT_DEFAULT_SAT` |`UINT8_MAX` (255) |The default saturation to use upon clearing the EEPROM |
|
||||
|`RGBLIGHT_DEFAULT_VAL` |`RGBLIGHT_LIMIT_VAL` |The default value (brightness) to use upon clearing the EEPROM |
|
||||
|`RGBLIGHT_DEFAULT_SPD` |`0` |The default speed to use upon clearing the EEPROM |
|
||||
|Define |Default |Description |
|
||||
|---------------------|-------------|-----------------------------------------------------------------------------|
|
||||
|`RGBLIGHT_HUE_STEP` |`10` |The number of steps to cycle through the hue by |
|
||||
|`RGBLIGHT_SAT_STEP` |`17` |The number of steps to increment the saturation by |
|
||||
|`RGBLIGHT_VAL_STEP` |`17` |The number of steps to increment the brightness by |
|
||||
|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
|
||||
|`RGBLIGHT_SLEEP` |*Not defined*|If defined, the RGB lighting will be switched off when the host goes to sleep|
|
||||
|`RGBLIGHT_SPLIT` |*Not defined*|If defined, synchronization functionality for split keyboards is added|
|
||||
|`RGBLIGHT_DISABLE_KEYCODES`|*not defined*|If defined, disables the ability to control RGB Light from the keycodes. You must use code functions to control the feature|
|
||||
|
||||
## Effects and Animations
|
||||
|
||||
|
@@ -109,10 +109,6 @@ Normally, when a diode is connected to an intersection, it is judged to be left.
|
||||
#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT
|
||||
```
|
||||
|
||||
Note that adding a diode at a previously unused intersection will effectively tell the firmware that there is a key held down at that point. You can instruct qmk to ignore that intersection by defining `MATRIX_MASKED` and then defining a `matrix_row_t matrix_mask[MATRIX_ROWS]` array in your keyboard config. Each bit of a single value (starting form the least-significant bit) is used to tell qmk whether or not to pay attention to key presses at that intersection.
|
||||
|
||||
While `MATRIX_MASKED` isn't necessary to use `SPLIT_HAND_MATRIX_GRID` successfully, without it you may experience issues trying to suspend your computer with your keyboard attached as the matrix will always report at least one key-press.
|
||||
|
||||
#### Handedness by EEPROM
|
||||
|
||||
This method sets the keyboard's handedness by setting a flag in the persistent storage (`EEPROM`). This is checked when the controller first starts up, and determines what half the keyboard is, and how to orient the keyboard layout.
|
||||
@@ -195,12 +191,6 @@ communication protocol and may impact the matrix scan speed when enabled.
|
||||
The purpose of this feature is to support cosmetic use of modifer state (e.g.
|
||||
displaying status on an OLED screen).
|
||||
|
||||
```c
|
||||
#define SPLIT_TRANSPORT_MIRROR
|
||||
```
|
||||
|
||||
This mirrors the master side matrix to the slave side for features that react or require knowledge of master side key presses on the slave side. This adds a few bytes of data to the split communication protocol and may impact the matrix scan speed when enabled. The purpose of this feature is to support cosmetic use of key events (e.g. RGB reacting to Keypresses).
|
||||
|
||||
### Hardware Configuration Options
|
||||
|
||||
There are some settings that you may need to configure, based on how the hardware is set up.
|
||||
@@ -243,12 +233,7 @@ This sets how many LEDs are directly connected to each controller. The first nu
|
||||
```c
|
||||
#define SPLIT_USB_DETECT
|
||||
```
|
||||
|
||||
Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and theres's USB communication, then that half assumes it is the master, otherwise it assumes it is the slave.
|
||||
|
||||
Without this option, the master is the half that can detect voltage on the physical USB connection (VBUS detection).
|
||||
|
||||
Enabled by default on ChibiOS/ARM.
|
||||
This option changes the startup behavior to detect an active USB connection when delegating master/slave. If this operation times out, then the half is assume to be a slave. This is the default behavior for ARM, and required for AVR Teensy boards (due to hardware limitations).
|
||||
|
||||
?> This setting will stop the ability to demo using battery packs.
|
||||
|
||||
@@ -264,13 +249,9 @@ This sets the poll frequency when detecting master/slave when using `SPLIT_USB_D
|
||||
|
||||
## Hardware Considerations and Mods
|
||||
|
||||
Master/slave delegation is made either by detecting voltage on VBUS connection or waiting for USB communication (`SPLIT_USB_DETECT`). Pro Micro boards can use VBUS detection out of the box and be used with or without `SPLIT_USB_DETECT`.
|
||||
While most any Pro Micro can be used, micro controllers like the AVR Teensys and most (if not all) ARM boards require the Split USB Detect.
|
||||
|
||||
Many ARM boards, but not all, do not support VBUS detection. Because it is common that ARM boards lack VBUS detection, `SPLIT_USB_DETECT` is automatically defined on ARM targets (technically when ChibiOS is targetted).
|
||||
|
||||
### Teensy boards
|
||||
|
||||
Teensy boards lack VBUS detection out of the box and must have `SPLIT_USB_DETECT` defined. With the Teensy 2.0 and Teensy++ 2.0, there is a simple hardware mod that you can perform to add VBUS detection, so you don't need the `SPLIT_USB_DETECT` option.
|
||||
However, with the Teensy 2.0 and Teensy++ 2.0, there is a simple hardware mod that you can perform to add VBUS detection, so you don't need the Split USB detection option.
|
||||
|
||||
You'll only need a few things:
|
||||
|
||||
|
@@ -76,7 +76,7 @@ qk_tap_dance_action_t tap_dance_actions[] = {
|
||||
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
|
||||
};
|
||||
|
||||
// Add tap dance item to your keymap in place of a keycode
|
||||
// Add tap dance item in place of a key code
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
// ...
|
||||
TD(TD_ESC_CAPS)
|
||||
@@ -206,22 +206,20 @@ You will need a few things that can be used for 'Quad Function Tap-Dance'.
|
||||
You'll need to add these to the top of your `keymap.c` file, before your keymap.
|
||||
|
||||
```c
|
||||
typedef enum {
|
||||
TD_NONE,
|
||||
TD_UNKNOWN,
|
||||
TD_SINGLE_TAP,
|
||||
TD_SINGLE_HOLD,
|
||||
TD_DOUBLE_TAP,
|
||||
TD_DOUBLE_HOLD,
|
||||
TD_DOUBLE_SINGLE_TAP, // Send two single taps
|
||||
TD_TRIPLE_TAP,
|
||||
TD_TRIPLE_HOLD
|
||||
} td_state_t;
|
||||
|
||||
typedef struct {
|
||||
bool is_press_action;
|
||||
td_state_t state;
|
||||
} td_tap_t;
|
||||
uint8_t state;
|
||||
} tap;
|
||||
|
||||
enum {
|
||||
SINGLE_TAP = 1,
|
||||
SINGLE_HOLD,
|
||||
DOUBLE_TAP,
|
||||
DOUBLE_HOLD,
|
||||
DOUBLE_SINGLE_TAP, // Send two single taps
|
||||
TRIPLE_TAP,
|
||||
TRIPLE_HOLD
|
||||
};
|
||||
|
||||
// Tap dance enums
|
||||
enum {
|
||||
@@ -229,7 +227,7 @@ enum {
|
||||
SOME_OTHER_DANCE
|
||||
};
|
||||
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state);
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||
|
||||
// For the x tap dance. Put it here so it can be used in any keymap
|
||||
void x_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||
@@ -263,61 +261,61 @@ Now, at the bottom of your `keymap.c` file, you'll need to add the following:
|
||||
* Letters used in common words as a double. For example 'p' in 'pepper'. If a tap dance function existed on the
|
||||
* letter 'p', the word 'pepper' would be quite frustating to type.
|
||||
*
|
||||
* For the third point, there does exist the 'TD_DOUBLE_SINGLE_TAP', however this is not fully tested
|
||||
* For the third point, there does exist the 'DOUBLE_SINGLE_TAP', however this is not fully tested
|
||||
*
|
||||
*/
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
if (state->count == 1) {
|
||||
if (state->interrupted || !state->pressed) return TD_SINGLE_TAP;
|
||||
if (state->interrupted || !state->pressed) return SINGLE_TAP;
|
||||
// Key has not been interrupted, but the key is still held. Means you want to send a 'HOLD'.
|
||||
else return TD_SINGLE_HOLD;
|
||||
else return SINGLE_HOLD;
|
||||
} else if (state->count == 2) {
|
||||
// TD_DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
|
||||
// DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
|
||||
// action when hitting 'pp'. Suggested use case for this return value is when you want to send two
|
||||
// keystrokes of the key, and not the 'double tap' action/macro.
|
||||
if (state->interrupted) return TD_DOUBLE_SINGLE_TAP;
|
||||
else if (state->pressed) return TD_DOUBLE_HOLD;
|
||||
else return TD_DOUBLE_TAP;
|
||||
if (state->interrupted) return DOUBLE_SINGLE_TAP;
|
||||
else if (state->pressed) return DOUBLE_HOLD;
|
||||
else return DOUBLE_TAP;
|
||||
}
|
||||
|
||||
// Assumes no one is trying to type the same letter three times (at least not quickly).
|
||||
// If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add
|
||||
// an exception here to return a 'TD_TRIPLE_SINGLE_TAP', and define that enum just like 'TD_DOUBLE_SINGLE_TAP'
|
||||
// an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP'
|
||||
if (state->count == 3) {
|
||||
if (state->interrupted || !state->pressed) return TD_TRIPLE_TAP;
|
||||
else return TD_TRIPLE_HOLD;
|
||||
} else return TD_UNKNOWN;
|
||||
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
|
||||
else return TRIPLE_HOLD;
|
||||
} else return 8; // Magic number. At some point this method will expand to work for more presses
|
||||
}
|
||||
|
||||
// Create an instance of 'td_tap_t' for the 'x' tap dance.
|
||||
static td_tap_t xtap_state = {
|
||||
// Create an instance of 'tap' for the 'x' tap dance.
|
||||
static tap xtap_state = {
|
||||
.is_press_action = true,
|
||||
.state = TD_NONE
|
||||
.state = 0
|
||||
};
|
||||
|
||||
void x_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
xtap_state.state = cur_dance(state);
|
||||
switch (xtap_state.state) {
|
||||
case TD_SINGLE_TAP: register_code(KC_X); break;
|
||||
case TD_SINGLE_HOLD: register_code(KC_LCTRL); break;
|
||||
case TD_DOUBLE_TAP: register_code(KC_ESC); break;
|
||||
case TD_DOUBLE_HOLD: register_code(KC_LALT); break;
|
||||
case SINGLE_TAP: register_code(KC_X); break;
|
||||
case SINGLE_HOLD: register_code(KC_LCTRL); break;
|
||||
case DOUBLE_TAP: register_code(KC_ESC); break;
|
||||
case DOUBLE_HOLD: register_code(KC_LALT); break;
|
||||
// Last case is for fast typing. Assuming your key is `f`:
|
||||
// For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
|
||||
// In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
|
||||
case TD_DOUBLE_SINGLE_TAP: tap_code(KC_X); register_code(KC_X);
|
||||
case DOUBLE_SINGLE_TAP: tap_code(KC_X); register_code(KC_X);
|
||||
}
|
||||
}
|
||||
|
||||
void x_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||
switch (xtap_state.state) {
|
||||
case TD_SINGLE_TAP: unregister_code(KC_X); break;
|
||||
case TD_SINGLE_HOLD: unregister_code(KC_LCTRL); break;
|
||||
case TD_DOUBLE_TAP: unregister_code(KC_ESC); break;
|
||||
case TD_DOUBLE_HOLD: unregister_code(KC_LALT);
|
||||
case TD_DOUBLE_SINGLE_TAP: unregister_code(KC_X);
|
||||
case SINGLE_TAP: unregister_code(KC_X); break;
|
||||
case SINGLE_HOLD: unregister_code(KC_LCTRL); break;
|
||||
case DOUBLE_TAP: unregister_code(KC_ESC); break;
|
||||
case DOUBLE_HOLD: unregister_code(KC_LALT);
|
||||
case DOUBLE_SINGLE_TAP: unregister_code(KC_X);
|
||||
}
|
||||
xtap_state.state = TD_NONE;
|
||||
xtap_state.state = 0;
|
||||
}
|
||||
|
||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||
@@ -345,11 +343,9 @@ enum td_keycodes {
|
||||
|
||||
// Define a type containing as many tapdance states as you need
|
||||
typedef enum {
|
||||
TD_NONE,
|
||||
TD_UNKNOWN,
|
||||
TD_SINGLE_TAP,
|
||||
TD_SINGLE_HOLD,
|
||||
TD_DOUBLE_SINGLE_TAP
|
||||
SINGLE_TAP,
|
||||
SINGLE_HOLD,
|
||||
DOUBLE_SINGLE_TAP
|
||||
} td_state_t;
|
||||
|
||||
// Create a global instance of the tapdance state type
|
||||
@@ -358,7 +354,7 @@ static td_state_t td_state;
|
||||
// Declare your tapdance functions:
|
||||
|
||||
// Function to determine the current tapdance state
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state);
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||
|
||||
// `finished` and `reset` functions for each tapdance keycode
|
||||
void altlp_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||
@@ -369,14 +365,14 @@ Below your `LAYOUT`, define each of the tapdance functions:
|
||||
|
||||
```c
|
||||
// Determine the tapdance state to return
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
if (state->count == 1) {
|
||||
if (state->interrupted || !state->pressed) return TD_SINGLE_TAP;
|
||||
else return TD_SINGLE_HOLD;
|
||||
if (state->interrupted || !state->pressed) return SINGLE_TAP;
|
||||
else return SINGLE_HOLD;
|
||||
}
|
||||
|
||||
if (state->count == 2) return TD_DOUBLE_SINGLE_TAP;
|
||||
else return TD_UNKNOWN; // Any number higher than the maximum state value you return above
|
||||
if (state->count == 2) return DOUBLE_SINGLE_TAP;
|
||||
else return 3; // Any number higher than the maximum state value you return above
|
||||
}
|
||||
|
||||
// Handle the possible states for each tapdance keycode you define:
|
||||
@@ -384,13 +380,13 @@ td_state_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
void altlp_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
td_state = cur_dance(state);
|
||||
switch (td_state) {
|
||||
case TD_SINGLE_TAP:
|
||||
case SINGLE_TAP:
|
||||
register_code16(KC_LPRN);
|
||||
break;
|
||||
case TD_SINGLE_HOLD:
|
||||
case SINGLE_HOLD:
|
||||
register_mods(MOD_BIT(KC_LALT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here
|
||||
break;
|
||||
case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
|
||||
case DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
|
||||
tap_code16(KC_LPRN);
|
||||
register_code16(KC_LPRN);
|
||||
}
|
||||
@@ -398,13 +394,13 @@ void altlp_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
|
||||
void altlp_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||
switch (td_state) {
|
||||
case TD_SINGLE_TAP:
|
||||
case SINGLE_TAP:
|
||||
unregister_code16(KC_LPRN);
|
||||
break;
|
||||
case TD_SINGLE_HOLD:
|
||||
case SINGLE_HOLD:
|
||||
unregister_mods(MOD_BIT(KC_LALT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here
|
||||
break;
|
||||
case TD_DOUBLE_SINGLE_TAP:
|
||||
case DOUBLE_SINGLE_TAP:
|
||||
unregister_code16(KC_LPRN);
|
||||
}
|
||||
}
|
||||
@@ -424,19 +420,17 @@ Tap Dance can be used to mimic MO(layer) and TG(layer) functionality. For this e
|
||||
The first step is to include the following code towards the beginning of your `keymap.c`:
|
||||
|
||||
```c
|
||||
// Define a type for as many tap dance states as you need
|
||||
typedef enum {
|
||||
TD_NONE,
|
||||
TD_UNKNOWN,
|
||||
TD_SINGLE_TAP,
|
||||
TD_SINGLE_HOLD,
|
||||
TD_DOUBLE_TAP
|
||||
} td_state_t;
|
||||
|
||||
typedef struct {
|
||||
bool is_press_action;
|
||||
td_state_t state;
|
||||
} td_tap_t;
|
||||
uint8_t state;
|
||||
} tap;
|
||||
|
||||
// Define a type for as many tap dance states as you need
|
||||
enum {
|
||||
SINGLE_TAP = 1,
|
||||
SINGLE_HOLD,
|
||||
DOUBLE_TAP
|
||||
};
|
||||
|
||||
enum {
|
||||
QUOT_LAYR, // Our custom tap dance key; add any other tap dance keys to this enum
|
||||
@@ -445,7 +439,7 @@ enum {
|
||||
// Declare the functions to be used with your tap dance key(s)
|
||||
|
||||
// Function associated with all tap dances
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state);
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||
|
||||
// Functions associated with individual tap dances
|
||||
void ql_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||
@@ -456,31 +450,31 @@ Towards the bottom of your `keymap.c`, include the following code:
|
||||
|
||||
```c
|
||||
// Determine the current tap dance state
|
||||
td_state_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||
if (state->count == 1) {
|
||||
if (!state->pressed) return TD_SINGLE_TAP;
|
||||
else return TD_SINGLE_HOLD;
|
||||
} else if (state->count == 2) return TD_DOUBLE_TAP;
|
||||
else return TD_UNKNOWN;
|
||||
if (!state->pressed) return SINGLE_TAP;
|
||||
else return SINGLE_HOLD;
|
||||
} else if (state->count == 2) return DOUBLE_TAP;
|
||||
else return 8;
|
||||
}
|
||||
|
||||
// Initialize tap structure associated with example tap dance key
|
||||
static td_tap_t ql_tap_state = {
|
||||
static tap ql_tap_state = {
|
||||
.is_press_action = true,
|
||||
.state = TD_NONE
|
||||
.state = 0
|
||||
};
|
||||
|
||||
// Functions that control what our tap dance key does
|
||||
void ql_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
ql_tap_state.state = cur_dance(state);
|
||||
switch (ql_tap_state.state) {
|
||||
case TD_SINGLE_TAP:
|
||||
case SINGLE_TAP:
|
||||
tap_code(KC_QUOT);
|
||||
break;
|
||||
case TD_SINGLE_HOLD:
|
||||
case SINGLE_HOLD:
|
||||
layer_on(_MY_LAYER);
|
||||
break;
|
||||
case TD_DOUBLE_TAP:
|
||||
case DOUBLE_TAP:
|
||||
// Check to see if the layer is already set
|
||||
if (layer_state_is(_MY_LAYER)) {
|
||||
// If already set, then switch it off
|
||||
@@ -495,10 +489,10 @@ void ql_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||
|
||||
void ql_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||
// If the key was held down and now is released then switch off the layer
|
||||
if (ql_tap_state.state == TD_SINGLE_HOLD) {
|
||||
if (ql_tap_state.state == SINGLE_HOLD) {
|
||||
layer_off(_MY_LAYER);
|
||||
}
|
||||
ql_tap_state.state = TD_NONE;
|
||||
ql_tap_state.state = 0;
|
||||
}
|
||||
|
||||
// Associate our tap dance key with its functionality
|
||||
@@ -511,7 +505,7 @@ The above code is similar to that used in previous examples. The one point to no
|
||||
|
||||
The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
|
||||
|
||||
The `case: TD_SINGLE_TAP` in `ql_finished` is similar to the above examples. The `TD_SINGLE_HOLD` case works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `TD_DOUBLE_TAP` case works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
|
||||
The `case:SINGLE_TAP` in `ql_finished` is similar to the above examples. The `SINGLE_HOLD` case works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `DOUBLE_TAP` case works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
|
||||
|
||||
`tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (\~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
|
||||
|
||||
|
@@ -126,8 +126,6 @@ The following input modes are available:
|
||||
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
|
||||
By default, this mode uses Ctrl+Shift+U (`LCTL(LSFT(KC_U))`) to start Unicode input, but this can be changed by defining [`UNICODE_KEY_LNX`](#input-key-configuration) with a different keycode. This might be required for IBus versions ≥1.5.15, where Ctrl+Shift+U behavior is consolidated into Ctrl+Shift+E.
|
||||
|
||||
Users who wish support in non-GTK apps without IBus may need to resort to a more indirect method, such as creating a custom keyboard layout ([more on this method](#custom-linux-layout)).
|
||||
|
||||
* **`UC_WIN`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`.
|
||||
|
||||
To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Reboot afterwards.
|
||||
@@ -272,22 +270,3 @@ AutoHotkey inserts the Text right of `Send, ` when this combination is pressed.
|
||||
|
||||
If you enable the US International layout on the system, it will use punctuation to accent the characters. For instance, typing "\`a" will result in à.
|
||||
You can find details on how to enable this [here](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout).
|
||||
|
||||
## Software keyboard layout on Linux :id=custom-linux-layout
|
||||
|
||||
This method does not require Unicode support on the keyboard itself but instead uses a custom keyboard layout for Xorg. This is how special characters are inserted by regular keyboards. This does not require IBus and works in practically all software. Help on creating a custom layout can be found [here](https://www.linux.com/news/creating-custom-keyboard-layouts-x11-using-xkb/), [here](http://karols.github.io/blog/2013/11/18/creating-custom-keyboard-layouts-for-linux/) and [here](https://wiki.archlinux.org/index.php/X_keyboard_extension). An example of how you could edit the `us` layout to gain 🤣 on `RALT(KC_R)`:
|
||||
|
||||
Edit the keyboard layout file `/usr/share/X11/xkb/symbols/us`.
|
||||
|
||||
Inside `xkb_symbols "basic" {`, add `include "level3(ralt_switch)"`.
|
||||
|
||||
Find the line defining the R key and add an entry to the list, making it look like this:
|
||||
```
|
||||
key <AD04> { [ r, R, U1F923 ] };
|
||||
```
|
||||
|
||||
Save the file and run the command `setxkbmap us` to reload the layout.
|
||||
|
||||
You can define one custom character for key defined in the layout, and another if you populate the fourth layer. Additional layers up to 8th are also possible.
|
||||
|
||||
This method is specific to the computer on which you set the custom layout. The custom keys will be available only when Xorg is running. To avoid accidents, you should always reload the layout using `setxkbmap`, otherwise an invalid layout could prevent you from logging into your system, locking you out.
|
||||
|
@@ -4,9 +4,8 @@ This project includes a Docker workflow that will allow you to build a new firmw
|
||||
|
||||
## Requirements
|
||||
|
||||
The main prerequisite is a working `docker` or `podman` install.
|
||||
The main prerequisite is a working `docker` install.
|
||||
* [Docker CE](https://docs.docker.com/install/#supported-platforms)
|
||||
* [Podman](https://podman.io/getting-started/installation)
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -39,13 +38,6 @@ util/docker_build.sh
|
||||
# Reads parameters as input (leave blank for all keyboards/keymaps)
|
||||
```
|
||||
|
||||
You can manually set which container runtime you want to use by setting the `RUNTIME` environment variable to it's name or path.
|
||||
By default docker or podman are automatically detected and docker is preferred over podman.
|
||||
|
||||
```bash
|
||||
RUNTIME="podman" util/docker_build.sh keyboard:keymap:target
|
||||
```
|
||||
|
||||
## FAQ
|
||||
|
||||
### Why can't I flash on Windows/macOS
|
||||
|
@@ -121,6 +121,10 @@ For further details, as well as limitations, see the [Unicode page](feature_unic
|
||||
|
||||
This allows you output audio on the C6 pin (needs abstracting). See the [audio page](feature_audio.md) for more information.
|
||||
|
||||
`FAUXCLICKY_ENABLE`
|
||||
|
||||
Uses buzzer to emulate clicky switches. A cheap imitation of the Cherry blue switches. By default, uses the C6 pin, same as `AUDIO_ENABLE`.
|
||||
|
||||
`VARIABLE_TRACE`
|
||||
|
||||
Use this to debug changes to variable values, see the [tracing variables](unit_testing.md#tracing-variables) section of the Unit Testing page for more information.
|
||||
|
@@ -2,236 +2,132 @@
|
||||
|
||||
The I2C Master drivers used in QMK have a set of common functions to allow portability between MCUs.
|
||||
|
||||
## I2C Addressing :id=note-on-i2c-addresses
|
||||
## An important note on I2C Addresses :id=note-on-i2c-addresses
|
||||
|
||||
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
|
||||
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
|
||||
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
|
||||
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
|
||||
on datasheets and the internet will be represented as 7 bits occupying the lower 7 bits and will need to be
|
||||
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
|
||||
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
|
||||
|
||||
You can either do this on each call to the functions below, or once in your definition of the address. For example, if your device has an address of `0x18`:
|
||||
You can either do this on each call to the functions below, or once in your definition of the address. For example if your device has an address of `0x18`:
|
||||
|
||||
```c
|
||||
#define MY_I2C_ADDRESS (0x18 << 1)
|
||||
```
|
||||
`#define MY_I2C_ADDRESS (0x18 << 1)`
|
||||
|
||||
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
|
||||
|
||||
## AVR Configuration :id=avr-configuration
|
||||
## Available functions :id=available-functions
|
||||
|
||||
The following defines can be used to configure the I2C master driver:
|
||||
|Function |Description |
|
||||
|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`void i2c_init(void);` |Initializes the I2C driver. This function should be called once before any transaction is initiated. |
|
||||
|`i2c_status_t i2c_start(uint8_t address, uint16_t timeout);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. |
|
||||
|`i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. |
|
||||
|`i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. |
|
||||
|`i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. |
|
||||
|`i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_receive` function but `regaddr` sets from where in the slave the data will be read. |
|
||||
|`i2c_status_t i2c_stop(void);` |Ends an I2C transaction. |
|
||||
|
||||
|`config.h` Override|Description |Default |
|
||||
|-------------------|---------------------|--------|
|
||||
|`F_SCL` |Clock frequency in Hz|`400000`|
|
||||
### Function Return :id=function-return
|
||||
|
||||
No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU:
|
||||
All the above functions, except `void i2c_init(void);` return the following truth table:
|
||||
|
||||
|MCU |`SCL`|`SDA`|
|
||||
|------------------|-----|-----|
|
||||
|ATmega16/32U4 |`D0` |`D1` |
|
||||
|AT90USB64/128 |`D0` |`D1` |
|
||||
|ATmega32A |`C0` |`C1` |
|
||||
|ATmega328/P |`C5` |`C4` |
|
||||
|Return Constant |Value|Description |
|
||||
|--------------------|-----|--------------------------------|
|
||||
|`I2C_STATUS_SUCCESS`|0 |Operation executed successfully.|
|
||||
|`I2C_STATUS_ERROR` |-1 |Operation failed. |
|
||||
|`I2C_STATUS_TIMEOUT`|-2 |Operation timed out. |
|
||||
|
||||
?> The ATmega16/32U2 does not possess I2C functionality, and so cannot use this driver.
|
||||
|
||||
## ChibiOS/ARM Configuration :id=arm-configuration
|
||||
## AVR :id=avr
|
||||
|
||||
You'll need to determine which pins can be used for I2C -- a an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc.
|
||||
### Configuration :id=avr-configuration
|
||||
|
||||
To enable I2C, modify your board's `halconf.h` to enable I2C:
|
||||
The following defines can be used to configure the I2C master driver.
|
||||
|
||||
|Variable |Description |Default|
|
||||
|------------------|---------------------------------------------------|-------|
|
||||
|`F_SCL` |Clock frequency in Hz |400KHz |
|
||||
|
||||
AVRs usually have set GPIO which turn into I2C pins, therefore no further configuration is required.
|
||||
|
||||
## ARM :id=arm
|
||||
|
||||
For ARM the Chibios I2C HAL driver is under the hood.
|
||||
This section assumes an STM32 MCU.
|
||||
|
||||
### Configuration :id=arm-configuration
|
||||
|
||||
The configuration for ARM MCUs can be quite complex as often there are multiple I2C drivers which can be assigned to a variety of ports.
|
||||
|
||||
Firstly the `mcuconf.h` file must be setup to enable the necessary hardware drivers.
|
||||
|
||||
|Variable |Description |Default|
|
||||
|------------------------------|------------------------------------------------------------------------------------|-------|
|
||||
|`#STM32_I2C_USE_XXX` |Enable/Disable the hardware driver XXX (each driver should be explicitly listed) |FALSE |
|
||||
|`#STM32_I2C_BUSY_TIMEOUT` |Time in ms until the I2C command is aborted if no response is received |50 |
|
||||
|`#STM32_I2C_XXX_IRQ_PRIORITY` |Interrupt priority for hardware driver XXX (THIS IS AN EXPERT SETTING) |10 |
|
||||
|`#STM32_I2C_USE_DMA` |Enable/Disable the ability of the MCU to offload the data transfer to the DMA unit |TRUE |
|
||||
|`#STM32_I2C_XXX_DMA_PRIORITY` |Priority of DMA unit for hardware driver XXX (THIS IS AN EXPERT SETTING) |1 |
|
||||
|
||||
Secondly, in the `halconf.h` file, `#define HAL_USE_I2C` must be set to `TRUE`. This allows ChibiOS to load its I2C driver.
|
||||
|
||||
Lastly, we need to assign the correct GPIO pins depending on the I2C hardware driver we want to use.
|
||||
|
||||
By default the I2C1 hardware driver is assumed to be used. If another hardware driver is used, `#define I2C_DRIVER I2CDX` should be added to the `config.h` file with X being the number of hardware driver used. For example is I2C3 is enabled, the `config.h` file should contain `#define I2C_DRIVER I2CD3`. This aligns the QMK I2C driver with the Chibios I2C driver.
|
||||
|
||||
STM32 MCUs allows a variety of pins to be configured as I2C pins depending on the hardware driver used. By default B6 and B7 are set to I2C. You can use these defines to set your i2c pins:
|
||||
|
||||
| Variable | Description | Default |
|
||||
|--------------------------|----------------------------------------------------------------------------------------------|---------|
|
||||
| `I2C1_SCL_BANK` | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SCL | `GPIOB` |
|
||||
| `I2C1_SDA_BANK` | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SDA | `GPIOB` |
|
||||
| `I2C1_SCL` | The pin number for the SCL pin (0-15) | `6` |
|
||||
| `I2C1_SDA` | The pin number for the SDA pin (0-15) | `7` |
|
||||
| `I2C1_BANK` (deprecated) | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superceded by `I2C1_SCL_BANK`, `I2C1_SDA_BANK` | `GPIOB` |
|
||||
|
||||
The ChibiOS I2C driver configuration depends on STM32 MCU:
|
||||
|
||||
STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx and STM32L1xx use I2Cv1;
|
||||
STM32F0xx, STM32F3xx, STM32F7xx and STM32L4xx use I2Cv2;
|
||||
|
||||
#### I2Cv1 :id=i2cv1
|
||||
STM32 MCUs allow for different clock and duty parameters when configuring I2Cv1. These can be modified using the following parameters, using <https://www.playembedded.org/blog/stm32-i2c-chibios/#I2Cv1_configuration_structure> as a reference:
|
||||
|
||||
| Variable | Default |
|
||||
|--------------------|------------------|
|
||||
| `I2C1_OPMODE` | `OPMODE_I2C` |
|
||||
| `I2C1_CLOCK_SPEED` | `100000` |
|
||||
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
|
||||
|
||||
#### I2Cv2 :id=i2cv2
|
||||
STM32 MCUs allow for different timing parameters when configuring I2Cv2. These can be modified using the following parameters, using <https://www.st.com/en/embedded-software/stsw-stm32126.html> as a reference:
|
||||
|
||||
| Variable | Default |
|
||||
|-----------------------|---------|
|
||||
| `I2C1_TIMINGR_PRESC` | `15U` |
|
||||
| `I2C1_TIMINGR_SCLDEL` | `4U` |
|
||||
| `I2C1_TIMINGR_SDADEL` | `2U` |
|
||||
| `I2C1_TIMINGR_SCLH` | `15U` |
|
||||
| `I2C1_TIMINGR_SCLL` | `21U` |
|
||||
|
||||
STM32 MCUs allow for different "alternate function" modes when configuring GPIO pins. These are required to switch the pins used to I2Cv2 mode. See the respective datasheet for the appropriate values for your MCU.
|
||||
|
||||
| Variable | Default |
|
||||
|---------------------|---------|
|
||||
| `I2C1_SCL_PAL_MODE` | `4` |
|
||||
| `I2C1_SDA_PAL_MODE` | `4` |
|
||||
|
||||
#### Other :id=other
|
||||
You can also overload the `void i2c_init(void)` function, which has a weak attribute. If you do this the configuration variables above will not be used. Please consult the datasheet of your MCU for the available GPIO configurations. The following is an example initialization function:
|
||||
|
||||
```c
|
||||
#define HAL_USE_I2C TRUE
|
||||
```
|
||||
void i2c_init(void)
|
||||
{
|
||||
setPinInput(B6); // Try releasing special pins for a short time
|
||||
setPinInput(B7);
|
||||
wait_ms(10); // Wait for the release to happen
|
||||
|
||||
Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
|
||||
|
||||
```c
|
||||
#undef STM32_I2C_USE_I2C2
|
||||
#define STM32_I2C_USE_I2C2 TRUE
|
||||
```
|
||||
|
||||
|`mcuconf.h` Setting |Description |Default|
|
||||
|----------------------------|----------------------------------------------------------------------------------|-------|
|
||||
|`STM32_I2C_BUSY_TIMEOUT` |Time in milliseconds until the I2C command is aborted if no response is received |`50` |
|
||||
|`STM32_I2C_XXX_IRQ_PRIORITY`|Interrupt priority for hardware driver XXX (THIS IS AN EXPERT SETTING) |`10` |
|
||||
|`STM32_I2C_USE_DMA` |Enable/Disable the ability of the MCU to offload the data transfer to the DMA unit|`TRUE` |
|
||||
|`STM32_I2C_XXX_DMA_PRIORITY`|Priority of DMA unit for hardware driver XXX (THIS IS AN EXPERT SETTING) |`1` |
|
||||
|
||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||
|
||||
|`config.h` Overrride |Description |Default|
|
||||
|------------------------|-------------------------------------------------------------------------------------------|-------|
|
||||
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc. |`I2CD1`|
|
||||
|`I2C1_BANK` (deprecated)|The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superseded by `I2C1_SCL_BANK`/`I2C1_SDA_BANK`|`GPIOB`|
|
||||
|`I2C1_SCL_BANK` |The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SCL |`GPIOB`|
|
||||
|`I2C1_SCL` |The pin number for SCL (0-15) |`6` |
|
||||
|`I2C1_SCL_PAL_MODE` |The alternate function mode for SCL |`4` |
|
||||
|`I2C1_SDA_BANK` |The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SDA |`GPIOB`|
|
||||
|`I2C1_SDA` |The pin number for SDA (0-15) |`7` |
|
||||
|`I2C1_SDA_PAL_MODE` |The alternate function mode for SDA |`4` |
|
||||
|
||||
The following configuration values depend on the specific MCU in use.
|
||||
|
||||
### I2Cv1 :id=i2cv1
|
||||
|
||||
* STM32F1xx
|
||||
* STM32F2xx
|
||||
* STM32F4xx
|
||||
* STM32L0xx
|
||||
* STM32L1xx
|
||||
|
||||
See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#7_I2Cv1_configuration_structure) for the I2Cv1 configuration structure.
|
||||
|
||||
|`config.h` Override|Default |
|
||||
|-------------------|----------------|
|
||||
|`I2C1_OPMODE` |`OPMODE_I2C` |
|
||||
|`I2C1_CLOCK_SPEED` |`100000` |
|
||||
|`I2C1_DUTY_CYCLE` |`STD_DUTY_CYCLE`|
|
||||
|
||||
### I2Cv2 :id=i2cv2
|
||||
|
||||
* STM32F0xx
|
||||
* STM32F3xx
|
||||
* STM32F7xx
|
||||
* STM32L4xx
|
||||
|
||||
See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#8_I2Cv2_I2Cv3_configuration_structure) for the I2Cv2 configuration structure.
|
||||
|
||||
|`config.h` Override |Default|
|
||||
|---------------------|-------|
|
||||
|`I2C1_TIMINGR_PRESC` |`0U` |
|
||||
|`I2C1_TIMINGR_SCLDEL`|`7U` |
|
||||
|`I2C1_TIMINGR_SDADEL`|`0U` |
|
||||
|`I2C1_TIMINGR_SCLH` |`38U` |
|
||||
|`I2C1_TIMINGR_SCLL` |`129U` |
|
||||
|
||||
## Functions :id=functions
|
||||
|
||||
### `void i2c_init(void)`
|
||||
|
||||
Initialize the I2C driver. This function must be called only once, before any of the below functions can be called.
|
||||
|
||||
This function is weakly defined, meaning it can be overridden if necessary for your particular use case:
|
||||
|
||||
```c
|
||||
void i2c_init(void) {
|
||||
setPinInput(B6); // Try releasing special pins for a short time
|
||||
setPinInput(B7);
|
||||
wait_ms(10); // Wait for the release to happen
|
||||
|
||||
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function
|
||||
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function
|
||||
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function
|
||||
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_start(uint8_t address, uint16_t timeout)`
|
||||
|
||||
Start an I2C transaction.
|
||||
|
||||
#### Arguments
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically).
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout)`
|
||||
|
||||
Send multiple bytes to the selected I2C device.
|
||||
|
||||
#### Arguments
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t *data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)`
|
||||
|
||||
Receive multiple bytes from the selected SPI device.
|
||||
|
||||
#### Arguments
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t *data`
|
||||
A pointer to the buffer to read into.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
|
||||
|
||||
Writes to a register on the I2C device.
|
||||
|
||||
#### Arguments
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t regaddr`
|
||||
The register address to write to.
|
||||
- `uint8_t *data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
|
||||
|
||||
Reads from a register on the I2C device.
|
||||
|
||||
#### Arguments
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t regaddr`
|
||||
The register address to read from.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_stop(void)`
|
||||
|
||||
Stop the current I2C transaction.
|
||||
|
@@ -45,7 +45,6 @@ You'll need one of the following to actually perform the ISP flashing (followed
|
||||
|
||||
* [SparkFun PocketAVR](https://www.sparkfun.com/products/9825) - (USB Tiny)
|
||||
* [USBtinyISP AVR Programmer Kit](https://www.adafruit.com/product/46) - (USB Tiny)
|
||||
* [USBasp](https://www.fischl.de/usbasp/) - (usbasp)
|
||||
* [Teensy 2.0](https://www.pjrc.com/store/teensy.html) - (avrisp)
|
||||
* [Pro Micro](https://www.sparkfun.com/products/12640) - (avrisp)
|
||||
* [Bus Pirate](https://www.adafruit.com/product/237) - (buspirate)
|
||||
@@ -83,15 +82,6 @@ This is pretty straight-forward - we'll be connecting like-things to like-things
|
||||
PocketAVR VCC <-> Keyboard VCC
|
||||
PocketAVR GND <-> Keyboard GND
|
||||
|
||||
### USBasp
|
||||
|
||||
USBasp RST <-> Keyboard RESET
|
||||
USBasp SCLK <-> Keyboard B1 (SCLK)
|
||||
USBasp MOSI <-> Keyboard B2 (MOSI)
|
||||
USBasp MISO <-> Keyboard B3 (MISO)
|
||||
USBasp VCC <-> Keyboard VCC
|
||||
USBasp GND <-> Keyboard GND
|
||||
|
||||
### Teensy 2.0
|
||||
|
||||
Teensy B0 <-> Keyboard RESET
|
||||
|
@@ -1,155 +0,0 @@
|
||||
# ADC ドライバ
|
||||
|
||||
<!---
|
||||
original document: 0.10.52:docs/adc_driver.md
|
||||
git diff 0.10.52 HEAD -- docs/adc_driver.md | cat
|
||||
-->
|
||||
|
||||
QMK は対応している MCU のアナログ・デジタルコンバータ(ADC) を使用し、特定のピンの電圧を計測することができます。この機能はデジタル出力の[ロータリーエンコーダ](ja/feature_encoders.md)などではなく、アナログ計測が必要な可変抵抗器を使用したボリュームコントロールや Bluetooth キーボードのバッテリー残量表示などの実装に役立ちます。
|
||||
|
||||
このドライバは現在 AVR と一部の ARM デバイスをサポートしています。返される値は 0V と VCC (通常 AVR の場合は 5V または 3.3V、ARM の場合は 3.3V)の間でマッピングされた 10ビットの整数 (0-1023) ですが、ARM の場合、もしもより精度が必要であれば `#define` を使うと操作をより柔軟に制御できます。
|
||||
|
||||
## 使い方
|
||||
|
||||
このドライバを使うには、`rules.mk` に以下を追加します:
|
||||
|
||||
```make
|
||||
SRC += analog.c
|
||||
```
|
||||
|
||||
そして、コードの先頭に以下の include を置きます:
|
||||
|
||||
```c
|
||||
#include "analog.h"
|
||||
```
|
||||
|
||||
## チャンネル
|
||||
|
||||
### AVR
|
||||
|
||||
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328/P|
|
||||
|-------|-------------|-------------|---------|-----------|
|
||||
|0 |`F0` |`F0` |`A0` |`C0` |
|
||||
|1 |`F1` |`F1` |`A1` |`C1` |
|
||||
|2 |`F2` | |`A2` |`C2` |
|
||||
|3 |`F3` | |`A3` |`C3` |
|
||||
|4 |`F4` |`F4` |`A4` |`C4` |
|
||||
|5 |`F5` |`F5` |`A5` |`C5` |
|
||||
|6 |`F6` |`F6` |`A6` |* |
|
||||
|7 |`F7` |`F7` |`A7` |* |
|
||||
|8 | |`D4` | | |
|
||||
|9 | |`D6` | | |
|
||||
|10 | |`D7` | | |
|
||||
|11 | |`B4` | | |
|
||||
|12 | |`B5` | | |
|
||||
|13 | |`B6` | | |
|
||||
|
||||
<sup>\* ATmega328/P には余分な2つの ADC チャンネルがありますが、DIP ピンアウトには存在せず、GPIO ピンとは共有されません。これらに直接アクセスするために、`adc_read()` を使えます。
|
||||
|
||||
### ARM
|
||||
|
||||
これらのピンの一部は同じチャンネルを使って ADC 上でダブルアップされることに注意してください。これは、これらのピンがどちらかの ADC に使われる可能性があるからです。
|
||||
|
||||
また、F0 と F3 は異なるナンバリングスキーマを使うことに注意してください。F0 には1つの ADC があり、チャンネルは0から始まるインデックスですが、F3 には4つの ADC があり、チャンネルは1から始まるインデックスです。これは、F0 が ADC の `ADCv1` 実装を使用するのに対し、F3 が `ADCv3` 実装を使用するためです。
|
||||
|
||||
|ADC|Channel|STM32F0xx|STM32F3xx|
|
||||
|---|-------|---------|---------|
|
||||
|1 |0 |`A0` | |
|
||||
|1 |1 |`A1` |`A0` |
|
||||
|1 |2 |`A2` |`A1` |
|
||||
|1 |3 |`A3` |`A2` |
|
||||
|1 |4 |`A4` |`A3` |
|
||||
|1 |5 |`A5` |`F4` |
|
||||
|1 |6 |`A6` |`C0` |
|
||||
|1 |7 |`A7` |`C1` |
|
||||
|1 |8 |`B0` |`C2` |
|
||||
|1 |9 |`B1` |`C3` |
|
||||
|1 |10 |`C0` |`F2` |
|
||||
|1 |11 |`C1` | |
|
||||
|1 |12 |`C2` | |
|
||||
|1 |13 |`C3` | |
|
||||
|1 |14 |`C4` | |
|
||||
|1 |15 |`C5` | |
|
||||
|1 |16 | | |
|
||||
|2 |1 | |`A4` |
|
||||
|2 |2 | |`A5` |
|
||||
|2 |3 | |`A6` |
|
||||
|2 |4 | |`A7` |
|
||||
|2 |5 | |`C4` |
|
||||
|2 |6 | |`C0` |
|
||||
|2 |7 | |`C1` |
|
||||
|2 |8 | |`C2` |
|
||||
|2 |9 | |`C3` |
|
||||
|2 |10 | |`F2` |
|
||||
|2 |11 | |`C5` |
|
||||
|2 |12 | |`B2` |
|
||||
|2 |13 | | |
|
||||
|2 |14 | | |
|
||||
|2 |15 | | |
|
||||
|2 |16 | | |
|
||||
|3 |1 | |`B1` |
|
||||
|3 |2 | |`E9` |
|
||||
|3 |3 | |`E13` |
|
||||
|3 |4 | | |
|
||||
|3 |5 | | |
|
||||
|3 |6 | |`E8` |
|
||||
|3 |7 | |`D10` |
|
||||
|3 |8 | |`D11` |
|
||||
|3 |9 | |`D12` |
|
||||
|3 |10 | |`D13` |
|
||||
|3 |11 | |`D14` |
|
||||
|3 |12 | |`B0` |
|
||||
|3 |13 | |`E7` |
|
||||
|3 |14 | |`E10` |
|
||||
|3 |15 | |`E11` |
|
||||
|3 |16 | |`E12` |
|
||||
|4 |1 | |`E14` |
|
||||
|4 |2 | |`B12` |
|
||||
|4 |3 | |`B13` |
|
||||
|4 |4 | |`B14` |
|
||||
|4 |5 | |`B15` |
|
||||
|4 |6 | |`E8` |
|
||||
|4 |7 | |`D10` |
|
||||
|4 |8 | |`D11` |
|
||||
|4 |9 | |`D12` |
|
||||
|4 |10 | |`D13` |
|
||||
|4 |11 | |`D14` |
|
||||
|4 |12 | |`D8` |
|
||||
|4 |13 | |`D9` |
|
||||
|4 |14 | | |
|
||||
|4 |15 | | |
|
||||
|4 |16 | | |
|
||||
|
||||
## 関数
|
||||
|
||||
### AVR
|
||||
|
||||
|関数 |説明 |
|
||||
|----------------------------|------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`analogReference(mode)` |アナログの電圧リファレンスソースを設定する。`ADC_REF_EXTERNAL`、`ADC_REF_POWER`、`ADC_REF_INTERNAL` のいずれかでなければなりません。|
|
||||
|`analogReadPin(pin)` |指定されたピンから値を読み取ります。例えば、ATmega32U4 の ADC6 の場合 `F6`。 |
|
||||
|`pinToMux(pin)` |指定されたピンを mux 値に変換します。サポートされていないピンが指定された場合、"0V (GND)" の mux 値を返します。 |
|
||||
|`adc_read(mux)` |指定された mux に従って ADC から値を読み取ります。詳細は、MCU のデータシートを見てください。 |
|
||||
|
||||
### ARM
|
||||
|
||||
|関数 |説明 |
|
||||
|----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`analogReadPin(pin)` |指定されたピンから値を読み取ります。STM32F0 では チャンネル 0 の `A0`、STM32F3 ではチャンネル 1 の ADC1。ピンを複数の ADC に使える場合は、この関数のために番号の小さい ADC が選択されることに注意してください。例えば、`C0` は、ADC2 にも使える場合、ADC1 のチャンネル 6 になります。 |
|
||||
|`analogReadPinAdc(pin, adc)`|指定されたピンと ADC から値を読み取ります。例えば、`C0, 1` は、ADC1 ではなく ADC2 のチャンネル 6 から読み取ります。この関数では、ADC はインデックス 0 から始まることに注意してください。 |
|
||||
|`pinToMux(pin)` |指定されたピンをチャンネルと ADC の組み合わせに変換します。サポートされていないピンが指定された場合、"0V (GND)" の mux 値を返します。 |
|
||||
|`adc_read(mux)` |指定されたピンと ADC の組み合わせに応じて ADC から値を読み取ります。詳細は、MCU のデータシートを見てください。 |
|
||||
|
||||
## 設定
|
||||
|
||||
## ARM
|
||||
|
||||
ADC の ARM 実装には、独自のキーボードとキーマップでオーバーライドして動作方法を変更できる幾つかの追加オプションがあります。利用可能なオプションの詳細については、特定のマイクロコントローラについて ChibiOS の対応する `hal_adc_lld.h` を調べてください。
|
||||
|
||||
|`#define` |型 |既定値 |説明 |
|
||||
|---------------------|------|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`ADC_CIRCULAR_BUFFER`|`bool`|`false` |`true` の場合、この実装は循環バッファを使います。 |
|
||||
|`ADC_NUM_CHANNELS` |`int` |`1` |ADC 動作の一部としてスキャンされるチャンネル数を設定します。現在の実装は `1` のみをサポートします。 |
|
||||
|`ADC_BUFFER_DEPTH` |`int` |`2` |各結果の深さを設定します。デフォルトでは12ビットの結果しか取得できないため、これを2バイトに設定して1つの値を含めることができます。8ビット以下の結果を選択した場合は、これを 1 に設定できます。 |
|
||||
|`ADC_SAMPLING_RATE` |`int` |`ADC_SMPR_SMP_1P5` |ADC のサンプリングレートを設定します。デフォルトでは、最も速い設定に設定されています。 |
|
||||
|`ADC_RESOLUTION` |`int` |`ADC_CFGR1_RES_12BIT`|結果の分解能。デフォルトでは12ビットを選択しますが、12、10、8、6ビットを選択できます。 |
|
@@ -31,10 +31,6 @@ QMK は十分な容量のフラッシュメモリを備えた USB 対応 AVR ま
|
||||
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
||||
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
||||
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
||||
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
||||
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
||||
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
||||
|
||||
### NXP (Kinetis)
|
||||
|
||||
|
@@ -220,6 +220,12 @@ const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_4x12(
|
||||
AU_OFF,
|
||||
AU_TOG,
|
||||
|
||||
#ifdef FAUXCLICKY_ENABLE
|
||||
FC_ON,
|
||||
FC_OFF,
|
||||
FC_TOG,
|
||||
#endif
|
||||
|
||||
// Music mode on/off/toggle
|
||||
MU_ON,
|
||||
MU_OFF,
|
||||
|
@@ -25,7 +25,7 @@ I2C IS31FL3731 RGB コントローラを使ったアドレス指定可能な LED
|
||||
| `ISSI_TIMEOUT` | (オプション) i2c メッセージを待つ時間 | 100 |
|
||||
| `ISSI_PERSISTENCE` | (オプション) 失敗したメッセージをこの回数再試行する | 0 |
|
||||
| `LED_DRIVER_COUNT` | (必須) LED ドライバ IC の数 | |
|
||||
| `DRIVER_LED_TOTAL` | (必須) 全てのドライバの LED ライトの数 | |
|
||||
| `LED_DRIVER_LED_COUNT` | (必須) 全てのドライバの LED ライトの数 | |
|
||||
| `LED_DRIVER_ADDR_1` | (必須) 最初の LED ドライバのアドレス | |
|
||||
| `LED_DRIVER_ADDR_2` | (オプション) 2番目の LED ドライバのアドレス | |
|
||||
| `LED_DRIVER_ADDR_3` | (オプション) 3番目の LED ドライバのアドレス | |
|
||||
@@ -46,7 +46,7 @@ I2C IS31FL3731 RGB コントローラを使ったアドレス指定可能な LED
|
||||
#define LED_DRIVER_COUNT 2
|
||||
#define LED_DRIVER_1_LED_COUNT 25
|
||||
#define LED_DRIVER_2_LED_COUNT 24
|
||||
#define DRIVER_LED_TOTAL LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL
|
||||
#define LED_DRIVER_LED_COUNT LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL
|
||||
|
||||
現在、2つのドライバのみがサポートされますが、4つの組み合わせ全てをサポートすることは簡単です。
|
||||
|
||||
|
@@ -1,277 +0,0 @@
|
||||
# Unicode サポート
|
||||
|
||||
<!---
|
||||
original document: 0.10.53:docs/feature_unicode.md
|
||||
git diff 0.10.53 HEAD -- docs/feature_unicode.md | cat
|
||||
-->
|
||||
|
||||
Unicode 文字はキーボードから直接入力することができます!ただし幾つかの制限があります。
|
||||
|
||||
キーボードで Unicode サポートを有効にするには、以下の事をする必要があります:
|
||||
|
||||
1. サポートされている Unicode 実装のいずれかを選択します: [Basic Unicode](#basic-unicode)、[Unicode Map](#unicode-map)、[UCIS](#ucis)。
|
||||
2. オペレーティングシステムとセットアップに最適な[入力モード](#input-modes)を見つけます。
|
||||
3. コンフィギュレーションに適切な入力モード(または複数のモード)を[設定](#setting-the-input-mode)します。
|
||||
4. キーマップに Unicode キーコードを追加します。
|
||||
|
||||
|
||||
## 1. メソッド :id=methods
|
||||
|
||||
QMK は、Unicode 入力を有効にし、キーマップに Unicode 文字を追加するための3つの異なる方法をサポートします。それぞれに柔軟性と使いやすさの点で長所と短所があります。あなたの使い方に最適なものを選んでください。
|
||||
|
||||
ほとんどのユーザには Basic Unicode で十分です。ただし、サポートされる文字の範囲が広い(絵文字、珍しい記号など)ことが必要な場合には、Unicode Map を使う必要があります。
|
||||
|
||||
<br>
|
||||
|
||||
### 1.1. Basic Unicode :id=basic-unicode
|
||||
|
||||
多少制限はありますが、最も使いやすい方法です。Unicode 文字をキーコードとしてキーマップ自体に格納するため、`0x7FFF` までのコードポイントのみをサポートします。これは、ほとんどの現代言語(東アジアを含む)の文字と記号を対象としますが、絵文字は対象外です。
|
||||
|
||||
以下を `rules.mk` に追加します:
|
||||
|
||||
```make
|
||||
UNICODE_ENABLE = yes
|
||||
```
|
||||
|
||||
次に、`UC(c)` キーコードをキーマップに追加します。ここで、_c_ は目的の文字のコードポイントです (できれば16進数で最大4桁の長さが望ましいです)。例えば、`UC(0x40B)` は [Ћ](https://unicode-table.com/en/040B/) を出力し、`UC(0x30C4)` は [ツ](https://unicode-table.com/en/30C4) を出力します。
|
||||
|
||||
<br>
|
||||
|
||||
### 1.2. Unicode Map :id=unicode-map
|
||||
|
||||
このメソッドは、標準の文字の範囲に加えて、絵文字、古代文字、珍しい記号なども対象にしています。実際、可能な全てのコードポイント(`0x10FFFF`まで)がサポートされています。Unicode 文字は独立のマッピングテーブルに格納されています。キーマップファイルに `unicode_map` 配列を維持する必要があります。これには最大 16384 エントリを含めることができます。
|
||||
|
||||
以下を `rules.mk` に追加します:
|
||||
|
||||
```make
|
||||
UNICODEMAP_ENABLE = yes
|
||||
```
|
||||
|
||||
次に、`X(i)` キーコードをキーマップに追加します。ここで _i_ はマッピングテーブル内の目的の文字のインデックスです。これは数値にできますが、インデックスを列挙型に保持し、名前でアクセスすることをお勧めします。
|
||||
|
||||
```c
|
||||
enum unicode_names {
|
||||
BANG,
|
||||
IRONY,
|
||||
SNEK
|
||||
};
|
||||
|
||||
const uint32_t PROGMEM unicode_map[] = {
|
||||
[BANG] = 0x203D, // ‽
|
||||
[IRONY] = 0x2E2E, // ⸮
|
||||
[SNEK] = 0x1F40D, // 🐍
|
||||
};
|
||||
```
|
||||
|
||||
そして、キーマップで `X(BANG)`、`X(SNEK)` などを使うことができます。
|
||||
|
||||
#### 小文字と大文字
|
||||
|
||||
文字は å や Å のような小文字と大文字のペアで提供されることがあります。これらの文字を入力しやすくするために、キーマップで `XP(i, j)` を使うことができます。ここで、_i_ および _j_ はそれぞれ小文字と大文字のマッピングテーブルのインデックスです。キーを押した時に、シフトを押したままか Caps Lock をオンにしている場合は、2番目(大文字)の文字が挿入されます; そうでなければ最初(小文字)バージョンが出力されます。
|
||||
|
||||
これは特殊文字がある国際レイアウトのためのキーマップを作成している時に最も役立ちます。別々のキーに文字の小文字および大文字バージョンを置く代わりに、`XP()` を使ってそれら両方を同じキーに持つことができます。これは Unicode キーを通常のアルファベットと混ぜるのに役立ちます。
|
||||
|
||||
キーコードのサイズの制約により、_i_ と _j_ はそれぞれ `unicode_map` の最初の128文字のうち1つだけを参照できます。別の言い方をすると、0 ≤ _i_ ≤ 127 かつ 0 ≤ _j_ ≤ 127 です。これはほとんどのユースケースで十分ですが、インデックス計算をカスタマイズしたい場合は、[`unicodemap_index()`](https://github.com/qmk/qmk_firmware/blob/71f640d47ee12c862c798e1f56392853c7b1c1a8/quantum/process_keycode/process_unicodemap.c#L36) 関数をオーバーライドすることができます。これにより、例えば Shift/Caps の代わりに Ctrl をチェックすることもできます。
|
||||
|
||||
<br>
|
||||
|
||||
### 1.3. UCIS :id=ucis
|
||||
|
||||
この方法も全ての可能なコードポイントをサポートします。Unicode Map の方法と同様に、キーマップファイル内にマッピングテーブルを保持する必要があります。ただし、この機能のための組み込みのキーコードはありません — この機能を起動するカスタムキーコードあるいは関数を作成する必要があります。
|
||||
|
||||
以下を `rules.mk` に追加します:
|
||||
|
||||
```make
|
||||
UCIS_ENABLE = yes
|
||||
```
|
||||
|
||||
次に、キーマップファイルでこのようにテーブルを定義します:
|
||||
|
||||
```c
|
||||
const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE(
|
||||
UCIS_SYM("poop", 0x1F4A9), // 💩
|
||||
UCIS_SYM("rofl", 0x1F923), // 🤣
|
||||
UCIS_SYM("cuba", 0x1F1E8, 0x1F1FA), // 🇨🇺
|
||||
UCIS_SYM("look", 0x0CA0, 0x005F, 0x0CA0), // ಠ_ಠ
|
||||
);
|
||||
```
|
||||
|
||||
デフォルトでは、各テーブルエントリの長さは、最大3コードポイントです。この番号は `#define UCIS_MAX_CODE_POINTS n` を `config.h` ファイルに追加することで変更できます。
|
||||
|
||||
UCIS 入力を使うには、`qk_ucis_start()` を呼び出します。次に、文字のニーモニック ("rofl" など) を入力し、Space か Enter か Esc を押します。QMK は "rofl" テキストを消去し、笑っている絵文字を挿入するはずです。
|
||||
|
||||
#### カスタマイズ
|
||||
|
||||
この機能をカスタマイズするためにキーマップで定義できる幾つかの関数があります。
|
||||
|
||||
* `void qk_ucis_start_user(void)` – これは "start" 関数を呼び出す時に実行され、フィードバックを提供するために使うことができます。デフォルトでは、キーボードの絵文字を入力します。
|
||||
* `void qk_ucis_success(uint8_t symbol_index)` – これは入力が何かに一致して完了した時に実行されます。デフォルトでは何もしません。
|
||||
* `void qk_ucis_symbol_fallback (void)` – これは入力が何にも一致しない時に実行されます。デフォルトでは、入力を Unicode コードとして試そうとします。
|
||||
|
||||
[`process_ucis.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_ucis.c) でこれらの関数のデフォルトの実装を見つけることができます。
|
||||
|
||||
|
||||
## 2. Input モード :id=input-modes
|
||||
|
||||
QMK での Unicode の入力は、マクロのように、OS への一連の文字列を入力することで動作します。残念ながら、これが行われる方法はプラットフォームによって異なります。特に各プラットフォームでは Unicode 入力を引き起こすために、異なるキーの組み合わせが必要です。従って、対応する入力モードが QMK で設定されなければなりません。
|
||||
|
||||
以下の入力モードが利用可能です:
|
||||
|
||||
* **`UC_MAC`**: macOS の組み込み Unicode 16進数入力。`0x10FFFF` までのコードポイント(全ての利用可能なコードポイント)をサポートします。
|
||||
|
||||
有効にするには、_システム環境設定 > キーボード > 入力ソース_ に移動し、(_その他_ の下の) _Unicode 16進数入力_ をリストに追加し、次にメニューバーの入力ドロップダウンからそれをアクティブにします。
|
||||
デフォルトでは、このモードは Unicode 入力のために左 Option キー (`KC_LALT`) を使いますが、これは他のキーで [`UNICODE_KEY_MAC`](#input-key-configuration) を定義することで変更できます。
|
||||
|
||||
!> _Unicode 16進数入力_ 入力ソースの使用は、Option + 左矢印および Option + 右矢印 のような、幾つかの Option ベースのショートカットを無効にするかもしれません。
|
||||
|
||||
!> `UC_OSX` は `UC_MAC` の非推奨のエイリアスで、QMK の将来のバージョンで削除されます。全ての新しいキーマップは、`UC_MAC` を使うべきです。
|
||||
|
||||
* **`UC_LNX`**: Linux の組み込み IBus Unicode 入力。`0x10FFFF` までのコードポイント(全ての利用可能なコードポイント)をサポートします。
|
||||
|
||||
デフォルトで有効になっていて、IBus が有効になったディストリビューションのほとんどどれでも動作します。IBus が無い場合、このモードは GTK アプリ下で動作しますが、他の場所ではほとんど動作しません。
|
||||
デフォルトでは、このモードは Unicode 入力を開始するために Ctrl+Shift+U (`LCTL(LSFT(KC_U))`) を使いますが、これは他のキーコードで [`UNICODE_KEY_LNX`](#input-key-configuration) を定義することで変更できます。これは、Ctrl+Shift+U の挙動が Ctrl+Shift+E に統合された IBus バージョン 1.5.15 以上を必要とするかもしれません。
|
||||
|
||||
* **`UC_WIN`**: _(非推奨)_ Windows の組み込み16進数テンキー Unicode 入力。`0xFFFF` までのコードポイントをサポートします。
|
||||
|
||||
有効にするには、`HKEY_CURRENT_USER\Control Panel\Input Method` の下に、`EnableHexNumpad` という名前の `REG_SZ` 型のレジストリキーを作成し、その値を `1` に設定します。これは、管理者権限でコマンドラインプロンプトから `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` を実行することでできます。その後再起動します。
|
||||
信頼性と互換性の問題から、このモードはお勧めできません; 代わりに `UC_WINC` モードを使ってください。
|
||||
|
||||
* **`UC_BSD`**: _(未実装)_ BSD での Unicode 入力。現時点では実装されていません。BSD ユーザでサポートを追加したい場合は、[GitHub で issue を開いて](https://github.com/qmk/qmk_firmware/issues)ください。
|
||||
|
||||
* **`UC_WINC`**: [WinCompose](https://github.com/samhocevar/wincompose) を使った Windows Unicode 入力。v0.9.0 の時点で、`0x10FFFF` までのコードポイント(全ての利用可能なコードポイント)をサポートします。
|
||||
|
||||
有効にするには、[最新のリリース](https://github.com/samhocevar/wincompose/releases/latest)をインストールします。インストールすると、起動時に WinCompose が自動的に実行されます。このモードはアプリがサポートする全てのバージョンの Windows で確実に動作します。
|
||||
デフォルトでは、このモードは Compose キーとして右 Alt (`KC_RALT`) を使いますが、これは WinCompose 設定と他のキーで [`UNICODE_KEY_WINC`](#input-key-configuration) を定義することで変更できます。
|
||||
|
||||
|
||||
## 3. 入力モードの設定 :id=setting-the-input-mode
|
||||
|
||||
目的の入力モードを設定するには、以下の定義を `config.h` に追加します:
|
||||
|
||||
```c
|
||||
#define UNICODE_SELECTED_MODES UC_LNX
|
||||
```
|
||||
|
||||
この例では、キーボードのデフォルトの入力モードを `UC_LNX` に設定します。これは、`UC_MAC` か `UC_WINC` か[上記](#input-modes)に列挙されている他のモードのいずれかに置き換えることができます。手動で別のモード([下記](#keycodes)を見てください)に切り替えない限り、キーボードは起動時に選択したモードを自動的に使います。
|
||||
|
||||
複数の入力モードを選択することもできます。これにより、`UC_MOD`/`UC_RMOD` キーコードを使ってそれらを簡単に切り替えることができます。
|
||||
|
||||
```c
|
||||
#define UNICODE_SELECTED_MODES UC_MAC, UC_LNX, UC_WINC
|
||||
```
|
||||
|
||||
値はカンマで区切られていることに注意してください。キーボードは最後に使われた入力モードを記憶し、次の電源投入時にそれを使い続けます。`config.h` に `#define UNICODE_CYCLE_PERSIST false` を追加することで、これを無効にして常にリストの最初のモードで開始するように強制できます。
|
||||
|
||||
#### キーコード
|
||||
|
||||
以下のキーコードを使って、いつでも入力モードを切り替えることができます。これらをキーマップに追加すると、`UNICODE_SELECTED_MODES` に列挙されていないモードを含む特定の入力モードに素早く切り替えることができます。
|
||||
|
||||
| キーコード |エイリアス | 入力モード | 説明 |
|
||||
|------------------------|-----------|--------------|--------------------------------------------------------------------|
|
||||
| `UNICODE_MODE_FORWARD` | `UC_MOD` | リストの次へ | 選択したモードを切り替えます。Shift が押された場合は逆方向 |
|
||||
| `UNICODE_MODE_REVERSE` | `UC_RMOD` | リストの前へ | 逆方向に選択したモードを切り替えます。Shift が押された場合は順方向 |
|
||||
| `UNICODE_MODE_MAC` | `UC_M_MA` | `UC_MAC` | macOS 入力に切り替え |
|
||||
| `UNICODE_MODE_LNX` | `UC_M_LN` | `UC_LNX` | Linux 入力に切り替え |
|
||||
| `UNICODE_MODE_WIN` | `UC_M_WI` | `UC_WIN` | Windows 入力に切り替え |
|
||||
| `UNICODE_MODE_BSD` | `UC_M_BS` | `UC_BSD` | BSD 入力に切り替え _(未実装)_ |
|
||||
| `UNICODE_MODE_WINC` | `UC_M_WC` | `UC_WINC` | WinCompose を使う Windows 入力に切り替え |
|
||||
|
||||
コード内で `set_unicode_input_mode(x)` を呼び出すことで、入力モードを切り替えることもできます。ここで、_x_ は上記の入力モード定数のいずれか (例えば、`UC_LNX`) です。
|
||||
|
||||
?> `matrix_init_user()` または同様の関数の中で `set_unicode_input_mode()` を呼び出すよりも、`UNICODE_SELECTED_MODES` を使うほうが望ましいです。Unicode システムとの統合性が高く、EEPROM への不要な書き込みを回避できるという利点があるからです。
|
||||
|
||||
#### オーディオフィードバック
|
||||
|
||||
キーボードで[オーディオ機能](ja/feature_audio.md)を有効にした場合、上記のキーを押したときにメロディーを再生するように設定できます。そのようにして、入力モードを切り替えた時になんらかのオーディオフィードバックを得ることができます。
|
||||
|
||||
例えば、`config.h` ファイルに下記の定義を追加することができます:
|
||||
|
||||
```c
|
||||
#define UNICODE_SONG_MAC AUDIO_ON_SOUND
|
||||
#define UNICODE_SONG_LNX UNICODE_LINUX
|
||||
#define UNICODE_SONG_BSD TERMINAL_SOUND
|
||||
#define UNICODE_SONG_WIN UNICODE_WINDOWS
|
||||
#define UNICODE_SONG_WINC UNICODE_WINDOWS
|
||||
```
|
||||
|
||||
|
||||
## 追加のカスタマイズ
|
||||
|
||||
Unicode は大規模で多目的な機能のため、システムでより適切に動作するようにカスタマイズできるオプションが幾つかあります。
|
||||
|
||||
### 入力関数の開始と終了
|
||||
|
||||
プラットフォームで Unicode 入力を開始および終了する機能は、ローカルで上書きできます。可能な用途には、デフォルトキーを使用しない場合の入力モードの挙動のカスタマイズ、あるいは Unicode 入力への視覚/音声フィードバックの追加があります。
|
||||
|
||||
* `void unicode_input_start(void)` – これはプラットフォームに Unicode 入力モードの入力を指示する初期シーケンスを送信します。例えば、Windows では左 Alt キーの後に Num+ を押したままにし、Linux では `UNICODE_KEY_LNX` の組み合わせ(デフォルト: Ctrl+Shift+U) を押します。
|
||||
* `void unicode_input_finish(void)` – これは、例えば Space を押すか Alt キーを放すなどして、Unicode 入力モードを終了するために呼ばれます。
|
||||
|
||||
[`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c) でこれらの関数のデフォルトの実装を見つけることができます。
|
||||
|
||||
### 入力キーの設定
|
||||
|
||||
`config.h` に対応する定義を追加することで、macOS、Linux、WinCompose で Unicode 入力を引き起こすために使われるキーをカスタマイズできます。デフォルト値はプラットフォームのデフォルト設定に一致するため、Unicode 入力が動作しない、あるいは(例えば左あるいは右 Alt を解放するために)異なるキーを使いたい場合以外はこれを変更する必要はありません。
|
||||
|
||||
| 定義 | 型 | 既定値 | 例 |
|
||||
|--------------------|------------|--------------------|---------------------------------------------|
|
||||
| `UNICODE_KEY_MAC` | `uint8_t` | `KC_LALT` | `#define UNICODE_KEY_MAC KC_RALT` |
|
||||
| `UNICODE_KEY_LNX` | `uint16_t` | `LCTL(LSFT(KC_U))` | `#define UNICODE_KEY_LNX LCTL(LSFT(KC_E))` |
|
||||
| `UNICODE_KEY_WINC` | `uint8_t` | `KC_RALT` | `#define UNICODE_KEY_WINC KC_RGUI` |
|
||||
|
||||
|
||||
## Unicode 文字列の送信
|
||||
|
||||
QMK は、Unicode 入力をプログラムでホストに送信できるようにする幾つかの関数を提供します:
|
||||
|
||||
### `send_unicode_string()`
|
||||
|
||||
この関数は、`send_string()` によく似ていますが、UTF-8 文字を直接入力できます。選択された入力モードでもサポートされている場合は、全てのコードポイントをサポートします。`keymap.c` ファイルが UTF-8 エンコーディングを使ってフォーマットされていることを確認してください。
|
||||
|
||||
```c
|
||||
send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
|
||||
```
|
||||
|
||||
使用例には、[Macros](ja/feature_macros.md) で説明されているように、キーが押された時に Unicode 文字列を送信することが含まれます。
|
||||
|
||||
### `send_unicode_hex_string()`
|
||||
|
||||
`send_unicode_string()` に似ていますが、文字は Unicode コードポイントで表され、16進数で記述され、空白で区切られています。例えば、上記のちゃぶ台返しは以下で表されます:
|
||||
|
||||
```c
|
||||
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
|
||||
```
|
||||
|
||||
[このサイト](https://r12a.github.io/app-conversion/)で結果を "Hex/UTF-32" で受け取ることで、Unicode 文字列をこの形式に簡単に変換できます。
|
||||
|
||||
|
||||
## 追加の言語サポート
|
||||
|
||||
`quantum/keymap_extras` には、様々な言語ファイルがあります — これらは Colemak または BÉPO のような代替レイアウトのファイルと同じように動作します。これらの言語ヘッダのいずれかを `#include` すると、その言語/国のレイアウトに固有のキーコードにアクセスできます。このようなキーコードは、2文字の国/言語コードの後に、アンダースコアとキーが対応する4文字の略語が続くことで定義されます。例えば、キーマップに `keymap_french.h` を含め、`FR_UGRV` を使うと、ネイティブのフランス語 AZERTY レイアウトを使うシステムで入力すると、`ù` が出力されます。
|
||||
|
||||
マシンで使うプライマリシステムレイアウトが US ANSI と異なる場合、これらの言語固有のキーコードを使うと、QMK キーマップが実際に画面に出力されるものとより一致するようになります。ただし、これらのキーコードは、内部の対応するデフォルトの US キーコードのエイリアスに過ぎず、キーボードで使われる HID プロトコル自体は本質的に US ANSI に基づいていることに注意してください。
|
||||
|
||||
|
||||
## Windows での国際文字
|
||||
|
||||
### AutoHotkey
|
||||
|
||||
この方法はキーボード自体で Unicode サポートを必要としませんが、代わりにバックグラウンドで [AutoHotkey](https://autohotkey.com) が実行されていることを当てにします。
|
||||
|
||||
最初にプログラムで使われていないモディファイアの組み合わせを選択する必要があります。
|
||||
Ctrl+Alt+Win はあまり広く使われていないため、これに最適なはずです。
|
||||
mod-tab コンボ `LCAG_T` 用に定義されたマクロがあります。
|
||||
この mod-tab マクロをキーボードのキーに追加します。例えば: `LCAG_T(KC_TAB)`。
|
||||
これにより、キーを押してすぐ放すとキーはタブキーのように振る舞いますが、他のキーと一緒に使うとモディファイアに変わります。
|
||||
|
||||
AutoHotkey のデフォルトのスクリプトで、カスタムホットキーを定義できます。
|
||||
|
||||
<^<!<#a::Send, ä
|
||||
<^<!<#<+a::Send, Ä
|
||||
|
||||
上のホットキーは、CtrlAltGui と CtrlAltGuiShift + 文字 a の組み合わせです。
|
||||
この組み合わせが押されると、AutoHotkey は `Send, ` の右側にあるテキストを挿入します。
|
||||
|
||||
### 米国インターナショナル
|
||||
|
||||
システム上で米国インターナショナルレイアウトを有効にすると、文字にアクセントをつけるために区切り文字を使います。例えば、"\`a" は à になります。
|
||||
これを有効にする方法は[ここ](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout)で見つかります。
|
@@ -110,6 +110,10 @@ make コマンド自体にもいくつかの追加オプションがあります
|
||||
|
||||
C6 ピン(抽象化が必要)でオーディオ出力できます。詳細は[オーディオページ](ja/feature_audio.md)を見てください。
|
||||
|
||||
`FAUXCLICKY_ENABLE`
|
||||
|
||||
クリック音のあるスイッチをエミュレートするためにブザーを使います。Cherry社製の青軸スイッチの安っぽい模倣です。デフォルトでは、`AUDIO_ENABLE` と同じように C6 ピンを使います。
|
||||
|
||||
`VARIABLE_TRACE`
|
||||
|
||||
これを使って変数の値の変更をデバッグします。詳細についてはユニットテストのページの[変数のトレース](ja/unit_testing.md#tracing-variables)のセクションを見てください。
|
||||
|
@@ -1,78 +0,0 @@
|
||||
# `defines` グループ {#group__defines}
|
||||
|
||||
## 概要
|
||||
|
||||
メンバー | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
`define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) |
|
||||
`define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) |
|
||||
`define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) |
|
||||
`define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) |
|
||||
`define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) |
|
||||
`define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) |
|
||||
`define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) |
|
||||
`define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) |
|
||||
`define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) |
|
||||
`define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) |
|
||||
`define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) |
|
||||
`define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) |
|
||||
`define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) |
|
||||
`define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) |
|
||||
`define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) |
|
||||
`define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) |
|
||||
`define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) |
|
||||
`define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) |
|
||||
`define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) |
|
||||
`define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) |
|
||||
`define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) |
|
||||
`define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) |
|
||||
`define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) |
|
||||
|
||||
## メンバー
|
||||
|
||||
#### `define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) {#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79}
|
||||
|
||||
#### `define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) {#group__defines_1ga753706d1d28e6f96d7caf1973e80feed}
|
||||
|
||||
#### `define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) {#group__defines_1gab78a1c818a5f5dab7a8946543f126c69}
|
||||
|
||||
#### `define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) {#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909}
|
||||
|
||||
#### `define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) {#group__defines_1ga45f116a1daab76b3c930c2cecfaef215}
|
||||
|
||||
#### `define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) {#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7}
|
||||
|
||||
#### `define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) {#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc}
|
||||
|
||||
#### `define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) {#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f}
|
||||
|
||||
#### `define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) {#group__defines_1gabcc799504e8064679bca03f232223af4}
|
||||
|
||||
#### `define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) {#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42}
|
||||
|
||||
#### `define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) {#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe}
|
||||
|
||||
#### `define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) {#group__defines_1gafa5e4e295aafd15ab7893344599b3b89}
|
||||
|
||||
#### `define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) {#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7}
|
||||
|
||||
#### `define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) {#group__defines_1ga8233631c85823aa546f932ad8975caa4}
|
||||
|
||||
#### `define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) {#group__defines_1gab24430f0081e27215b0da84dd0ee745c}
|
||||
|
||||
#### `define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) {#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62}
|
||||
|
||||
#### `define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) {#group__defines_1gacd88ed42dba52bb4b2052c5656362677}
|
||||
|
||||
#### `define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) {#group__defines_1ga02947f30ca62dc332fdeb10c5868323b}
|
||||
|
||||
#### `define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) {#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31}
|
||||
|
||||
#### `define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) {#group__defines_1ga412f6ed33a2150051374bee334ee1705}
|
||||
|
||||
#### `define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) {#group__defines_1gafcab254838b028365ae0259729e72c4e}
|
||||
|
||||
#### `define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) {#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795}
|
||||
|
||||
#### `define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) {#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f}
|
||||
|
@@ -1,148 +0,0 @@
|
||||
# `midi_device` グループ {#group__midi__device}
|
||||
|
||||
<!---
|
||||
original document: 0.10.9:docs/internals_midi_device.md
|
||||
git diff 0.10.9 HEAD -- docs/internals_midi_device.md | cat
|
||||
-->
|
||||
|
||||
独自の MIDI デバイスを実装する時に、関数を使います。
|
||||
|
||||
実際にデバイスを介してバイトを送信するために、送信関数を設定します。このメソッドは、このデバイスで例えば midi_send_cc のような送信関数を呼ぶ時に呼ばれます。
|
||||
|
||||
midi_device_input を使ってデバイスからの入力データを処理し、それをデバイスに関連付けられたコールバックで渡します。
|
||||
|
||||
デバイスのプロセス関数の最初に呼び出される関数が必要な場合、midi_device_set_pre_input_process_func を使います。通常、入力をポーリングして midi_device_input に渡します。
|
||||
|
||||
## 概要
|
||||
|
||||
メンバー | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
`define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) |
|
||||
`enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) |
|
||||
`public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` | 入力バイトを処理します。この関数はバイトを解析し、指定されたデバイスに関連する適切なコールバックを呼びます。この関数は、カスタムデバイスを作成していて、MIDI 入力が必要な場合に使います。
|
||||
`public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` | 出力データバイトの送信に使われるコールバック関数を設定します。これは、カスタムデバイスを作成している場合のみ使われます。ロックを気にすることなく様々な MIDI 送信関数を呼び出すことができるように、コールバック関数で割り込みを無効にすることができます。
|
||||
`public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` | midi_device_process 呼び出しの最初に呼ばれるコールバックを設定します。これは入力データをポーリングし、midi_device_input 関数を介してデータを送信できます。カスタムデバイスを作成している場合のみ、これを使う可能性があります。
|
||||
`struct `[`_midi_device`](docs/api_midi_device.md#struct__midi__device) | この構造体は、MIDI デバイスの入出力関数と処理データを表します。
|
||||
|
||||
## メンバー
|
||||
|
||||
#### `define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) {#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8}
|
||||
|
||||
#### `enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) {#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621}
|
||||
|
||||
値 | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
IDLE |
|
||||
ONE_BYTE_MESSAGE |
|
||||
TWO_BYTE_MESSAGE |
|
||||
THREE_BYTE_MESSAGE |
|
||||
SYSEX_MESSAGE |
|
||||
|
||||
#### `public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` {#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db}
|
||||
|
||||
入力バイトを処理します。この関数はバイトを解析し、指定されたデバイスに関連する適切なコールバックを呼びます。この関数は、カスタムデバイスを作成していて、MIDI 入力が必要な場合に使います。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 入力を関連付ける MIDI デバイス
|
||||
|
||||
* `cnt` 処理中のバイト数
|
||||
|
||||
* `input` 処理するバイトデータ
|
||||
|
||||
#### `public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` {#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673}
|
||||
|
||||
出力データバイトの送信に使われるコールバック関数を設定します。これは、カスタムデバイスを作成している場合のみ使われます。ロックを気にすることなく様々な MIDI 送信関数を呼び出すことができるように、コールバック関数で割り込みを無効にすることができます。
|
||||
|
||||
#### パラメータ
|
||||
* `device` このコールバックを関連付ける MIDI デバイス
|
||||
|
||||
* `send_func` 送信を行うコールバック関数
|
||||
|
||||
#### `public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` {#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69}
|
||||
|
||||
midi_device_process 呼び出しの最初に呼ばれるコールバックを設定します。これは入力データをポーリングし、midi_device_input 関数を介してデータを送信できます。カスタムデバイスを作成している場合のみ、これを使う可能性があります。
|
||||
|
||||
#### パラメータ
|
||||
* `device` このコールバックを関連付ける MIDI デバイス
|
||||
|
||||
* `midi_no_byte_func_t` 実際のコールバック関数
|
||||
|
||||
# `_midi_device` 構造体 {#struct__midi__device}
|
||||
|
||||
この構造体は、MIDI デバイスの入出力関数と処理データを表します。
|
||||
|
||||
デバイスは、実際の物理デバイス [シリアルポート、USB ポート]、または仮想デバイスを表すことができます。この構造体を直接変更する必要はありません。
|
||||
|
||||
## 概要
|
||||
|
||||
| メンバー | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
`public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) |
|
||||
`public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) |
|
||||
`public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) |
|
||||
`public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) |
|
||||
`public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) |
|
||||
`public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) |
|
||||
`public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) |
|
||||
`public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) |
|
||||
`public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) |
|
||||
`public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) |
|
||||
`public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) |
|
||||
`public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) |
|
||||
`public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) |
|
||||
`public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) |
|
||||
`public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) |
|
||||
`public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) |
|
||||
`public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) |
|
||||
`public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) |
|
||||
`public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) |
|
||||
`public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) |
|
||||
`public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) |
|
||||
`public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) |
|
||||
|
||||
## メンバー
|
||||
|
||||
#### `public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) {#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9}
|
||||
|
||||
#### `public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) {#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1}
|
||||
|
||||
#### `public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) {#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c}
|
||||
|
||||
#### `public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) {#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84}
|
||||
|
||||
#### `public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) {#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f}
|
||||
|
||||
#### `public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) {#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18}
|
||||
|
||||
#### `public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) {#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586}
|
||||
|
||||
#### `public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) {#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da}
|
||||
|
||||
#### `public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) {#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7}
|
||||
|
||||
#### `public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) {#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f}
|
||||
|
||||
#### `public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) {#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0}
|
||||
|
||||
#### `public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) {#struct__midi__device_1a9448eba4afb7e43650434748db3777be}
|
||||
|
||||
#### `public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) {#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d}
|
||||
|
||||
#### `public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) {#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2}
|
||||
|
||||
#### `public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) {#struct__midi__device_1abb974ec6d734001b4a0e370f292be503}
|
||||
|
||||
#### `public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) {#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8}
|
||||
|
||||
#### `public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) {#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754}
|
||||
|
||||
#### `public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) {#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a}
|
||||
|
||||
#### `public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) {#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39}
|
||||
|
||||
#### `public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) {#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d}
|
||||
|
||||
#### `public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) {#struct__midi__device_1ada41de021135dc423abedcbb30f366ff}
|
||||
|
||||
#### `public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) {#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f}
|
||||
|
@@ -1,36 +0,0 @@
|
||||
# `midi_device_setup_process` グループ {#group__midi__device__setup__process}
|
||||
|
||||
<!---
|
||||
original document: 0.10.9:docs/internals_midi_device_setup_process.md
|
||||
git diff 0.10.9 HEAD -- docs/internals_midi_device_setup_process.md | cat
|
||||
-->
|
||||
|
||||
これらは、デバイスを初期化して実行するために使う必要があるメソッドです。
|
||||
|
||||
## 概要
|
||||
|
||||
メンバー | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
`public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` | デバイスを初期化します。
|
||||
`public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 入力データを処理します。
|
||||
|
||||
## メンバー
|
||||
|
||||
#### `public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9}
|
||||
|
||||
デバイスを初期化します。
|
||||
|
||||
問題のデバイスを使う前にこれを呼び出す必要があります。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 初期化するデバイス
|
||||
|
||||
#### `public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b}
|
||||
|
||||
入力データを処理します。
|
||||
|
||||
このメソッドは入力処理を駆動します。入力コールバックが呼び出されることが予想される場合は、このメソッドを頻繁に呼び出す必要があります。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 処理するデバイス
|
||||
|
@@ -1,59 +0,0 @@
|
||||
# `midi_util` グループ {#group__midi__util}
|
||||
|
||||
<!---
|
||||
original document: 0.10.9:docs/internals_midi_util.md
|
||||
git diff 0.10.9 HEAD -- docs/internals_midi_util.md | cat
|
||||
-->
|
||||
|
||||
## 概要
|
||||
|
||||
| メンバー | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
| `enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) | 可能なパケット長の値の列挙型。
|
||||
| `public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` | 指定されたバイトがステータスバイトであるかどうかを検査します。
|
||||
| `public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` | 指定されたバイトがリアルタイムメッセージであるかどうかを検査します。
|
||||
| `public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` | 指定されたステータスバイトに関連付けられたパケットの長さを調べます。
|
||||
|
||||
## メンバー
|
||||
|
||||
#### `enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) {#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e}
|
||||
|
||||
| 値 | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
UNDEFINED |
|
||||
ONE |
|
||||
TWO |
|
||||
THREE |
|
||||
|
||||
可能なパケット長の値の列挙型。
|
||||
|
||||
#### `public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` {#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5}
|
||||
|
||||
指定されたバイトがステータスバイトであるかどうかを検査します。
|
||||
|
||||
#### パラメータ
|
||||
* `theByte` 検査するバイト
|
||||
|
||||
#### 返り値
|
||||
指定されたバイトが MIDI ステータスバイトの場合は true
|
||||
|
||||
#### `public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` {#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7}
|
||||
|
||||
指定されたバイトがリアルタイムメッセージであるかどうかを検査します。
|
||||
|
||||
#### パラメータ
|
||||
* `theByte` 検査するバイト
|
||||
|
||||
#### 返り値
|
||||
リアルタイムメッセージの場合は true、それ以外の場合は false
|
||||
|
||||
#### `public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` {#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175}
|
||||
|
||||
指定されたステータスバイトに関連付けられたパケットの長さを調べます。
|
||||
|
||||
#### パラメータ
|
||||
* `status` ステータスバイト
|
||||
|
||||
#### 返り値
|
||||
パケットの長さ。バイトがステータスバイトではない場合、あるいは sysex ステータスバイトの場合は、UNDEFINED を返します。
|
||||
|
@@ -1,246 +0,0 @@
|
||||
# `send_functions` グループ {#group__send__functions}
|
||||
|
||||
<!---
|
||||
original document: 0.10.9:docs/internals_send_functions.md
|
||||
git diff 0.10.9 HEAD -- docs/internals_send_functions.md | cat
|
||||
-->
|
||||
|
||||
これらは、デバイスを介して MIDI データを送信するために使う関数です。
|
||||
|
||||
## 概要
|
||||
|
||||
メンバー | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
`public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` | 指定されたデバイスを介して、コントロールチェンジメッセージを送信します。
|
||||
`public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | 指定されたデバイスを介してノートオンメッセージを送信します。
|
||||
`public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | 指定されたデバイスを介してノートオフメッセージを送信します。
|
||||
`public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` | 指定されたデバイスを介してアフタータッチメッセージを送信します。
|
||||
`public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` | 指定されたデバイスを介してピッチベンドメッセージを送信します。
|
||||
`public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` | 指定されたデバイスを介してプログラムチェンジメッセージを送信します。
|
||||
`public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` | 指定されたデバイスを介してチャンネルプレッシャーメッセージを送信します。
|
||||
`public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してクロックメッセージを送信します。
|
||||
`public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してティックメッセージを送信します。
|
||||
`public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してスタートメッセージを送信します。
|
||||
`public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してコンティニューメッセージを送信します。
|
||||
`public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してストップメッセージを送信します。
|
||||
`public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してアクティブセンスメッセージを送信します。
|
||||
`public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してリセットメッセージを送信します。
|
||||
`public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` | 指定されたデバイスを介してタイムコードクォータフレームメッセージを送信します。
|
||||
`public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` | 指定されたデバイスを介してソングポジションメッセージを送信します。
|
||||
`public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` | 指定されたデバイスを介してソングセレクトメッセージを送信します。
|
||||
`public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してチューンリクエストメッセージを送信します。
|
||||
`public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` | 指定されたデバイスを介してバイトを送信します。
|
||||
`public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` | 最大3バイトのデータを送信します。
|
||||
`public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` | フォーマットされた MIDI データの配列を送信します。
|
||||
|
||||
## メンバー
|
||||
|
||||
#### `public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` {#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960}
|
||||
|
||||
指定されたデバイスを介して、コントロールチェンジメッセージ(cc)を送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `chan` 送信するチャンネル、0-15
|
||||
|
||||
* `num` コントロールチェンジナンバー
|
||||
|
||||
* `val` コントロールチェンジナンバーの値
|
||||
|
||||
#### `public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775}
|
||||
|
||||
指定されたデバイスを介してノートオンメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `chan` 送信するチャンネル、0-15
|
||||
|
||||
* `num` ノート番号
|
||||
|
||||
* `vel` ノートベロシティ
|
||||
|
||||
#### `public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49}
|
||||
|
||||
指定されたデバイスを介してノートオフメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `chan` 送信するチャンネル、0-15
|
||||
|
||||
* `num` ノート番号
|
||||
|
||||
* `vel` ノートベロシティ
|
||||
|
||||
#### `public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` {#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f}
|
||||
|
||||
指定されたデバイスを介してアフタータッチメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `chan` 送信するチャンネル、0-15
|
||||
|
||||
* `note_num` ノート番号
|
||||
|
||||
* `amt` アフタータッチ量
|
||||
|
||||
#### `public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` {#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491}
|
||||
|
||||
指定されたデバイスを介してピッチベンドメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `chan` 送信するチャンネル、0-15
|
||||
|
||||
* `amt` ベンド量の範囲: -8192..8191、0 はベンドしないことを意味します
|
||||
|
||||
#### `public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` {#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86}
|
||||
|
||||
指定されたデバイスを介してプログラムチェンジメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `chan` 送信するチャンネル、0-15
|
||||
|
||||
* `num` 変更先のプログラム
|
||||
|
||||
#### `public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` {#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b}
|
||||
|
||||
指定されたデバイスを介してチャンネルプレッシャーメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `chan` 送信するチャンネル、0-15
|
||||
|
||||
* `amt` チャンネルプレッシャーの量
|
||||
|
||||
#### `public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa}
|
||||
|
||||
指定されたデバイスを介してクロックメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga2b43c7d433d940c5b907595aac947972}
|
||||
|
||||
指定されたデバイスを介してティックメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc}
|
||||
|
||||
指定されたデバイスを介してスタートメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120}
|
||||
|
||||
指定されたデバイスを介してコンティニューメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988}
|
||||
|
||||
指定されたデバイスを介してストップメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37}
|
||||
|
||||
指定されたデバイスを介してアクティブセンスメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b}
|
||||
|
||||
指定されたデバイスを介してリセットメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` {#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a}
|
||||
|
||||
指定されたデバイスを介してタイムコードクォータフレームメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `time` このクォータフレームの時間。範囲は、0..16383
|
||||
|
||||
#### `public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` {#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f}
|
||||
|
||||
指定されたデバイスを介してソングポジションメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `pos` ソングポジション
|
||||
|
||||
#### `public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` {#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50}
|
||||
|
||||
指定されたデバイスを介してソングセレクトメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `song` 選択するソング
|
||||
|
||||
#### `public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656}
|
||||
|
||||
指定されたデバイスを介してチューンリクエストメッセージを送信します。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
#### `public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` {#group__send__functions_1ga857e85eb90b288385642d4d991e09881}
|
||||
|
||||
指定されたデバイスを介してバイトを送信します。
|
||||
|
||||
これは、指定された MIDI デバイスを介してデータを送信する一般的なメソッドです。これは、この API に実装されていない sysex データまたはメッセージがある場合、それらを送信するのに役立ちます。そのようなものを見つけた場合は、私たちがそれらを追加できるように、作者に連絡してください。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `b` 送信するバイト
|
||||
|
||||
#### `public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` {#group__send__functions_1ga36e2f2e45369d911b76969361679054b}
|
||||
|
||||
最大3バイトのデータを送信します。
|
||||
|
||||
これを使って sysex を通過できるように count に4の剰余が適用されます。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `count` 送信するバイト数、4の剰余が適用されます
|
||||
|
||||
* `byte0` 最初のバイト
|
||||
|
||||
* `byte1` 2番目のバイト。cnt % 4 != 2 の場合は無視されます
|
||||
|
||||
* `byte2` 3番目のバイト。cnt % 4 != 3 の場合は無視されます
|
||||
|
||||
#### `public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` {#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead}
|
||||
|
||||
フォーマットされた MIDI データの配列を送信します。
|
||||
|
||||
sysex に使うことができます。
|
||||
|
||||
#### パラメータ
|
||||
* `device` 送信に使うデバイス
|
||||
|
||||
* `count` 送信するバイト数
|
||||
|
||||
* `array` バイトの配列
|
||||
|
@@ -1,66 +0,0 @@
|
||||
# `sysex_tools` グループ {#group__sysex__tools}
|
||||
|
||||
<!---
|
||||
original document: 0.10.9:docs/internals_sysex_tools.md
|
||||
git diff 0.10.9 HEAD -- docs/internals_sysex_tools.md | cat
|
||||
-->
|
||||
|
||||
## 概要
|
||||
|
||||
| メンバー | 説明
|
||||
--------------------------------|---------------------------------------------
|
||||
| `public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` | エンコード後のメッセージの長さを計算します。
|
||||
| `public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` | デコード後のメッセージの長さを計算します。
|
||||
| `public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` | sysex メッセージで安全に送信できるようにデータをエンコードします。
|
||||
| `public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` | エンコードされたデータをデコードします。
|
||||
|
||||
## メンバー
|
||||
|
||||
#### `public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` {#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a}
|
||||
|
||||
エンコード後のメッセージの長さを計算します。
|
||||
|
||||
#### パラメータ
|
||||
* `decoded_length` エンコードするメッセージの長さのバイト数。
|
||||
|
||||
#### 返り値
|
||||
エンコード後のメッセージの長さのバイト数。
|
||||
|
||||
#### `public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` {#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0}
|
||||
|
||||
デコード後のメッセージの長さを計算します。
|
||||
|
||||
#### パラメータ
|
||||
* `encoded_length` エンコードされたメッセージの長さのバイト数。
|
||||
|
||||
#### 返り値
|
||||
デコードされた後のメッセージの長さのバイト数。
|
||||
|
||||
#### `public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742}
|
||||
|
||||
sysex メッセージで安全に送信できるようにデータをエンコードします。
|
||||
|
||||
#### パラメータ
|
||||
* `encoded` 出力データバッファは、少なくとも sysex_encoded_length(length) バイトの長さが必要です。
|
||||
|
||||
* `source` エンコードされるデータの入力バッファ。
|
||||
|
||||
* `length` 入力バッファからエンコードするバイト数。
|
||||
|
||||
#### 返り値
|
||||
エンコードされたバイト数。
|
||||
|
||||
#### `public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229}
|
||||
|
||||
エンコードされたデータをデコードします。
|
||||
|
||||
#### パラメータ
|
||||
* `decoded` 出力データバッファは、少なくとも sysex_decoded_length(length) バイトの長さが必要です。
|
||||
|
||||
* `source` デコードされるデータの入力バッファ。
|
||||
|
||||
* `length` 入力バッファからデコードするバイト数。
|
||||
|
||||
#### 返り値
|
||||
デコードされたバイト数。
|
||||
|
@@ -1,574 +0,0 @@
|
||||
# キーコードの概要
|
||||
|
||||
<!---
|
||||
original document: 0.11.64:docs/keycodes.md
|
||||
git diff 0.11.64 HEAD -- docs/keycodes.md | cat
|
||||
-->
|
||||
|
||||
[キーマップ](ja/keymap.md) を定義するときは、それぞれのキーに有効な定義が必要です。このページは、QMK で使えるキーコードに相当するシンボルについて記述しています。
|
||||
|
||||
このページは参照のみです。それぞれのキーの種類毎のリンク先のページに、それぞれのキーの機能についてもっと詳細に記載しています。
|
||||
|
||||
## 基本的なキーコード :id=basic-keycodes
|
||||
|
||||
[基本的なキーコード](ja/keycodes_basic.md) も見てください。
|
||||
|
||||
?> 訳注: 以下の説明は、OS のキーボード配列の設定が「US」の場合のものです。OS のキーボード配列の設定が「JIS」の場合、一部のキーは下の表と異なる文字が入力されます。例えば、`KC_LBRC` は、OS のキーボード配列の設定が US であれば「`[` または `{`」が入力されますが、JIS の場合「`@` または <code>`</code>」が入力されます。
|
||||
?> これは、OS がキーボードから送信されたキーコードを解釈する際に、キーボード配列の設定によって対応する文字を変えるためです。もし、OS のキーボード配列の設定を JIS にする場合、`#include "keymap_jp.h"` を `keymap.c` に追加すると`JP_AT` のような JIS キーボードのキーキャップに対応したキーを指定できます。
|
||||
|
||||
|キー |エイリアス |説明 |Windows |macOS |Linux<sup>1</sup>|
|
||||
|-----------------------|------------------------------|-----------------------------------------|-------------|-------------|-----------------|
|
||||
|`KC_NO` |`XXXXXXX` |このキーを無視します (何もしません) 。 |*N/A* |*N/A* |*N/A* |
|
||||
|`KC_TRANSPARENT` |`KC_TRNS`, `_______` | 次に低いレイヤーの非透過キーを使う |*N/A* |*N/A* |*N/A* |
|
||||
|`KC_A` | |`a` と `A` |✔ |✔ |✔ |
|
||||
|`KC_B` | |`b` と `B` |✔ |✔ |✔ |
|
||||
|`KC_C` | |`c` と `C` |✔ |✔ |✔ |
|
||||
|`KC_D` | |`d` と `D` |✔ |✔ |✔ |
|
||||
|`KC_E` | |`e` と `E` |✔ |✔ |✔ |
|
||||
|`KC_F` | |`f` と `F` |✔ |✔ |✔ |
|
||||
|`KC_G` | |`g` と `G` |✔ |✔ |✔ |
|
||||
|`KC_H` | |`h` と `H` |✔ |✔ |✔ |
|
||||
|`KC_I` | |`i` と `I` |✔ |✔ |✔ |
|
||||
|`KC_J` | |`j` と `J` |✔ |✔ |✔ |
|
||||
|`KC_K` | |`k` と `K` |✔ |✔ |✔ |
|
||||
|`KC_L` | |`l` と `L` |✔ |✔ |✔ |
|
||||
|`KC_M` | |`m` と `M` |✔ |✔ |✔ |
|
||||
|`KC_N` | |`n` と `N` |✔ |✔ |✔ |
|
||||
|`KC_O` | |`o` と `O` |✔ |✔ |✔ |
|
||||
|`KC_P` | |`p` と `P` |✔ |✔ |✔ |
|
||||
|`KC_Q` | |`q` と `Q` |✔ |✔ |✔ |
|
||||
|`KC_R` | |`r` と `R` |✔ |✔ |✔ |
|
||||
|`KC_S` | |`s` と `S` |✔ |✔ |✔ |
|
||||
|`KC_T` | |`t` と `T` |✔ |✔ |✔ |
|
||||
|`KC_U` | |`u` と `U` |✔ |✔ |✔ |
|
||||
|`KC_V` | |`v` と `V` |✔ |✔ |✔ |
|
||||
|`KC_W` | |`w` と `W` |✔ |✔ |✔ |
|
||||
|`KC_X` | |`x` と `X` |✔ |✔ |✔ |
|
||||
|`KC_Y` | |`y` と `Y` |✔ |✔ |✔ |
|
||||
|`KC_Z` | |`z` と `Z` |✔ |✔ |✔ |
|
||||
|`KC_1` | |`1` と `!` |✔ |✔ |✔ |
|
||||
|`KC_2` | |`2` と `@` |✔ |✔ |✔ |
|
||||
|`KC_3` | |`3` と `#` |✔ |✔ |✔ |
|
||||
|`KC_4` | |`4` と `$` |✔ |✔ |✔ |
|
||||
|`KC_5` | |`5` と `%` |✔ |✔ |✔ |
|
||||
|`KC_6` | |`6` と `^` |✔ |✔ |✔ |
|
||||
|`KC_7` | |`7` と `&` |✔ |✔ |✔ |
|
||||
|`KC_8` | |`8` と `*` |✔ |✔ |✔ |
|
||||
|`KC_9` | |`9` と `(` |✔ |✔ |✔ |
|
||||
|`KC_0` | |`0` と `)` |✔ |✔ |✔ |
|
||||
|`KC_ENTER` |`KC_ENT` |Return (Enter) |✔ |✔ |✔ |
|
||||
|`KC_ESCAPE` |`KC_ESC` |Escape |✔ |✔ |✔ |
|
||||
|`KC_BSPACE` |`KC_BSPC` |Delete (Backspace) |✔ |✔ |✔ |
|
||||
|`KC_TAB` | |Tab |✔ |✔ |✔ |
|
||||
|`KC_SPACE` |`KC_SPC` |Spacebar |✔ |✔ |✔ |
|
||||
|`KC_MINUS` |`KC_MINS` |`-` と `_` |✔ |✔ |✔ |
|
||||
|`KC_EQUAL` |`KC_EQL` |`=` と `+` |✔ |✔ |✔ |
|
||||
|`KC_LBRACKET` |`KC_LBRC` |`[` と `{` |✔ |✔ |✔ |
|
||||
|`KC_RBRACKET` |`KC_RBRC` |`]` と `}` |✔ |✔ |✔ |
|
||||
|`KC_BSLASH` |`KC_BSLS` |`\` と `\|` |✔ |✔ |✔ |
|
||||
|`KC_NONUS_HASH` |`KC_NUHS` |Non-US `#` と `~` |✔ |✔ |✔ |
|
||||
|`KC_SCOLON` |`KC_SCLN` |`;` と `:` |✔ |✔ |✔ |
|
||||
|`KC_QUOTE` |`KC_QUOT` |`'` と `"` |✔ |✔ |✔ |
|
||||
|`KC_GRAVE` |`KC_GRV`, `KC_ZKHK` |<code>`</code> と `~`, JIS 全角/半角 |✔ |✔ |✔ |
|
||||
|`KC_COMMA` |`KC_COMM` |`,` と `<` |✔ |✔ |✔ |
|
||||
|`KC_DOT` | |`.` と `>` |✔ |✔ |✔ |
|
||||
|`KC_SLASH` |`KC_SLSH` |`/` と `?` |✔ |✔ |✔ |
|
||||
|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS` |Caps Lock |✔ |✔ |✔ |
|
||||
|`KC_F1` | |F1 |✔ |✔ |✔ |
|
||||
|`KC_F2` | |F2 |✔ |✔ |✔ |
|
||||
|`KC_F3` | |F3 |✔ |✔ |✔ |
|
||||
|`KC_F4` | |F4 |✔ |✔ |✔ |
|
||||
|`KC_F5` | |F5 |✔ |✔ |✔ |
|
||||
|`KC_F6` | |F6 |✔ |✔ |✔ |
|
||||
|`KC_F7` | |F7 |✔ |✔ |✔ |
|
||||
|`KC_F8` | |F8 |✔ |✔ |✔ |
|
||||
|`KC_F9` | |F9 |✔ |✔ |✔ |
|
||||
|`KC_F10` | |F10 |✔ |✔ |✔ |
|
||||
|`KC_F11` | |F11 |✔ |✔ |✔ |
|
||||
|`KC_F12` | |F12 |✔ |✔ |✔ |
|
||||
|`KC_PSCREEN` |`KC_PSCR` |Print Screen |✔ |✔<sup>2</sup>|✔ |
|
||||
|`KC_SCROLLLOCK` |`KC_SLCK`, `KC_BRMD` |Scroll Lock, 画面の明るさダウン (macOS) |✔ |✔<sup>2</sup>|✔ |
|
||||
|`KC_PAUSE` |`KC_PAUS`, `KC_BRK`, `KC_BRMU`|Pause, 画面の明るさアップ (macOS) |✔ |✔<sup>2</sup>|✔ |
|
||||
|`KC_INSERT` |`KC_INS` |Insert |✔ | |✔ |
|
||||
|`KC_HOME` | |Home |✔ |✔ |✔ |
|
||||
|`KC_PGUP` | |Page Up |✔ |✔ |✔ |
|
||||
|`KC_DELETE` |`KC_DEL` |Forward Delete |✔ |✔ |✔ |
|
||||
|`KC_END` | |End |✔ |✔ |✔ |
|
||||
|`KC_PGDOWN` |`KC_PGDN` |Page Down |✔ |✔ |✔ |
|
||||
|`KC_RIGHT` |`KC_RGHT` |右矢印 |✔ |✔ |✔ |
|
||||
|`KC_LEFT` | |左矢印 |✔ |✔ |✔ |
|
||||
|`KC_DOWN` | |下矢印 |✔ |✔ |✔ |
|
||||
|`KC_UP` | |上矢印 |✔ |✔ |✔ |
|
||||
|`KC_NUMLOCK` |`KC_NLCK` |テンキー Num Lock と Clear |✔ |✔ |✔ |
|
||||
|`KC_KP_SLASH` |`KC_PSLS` |テンキー `/` |✔ |✔ |✔ |
|
||||
|`KC_KP_ASTERISK` |`KC_PAST` |テンキー `*` |✔ |✔ |✔ |
|
||||
|`KC_KP_MINUS` |`KC_PMNS` |テンキー `-` |✔ |✔ |✔ |
|
||||
|`KC_KP_PLUS` |`KC_PPLS` |テンキー `+` |✔ |✔ |✔ |
|
||||
|`KC_KP_ENTER` |`KC_PENT` |テンキー Enter |✔ |✔ |✔ |
|
||||
|`KC_KP_1` |`KC_P1` |テンキー `1` と End |✔ |✔ |✔ |
|
||||
|`KC_KP_2` |`KC_P2` |テンキー `2` と下矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_3` |`KC_P3` |テンキー `3` と Page Down |✔ |✔ |✔ |
|
||||
|`KC_KP_4` |`KC_P4` |テンキー `4` と左矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_5` |`KC_P5` |テンキー `5` |✔ |✔ |✔ |
|
||||
|`KC_KP_6` |`KC_P6` |テンキー `6` と右矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_7` |`KC_P7` |テンキー `7` と Home |✔ |✔ |✔ |
|
||||
|`KC_KP_8` |`KC_P8` |テンキー `8` と上矢印 |✔ |✔ |✔ |
|
||||
|`KC_KP_9` |`KC_P9` |テンキー `9` と Page Up |✔ |✔ |✔ |
|
||||
|`KC_KP_0` |`KC_P0` |テンキー `0` と Insert |✔ |✔ |✔ |
|
||||
|`KC_KP_DOT` |`KC_PDOT` |テンキー `.` と Delete |✔ |✔ |✔ |
|
||||
|`KC_NONUS_BSLASH` |`KC_NUBS` |Non-US `\` と `\|` |✔ |✔ |✔ |
|
||||
|`KC_APPLICATION` |`KC_APP` |アプリケーションキー (Windows コンテキストメニューキー) |✔ | |✔ |
|
||||
|`KC_POWER` | |システム電源 | |✔<sup>3</sup>|✔ |
|
||||
|`KC_KP_EQUAL` |`KC_PEQL` |テンキー `=` |✔ |✔ |✔ |
|
||||
|`KC_F13` | |F13 |✔ |✔ |✔ |
|
||||
|`KC_F14` | |F14 |✔ |✔ |✔ |
|
||||
|`KC_F15` | |F15 |✔ |✔ |✔ |
|
||||
|`KC_F16` | |F16 |✔ |✔ |✔ |
|
||||
|`KC_F17` | |F17 |✔ |✔ |✔ |
|
||||
|`KC_F18` | |F18 |✔ |✔ |✔ |
|
||||
|`KC_F19` | |F19 |✔ |✔ |✔ |
|
||||
|`KC_F20` | |F20 |✔ | |✔ |
|
||||
|`KC_F21` | |F21 |✔ | |✔ |
|
||||
|`KC_F22` | |F22 |✔ | |✔ |
|
||||
|`KC_F23` | |F23 |✔ | |✔ |
|
||||
|`KC_F24` | |F24 |✔ | |✔ |
|
||||
|`KC_EXECUTE` |`KC_EXEC` |Execute | | |✔ |
|
||||
|`KC_HELP` | |Help | | |✔ |
|
||||
|`KC_MENU` | |Menu | | |✔ |
|
||||
|`KC_SELECT` |`KC_SLCT` |Select | | |✔ |
|
||||
|`KC_STOP` | |Stop | | |✔ |
|
||||
|`KC_AGAIN` |`KC_AGIN` |Again | | |✔ |
|
||||
|`KC_UNDO` | |アンドゥ | | |✔ |
|
||||
|`KC_CUT` | |カット | | |✔ |
|
||||
|`KC_COPY` | |コピー | | |✔ |
|
||||
|`KC_PASTE` |`KC_PSTE` |ペースト | | |✔ |
|
||||
|`KC_FIND` | |検索 | | |✔ |
|
||||
|`KC__MUTE` | |ミュート | |✔ |✔ |
|
||||
|`KC__VOLUP` | |音量アップ | |✔ |✔ |
|
||||
|`KC__VOLDOWN` | |音量ダウン | |✔ |✔ |
|
||||
|`KC_LOCKING_CAPS` |`KC_LCAP` |Caps Lock のロック |✔ |✔ | |
|
||||
|`KC_LOCKING_NUM` |`KC_LNUM` |Num Lock のロック |✔ |✔ | |
|
||||
|`KC_LOCKING_SCROLL` |`KC_LSCR` |Scroll Lock のロック |✔ |✔ | |
|
||||
|`KC_KP_COMMA` |`KC_PCMM` |テンキー `,` | | |✔ |
|
||||
|`KC_KP_EQUAL_AS400` | |AS/400 キーボードのテンキー `=` | | | |
|
||||
|`KC_INT1` |`KC_RO` |JIS `\` と `_` |✔ | |✔ |
|
||||
|`KC_INT2` |`KC_KANA` |JIS カタカナ/ひらがな |✔ | |✔ |
|
||||
|`KC_INT3` |`KC_JYEN` |JIS `¥` と `\|` |✔ | |✔ |
|
||||
|`KC_INT4` |`KC_HENK` |JIS 変換 |✔ | |✔ |
|
||||
|`KC_INT5` |`KC_MHEN` |JIS 無変換 |✔ | |✔ |
|
||||
|`KC_INT6` | |JIS テンキー `,` | | |✔ |
|
||||
|`KC_INT7` | |International 7 | | | |
|
||||
|`KC_INT8` | |International 8 | | | |
|
||||
|`KC_INT9` | |International 9 | | | |
|
||||
|`KC_LANG1` |`KC_HAEN` |ハングル/英語 | | |✔ |
|
||||
|`KC_LANG2` |`KC_HANJ` |韓文漢字 | | |✔ |
|
||||
|`KC_LANG3` | |JIS カタカナ | | |✔ |
|
||||
|`KC_LANG4` | |JIS ひらがな | | |✔ |
|
||||
|`KC_LANG5` | |JIS 全角/半角 | | |✔ |
|
||||
|`KC_LANG6` | |Language 6 | | | |
|
||||
|`KC_LANG7` | |Language 7 | | | |
|
||||
|`KC_LANG8` | |Language 8 | | | |
|
||||
|`KC_LANG9` | |Language 9 | | | |
|
||||
|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase | | | |
|
||||
|`KC_SYSREQ` | |SysReq/Attention | | | |
|
||||
|`KC_CANCEL` | |Cancel | | | |
|
||||
|`KC_CLEAR` |`KC_CLR` |Clear | | |✔ |
|
||||
|`KC_PRIOR` | |Prior | | | |
|
||||
|`KC_RETURN` | |Return | | | |
|
||||
|`KC_SEPARATOR` | |Separator | | | |
|
||||
|`KC_OUT` | |Out | | | |
|
||||
|`KC_OPER` | |Oper | | | |
|
||||
|`KC_CLEAR_AGAIN` | |Clear/Again | | | |
|
||||
|`KC_CRSEL` | |CrSel/Props | | | |
|
||||
|`KC_EXSEL` | |ExSel | | | |
|
||||
|`KC_LCTRL` |`KC_LCTL` |左 Control |✔ |✔ |✔ |
|
||||
|`KC_LSHIFT` |`KC_LSFT` |左 Shift |✔ |✔ |✔ |
|
||||
|`KC_LALT` |`KC_LOPT` |左 Alt (Option) |✔ |✔ |✔ |
|
||||
|`KC_LGUI` |`KC_LCMD`, `KC_LWIN` |左 GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|
||||
|`KC_RCTRL` |`KC_RCTL` |右 Control |✔ |✔ |✔ |
|
||||
|`KC_RSHIFT` |`KC_RSFT` |右 Shift |✔ |✔ |✔ |
|
||||
|`KC_RALT` |`KC_ROPT`, `KC_ALGR` |右 Alt (Option/AltGr) |✔ |✔ |✔ |
|
||||
|`KC_RGUI` |`KC_RCMD`, `KC_RWIN` |右 GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|
||||
|`KC_SYSTEM_POWER` |`KC_PWR` |システム電源オフ |✔ |✔<sup>3</sup>|✔ |
|
||||
|`KC_SYSTEM_SLEEP` |`KC_SLEP` |システムスリープ |✔ |✔<sup>3</sup>|✔ |
|
||||
|`KC_SYSTEM_WAKE` |`KC_WAKE` |システムスリープ解除 | |✔<sup>3</sup>|✔ |
|
||||
|`KC_AUDIO_MUTE` |`KC_MUTE` |ミュート |✔ |✔ |✔ |
|
||||
|`KC_AUDIO_VOL_UP` |`KC_VOLU` |音量アップ |✔ |✔<sup>4</sup>|✔ |
|
||||
|`KC_AUDIO_VOL_DOWN` |`KC_VOLD` |音量ダウン |✔ |✔<sup>4</sup>|✔ |
|
||||
|`KC_MEDIA_NEXT_TRACK` |`KC_MNXT` |次の曲へ |✔ |✔<sup>5</sup>|✔ |
|
||||
|`KC_MEDIA_PREV_TRACK` |`KC_MPRV` |前の曲へ |✔ |✔<sup>5</sup>|✔ |
|
||||
|`KC_MEDIA_STOP` |`KC_MSTP` |再生停止 |✔ | |✔ |
|
||||
|`KC_MEDIA_PLAY_PAUSE` |`KC_MPLY` |再生/一時停止 |✔ |✔ |✔ |
|
||||
|`KC_MEDIA_SELECT` |`KC_MSEL` |Media Player 起動 |✔ | |✔ |
|
||||
|`KC_MEDIA_EJECT` |`KC_EJCT` |イジェクト | |✔ |✔ |
|
||||
|`KC_MAIL` | |メール起動 |✔ | |✔ |
|
||||
|`KC_CALCULATOR` |`KC_CALC` |電卓起動 |✔ | |✔ |
|
||||
|`KC_MY_COMPUTER` |`KC_MYCM` |マイコンピュータを開く |✔ | |✔ |
|
||||
|`KC_WWW_SEARCH` |`KC_WSCH` |ブラウザ検索 |✔ | |✔ |
|
||||
|`KC_WWW_HOME` |`KC_WHOM` |ブラウザホーム画面 |✔ | |✔ |
|
||||
|`KC_WWW_BACK` |`KC_WBAK` |ブラウザ戻る |✔ | |✔ |
|
||||
|`KC_WWW_FORWARD` |`KC_WFWD` |ブラウザ進む |✔ | |✔ |
|
||||
|`KC_WWW_STOP` |`KC_WSTP` |ブラウザ読み込み中止 |✔ | |✔ |
|
||||
|`KC_WWW_REFRESH` |`KC_WREF` |ブラウザ再読み込み |✔ | |✔ |
|
||||
|`KC_WWW_FAVORITES` |`KC_WFAV` |ブラウザお気に入り |✔ | |✔ |
|
||||
|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |次の曲へ |✔ |✔<sup>5</sup>|✔ |
|
||||
|`KC_MEDIA_REWIND` |`KC_MRWD` |前の曲へ |✔<sup>6</sup>|✔<sup>5</sup>|✔ |
|
||||
|`KC_BRIGHTNESS_UP` |`KC_BRIU` |画面の明るさアップ |✔ |✔ |✔ |
|
||||
|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |画面の明るさダウン |✔ |✔ |✔ |
|
||||
|
||||
<sup>1. Linux カーネル HID ドライバは [ほぼ全てのキーコード](https://github.com/torvalds/linux/blob/master/drivers/hid/hid-input.c) を識別しますが、デフォルトの関連付けは デスクトップ環境/ウィンドウマネージャによって決まります。</sup><br/>
|
||||
<sup>2. F13-F15 として取り扱われます。</sup><br/>
|
||||
<sup>3. 約3秒間押していると、プロンプトが表示されます。</sup><br/>
|
||||
<sup>4. Shift と Option を押していると、ボリュームレベルの細かいコントロールが可能になります。</sup><br/>
|
||||
<sup>5. iTunes では、タップすると1曲全体がスキップされます。押していると曲の中で早送り/巻き戻しになります。</sup><br/>
|
||||
<sup>6. Windows Media Player は巻き戻しキーを識別しませんが、VLC では早送り/巻き戻しキーで再生速度が変更されます。</sup>
|
||||
|
||||
## Quantum キーコード :id=quantum-keycodes
|
||||
|
||||
[Quantum キーコード](ja/quantum_keycodes.md#qmk-keycodes) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|--------------|-----------|---------------------------------------------------------|
|
||||
|`RESET` | |ファームウエア書き込みのためにキーボードをブートローダーモードにします |
|
||||
|`DEBUG` | |デバッグモードを切り替えます |
|
||||
|`EEPROM_RESET`|`EEP_RST` |キーボードの EEPROM (不揮発メモリ) を再初期化します |
|
||||
|
||||
## オーディオキー :id=audio-keys
|
||||
|
||||
[オーディオ](ja/feature_audio.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|----------------|------------|---------------------------------------|
|
||||
|`AU_ON` | |オーディオモードオン |
|
||||
|`AU_OFF` | |オーディオモードオフ |
|
||||
|`AU_TOG` | |オーディオモードを切り替えます |
|
||||
|`CLICKY_TOGGLE` |`CK_TOGG` |オーディオクリックモードを切り替えます |
|
||||
|`CLICKY_UP` |`CK_UP` |クリック音の周波数を増やします |
|
||||
|`CLICKY_DOWN` |`CK_DOWN` |クリック音の周波数を減らします |
|
||||
|`CLICKY_RESET` |`CK_RST` |周波数をデフォルトに再設定します |
|
||||
|`MU_ON` | |音楽モードをオンにします |
|
||||
|`MU_OFF` | |音楽モードをオフにします |
|
||||
|`MU_TOG` | |音楽モードを切り替えます |
|
||||
|`MU_MOD` | |音楽モードを循環します |
|
||||
|
||||
## バックライト :id=backlighting
|
||||
|
||||
[バックライト](ja/feature_backlight.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|---------|-------------------------------------|
|
||||
|`BL_TOGG`|バックライトをオンあるいはオフにする |
|
||||
|`BL_STEP`|バックライトレベルを循環する |
|
||||
|`BL_ON` |バックライトを最大輝度にセットする |
|
||||
|`BL_OFF` |バックライトをオフにする |
|
||||
|`BL_INC` |バックライトのレベルを上げる |
|
||||
|`BL_DEC` |バックライトのレベルを下げる |
|
||||
|`BL_BRTG`|バックライトの明滅動作を切り替える |
|
||||
|
||||
## ブートマジック :id=bootmagic
|
||||
|
||||
[ブートマジック](ja/feature_bootmagic.md) も見てください。
|
||||
|
||||
| キー | エイリアス| 説明 |
|
||||
|------------------------------------|-----------|-------------------------------------------------------|
|
||||
| `MAGIC_SWAP_CONTROL_CAPSLOCK` | `CL_SWAP` | Caps Lock と左 Control の入れ替え |
|
||||
| `MAGIC_UNSWAP_CONTROL_CAPSLOCK` | `CL_NORM` | Caps Lock と左 Control の入れ替えの解除 |
|
||||
| `MAGIC_CAPSLOCK_TO_CONTROL` | `CL_CTRL` | Caps Lock を Control として扱う |
|
||||
| `MAGIC_UNCAPSLOCK_TO_CONTROL` | `CL_CAPS` | Caps Lock を Control として扱うことを止める |
|
||||
| `MAGIC_SWAP_LCTL_LGUI` | `LCG_SWP` | 左 Control と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_LCTL_LGUI` | `LCG_NRM` | 左 Control と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_RCTL_RGUI` | `RCG_SWP` | 右 Control と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_RCTL_RGUI` | `RCG_NRM` | 右 Control と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_CTL_GUI` | `CG_SWAP` | 両側の Control と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_CTL_GUI` | `CG_NORM` | 両側の Control と GUI の入れ替えを解除 |
|
||||
| `MAGIC_TOGGLE_CTL_GUI` | `CG_TOGG` | 両側の Control と GUI の入れ替えの切り替え |
|
||||
| `MAGIC_SWAP_LALT_LGUI` | `LAG_SWP` | 左 Alt と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_LALT_LGUI` | `LAG_NRM` | 左 Alt と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_RALT_RGUI` | `RAG_SWP` | 右 Alt と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_RALT_RGUI` | `RAG_NRM` | 右 Alt と GUI の入れ替えを解除 |
|
||||
| `MAGIC_SWAP_ALT_GUI` | `AG_SWAP` | 両側の Alt と GUI の入れ替え |
|
||||
| `MAGIC_UNSWAP_ALT_GUI` | `AG_NORM` | 両側の Alt と GUI の入れ替えを解除 |
|
||||
| `MAGIC_TOGGLE_ALT_GUI` | `AG_TOGG` | 両側の Alt と GUI の入れ替えの切り替え |
|
||||
| `MAGIC_NO_GUI` | `GUI_OFF` | GUI キーを無効にする |
|
||||
| `MAGIC_UNNO_GUI` | `GUI_ON` | GUI キーを有効にする |
|
||||
| `MAGIC_SWAP_GRAVE_ESC` | `GE_SWAP` | <code>`</code> とエスケープの入れ替え |
|
||||
| `MAGIC_UNSWAP_GRAVE_ESC` | `GE_NORM` | <code>`</code> とエスケープの入れ替えを解除 |
|
||||
| `MAGIC_SWAP_BACKSLASH_BACKSPACE` | `BS_SWAP` | `\` と Backspace を入れ替え |
|
||||
| `MAGIC_UNSWAP_BACKSLASH_BACKSPACE` | `BS_NORM` | `\` と Backspace の入れ替えを解除する |
|
||||
| `MAGIC_HOST_NKRO` | `NK_ON` | N キーロールオーバーを有効にする |
|
||||
| `MAGIC_UNHOST_NKRO` | `NK_OFF` | N キーロールオーバーを無効にする |
|
||||
| `MAGIC_TOGGLE_NKRO` | `NK_TOGG` | N キーロールオーバーの有効・無効を切り替え |
|
||||
| `MAGIC_EE_HANDS_LEFT` | `EH_LEFT` | 分割キーボードのマスター側を左手に設定(`EE_HANDS` 用) |
|
||||
| `MAGIC_EE_HANDS_RIGHT` | `EH_RGHT` | 分割キーボードのマスター側を右手に設定(`EE_HANDS` 用) |
|
||||
|
||||
## Bluetooth :id=bluetooth
|
||||
|
||||
[Bluetooth](ja/feature_bluetooth.md) も見てください。
|
||||
|
||||
|
||||
|キー |説明 |
|
||||
|----------|--------------------------------------|
|
||||
|`OUT_AUTO`|USB と Bluetooth を自動的に切り替える |
|
||||
|`OUT_USB` |USB のみ |
|
||||
|`OUT_BT` |Bluetooth のみ |
|
||||
|
||||
## 動的マクロ :id=dynamic-macros
|
||||
|
||||
[動的マクロ](ja/feature_dynamic_macros.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|-----------------|---------|-------------------------------------|
|
||||
|`DYN_REC_START1` |`DM_REC1`|マクロ 1 の記録を開始します |
|
||||
|`DYN_REC_START2` |`DM_REC2`|マクロ 2 の記録を開始します |
|
||||
|`DYN_MACRO_PLAY1`|`DM_PLY1`|マクロ 1 を再生します |
|
||||
|`DYN_MACRO_PLAY2`|`DM_PLY2`|マクロ 2 を再生します |
|
||||
|`DYN_REC_STOP` |`DM_RSTP`|現在記録中のマクロの記録を終了します |
|
||||
|
||||
## グレイブエスケープ :id=grave-escape
|
||||
|
||||
[グレイブエスケープ](ja/feature_grave_esc.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|-----------|---------|------------------------------------------------------------------|
|
||||
|`GRAVE_ESC`|`KC_GESC`|押された場合に Escape。Shift あるいは GUI が押されたままの場合は <code>`</code>|
|
||||
|
||||
## キーロック :id=key-lock
|
||||
|
||||
[キーロック](ja/feature_key_lock.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|---------|--------------------------------------------------|
|
||||
|`KC_LOCK`|キーが再び押されるまで次のキーを押したままにします |
|
||||
|
||||
## レイヤー切り替え :id=layer-switching
|
||||
|
||||
[レイヤー切り替え](ja/feature_layers.md#switching-and-toggling-layers) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|----------------|--------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`DF(layer)` |指定されたレイヤーを基本 (デフォルト) レイヤーに設定する |
|
||||
|`MO(layer)` |キーを押したら一時的に `layer` を切り替える。(切り替え先のレイヤーには `KC_TRNS` が必要です) |
|
||||
|`OSL(layer)` |次のキーが押されるまで、一時的にレイヤーをアクティブにします。詳細は [ワンショットキー](ja/one_shot_keys.md) のとおり。 |
|
||||
|`LM(layer, mod)`|`mod` がアクティブな状態で (MO のように) 一時的にレイヤーをアクティブにします。ここでは、`mod` は mods_bit のことです。Mod については [こちら](ja/mod_tap.md) で見ることができます。実装例: `LM(LAYER_1, MOD_LALT)` |
|
||||
|`LT(layer, kc)` |押していると `layer` をオンにし、タップすると `kc` になります。 |
|
||||
|`TG(layer)` |`layer` のオン・オフを切り替え |
|
||||
|`TO(layer)` |`layer` をオンにして、デフォルトレイヤーを除く他のレイヤーをオフにします。 |
|
||||
|`TT(layer)` |複数回タップしない限り `MO` のように動作し、複数回タップすると `layer` をオンにトグルします。 |
|
||||
|
||||
## リーダーキー :id=leader-key
|
||||
|
||||
[リーダーキー](ja/feature_leader_key.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|---------|-------------------------------|
|
||||
|`KC_LEAD`|リーダーキーのシーケンスを開始 |
|
||||
|
||||
## マウスキー :id=mouse-keys
|
||||
|
||||
[マウスキー](ja/feature_mouse_keys.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|----------------|---------|-------------------------|
|
||||
|`KC_MS_UP` |`KC_MS_U`|マウスカーソルを上に移動 |
|
||||
|`KC_MS_DOWN` |`KC_MS_D`|マウスカーソルを下に移動 |
|
||||
|`KC_MS_LEFT` |`KC_MS_L`|マウスカーソルを左に移動 |
|
||||
|`KC_MS_RIGHT` |`KC_MS_R`|マウスカーソルを右に移動 |
|
||||
|`KC_MS_BTN1` |`KC_BTN1`|ボタン1を押す |
|
||||
|`KC_MS_BTN2` |`KC_BTN2`|ボタン2を押す |
|
||||
|`KC_MS_BTN3` |`KC_BTN3`|ボタン3を押す |
|
||||
|`KC_MS_BTN4` |`KC_BTN4`|ボタン4を押す |
|
||||
|`KC_MS_BTN5` |`KC_BTN5`|ボタン5を押す |
|
||||
|`KC_MS_WH_UP` |`KC_WH_U`|ホイールを向こう側に回転 |
|
||||
|`KC_MS_WH_DOWN` |`KC_WH_D`|ホイールを手前側に回転 |
|
||||
|`KC_MS_WH_LEFT` |`KC_WH_L`|ホイールを左に倒す |
|
||||
|`KC_MS_WH_RIGHT`|`KC_WH_R`|ホイールを右に倒す |
|
||||
|`KC_MS_ACCEL0` |`KC_ACL0`|速度を0に設定 |
|
||||
|`KC_MS_ACCEL1` |`KC_ACL1`|速度を1に設定 |
|
||||
|`KC_MS_ACCEL2` |`KC_ACL2`|速度を2に設定 |
|
||||
|
||||
## 修飾キー :id=modifiers
|
||||
|
||||
[修飾キー](ja/feature_advanced_keycodes.md#modifier-keys) も見てください。
|
||||
|
||||
| キー | エイリアス | 説明 |
|
||||
|------------|---------------------------------|---------------------------------------------------------------|
|
||||
| `LCTL(kc)` | `C(kc)` | 左 Control を押しながら `kc` を押します。 |
|
||||
| `LSFT(kc)` | `S(kc)` | 左 Shift を押しながら `kc` を押します。 |
|
||||
| `LALT(kc)` | `A(kc)`, `LOPT(kc)` | 左 Alt を押しながら `kc`を押します。 |
|
||||
| `LGUI(kc)` | `G(kc)`, `LCMD(kc)`, `LWIN(kc)` | 左 GUI を押しながら `kc` を押します。 |
|
||||
| `RCTL(kc)` | | 右 Control を押しながら `kc` を押します。 |
|
||||
| `RSFT(kc)` | | 右 Shift を押しながら `kc` を押します。 |
|
||||
| `RALT(kc)` | `ROPT(kc)`, `ALGR(kc)` | 右 Alt (AltGr) を押しながら `kc` を押します。 |
|
||||
| `RGUI(kc)` | `RCMD(kc)`, `LWIN(kc)` | 右 GUI を押しながら `kc` を押します。 |
|
||||
| `SGUI(kc)` | `SCMD(kc)`, `SWIN(kc)` | 左 Shift と GUI を押しながら `kc` を押します。 |
|
||||
| `LCA(kc)` | | 左 Control と Alt を押しながら `kc` を押します。 |
|
||||
| `LSA(kc)` | | 左 Shift と Alt を押しながら `kc` を押します。 |
|
||||
| `RSA(kc)` |`SAGR(kc)` | 右 Shift と Alt (AltGr) を押しながら `kc` を押します。 |
|
||||
| `RCS(kc)` | | 右 Control と Shift を押しながら `kc` を押します。 |
|
||||
| `LCAG(kc)` | | 左 Control、Alt、GUI を押しながら `kc` を押します。 |
|
||||
| `MEH(kc)` | | 左 Control、Shift、Alt を押しながら `kc` を押します。 |
|
||||
| `HYPR(kc)` | | 左 Control、Shift、Alt、GUI を押しながら `kc` を押します。 |
|
||||
| `KC_MEH` | | 左 Control、Shift、Alt |
|
||||
| `KC_HYPR` | | 左 Control、Shift、Alt、GUI |
|
||||
|
||||
|
||||
## モッドタップキー :id=mod-tap-keys
|
||||
|
||||
[モッドタップキー](ja/mod_tap.md) も見てください。
|
||||
|
||||
|キー |エイリアス | 説明 |
|
||||
|--------------|-------------------------------------------------------------------|------------------------------------------------------------------------|
|
||||
| `MT(mod, kc)`| |押したままの場合は `mod` 、タップした場合は `kc` |
|
||||
| `LCTL_T(kc)` | `CTL_T(kc)` | 押したままの場合は左 Control、タップした場合は `kc` |
|
||||
| `LSFT_T(kc)` | `SFT_T(kc)` | 押したままの場合は左 Shift、タップした場合は `kc` |
|
||||
| `LALT_T(kc)` | `LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` | 押したままの場合は左 Alt、タップした場合は `kc` |
|
||||
| `LGUI_T(kc)` | `LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)` | 押したままの場合は左 GUI、タップした場合は `kc` |
|
||||
| `RCTL_T(kc)` | | 押したままの場合は右 Control、タップした場合は `kc` |
|
||||
| `RSFT_T(kc)` | | 押したままの場合は右 Shift、タップした場合は `kc` |
|
||||
| `RALT_T(kc)` | `ROPT_T(kc)`, `ALGR_T(kc)` | 押したままの場合は右 Alt (AltGr) 、タップした場合は `kc` |
|
||||
| `RGUI_T(kc)` | `RCMD_T(kc)`, `RWIN_T(kc)` | 押したままの場合は右 GUI、タップした場合は `kc` |
|
||||
| `SGUI_T(kc)` | `SCMD_T(kc)`, `SWIN_T(kc)` | 押したままの場合は左 Shift と GUI、タップした場合は `kc` |
|
||||
| `LCA_T(kc)` | | 押したままの場合は左 Control と Alt、タップした場合は `kc` |
|
||||
| `LSA_T(kc)` | | 押したままの場合は左 Shift と Alt、タップした場合は `kc` |
|
||||
| `RSA_T(kc)` |`SAGR_T(kc)` | 押したままの場合は右 Shift と Alt (AltGr) 、タップした場合は `kc` |
|
||||
| `RCS_T(kc)` | | 押したままの場合は右 Control と Shift、タップした場合は `kc` |
|
||||
| `LCAG_T(kc)` | | 押したままの場合は左 Control、Alt、GUI、タップした場合は `kc` |
|
||||
| `RCAG_T(kc)` | | 押したままの場合は右 Control、Alt、GUI、タップした場合は `kc` |
|
||||
| `C_S_T(kc)` | | 押したままの場合は左 Control と Shift、タップした場合は `kc` |
|
||||
| `MEH_T(kc)` | | 押したままの場合は左 Control、Shift、Alt、タップした場合は `kc` |
|
||||
| `HYPR_T(kc)` | `ALL_T(kc)` | 押したままの場合は左 Control、Shift、Alt、GUI、タップした場合は `kc` - より詳しくは[ここ](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)を見てください |
|
||||
|
||||
## RGB ライト :id=rgb-lighting
|
||||
|
||||
[RGB ライト](ja/feature_rgblight.md) も見てください。
|
||||
|
||||
|キー |エイリアス|説明 |
|
||||
|-------------------|----------|---------------------------------------------------------------------|
|
||||
|`RGB_TOG` | |RGB ライトのオン・オフを切り替え |
|
||||
|`RGB_MODE_FORWARD` |`RGB_MOD` |RGB モードを順送りで変更し、Shift を押していると逆順で変更します。 |
|
||||
|`RGB_MODE_REVERSE` |`RGB_RMOD`|RGB モードを逆順で変更し、Shift を押していると順送りで変更します。 |
|
||||
|`RGB_HUI` | |色相 (HUE) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_HUD` | |色相 (HUE) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_SAI` | |彩度 (SAT) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_SAD` | |彩度 (SAT) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_VAI` | |明度 (VAL/brightness) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_VAD` | |明度 (VAL/brightness) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_MODE_PLAIN` |`RGB_M_P `|静止(動き無し) モードに固定します |
|
||||
|`RGB_MODE_BREATHE` |`RGB_M_B` |明滅アニメーションモード |
|
||||
|`RGB_MODE_RAINBOW` |`RGB_M_R` |レインボーアニメーションモード |
|
||||
|`RGB_MODE_SWIRL` |`RGB_M_SW`|渦巻アニメーションモード |
|
||||
|`RGB_MODE_SNAKE` |`RGB_M_SN`|スネークアニメーションモード |
|
||||
|`RGB_MODE_KNIGHT` |`RGB_M_K` |「ナイトライダー」アニメーションモード |
|
||||
|`RGB_MODE_XMAS` |`RGB_M_X` |クリスマスアニメーションモード |
|
||||
|`RGB_MODE_GRADIENT`|`RGB_M_G` |固定階調アニメーションモード |
|
||||
|`RGB_MODE_RGBTEST` |`RGB_M_T` |赤、緑、青のテストアニメーションモード |
|
||||
|
||||
## RGB マトリックスライト :id=rgb-matrix-lighting
|
||||
|
||||
[RGB マトリックスライト](ja/feature_rgb_matrix.md) も見てください。
|
||||
|
||||
|キー |エイリアス|説明 |
|
||||
|-------------------|----------|--------------------------------------------------------------------------------------------------------|
|
||||
|`RGB_TOG` | |RGB ライトのオン・オフを切り替え |
|
||||
|`RGB_MODE_FORWARD` |`RGB_MOD` |RGB モードを順送りで変更し、Shift を押していると逆順で変更します。 |
|
||||
|`RGB_MODE_REVERSE` |`RGB_RMOD`|RGB モードを逆順で変更し、Shift を押していると順送りで変更します。 |
|
||||
|`RGB_HUI` | |色相 (HUE) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_HUD` | |色相 (HUE) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_SAI` | |彩度 (SAT) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_SAD` | |彩度 (SAT) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_VAI` | |明度 (VAL/brightness) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_VAD` | |明度 (VAL/brightness) を減少させ、Shift を押していると増加させます。 |
|
||||
|`RGB_SPI` | |エフェクトのスピード (EEPROM はまだサポートしていません) を増加させ、Shift を押していると減少させます。 |
|
||||
|`RGB_SPD` | |エフェクトのスピード (EEPROM はまだサポートしていません) を減少させ、Shift を押していると増加させます。 |
|
||||
|
||||
## 感熱式プリンタ :id=thermal-printer
|
||||
|
||||
[感熱式プリンタ](ja/feature_thermal_printer.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|-----------|---------------------------------|
|
||||
|`PRINT_ON` |ユーザが入力した全ての印刷を開始 |
|
||||
|`PRINT_OFF`|ユーザが入力した全ての印刷を停止 |
|
||||
|
||||
## US ANSI シフト済シンボル :id=us-ansi-shifted-symbols
|
||||
|
||||
[US ANSI シフト済シンボル](ja/keycodes_us_ansi_shifted.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明|
|
||||
|------------------------|-------------------|-----------|
|
||||
|`KC_TILDE` |`KC_TILD` |`~` |
|
||||
|`KC_EXCLAIM` |`KC_EXLM` |`!` |
|
||||
|`KC_AT` | |`@` |
|
||||
|`KC_HASH` | |`#` |
|
||||
|`KC_DOLLAR` |`KC_DLR` |`$` |
|
||||
|`KC_PERCENT` |`KC_PERC` |`%` |
|
||||
|`KC_CIRCUMFLEX` |`KC_CIRC` |`^` |
|
||||
|`KC_AMPERSAND` |`KC_AMPR` |`&` |
|
||||
|`KC_ASTERISK` |`KC_ASTR` |`*` |
|
||||
|`KC_LEFT_PAREN` |`KC_LPRN` |`(` |
|
||||
|`KC_RIGHT_PAREN` |`KC_RPRN` |`)` |
|
||||
|`KC_UNDERSCORE` |`KC_UNDS` |`_` |
|
||||
|`KC_PLUS` | |`+` |
|
||||
|`KC_LEFT_CURLY_BRACE` |`KC_LCBR` |`{` |
|
||||
|`KC_RIGHT_CURLY_BRACE` |`KC_RCBR` |`}` |
|
||||
|`KC_PIPE` | |`\|` |
|
||||
|`KC_COLON` |`KC_COLN` |`:` |
|
||||
|`KC_DOUBLE_QUOTE` |`KC_DQUO`, `KC_DQT`|`"` |
|
||||
|`KC_LEFT_ANGLE_BRACKET` |`KC_LABK`, `KC_LT` |`<` |
|
||||
|`KC_RIGHT_ANGLE_BRACKET`|`KC_RABK`, `KC_GT` |`>` |
|
||||
|`KC_QUESTION` |`KC_QUES` |`?` |
|
||||
|
||||
## ワンショットキー :id=one-shot-keys
|
||||
|
||||
[ワンショットキー](ja/one_shot_keys.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|------------|--------------------------------|
|
||||
|`OSM(mod)` | 次のキーが押されるまで、`mod` を押したままにします |
|
||||
|`OSL(layer)`| 次のキーが押されるまで、一時的にレイヤーをアクティブにします |
|
||||
|
||||
## Space Cadet :id=space-cadet
|
||||
|
||||
[Space Cadet](ja/feature_space_cadet.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|-----------|-------------------------------------------|
|
||||
|`KC_LCPO` |押したままの場合は左 Control、タップした場合は `(` |
|
||||
|`KC_RCPC` |押したままの場合は右 Control、タップした場合は `)` |
|
||||
|`KC_LSPO` |押したままの場合は左 Shift、タップした場合は `(`、 |
|
||||
|`KC_RSPC` |押したままの場合は右 Shift、タップした場合は `)`、 |
|
||||
|`KC_LAPO` |押したままの場合は左 Alt、タップした場合は `(`、 |
|
||||
|`KC_RAPC` |押したままの場合は右 Alt、タップした場合は `)`、 |
|
||||
|`KC_SFTENT`|押したままの場合は右 Shift、タップした場合は Enter |
|
||||
|
||||
## スワップハンド :id=swap-hands
|
||||
|
||||
[スワップハンド](ja/feature_swap_hands.md) も見てください。
|
||||
|
||||
|キー |説明 |
|
||||
|-------------|----------------------------------------------------------------------------------|
|
||||
| `SH_T(key)` | タップで `key` を送信する。押している時に一時的に入れ替え。 |
|
||||
| `SH_ON` | 入れ替えをオンにして、そのままにする。 |
|
||||
| `SH_OFF` | 入れ替えをオフにして、そのままにする。既知の状態に戻るのに適しています。 |
|
||||
| `SH_MON` | 押すとスワップハンドし、放すと通常に戻る (一時的)。 |
|
||||
| `SH_MOFF` | 一時的に入れ替えをオフする。 |
|
||||
| `SH_TG` | キーを押すたびにオンとオフを切り替える。 |
|
||||
| `SH_TT` | タップで切り替える。押している時に一時的に切り替える。 |
|
||||
| `SH_OS` | ワンショットスワップハンド: 押している時あるいは次のキーを押すまで切り替える。 |
|
||||
|
||||
## ユニコードサポート :id=unicode-support
|
||||
|
||||
[ユニコードサポート](ja/feature_unicode.md) も見てください。
|
||||
|
||||
|キー |エイリアス |説明 |
|
||||
|----------------------|-----------|----------------------------------------------------------------------|
|
||||
|`UC(c)` | |コードポイント `c` のユニコードを送信 |
|
||||
|`X(i)` | |`unicode_map` のインデックス `i` のユニコードを送信 |
|
||||
|`XP(i, j)` | |Shift/Capsが有効なら、インデックス `i` または `j` のユニコードを送信 |
|
||||
|`UNICODE_MODE_FORWARD`|`UC_MOD` |ユニコード入力方式を順送りで選択 |
|
||||
|`UNICODE_MODE_REVERSE`|`UC_RMOD` |ユニコード入力方式を逆順で選択 |
|
||||
|`UNICODE_MODE_OSX` |`UC_M_OS` |ユニコード入力方式を macOS 方式に切り替え |
|
||||
|`UNICODE_MODE_LNX` |`UC_M_LN` |ユニコード入力方式を Linux 方式に切り替え |
|
||||
|`UNICODE_MODE_WIN` |`UC_M_WI` |ユニコード入力方式を Windows 方式に切り替え |
|
||||
|`UNICODE_MODE_BSD` |`UC_M_BS` |ユニコード入力方式を BSD 方式に切り替え (実装されていません) |
|
||||
|`UNICODE_MODE_WINC` |`UC_M_WC` |ユニコード入力方式を WinCompose を使う Windows 方式に切り替え |
|
@@ -147,6 +147,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
* [`bool process_haptic(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/2cee371bf125a6ec541dd7c5a809573facc7c456/drivers/haptic/haptic.c#L216)
|
||||
* [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/card.c#L20)
|
||||
* [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
|
||||
* [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/rgb_matrix.c#L139)
|
||||
* [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_midi.c#L81)
|
||||
* [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_audio.c#L19)
|
||||
* [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_steno.c#L160)
|
||||
|
@@ -93,7 +93,7 @@ And to do so, add `reset_keyboard()` to your function or macro, and this will re
|
||||
|
||||
## Wiping the EEPROM (Persistent Storage)
|
||||
|
||||
If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). To force an EEPROM reset, use the [`EEP_RST` keycode](quantum_keycodes.md) or [Bootmagic](feature_bootmagic.md) functionality. If neither of those are an option, then you can use a custom macro to do so.
|
||||
If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). Bootmagic is one way to do this, but if that isn't enabled, then you can use a custom macro to do so.
|
||||
|
||||
To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default.
|
||||
|
||||
|
@@ -8,7 +8,7 @@ No special setup is required - just connect the `SS`, `SCK`, `MOSI` and `MISO` p
|
||||
|
||||
|MCU |`SS`|`SCK`|`MOSI`|`MISO`|
|
||||
|-----------------|----|-----|------|------|
|
||||
|ATmega16/32U2/4 |`B0`|`B1` |`B2` |`B3` |
|
||||
|ATMega16/32U2/4 |`B0`|`B1` |`B2` |`B3` |
|
||||
|AT90USB64/128/162|`B0`|`B1` |`B2` |`B3` |
|
||||
|ATmega32A |`B4`|`B7` |`B5` |`B6` |
|
||||
|ATmega328/P |`B2`|`B5` |`B3` |`B4` |
|
||||
@@ -20,34 +20,22 @@ You may use more than one slave select pin, not just the `SS` pin. This is usefu
|
||||
|
||||
You'll need to determine which pins can be used for SPI -- as an example, STM32 parts generally have multiple SPI peripherals, labeled SPI1, SPI2, SPI3 etc.
|
||||
|
||||
To enable SPI, modify your board's `halconf.h` to enable SPI:
|
||||
To enable SPI, modify your board's `halconf.h` to enable SPI - both `HAL_USE_SPI` and `SPI_USE_WAIT` should be `TRUE`, and `SPI_SELECT_MODE` should be `SPI_SELECT_MODE_PAD`.
|
||||
Then, modify your board's `mcuconf.h` to enable the SPI peripheral you've chosen -- in the case of using SPI2, modify `STM32_SPI_USE_SPI2` to be `TRUE`.
|
||||
|
||||
```c
|
||||
#define HAL_USE_SPI TRUE
|
||||
#define SPI_USE_WAIT TRUE
|
||||
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
|
||||
```
|
||||
|
||||
Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
|
||||
|
||||
```c
|
||||
#undef STM32_SPI_USE_SPI2
|
||||
#define STM32_SPI_USE_SPI2 TRUE
|
||||
```
|
||||
As per the AVR configuration, you may select any other standard GPIO as a slave select pin, and can be supplied to `spi_start()`.
|
||||
|
||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||
|
||||
|`config.h` Override|Description |Default|
|
||||
|-------------------|-------------------------------------------------------------|-------|
|
||||
|`SPI_DRIVER` |SPI peripheral to use - SPI1 -> `SPID1`, SPI2 -> `SPID2` etc.|`SPID2`|
|
||||
|`SPI_SCK_PIN` |The pin to use for SCK |`B13` |
|
||||
|`SPI_SCK_PAL_MODE` |The alternate function mode for SCK |`5` |
|
||||
|`SPI_MOSI_PIN` |The pin to use for MOSI |`B15` |
|
||||
|`SPI_MOSI_PAL_MODE`|The alternate function mode for MOSI |`5` |
|
||||
|`SPI_MISO_PIN` |The pin to use for MISO |`B14` |
|
||||
|`SPI_MISO_PAL_MODE`|The alternate function mode for MISO |`5` |
|
||||
|
||||
As per the AVR configuration, you may choose any other standard GPIO as a slave select pin, which should be supplied to `spi_start()`.
|
||||
`config.h` override | Description | Default Value
|
||||
----------------------------|---------------------------------------------------------------|--------------
|
||||
`#define SPI_DRIVER` | SPI peripheral to use - SPI1 => `SPID1`, SPI2 => `SPID2` etc. | `SPID2`
|
||||
`#define SPI_SCK_PIN` | The pin to use for the SCK | `B13`
|
||||
`#define SPI_SCK_PAL_MODE` | The alternate function mode for the SCK pin | `5`
|
||||
`#define SPI_MOSI_PIN` | The pin to use for the MOSI | `B15`
|
||||
`#define SPI_MOSI_PAL_MODE` | The alternate function mode for the MOSI pin | `5`
|
||||
`#define SPI_MISO_PIN` | The pin to use for the MISO | `B14`
|
||||
`#define SPI_MISO_PAL_MODE` | The alternate function mode for the MISO pin | `5`
|
||||
|
||||
## Functions
|
||||
|
||||
@@ -124,7 +112,7 @@ Send multiple bytes to the selected SPI device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
|
||||
`SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_SUCCESS` on success, or `SPI_STATUS_ERROR` otherwise.
|
||||
|
||||
---
|
||||
|
||||
@@ -141,7 +129,7 @@ Receive multiple bytes from the selected SPI device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
|
||||
`SPI_STATUS_TIMEOUT` if the internal transmission timeout period elapses, `SPI_STATUS_SUCCESS` on success, or `SPI_STATUS_ERROR` otherwise.
|
||||
|
||||
---
|
||||
|
||||
|
@@ -87,7 +87,7 @@ To enable this setting, add this to your `config.h`:
|
||||
#define IGNORE_MOD_TAP_INTERRUPT
|
||||
```
|
||||
|
||||
Similar to Permissive Hold, this alters how the firmware processes inputs for fast typists. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the Mod plus the normal key, even if pressed within the `TAPPING_TERM`. This may not be desirable for rolling combo keys, or for fast typists who have a Mod Tap on a frequently used key (`RCTL_T(KC_QUOT)`, for example).
|
||||
Similar to Permissive Hold, this alters how the firmware processes inputs for fast typists. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the tapping function for both keys. This may not be desirable for rolling combo keys.
|
||||
|
||||
Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_TERM` to trigger the hold function (the mod).
|
||||
|
||||
@@ -98,7 +98,7 @@ For Instance:
|
||||
- `SFT_T(KC_A)` Up
|
||||
- `KC_X` Up
|
||||
|
||||
Normally, this would send a capital `X` (`SHIFT`+`x`), or, Mod + key. With `Ignore Mod Tap Interrupt` enabled, holding both keys are required for the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold on both will still output capital `X` (`SHIFT`+`x`).
|
||||
Normally, this would send `X` (`SHIFT`+`x`). With `Ignore Mod Tap Interrupt` enabled, holding both keys are required for the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold on both will still output `X` (`SHIFT`+`x`).
|
||||
|
||||
|
||||
?> __Note__: This only concerns modifiers and not layer switching keys.
|
||||
|
@@ -142,6 +142,7 @@ The `process_record()` function itself is deceptively simple, but hidden within
|
||||
* [`bool process_haptic(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/2cee371bf125a6ec541dd7c5a809573facc7c456/drivers/haptic/haptic.c#L216)
|
||||
* [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/card.c#L20)
|
||||
* [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
|
||||
* [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/rgb_matrix.c#L139)
|
||||
* [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_midi.c#L81)
|
||||
* [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_audio.c#L19)
|
||||
* [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_steno.c#L160)
|
||||
|
@@ -67,27 +67,19 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
|
||||
#define w_onecycles (((F_CPU / 1000) * w_onepulse + 500000) / 1000000)
|
||||
#define w_totalcycles (((F_CPU / 1000) * w_totalperiod + 500000) / 1000000)
|
||||
|
||||
// w1_nops - nops between rising edge and falling edge - low
|
||||
#if w_zerocycles >= w_fixedlow
|
||||
# define w1_nops (w_zerocycles - w_fixedlow)
|
||||
// w1 - nops between rising edge and falling edge - low
|
||||
#define w1 (w_zerocycles - w_fixedlow)
|
||||
// w2 nops between fe low and fe high
|
||||
#define w2 (w_onecycles - w_fixedhigh - w1)
|
||||
// w3 nops to complete loop
|
||||
#define w3 (w_totalcycles - w_fixedtotal - w1 - w2)
|
||||
|
||||
#if w1 > 0
|
||||
# define w1_nops w1
|
||||
#else
|
||||
# define w1_nops 0
|
||||
#endif
|
||||
|
||||
// w2_nops - nops between fe low and fe high
|
||||
#if w_onecycles >= (w_fixedhigh + w1_nops)
|
||||
# define w2_nops (w_onecycles - w_fixedhigh - w1_nops)
|
||||
#else
|
||||
# define w2_nops 0
|
||||
#endif
|
||||
|
||||
// w3_nops - nops to complete loop
|
||||
#if w_totalcycles >= (w_fixedtotal + w1_nops + w2_nops)
|
||||
# define w3_nops (w_totalcycles - w_fixedtotal - w1_nops - w2_nops)
|
||||
#else
|
||||
# define w3_nops 0
|
||||
#endif
|
||||
|
||||
// The only critical timing parameter is the minimum pulse length of the "0"
|
||||
// Warn or throw error if this timing can not be met with current F_CPU settings.
|
||||
#define w_lowtime ((w1_nops + w_fixedlow) * 1000000) / (F_CPU / 1000)
|
||||
@@ -98,6 +90,18 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
|
||||
# warning "Please consider a higher clockspeed, if possible"
|
||||
#endif
|
||||
|
||||
#if w2 > 0
|
||||
# define w2_nops w2
|
||||
#else
|
||||
# define w2_nops 0
|
||||
#endif
|
||||
|
||||
#if w3 > 0
|
||||
# define w3_nops w3
|
||||
#else
|
||||
# define w3_nops 0
|
||||
#endif
|
||||
|
||||
#define w_nop1 "nop \n\t"
|
||||
#define w_nop2 "rjmp .+0 \n\t"
|
||||
#define w_nop4 w_nop2 w_nop2
|
||||
|
@@ -18,7 +18,12 @@
|
||||
|
||||
#include "quantum.h"
|
||||
|
||||
static SerialConfig serialConfig = {SERIAL_DEFAULT_BITRATE, SD1_CR1, SD1_CR2, SD1_CR3};
|
||||
static SerialConfig serialConfig = {
|
||||
SERIAL_DEFAULT_BITRATE,
|
||||
SD1_CR1,
|
||||
SD1_CR2,
|
||||
SD1_CR3
|
||||
};
|
||||
|
||||
void uart_init(uint32_t baud) {
|
||||
static bool is_initialised = false;
|
||||
@@ -39,7 +44,9 @@ void uart_init(uint32_t baud) {
|
||||
}
|
||||
}
|
||||
|
||||
void uart_putchar(uint8_t c) { sdPut(&SERIAL_DRIVER, c); }
|
||||
void uart_putchar(uint8_t c) {
|
||||
sdPut(&SERIAL_DRIVER, c);
|
||||
}
|
||||
|
||||
uint8_t uart_getchar(void) {
|
||||
msg_t res = sdGet(&SERIAL_DRIVER);
|
||||
@@ -47,4 +54,6 @@ uint8_t uart_getchar(void) {
|
||||
return (uint8_t)res;
|
||||
}
|
||||
|
||||
bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); }
|
||||
bool uart_available(void) {
|
||||
return !sdGetWouldBlock(&SERIAL_DRIVER);
|
||||
}
|
||||
|
@@ -1,76 +0,0 @@
|
||||
/* Copyright 2021 Nick Brassel (@tzarc)
|
||||
*
|
||||
* 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 <quantum.h>
|
||||
|
||||
#ifndef USBPD_UCPD1_CFG1
|
||||
# define USBPD_UCPD1_CFG1 (UCPD_CFG1_PSC_UCPDCLK_0 | UCPD_CFG1_TRANSWIN_3 | UCPD_CFG1_IFRGAP_4 | UCPD_CFG1_HBITCLKDIV_4)
|
||||
#endif // USBPD_UCPD1_CFG1
|
||||
|
||||
// Initialises the USBPD subsystem
|
||||
__attribute__((weak)) void usbpd_init(void) {
|
||||
// Disable dead-battery signals
|
||||
PWR->CR3 |= PWR_CR3_UCPD_DBDIS;
|
||||
// Enable the clock for the UCPD1 peripheral
|
||||
RCC->APB1ENR2 |= RCC_APB1ENR2_UCPD1EN;
|
||||
|
||||
// Copy the existing value
|
||||
uint32_t CFG1 = UCPD1->CFG1;
|
||||
// Force-disable UCPD1 before configuring
|
||||
CFG1 &= ~UCPD_CFG1_UCPDEN;
|
||||
// Configure UCPD1
|
||||
CFG1 = USBPD_UCPD1_CFG1;
|
||||
// Apply the changes
|
||||
UCPD1->CFG1 = CFG1;
|
||||
// Enable UCPD1
|
||||
UCPD1->CFG1 |= UCPD_CFG1_UCPDEN;
|
||||
|
||||
// Copy the existing value
|
||||
uint32_t CR = UCPD1->CR;
|
||||
// Clear out ANASUBMODE (irrelevant as a sink device)
|
||||
CR &= ~UCPD_CR_ANASUBMODE_Msk;
|
||||
// Advertise our capabilities as a sink, with both CC lines enabled
|
||||
CR |= UCPD_CR_ANAMODE | UCPD_CR_CCENABLE_Msk;
|
||||
// Apply the changes
|
||||
UCPD1->CR = CR;
|
||||
}
|
||||
|
||||
// Gets the current state of the USBPD allowance
|
||||
__attribute__((weak)) usbpd_allowance_t usbpd_get_allowance(void) {
|
||||
uint32_t CR = UCPD1->CR;
|
||||
|
||||
int ucpd_enabled = (UCPD1->CFG1 & UCPD_CFG1_UCPDEN_Msk) >> UCPD_CFG1_UCPDEN_Pos;
|
||||
int anamode = (CR & UCPD_CR_ANAMODE_Msk) >> UCPD_CR_ANAMODE_Pos;
|
||||
int cc_enabled = (CR & UCPD_CR_CCENABLE_Msk) >> UCPD_CR_CCENABLE_Pos;
|
||||
|
||||
if (ucpd_enabled && anamode && cc_enabled) {
|
||||
uint32_t SR = UCPD1->SR;
|
||||
int vstate_cc1 = (SR & UCPD_SR_TYPEC_VSTATE_CC1_Msk) >> UCPD_SR_TYPEC_VSTATE_CC1_Pos;
|
||||
int vstate_cc2 = (SR & UCPD_SR_TYPEC_VSTATE_CC2_Msk) >> UCPD_SR_TYPEC_VSTATE_CC2_Pos;
|
||||
int vstate_max = vstate_cc1 > vstate_cc2 ? vstate_cc1 : vstate_cc2;
|
||||
switch (vstate_max) {
|
||||
case 0:
|
||||
case 1:
|
||||
return USBPD_500MA; // Note that this is 500mA (i.e. max USB 2.0), not 900mA, as we're not using USB 3.1 as a sink device.
|
||||
case 2:
|
||||
return USBPD_1500MA;
|
||||
case 3:
|
||||
return USBPD_3000MA;
|
||||
}
|
||||
}
|
||||
|
||||
return USBPD_500MA;
|
||||
}
|
@@ -186,7 +186,7 @@ void IS31FL3731_init(uint8_t addr) {
|
||||
}
|
||||
|
||||
void IS31FL3731_set_value(int index, uint8_t value) {
|
||||
if (index >= 0 && index < DRIVER_LED_TOTAL) {
|
||||
if (index >= 0 && index < LED_DRIVER_LED_COUNT) {
|
||||
is31_led led = g_is31_leds[index];
|
||||
|
||||
// Subtract 0x24 to get the second index of g_pwm_buffer
|
||||
@@ -196,7 +196,7 @@ void IS31FL3731_set_value(int index, uint8_t value) {
|
||||
}
|
||||
|
||||
void IS31FL3731_set_value_all(uint8_t value) {
|
||||
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
|
||||
for (int i = 0; i < LED_DRIVER_LED_COUNT; i++) {
|
||||
IS31FL3731_set_value(i, value);
|
||||
}
|
||||
}
|
||||
|
@@ -26,7 +26,7 @@ typedef struct is31_led {
|
||||
uint8_t v;
|
||||
} __attribute__((packed)) is31_led;
|
||||
|
||||
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
||||
extern const is31_led g_is31_leds[LED_DRIVER_LED_COUNT];
|
||||
|
||||
void IS31FL3731_init(uint8_t addr);
|
||||
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
|
||||
|
@@ -1,29 +0,0 @@
|
||||
/* Copyright 2021 Nick Brassel (@tzarc)
|
||||
*
|
||||
* 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
|
||||
|
||||
typedef enum {
|
||||
USBPD_500MA,
|
||||
USBPD_1500MA,
|
||||
USBPD_3000MA,
|
||||
} usbpd_allowance_t;
|
||||
|
||||
// Initialises the USBPD subsystem
|
||||
void usbpd_init(void);
|
||||
|
||||
// Gets the current state of the USBPD allowance
|
||||
usbpd_allowance_t usbpd_get_allowance(void);
|
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
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 "1337.h"
|
||||
|
||||
void eeconfig_init_kb(void) {
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
backlight_enable();
|
||||
backlight_level(5);
|
||||
#endif
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_enable();
|
||||
rgblight_sethsv(0, 255, 255);
|
||||
#ifdef RGBLIGHT_ANIMATIONS
|
||||
rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
eeconfig_update_kb(0);
|
||||
eeconfig_init_user();
|
||||
}
|
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
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"
|
||||
|
||||
/* This a shortcut to help you visually see your layout.
|
||||
*
|
||||
* The first section contains all of the arguments representing the physical
|
||||
* layout of the board and position of the keys.
|
||||
*
|
||||
* The second converts the arguments into a two-dimensional array which
|
||||
* represents the switch matrix.
|
||||
*/
|
||||
#define LAYOUT( \
|
||||
KA1, KA2, KA3, \
|
||||
KB1, KB2, KB3, \
|
||||
KC1, KC2, KC3 \
|
||||
) \
|
||||
{ \
|
||||
{ KA1, KA2, KA3 }, \
|
||||
{ KB1, KB2, KB3 }, \
|
||||
{ KC1, KC2, KC3 } \
|
||||
}
|
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
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 "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
#define VENDOR_ID 0xCB00
|
||||
#define PRODUCT_ID 0x1337
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER 0xCB
|
||||
#define PRODUCT 1337
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 3
|
||||
#define MATRIX_COLS 3
|
||||
|
||||
/* Keyboard Matrix Assignments */
|
||||
#define DIRECT_PINS { \
|
||||
{ D2, D4, F4 }, \
|
||||
{ D7, B1, B3 }, \
|
||||
{ E6, B4, B2 } \
|
||||
}
|
||||
#define TAP_CODE_DELAY 10
|
||||
#define ENCODER_RESOLUTION 4
|
||||
#define ENCODERS_PAD_A { F5 }
|
||||
#define ENCODERS_PAD_B { F6 }
|
||||
|
||||
#define BACKLIGHT_PIN B5
|
||||
// #define BACKLIGHT_BREATHING
|
||||
#define BACKLIGHT_LEVELS 7
|
||||
|
||||
#define RGB_DI_PIN D3
|
||||
#ifdef RGB_DI_PIN
|
||||
#define RGBLED_NUM 5
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
#define RGBLIGHT_VAL_STEP 8
|
||||
#define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
|
||||
#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
||||
/*== all animations enable ==*/
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#endif
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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
|
||||
/* Oled Size */
|
||||
#define OLED_DISPLAY_128X64
|
||||
|
||||
/* QMK DFU */
|
||||
#define QMK_LED B0
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"keyboard_name": "0xCB 1337",
|
||||
"url": "https://0xCB.dev",
|
||||
"maintainer": "Conor-Burns",
|
||||
"width": 3,
|
||||
"height": 3,
|
||||
"layouts": {
|
||||
"LAYOUT": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,189 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
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 QMK_KEYBOARD_H
|
||||
|
||||
enum layer_names {
|
||||
_HOME,
|
||||
_MISC,
|
||||
_RGB,
|
||||
_BLED
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_HOME] = LAYOUT(
|
||||
KC_MPRV, KC_MNXT, KC_MPLY,
|
||||
KC_PGUP, KC_PGDN, TO(3),
|
||||
KC_HOME, KC_END, TO(1)
|
||||
),
|
||||
[_MISC] = LAYOUT(
|
||||
_______, _______, _______,
|
||||
_______, _______, TO(0),
|
||||
_______, _______, TO(2)
|
||||
),
|
||||
[_RGB] = LAYOUT(
|
||||
RGB_HUI, RGB_HUD, RGB_MOD,
|
||||
RGB_SAI, RGB_SAD, TO(1),
|
||||
RGB_SPI, RGB_SPD, TO(3)
|
||||
),
|
||||
[_BLED] = LAYOUT(
|
||||
BL_STEP, BL_BRTG, BL_TOGG,
|
||||
BL_ON, BL_OFF, TO(2),
|
||||
BL_INC, BL_DEC, TO(0)
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
/* rotary encoder (SW3) - add more else if blocks for more granular layer control */
|
||||
#ifdef ENCODER_ENABLE
|
||||
void encoder_update_user(uint8_t index, bool clockwise) {
|
||||
if (IS_LAYER_ON(_RGB)) {
|
||||
if (clockwise) {
|
||||
rgblight_increase_val();
|
||||
} else {
|
||||
rgblight_decrease_val();
|
||||
}
|
||||
} else if (IS_LAYER_ON(_BLED)) {
|
||||
if (clockwise) {
|
||||
backlight_increase();
|
||||
} else {
|
||||
backlight_decrease();
|
||||
}
|
||||
} else {
|
||||
if (clockwise) {
|
||||
tap_code(KC_VOLU);
|
||||
} else {
|
||||
tap_code(KC_VOLD);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* oled stuff :) */
|
||||
#ifdef OLED_DRIVER_ENABLE
|
||||
uint16_t startup_timer;
|
||||
|
||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
||||
startup_timer = timer_read();
|
||||
return rotation;
|
||||
}
|
||||
|
||||
static void render_logo(void) {
|
||||
static const char PROGMEM logo[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05,
|
||||
0xf8, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0x70, 0x78,
|
||||
0x38, 0x3f, 0x1c, 0x0e, 0x0e, 0x0e, 0xfe, 0x0e, 0x0e, 0x1e, 0x1c, 0x3f, 0x38, 0x78, 0x70, 0xe0,
|
||||
0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0xf8, 0x05, 0x02, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa0,
|
||||
0x13, 0xa2, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc,
|
||||
0xfe, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x3c, 0x3c, 0x00, 0x00,
|
||||
0x01, 0xff, 0xff, 0xff, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xa2, 0x13, 0xa0, 0x40, 0x00,
|
||||
0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x80, 0xc0, 0x40, 0x40, 0xc0, 0x80, 0x00, 0x00, 0xc0, 0x40, 0x40, 0xc0, 0x80,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0xc0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x40, 0x40, 0xc0, 0x80, 0x00, 0x00, 0x80, 0xc0, 0x40,
|
||||
0x40, 0xc0, 0x80, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xf9, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x7f, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x0f,
|
||||
0x1f, 0x1f, 0x01, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x0e, 0x0e, 0x80, 0xc0,
|
||||
0xc0, 0xff, 0xff, 0x7f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf9, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x1f, 0x31, 0x40, 0x4e, 0x40, 0x31, 0x1f, 0x00, 0x00, 0x61, 0x16, 0x08, 0x16, 0x61,
|
||||
0x00, 0x00, 0x1f, 0x31, 0x60, 0x40, 0x40, 0x60, 0x20, 0x00, 0x00, 0x7f, 0x44, 0x44, 0x64, 0x3b,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x7f,
|
||||
0x40, 0x40, 0x00, 0x00, 0x00, 0x20, 0x64, 0x44, 0x44, 0x6e, 0x3b, 0x00, 0x00, 0x20, 0x64, 0x44,
|
||||
0x44, 0x6e, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x03, 0x01, 0x00, 0x00, 0x00, 0x08, 0x14,
|
||||
0x23, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x07,
|
||||
0x0f, 0xfe, 0x1e, 0x1c, 0x1c, 0x1c, 0xff, 0x1c, 0x1c, 0x1c, 0x1e, 0xfe, 0x0f, 0x07, 0x03, 0x03,
|
||||
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x11, 0x0a, 0x04, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x1f, 0x00, 0x00, 0x10, 0x28, 0x47, 0x28, 0x10, 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x28, 0x44, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
oled_write_raw_P(logo, sizeof(logo));
|
||||
}
|
||||
/* Shows the name of the current layer and locks for the host (CAPS etc.) */
|
||||
static void render_info(void) {
|
||||
oled_write_P(PSTR("Layer: "), false);
|
||||
|
||||
switch (get_highest_layer(layer_state)) {
|
||||
case _HOME:
|
||||
oled_write_ln_P(PSTR("HOME"), false);
|
||||
break;
|
||||
case _MISC:
|
||||
oled_write_ln_P(PSTR("MISC"), false);
|
||||
break;
|
||||
case _RGB:
|
||||
oled_write_ln_P(PSTR("RGB"), false);
|
||||
break;
|
||||
case _BLED:
|
||||
oled_write_ln_P(PSTR("Backlight"), false);
|
||||
break;
|
||||
default:
|
||||
oled_write_ln_P(PSTR("Undefined"), false);
|
||||
}
|
||||
led_t led_state = host_keyboard_led_state();
|
||||
oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
|
||||
oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
|
||||
oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
|
||||
}
|
||||
|
||||
void oled_task_user(void) {
|
||||
static bool finished_timer = false;
|
||||
if ((timer_elapsed(startup_timer) < 3000) && !finished_timer) {
|
||||
render_logo();
|
||||
} else {
|
||||
finished_timer = true;
|
||||
render_info();
|
||||
}
|
||||
}
|
||||
#endif
|
@@ -1,189 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 0xCB - Conor Burns
|
||||
|
||||
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 QMK_KEYBOARD_H
|
||||
|
||||
enum layer_names {
|
||||
_HOME,
|
||||
_MISC,
|
||||
_RGB,
|
||||
_BLED
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_HOME] = LAYOUT(
|
||||
KC_MPRV, KC_MNXT, KC_MPLY,
|
||||
KC_PGUP, KC_PGDN, TO(3),
|
||||
KC_HOME, KC_END, TO(1)
|
||||
),
|
||||
[_MISC] = LAYOUT(
|
||||
_______, _______, _______,
|
||||
_______, _______, TO(0),
|
||||
_______, _______, TO(2)
|
||||
),
|
||||
[_RGB] = LAYOUT(
|
||||
RGB_HUI, RGB_HUD, RGB_MOD,
|
||||
RGB_SAI, RGB_SAD, TO(1),
|
||||
RGB_SPI, RGB_SPD, TO(3)
|
||||
),
|
||||
[_BLED] = LAYOUT(
|
||||
BL_STEP, BL_BRTG, BL_TOGG,
|
||||
BL_ON, BL_OFF, TO(2),
|
||||
BL_INC, BL_DEC, TO(0)
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
/* rotary encoder (SW3) - add more else if blocks for more granular layer control */
|
||||
#ifdef ENCODER_ENABLE
|
||||
void encoder_update_user(uint8_t index, bool clockwise) {
|
||||
if (IS_LAYER_ON(_RGB)) {
|
||||
if (clockwise) {
|
||||
rgblight_increase_val();
|
||||
} else {
|
||||
rgblight_decrease_val();
|
||||
}
|
||||
} else if (IS_LAYER_ON(_BLED)) {
|
||||
if (clockwise) {
|
||||
backlight_increase();
|
||||
} else {
|
||||
backlight_decrease();
|
||||
}
|
||||
} else {
|
||||
if (clockwise) {
|
||||
tap_code(KC_VOLU);
|
||||
} else {
|
||||
tap_code(KC_VOLD);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* oled stuff :) */
|
||||
#ifdef OLED_DRIVER_ENABLE
|
||||
uint16_t startup_timer;
|
||||
|
||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
||||
startup_timer = timer_read();
|
||||
return rotation;
|
||||
}
|
||||
|
||||
static void render_logo(void) {
|
||||
static const char PROGMEM logo[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05,
|
||||
0xf8, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0x70, 0x78,
|
||||
0x38, 0x3f, 0x1c, 0x0e, 0x0e, 0x0e, 0xfe, 0x0e, 0x0e, 0x1e, 0x1c, 0x3f, 0x38, 0x78, 0x70, 0xe0,
|
||||
0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0xf8, 0x05, 0x02, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa0,
|
||||
0x13, 0xa2, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc,
|
||||
0xfe, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x3c, 0x3c, 0x00, 0x00,
|
||||
0x01, 0xff, 0xff, 0xff, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xa2, 0x13, 0xa0, 0x40, 0x00,
|
||||
0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x80, 0xc0, 0x40, 0x40, 0xc0, 0x80, 0x00, 0x00, 0xc0, 0x40, 0x40, 0xc0, 0x80,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0xc0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x40, 0x40, 0xc0, 0x80, 0x00, 0x00, 0x80, 0xc0, 0x40,
|
||||
0x40, 0xc0, 0x80, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xf9, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x7f, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x0f,
|
||||
0x1f, 0x1f, 0x01, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x0e, 0x0e, 0x80, 0xc0,
|
||||
0xc0, 0xff, 0xff, 0x7f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf9, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x1f, 0x31, 0x40, 0x4e, 0x40, 0x31, 0x1f, 0x00, 0x00, 0x61, 0x16, 0x08, 0x16, 0x61,
|
||||
0x00, 0x00, 0x1f, 0x31, 0x60, 0x40, 0x40, 0x60, 0x20, 0x00, 0x00, 0x7f, 0x44, 0x44, 0x64, 0x3b,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x7f,
|
||||
0x40, 0x40, 0x00, 0x00, 0x00, 0x20, 0x64, 0x44, 0x44, 0x6e, 0x3b, 0x00, 0x00, 0x20, 0x64, 0x44,
|
||||
0x44, 0x6e, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x03, 0x01, 0x00, 0x00, 0x00, 0x08, 0x14,
|
||||
0x23, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x07,
|
||||
0x0f, 0xfe, 0x1e, 0x1c, 0x1c, 0x1c, 0xff, 0x1c, 0x1c, 0x1c, 0x1e, 0xfe, 0x0f, 0x07, 0x03, 0x03,
|
||||
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x11, 0x0a, 0x04, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x1f, 0x00, 0x00, 0x10, 0x28, 0x47, 0x28, 0x10, 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x28, 0x44, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
oled_write_raw_P(logo, sizeof(logo));
|
||||
}
|
||||
/* Shows the name of the current layer and locks for the host (CAPS etc.) */
|
||||
static void render_info(void) {
|
||||
oled_write_P(PSTR("Layer: "), false);
|
||||
|
||||
switch (get_highest_layer(layer_state)) {
|
||||
case _HOME:
|
||||
oled_write_ln_P(PSTR("HOME"), false);
|
||||
break;
|
||||
case _MISC:
|
||||
oled_write_ln_P(PSTR("MISC"), false);
|
||||
break;
|
||||
case _RGB:
|
||||
oled_write_ln_P(PSTR("RGB"), false);
|
||||
break;
|
||||
case _BLED:
|
||||
oled_write_ln_P(PSTR("Backlight"), false);
|
||||
break;
|
||||
default:
|
||||
oled_write_ln_P(PSTR("Undefined"), false);
|
||||
}
|
||||
led_t led_state = host_keyboard_led_state();
|
||||
oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
|
||||
oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
|
||||
oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
|
||||
}
|
||||
|
||||
void oled_task_user(void) {
|
||||
static bool finished_timer = false;
|
||||
if ((timer_elapsed(startup_timer) < 3000) && !finished_timer) {
|
||||
render_logo();
|
||||
} else {
|
||||
finished_timer = true;
|
||||
render_info();
|
||||
}
|
||||
}
|
||||
#endif
|
@@ -1,25 +0,0 @@
|
||||
# 0xCB 1337
|
||||
|
||||
Macro keypad
|
||||
|
||||
* Keyboard Maintainer: [Conor Burns](https://github.com/conor-burns)
|
||||
* Hardware Supported: https://github.com/conor-burns/0xcb-1337
|
||||
* Hardware Availability: Soon on tindie or order your own parts - the hardware in the repo is Open Source :D
|
||||
* PCB renders :)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
To go to bootloader press row 0 col 0 key (top left) while plugging in the board.
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make 0xcb/1337:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make 0xcb/1337:default:flash
|
||||
|
||||
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).
|
@@ -1,27 +0,0 @@
|
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = qmk-dfu
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
|
||||
ENCODER_ENABLE = yes
|
||||
LTO_ENABLE = yes
|
||||
OLED_DRIVER_ENABLE = yes
|
@@ -29,6 +29,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
EXTRAFLAGS += -flto
|
||||
|
||||
LAYOUTS = 60_ansi
|
||||
|
@@ -31,5 +31,6 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
LAYOUTS = ortho_4x4 numpad_4x4
|
||||
|
@@ -18,7 +18,3 @@
|
||||
#define ENCODERS_PAD_A { A2 }
|
||||
#define ENCODERS_PAD_B { A1 }
|
||||
#define ENCODER_RESOLUTION 4
|
||||
|
||||
#define AUDIO_PIN A5
|
||||
#define AUDIO_PIN_ALT A4
|
||||
#define AUDIO_PIN_ALT_AS_NEGATIVE
|
||||
|
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"keyboard_name": "2Key2CrawlPad",
|
||||
"url": "",
|
||||
"maintainer": "qmk",
|
||||
"width": 6.5,
|
||||
"height": 2,
|
||||
"layouts": {
|
||||
"LAYOUT": {
|
||||
"layout": [
|
||||
{"label":"K00", "x":0, "y":0},
|
||||
{"label":"K01", "x":1, "y":0},
|
||||
{"label":"K02", "x":2, "y":0},
|
||||
{"label":"K03", "x":3, "y":0},
|
||||
{"label":"K15", "x":4, "y":0},
|
||||
|
||||
{"label":"K10", "x":0, "y":1},
|
||||
{"label":"K11", "x":1, "y":1},
|
||||
{"label":"K12", "x":2, "y":1},
|
||||
{"label":"K13", "x":3, "y":1},
|
||||
{"label":"K14", "x":4, "y":1},
|
||||
{"label":"K16", "x":5.5, "y":0.5}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -29,6 +29,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
# Enable generic behavior for split boards
|
||||
SPLIT_KEYBOARD = yes
|
||||
|
@@ -29,3 +29,4 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
@@ -1,197 +0,0 @@
|
||||
{
|
||||
"keyboard_name": "40percent.club 4x4",
|
||||
"url": "",
|
||||
"maintainer": "qmk",
|
||||
"height": 4,
|
||||
"width": 4,
|
||||
"layouts": {
|
||||
"LAYOUT_ortho_4x4": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":3, "y":1},
|
||||
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ortho_4x8": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
{"x":4, "y":0},
|
||||
{"x":5, "y":0},
|
||||
{"x":6, "y":0},
|
||||
{"x":7, "y":0},
|
||||
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":3, "y":1},
|
||||
{"x":4, "y":1},
|
||||
{"x":5, "y":1},
|
||||
{"x":6, "y":1},
|
||||
{"x":7, "y":1},
|
||||
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
{"x":4, "y":2},
|
||||
{"x":5, "y":2},
|
||||
{"x":6, "y":2},
|
||||
{"x":7, "y":2},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3},
|
||||
{"x":4, "y":3},
|
||||
{"x":5, "y":3},
|
||||
{"x":6, "y":3},
|
||||
{"x":7, "y":3}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ortho_4x12": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
{"x":4, "y":0},
|
||||
{"x":5, "y":0},
|
||||
{"x":6, "y":0},
|
||||
{"x":7, "y":0},
|
||||
{"x":8, "y":0},
|
||||
{"x":9, "y":0},
|
||||
{"x":10, "y":0},
|
||||
{"x":11, "y":0},
|
||||
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":3, "y":1},
|
||||
{"x":4, "y":1},
|
||||
{"x":5, "y":1},
|
||||
{"x":6, "y":1},
|
||||
{"x":7, "y":1},
|
||||
{"x":8, "y":1},
|
||||
{"x":9, "y":1},
|
||||
{"x":10, "y":1},
|
||||
{"x":11, "y":1},
|
||||
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
{"x":4, "y":2},
|
||||
{"x":5, "y":2},
|
||||
{"x":6, "y":2},
|
||||
{"x":7, "y":2},
|
||||
{"x":8, "y":2},
|
||||
{"x":9, "y":2},
|
||||
{"x":10, "y":2},
|
||||
{"x":11, "y":2},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3},
|
||||
{"x":4, "y":3},
|
||||
{"x":5, "y":3},
|
||||
{"x":6, "y":3},
|
||||
{"x":7, "y":3},
|
||||
{"x":8, "y":3},
|
||||
{"x":9, "y":3},
|
||||
{"x":10, "y":3},
|
||||
{"x":11, "y":3}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ortho_4x16": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
{"x":4, "y":0},
|
||||
{"x":5, "y":0},
|
||||
{"x":6, "y":0},
|
||||
{"x":7, "y":0},
|
||||
{"x":8, "y":0},
|
||||
{"x":9, "y":0},
|
||||
{"x":10, "y":0},
|
||||
{"x":11, "y":0},
|
||||
{"x":12, "y":0},
|
||||
{"x":13, "y":0},
|
||||
{"x":14, "y":0},
|
||||
{"x":15, "y":0},
|
||||
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":3, "y":1},
|
||||
{"x":4, "y":1},
|
||||
{"x":5, "y":1},
|
||||
{"x":6, "y":1},
|
||||
{"x":7, "y":1},
|
||||
{"x":8, "y":1},
|
||||
{"x":9, "y":1},
|
||||
{"x":10, "y":1},
|
||||
{"x":11, "y":1},
|
||||
{"x":12, "y":1},
|
||||
{"x":13, "y":1},
|
||||
{"x":14, "y":1},
|
||||
{"x":15, "y":1},
|
||||
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
{"x":4, "y":2},
|
||||
{"x":5, "y":2},
|
||||
{"x":6, "y":2},
|
||||
{"x":7, "y":2},
|
||||
{"x":8, "y":2},
|
||||
{"x":9, "y":2},
|
||||
{"x":10, "y":2},
|
||||
{"x":11, "y":2},
|
||||
{"x":12, "y":2},
|
||||
{"x":13, "y":2},
|
||||
{"x":14, "y":2},
|
||||
{"x":15, "y":2},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3},
|
||||
{"x":4, "y":3},
|
||||
{"x":5, "y":3},
|
||||
{"x":6, "y":3},
|
||||
{"x":7, "y":3},
|
||||
{"x":8, "y":3},
|
||||
{"x":9, "y":3},
|
||||
{"x":10, "y":3},
|
||||
{"x":11, "y":3},
|
||||
{"x":12, "y":3},
|
||||
{"x":13, "y":3},
|
||||
{"x":14, "y":3},
|
||||
{"x":15, "y":3}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -28,6 +28,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16
|
||||
|
||||
|
@@ -1,183 +0,0 @@
|
||||
{
|
||||
"keyboard_name": "40percent.club 4x4",
|
||||
"url": "",
|
||||
"maintainer": "qmk",
|
||||
"height": 4,
|
||||
"width": 4,
|
||||
"layouts": {
|
||||
"LAYOUT_ortho_5x5": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
{"x":4, "y":0},
|
||||
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":3, "y":1},
|
||||
{"x":4, "y":1},
|
||||
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
{"x":4, "y":2},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3},
|
||||
{"x":4, "y":3},
|
||||
|
||||
{"x":0, "y":4},
|
||||
{"x":1, "y":4},
|
||||
{"x":2, "y":4},
|
||||
{"x":3, "y":4},
|
||||
{"x":4, "y":4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ortho_5x10": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
{"x":4, "y":0},
|
||||
{"x":5, "y":0},
|
||||
{"x":6, "y":0},
|
||||
{"x":7, "y":0},
|
||||
{"x":8, "y":0},
|
||||
{"x":9, "y":0},
|
||||
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":3, "y":1},
|
||||
{"x":4, "y":1},
|
||||
{"x":5, "y":1},
|
||||
{"x":6, "y":1},
|
||||
{"x":7, "y":1},
|
||||
{"x":8, "y":1},
|
||||
{"x":9, "y":1},
|
||||
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
{"x":4, "y":2},
|
||||
{"x":5, "y":2},
|
||||
{"x":6, "y":2},
|
||||
{"x":7, "y":2},
|
||||
{"x":8, "y":2},
|
||||
{"x":9, "y":2},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3},
|
||||
{"x":4, "y":3},
|
||||
{"x":5, "y":3},
|
||||
{"x":6, "y":3},
|
||||
{"x":7, "y":3},
|
||||
{"x":8, "y":3},
|
||||
{"x":9, "y":3},
|
||||
|
||||
{"x":0, "y":4},
|
||||
{"x":1, "y":4},
|
||||
{"x":2, "y":4},
|
||||
{"x":3, "y":4},
|
||||
{"x":4, "y":4},
|
||||
{"x":5, "y":4},
|
||||
{"x":6, "y":4},
|
||||
{"x":7, "y":4},
|
||||
{"x":8, "y":4},
|
||||
{"x":9, "y":4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ortho_5x15": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
{"x":4, "y":0},
|
||||
{"x":5, "y":0},
|
||||
{"x":6, "y":0},
|
||||
{"x":7, "y":0},
|
||||
{"x":8, "y":0},
|
||||
{"x":9, "y":0},
|
||||
{"x":10, "y":0},
|
||||
{"x":11, "y":0},
|
||||
{"x":12, "y":0},
|
||||
{"x":13, "y":0},
|
||||
{"x":14, "y":0},
|
||||
|
||||
{"x":0, "y":1},
|
||||
{"x":1, "y":1},
|
||||
{"x":2, "y":1},
|
||||
{"x":3, "y":1},
|
||||
{"x":4, "y":1},
|
||||
{"x":5, "y":1},
|
||||
{"x":6, "y":1},
|
||||
{"x":7, "y":1},
|
||||
{"x":8, "y":1},
|
||||
{"x":9, "y":1},
|
||||
{"x":10, "y":1},
|
||||
{"x":11, "y":1},
|
||||
{"x":12, "y":1},
|
||||
{"x":13, "y":1},
|
||||
{"x":14, "y":1},
|
||||
|
||||
{"x":0, "y":2},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
{"x":4, "y":2},
|
||||
{"x":5, "y":2},
|
||||
{"x":6, "y":2},
|
||||
{"x":7, "y":2},
|
||||
{"x":8, "y":2},
|
||||
{"x":9, "y":2},
|
||||
{"x":10, "y":2},
|
||||
{"x":11, "y":2},
|
||||
{"x":12, "y":2},
|
||||
{"x":13, "y":2},
|
||||
{"x":14, "y":2},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3},
|
||||
{"x":4, "y":3},
|
||||
{"x":5, "y":3},
|
||||
{"x":6, "y":3},
|
||||
{"x":7, "y":3},
|
||||
{"x":8, "y":3},
|
||||
{"x":9, "y":3},
|
||||
{"x":10, "y":3},
|
||||
{"x":11, "y":3},
|
||||
{"x":12, "y":3},
|
||||
{"x":13, "y":3},
|
||||
{"x":14, "y":3},
|
||||
|
||||
{"x":0, "y":4},
|
||||
{"x":1, "y":4},
|
||||
{"x":2, "y":4},
|
||||
{"x":3, "y":4},
|
||||
{"x":4, "y":4},
|
||||
{"x":5, "y":4},
|
||||
{"x":6, "y":4},
|
||||
{"x":7, "y":4},
|
||||
{"x":8, "y":4},
|
||||
{"x":9, "y":4},
|
||||
{"x":10, "y":4},
|
||||
{"x":11, "y":4},
|
||||
{"x":12, "y":4},
|
||||
{"x":13, "y":4},
|
||||
{"x":14, "y":4}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -28,5 +28,6 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15
|
||||
|
@@ -29,6 +29,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
# Enable generic behavior for split boards
|
||||
SPLIT_KEYBOARD = yes
|
||||
|
@@ -29,6 +29,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
# Enable generic behavior for split boards
|
||||
SPLIT_KEYBOARD = yes
|
||||
|
@@ -6,10 +6,11 @@ EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
MIDI_ENABLE = no # MIDI support
|
||||
MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
TAP_DANCE_ENABLE = no
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend (it uses the same timer as BACKLIGHT_ENABLE)
|
||||
|
||||
|
@@ -29,6 +29,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
# Enable generic behavior for split boards
|
||||
SPLIT_KEYBOARD = yes
|
||||
|
@@ -16,6 +16,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
LAYOUTS = ortho_5x15
|
||||
DEFAULT_FOLDER = 40percentclub/i75/promicro
|
||||
|
@@ -29,3 +29,4 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
@@ -29,6 +29,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12
|
||||
|
||||
|
@@ -54,3 +54,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/* Enable GNAP matrix serial output */
|
||||
#define GNAP_ENABLE
|
||||
|
||||
/* USART configuration */
|
||||
#ifdef __AVR_ATmega32U4__
|
||||
# define SERIAL_UART_BAUD 9600
|
||||
# define SERIAL_UART_DATA UDR1
|
||||
# define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
|
||||
# define SERIAL_UART_RXD_VECT USART1_RX_vect
|
||||
# define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
|
||||
# define SERIAL_UART_INIT() do { \
|
||||
/* baud rate */ \
|
||||
UBRR1L = SERIAL_UART_UBRR; \
|
||||
/* baud rate */ \
|
||||
UBRR1H = SERIAL_UART_UBRR >> 8; \
|
||||
/* enable TX */ \
|
||||
UCSR1B = _BV(TXEN1); \
|
||||
/* 8-bit data */ \
|
||||
UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
|
||||
sei(); \
|
||||
} while(0)
|
||||
# else
|
||||
# error "USART configuration is needed."
|
||||
#endif
|
||||
|
@@ -126,8 +126,8 @@ void matrix_print(void)
|
||||
{
|
||||
print("\nr/c 0123456789ABCDEF\n");
|
||||
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||
print_hex8(row); print(": ");
|
||||
print_bin_reverse16(matrix_get_row(row));
|
||||
phex(row); print(": ");
|
||||
pbin_reverse16(matrix_get_row(row));
|
||||
print("\n");
|
||||
}
|
||||
}
|
||||
|
@@ -28,6 +28,7 @@ MIDI_ENABLE = no # MIDI support
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
|
||||
# custom matrix setup
|
||||
CUSTOM_MATRIX = yes
|
||||
|
@@ -1,2 +1 @@
|
||||
VIA_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = yes
|
@@ -1,81 +0,0 @@
|
||||
{
|
||||
"keyboard_name": "AEKISO60 Rev A",
|
||||
"url": "",
|
||||
"maintainer": "4pplet",
|
||||
"width": 15,
|
||||
"height": 5,
|
||||
"layouts": {
|
||||
"LAYOUT_all": {
|
||||
"layout": [
|
||||
{"x":0, "y":0, "w":1.25},
|
||||
{"x":1.25, "y":0},
|
||||
{"x":2.25, "y":0},
|
||||
{"x":3.25, "y":0},
|
||||
{"x":4.25, "y":0},
|
||||
{"x":5.25, "y":0},
|
||||
{"x":6.25, "y":0},
|
||||
{"x":7.25, "y":0},
|
||||
{"x":8.25, "y":0},
|
||||
{"x":9.25, "y":0},
|
||||
{"x":10.25, "y":0},
|
||||
{"x":11.25, "y":0},
|
||||
{"x":12.25, "y":0},
|
||||
{"x":13.25, "y":0, "w":1.75},
|
||||
|
||||
{"x":0, "y":1, "w":1.75},
|
||||
{"x":1.75, "y":1},
|
||||
{"x":2.75, "y":1},
|
||||
{"x":3.75, "y":1},
|
||||
{"x":4.75, "y":1},
|
||||
{"x":5.75, "y":1},
|
||||
{"x":6.75, "y":1},
|
||||
{"x":7.75, "y":1},
|
||||
{"x":8.75, "y":1},
|
||||
{"x":9.75, "y":1},
|
||||
{"x":10.75, "y":1},
|
||||
{"x":11.75, "y":1},
|
||||
{"x":12.75, "y":1},
|
||||
|
||||
{"x":0, "y":2, "w":2},
|
||||
{"x":2, "y":2},
|
||||
{"x":3, "y":2},
|
||||
{"x":4, "y":2},
|
||||
{"x":5, "y":2},
|
||||
{"x":6, "y":2},
|
||||
{"x":7, "y":2},
|
||||
{"x":8, "y":2},
|
||||
{"x":9, "y":2},
|
||||
{"x":10, "y":2},
|
||||
{"x":11, "y":2},
|
||||
{"x":12, "y":2},
|
||||
{"x":13, "y":2},
|
||||
{"x":14, "y":1, "h":2},
|
||||
|
||||
{"x":0, "y":3, "w":1.5},
|
||||
{"x":1.5, "y":3},
|
||||
{"x":2.5, "y":3},
|
||||
{"x":3.5, "y":3},
|
||||
{"x":4.5, "y":3},
|
||||
{"x":5.5, "y":3},
|
||||
{"x":6.5, "y":3},
|
||||
{"x":7.5, "y":3},
|
||||
{"x":8.5, "y":3},
|
||||
{"x":9.5, "y":3},
|
||||
{"x":10.5, "y":3},
|
||||
{"x":11.5, "y":3},
|
||||
{"x":12.5, "y":3, "w":1.5},
|
||||
{"x":14, "y":3},
|
||||
|
||||
{"x":0, "y":4, "w":1.5},
|
||||
{"x":1.5, "y":4, "w":1.25},
|
||||
{"x":2.75, "y":4, "w":1.5},
|
||||
{"x":4.25, "y":4, "w":2.75},
|
||||
{"x":7, "y":4},
|
||||
{"x":8, "y":4, "w":2.75},
|
||||
{"x":10.75, "y":4, "w":1.5},
|
||||
{"x":12.25, "y":4, "w":1.25},
|
||||
{"x":13.5, "y":4, "w":1.5}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -22,9 +22,10 @@ COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
|
@@ -1,2 +1 @@
|
||||
VIA_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = yes
|
@@ -1,87 +0,0 @@
|
||||
{
|
||||
"keyboard_name": "Steezy60 Rev A",
|
||||
"url": "",
|
||||
"maintainer": "4pplet",
|
||||
"width": 15,
|
||||
"height": 5,
|
||||
"layouts": {
|
||||
"LAYOUT_all": {
|
||||
"layout": [
|
||||
{"x":0, "y":0},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0},
|
||||
{"x":3, "y":0},
|
||||
{"x":4, "y":0},
|
||||
{"x":5, "y":0},
|
||||
{"x":6, "y":0},
|
||||
{"x":7, "y":0},
|
||||
{"x":8, "y":0},
|
||||
{"x":9, "y":0},
|
||||
{"x":10, "y":0},
|
||||
{"x":11, "y":0},
|
||||
{"x":12, "y":0},
|
||||
{"x":13, "y":0},
|
||||
{"x":14, "y":0},
|
||||
|
||||
{"x":0, "y":1, "w":1.5},
|
||||
{"x":1.5, "y":1},
|
||||
{"x":2.5, "y":1},
|
||||
{"x":3.5, "y":1},
|
||||
{"x":4.5, "y":1},
|
||||
{"x":5.5, "y":1},
|
||||
{"x":6.5, "y":1},
|
||||
{"x":7.5, "y":1},
|
||||
{"x":8.5, "y":1},
|
||||
{"x":9.5, "y":1},
|
||||
{"x":10.5, "y":1},
|
||||
{"x":11.5, "y":1},
|
||||
{"x":12.5, "y":1},
|
||||
{"x":13.5, "y":1, "w":1.5},
|
||||
|
||||
{"x":0, "y":2, "w":1.75},
|
||||
{"x":1.75, "y":2},
|
||||
{"x":2.75, "y":2},
|
||||
{"x":3.75, "y":2},
|
||||
{"x":4.75, "y":2},
|
||||
{"x":5.75, "y":2},
|
||||
{"x":6.75, "y":2},
|
||||
{"x":7.75, "y":2},
|
||||
{"x":8.75, "y":2},
|
||||
{"x":9.75, "y":2},
|
||||
{"x":10.75, "y":2},
|
||||
{"x":11.75, "y":2},
|
||||
{"x":12.75, "y":2},
|
||||
{"x":13.75, "y":2, "w":1.25},
|
||||
|
||||
{"x":0, "y":3},
|
||||
{"x":1, "y":3},
|
||||
{"x":2, "y":3},
|
||||
{"x":3, "y":3},
|
||||
{"x":4, "y":3},
|
||||
{"x":5, "y":3},
|
||||
{"x":6, "y":3},
|
||||
{"x":7, "y":3},
|
||||
{"x":8, "y":3},
|
||||
{"x":9, "y":3},
|
||||
{"x":10, "y":3},
|
||||
{"x":11, "y":3},
|
||||
{"x":12, "y":3},
|
||||
{"x":13, "y":3},
|
||||
{"x":14, "y":3},
|
||||
|
||||
{"x":0, "y":4},
|
||||
{"x":1, "y":4},
|
||||
{"x":2, "y":4},
|
||||
{"x":3, "y":4},
|
||||
{"x":4, "y":4, "w":2.25},
|
||||
{"x":6.25, "y":4, "w":1.5},
|
||||
{"x":7.75, "y":4, "w":2.25},
|
||||
{"x":10, "y":4},
|
||||
{"x":11, "y":4},
|
||||
{"x":12, "y":4},
|
||||
{"x":13, "y":4},
|
||||
{"x":14, "y":4}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -22,9 +22,10 @@ COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
|
@@ -22,9 +22,10 @@ COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
|
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"keyboard_name": "6-Ball",
|
||||
"url": "",
|
||||
"maintainer": "qmk",
|
||||
"width": 3,
|
||||
"height": 3,
|
||||
"layouts": {
|
||||
"LAYOUT": {
|
||||
"layout": [
|
||||
{"x":0, "y":0.5},
|
||||
{"x":1, "y":0},
|
||||
{"x":2, "y":0.5},
|
||||
|
||||
{"x":0, "y":1.5},
|
||||
{"x":1, "y":2},
|
||||
{"x":2, "y":1.5}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,40 +0,0 @@
|
||||
/* Copyright 2020 Steven Nguyen
|
||||
*
|
||||
* 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 "config_common.h"
|
||||
|
||||
#define VENDOR_ID 0x77C8
|
||||
#define PRODUCT_ID 0x0001
|
||||
#define DEVICE_VER 0x0000
|
||||
#define MANUFACTURER 7c8
|
||||
#define PRODUCT Framework
|
||||
|
||||
#define MATRIX_ROWS 10
|
||||
#define MATRIX_COLS 6
|
||||
|
||||
#define MATRIX_ROW_PINS { B0, B1, D7, B2, D6, B3, D5, B4, D4, B5 }
|
||||
#define MATRIX_COL_PINS { C0, C1, C2, C3, C4, C5 }
|
||||
#define ENCODERS_PAD_A { D0 }
|
||||
#define ENCODERS_PAD_B { D1 }
|
||||
|
||||
#define ENCODER_RESOLUTION 4
|
||||
#define TAP_CODE_DELAY 16
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
#define DEBOUNCE 5
|
||||
|
||||
#define LEADER_TIMEOUT 250
|
||||
#define LEADER_PER_KEY_TIMING 150
|
@@ -1,17 +0,0 @@
|
||||
/* Copyright 2020 Steven Nguyen
|
||||
*
|
||||
* 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 "framework.h"
|
@@ -1,98 +0,0 @@
|
||||
/* Copyright 2020 Steven Nguyen
|
||||
*
|
||||
* 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"
|
||||
|
||||
#define ___ KC_NO
|
||||
|
||||
#define LAYOUT_ortho_5x12( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, \
|
||||
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4a, K4b \
|
||||
) { \
|
||||
{ K00, K01, K02, K03, K04, K05 }, \
|
||||
{ K06, K07, K08, K09, K0a, K0b }, \
|
||||
{ K10, K11, K12, K13, K14, K15 }, \
|
||||
{ K16, K17, K18, K19, K1a, K1b }, \
|
||||
{ K20, K21, K22, K23, K24, K25 }, \
|
||||
{ K26, K27, K28, K29, K2a, K2b }, \
|
||||
{ K30, K31, K32, K33, K34, K35 }, \
|
||||
{ K36, K37, K38, K39, K3a, K3b }, \
|
||||
{ K40, K41, K42, K43, K44, K45 }, \
|
||||
{ K46, K47, K48, K49, K4a, K4b } \
|
||||
}
|
||||
|
||||
#define LAYOUT_ortho_5x12_1x2uC( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, \
|
||||
K40, K41, K42, K43, K44, K45, K47, K48, K49, K4a, K4b \
|
||||
) { \
|
||||
{ K00, K01, K02, K03, K04, K05 }, \
|
||||
{ K06, K07, K08, K09, K0a, K0b }, \
|
||||
{ K10, K11, K12, K13, K14, K15 }, \
|
||||
{ K16, K17, K18, K19, K1a, K1b }, \
|
||||
{ K20, K21, K22, K23, K24, K25 }, \
|
||||
{ K26, K27, K28, K29, K2a, K2b }, \
|
||||
{ K30, K31, K32, K33, K34, K35 }, \
|
||||
{ K36, K37, K38, K39, K3a, K3b }, \
|
||||
{ K40, K41, K42, K43, K44, K45 }, \
|
||||
{ ___, K47, K48, K49, K4a, K4b } \
|
||||
}
|
||||
|
||||
#define LAYOUT_preonic_2x2u( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, \
|
||||
K40, K41, K42, K43, K45, K46, K48, K49, K4a, K4b \
|
||||
) { \
|
||||
{ K00, K01, K02, K03, K04, K05 }, \
|
||||
{ K06, K07, K08, K09, K0a, K0b }, \
|
||||
{ K10, K11, K12, K13, K14, K15 }, \
|
||||
{ K16, K17, K18, K19, K1a, K1b }, \
|
||||
{ K20, K21, K22, K23, K24, K25 }, \
|
||||
{ K26, K27, K28, K29, K2a, K2b }, \
|
||||
{ K30, K31, K32, K33, K34, K35 }, \
|
||||
{ K36, K37, K38, K39, K3a, K3b }, \
|
||||
{ K40, K41, K42, K43, ___, K45 }, \
|
||||
{ K46, ___, K48, K49, K4a, K4b } \
|
||||
}
|
||||
|
||||
#define framework_via( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, \
|
||||
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4a, K4b, \
|
||||
K50, K51 \
|
||||
) { \
|
||||
{ K00, K01, K02, K03, K04, K05 }, \
|
||||
{ K06, K07, K08, K09, K0a, K0b }, \
|
||||
{ K10, K11, K12, K13, K14, K15 }, \
|
||||
{ K16, K17, K18, K19, K1a, K1b }, \
|
||||
{ K20, K21, K22, K23, K24, K25 }, \
|
||||
{ K26, K27, K28, K29, K2a, K2b }, \
|
||||
{ K30, K31, K32, K33, K34, K35 }, \
|
||||
{ K36, K37, K38, K39, K3a, K3b }, \
|
||||
{ K40, K41, K42, K43, K44, K45 }, \
|
||||
{ K46, K47, K48, K49, K4a, K4b }, \
|
||||
{ K50, K51 } \
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user