Compare commits
75 Commits
0.7.103
...
breakpoint
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45b6ce957e | ||
|
|
6e520a721d | ||
|
|
8b80cf853b | ||
|
|
0f43c26525 | ||
|
|
2c14172467 | ||
|
|
320822d75b | ||
|
|
b362595665 | ||
|
|
2dc0fd2b50 | ||
|
|
48eda75c83 | ||
|
|
3951f331c0 | ||
|
|
2a7c715bc6 | ||
|
|
abca0ccf4a | ||
|
|
a1788a8398 | ||
|
|
2f338c0608 | ||
|
|
c87d88be4d | ||
|
|
ee5bf03767 | ||
|
|
983026ad8b | ||
|
|
3fd8f160c3 | ||
|
|
474f7f399c | ||
|
|
61173dce5d | ||
|
|
5b8f1327d8 | ||
|
|
dd04079098 | ||
|
|
f08ffc2715 | ||
|
|
2406c04d89 | ||
|
|
156d319604 | ||
|
|
5404d6baef | ||
|
|
291ef064a7 | ||
|
|
a0a6e24788 | ||
|
|
3650d59afe | ||
|
|
53757f9705 | ||
|
|
8ec0b378bc | ||
|
|
2557bc8e6f | ||
|
|
b83e3ae556 | ||
|
|
77f66cc5e1 | ||
|
|
86815edc31 | ||
|
|
45482d612c | ||
|
|
91013d452f | ||
|
|
c4061f003c | ||
|
|
59b017381c | ||
|
|
680ebef086 | ||
|
|
7ba6456c0b | ||
|
|
a52e55ec09 | ||
|
|
d1ed98f58b | ||
|
|
91c8a9314a | ||
|
|
f6bdb6afba | ||
|
|
559ef21563 | ||
|
|
64263bbb02 | ||
|
|
8af1501328 | ||
|
|
25aaeb4f40 | ||
|
|
36d913e1b1 | ||
|
|
250a99ff1b | ||
|
|
c329a0ec8e | ||
|
|
26a823082b | ||
|
|
80e73b6210 | ||
|
|
b359830ea2 | ||
|
|
c32d085710 | ||
|
|
a14339e752 | ||
|
|
cfbb848e03 | ||
|
|
12baca1295 | ||
|
|
4edc8fc3c7 | ||
|
|
e5501d4815 | ||
|
|
46e2b6e43d | ||
|
|
9aedb620c5 | ||
|
|
7494490d6d | ||
|
|
7066164591 | ||
|
|
0e2ff9b384 | ||
|
|
376419a4f7 | ||
|
|
05b479d349 | ||
|
|
52c18ef026 | ||
|
|
d478095756 | ||
|
|
adf4acf596 | ||
|
|
3f696664d6 | ||
|
|
e4c257fb01 | ||
|
|
593bfc86a1 | ||
|
|
d23e81b1f0 |
@@ -82,6 +82,13 @@ ifeq ($(strip $(BOOTLOADER)), USBasp)
|
||||
OPT_DEFS += -DBOOTLOADER_USBASP
|
||||
BOOTLOADER_SIZE = 4096
|
||||
endif
|
||||
ifeq ($(strip $(BOOTLOADER)), lufa-ms)
|
||||
# DO NOT USE THIS BOOTLOADER IN NEW PROJECTS!
|
||||
# It is extremely prone to bricking, and is only included to support existing boards.
|
||||
OPT_DEFS += -DBOOTLOADER_MS
|
||||
BOOTLOADER_SIZE = 6144
|
||||
FIRMWARE_FORMAT = bin
|
||||
endif
|
||||
|
||||
ifdef BOOTLOADER_SIZE
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE))
|
||||
|
||||
@@ -82,19 +82,19 @@ endif
|
||||
|
||||
ifeq ($(strip $(UCIS_ENABLE)), yes)
|
||||
OPT_DEFS += -DUCIS_ENABLE
|
||||
UNICODE_COMMON = yes
|
||||
UNICODE_COMMON := yes
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
|
||||
OPT_DEFS += -DUNICODEMAP_ENABLE
|
||||
UNICODE_COMMON = yes
|
||||
UNICODE_COMMON := yes
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(UNICODE_ENABLE)), yes)
|
||||
OPT_DEFS += -DUNICODE_ENABLE
|
||||
UNICODE_COMMON = yes
|
||||
UNICODE_COMMON := yes
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
|
||||
endif
|
||||
|
||||
@@ -107,13 +107,13 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||
OPT_DEFS += -DRGBLIGHT_ENABLE
|
||||
SRC += $(QUANTUM_DIR)/color.c
|
||||
SRC += $(QUANTUM_DIR)/rgblight.c
|
||||
CIE1931_CURVE = yes
|
||||
LED_BREATHING_TABLE = yes
|
||||
RGB_KEYCODES_ENABLE = yes
|
||||
CIE1931_CURVE := yes
|
||||
LED_BREATHING_TABLE := yes
|
||||
RGB_KEYCODES_ENABLE := yes
|
||||
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
|
||||
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
||||
else
|
||||
WS2812_DRIVER_REQUIRED = yes
|
||||
WS2812_DRIVER_REQUIRED := yes
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -147,12 +147,12 @@ endif
|
||||
SRC += $(QUANTUM_DIR)/color.c
|
||||
SRC += $(QUANTUM_DIR)/rgb_matrix.c
|
||||
SRC += $(QUANTUM_DIR)/rgb_matrix_drivers.c
|
||||
CIE1931_CURVE = yes
|
||||
RGB_KEYCODES_ENABLE = yes
|
||||
CIE1931_CURVE := yes
|
||||
RGB_KEYCODES_ENABLE := yes
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
||||
RGB_MATRIX_ENABLE = IS31FL3731
|
||||
RGB_MATRIX_ENABLE := IS31FL3731
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3731)
|
||||
@@ -178,7 +178,7 @@ endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), WS2812)
|
||||
OPT_DEFS += -DWS2812
|
||||
WS2812_DRIVER_REQUIRED = yes
|
||||
WS2812_DRIVER_REQUIRED := yes
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
|
||||
@@ -232,12 +232,12 @@ endif
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LCD_ENABLE)), yes)
|
||||
CIE1931_CURVE = yes
|
||||
CIE1931_CURVE := yes
|
||||
endif
|
||||
|
||||
# backward compat
|
||||
ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes)
|
||||
BACKLIGHT_DRIVER = custom
|
||||
BACKLIGHT_DRIVER := custom
|
||||
endif
|
||||
|
||||
VALID_BACKLIGHT_TYPES := pwm software custom
|
||||
@@ -250,7 +250,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
|
||||
CIE1931_CURVE = yes
|
||||
CIE1931_CURVE := yes
|
||||
endif
|
||||
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/backlight
|
||||
@@ -294,12 +294,12 @@ endif
|
||||
|
||||
ifeq ($(strip $(CIE1931_CURVE)), yes)
|
||||
OPT_DEFS += -DUSE_CIE1931_CURVE
|
||||
LED_TABLES = yes
|
||||
LED_TABLES := yes
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_BREATHING_TABLE)), yes)
|
||||
OPT_DEFS += -DUSE_LED_BREATHING_TABLE
|
||||
LED_TABLES = yes
|
||||
LED_TABLES := yes
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_TABLES)), yes)
|
||||
@@ -349,6 +349,14 @@ ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/velocikey.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||
DYNAMIC_KEYMAP_ENABLE := yes
|
||||
RAW_ENABLE := yes
|
||||
BOOTMAGIC_ENABLE := lite
|
||||
SRC += $(QUANTUM_DIR)/via.c
|
||||
OPT_DEFS += -DVIA_ENABLE
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
|
||||
OPT_DEFS += -DDYNAMIC_KEYMAP_ENABLE
|
||||
SRC += $(QUANTUM_DIR)/dynamic_keymap.c
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# ARM Debugging usign Eclipse
|
||||
# ARM Debugging using Eclipse
|
||||
|
||||
This page describes how to setup debugging for ARM MCUs using an SWD adapter and open-source/free tools. In this guide we will install GNU MCU Eclipse IDE for C/C++ Developers and OpenOCD together with all the necessary dependencies.
|
||||
|
||||
@@ -18,7 +18,7 @@ XPM installation instructions can be found [here](https://www.npmjs.com/package/
|
||||
|
||||
### The ARM Toolchain
|
||||
|
||||
Using XPM it is very easy to install the ARM toolchain. Enter the command `xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc`.
|
||||
Using XPM it is very easy to install the ARM toolchain. Enter the command `xpm install --global @xpack-dev-tools/arm-none-eabi-gcc`.
|
||||
|
||||
### Windows build tools
|
||||
|
||||
@@ -33,7 +33,7 @@ If you have an ST-Link the drivers can be found [here](https://www.st.com/en/dev
|
||||
|
||||
### OpenOCD
|
||||
|
||||
This dependency allows SWD access from GDB and it is essential for debugging. Run `xpm install --global @gnu-mcu-eclipse/openocd`.
|
||||
This dependency allows SWD access from GDB and it is essential for debugging. Run `xpm install --global @xpack-dev-tools/openocd`.
|
||||
|
||||
### Java
|
||||
|
||||
@@ -45,17 +45,17 @@ Now its finally time to install the IDE. Use the Release page [here](https://git
|
||||
|
||||
## Configuring Eclipse
|
||||
|
||||
Open up the Eclipse IDE we just downloaded. To import our QMK directory select File -> Import -> C/C++ -> Existing code as Makefile Project. Select next and use Browse to select your QMK folder. In the tool-chain list select ARM Cross GCC and select Finish.
|
||||
Open up the Eclipse IDE we just downloaded. To import our QMK directory select File -> Import -> C/C++ -> Existing Code as Makefile Project. Select Next and use Browse to select your QMK folder. In the tool-chain list select ARM Cross GCC and select Finish.
|
||||
|
||||
Now you can see the QMK folder on the left hand side. Right click it and select Properties. On the left hand side, expand MCU and select ARM Toolchain Paths. Press xPack and OK. Repeat for OpenOCD Path and if you are on windows for Build Tool Path. Select Apply and Close.
|
||||
Now you can see the QMK folder on the left hand side. Right click it and select Properties. On the left hand side, expand MCU and select ARM Toolchains Paths. Press xPack and OK. Repeat for OpenOCD Path and if you are on Windows for Build Tools Path. Select Apply and Close.
|
||||
|
||||
Now its time to install the necessary MCU packages. Go to Packs perspective by selecting Window -> Open Perspective -> Others -> Packs. Now select the yellow refresh symbol next to the Packs tab. This will take a long time as it is requesting the MCU definitions from various places. If some of the links fail you can probably select Ignore.
|
||||
Now its time to install the necessary MCU packages. Go to Packs perspective by selecting Window -> Perspective -> Open Perspective -> Other... -> Packs. Now select the yellow refresh symbol next to the Packs tab. This will take a long time as it is requesting the MCU definitions from various places. If some of the links fail you can probably select Ignore.
|
||||
|
||||
When this finishes you must find the MCU which we will be building/debugging for. In this example I will be using the STM32F3 series MCUs. On the left, select STMicroelectonics -> STM32F3 Series. On the middle window we can see the pack. Right click and select Install. Once that is done we can go back to the default perspective, Window -> Open Perspective -> Others -> C/C++.
|
||||
When this finishes you must find the MCU which we will be building/debugging for. In this example I will be using the STM32F3 series MCUs. On the left, select STMicroelectronics -> STM32F3 Series. On the middle window we can see the pack. Right click and select Install. Once that is done we can go back to the default perspective, Window -> Perspective -> Open Perspective -> Other... -> C/C++.
|
||||
|
||||
We need to let eclipse know the device we intent to build QMK on. Right click on the QMK folder -> Properties -> C/C++ Build -> Settings. Select the Devices tab and under devices select the appropriate variant of your MCU. For my example it is STM32F303CC
|
||||
We need to let eclipse know the device we intent to build QMK on. Right click on the QMK folder -> Properties -> C/C++ Build -> Settings. Select the Devices tab and under Devices select the appropriate variant of your MCU. For my example it is STM32F303CC
|
||||
|
||||
While we are here let's setup the build command as well. Select C/C++ Build and then the Behavior tab. On the build command, replace `all` with your necessary make command. For example for a rev6 Planck with the default keymap this would be `planck/rev6:default`. Select Apply and Close.
|
||||
While we are here let's setup the build command as well. Select C/C++ Build and then the Behavior tab. On the Build command, replace `all` with your necessary make command. For example for a rev6 Planck with the default keymap this would be `planck/rev6:default`. Select Apply and Close.
|
||||
|
||||
## Building
|
||||
|
||||
@@ -71,7 +71,7 @@ NOTE: Make sure the SWCLK and SWDIO pins are not used in the matrix of your keyb
|
||||
|
||||
### Configuring the Debugger
|
||||
|
||||
Right click on your QMK folder, select Debug As -> Debug Configuration. Here double click on GDB OpenOCD Debugging. Select the debugger tab and enter the configuration necessary for your MCU. This might take some fiddling and googleing to find out. The default script for the STM32F3 is called stm32f3discovery.cfg. To let OpenOCD know, in the Config options enter `-f board/stm32f3discovery.cfg`.
|
||||
Right click on your QMK folder, select Debug As -> Debug Configurations... . Here double click on GDB OpenOCD Debugging. Select the Debugger tab and enter the configuration necessary for your MCU. This might take some fiddling and Googling to find out. The default script for the STM32F3 is called `stm32f3discovery.cfg`. To let OpenOCD know, in the Config options enter `-f board/stm32f3discovery.cfg`.
|
||||
|
||||
NOTE: In my case this configuration script requires editing to disable the reset assertion. The locations of the scripts can be found in the actual executable field usually under the path `openocd/version/.content/scripts/board`. Here I edited `reset_config srst_only` to `reset_config none`.
|
||||
|
||||
@@ -81,7 +81,7 @@ Select Apply and Close.
|
||||
|
||||
Reset your keyboard.
|
||||
|
||||
Press the bug icon and if all goes well you should soon find yourself in the debug perspective. Here the program counter will pause at the beginning of the main function and way for you to press Play. Most of the features of all debuggers work on ARM MCUs but for exact details google is your friend!
|
||||
Press the bug icon and if all goes well you should soon find yourself in the Debug perspective. Here the program counter will pause at the beginning of the main function and wait for you to press Play. Most of the features of all debuggers work on Arm MCUs but for exact details Google is your friend!
|
||||
|
||||
|
||||
Happy debugging!
|
||||
|
||||
@@ -287,8 +287,27 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
||||
* Defines which format (bin, hex) is copied to the root `qmk_firmware` folder after building.
|
||||
* `SRC`
|
||||
* Used to add files to the compilation/linking list.
|
||||
* `LIB_SRC`
|
||||
* Used to add files as a library to the compilation/linking list.
|
||||
The files specified by `LIB_SRC` is linked after the files specified by `SRC`.
|
||||
For example, if you specify:
|
||||
```
|
||||
SRC += a.c
|
||||
LIB_SRC += lib_b.c
|
||||
SRC += c.c
|
||||
LIB_SRC += lib_d.c
|
||||
```
|
||||
The link order is as follows.
|
||||
```
|
||||
... a.o c.o ... lib_b.a lib_d.a ...
|
||||
```
|
||||
* `LAYOUTS`
|
||||
* A list of [layouts](feature_layouts.md) this keyboard supports.
|
||||
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
||||
* Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled.
|
||||
It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
|
||||
* `LTO_ENABLE`
|
||||
* It has the same meaning as LINK_TIME_OPTIMIZATION_ENABLE. You can use `LTO_ENABLE` instead of `LINK_TIME_OPTIMIZATION_ENABLE`.
|
||||
|
||||
## AVR MCU Options
|
||||
* `MCU = atmega32u4`
|
||||
@@ -347,9 +366,6 @@ Use these to enable or disable building certain features. The more you have enab
|
||||
* Forces the keyboard to wait for a USB connection to be established before it starts up
|
||||
* `NO_USB_STARTUP_CHECK`
|
||||
* Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master.
|
||||
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
||||
* Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
|
||||
* Alternatively, you can use `LTO_ENABLE` instead of `LINK_TIME_OPTIMIZATION_ENABLE`.
|
||||
|
||||
## USB Endpoint Limitations
|
||||
|
||||
|
||||
@@ -119,24 +119,29 @@ The solution is to remove and reinstall all affected modules.
|
||||
|
||||
```
|
||||
brew rm avr-gcc
|
||||
brew rm avr-gcc@8
|
||||
brew rm dfu-programmer
|
||||
brew rm dfu-util
|
||||
brew rm gcc-arm-none-eabi
|
||||
brew rm arm-gcc-bin@8
|
||||
brew rm avrdude
|
||||
brew install avr-gcc
|
||||
brew install avr-gcc@8
|
||||
brew install dfu-programmer
|
||||
brew install dfu-util
|
||||
brew install gcc-arm-none-eabi
|
||||
brew install arm-gcc-bin@8
|
||||
brew install avrdude
|
||||
brew link --force avr-gcc@8
|
||||
brew link --force arm-gcc-bin@8
|
||||
|
||||
```
|
||||
|
||||
### avr-gcc 8.1 and LUFA
|
||||
### `avr-gcc` and LUFA
|
||||
|
||||
If you updated your avr-gcc to above 7 you may see errors involving LUFA. For example:
|
||||
If you updated your `avr-gcc` and you see errors involving LUFA, for example:
|
||||
|
||||
`lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h:380:5: error: 'const' attribute on function returning 'void'`
|
||||
|
||||
For now, you need to rollback avr-gcc to 7 in brew.
|
||||
For now, you need to rollback `avr-gcc` to 8 in Homebrew.
|
||||
|
||||
```
|
||||
brew uninstall --force avr-gcc
|
||||
|
||||
@@ -16,17 +16,23 @@ Faites attention à sélectionner "HTTPS", et sélectionnez le lien et copiez-le
|
||||
|
||||

|
||||
|
||||
Ensuite, entrez `git clone` dans la ligne de commande, et collez votre lien:
|
||||
Ensuite, entrez `git clone --recurse-submodules ` dans la ligne de commande, et collez votre lien:
|
||||
|
||||
```
|
||||
user@computer:~$ git clone https://github.com/whoeveryouare/qmk_firmware.git
|
||||
user@computer:~$ git clone --recurse-submodules https://github.com/whoeveryouare/qmk_firmware.git
|
||||
Cloning into 'qmk_firmware'...
|
||||
remote: Counting objects: 46625, done.
|
||||
remote: Compressing objects: 100% (2/2), done.
|
||||
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
|
||||
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
|
||||
Resolving deltas: 100% (29362/29362), done.
|
||||
Checking out files: 100% (2799/2799), done.
|
||||
remote: Enumerating objects: 9, done.
|
||||
remote: Counting objects: 100% (9/9), done.
|
||||
remote: Compressing objects: 100% (5/5), done.
|
||||
remote: Total 183883 (delta 5), reused 4 (delta 4), pack-reused 183874
|
||||
Receiving objects: 100% (183883/183883), 132.90 MiB | 9.57 MiB/s, done.
|
||||
Resolving deltas: 100% (119972/119972), done.
|
||||
...
|
||||
Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b'
|
||||
Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
|
||||
Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
|
||||
Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
|
||||
Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
|
||||
```
|
||||
|
||||
Vous avez maintenant votre fork QMK sur votre machine locale, vous pouvez ajouter votre keymap, la compiler et la flasher sur votre board. Une fois heureux avec vos changements, vous pouvez les ajouter, commit, et pousser vers votre fork comme suit:
|
||||
|
||||
@@ -4,7 +4,7 @@ Le but de cette page est d'expliquer les informations de base qui vous serons n
|
||||
|
||||
## Structure de base de QMK
|
||||
|
||||
QMK est un fork du projet [tmk_keyboard](https://github.com/tmk/tmk_keyboard) créé par [Jun Wako](https://github.com/tmk). Le code originel de TMK, avec quelques modifications, se trouve dans le dossier `tmk`. Les additions que QMK amène au projet se trouvent dans le dossier `quantum`. Les projets de clavier se trouvent dans les dossiers `handwired` et `keyboard`.
|
||||
QMK est un fork du projet [tmk_keyboard](https://github.com/tmk/tmk_keyboard) créé par [Jun Wako](https://github.com/tmk). Le code originel de TMK, avec quelques modifications, se trouve dans le dossier `tmk_core`. Les additions que QMK amène au projet se trouvent dans le dossier `quantum`. Les projets de clavier se trouvent dans les dossiers `handwired` et `keyboard`.
|
||||
|
||||
### Structure du Userspace
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ Debian / Ubuntu example:
|
||||
Fedora / Red Hat example:
|
||||
|
||||
sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs arm-none-eabi-binutils-cs arm-none-eabi-newlib
|
||||
|
||||
|
||||
Arch / Manjaro example:
|
||||
|
||||
pacman -S base-devel gcc unzip wget zip avr-gcc avr-binutils avr-libc dfu-util arm-none-eabi-gcc arm-none-eabi-binutils arm-none-eabi-newlib git dfu-programmer dfu-util
|
||||
@@ -57,16 +57,17 @@ By default, this will download compilers for both AVR and ARM. If you don't need
|
||||
nix-shell --arg arm false
|
||||
|
||||
## macOS
|
||||
If you're using [homebrew,](http://brew.sh/) you can use the following commands:
|
||||
If you're using [Homebrew](http://brew.sh/), you can use the following commands:
|
||||
|
||||
brew tap osx-cross/avr
|
||||
brew tap PX4/homebrew-px4
|
||||
brew tap osx-cross/arm
|
||||
brew update
|
||||
brew install avr-gcc@8
|
||||
brew link --force avr-gcc@8
|
||||
brew install dfu-programmer
|
||||
brew install dfu-util
|
||||
brew install gcc-arm-none-eabi
|
||||
brew install arm-gcc-bin@8
|
||||
brew link --force arm-gcc-bin@8
|
||||
brew install avrdude
|
||||
|
||||
This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of `avr-gcc@8` can take over 20 minutes and exhibit high CPU usage.
|
||||
|
||||
@@ -16,17 +16,23 @@ And be sure to select "HTTPS", and select the link and copy it:
|
||||
|
||||

|
||||
|
||||
From here, enter `git clone ` into the command line, and then paste your link:
|
||||
From here, enter `git clone --recurse-submodules ` into the command line, and then paste your link:
|
||||
|
||||
```
|
||||
user@computer:~$ git clone --recurse-submodules https://github.com/whoeveryouare/qmk_firmware.git
|
||||
Cloning into 'qmk_firmware'...
|
||||
remote: Counting objects: 46625, done.
|
||||
remote: Compressing objects: 100% (2/2), done.
|
||||
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
|
||||
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
|
||||
Resolving deltas: 100% (29362/29362), done.
|
||||
Checking out files: 100% (2799/2799), done.
|
||||
remote: Enumerating objects: 9, done.
|
||||
remote: Counting objects: 100% (9/9), done.
|
||||
remote: Compressing objects: 100% (5/5), done.
|
||||
remote: Total 183883 (delta 5), reused 4 (delta 4), pack-reused 183874
|
||||
Receiving objects: 100% (183883/183883), 132.90 MiB | 9.57 MiB/s, done.
|
||||
Resolving deltas: 100% (119972/119972), done.
|
||||
...
|
||||
Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b'
|
||||
Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
|
||||
Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
|
||||
Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
|
||||
Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
|
||||
```
|
||||
|
||||
You now have your QMK fork on your local machine, and you can add your keymap, compile it and flash it to your board. Once you're happy with your changes, you can add, commit, and push them to your fork like this:
|
||||
|
||||
@@ -17,19 +17,25 @@ Github עלול להיות קצת טריקי למי שלא מכיר את העב
|
||||
|
||||

|
||||
|
||||
מכאן והלאה, הקיש `git clone ` בשורת הפקודה והדביקו את הלינק שלכם:
|
||||
מכאן והלאה, הקיש `git clone --recurse-submodules ` בשורת הפקודה והדביקו את הלינק שלכם:
|
||||
|
||||
<div dir="ltr" markdown="1">
|
||||
|
||||
```
|
||||
user@computer:~$ git clone https://github.com/whoeveryouare/qmk_firmware.git
|
||||
user@computer:~$ git clone --recurse-submodules https://github.com/whoeveryouare/qmk_firmware.git
|
||||
Cloning into 'qmk_firmware'...
|
||||
remote: Counting objects: 46625, done.
|
||||
remote: Compressing objects: 100% (2/2), done.
|
||||
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
|
||||
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
|
||||
Resolving deltas: 100% (29362/29362), done.
|
||||
Checking out files: 100% (2799/2799), done.
|
||||
remote: Enumerating objects: 9, done.
|
||||
remote: Counting objects: 100% (9/9), done.
|
||||
remote: Compressing objects: 100% (5/5), done.
|
||||
remote: Total 183883 (delta 5), reused 4 (delta 4), pack-reused 183874
|
||||
Receiving objects: 100% (183883/183883), 132.90 MiB | 9.57 MiB/s, done.
|
||||
Resolving deltas: 100% (119972/119972), done.
|
||||
...
|
||||
Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b'
|
||||
Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
|
||||
Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
|
||||
Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
|
||||
Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
|
||||
```
|
||||
|
||||
</div>
|
||||
@@ -66,4 +72,4 @@ To https://github.com/whoeveryouare/qmk_firmware.git
|
||||

|
||||
|
||||
אחרי שהגשתם, אנו עלולים לפנות אליכם לגבי השינויים שהצעתם, נבקש שתבצעו שינויים ובסופו של דבר נקבל את השינויים! תודה שתרמתם לפרוייקט QMK :)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
## מבנה QMK בסיסי
|
||||
|
||||
QMK הוא פורק של הפרוייקט [tmk_keyboard](https://github.com/tmk/tmk_keyboard) של [Jun Wako](https://github.com/tmk). קוד הTMK המקורי, עם התאמות, יכול להמצא בתיקיית `tmk`. התוספות של QMK לפרוייקט יכולות להמצא בתיקיית `quantum`. פרוייקטי מקלדות יכולות להמצא בתיקיות `handwired` ו- `keyboard`.
|
||||
QMK הוא פורק של הפרוייקט [tmk_keyboard](https://github.com/tmk/tmk_keyboard) של [Jun Wako](https://github.com/tmk). קוד הTMK המקורי, עם התאמות, יכול להמצא בתיקיית `tmk_core`. התוספות של QMK לפרוייקט יכולות להמצא בתיקיית `quantum`. פרוייקטי מקלדות יכולות להמצא בתיקיות `handwired` ו- `keyboard`.
|
||||
|
||||
### מבנה אחסון המשתמש
|
||||
|
||||
@@ -69,4 +69,4 @@ In every keymap folder, the following files may be found. Only `keymap.c` is req
|
||||
```
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
* [初めてのファームウェアの構築](ja/newbs_building_firmware.md)
|
||||
* [ファームウェアのフラッシュ](ja/newbs_flashing.md)
|
||||
* [テストとデバッグ](ja/newbs_testing_debugging.md)
|
||||
* [Gitのベストプラクティス](ja/newbs_best_practices.md)
|
||||
* [QMK における Git 運用作法](ja/newbs_git_best_practices.md)
|
||||
* [あなたのフォークの master ブランチ](ja/newbs_git_using_your_master_branch.md)
|
||||
* [マージの競合の解決](ja/newbs_git_resolving_merge_conflicts.md)
|
||||
* [同期のとれていない git ブランチの再同期](ja/newbs_git_resynchronize_a_branch.md)
|
||||
* [学習リソース](ja/newbs_learn_more_resources.md)
|
||||
|
||||
* [QMKの基本](ja/README.md)
|
||||
|
||||
@@ -23,7 +23,7 @@ XPM のインストール手順は[ここ](https://www.npmjs.com/package/xpm)で
|
||||
|
||||
### ARM ツールチェーン
|
||||
|
||||
XPM を使うと、ARM ツールチェーンをとても簡単にインストールできます。`xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc` とコマンドを入力します。
|
||||
XPM を使うと、ARM ツールチェーンをとても簡単にインストールできます。`xpm install --global @xpack-dev-tools/arm-none-eabi-gcc` とコマンドを入力します。
|
||||
|
||||
### Windows ビルドツール
|
||||
|
||||
@@ -38,7 +38,7 @@ ST-Link を持っている場合は、ドライバは[ここ](https://www.st.com
|
||||
|
||||
### OpenOCD
|
||||
|
||||
この依存関係により、SWD は GDB からアクセスでき、デバッグに不可欠です。`xpm install --global @gnu-mcu-eclipse/openocd` を実行します。
|
||||
この依存関係により、SWD は GDB からアクセスでき、デバッグに不可欠です。`xpm install --global @xpack-dev-tools/openocd` を実行します。
|
||||
|
||||
### Java
|
||||
|
||||
@@ -50,17 +50,17 @@ Java は Eclipse で必要とされるため、[ここ](https://www.oracle.com/t
|
||||
|
||||
## Eclipse の設定
|
||||
|
||||
ダウンロードした Eclipse IDE を開きます。QMK ディレクトリをインポートするために、File -> Import -> C/C++ -> Existing code as Makefile Project を選択します。Next を選択し、Browse を使用して QMK フォルダを選択します。tool-chain リストから ARM Cross GCC を選択し、Finish を選択します。
|
||||
ダウンロードした Eclipse IDE を開きます。QMK ディレクトリをインポートするために、File -> Import -> C/C++ -> Existing Code as Makefile Project を選択します。Next を選択し、Browse を使用して QMK フォルダを選択します。tool-chain リストから ARM Cross GCC を選択し、Finish を選択します。
|
||||
|
||||
これで、左側に QMK フォルダが表示されます。右クリックして、Properties を選択します。左側で MCU を展開し、ARM Toolchain Paths を選択します。xPack を押して OK を押します。OpenOCD Path で同じことを繰り返し、Windows の場合は、Build Tool Path でも同じことを繰り返します。Apply and Close を選択します。
|
||||
これで、左側に QMK フォルダが表示されます。右クリックして、Properties を選択します。左側で MCU を展開し、ARM Toolchains Paths を選択します。xPack を押して OK を押します。OpenOCD Path で同じことを繰り返し、Windows の場合は、Build Tools Path でも同じことを繰り返します。Apply and Close を選択します。
|
||||
|
||||
ここで、必要な MCU パッケージをインストールします。Window -> Open Perspective -> Others -> Packs を選択して、Packs perspective に移動します。Packs タブの横にある黄色のリフレッシュ記号を選択します。これは様々な場所から MCU の定義を要求するため、時間が掛かります。一部のリンクが失敗した場合は、おそらく Ignore を選択できます。
|
||||
ここで、必要な MCU パッケージをインストールします。Window -> Perspective -> Open Perspective -> Other... -> Packs を選択して、Packs perspective に移動します。Packs タブの横にある黄色のリフレッシュ記号を選択します。これは様々な場所から MCU の定義を要求するため、時間が掛かります。一部のリンクが失敗した場合は、おそらく Ignore を選択できます。
|
||||
|
||||
これが終了すると、ビルドやデバッグする MCU を見つけることができるはずです。この例では、STM32F3 シリーズの MCU を使います。左側で、STMicroelectronics -> STM32F3 Series を選択します。中央のウィンドウに、pack が表示されます。右クリックし、Install を選択します。それが終了したら、Window -> Open Perspective -> Others -> C/C++ を選択してデフォルトのパースペクティブに戻ることができます。
|
||||
これが終了すると、ビルドやデバッグする MCU を見つけることができるはずです。この例では、STM32F3 シリーズの MCU を使います。左側で、STMicroelectronics -> STM32F3 Series を選択します。中央のウィンドウに、pack が表示されます。右クリックし、Install を選択します。それが終了したら、Window -> Perspective -> Open Perspective -> Other... -> C/C++ を選択してデフォルトのパースペクティブに戻ることができます。
|
||||
|
||||
Eclipse に QMK をビルドしようとするデバイスを教える必要があります。QMK フォルダを右クリック -> Properties -> C/C++ Build -> Settings を選択します。Devices タブを選択し、devices の下から MCU の適切な種類を選択します。私の例では、STM32F303CC です。
|
||||
Eclipse に QMK をビルドしようとするデバイスを教える必要があります。QMK フォルダを右クリック -> Properties -> C/C++ Build -> Settings を選択します。Devices タブを選択し、Devices の下から MCU の適切な種類を選択します。私の例では、STM32F303CC です。
|
||||
|
||||
この間に、build コマンドもセットアップしましょう。C/C++ Build を選択し、Behavior タブを選択します。build コマンドのところで、`all` を必要な make コマンドに置き換えます。例えば、rev6 Planck の default キーマップの場合、これは `planck/rev6:default` になります。Apply and Close を選択します。
|
||||
この間に、Build コマンドもセットアップしましょう。C/C++ Build を選択し、Behavior タブを選択します。build コマンドのところで、`all` を必要な make コマンドに置き換えます。例えば、rev6 Planck の default キーマップの場合、これは `planck/rev6:default` になります。Apply and Close を選択します。
|
||||
|
||||
## ビルド
|
||||
|
||||
@@ -76,7 +76,7 @@ ARM MCU は、クロック信号(SWCLK) とデータ信号(SWDIO) で構成さ
|
||||
|
||||
### デバッガの設定
|
||||
|
||||
QMK フォルダを右クリックし、Debug As -> Debug Configuration を選択します。ここで、GDB OpenOCD Debugging をダブルクリックします。Debugger タブを選択し、MCU に必要な設定を入力します。これを見つけるにはいじったりググったりする必要があるかもしれません。STM32F3 用のデフォルトスクリプトは stm32f3discovery.cfg と呼ばれます。OpenOCD に伝えるには、Config options で `-f board/stm32f3discovery.cfg` と入力します。
|
||||
QMK フォルダを右クリックし、Debug As -> Debug Configurations... を選択します。ここで、GDB OpenOCD Debugging をダブルクリックします。Debugger タブを選択し、MCU に必要な設定を入力します。これを見つけるにはいじったりググったりする必要があるかもしれません。STM32F3 用のデフォルトスクリプトは stm32f3discovery.cfg と呼ばれます。OpenOCD に伝えるには、Config options で `-f board/stm32f3discovery.cfg` と入力します。
|
||||
|
||||
注意: 私の場合、この設定スクリプトはリセット操作を無効にするために編集が必要です。スクリプトの場所は、通常はパス `openocd/version/.content/scripts/board` の下の実際の実行可能フィールドの中で見つかります。ここで、私は `reset_config srst_only` を `reset_config none` に編集しました。
|
||||
|
||||
@@ -86,7 +86,7 @@ Apply and Close を選択します。
|
||||
|
||||
キーボードをリセットしてください。
|
||||
|
||||
虫アイコンをクリックし、もし全てうまく行けば debug パースペクティブに移動します。ここでは、main 関数の最初でプログラムカウンタが停止するので、Play ボタンを押します。全てのデバッガのほとんどの機能は ARM MCU で動作しますが、正確な詳細については google があなたのお友達です!
|
||||
虫アイコンをクリックし、もし全てうまく行けば Debug パースペクティブに移動します。ここでは、main 関数の最初でプログラムカウンタが停止するので、Play ボタンを押します。全てのデバッガのほとんどの機能は ARM MCU で動作しますが、正確な詳細については google があなたのお友達です!
|
||||
|
||||
|
||||
ハッピーデバッギング!
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# QMK の設定
|
||||
|
||||
<!---
|
||||
original document: eae21eed7:docs/config_options.md
|
||||
git diff eae21eed7 HEAD docs/config_options.md | cat
|
||||
original document: 0f43c2652:docs/config_options.md
|
||||
git diff 0f43c2652 HEAD -- docs/config_options.md | cat
|
||||
-->
|
||||
|
||||
QMK はほぼ無制限に設定可能です。可能なところはいかなるところでも、やりすぎな程、ユーザーがコードサイズを犠牲にしてでも彼らのキーボードをカスタマイズをすることを許しています。ただし、このレベルの柔軟性により設定が困難になります。
|
||||
@@ -285,8 +285,26 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
||||
* ビルドの後でルート `qmk_firmware` フォルダにコピーされる形式 (bin, hex) を定義します。
|
||||
* `SRC`
|
||||
* コンパイル・リンクリストにファイルを追加するために使われます。
|
||||
* `LIB_SRC`
|
||||
* コンパイル・リンクリストにライブラリとしてファイルを追加するために使われます。
|
||||
`LIB_SRC` で指定されたファイルは、`SRC` で指定されたファイルの後にリンクされます。
|
||||
例えば、次のように指定した場合:
|
||||
```
|
||||
SRC += a.c
|
||||
LIB_SRC += lib_b.c
|
||||
SRC += c.c
|
||||
LIB_SRC += lib_d.c
|
||||
```
|
||||
リンク順は以下の通りです。
|
||||
```
|
||||
... a.o c.o ... lib_b.a lib_d.a ...
|
||||
```
|
||||
* `LAYOUTS`
|
||||
* このキーボードがサポートする[レイアウト](ja/feature_layouts.md)のリスト
|
||||
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
||||
* キーボードをコンパイルする時に、Link Time Optimization (`LTO`) を有効にします。これは処理に時間が掛かりますが、コンパイルされたサイズを大幅に減らします (そして、ファームウェアが小さいため、追加の時間は分からないくらいです)。ただし、`LTO` が有効な場合、古いマクロと関数の機能が壊れるため、自動的にこれらの機能を無効にします。これは `NO_ACTION_MACRO` と `NO_ACTION_FUNCTION` を自動的に定義することで行われます。
|
||||
* `LTO_ENABLE`
|
||||
* LINK_TIME_OPTIMIZATION_ENABLE と同じ意味です。`LINK_TIME_OPTIMIZATION_ENABLE` の代わりに `LTO_ENABLE` を使うことができます。
|
||||
|
||||
## AVR MCU オプション
|
||||
* `MCU = atmega32u4`
|
||||
@@ -345,9 +363,6 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
||||
* キーボードが起動する前に、USB 接続が確立されるのをキーボードに待機させます
|
||||
* `NO_USB_STARTUP_CHECK`
|
||||
* キーボードの起動後の usb サスペンドチェックを無効にします。通常、キーボードはタスクが実行される前にホストがウェイク アップするのを待ちます。分割キーボードは半分はウェイクアップコールを取得できませんが、マスタにコマンドを送信する必要があるため、役に立ちます。
|
||||
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
||||
* キーボードをコンパイルする時に、Link Time Optimization (`LTO`) を有効にします。これは処理に時間が掛かりますが、コンパイルされたサイズを大幅に減らします (そして、ファームウェアが小さいため、追加の時間は分からないくらいです)。ただし、`LTO` が有効な場合、古いマクロと関数の機能が壊れるため、自動的にこれらの機能を無効にします。これは `NO_ACTION_MACRO` と `NO_ACTION_FUNCTION` を自動的に定義することで行われます。
|
||||
* `LINK_TIME_OPTIMIZATION_ENABLE` の代わりに `LTO_ENABLE` を使うことができます。
|
||||
|
||||
## USB エンドポイントの制限
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 貢献方法
|
||||
|
||||
<!---
|
||||
original document: d598f01cb:contributing.md
|
||||
git diff d598f01cb HEAD contributing.md | cat
|
||||
original document: d47809575:docs/contributing.md
|
||||
git diff d47809575 HEAD docs/contributing.md | cat
|
||||
-->
|
||||
|
||||
👍🎉 まず、これを読み貢献する時間を作ってくれてありがとうございます!🎉👍
|
||||
@@ -90,7 +90,7 @@ kerpleplork はエラーコード 23 で連続的に失敗していました。
|
||||
|
||||
ドキュメントは QMK への貢献を始める最も簡単な方法の1つです。ドキュメントが間違っているか不完全な場所を見つけ、これらを修正するのは簡単です!私たちもドキュメントを編集する人を非常に必要としています。編集するスキルがあるが、どこにどのように飛び乗ればいいのか分からない場合は、[助けをもとめて](#where-can-i-go-for-help)ください!
|
||||
|
||||
全てのドキュメントは `qmk_firmware/docs` ディレクトリの中にあります。あるいは web ベースのワークフローを使いたい場合は、http://docs.qmk.fm/ の各ページの上部にある "Suggest An Edit" をクリックすることができます。
|
||||
全てのドキュメントは `qmk_firmware/docs` ディレクトリの中にあります。あるいは web ベースのワークフローを使いたい場合は、https://docs.qmk.fm/ の各ページの下部にある "Edit this page" リンクをクリックすることができます。
|
||||
|
||||
ドキュメントの中にコードの例を提供する場合は、ドキュメント内の他の場所で使用されている命名規則を順守してください。例えば、一貫性を保つために、`my_layers` あるいは `my_keycodes` として列挙型を標準化します:
|
||||
|
||||
|
||||
53
docs/ja/driver_installation_zadig.md
Normal file
53
docs/ja/driver_installation_zadig.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# Zadig を使ったブートローダドライバのインストール
|
||||
|
||||
<!---
|
||||
original document: d598f01cb:docs/driver_installation_zadig.md
|
||||
git diff d598f01cb HEAD docs/driver_installation_zadig.md | cat
|
||||
-->
|
||||
|
||||
QMK はホストにたいして通常の HID キーボードデバイスとして振る舞うため特別なドライバは必要ありません。しかし、Windows でのキーボードへの書き込みは、多くの場合、キーボードをリセットした時に現れるブートローダデバイスで*行います*。
|
||||
|
||||
2つの注目すべき例外があります: 通常 Pro Micro で見られる Caterina ブートローダや、PJRC Teensy に書き込まれている HalfKay ブートローダは、それぞれシリアルポートと汎用 HID デバイスとして振る舞うため、ドライバは必要ありません。
|
||||
|
||||
[Zadig](https://zadig.akeo.ie/) ユーティリティを使うことをお勧めします。MSYS2 あるいは WSL を使って開発環境をセットアップした場合、`qmk_install.sh` スクリプトはドライバをインストールするかどうかをたずねます。
|
||||
|
||||
## インストール
|
||||
|
||||
`RESET` キーコード (別のレイヤにあるかもしれません)を押すか、通常はキーボードの下面にあるリセットスイッチを押して、キーボードをブートローダモードにします。どちらもキーボードに無い場合は、Escape または Space+`B` を押しながら接続してみてください (詳細は、[ブートマジック](ja/feature_bootmagic.md) ドキュメントを見てください)。一部のキーボードはブートマジックの代わりに[コマンド](ja/feature_command.md)を使います。この場合、キーボードが接続されている状態で「左Shift + 右Shift + `B`」あるいは「左Shift + 右Shift + Escape」を押すと、ブートローダモードに入ることができます。
|
||||
一部のキーボードはブートローダに入るために特定の操作をする必要があります。例えば、[ブートマジック Lite](ja/feature_bootmagic.md#bootmagic-lite) キー (デフォルト: Escape) は別のキー(例えば、左Control)かもしれません。また、コマンドを有効にするキーの組み合わせ (デフォルト: 左Shift + 右Shift) は何か他のキー(例えば 左Control + 右Control)を押し続ける必要がある場合があります。不明な場合は、キーボードの README ファイルを参照してください。
|
||||
|
||||
USBaspLoader を使ってデバイスをブートローダモードにするには、`BOOT` ボタンを押しながら `RESET` ボタンをタップしてください。
|
||||
あるいは `BOOT` を押し続けながら USB ケーブルを挿入します。
|
||||
|
||||
Zadig は自動的にブートローダデバイスを検知します。**Options → List All Devices** を確認する必要がある場合があります。
|
||||
|
||||
- Atmel AVR MCU を搭載したキーボードの場合、ブートローダは `ATm32U4DFU` に似た名前が付けられ、ベンダー ID は `03EB` です。
|
||||
- USBasp ブートローダは `USBasp` として表示され、VID/PID は`16C0:05DC` です。
|
||||
- QMK-DFU ブートローダを使って書き込まれた AVR キーボードは `<keyboard name> Bootloader` という名前が付けられ、VID は `03EB` です。
|
||||
- ほとんどの ARM キーボードでは、`STM32 BOOTLOADER` と呼ばれ、VID/PID は `0483:DF11` です。
|
||||
|
||||
!> Zadig が `HidUsb` ドライバを使用する1つ以上のデバイスを表示する場合、キーボードはおそらくブートローダモードではありません。矢印はオレンジ色になり、システムドライバの変更を確認するように求められます。この場合、続行**しないでください**!
|
||||
|
||||
矢印が緑色で表示されたら、ドライバを選択し、**Install Driver** をクリックします。`libusb-win32` ドライバは通常 AVR で動作し、`WinUSB`は ARM で動作しますが、それでもキーボードに書き込みできない場合は、リストから異なるドライバをインストールしてみてください。msys2 を使ってコマンドライン経由で USBaspLoader デバイスに書き込むには、`libusbk` ドライバがお勧めです。そうではなく書き込みに QMK Toolbox を使っている場合は `libusb-win32` がうまく動作します。
|
||||
|
||||

|
||||
|
||||
最後に、新しいドライバがロードされたことを確認するためにキーボードのプラグを抜いて再接続します。書き込みに QMK Toolbox を使う場合は、ドライバの変更を認識しない場合があるため、QMK Toolkit を終了して再起動します。
|
||||
|
||||
## 間違ったデバイスのインストールからの回復
|
||||
|
||||
キーボードが入力できなくなった場合は、ブートローダではなくキーボード自体のドライバを間違って入れ替えた可能性があります。これはキーボードがブートローダモードでない場合に起こりえます。これは Zadig で簡単に確認することができます - 健全なキーボードには、全てのインタフェースに `HidUsb` ドライバがインストールされています:
|
||||
|
||||

|
||||
|
||||
デバイスマネージャーを開き、キーボードと思われるデバイスを探します。
|
||||
|
||||

|
||||
|
||||
右クリックし、**デバイスのアンインストール** をクリックします。最初に **このデバイスのドライバーソフトウェアを削除します** にチェックが付いていることを確認してください。
|
||||
|
||||

|
||||
|
||||
**Action → Scan for hardware changes** をクリックします。この時点で、再び入力できるようになっているはずです。Zadig でキーボードデバイスが `HidUsb` ドライバを使っていることを再確認します。そうであれば完了です。キーボードは再び機能するはずです!
|
||||
|
||||
?> Windows が新しいドライバを使えるようにするために、この時点でコンピュータを完全に再起動する必要があるかもしれません。
|
||||
11
docs/ja/faq.md
Normal file
11
docs/ja/faq.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# よくある質問
|
||||
|
||||
<!---
|
||||
original document: d598f01cb:docs/faq.md
|
||||
git diff d598f01cb HEAD docs/faq.md | cat
|
||||
-->
|
||||
|
||||
* [一般](ja/faq_general.md)
|
||||
* [QMK のビルドあるいはコンパイル](ja/faq_build.md)
|
||||
* [QMK のデバッグとトラブルシューティング](ja/faq_debug.md)
|
||||
* [キーマップ](ja/faq_keymap.md)
|
||||
160
docs/ja/faq_build.md
Normal file
160
docs/ja/faq_build.md
Normal file
@@ -0,0 +1,160 @@
|
||||
# よくあるビルドの質問
|
||||
|
||||
<!---
|
||||
original document: 0f43c2652:docs/faq_build.md
|
||||
git diff 0f43c2652 HEAD -- docs/faq_build.md | cat
|
||||
-->
|
||||
|
||||
このページは QMK のビルドに関する質問を説明します。まだビルドをしていない場合は、[ビルド環境のセットアップ](ja/getting_started_build_tools.md) および [Make 手順](ja/getting_started_make_guide.md)ガイドを読むべきです。
|
||||
|
||||
## Linux でプログラムできません
|
||||
デバイスを操作するには適切な権限が必要です。Linux ユーザの場合は、以下の `udev` ルールに関する指示を見てください。`udev` に問題がある場合は、回避策は `sudo` コマンドを使うことです。このコマンドに慣れていない場合は、`man sudo` コマンドでマニュアルを確認するか、[この web ページを見てください](https://linux.die.net/man/8/sudo)。
|
||||
|
||||
コントローラが ATMega32u4 の場合の `sudo` の使い方の例:
|
||||
|
||||
$ sudo dfu-programmer atmega32u4 erase --force
|
||||
$ sudo dfu-programmer atmega32u4 flash your.hex
|
||||
$ sudo dfu-programmer atmega32u4 reset
|
||||
|
||||
あるいは、単純に:
|
||||
|
||||
$ sudo make <keyboard>:<keymap>:dfu
|
||||
|
||||
`make` を `sudo` で実行することは一般的には良い考えでは***なく***、可能であれば前者の方法のいずれかを使うべきです。
|
||||
|
||||
### Linux の `udev` ルール
|
||||
Linux では、MCU にアクセスするには適切な権限が必要です。ファームウェアを書き込む時に `sudo` を使うか、`/etc/udev/rules.d/` にこれらのファイルを配置することで、アクセスすることができます。権限の追加が完了したら、以下を実行します:
|
||||
```console
|
||||
sudo udevadm control --reload-rules
|
||||
sudo udevadm trigger
|
||||
```
|
||||
|
||||
**/etc/udev/rules.d/50-atmel-dfu.rules:**
|
||||
```
|
||||
# Atmel ATMega32U4
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", MODE:="0666"
|
||||
# Atmel USBKEY AT90USB1287
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", MODE:="0666"
|
||||
# Atmel ATMega32U2
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", MODE:="0666"
|
||||
```
|
||||
|
||||
**/etc/udev/rules.d/52-tmk-keyboard.rules:**
|
||||
```
|
||||
# tmk keyboard products https://github.com/tmk/tmk_keyboard
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"
|
||||
```
|
||||
**/etc/udev/rules.d/54-input-club-keyboard.rules:**
|
||||
|
||||
```
|
||||
# Input Club keyboard bootloader
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", MODE:="0666"
|
||||
```
|
||||
|
||||
**/etc/udev/rules.d/55-caterina.rules:**
|
||||
```
|
||||
# ModemManager should ignore the following devices
|
||||
ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||
ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||
```
|
||||
|
||||
**注意:** ModemManager フィルタリングは厳格モードでは無い場合のみ動作します。以下のコマンドでその設定を変更することができます:
|
||||
```console
|
||||
sudo sed -i 's/--filter-policy=strict/--filter-policy=default/' /lib/systemd/system/ModemManager.service
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart ModemManager
|
||||
```
|
||||
|
||||
**/etc/udev/rules.d/56-dfu-util.rules:**
|
||||
```
|
||||
# stm32duino
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", MODE:="0666"
|
||||
# Generic stm32
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE:="0666"
|
||||
```
|
||||
|
||||
**/etc/udev/rules.d/57-bootloadhid.rules:**
|
||||
```
|
||||
# bootloadHID
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", MODE:="0666"
|
||||
```
|
||||
|
||||
### Linux のブートローダモードで Serial デバイスが検知されない
|
||||
カーネルがデバイスを適切にサポートしていることを確認してください。デバイスが、Pro Micro (Atmega32u4) のように USB ACM を使う場合、`CONFIG_USB_ACM=y` を含めるようにしてください。他のデバイスは `USB_SERIAL` およびそのサブオプションを必要とするかもしれません。
|
||||
|
||||
## DFU ブートローダの不明なデバイス
|
||||
|
||||
Windows 上でキーボードを書き込む時に発生する問題は、ブートローダ用に間違ったドライバがインストールされているか、全くインストールされていないかによるものがほとんどです。
|
||||
|
||||
QMK インストールスクリプト (MSYS2 あるいは WSL 内の `qmk_firmware` ディレクトリから `./util/qmk_install.sh`) を再実行するか、QMK Toolbox の再インストールでこの問題が解決するかもしれません。別のやり方として、手動で [`qmk_driver_installer`](https://github.com/qmk/qmk_driver_installer) パッケージをダウンロードして実行することができます。
|
||||
|
||||
それでもうまく行かない場合は、Zadig をダウンロードして実行する必要があります。詳細な情報は [Zadig を使ったブートローダドライバのインストール](ja/driver_installation_zadig.md)を見てください。
|
||||
|
||||
## USB VID と PID
|
||||
`config.h` を編集することで任意の ID を使うことができます。おそらく未使用の ID を使っても、他の製品と衝突するとても低い可能性があることを除いて、実際には問題はありません。
|
||||
|
||||
QMK のほとんどのキーボードは、vendor ID として、`0xFEED` を使います。他のキーボードを調べて、ユニークな ID を選択してください。
|
||||
|
||||
またこれも見てください。
|
||||
https://github.com/tmk/tmk_keyboard/issues/150
|
||||
|
||||
ここで本当にユニークな VID:PID を買うことができます。個人的な使用にはこれは必要ないと思います。
|
||||
- http://www.obdev.at/products/vusb/license.html
|
||||
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
||||
|
||||
## AVR のための BOOTLOADER_SIZE
|
||||
Teensy2.0++ ブートローダのサイズは 2048 バイトであることに注意してください。一部の Makefile には間違ったコメントがあります。
|
||||
|
||||
```
|
||||
# Boot Section Size in *bytes*
|
||||
# Teensy halfKay 512
|
||||
# Teensy++ halfKay 2048
|
||||
# Atmel DFU loader 4096 (TMK Alt Controller)
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=2048
|
||||
```
|
||||
|
||||
## MacOS での `avr-gcc: internal compiler error: Abort trap: 6 (program cc1)`
|
||||
これは brew での更新に関する問題で、avr-gcc が依存するシンボリックリンクを壊します。
|
||||
|
||||
解決法は全ての影響を受けたモジュールを削除し再インストールすることです。
|
||||
|
||||
```
|
||||
brew rm avr-gcc
|
||||
brew rm avr-gcc@8
|
||||
brew rm dfu-programmer
|
||||
brew rm dfu-util
|
||||
brew rm gcc-arm-none-eabi
|
||||
brew rm arm-gcc-bin@8
|
||||
brew rm avrdude
|
||||
brew install avr-gcc@8
|
||||
brew install dfu-programmer
|
||||
brew install dfu-util
|
||||
brew install arm-gcc-bin@8
|
||||
brew install avrdude
|
||||
brew link --force avr-gcc@8
|
||||
brew link --force arm-gcc-bin@8
|
||||
```
|
||||
|
||||
### `avr-gcc` と LUFA
|
||||
|
||||
`avr-gcc` を更新し、LUFA に関連するエラーが表示された場合、例えば:
|
||||
|
||||
`lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h:380:5: error: 'const' attribute on function returning 'void'`
|
||||
|
||||
今のところ、Homebrew で `avr-gcc` を 8 にロールバックする必要があります。
|
||||
|
||||
```
|
||||
brew uninstall --force avr-gcc
|
||||
brew install avr-gcc@8
|
||||
brew link --force avr-gcc@8
|
||||
```
|
||||
|
||||
### キーボードに書き込んだが何も起こらない、あるいはキーの押下が登録されない - ARM (rev6 planck、clueboard 60、hs60v2 など) でも同じ (Feb 2019)
|
||||
ARM ベースのチップ上での EEPROM の動作によって、保存された設定が無効になる場合があります。これはデフォルトレイヤに影響し、まだ調査中の特定の環境下でキーボードが使えなくなる*しれません*。EEPROM のリセットでこれが修正されます。
|
||||
|
||||
[Planck rev6 reset EEPROM](https://cdn.discordapp.com/attachments/473506116718952450/539284620861243409/planck_rev6_default.bin) を使って eeprom のリセットを強制することができます。このイメージを書き込んだ後で、通常のファームウェアを書き込むと、キーボードが_通常_ の動作順序に復元されます。
|
||||
[Preonic rev3 reset EEPROM](https://cdn.discordapp.com/attachments/473506116718952450/537849497313738762/preonic_rev3_default.bin)
|
||||
|
||||
いずれかの形式でブートマジックが有効になっている場合は、これも実行できるはずです (実行方法の詳細については、[ブートマジックドキュメント](feature_bootmagic.md)とキーボード情報を見てください)。
|
||||
161
docs/ja/faq_debug.md
Normal file
161
docs/ja/faq_debug.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# デバッグの FAQ
|
||||
|
||||
<!---
|
||||
original document: 376419a4f:docs/faq_debug.md
|
||||
git diff 376419a4f HEAD docs/faq_debug.md | cat
|
||||
-->
|
||||
|
||||
このページは、キーボードのトラブルシューティングについての様々な一般的な質問を説明します。
|
||||
|
||||
# デバッグコンソール
|
||||
|
||||
## `hid_listen` がデバイスを認識できない
|
||||
デバイスのデバッグコンソールの準備ができていない場合、以下のように表示されます:
|
||||
|
||||
```
|
||||
Waiting for device:.........
|
||||
```
|
||||
|
||||
デバイスが接続されると、*hid_listen* がデバイスを見つけ、以下のメッセージが表示されます:
|
||||
|
||||
```
|
||||
Waiting for new device:.........................
|
||||
Listening:
|
||||
```
|
||||
|
||||
この 'Listening:' のメッセージが表示されない場合は、[Makefile] を `CONSOLE_ENABLE=yes` に設定してビルドしてみてください
|
||||
|
||||
Linux のような OS でデバイスにアクセスするには、権限が必要かもしれません。
|
||||
- `sudo hid_listen` を試してください
|
||||
|
||||
## コンソールにメッセージが表示されない
|
||||
以下を調べてください:
|
||||
- *hid_listen* がデバイスを検出する。上記を見てください。
|
||||
- **Magic**+d を使ってデバッグを有効にする。[マジックコマンド](https://github.com/tmk/tmk_keyboard#magic-commands)を見てください。
|
||||
- `debug_enable=true` を設定します。[テストとデバッグ](ja/newbs_testing_debugging.md#debugging)を見てください
|
||||
- デバッグ print の代わりに 'print' 関数を使ってみてください。**common/print.h** を見てください。
|
||||
- コンソール機能を持つ他のデバイスを切断します。[Issue #97](https://github.com/tmk/tmk_keyboard/issues/97) を見てください。
|
||||
|
||||
## Linux あるいは UNIX のようなシステムはスーパーユーザ権限を必要とします
|
||||
権限付きで *hid_listen* を実行するために 'sudo' を使ってください。
|
||||
```
|
||||
$ sudo hid_listen
|
||||
```
|
||||
|
||||
または rules ディレクトリにファイルを置いて、TMK デバイスのための *udev rule* を追加します。ディレクトリは各システムで異なるかもしれません。
|
||||
|
||||
File: /etc/udev/rules.d/52-tmk-keyboard.rules (Ubuntu の場合)
|
||||
```
|
||||
# tmk keyboard products https://github.com/tmk/tmk_keyboard
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# 雑多なこと
|
||||
## 安全性の考慮
|
||||
|
||||
あなたはおそらくキーボードを「文鎮化」したくないでしょう。文鎮化するとファームウェアを書き換えられないようになります。リスクがあまりに高い(そしてそうでないかもしれない)ものの一部のリストを示します。
|
||||
|
||||
- キーボードマップに RESET が含まれない場合、DFU モードに入るには、PCB のリセットボタンを押す必要があります。底部のネジを外す必要があります。
|
||||
- tmk_core / common にあるファイルを触るとキーボードが操作不能になるかもしれません。
|
||||
- .hex ファイルが大きすぎると問題を引き起こします; `make dfu` コマンドはブロックを削除し、
|
||||
サイズを検査し(おっと、間違った順序です!)、エラーを出力し、
|
||||
キーボードへの書き込みに失敗し、DFU モードのままになります。
|
||||
- この目的のためには、Planck の最大の .hex ファイルサイズは 7000h (10進数で28672)であることに注意してください。
|
||||
|
||||
```
|
||||
Linking: .build/planck_rev4_cbbrowne.elf [OK]
|
||||
Creating load file for Flash: .build/planck_rev4_cbbrowne.hex [OK]
|
||||
|
||||
Size after:
|
||||
text data bss dec hex filename
|
||||
0 22396 0 22396 577c planck_rev4_cbbrowne.hex
|
||||
```
|
||||
|
||||
- 上のファイルのサイズは 22396/577ch で、28672/7000h より小さいです
|
||||
- 適切な替わりの .hex ファイルがある限り、それをロードして再試行することができます
|
||||
- あなたがキーボードの Makefile で指定したかもしれない一部のオプションは、余分なメモリを消費します; BOOTMAGIC_ENABLE、MOUSEKEY_ENABLE、EXTRAKEY_ENABLE、CONSOLE_ENABLE、API_SYSEX_ENABLE に注意してください
|
||||
- DFU ツールは(オプションの余計なフルーツサラダを投げ込まない限り)ブートローダに書き込むことを許可しないので、
|
||||
ここにはリスクはほとんどありません。
|
||||
- EEPROM の書き込みサイクルは、約100000です。ファームウェアを繰り返し継続的に書き換えるべきではありません。それは最終的に EEPROM を焼き焦がします。
|
||||
|
||||
## NKRO が動作しません
|
||||
最初に、**Makefile** 内でビルドオプション `NKRO_ENABLE` を使ってファームウェアをコンパイルする必要があります。
|
||||
|
||||
**NKRO** がまだ動作しない場合は、`Magic` **N** コマンド(デフォルトでは `LShift+RShift+N`)を試してみてください。**NKRO** モードと **6KRO** モード間を一時的に切り替えるためにこのコマンドを使うことができます。**NKRO** が機能しない状況、特に BIOS の場合は **6KRO** モードに切り替える必要があります。
|
||||
|
||||
ファームウェアを `BOOTMAGIC_ENABLE` でビルドした場合、`ブートマジック` **N** コマンドで切り替える必要があります (デフォルトでは `Space+N`)。この設定は EEPROM に格納され、電源を入れ直しても保持されます。
|
||||
|
||||
https://github.com/tmk/tmk_keyboard#boot-magic-configuration---virtual-dip-switch
|
||||
|
||||
|
||||
## TrackPoint はリセット回路が必要です (PS/2 マウスサポート)
|
||||
リセット回路が無いとハードウェアの不適切な初期化のために一貫性の無い結果になります。TPM754 の回路図を見てください。
|
||||
|
||||
- http://geekhack.org/index.php?topic=50176.msg1127447#msg1127447
|
||||
- http://www.mikrocontroller.net/attachment/52583/tpm754.pdf
|
||||
|
||||
|
||||
## 16 を超えるマトリックの列を読み込めない
|
||||
列が 16 を超える場合、[matrix.h] の `read_cols()` 内の `1<<16` の代わりに `1UL<<16` を使ってください。
|
||||
|
||||
C では、AVR の場合 `1` は [16 bit] である [int] 型の1を意味し、15 を超えて左にシフトすることはできません。`1<<16` すると予期しないゼロが発生します。`1UL` として [unsigned long] 型を使う必要があります。
|
||||
|
||||
http://deskthority.net/workshop-f7/rebuilding-and-redesigning-a-classic-thinkpad-keyboard-t6181-60.html#p146279
|
||||
|
||||
## 特別なエクストラキーが動作しない (システム、オーディオコントロールキー)
|
||||
QMK でそれらを使うには、`rules.mk` 内で `EXTRAKEY_ENABLE` を定義する必要があります。
|
||||
|
||||
```
|
||||
EXTRAKEY_ENABLE = yes # オーディオ制御とシステム制御
|
||||
```
|
||||
|
||||
## スリープから復帰しない
|
||||
|
||||
Windows では、**デバイスマネージャ**の**電源の管理**タブ内の `このデバイスで、コンピュータのスタンバイ状態を解除できるようにする` 設定を調べてください。また BIOS 設定も調べてください。
|
||||
|
||||
スリープ中に任意のキーを押すとホストが起動するはずです。
|
||||
|
||||
## Arduino を使っていますか?
|
||||
|
||||
**Arduino のピンの命名は実際のチップと異なることに注意してください。** 例えば、Arduino のピン `D0` は `PD0` ではありません。回路図を自身で確認してください。
|
||||
|
||||
- http://arduino.cc/en/uploads/Main/arduino-leonardo-schematic_3b.pdf
|
||||
- http://arduino.cc/en/uploads/Main/arduino-micro-schematic.pdf
|
||||
|
||||
Arduino の Leonardo と micro には **ATMega32U4** が載っていて、TMK 用に使うことができますが、Arduino のブートローダが問題になることがあります。
|
||||
|
||||
## JTAG を有効にする
|
||||
|
||||
デフォルトでは、キーボードが起動するとすぐに JTAG デバッグインタフェースが無効になります。JTAG 対応 MCU は `JTAGEN` ヒューズが設定された状態で出荷されており、キーボードがスイッチマトリックス、LED などに使用している可能性のある MCU の特定のピンを乗っ取ります。
|
||||
|
||||
JTAG を有効にしたままにしたい場合は、単に以下のものを `config.h` に追加します:
|
||||
|
||||
```c
|
||||
#define NO_JTAG_DISABLE
|
||||
```
|
||||
|
||||
## USB 3 の互換性
|
||||
USB 3 ポートで問題がある人がいると聞きました。USB 2 ポートを試してください。
|
||||
|
||||
|
||||
## Mac の互換性
|
||||
### OS X 10.11 と Hub
|
||||
https://geekhack.org/index.php?topic=14290.msg1884034#msg1884034
|
||||
|
||||
|
||||
## リジューム (スリープとウェークアップ)/電源サイクルの問題
|
||||
一部の人がキーボードが BIOS で動作しなくなった、またはリジューム(電源サイクル)の後で動作しなくなったと報告しました。
|
||||
|
||||
今のところ、この問題の根本は明確ではないですが、幾つかのビルドオプションが関係しているようです。Makefileで、`CONSOLE_ENABLE`、`NKRO_ENABLE`、`SLEEP_LED_ENABLE` あるいは他のオプションを無効にしてみてください。
|
||||
|
||||
https://github.com/tmk/tmk_keyboard/issues/266
|
||||
https://geekhack.org/index.php?topic=41989.msg1967778#msg1967778
|
||||
|
||||
|
||||
|
||||
## FLIP が動作しない
|
||||
### `AtLibUsbDfu.dll` が見つかりません
|
||||
デバイスマネージャから現在のドライバを削除し、FLIP が提供するものを再インストールします。
|
||||
http://imgur.com/a/bnwzy
|
||||
20
docs/ja/faq_general.md
Normal file
20
docs/ja/faq_general.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# よくある質問
|
||||
|
||||
<!---
|
||||
original document: d598f01cb:docs/faq_general.md
|
||||
git diff d598f01cb HEAD docs/faq_general.md | cat
|
||||
-->
|
||||
|
||||
## QMK とは何か?
|
||||
|
||||
Quantum Mechanical Keyboard の略である [QMK](https://github.com/qmk) は、カスタムキーボードのためのツールをビルドしている人々のグループです。[TMK](https://github.com/tmk/tmk_keyboard) の大幅に修正されたフォークである [QMK ファームウェア](https://github.com/qmk/qmk_firmware)から始まりました。
|
||||
|
||||
## QMK と TMK の違いは何か?
|
||||
|
||||
TMK は [Jun Wako](https://github.com/tmk) によって設計され実装されました。QMK は [Jack Humbert](https://github.com/jackhumbert) の Planck 用 TMK のフォークとして始まりました。しばらくして、Jack のフォークは TMK からかなり分岐し、2015年に Jack はフォークを QMK に名前を変えることにしました。
|
||||
|
||||
技術的な観点から、QMK は幾つかの新しい機能を追加した TMK に基づいています。最も注目すべきことは、QMK は利用可能なキーコードの数を増やし、`S()`、`LCTL()` および `MO()` などの高度な機能を実装するためにこれらを使っています。[キーコード](keycodes.md)でこれらのキーコードの完全なリストを見ることができます。
|
||||
|
||||
プロジェクトとコミュニティの管理の観点から、TMK は公式にサポートされている全てのキーボードを自分で管理しており、コミュニティのサポートも少し受けています。他のキーボード用に別個のコミュニティが維持するフォークが存在するか、作成できます。デフォルトでは少数のキーマップのみが提供されるため、ユーザは一般的にお互いにキーマップを共有しません。QMK は集中管理されたリポジトリを介して、キーボードとキーマップの両方を共有することを奨励しており、品質基準に準拠する全てのプルリクエストを受け付けます。これらはほとんどコミュニティで管理されますが、必要な場合は QMK チームも支援します。
|
||||
|
||||
どちらのアプローチもメリットとデメリットがあり、理に適う場合は TMK と QMK の間でコードは自由にやり取りされます。
|
||||
149
docs/ja/faq_keymap.md
Normal file
149
docs/ja/faq_keymap.md
Normal file
@@ -0,0 +1,149 @@
|
||||
# キーマップの FAQ
|
||||
|
||||
<!---
|
||||
original document: 376419a4f:docs/faq_keymap.md
|
||||
git diff 376419a4f HEAD docs/faq_keymap.md | cat
|
||||
-->
|
||||
|
||||
このページは人々がキーマップについてしばしば持つ疑問について説明します。まだ読んだことが無い場合には、[キーマップの概要](ja/keymap.md)を最初に読むべきです。
|
||||
|
||||
## どのキーコードを使えますか?
|
||||
あなたが利用可能なキーコードのインデックスについては、[キーコード](ja/keycodes.md)を見てください。より広範なドキュメントがある場合は、そこからリンクしてあります。
|
||||
|
||||
キーコードは実際には [common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h) で定義されています。
|
||||
|
||||
## デフォルトのキーコードとは何か?
|
||||
|
||||
世界中で使用されている ANSI、ISO および JIS の3つの標準キーボードがあります。北米では主に ANSI が使われ、ヨーロッパおよびアフリカでは主に ISO が使われ、日本では JIS が使われます。言及されていない地域では、ANSI あるいは ISO が使われています。これらのレイアウトに対応するキーコードは以下の通りです:
|
||||
|
||||
<!-- Source for this image: http://www.keyboard-layout-editor.com/#/gists/bf431647d1001cff5eff20ae55621e9a -->
|
||||

|
||||
|
||||
## 一部のキーが入れ替わっているか、または動作しない
|
||||
|
||||
QMK には2つの機能、ブートマジックとコマンドがあり、これによりその場でキーボードの動作を変更することができます。これには Ctrl/Caps の交換、Gui の無効化、Alt/GUI の交換、Backspace/Backslash の交換、全てのキーの無効化およびその他の動作の変更が含まれますが、これらに限定されません。
|
||||
|
||||
迅速な解決策として、キーボードを接続している時に `Space`+`Backspace` を押してみてください。これはキーボードに保存されている設定をリセットし、これらのキーを通常の操作に戻します。うまく行かない場合は、以下を見てください:
|
||||
|
||||
* [ブートマジック](ja/feature_bootmagic.md)
|
||||
* [コマンド](ja/feature_command.md)
|
||||
|
||||
## メニューキーが動作しない
|
||||
|
||||
ほとんどの最近のキーボードにある、`KC_RGUI` と `KC_RCTL` の間にあるキーは、実際には `KC_APP` と呼ばれます。これは、そのキーが発明された時に、関連する標準にすでに `MENU` という名前のキーが存在していたため、MS はそれを `APP` キーと呼ぶことを選択したためです。
|
||||
|
||||
## `KC_SYSREQ` が動作しません
|
||||
`KC_SYSREQ` の代わりに、Print Screen(`KC_PSCREEN` あるいは `KC_PSCR`) のキーコードを使ってください。'Alt + Print Screen' のキーの組み合わせは、'システムリクエスト' と認識されます。
|
||||
|
||||
[issue #168](https://github.com/tmk/tmk_keyboard/issues/168) と以下を見てください
|
||||
* http://en.wikipedia.org/wiki/Magic_SysRq_key
|
||||
* http://en.wikipedia.org/wiki/System_request
|
||||
|
||||
## 電源キーが動作しません
|
||||
|
||||
やや紛らわしいことに、QMK には2つの "Power" キーコードがあります: キーボード/キーパッド HID usage page では `KC_POWER`、Consumer page では `KC_SYSTEM_POWER` (あるいは `KC_PWR`)。
|
||||
|
||||
前者は macOS でのみ認識されますが、後者 `KC_SLEP` および `KC_WAKE` は3つの主要なオペレーティングシステム全てでサポートされるため、これらを使うことをお勧めします。Windows ではこれらのキーはすぐに機能しますが、macOS ではそれらはダイアログが表示されるまで押し続ける必要があります。
|
||||
|
||||
## ワンショットモディファイア
|
||||
私の個人的な 'the' の問題を解決します。'The' ではなく 'the' あるいは 'THe' を間違って入力することがありました。ワンショットシフトはこれを軽減します。
|
||||
https://github.com/tmk/tmk_keyboard/issues/67
|
||||
|
||||
## モディファイヤ/レイヤスタック
|
||||
修飾キーあるいはレイヤは、レイヤの切り替えが適切に設定されていない場合、スタックするかもしれません。
|
||||
修飾キーおよびレイヤ切り替えの場合、リリースイベント時に修飾キーの登録を解除する、もしくは前のレイヤに戻るために、目的のレイヤの同じ位置に `KC_TRANS` を配置する必要があります。
|
||||
|
||||
* https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#31-momentary-switching
|
||||
* http://geekhack.org/index.php?topic=57008.msg1492604#msg1492604
|
||||
* https://github.com/tmk/tmk_keyboard/issues/248
|
||||
|
||||
|
||||
## メカニカルロックスイッチのサポート
|
||||
|
||||
この機能は [Alps](http://deskthority.net/wiki/Alps_SKCL_Lock) のような*メカニカルロックスイッチ*用です。以下を `config.h` に追加することで有効にすることができます:
|
||||
|
||||
```
|
||||
#define LOCKING_SUPPORT_ENABLE
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
```
|
||||
|
||||
この機能を有効にした後で、キーマップでキーコード `KC_LCAP`、`KC_LNUM` および `KC_LSCR` を使います。
|
||||
|
||||
古いビンテージメカニカルキーボードにはロックスイッチが付いている場合がありますが、最新のものにはありません。***ほとんどの場合この機能は必要なく、単にキーコード `KC_CAPS`、`KC_NLCK` および `KC_SLCK`*** を使います。
|
||||
|
||||
## セディーユ 'Ç' のような ASCII 以外の特別文字の入力
|
||||
|
||||
[ユニコード](ja/feature_unicode.md) 機能を見てください。
|
||||
|
||||
## macOS での `Fn` キー
|
||||
|
||||
ほとんどの Fn キーと異なり、Apple のキーボードの Fn キーには実際には独自のキーコードのようなものがあります。基本的な 6KRO HID レポートの6番目のキーコードの代わりになります -- つまり、Apple キーボードは実際には 5KRO のみです。
|
||||
|
||||
QMK にこのキーを送信させることは技術的に可能です。ただし、そうするには Fn キーの状態を追加するためにレポート形式の修正を必要とします。
|
||||
さらに悪いことに、キーボードの VID と PID が実際の Apple のキーボードのものと一致しない限り、認識されません。公式の QMK がこの機能をサポートすることで法的な問題が起きるため、サポートされることはないでしょう。
|
||||
|
||||
詳細については、[この issue](https://github.com/qmk/qmk_firmware/issues/2179) を見てください。
|
||||
|
||||
## Mac OSX でサポートされるキーは?
|
||||
このソースコードから、どのキーコードが OSX でサポートされるかを知ることができます。
|
||||
|
||||
`usb_2_adb_keymap` 配列は、キーボード/キーパッドページの Page usages を ADB スキャンコード(OSX 内部キーコード)にマップします。
|
||||
|
||||
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/Cosmo_USB2ADB.c
|
||||
|
||||
`IOHIDConsumer::dispatchConsumerEvent` は Consumer page usages を処理します。
|
||||
|
||||
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/IOHIDConsumer.cpp
|
||||
|
||||
|
||||
## Mac OSX での JIS キー
|
||||
`無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` のような日本語 JIS キーボード固有のキーは OSX では認識されません。**Seil** を使ってこれらのキーを使うことができます。以下のオプションを試してください。
|
||||
|
||||
* PC キーボードで NFER キーを有効にする
|
||||
* PC キーボードで XFER キーを有効にする
|
||||
* PC キーボードで KATAKANA キーを有効にする
|
||||
|
||||
https://pqrs.org/osx/karabiner/seil.html
|
||||
|
||||
|
||||
## RN-42 Bluetooth が Karabiner で動作しない
|
||||
Karabiner - Mac OSX 上のキーマッピングツール - は、デフォルトでは RN-42 モジュールからの入力を無視します。Karabiner をキーボードで動作させるにはこのオプションを有効にする必要があります。
|
||||
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
|
||||
|
||||
この問題の詳細についてはこれらを見てください。
|
||||
https://github.com/tmk/tmk_keyboard/issues/213
|
||||
https://github.com/tekezo/Karabiner/issues/403
|
||||
|
||||
|
||||
## 単一のキーでの Esc と<code>`</code>
|
||||
|
||||
[Grave Escape](feature_grave_esc.md) 機能を見てください。
|
||||
|
||||
## Mac OSX での Eject
|
||||
`KC_EJCT` キーコードは OSX で動作します。https://github.com/tmk/tmk_keyboard/issues/250
|
||||
Windows 10 はコードを無視し、Linux/Xorg は認識しますが、デフォルトではマッピングがありません。
|
||||
|
||||
実際の Apple キーボードにある Eject キーコードは実際には分かりません。HHKB は Mac モードでは Eject キー (`Fn+f`) に `F20` を使いますが、これはおそらく Apple の Eject キーコードと同じではありません。
|
||||
|
||||
|
||||
## `action_util.c` の `weak_mods` と `real_mods` は何か
|
||||
___改善されるべきです___
|
||||
|
||||
real_mods は実際の物理的な修飾キーの状態を保持することを目的にしていますが、weak_mods は実際の修飾キーの状態に影響しない仮想あるいは一時的なモディファイアの状態を保持します。
|
||||
|
||||
物理的な左シフトキーを押しながら ACTION_MODS_KEY(LSHIFT, KC_A) を入力するとします
|
||||
|
||||
weak_mods では、
|
||||
* (1) 左シフトキーを押し続ける: real_mods |= MOD_BIT(LSHIFT)
|
||||
* (2) ACTION_MODS_KEY(LSHIFT, KC_A) を押す: weak_mods |= MOD_BIT(LSHIFT)
|
||||
* (3) ACTION_MODS_KEY(LSHIFT, KC_A) を放す: weak_mods &= ~MOD_BIT(LSHIFT)
|
||||
real_mods はモディファイアの状態を維持します。
|
||||
|
||||
weak mods 無しでは、
|
||||
* (1) 左シフトキーを押し続ける: real_mods |= MOD_BIT(LSHIFT)
|
||||
* (2) ACTION_MODS_KEY(LSHIFT, KC_A) を押す: real_mods |= MOD_BIT(LSHIFT)
|
||||
* (3) ACTION_MODS_KEY(LSHIFT, KC_A) を放す: real_mods &= ~MOD_BIT(LSHIFT)
|
||||
ここで、real_mods は 'physical left shift' '物理的な左シフト' の状態を見失います。
|
||||
|
||||
キーボードレポートが送信される時、weak_mods は real_mods と論理和がとられます。
|
||||
https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57
|
||||
@@ -21,17 +21,23 @@ Github は慣れていない人には少し注意が必要です - このガイ
|
||||
|
||||

|
||||
|
||||
ここから、`git clone` をコマンドラインに入力し、リンクを貼り付けます:
|
||||
ここから、`git clone --recurse-submodules ` をコマンドラインに入力し、リンクを貼り付けます:
|
||||
|
||||
```
|
||||
user@computer:~$ git clone --recurse-submodules https://github.com/whoeveryouare/qmk_firmware.git
|
||||
Cloning into 'qmk_firmware'...
|
||||
remote: Counting objects: 46625, done.
|
||||
remote: Compressing objects: 100% (2/2), done.
|
||||
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
|
||||
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
|
||||
Resolving deltas: 100% (29362/29362), done.
|
||||
Checking out files: 100% (2799/2799), done.
|
||||
remote: Enumerating objects: 9, done.
|
||||
remote: Counting objects: 100% (9/9), done.
|
||||
remote: Compressing objects: 100% (5/5), done.
|
||||
remote: Total 183883 (delta 5), reused 4 (delta 4), pack-reused 183874
|
||||
Receiving objects: 100% (183883/183883), 132.90 MiB | 9.57 MiB/s, done.
|
||||
Resolving deltas: 100% (119972/119972), done.
|
||||
...
|
||||
Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b'
|
||||
Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
|
||||
Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
|
||||
Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
|
||||
Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
|
||||
```
|
||||
|
||||
ローカルマシンに QMK のフォークができるので、キーマップの追加、コンパイル、キーボードへの書き込みができます。変更に満足したら、以下のようにそれらをフォークへ追加、コミットおよびプッシュすることができます:
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: ed0575fc8:docs/newbs.md
|
||||
git diff ed0575fc8 HEAD docs/newbs.md | cat
|
||||
original document: adf4acf59:docs/newbs.md
|
||||
git diff adf4acf59 HEAD docs/newbs.md | cat
|
||||
-->
|
||||
|
||||
QMK は、メカニカルキーボード用の強力なオープンソースファームウェアです。
|
||||
@@ -24,7 +24,7 @@ QMK は[多くの趣味のキーボード](http://qmk.fm/keyboards/)をサポー
|
||||
* [オンライン GUI を使用して初めてのファームウェアを構築する](ja/newbs_building_firmware_configurator.md)
|
||||
* [ファームウェアを書きこむ](ja/newbs_flashing.md)
|
||||
* [テストとデバッグ](ja/newbs_testing_debugging.md)
|
||||
* [QMK における Git 運用作法](ja/newbs_best_practices.md)
|
||||
* [QMK における Git 運用作法](ja/newbs_git_best_practices.md)
|
||||
* [さらに学ぶための学習リソース](ja/newbs_learn_more_resources.md)
|
||||
|
||||
このガイドは、これまでソフトウェアをコンパイルしたことがない人を支援することに特化しています。
|
||||
|
||||
@@ -1,263 +0,0 @@
|
||||
<!-- # Best Practices -->
|
||||
# QMK における Git 運用作法
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: e75919960:docs/newbs_best_practices.md
|
||||
git diff e75919960 HEAD docs/newbs_best_practices.md | cat
|
||||
-->
|
||||
|
||||
<!-- ## Or, "How I Learned to Stop Worrying and Love Git." -->
|
||||
## または、如何にして私は心配することをやめて Git を愛することを学んだか。
|
||||
|
||||
<!-- _Almost the same as #7231:25fdbf2a0:newbs_git_best_practices.md L5_ -->
|
||||
<!-- This document aims to instruct novices in the best ways to have a smooth experience in contributing to QMK. We will walk through the process of contributing to QMK, detailing some ways to make this task easier, and then later we'll break some things in order to teach you how to fix them. -->
|
||||
この文書は、QMK への貢献をスムーズに行なう最もよい方法を初心者に教えることを目的としています。
|
||||
QMK に貢献するプロセスを順を追って説明し、この作業を簡単にするいくつかの方法を詳しく説明します。
|
||||
その後、意図的に一部を壊してみせて、それらを修正する方法を教えます。
|
||||
|
||||
<!-- This document assumes a few things: -->
|
||||
このドキュメントは以下のことを前提としています:
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_best_practices.md L9_ -->
|
||||
<!-- 1. You have a GitHub account, and have [forked the qmk_firmware repository](getting_started_github.md) to your account. -->
|
||||
<!-- 2. You've [set up your build environment](newbs_getting_started.md?id=environment-setup). -->
|
||||
<!-- #7231:da7d49246: 2. You've set up both [your build environment](newbs_getting_started.md?id=set-up-your-environment) and [QMK](newbs_getting_started.md?id=set-up-qmk). -->
|
||||
|
||||
1. あなたは GitHub アカウントがあり、アカウントに [qmk_firmware リポジトリをフォーク](ja/getting_started_github.md) している。
|
||||
2. あなたは、[環境構築](ja/newbs_getting_started.md#set-up-your-environment) と [QMK の設定](ja/newbs_getting_started.md#set-up-qmk) を両方とも完了している。
|
||||
|
||||
<!-- ## Your fork's master: Update Often, Commit Never -->
|
||||
## あなたのフォークの master ブランチ: 更新は頻繁に、コミットはしないこと
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L3_ -->
|
||||
<!-- It is highly recommended for QMK development, regardless of what is being done or where, to keep your `master` branch updated, but ***never*** commit to it. Instead, do all your changes in a development branch and issue pull requests from your branches when you're developing. -->
|
||||
QMK の開発では、何がどこで行われているかにかかわらず、`master` ブランチを最新の状態に保つことを強くお勧めします、しかし `master` ブランチには***絶対に直接コミットしないでください***。
|
||||
代わりに、あなたのすべての変更は開発ブランチで行い、あなたが開発する時にはそのブランチからプルリクエストを発行します。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L5_ -->
|
||||
<!-- To reduce the chances of merge conflicts — instances where two or more users have edited the same part of a file concurrently — keep your `master` branch relatively up-to-date, and start any new developments by creating a new branch. -->
|
||||
マージの競合 — これは 2人以上のユーザーがファイルの同じ部分をそれぞれ異なる編集をして統合できなくなった状態 — の可能性を減らすため `master` ブランチをなるべく最新の状態に保ち、新しいブランチを作成して新しい開発を開始します。
|
||||
|
||||
<!-- ### Updating your master branch -->
|
||||
### あなたの master ブランチを更新する
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L9_ -->
|
||||
<!-- To keep your `master` branch updated, it is recommended to add the QMK Firmware repository ("repo") as a remote repository in git. To do this, open your Git command line interface and enter: -->
|
||||
`master` ブランチを最新の状態に保つには、git のリモートリポジトリとして QMK ファームウェアのリポジトリ(以降、QMK リポジトリ)を追加することをお勧めします。
|
||||
これを行うには、Git コマンドラインインターフェイスを開き、次のように入力します。
|
||||
|
||||
```
|
||||
git remote add upstream https://github.com/qmk/qmk_firmware.git
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L15_ -->
|
||||
<!-- To verify that the repository has been added, run `git remote -v`, which should return the following: -->
|
||||
リポジトリが追加されたことを確認するには、`git remote -v` を実行します。
|
||||
次のように表示されます。(訳注: `upstream` は`上流`という意味です。)
|
||||
|
||||
```
|
||||
$ git remote -v
|
||||
origin https://github.com/<your_username>/qmk_firmware.git (fetch)
|
||||
origin https://github.com/<your_username>/qmk_firmware.git (push)
|
||||
upstream https://github.com/qmk/qmk_firmware.git (fetch)
|
||||
upstream https://github.com/qmk/qmk_firmware.git (push)
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L25_ -->
|
||||
<!-- Now that this is done, you can check for updates to the repo by running `git fetch upstream`. This retrieves the branches and tags — collectively referred to as "refs" — from the QMK repo, which now has the nickname `upstream`. We can now compare the data on our fork `origin` to that held by QMK. -->
|
||||
これが完了すると、`git fetch upstream` を実行してリポジトリの更新を確認できます。
|
||||
このコマンドは `upstream` というニックネームを持つ QMK リポジトリから、ブランチとタグ — "refs" と総称されます — を取得します。
|
||||
これで、あなたのフォーク `origin` のデータを QMK が保持するデータと比較できます。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L27_ -->
|
||||
<!-- To update your fork's master, run the following, hitting the Enter key after each line: -->
|
||||
あなたのフォークの `master` を更新するには、次を実行します、各行の後にEnterキーを押してください:
|
||||
|
||||
```
|
||||
git checkout master
|
||||
git fetch upstream
|
||||
git pull upstream master
|
||||
git push origin master
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L36_ -->
|
||||
<!-- This switches you to your `master` branch, retrieves the refs from the QMK repo, downloads the current QMK `master` branch to your computer, and then uploads it to your fork. -->
|
||||
これにより、あなたの `master` ブランチに切り替わり、QMK リポジトリから 'refs' を取得し、現在の QMK の `master` ブランチをコンピュータにダウンロードしてから、あなたのフォークにアップロードします。
|
||||
|
||||
<!-- ### Making Changes -->
|
||||
### 変更を行なう
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L40_ -->
|
||||
<!-- To make changes, create a new branch by entering: -->
|
||||
変更するには、以下を入力して新しいブランチを作成します:
|
||||
|
||||
```
|
||||
git checkout -b dev_branch
|
||||
git push --set-upstream origin dev_branch
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L47_ -->
|
||||
<!-- This creates a new branch named `dev_branch`, checks it out, and then saves the new branch to your fork. The `--set-upstream` argument tells git to use your fork and the `dev_branch` branch every time you use `git push` or `git pull` from this branch. It only needs to be used on the first push; after that, you can safely use `git push` or `git pull`, without the rest of the arguments. -->
|
||||
これにより、`dev_branch` という名前の新しいブランチが作成され、チェックアウトされ、新しいブランチがあなたのフォークに保存されます。
|
||||
`--set-upstream` 引数は、このブランチから `git push` または `git pull` を使用するたびに、あなたのフォークと `dev_branch` ブランチを使用するように git に指示します。
|
||||
この引数は最初のプッシュでのみ使用する必要があります。
|
||||
その後、残りの引数なしで `git push` または `git pull` を安全に使用できます。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L49_ -->
|
||||
<!-- With `git push`, you can use `-u` in place of `--set-upstream` — `-u` is an alias for `--set-upstream`. -->
|
||||
!> `git push` では、`-set-upstream` の代わりに `-u` を使用できます、 `-u` は `--set-upstream` のエイリアスです。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L51_ -->
|
||||
<!-- You can name your branch nearly anything you want, though it is recommended to name it something related to the changes you are going to make. -->
|
||||
ブランチにはほぼ任意の名前を付けることができますが、あなたが行なう変更を表す名前を付けることをお勧めします。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L53_ -->
|
||||
<!-- By default `git checkout -b` will base your new branch on the branch that is checked out. You can base your new branch on an existing branch that is not checked out by adding the name of the existing branch to the command: -->
|
||||
デフォルトでは、`git checkout -b`は、今チェックアウトされているブランチに基づいて新しいブランチを作成します。
|
||||
コマンド末尾に既存のブランチの名前を追加指定することにより、チェックアウトされていない既存のブランチを基にして新しいブランチを作成できます:
|
||||
|
||||
```
|
||||
git checkout -b dev_branch master
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L59_ -->
|
||||
<!-- Now that you have a development branch, open your text editor and make whatever changes you need to make. It is recommended to make many small commits to your branch; that way, any change that causes issues can be more easily traced and undone if needed. To make your changes, edit and save any files that need to be updated, add them to Git's *staging area*, and then commit them to your branch: -->
|
||||
これで開発ブランチができたのでテキストエディタを開き必要な変更を加えます。
|
||||
ブランチに対して多くの小さなコミットを行うことをお勧めします。
|
||||
そうすることで、問題を引き起こす変更をより簡単に特定し必要に応じて元に戻すことができます。
|
||||
変更を加えるには、更新が必要なファイルを編集して保存し、Git の *ステージングエリア* に追加してから、ブランチにコミットします:
|
||||
|
||||
```
|
||||
git add path/to/updated_file
|
||||
git commit -m "My commit message."
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L66_ -->
|
||||
<!-- `git add` adds files that have been changed to Git's *staging area*, which is Git's "loading zone." This contains the changes that are going to be *committed* by `git commit`, which saves the changes to the repo. Use descriptive commit messages so you can know what was changed at a glance. -->
|
||||
`git add`は、変更されたファイルを Git の *ステージングエリア* に追加します。
|
||||
これは、Git の「ロードゾーン」です。
|
||||
これには、`git commit` によって *コミット* される変更が含まれており、リポジトリへの変更が保存されます。
|
||||
変更内容が一目でわかるように、説明的なコミットメッセージを使用します。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L68_ -->
|
||||
<!-- !> If you've changed a lot of files, but all the files are part of the same change, you can use `git add .` to add all the changed files that are in your current directory, rather than having to add each file individually. -->
|
||||
!> 多くのファイルを変更したが、すべてのファイルが同じ変更の一部である場合、各ファイルを個別に追加するのではなく、 `git add .` を使用して、現在のディレクトリにあるすべての変更されたファイルを追加できます。
|
||||
|
||||
<!-- ### Publishing Your Changes -->
|
||||
### 変更を公開する
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_using_your_master_branch.md L72_ -->
|
||||
<!-- The last step is to push your changes to your fork. To do this, enter `git push`. Git now publishes the current state of `dev_branch` to your fork. -->
|
||||
最後のステップは、変更をフォークにプッシュすることです。これを行うには、`git push`と入力します。
|
||||
Git は `dev_branch` の現在の状態をフォークに公開します。
|
||||
|
||||
<!-- ## Resolving Merge Conflicts -->
|
||||
## マージの競合の解決
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L3_ -->
|
||||
<!-- Sometimes when your work in a branch takes a long time to complete, changes that have been made by others conflict with changes you have made to your branch when you open a pull request. This is called a *merge conflict*, and is what happens when multiple people edit the same parts of the same files. -->
|
||||
ブランチでの作業の完了に時間がかかる場合、他の人が行った変更が、プルリクエストを開いたときにブランチに加えた変更と競合することがあります。
|
||||
これは *マージの競合* と呼ばれ、複数の人が同じファイルの同じ部分を編集すると発生します。
|
||||
|
||||
<!-- ### Rebasing Your Changes -->
|
||||
### 変更のリベース
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L9_ -->
|
||||
<!-- A *rebase* is Git's way of taking changes that were applied at one point, reversing them, and then applying the same changes to another point. In the case of a merge conflict, you can rebase your branch to grab the changes that were made between when you created your branch and the present time. -->
|
||||
*リベース* は、ある時点で適用された変更を取得し、それらを元に戻し、次に同じ変更を別のポイントに適用する Git の方法です。
|
||||
マージの競合が発生した場合、ブランチをリベースして、ブランチを作成してから現在までに行われた変更を取得できます。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L11_ -->
|
||||
<!-- To start, run the following: -->
|
||||
開始するには、次を実行します:
|
||||
|
||||
```
|
||||
git fetch upstream
|
||||
git rev-list --left-right --count HEAD...upstream/master
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L18_ -->
|
||||
<!-- The `git rev-list` command entered here returns the number of commits that differ between the current branch and QMK's master branch. We run `git fetch` first to make sure we have the refs that represent the current state of the upstream repo. The output of the `git rev-list` command entered returns two numbers: -->
|
||||
ここに入力された `git rev-list` コマンドは、現在のブランチと QMK の master ブランチで異なるコミットの数を返します。
|
||||
最初に `git fetch` を実行して、upstream リポジトリの現在の状態を表す refs があることを確認します。
|
||||
入力された `git rev-list` コマンドの出力は2つの数値を返します:
|
||||
|
||||
```
|
||||
$ git rev-list --left-right --count HEAD...upstream/master
|
||||
7 35
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L25_ -->
|
||||
<!-- The first number represents the number of commits on the current branch since it was created, and the second number is the number of commits made to `upstream/master` since the current branch was created, and thus, the changes that are not recorded in the current branch. -->
|
||||
最初の数字は、現在のブランチが作成されてからのコミット数を表し、2番目の数字は、現在のブランチが作成されてから `upstream/master` に対して行われたコミットの数であり、したがって、現在のブランチに記録されていない変更です。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L27_-->
|
||||
<!-- Now that the current states of both the current branch and the upstream repo are known, we can start a rebase operation: -->
|
||||
現在のブランチと upstream リポジトリの両方の現在の状態がわかったので、リベース操作を開始できます:
|
||||
|
||||
```
|
||||
git rebase upstream/master
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L33_ -->
|
||||
<!-- This tells Git to undo the commits on the current branch, and then reapply them against QMK's master branch. -->
|
||||
これにより、Git は現在のブランチのコミットを取り消してから、QMK の master ブランチに対してコミットを再適用します。
|
||||
|
||||
```
|
||||
$ git rebase upstream/master
|
||||
First, rewinding head to replay your work on top of it...
|
||||
Applying: Commit #1
|
||||
Using index info to reconstruct a base tree...
|
||||
M conflicting_file_1.txt
|
||||
Falling back to patching base and 3-way merge...
|
||||
Auto-merging conflicting_file_1.txt
|
||||
CONFLICT (content): Merge conflict in conflicting_file_1.txt
|
||||
error: Failed to merge in the changes.
|
||||
hint: Use 'git am --show-current-patch' to see the failed patch
|
||||
Patch failed at 0001 Commit #1
|
||||
|
||||
Resolve all conflicts manually, mark them as resolved with
|
||||
"git add/rm <conflicted_files>", then run "git rebase --continue".
|
||||
You can instead skip this commit: run "git rebase --skip".
|
||||
To abort and get back to the state before "git rebase", run "git rebase --abort".
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L54_ -->
|
||||
<!-- This tells us that we have a merge conflict, and gives the name of the file with the conflict. Open the conflicting file in your text editor, and somewhere in the file, you'll find something like this: -->
|
||||
これにより、マージの競合があることがわかり、競合のあるファイルの名前が示されます。
|
||||
テキストエディタで競合するファイルを開くと、ファイルのどこかに次のような行があります:
|
||||
|
||||
```
|
||||
<<<<<<< HEAD
|
||||
<p>For help with any issues, email us at support@webhost.us.</p>
|
||||
=======
|
||||
<p>Need help? Email support@webhost.us.</p>
|
||||
>>>>>>> Commit #1
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L64_ -->
|
||||
<!-- The line `<<<<<<< HEAD` marks the beginning of a merge conflict, and the `>>>>>>> Commit #1` line marks the end, with the conflicting sections separated by `=======`. The part on the `HEAD` side is from the QMK master version of the file, and the part marked with the commit message is from the current branch and commit. -->
|
||||
行 `<<<<<<< HEAD` はマージ競合の始まりを示し、行 `>>>>>>> commit #1` は終了を示し、競合するセクションは `=======` で区切られます。
|
||||
`HEAD` 側の部分はファイルの QMK master バージョンからのものであり、コミットメッセージでマークされた部分は現在のブランチとコミットからのものです。
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L66_ -->
|
||||
<!-- Because Git tracks *changes to files* rather than the contents of the files directly, if Git can't find the text that was in the file previous to the commit that was made, it won't know how to edit the file. Re-editing the file will solve the conflict. Make your changes, and then save the file. -->
|
||||
Git はファイルの内容ではなく *ファイルへの変更* を直接追跡するため、Git がコミットの前にファイル内にあったテキストを見つけられない場合、ファイルの編集方法がわかりません。
|
||||
ファイルを再編集して、競合を解決します。
|
||||
変更を加えてから、ファイルを保存します。
|
||||
|
||||
```
|
||||
<p>Need help? Email support@webhost.us.</p>
|
||||
```
|
||||
|
||||
そしてコマンド実行:
|
||||
|
||||
```
|
||||
git add conflicting_file_1.txt
|
||||
git rebase --continue
|
||||
```
|
||||
|
||||
<!-- _Same as #7231:25fdbf2a0:newbs_git_resolving_merge_conflicts.md L79_ -->
|
||||
<!-- Git logs the changes to the conflicting file, and continues applying the commits from our branch until it reaches the end. -->
|
||||
Git は、競合するファイルへの変更をログに記録し、ブランチのコミットが最後に達するまで適用し続けます。
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: ed0575fc8:docs/newbs_building_firmware.md
|
||||
git diff ed0575fc8 HEAD docs/newbs_building_firmware.md | cat
|
||||
original document: 0f43c2652:docs/newbs_building_firmware.md
|
||||
git diff 0f43c2652 HEAD -- docs/newbs_building_firmware.md | cat
|
||||
-->
|
||||
|
||||
ビルド環境をセットアップしたので、カスタムファームウェアのビルドを開始する準備ができました。
|
||||
@@ -56,7 +56,7 @@ macOS または Windows を使用している場合は、キーマップフォ
|
||||
|
||||
この行はレイヤーのリストの開始を表わしています。
|
||||
その下には、`LAYOUT` または `KEYMAP` のいずれかを含む行があり、これらの行はレイヤーの開始を表わしています。
|
||||
その行の下には、その特定のレイヤーを構成するキーのリストがあります。
|
||||
その行の下には、そのレイヤーを構成するキーのリストがあります。
|
||||
|
||||
!> キーマップファイルを編集するときは、カンマを追加したり削除したりしないように注意してください。そうするとファームウェアのコンパイルができなくなり、余分であったり欠落していたりするカンマがどこにあるのかを容易に把握できない場合があります。
|
||||
|
||||
|
||||
24
docs/ja/newbs_git_best_practices.md
Normal file
24
docs/ja/newbs_git_best_practices.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# QMK における Git 運用作法 :id=best-git-practices-for-working-with-qmk
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: adf4acf59:docs/newbs_git_best_practices.md
|
||||
git diff adf4acf59 HEAD docs/newbs_git_best_practices.md | cat
|
||||
-->
|
||||
|
||||
## または、"如何にして私は心配することをやめて Git を愛することを学んだか。"
|
||||
|
||||
このセクションは、QMK への貢献をスムーズに行なう最もよい方法を初心者に教えることを目的としています。
|
||||
QMK に貢献するプロセスを順を追って説明し、この作業を簡単にするいくつかの方法を詳しく説明します。
|
||||
その後、意図的に一部を壊してみせて、それらを修正する方法を説明します。
|
||||
|
||||
このセクションは以下のことを前提としています:
|
||||
|
||||
1. あなたは GitHub アカウントがあり、アカウントに [qmk_firmware リポジトリをフォーク](ja/getting_started_github.md) している。
|
||||
2. あなたは、[環境構築](ja/newbs_getting_started.md#set-up-your-environment) と [QMK の設定](ja/newbs_getting_started.md#set-up-qmk) を両方とも完了している。
|
||||
|
||||
---
|
||||
|
||||
- パート 1: [あなたのフォークの master ブランチ: 更新は頻繁に、コミットはしないこと](ja/newbs_git_using_your_master_branch.md)
|
||||
- パート 2: [マージの競合の解決](ja/newbs_git_resolving_merge_conflicts.md)
|
||||
- パート 3: [同期のとれていない git ブランチの再同期](ja/newbs_git_resynchronize_a_branch.md)
|
||||
94
docs/ja/newbs_git_resolving_merge_conflicts.md
Normal file
94
docs/ja/newbs_git_resolving_merge_conflicts.md
Normal file
@@ -0,0 +1,94 @@
|
||||
# マージの競合の解決
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: adf4acf59:docs/newbs_git_resolving_merge_conflicts.md
|
||||
git diff adf4acf59 HEAD docs/newbs_git_resolving_merge_conflicts.md | cat
|
||||
-->
|
||||
|
||||
ブランチでの作業の完了に時間がかかる場合、他の人が行った変更が、プルリクエストを開いたときにブランチに加えた変更と競合することがあります。
|
||||
これは *マージの競合* と呼ばれ、複数の人が同じファイルの同じ部分を編集すると発生します。
|
||||
|
||||
?> このドキュメントは [あなたのフォークの master ブランチ: 更新は頻繁に、コミットはしないこと](ja/newbs_git_using_your_master_branch.md) で詳述されている概念に基づいています。
|
||||
その概念に慣れていない場合は、まずそれを読んでから、ここに戻ってください。
|
||||
|
||||
## 変更のリベース
|
||||
|
||||
*リベース* は、コミット履歴のある時点で適用された変更を取得し、それらを元に戻し、次に同じ変更を別のポイントに適用する Git の方法です。
|
||||
マージの競合が発生した場合、ブランチをリベースして、ブランチを作成してから現在までに行われた変更を取得できます。
|
||||
|
||||
開始するには、次を実行します:
|
||||
|
||||
```
|
||||
git fetch upstream
|
||||
git rev-list --left-right --count HEAD...upstream/master
|
||||
```
|
||||
|
||||
ここに入力された `git rev-list` コマンドは、現在のブランチと QMK の master ブランチで異なるコミットの数を返します。
|
||||
最初に `git fetch` を実行して、upstream リポジトリの現在の状態を表す refs があることを確認します。
|
||||
入力された `git rev-list` コマンドの出力は2つの数値を返します:
|
||||
|
||||
```
|
||||
$ git rev-list --left-right --count HEAD...upstream/master
|
||||
7 35
|
||||
```
|
||||
|
||||
最初の数字は、現在のブランチが作成されてからのコミット数を表し、2番目の数字は、現在のブランチが作成されてから `upstream/master` に対して行われたコミットの数であり、したがって、現在のブランチに記録されていない変更です。
|
||||
|
||||
現在のブランチと upstream リポジトリの両方の現在の状態がわかったので、リベース操作を開始できます:
|
||||
|
||||
```
|
||||
git rebase upstream/master
|
||||
```
|
||||
|
||||
これにより、Git は現在のブランチのコミットを取り消してから、QMK の master ブランチに対してコミットを再適用します。
|
||||
|
||||
```
|
||||
$ git rebase upstream/master
|
||||
First, rewinding head to replay your work on top of it...
|
||||
Applying: Commit #1
|
||||
Using index info to reconstruct a base tree...
|
||||
M conflicting_file_1.txt
|
||||
Falling back to patching base and 3-way merge...
|
||||
Auto-merging conflicting_file_1.txt
|
||||
CONFLICT (content): Merge conflict in conflicting_file_1.txt
|
||||
error: Failed to merge in the changes.
|
||||
hint: Use 'git am --show-current-patch' to see the failed patch
|
||||
Patch failed at 0001 Commit #1
|
||||
|
||||
Resolve all conflicts manually, mark them as resolved with
|
||||
"git add/rm <conflicted_files>", then run "git rebase --continue".
|
||||
You can instead skip this commit: run "git rebase --skip".
|
||||
To abort and get back to the state before "git rebase", run "git rebase --abort".
|
||||
```
|
||||
|
||||
これにより、マージの競合があることがわかり、競合のあるファイルの名前が示されます。
|
||||
テキストエディタで競合するファイルを開くと、ファイルのどこかに次のような行があります:
|
||||
|
||||
```
|
||||
<<<<<<< HEAD
|
||||
<p>For help with any issues, email us at support@webhost.us.</p>
|
||||
=======
|
||||
<p>Need help? Email support@webhost.us.</p>
|
||||
>>>>>>> Commit #1
|
||||
```
|
||||
|
||||
行 `<<<<<<< HEAD` はマージ競合の始まりを示し、行 `>>>>>>> commit #1` は終了を示し、競合するセクションは `=======` で区切られます。
|
||||
`HEAD` 側の部分はファイルの QMK master バージョンからのものであり、コミットメッセージでマークされた部分は現在のブランチとコミットからのものです。
|
||||
|
||||
Git はファイルの内容ではなく *ファイルへの変更* を直接追跡するため、Git がコミットの前にファイル内にあったテキストを見つけられない場合、ファイルの編集方法がわかりません。
|
||||
ファイルを再編集して、競合を解決します。
|
||||
変更を加えてから、ファイルを保存します。
|
||||
|
||||
```
|
||||
<p>Need help? Email support@webhost.us.</p>
|
||||
```
|
||||
|
||||
そしてコマンド実行:
|
||||
|
||||
```
|
||||
git add conflicting_file_1.txt
|
||||
git rebase --continue
|
||||
```
|
||||
|
||||
Git は、競合するファイルへの変更をログに記録し、ブランチのコミットが最後に達するまで適用し続けます。
|
||||
88
docs/ja/newbs_git_resynchronize_a_branch.md
Normal file
88
docs/ja/newbs_git_resynchronize_a_branch.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# 同期のとれていない git ブランチの再同期
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: adf4acf59:docs/newbs_git_resynchronize_a_branch.md
|
||||
git diff adf4acf59 HEAD docs/newbs_git_resynchronize_a_branch.md | cat
|
||||
-->
|
||||
|
||||
仮にあなたの `master` ブランチにあなたのコミットを行い、そしてあなたの QMK リポジトリの更新が必要になったとします。
|
||||
(フォーク元の) QMKの `master` ブランチをあなたの `master` ブランチに `git pull` することもできますが、GitHub は、あなたのブランチが `qmk:master` より何コミットか先行していると通知します、この状態で QMK にプルリクエストを行う場合、問題が発生する可能性があります。
|
||||
(訳注:この通知は、GitHub のあなたのリポジトリの code ペインのブランチ選択メニューの下のあたりで `This branch is 3 commit ahead of qmk:master` という様な文面で表示されています。)
|
||||
|
||||
?> このドキュメントは [あなたのフォークの master ブランチ: 更新は頻繁に、コミットはしないこと](ja/newbs_git_using_your_master_branch.md) で詳述されている概念に基づいています。その概念に慣れていない場合は、まずそれを読んでから、ここに戻ってください。
|
||||
(訳注:この文書で言う、「同期のとれていない git ブランチ」とは、master ブランチに関する、この「コミットしない」方針を逸脱して、QMK の master リポジトリに存在しないコミットがあなたのフォークの master ブランチに入っている状態を指します。)
|
||||
|
||||
## あなた自身の `master` ブランチでの変更のバックアップ(オプション)
|
||||
|
||||
救えるものなら自分の行った変更を失いたくはないでしょう。
|
||||
あなたの `master` ブランチに既に加えた変更を保存したい場合、最も簡単な方法は、単に「ダーティな」`master` ブランチの複製を作成することです:
|
||||
|
||||
```sh
|
||||
git branch old_master master
|
||||
```
|
||||
|
||||
これで、 `master` ブランチの複製である `old_master` という名前のブランチができました。
|
||||
|
||||
## あなたのブランチの再同期
|
||||
|
||||
さあ、`master` ブランチを再同期します。
|
||||
この手順では、QMK のリポジトリを git のリモートリポジトリとして設定する必要があります。
|
||||
設定済みのリモートリポジトリを確認するには、`git remote -v` を実行し、次のような結果が返されなければなりません。
|
||||
|
||||
```sh
|
||||
QMKuser ~/qmk_firmware (master)
|
||||
$ git remote -v
|
||||
origin https://github.com/<your_username>/qmk_firmware.git (fetch)
|
||||
origin https://github.com/<your_username>/qmk_firmware.git (push)
|
||||
upstream https://github.com/qmk/qmk_firmware.git (fetch)
|
||||
upstream https://github.com/qmk/qmk_firmware.git (push)
|
||||
```
|
||||
|
||||
もし、上記のようにならずに以下のように参照されるフォークが、1つだけ表示される場合:
|
||||
|
||||
```sh
|
||||
QMKuser ~/qmk_firmware (master)
|
||||
$ git remote -v
|
||||
origin https://github.com/qmk/qmk_firmware.git (fetch)
|
||||
origin https://github.com/qmk/qmk_firmware.git (push)
|
||||
```
|
||||
|
||||
新しいリモートリポジトリを追加します:
|
||||
|
||||
```sh
|
||||
git remote add upstream https://github.com/qmk/qmk_firmware.git
|
||||
```
|
||||
|
||||
次に、`origin` リモートリポジトリを、あなた自身のフォークにリダイレクトします:
|
||||
|
||||
```sh
|
||||
git remote set-url origin https://github.com/<あなたのユーザ名>/qmk_firmware.git
|
||||
```
|
||||
|
||||
両方のリモートリポジトリが設定されたので、次を実行して、QMK である `upstream` リポジトリの参照を更新する必要があります。
|
||||
|
||||
```sh
|
||||
git fetch upstream
|
||||
```
|
||||
|
||||
この時点で、次を実行してあなたの(訳注:master)ブランチを QMK のブランチに再同期します。
|
||||
(訳注: 今現在 `master` ブランチがチェックアウトされていなければなりません。
|
||||
そうなってなければ、`git checkout master` を先に実行しておく必要があります。)
|
||||
|
||||
```sh
|
||||
git reset --hard upstream/master
|
||||
```
|
||||
|
||||
これらの手順により、あなたのコンピュータ上のリポジトリが更新されますが、あなたの GitHub 上のフォークはまだ同期されていません。
|
||||
GitHub 上のフォークを再同期するには、あなたのフォークにプッシュして、ローカルリポジトリに反映されていないリモート変更をオーバーライドするように Git に指示する必要があります。
|
||||
これを行うには、次を実行します:
|
||||
|
||||
```sh
|
||||
git push --force-with-lease
|
||||
```
|
||||
|
||||
!> 他のユーザーがコミットを投稿するフォークで `git push --force-with-lease` を**実行しないでください**。これをすると、かれらのコミットが消去されてしまいます。
|
||||
|
||||
これで、あなたの GitHub フォーク、あなたのローカルファイル、および QMK のリポジトリはすべて同じになりました。
|
||||
ここから、[ブランチを使って](ja/newbs_git_using_your_master_branch.md#making-changes)さらに必要な変更を加え、通常どおりそれらを投稿できます。
|
||||
101
docs/ja/newbs_git_using_your_master_branch.md
Normal file
101
docs/ja/newbs_git_using_your_master_branch.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# あなたのフォークの master ブランチ: 更新は頻繁に、コミットはしないこと
|
||||
|
||||
<!---
|
||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||
original document: adf4acf59:docs/newbs_git_using_your_master_branch.md
|
||||
git diff adf4acf59 HEAD docs/newbs_git_using_your_master_branch.md | cat
|
||||
-->
|
||||
|
||||
QMK の開発では、何がどこで行われているかにかかわらず、`master` ブランチを最新の状態に保つことを強くお勧めします、しかし `master` ブランチには***絶対に直接コミットしないでください***。
|
||||
代わりに、あなたのすべての変更は開発ブランチで行い、あなたが開発する時にはそのブランチからプルリクエストを発行します。
|
||||
|
||||
マージの競合 — これは 2人以上のユーザーがファイルの同じ部分をそれぞれ異なる編集をして統合できなくなった状態 — の可能性を減らすため `master` ブランチをなるべく最新の状態に保ち、新しいブランチを作成して新しい開発を開始します。
|
||||
|
||||
## あなたの master ブランチを更新する
|
||||
|
||||
`master` ブランチを最新の状態に保つには、git のリモートリポジトリとして QMK ファームウェアのリポジトリ(以降、QMK リポジトリ)を追加することをお勧めします。
|
||||
これを行うには、Git コマンドラインインターフェイスを開き、次のように入力します。
|
||||
|
||||
```
|
||||
git remote add upstream https://github.com/qmk/qmk_firmware.git
|
||||
```
|
||||
|
||||
?> `upstream`(訳注: `upstream` は`上流`という意味です)という名前は任意ですが、一般的な慣習です。
|
||||
QMK のリモートリポジトリには、あなたにとって分かりやすい名前を付けることができます。
|
||||
Git の `remote` コマンドは、構文 `git remote add <name> <url>` を使用します。
|
||||
`<name>` はリモートリポジトリの省略形としてあなたが指定するものです。
|
||||
この名前は、`fetch`、`pull`、`push` やそれ以外の多くの Git コマンドで、対象のリモートリポジトリを指定するために使用されます。
|
||||
|
||||
リポジトリが追加されたことを確認するには、`git remote -v` を実行します。
|
||||
次のように表示されます。
|
||||
|
||||
```
|
||||
$ git remote -v
|
||||
origin https://github.com/<your_username>/qmk_firmware.git (fetch)
|
||||
origin https://github.com/<your_username>/qmk_firmware.git (push)
|
||||
upstream https://github.com/qmk/qmk_firmware.git (fetch)
|
||||
upstream https://github.com/qmk/qmk_firmware.git (push)
|
||||
```
|
||||
|
||||
これが完了すると、`git fetch upstream` を実行してリポジトリの更新を確認できます。
|
||||
このコマンドは `upstream` というニックネームを持つ QMK リポジトリから、ブランチとタグ — "refs" と総称されます — を取得します。
|
||||
これで、あなたのフォーク `origin` のデータを QMK が保持するデータと比較できます。
|
||||
|
||||
あなたのフォークの `master` を更新するには、次を実行します、各行の後にEnterキーを押してください:
|
||||
|
||||
```
|
||||
git checkout master
|
||||
git fetch upstream
|
||||
git pull upstream master
|
||||
git push origin master
|
||||
```
|
||||
|
||||
これにより、あなたの `master` ブランチに切り替わり、QMK リポジトリから 'refs' を取得し、現在の QMK の `master` ブランチをコンピュータにダウンロードしてから、あなたのフォークにアップロードします。
|
||||
|
||||
## 変更を行なう :id=making-changes
|
||||
|
||||
変更するには、以下を入力して新しいブランチを作成します:
|
||||
|
||||
```
|
||||
git checkout -b dev_branch
|
||||
git push --set-upstream origin dev_branch
|
||||
```
|
||||
|
||||
これにより、`dev_branch` という名前の新しいブランチが作成され、チェックアウトされ、新しいブランチがあなたのフォークに保存されます。
|
||||
`--set-upstream` 引数は、このブランチから `git push` または `git pull` を使用するたびに、あなたのフォークと `dev_branch` ブランチを使用するように git に指示します。
|
||||
この引数は最初のプッシュでのみ使用する必要があります。
|
||||
その後、残りの引数なしで `git push` または `git pull` を安全に使用できます。
|
||||
|
||||
?> `git push` では、`-set-upstream` の代わりに `-u` を使用できます、 `-u` は `--set-upstream` のエイリアスです。
|
||||
|
||||
ブランチにはほぼ任意の名前を付けることができますが、あなたが行なう変更を表す名前を付けることをお勧めします。
|
||||
|
||||
デフォルトでは、`git checkout -b`は、今チェックアウトされているブランチに基づいて新しいブランチを作成します。
|
||||
コマンド末尾に既存のブランチの名前を追加指定することにより、チェックアウトされていない既存のブランチを基にして新しいブランチを作成できます:
|
||||
|
||||
```
|
||||
git checkout -b dev_branch master
|
||||
```
|
||||
|
||||
これで開発ブランチができたのでテキストエディタを開き必要な変更を加えます。
|
||||
ブランチに対して多くの小さなコミットを行うことをお勧めします。
|
||||
そうすることで、問題を引き起こす変更をより簡単に特定し必要に応じて元に戻すことができます。
|
||||
変更を加えるには、更新が必要なファイルを編集して保存し、Git の *ステージングエリア* に追加してから、ブランチにコミットします:
|
||||
|
||||
```
|
||||
git add path/to/updated_file
|
||||
git commit -m "My commit message."
|
||||
```
|
||||
|
||||
`git add`は、変更されたファイルを Git の *ステージングエリア* に追加します。
|
||||
これは、Git の「ロードゾーン」です。
|
||||
これには、`git commit` によって *コミット* される変更が含まれており、リポジトリへの変更が保存されます。
|
||||
変更内容が一目でわかるように、説明的なコミットメッセージを使用します。
|
||||
|
||||
?> 複数のファイルを変更した場合、`git add -- path/to/file1 path/to/file2 ...` を実行すれば、あなたの望むファイルを追加できます。
|
||||
|
||||
## 変更を公開する
|
||||
|
||||
最後のステップは、変更をフォークにプッシュすることです。
|
||||
これを行うには、`git push`と入力します。
|
||||
Gitは、 `dev_branch`の現在の状態をフォークに公開します。
|
||||
@@ -14,13 +14,17 @@
|
||||
|
||||
* [Great General Tutorial](https://www.codecademy.com/learn/learn-git)
|
||||
* [Git Game To Learn From Examples](https://learngitbranching.js.org/)
|
||||
* [Git Resources to Learn More About Github](ja/getting_started_github.md)
|
||||
* [Git Resources Aimed Specifically toward QMK](ja/contributing.md)
|
||||
* [Git Resources to Learn More About Github](getting_started_github.md)
|
||||
* [Git Resources Aimed Specifically toward QMK](contributing.md)
|
||||
|
||||
### 日本語
|
||||
|
||||
_日本語のリソース情報を募集中です。_
|
||||
|
||||
* [Git Game To Learn From Examples(日本語対応有り)](https://learngitbranching.js.org/)
|
||||
* [QMK で Github を使う方法](ja/getting_started_github.md)
|
||||
* [貢献方法](ja/contributing.md)
|
||||
|
||||
## コマンドラインに関するリソース:
|
||||
|
||||
### 英語
|
||||
|
||||
@@ -42,7 +42,7 @@ Open up your `keymap.c`. Inside this file you'll find the structure that control
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
This line indicates the start of the list of Layers. Below that you'll find lines containing either `LAYOUT` or `KEYMAP`, and these lines indicate the start of a layer. Below that line is the list of keys that comprise a that particular layer.
|
||||
This line indicates the start of the list of Layers. Below that you'll find lines containing either `LAYOUT` or `KEYMAP`, and these lines indicate the start of a layer. Below that line is the list of keys that comprise a particular layer.
|
||||
|
||||
!> When editing your keymap file be careful not to add or remove any commas. If you do you will prevent your firmware from compiling and it may not be easy to figure out where the extra, or missing, comma is.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Resynchronizing an Out-of-Sync Git Branch
|
||||
|
||||
Suppose you have committed to your `master` branch, and now need to update your QMK repository. You could `git pull` QMK's `master` branch into your own, but GitHub will tell you that your commit is a number of commits ahead of `qmk:master`, which can create issues if you want to make a pull request to QMK.
|
||||
Suppose you have committed to your `master` branch, and now need to update your QMK repository. You could `git pull` QMK's `master` branch into your own, but GitHub will tell you that your branch is a number of commits ahead of `qmk:master`, which can create issues if you want to make a pull request to QMK.
|
||||
|
||||
?> This document builds upon the concepts detailed in [Your Fork's Master: Update Often, Commit Never](newbs_git_using_your_master_branch.md). If you are not familiar with that document, please read it first, then return here.
|
||||
|
||||
|
||||
@@ -15,17 +15,23 @@ GitHub может показаться несколько сложным для
|
||||
|
||||

|
||||
|
||||
Теперь введите `git clone` в командную строку, а затем вставьте ссылку:
|
||||
Теперь введите `git clone --recurse-submodules ` в командную строку, а затем вставьте ссылку:
|
||||
|
||||
```
|
||||
user@computer:~$ git clone https://github.com/whoeveryouare/qmk_firmware.git
|
||||
user@computer:~$ git clone --recurse-submodules https://github.com/whoeveryouare/qmk_firmware.git
|
||||
Cloning into 'qmk_firmware'...
|
||||
remote: Counting objects: 46625, done.
|
||||
remote: Compressing objects: 100% (2/2), done.
|
||||
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
|
||||
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
|
||||
Resolving deltas: 100% (29362/29362), done.
|
||||
Checking out files: 100% (2799/2799), done.
|
||||
remote: Enumerating objects: 9, done.
|
||||
remote: Counting objects: 100% (9/9), done.
|
||||
remote: Compressing objects: 100% (5/5), done.
|
||||
remote: Total 183883 (delta 5), reused 4 (delta 4), pack-reused 183874
|
||||
Receiving objects: 100% (183883/183883), 132.90 MiB | 9.57 MiB/s, done.
|
||||
Resolving deltas: 100% (119972/119972), done.
|
||||
...
|
||||
Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b'
|
||||
Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
|
||||
Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
|
||||
Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
|
||||
Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
|
||||
```
|
||||
|
||||
Теперь у вас есть форк QMK на вашем локальном компьютере, и вы можете добавить свою раскладку, скомпилировать ее и прошить ей свою клавиатуру. Как только вы будете довольны своими изменениями, есть возможность добавить, зафиксировать их и сделать коммит в свой форк следующим образом:
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Базовая структура QMK
|
||||
|
||||
QMK - это форк [Джуна Вако (Jun Wako)](https://github.com/tmk) проекта [tmk_keyboard](https://github.com/tmk/tmk_keyboard). Оригинальный код TMK с изменениями можно найти в папке `tmk`. Дополнения QMK к проекту можно найти в папке `quantum`. Проекты клавиатур можно найти в папках `handwired` и `keyboard`.
|
||||
QMK - это форк [Джуна Вако (Jun Wako)](https://github.com/tmk) проекта [tmk_keyboard](https://github.com/tmk/tmk_keyboard). Оригинальный код TMK с изменениями можно найти в папке `tmk_core`. Дополнения QMK к проекту можно найти в папке `quantum`. Проекты клавиатур можно найти в папках `handwired` и `keyboard`.
|
||||
|
||||
### Структура пространства пользователя
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ These LEDs are called "addressable" because instead of using a wire per color, e
|
||||
|----------|--------------------|--------------------|
|
||||
| bit bang | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| I2C | :heavy_check_mark: | |
|
||||
| SPI | | Soon™ |
|
||||
| SPI | | :heavy_check_mark: |
|
||||
| PWM | | Soon™ |
|
||||
|
||||
## Driver configuration
|
||||
@@ -40,3 +40,30 @@ Configure the hardware via your config.h:
|
||||
#define WS2812_ADDRESS 0xb0 // default: 0xb0
|
||||
#define WS2812_TIMEOUT 100 // default: 100
|
||||
```
|
||||
|
||||
### SPI
|
||||
Targeting STM32 boards where WS2812 support is offloaded to an SPI hardware device. The advantage is that the use of DMA offloads processing of the WS2812 protocol from the MCU. `RGB_DI_PIN` for this driver is the configured SPI MOSI pin. Due to the nature of repurposing SPI to drive the LEDs, the other SPI pins, MISO and SCK, **must** remain unused. To configure it, add this to your rules.mk:
|
||||
|
||||
```make
|
||||
WS2812_DRIVER = spi
|
||||
```
|
||||
|
||||
Configure the hardware via your config.h:
|
||||
```c
|
||||
#define WS2812_SPI SPID1 // default: SPID1
|
||||
#define WS2812_SPI_MOSI_PAL_MODE 5 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 5
|
||||
```
|
||||
|
||||
You must also turn on the SPI feature in your halconf.h and mcuconf.h
|
||||
|
||||
#### Testing Notes
|
||||
|
||||
While not an exhaustive list, the following table provides the scenarios that have been partially validated:
|
||||
|
||||
| | SPI1 | SPI2 | SPI3 |
|
||||
|-|-|-|-|
|
||||
| f072 | ? | B15 :heavy_check_mark: | N/A |
|
||||
| f103 | A7 :heavy_check_mark: | B15 :heavy_check_mark: | N/A |
|
||||
| f303 | A7 :heavy_check_mark: B5 :heavy_check_mark: | B15 :heavy_check_mark: | B5 :heavy_check_mark: |
|
||||
|
||||
*Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.*
|
||||
@@ -1,31 +1,31 @@
|
||||
# 如何定制你键盘的功能
|
||||
# 如何定制你键盘的功能
|
||||
|
||||
对于很多人来说客制化键盘可不只是向你的电脑发送你按了那个件这么简单。你肯定想实现比简单按键和宏更复杂的功能。QMK有能让你注入代码的钩子, 覆盖功能, 另外,还可以自定义键盘在不同情况下的行为。
|
||||
对于很多人来说客制化键盘可不只是向你的电脑发送你按了那个件这么简单。你肯定想实现比简单按键和宏更复杂的功能。QMK有能让你注入代码的钩子, 覆盖功能, 另外,还可以自定义键盘在不同情况下的行为。
|
||||
|
||||
本页不假定任何特殊的QMK知识,但阅读[理解QMK](understanding_qmk.md)将会在更基础的层面帮你理解发生了什么。
|
||||
本页不假定任何特殊的QMK知识,但阅读[理解QMK](understanding_qmk.md)将会在更基础的层面帮你理解发生了什么。
|
||||
|
||||
## A Word on Core vs 键盘 vs 布局
|
||||
## A Word on Core vs 键盘 vs 布局
|
||||
|
||||
我们把qmk组织成一个层次结构:
|
||||
我们把qmk组织成一个层次结构:
|
||||
|
||||
* Core (`_quantum`)
|
||||
* Keyboard/Revision (`_kb`)
|
||||
* Keymap (`_user`)
|
||||
|
||||
下面描述的每一个函数都可以在定义上加一个`_kb()`或 `_user()` 后缀。 建议在键盘/修订层使用`_kb()`后缀,在布局层使用`_user()`后缀。
|
||||
下面描述的每一个函数都可以在定义上加一个`_kb()`或 `_user()` 后缀。 建议在键盘/修订层使用`_kb()`后缀,在布局层使用`_user()`后缀。
|
||||
|
||||
在键盘/修订层定义函数时,`_kb()`在执行任何代码前先调用`_user()`是必要的,不然布局层函数就不要被调用。
|
||||
<!-- 翻译问题:上面那句翻译的不太好-->
|
||||
# 自定义键码
|
||||
在键盘/修订层定义函数时,`_kb()`在执行任何代码前先调用`_user()`是必要的,不然布局层函数就不要被调用。
|
||||
<!-- 翻译问题:上面那句翻译的不太好-->
|
||||
# 自定义键码
|
||||
|
||||
到目前为止,最常见的任务是更改现有键码的行为或创建新的键码。从代码角度来看这些操作都很相似。
|
||||
到目前为止,最常见的任务是更改现有键码的行为或创建新的键码。从代码角度来看这些操作都很相似。
|
||||
|
||||
## 定义一个新键码
|
||||
## 定义一个新键码
|
||||
|
||||
创建键码第一步,先枚举出它全部,也就是给键码起个名字并分配唯一数值。QMK没有直接限制最大键码值大小,而是提供了一个`SAFE_RANGE`宏。你可以在枚举时用`SAFE_RANGE`来保证你取得了唯一的键码值。
|
||||
创建键码第一步,先枚举出它全部,也就是给键码起个名字并分配唯一数值。QMK没有直接限制最大键码值大小,而是提供了一个`SAFE_RANGE`宏。你可以在枚举时用`SAFE_RANGE`来保证你取得了唯一的键码值。
|
||||
|
||||
|
||||
这有枚举两个键码的例子。把这块加到`keymap.c`的话你就在布局中能用`FOO`和`BAR`了。
|
||||
这有枚举两个键码的例子。把这块加到`keymap.c`的话你就在布局中能用`FOO`和`BAR`了。
|
||||
|
||||
```c
|
||||
enum my_keycodes {
|
||||
@@ -34,46 +34,46 @@ enum my_keycodes {
|
||||
};
|
||||
```
|
||||
|
||||
## 为键码的行为编程
|
||||
## 为键码的行为编程
|
||||
|
||||
当你覆盖一个已存在按键的行为时,或将这个行为赋给新键时,你要用`process_record_kb()`和`process_record_user()`函数。这俩函数在键处理中真实键事件被处理前被QMK调用。如果这俩函数返回`true`,QMK将会用正常的方式处理键码。这样可以很方便的扩展键码的功能而不是替换它。如果函数返回`false` QMK会跳过正常键处理,然后发送键子抬起还是按下事件就由你决定了。
|
||||
当你覆盖一个已存在按键的行为时,或将这个行为赋给新键时,你要用`process_record_kb()`和`process_record_user()`函数。这俩函数在键处理中真实键事件被处理前被QMK调用。如果这俩函数返回`true`,QMK将会用正常的方式处理键码。这样可以很方便的扩展键码的功能而不是替换它。如果函数返回`false` QMK会跳过正常键处理,然后发送键子抬起还是按下事件就由你决定了。
|
||||
|
||||
当某个键按下或释放时这俩函数会被调用。
|
||||
当某个键按下或释放时这俩函数会被调用。
|
||||
|
||||
### process_record_user()`函数示例实现
|
||||
### process_record_user()`函数示例实现
|
||||
|
||||
这个例子做了两个事。自定义了一个叫做`FOO`的键码的行为,并补充了在按下回车时播放音符。
|
||||
这个例子做了两个事。自定义了一个叫做`FOO`的键码的行为,并补充了在按下回车时播放音符。
|
||||
|
||||
```c
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case FOO:
|
||||
if (record->event.pressed) {
|
||||
// 按下时做些什么
|
||||
// 按下时做些什么
|
||||
} else {
|
||||
// 释放时做些什么
|
||||
// 释放时做些什么
|
||||
}
|
||||
return false; // 跳过此键的所有进一步处理
|
||||
return false; // 跳过此键的所有进一步处理
|
||||
case KC_ENTER:
|
||||
// 当按下回车时播放音符
|
||||
// 当按下回车时播放音符
|
||||
if (record->event.pressed) {
|
||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
||||
}
|
||||
return true; // 让QMK触发回车按下/释放事件
|
||||
return true; // 让QMK触发回车按下/释放事件
|
||||
default:
|
||||
return true; // 正常处理其他键码
|
||||
return true; // 正常处理其他键码
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### `process_record_*` 函数文档
|
||||
### `process_record_*` 函数文档
|
||||
|
||||
* 键盘/修订: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
|
||||
* 布局: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
|
||||
* 键盘/修订: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
|
||||
* 布局: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
|
||||
|
||||
`keycode(键码)`参数是在布局上定义的,比如`MO(1)`, `KC_L`, 等等。 你要用 `switch...case` 块来处理这些事件。
|
||||
`keycode(键码)`参数是在布局上定义的,比如`MO(1)`, `KC_L`, 等等。 你要用 `switch...case` 块来处理这些事件。
|
||||
|
||||
`record`参数含有实际按键的信息:
|
||||
`record`参数含有实际按键的信息:
|
||||
|
||||
```c
|
||||
keyrecord_t record {
|
||||
@@ -88,9 +88,9 @@ keyrecord_t record {
|
||||
}
|
||||
```
|
||||
|
||||
# LED控制
|
||||
# LED控制
|
||||
|
||||
qmk提供了读取HID规范包含的5个LED的方法。:
|
||||
qmk提供了读取HID规范包含的5个LED的方法。:
|
||||
|
||||
* `USB_LED_NUM_LOCK`
|
||||
* `USB_LED_CAPS_LOCK`
|
||||
@@ -98,20 +98,20 @@ qmk
|
||||
* `USB_LED_COMPOSE`
|
||||
* `USB_LED_KANA`
|
||||
|
||||
这五个常量对应于主机LED状态的位置位。
|
||||
有两种方法可以获得主机LED状态:
|
||||
这五个常量对应于主机LED状态的位置位。
|
||||
有两种方法可以获得主机LED状态:
|
||||
|
||||
* 通过执行 `led_set_user()`
|
||||
* 通过调用 `host_keyboard_leds()`
|
||||
* 通过执行 `led_set_user()`
|
||||
* 通过调用 `host_keyboard_leds()`
|
||||
|
||||
## `led_set_user()`
|
||||
|
||||
当5个LED中任何一个的状态需要改变时,此函数将被调用。此函数通过参数输入LED参数。
|
||||
使用`IS_LED_ON(usb_led, led_name)`和`IS_LED_OFF(usb_led, led_name)`这两个宏来检查LED状态。
|
||||
当5个LED中任何一个的状态需要改变时,此函数将被调用。此函数通过参数输入LED参数。
|
||||
使用`IS_LED_ON(usb_led, led_name)`和`IS_LED_OFF(usb_led, led_name)`这两个宏来检查LED状态。
|
||||
|
||||
!> `host_keyboard_leds()`可能会在`led_set_user()`被调用前返回新值。
|
||||
!> `host_keyboard_leds()`可能会在`led_set_user()`被调用前返回新值。
|
||||
|
||||
### `led_set_user()`函数示例实现
|
||||
### `led_set_user()`函数示例实现
|
||||
|
||||
```c
|
||||
void led_set_user(uint8_t usb_led) {
|
||||
@@ -143,59 +143,59 @@ void led_set_user(uint8_t usb_led) {
|
||||
}
|
||||
```
|
||||
|
||||
### `led_set_*`函数文档
|
||||
### `led_set_*`函数文档
|
||||
|
||||
* 键盘/修订: `void led_set_kb(uint8_t usb_led)`
|
||||
* 布局: `void led_set_user(uint8_t usb_led)`
|
||||
* 键盘/修订: `void led_set_kb(uint8_t usb_led)`
|
||||
* 布局: `void led_set_user(uint8_t usb_led)`
|
||||
|
||||
## `host_keyboard_leds()`
|
||||
|
||||
调用这个函数会返回最后收到的LED状态。这个函数在`led_set_*`之外读取LED状态时很有用,比如在[`matrix_scan_user()`](#矩阵扫描代码).
|
||||
为了便捷,你可以用`IS_HOST_LED_ON(led_name)`和`IS_HOST_LED_OFF(led_name)` 宏,而不直接调用和检查`host_keyboard_leds()`。
|
||||
调用这个函数会返回最后收到的LED状态。这个函数在`led_set_*`之外读取LED状态时很有用,比如在[`matrix_scan_user()`](#矩阵扫描代码).
|
||||
为了便捷,你可以用`IS_HOST_LED_ON(led_name)`和`IS_HOST_LED_OFF(led_name)` 宏,而不直接调用和检查`host_keyboard_leds()`。
|
||||
|
||||
## 设置物理LED状态
|
||||
## 设置物理LED状态
|
||||
|
||||
一些键盘实现了为设置物理LED的状态提供了方便的方法。
|
||||
一些键盘实现了为设置物理LED的状态提供了方便的方法。
|
||||
|
||||
### Ergodox Boards
|
||||
|
||||
Ergodox实现了提供`ergodox_right_led_1`/`2`/`3_on`/`off()`来让每个LED开或关, 也可以用 `ergodox_right_led_on`/`off(uint8_t led)` 按索引打开或关闭他们。
|
||||
Ergodox实现了提供`ergodox_right_led_1`/`2`/`3_on`/`off()`来让每个LED开或关, 也可以用 `ergodox_right_led_on`/`off(uint8_t led)` 按索引打开或关闭他们。
|
||||
|
||||
此外,还可以使用`ergodox_led_all_set(uint8_t n)`指定所有LED的亮度级别;针对每个LED用`ergodox_right_led_1`/`2`/`3_set(uint8_t n)`;使用索引的话用`ergodox_right_led_set(uint8_t led, uint8_t n)`。
|
||||
此外,还可以使用`ergodox_led_all_set(uint8_t n)`指定所有LED的亮度级别;针对每个LED用`ergodox_right_led_1`/`2`/`3_set(uint8_t n)`;使用索引的话用`ergodox_right_led_set(uint8_t led, uint8_t n)`。
|
||||
|
||||
Ergodox boards 同时定义了最低亮度级别`LED_BRIGHTNESS_LO`和最高亮度级别`LED_BRIGHTNESS_HI`(默认最高).
|
||||
Ergodox boards 同时定义了最低亮度级别`LED_BRIGHTNESS_LO`和最高亮度级别`LED_BRIGHTNESS_HI`(默认最高).
|
||||
|
||||
# 键盘初始化代码
|
||||
# 键盘初始化代码
|
||||
|
||||
键盘初始化过程有几个步骤。你是用那个函数取决于你想要做什么。
|
||||
键盘初始化过程有几个步骤。你是用那个函数取决于你想要做什么。
|
||||
|
||||
有三个主要初始化函数,按调用顺序列出。
|
||||
有三个主要初始化函数,按调用顺序列出。
|
||||
|
||||
* `keyboard_pre_init_*` - 会在大多数其他东西运行前运行。适用于哪些需要提前运行的硬件初始化。
|
||||
* `matrix_init_*` - 在固件启动过程中间被调用。此时硬件已初始化,功能尚未初始化。
|
||||
* `keyboard_post_init_*` - 在固件启动过程最后被调用。大多数情况下,你的“客制化”代码都可以放在这里。
|
||||
* `keyboard_pre_init_*` - 会在大多数其他东西运行前运行。适用于哪些需要提前运行的硬件初始化。
|
||||
* `matrix_init_*` - 在固件启动过程中间被调用。此时硬件已初始化,功能尚未初始化。
|
||||
* `keyboard_post_init_*` - 在固件启动过程最后被调用。大多数情况下,你的“客制化”代码都可以放在这里。
|
||||
|
||||
!> 对于大多数人来说`keyboard_post_init_user`是你想要调用的函数。例如, 此时你可以设置RGB灯发光。
|
||||
!> 对于大多数人来说`keyboard_post_init_user`是你想要调用的函数。例如, 此时你可以设置RGB灯发光。
|
||||
|
||||
## 键盘预初始化代码
|
||||
## 键盘预初始化代码
|
||||
|
||||
这代码极早运行,甚至都在USB初始化前运行。
|
||||
这代码极早运行,甚至都在USB初始化前运行。
|
||||
|
||||
在这之后不久矩阵就被初始化了。
|
||||
在这之后不久矩阵就被初始化了。
|
||||
|
||||
对于大多数用户来说,这用不到,因为它主要是用于面向硬件的初始化。
|
||||
对于大多数用户来说,这用不到,因为它主要是用于面向硬件的初始化。
|
||||
|
||||
但如果你有硬件初始化的话放在这里再好不过了(比如初始化LED引脚一类的).
|
||||
但如果你有硬件初始化的话放在这里再好不过了(比如初始化LED引脚一类的).
|
||||
|
||||
### `keyboard_pre_init_user()`函数示例实现
|
||||
### `keyboard_pre_init_user()`函数示例实现
|
||||
|
||||
本例中在键盘级别,设定 B0, B1, B2, B3, 和 B4 是LED引脚。
|
||||
本例中在键盘级别,设定 B0, B1, B2, B3, 和 B4 是LED引脚。
|
||||
|
||||
```c
|
||||
void keyboard_pre_init_user(void) {
|
||||
// 调用键盘预初始化代码
|
||||
// 调用键盘预初始化代码
|
||||
|
||||
// 设置LED引脚为输出模式
|
||||
// 设置LED引脚为输出模式
|
||||
setPinOutput(B0);
|
||||
setPinOutput(B1);
|
||||
setPinOutput(B2);
|
||||
@@ -204,73 +204,73 @@ void keyboard_pre_init_user(void) {
|
||||
}
|
||||
```
|
||||
|
||||
### `keyboard_pre_init_*` 函数文档
|
||||
### `keyboard_pre_init_*` 函数文档
|
||||
|
||||
* 键盘/修订: `void keyboard_pre_init_kb(void)`
|
||||
* 布局: `void keyboard_pre_init_user(void)`
|
||||
* 键盘/修订: `void keyboard_pre_init_kb(void)`
|
||||
* 布局: `void keyboard_pre_init_user(void)`
|
||||
|
||||
## 矩阵初始化代码
|
||||
## 矩阵初始化代码
|
||||
|
||||
这将会在矩阵初始化时被调用,在某些硬件设置好后,但在一些功能被初始化前。
|
||||
这将会在矩阵初始化时被调用,在某些硬件设置好后,但在一些功能被初始化前。
|
||||
|
||||
这在你设置其他地方会用到的东西的时候会很有用,但与硬件无关,也不依赖于它的启动位置。
|
||||
这在你设置其他地方会用到的东西的时候会很有用,但与硬件无关,也不依赖于它的启动位置。
|
||||
|
||||
|
||||
### `matrix_init_*`函数文档
|
||||
### `matrix_init_*`函数文档
|
||||
|
||||
* 键盘/修订: `void matrix_init_kb(void)`
|
||||
* 布局: `void matrix_init_user(void)`
|
||||
* 键盘/修订: `void matrix_init_kb(void)`
|
||||
* 布局: `void matrix_init_user(void)`
|
||||
|
||||
|
||||
## 键盘后初始化代码
|
||||
## 键盘后初始化代码
|
||||
|
||||
这是键盘初始化过程中的最后一个任务。如果您想更改某些特性,这会很有用,因为此时应该对它们进行初始化。
|
||||
这是键盘初始化过程中的最后一个任务。如果您想更改某些特性,这会很有用,因为此时应该对它们进行初始化。
|
||||
|
||||
|
||||
### `keyboard_post_init_user()`示例实现
|
||||
### `keyboard_post_init_user()`示例实现
|
||||
|
||||
本示例在所有初始化完成后运行,配置RGB灯。
|
||||
本示例在所有初始化完成后运行,配置RGB灯。
|
||||
|
||||
```c
|
||||
void keyboard_post_init_user(void) {
|
||||
// 调用后初始化代码
|
||||
rgblight_enable_noeeprom(); // 使能Rgb,不保存设置
|
||||
rgblight_sethsv_noeeprom(180, 255, 255); // 将颜色设置到蓝绿色(青色)不保存
|
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 设置快速呼吸模式不保存
|
||||
// 调用后初始化代码
|
||||
rgblight_enable_noeeprom(); // 使能Rgb,不保存设置
|
||||
rgblight_sethsv_noeeprom(180, 255, 255); // 将颜色设置到蓝绿色(青色)不保存
|
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 设置快速呼吸模式不保存
|
||||
}
|
||||
```
|
||||
|
||||
### `keyboard_post_init_*` 函数文档
|
||||
### `keyboard_post_init_*` 函数文档
|
||||
|
||||
* 键盘/修订: `void keyboard_post_init_kb(void)`
|
||||
* 布局: `void keyboard_post_init_user(void)`
|
||||
* 键盘/修订: `void keyboard_post_init_kb(void)`
|
||||
* 布局: `void keyboard_post_init_user(void)`
|
||||
|
||||
# 矩阵扫描代码
|
||||
# 矩阵扫描代码
|
||||
|
||||
可能的话你要用`process_record_*()`自定义键盘,以这种方式连接到事件中,以确保代码不会对键盘产生负面的性能影响。然而,在极少数情况下,有必要进行矩阵扫描。在这些函数中要特别注意代码的性能,因为它每秒至少被调用10次。
|
||||
可能的话你要用`process_record_*()`自定义键盘,以这种方式连接到事件中,以确保代码不会对键盘产生负面的性能影响。然而,在极少数情况下,有必要进行矩阵扫描。在这些函数中要特别注意代码的性能,因为它每秒至少被调用10次。
|
||||
|
||||
### `matrix_scan_*`示例实现
|
||||
### `matrix_scan_*`示例实现
|
||||
|
||||
这个例子被故意省略了。在hook这样一个对性能及其敏感的区域之前,您应该足够了解qmk的内部结构,以便在没有示例的情况下编写。如果你需要帮助,请[建立一个issue](https://github.com/qmk/qmk_firmware/issues/new)或[在Discord上与我们交流](https://discord.gg/Uq7gcHh).
|
||||
这个例子被故意省略了。在hook这样一个对性能及其敏感的区域之前,您应该足够了解qmk的内部结构,以便在没有示例的情况下编写。如果你需要帮助,请[建立一个issue](https://github.com/qmk/qmk_firmware/issues/new)或[在Discord上与我们交流](https://discord.gg/Uq7gcHh).
|
||||
|
||||
### `matrix_scan_*` 函数文档
|
||||
### `matrix_scan_*` 函数文档
|
||||
|
||||
* 键盘/修订: `void matrix_scan_kb(void)`
|
||||
* 布局: `void matrix_scan_user(void)`
|
||||
* 键盘/修订: `void matrix_scan_kb(void)`
|
||||
* 布局: `void matrix_scan_user(void)`
|
||||
|
||||
该函数在每次矩阵扫描时被调用,这基本与MCU处理能力上限相同。在这里写代码要谨慎,因为它会运行很多次。
|
||||
该函数在每次矩阵扫描时被调用,这基本与MCU处理能力上限相同。在这里写代码要谨慎,因为它会运行很多次。
|
||||
|
||||
你会在自定义矩阵扫描代码时用到这个函数。这也可以用作自定义状态输出(比如LED灯或者屏幕)或者其他即便用户不输入你也想定期运行的功能。
|
||||
你会在自定义矩阵扫描代码时用到这个函数。这也可以用作自定义状态输出(比如LED灯或者屏幕)或者其他即便用户不输入你也想定期运行的功能。
|
||||
|
||||
|
||||
# 键盘 空闲/唤醒 代码
|
||||
# 键盘 空闲/唤醒 代码
|
||||
|
||||
如果键盘支持就可以通过停止一大票功能来达到"空闲"。RGB灯和背光就是很好的例子。这可以节约能耗,也可能让你键盘风味更佳。
|
||||
如果键盘支持就可以通过停止一大票功能来达到"空闲"。RGB灯和背光就是很好的例子。这可以节约能耗,也可能让你键盘风味更佳。
|
||||
|
||||
用两个函数控制: `suspend_power_down_*`和`suspend_wakeup_init_*`, 分别在系统板空闲和唤醒时调用。
|
||||
用两个函数控制: `suspend_power_down_*`和`suspend_wakeup_init_*`, 分别在系统板空闲和唤醒时调用。
|
||||
|
||||
|
||||
### suspend_power_down_user()和suspend_wakeup_init_user()示例实现
|
||||
### suspend_power_down_user()和suspend_wakeup_init_user()示例实现
|
||||
|
||||
|
||||
```c
|
||||
@@ -283,18 +283,18 @@ void suspend_wakeup_init_user(void) {
|
||||
}
|
||||
```
|
||||
|
||||
### 键盘 挂起/唤醒 函数文档
|
||||
### 键盘 挂起/唤醒 函数文档
|
||||
|
||||
* 键盘/修订: `void suspend_power_down_kb(void)` 和`void suspend_wakeup_init_user(void)`
|
||||
* 布局: `void suspend_power_down_kb(void)` 和 `void suspend_wakeup_init_user(void)`
|
||||
* 键盘/修订: `void suspend_power_down_kb(void)` 和`void suspend_wakeup_init_user(void)`
|
||||
* 布局: `void suspend_power_down_kb(void)` 和 `void suspend_wakeup_init_user(void)`
|
||||
|
||||
# 层改变代码
|
||||
# 层改变代码
|
||||
|
||||
每当层改变这个就运行代码。这对于层指示或自定义层处理很有用。
|
||||
每当层改变这个就运行代码。这对于层指示或自定义层处理很有用。
|
||||
|
||||
### `layer_state_set_*` 示例实现
|
||||
### `layer_state_set_*` 示例实现
|
||||
|
||||
本例使用了Planck键盘示范了如何设置 [RGB背光灯](feature_rgblight.md)使之与层对应
|
||||
本例使用了Planck键盘示范了如何设置 [RGB背光灯](feature_rgblight.md)使之与层对应
|
||||
|
||||
```c
|
||||
uint32_t layer_state_set_user(uint32_t state) {
|
||||
@@ -318,31 +318,31 @@ uint32_t layer_state_set_user(uint32_t state) {
|
||||
return state;
|
||||
}
|
||||
```
|
||||
### `layer_state_set_*` 函数文档
|
||||
### `layer_state_set_*` 函数文档
|
||||
|
||||
* 键盘/修订: `uint32_t layer_state_set_kb(uint32_t state)`
|
||||
* 布局: `uint32_t layer_state_set_user(uint32_t state)`
|
||||
* 键盘/修订: `uint32_t layer_state_set_kb(uint32_t state)`
|
||||
* 布局: `uint32_t layer_state_set_user(uint32_t state)`
|
||||
|
||||
|
||||
该`状态`是活动层的bitmask, 详见[布局概述](keymap.md#布局的层状态)
|
||||
该`状态`是活动层的bitmask, 详见[布局概述](keymap.md#布局的层状态)
|
||||
|
||||
|
||||
# 掉电保存配置 (EEPROM)
|
||||
# 掉电保存配置 (EEPROM)
|
||||
|
||||
这会让你的配置长期的保存在键盘中。这些配置保存在你主控的EEPROM里,掉电不会消失。 设置可以用`eeconfig_read_kb`和`eeconfig_read_user`读取,可以用`eeconfig_update_kb`和`eeconfig_update_user`写入。这对于您希望能够切换的功能很有用(比如切换RGB层指示。此外,你可以用`eeconfig_init_kb`和`eeconfig_init_user`来设置EEPROM默认值。
|
||||
这会让你的配置长期的保存在键盘中。这些配置保存在你主控的EEPROM里,掉电不会消失。 设置可以用`eeconfig_read_kb`和`eeconfig_read_user`读取,可以用`eeconfig_update_kb`和`eeconfig_update_user`写入。这对于您希望能够切换的功能很有用(比如切换RGB层指示。此外,你可以用`eeconfig_init_kb`和`eeconfig_init_user`来设置EEPROM默认值。
|
||||
|
||||
最复杂的部分可能是,有很多方法可以通过EEPROM存储和访问数据,并且并没有用哪种方法是“政治正确”的。你每个功能只有一个双字(四字节)空间。
|
||||
最复杂的部分可能是,有很多方法可以通过EEPROM存储和访问数据,并且并没有用哪种方法是“政治正确”的。你每个功能只有一个双字(四字节)空间。
|
||||
|
||||
记住EEPROM是有写入寿命的。尽管写入寿命很高,但是并不是只有设置写道EEPROM中。如果你写入频繁,你的MCU寿命将会变短。
|
||||
记住EEPROM是有写入寿命的。尽管写入寿命很高,但是并不是只有设置写道EEPROM中。如果你写入频繁,你的MCU寿命将会变短。
|
||||
|
||||
* 如果您不理解这个例子,那么您可能希望避免使用这个特性,因为它相当复杂。
|
||||
* 如果您不理解这个例子,那么您可能希望避免使用这个特性,因为它相当复杂。
|
||||
|
||||
### 示例实现
|
||||
### 示例实现
|
||||
|
||||
本例讲解了如何添加设置,并且读写。本里使用了用户布局。这是一个复杂的函数,有很多事情要做。实际上,它使用了很多上述函数来工作!
|
||||
本例讲解了如何添加设置,并且读写。本里使用了用户布局。这是一个复杂的函数,有很多事情要做。实际上,它使用了很多上述函数来工作!
|
||||
|
||||
|
||||
在你的keymap.c文件中,将以下代码添加至顶部:
|
||||
在你的keymap.c文件中,将以下代码添加至顶部:
|
||||
```c
|
||||
typedef union {
|
||||
uint32_t raw;
|
||||
@@ -354,19 +354,19 @@ typedef union {
|
||||
user_config_t user_config;
|
||||
```
|
||||
|
||||
以上代码建立了一个结构体,该结构体可以存储设置并可用于写入EEPROM。如此这般将无需定义变量,因为在结构体中已然定义。要记住`bool` (布尔)值使用1位, `uint8_t`使用8位, `uint16_t`使用16位。你可以混合搭配使用,但是顺序记错可能会招致麻烦,因为那会改变写入写出的值。
|
||||
以上代码建立了一个结构体,该结构体可以存储设置并可用于写入EEPROM。如此这般将无需定义变量,因为在结构体中已然定义。要记住`bool` (布尔)值使用1位, `uint8_t`使用8位, `uint16_t`使用16位。你可以混合搭配使用,但是顺序记错可能会招致麻烦,因为那会改变写入写出的值。
|
||||
|
||||
`layer_state_set_*`函数中使用了`rgb_layer_change`,使用了`keyboard_post_init_user`和`process_record_user`来配置一切。
|
||||
`layer_state_set_*`函数中使用了`rgb_layer_change`,使用了`keyboard_post_init_user`和`process_record_user`来配置一切。
|
||||
|
||||
首先要使用`keyboard_post_init_user,你要加入`eeconfig_read_user()`来填充你刚刚创建的结构体。然后您可以立即使用这个结构来控制您的布局中的功能。就像这样:
|
||||
首先要使用`keyboard_post_init_user,你要加入`eeconfig_read_user()`来填充你刚刚创建的结构体。然后您可以立即使用这个结构来控制您的布局中的功能。就像这样:
|
||||
```c
|
||||
void keyboard_post_init_user(void) {
|
||||
// 调用布局级别的矩阵初始化
|
||||
// 调用布局级别的矩阵初始化
|
||||
|
||||
// 从EEPROM读用户配置
|
||||
// 从EEPROM读用户配置
|
||||
user_config.raw = eeconfig_read_user();
|
||||
|
||||
// 如使能,设置默认层
|
||||
// 如使能,设置默认层
|
||||
if (user_config.rgb_layer_change) {
|
||||
rgblight_enable_noeeprom();
|
||||
rgblight_sethsv_noeeprom_cyan();
|
||||
@@ -374,7 +374,7 @@ void keyboard_post_init_user(void) {
|
||||
}
|
||||
}
|
||||
```
|
||||
以上函数会在读EEPROM配置后立即使用该设置来设置默认层RGB颜色。"raw"的值是从你上面基于"union"创建的结构体中转换来的。
|
||||
以上函数会在读EEPROM配置后立即使用该设置来设置默认层RGB颜色。"raw"的值是从你上面基于"union"创建的结构体中转换来的。
|
||||
|
||||
```c
|
||||
uint32_t layer_state_set_user(uint32_t state) {
|
||||
@@ -391,86 +391,86 @@ uint32_t layer_state_set_user(uint32_t state) {
|
||||
case _ADJUST:
|
||||
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
|
||||
break;
|
||||
default: // 针对其他层或默认层
|
||||
default: // 针对其他层或默认层
|
||||
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
|
||||
break;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
```
|
||||
这样仅在值使能时会改变RGB背光灯。现在配置这个值, 为`process_record_user`创建一个新键码叫做`RGB_LYR`。我们要确保,如果使用正常的RGB代码,使用上面的示例将其关闭,请将其设置为:
|
||||
这样仅在值使能时会改变RGB背光灯。现在配置这个值, 为`process_record_user`创建一个新键码叫做`RGB_LYR`。我们要确保,如果使用正常的RGB代码,使用上面的示例将其关闭,请将其设置为:
|
||||
```c
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case FOO:
|
||||
if (record->event.pressed) {
|
||||
// 按下时做点什么
|
||||
// 按下时做点什么
|
||||
} else {
|
||||
// 释放时做点什么
|
||||
// 释放时做点什么
|
||||
}
|
||||
return false; // 跳过此键的进一步处理
|
||||
return false; // 跳过此键的进一步处理
|
||||
case KC_ENTER:
|
||||
// 在按下回车时播放音符
|
||||
// 在按下回车时播放音符
|
||||
if (record->event.pressed) {
|
||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
||||
}
|
||||
return true; // 让QMK产生回车按下/释放事件
|
||||
case RGB_LYR: // 本句让underglow作为层指示,或正常使用。
|
||||
return true; // 让QMK产生回车按下/释放事件
|
||||
case RGB_LYR: // 本句让underglow作为层指示,或正常使用。
|
||||
if (record->event.pressed) {
|
||||
user_config.rgb_layer_change ^= 1; // 切换状态
|
||||
eeconfig_update_user(user_config.raw); // 向EEPROM写入新状态
|
||||
if (user_config.rgb_layer_change) { // 如果层状态被使能
|
||||
layer_state_set(layer_state); // 那么立刻更新层颜色
|
||||
user_config.rgb_layer_change ^= 1; // 切换状态
|
||||
eeconfig_update_user(user_config.raw); // 向EEPROM写入新状态
|
||||
if (user_config.rgb_layer_change) { // 如果层状态被使能
|
||||
layer_state_set(layer_state); // 那么立刻更新层颜色
|
||||
}
|
||||
}
|
||||
return false; break;
|
||||
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 对于所有的RGB代码 (see quantum_keycodes.h, L400 可以参考)
|
||||
if (record->event.pressed) { //本句失能层指示,假设你改变了这个…你要把它禁用
|
||||
if (user_config.rgb_layer_change) { // 仅当使能时
|
||||
user_config.rgb_layer_change = false; // 失能,然后
|
||||
eeconfig_update_user(user_config.raw); // 向EEPROM写入设置
|
||||
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 对于所有的RGB代码 (see quantum_keycodes.h, L400 可以参考)
|
||||
if (record->event.pressed) { //本句失能层指示,假设你改变了这个…你要把它禁用
|
||||
if (user_config.rgb_layer_change) { // 仅当使能时
|
||||
user_config.rgb_layer_change = false; // 失能,然后
|
||||
eeconfig_update_user(user_config.raw); // 向EEPROM写入设置
|
||||
}
|
||||
}
|
||||
return true; break;
|
||||
default:
|
||||
return true; // 按其他键正常
|
||||
return true; // 按其他键正常
|
||||
}
|
||||
}
|
||||
```
|
||||
最后你要加入`eeconfig_init_user`函数,所以当EEPROM重置时,可以指定默认值, 甚至自定义操作。想强制重置EEPROM,请用`EEP_RST`键码或[Bootmagic](feature_bootmagic.md)函数。比如,如果要在默认情况下设置RGB层指示,并保存默认值
|
||||
最后你要加入`eeconfig_init_user`函数,所以当EEPROM重置时,可以指定默认值, 甚至自定义操作。想强制重置EEPROM,请用`EEP_RST`键码或[Bootmagic](feature_bootmagic.md)函数。比如,如果要在默认情况下设置RGB层指示,并保存默认值
|
||||
|
||||
```c
|
||||
void eeconfig_init_user(void) { // EEPROM正被重置
|
||||
void eeconfig_init_user(void) { // EEPROM正被重置
|
||||
user_config.raw = 0;
|
||||
user_config.rgb_layer_change = true; // 我们想要默认使能
|
||||
eeconfig_update_user(user_config.raw); // 向EEPROM写入默认值
|
||||
user_config.rgb_layer_change = true; // 我们想要默认使能
|
||||
eeconfig_update_user(user_config.raw); // 向EEPROM写入默认值
|
||||
|
||||
// use the non noeeprom versions, 还要向EEPROM写入这些值
|
||||
rgblight_enable(); // 默认使能RGB
|
||||
rgblight_sethsv_cyan(); // 默认设置青色
|
||||
rgblight_mode(1); // 默认设置长亮
|
||||
// use the non noeeprom versions, 还要向EEPROM写入这些值
|
||||
rgblight_enable(); // 默认使能RGB
|
||||
rgblight_sethsv_cyan(); // 默认设置青色
|
||||
rgblight_mode(1); // 默认设置长亮
|
||||
}
|
||||
```
|
||||
|
||||
然后就完事了。RGB层指示会在你想让它工作时工作。这个设置会一直保存,即便你拔下键盘。如果你使用其他RGB代码,层指示将失能,现在它可以做你所想了。
|
||||
然后就完事了。RGB层指示会在你想让它工作时工作。这个设置会一直保存,即便你拔下键盘。如果你使用其他RGB代码,层指示将失能,现在它可以做你所想了。
|
||||
|
||||
### 'EECONFIG' 函数文档
|
||||
### 'EECONFIG' 函数文档
|
||||
|
||||
* 键盘/修订: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)`和`void eeconfig_update_kb(uint32_t val)`
|
||||
* 布局: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)`和`void eeconfig_update_user(uint32_t val)`
|
||||
* 键盘/修订: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)`和`void eeconfig_update_kb(uint32_t val)`
|
||||
* 布局: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)`和`void eeconfig_update_user(uint32_t val)`
|
||||
|
||||
`val` 是你想写入EEPROM的值,`eeconfig_read_*`函数会从EEPROM返回一个32位(双字)的值。
|
||||
`val` 是你想写入EEPROM的值,`eeconfig_read_*`函数会从EEPROM返回一个32位(双字)的值。
|
||||
|
||||
# 自定义击键-长按临界值(TAPPING_TERM)
|
||||
默认情况下,击键-长按临界值是全球统一的,并且不能通过键进行配置。对于大多数用户来说这很好。但是在有些情况下,对于`LT`键来说按键延时对双功能键的提升更大,可能是因为有些键比其他的键更容易按住。为了不给每个都自定义键码,本功能可以为每个键定义`TAPPING_TERM`。
|
||||
# 自定义击键-长按临界值(TAPPING_TERM)
|
||||
默认情况下,击键-长按临界值是全球统一的,并且不能通过键进行配置。对于大多数用户来说这很好。但是在有些情况下,对于`LT`键来说按键延时对双功能键的提升更大,可能是因为有些键比其他的键更容易按住。为了不给每个都自定义键码,本功能可以为每个键定义`TAPPING_TERM`。
|
||||
|
||||
想使能这个功能的话, 要先在`config.h`加上`#define TAPPING_TERM_PER_KEY`。
|
||||
想使能这个功能的话, 要先在`config.h`加上`#define TAPPING_TERM_PER_KEY`。
|
||||
|
||||
|
||||
## `get_tapping_term`示例实现
|
||||
## `get_tapping_term`示例实现
|
||||
|
||||
想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加如下代码:
|
||||
想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加如下代码:
|
||||
|
||||
```c
|
||||
uint16_t get_tapping_term(uint16_t keycode) {
|
||||
@@ -485,6 +485,6 @@ uint16_t get_tapping_term(uint16_t keycode) {
|
||||
}
|
||||
```
|
||||
|
||||
### `get_tapping_term` 函数文档
|
||||
### `get_tapping_term` 函数文档
|
||||
|
||||
不像这篇的其他功能,这个不需要quantum或者键盘级别的函数,只要用户级函数即可。
|
||||
不像这篇的其他功能,这个不需要quantum或者键盘级别的函数,只要用户级函数即可。
|
||||
|
||||
@@ -16,17 +16,23 @@ Github can be a little tricky to those that aren't familiar with it - this guide
|
||||
|
||||

|
||||
|
||||
然后,在命令行输入`git clone `,然后粘贴你的链接:
|
||||
然后,在命令行输入`git clone --recurse-submodules `,然后粘贴你的链接:
|
||||
|
||||
```
|
||||
user@computer:~$ git clone https://github.com/whoeveryouare/qmk_firmware.git
|
||||
user@computer:~$ git clone --recurse-submodules https://github.com/whoeveryouare/qmk_firmware.git
|
||||
Cloning into 'qmk_firmware'...
|
||||
remote: Counting objects: 46625, done.
|
||||
remote: Compressing objects: 100% (2/2), done.
|
||||
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
|
||||
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
|
||||
Resolving deltas: 100% (29362/29362), done.
|
||||
Checking out files: 100% (2799/2799), done.
|
||||
remote: Enumerating objects: 9, done.
|
||||
remote: Counting objects: 100% (9/9), done.
|
||||
remote: Compressing objects: 100% (5/5), done.
|
||||
remote: Total 183883 (delta 5), reused 4 (delta 4), pack-reused 183874
|
||||
Receiving objects: 100% (183883/183883), 132.90 MiB | 9.57 MiB/s, done.
|
||||
Resolving deltas: 100% (119972/119972), done.
|
||||
...
|
||||
Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b'
|
||||
Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
|
||||
Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
|
||||
Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
|
||||
Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
|
||||
```
|
||||
|
||||
现在你本地计算机有QMK的分叉了,你可以添加你的布局了, 为你的键盘编译并刷新固件吧。如果你觉得你的修改很不错, 你可以添加,提交,然后想你的分叉推出(pull)你的改变,像这样:
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## 基本QMK结构
|
||||
|
||||
QMK是[Jun Wako](https://github.com/tmk)的[tmk_keyboard](https://github.com/tmk/tmk_keyboard)工程的一个分叉。经过更改的TMK原始代码放在`tmk` 文件夹中。 QMK增加的新东西可以在 `quantum` 文件夹中找到。 键盘项目可以在 `handwired`(手动飞线) 和 `keyboard`(PCB键盘)这两个文件夹找到。
|
||||
QMK是[Jun Wako](https://github.com/tmk)的[tmk_keyboard](https://github.com/tmk/tmk_keyboard)工程的一个分叉。经过更改的TMK原始代码放在`tmk_core` 文件夹中。 QMK增加的新东西可以在 `quantum` 文件夹中找到。 键盘项目可以在 `handwired`(手动飞线) 和 `keyboard`(PCB键盘)这两个文件夹找到。
|
||||
|
||||
### 用户空间结构
|
||||
|
||||
|
||||
@@ -24,9 +24,8 @@
|
||||
* STM32_I2C_USE_I2C1 is TRUE in the mcuconf.h file. Pins B6 and B7 are used
|
||||
* but using any other I2C pins should be trivial.
|
||||
*/
|
||||
|
||||
#include "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
#include "i2c_master.h"
|
||||
#include <string.h>
|
||||
#include <hal.h>
|
||||
|
||||
|
||||
@@ -27,10 +27,6 @@
|
||||
#include "ch.h"
|
||||
#include <hal.h>
|
||||
|
||||
#if defined(STM32F1XX) || defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32F4XX) || defined(STM32L0xx) || defined(STM32L1xx)
|
||||
# define USE_I2CV1
|
||||
#endif
|
||||
|
||||
#ifdef I2C1_BANK
|
||||
# define I2C1_SCL_BANK I2C1_BANK
|
||||
# define I2C1_SDA_BANK I2C1_BANK
|
||||
@@ -51,20 +47,6 @@
|
||||
# define I2C1_SDA 7
|
||||
#endif
|
||||
|
||||
#if defined(STM32F1XX) || defined(STM32F1xx)
|
||||
# define USE_GPIOV1
|
||||
#endif
|
||||
|
||||
#ifndef USE_GPIOV1
|
||||
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
||||
# ifndef I2C1_SCL_PAL_MODE
|
||||
# define I2C1_SCL_PAL_MODE 4
|
||||
# endif
|
||||
# ifndef I2C1_SDA_PAL_MODE
|
||||
# define I2C1_SDA_PAL_MODE 4
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_I2CV1
|
||||
# ifndef I2C1_OPMODE
|
||||
# define I2C1_OPMODE OPMODE_I2C
|
||||
@@ -99,6 +81,16 @@
|
||||
# define I2C_DRIVER I2CD1
|
||||
#endif
|
||||
|
||||
#ifndef USE_GPIOV1
|
||||
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
||||
# ifndef I2C1_SCL_PAL_MODE
|
||||
# define I2C1_SCL_PAL_MODE 4
|
||||
# endif
|
||||
# ifndef I2C1_SDA_PAL_MODE
|
||||
# define I2C1_SDA_PAL_MODE 4
|
||||
# endif
|
||||
#endif
|
||||
|
||||
typedef int16_t i2c_status_t;
|
||||
|
||||
#define I2C_STATUS_SUCCESS (0)
|
||||
@@ -109,7 +101,6 @@ void i2c_init(void);
|
||||
i2c_status_t i2c_start(uint8_t address);
|
||||
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout);
|
||||
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||
i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t* tx_body, uint16_t tx_length, uint8_t* rx_body, uint16_t rx_length);
|
||||
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout);
|
||||
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||
void i2c_stop(void);
|
||||
|
||||
@@ -1 +1,90 @@
|
||||
#error("NOT SUPPORTED")
|
||||
#include "quantum.h"
|
||||
#include "ws2812.h"
|
||||
|
||||
/* Adapted from https://github.com/gamazeps/ws2812b-chibios-SPIDMA/ */
|
||||
|
||||
#ifdef RGBW
|
||||
# error "RGBW not supported"
|
||||
#endif
|
||||
|
||||
// Define the spi your LEDs are plugged to here
|
||||
#ifndef WS2812_SPI
|
||||
# define WS2812_SPI SPID1
|
||||
#endif
|
||||
|
||||
#ifndef WS2812_SPI_MOSI_PAL_MODE
|
||||
# define WS2812_SPI_MOSI_PAL_MODE 5
|
||||
#endif
|
||||
|
||||
#define BYTES_FOR_LED_BYTE 4
|
||||
#define NB_COLORS 3
|
||||
#define BYTES_FOR_LED (BYTES_FOR_LED_BYTE * NB_COLORS)
|
||||
#define DATA_SIZE (BYTES_FOR_LED * RGBLED_NUM)
|
||||
#define RESET_SIZE 200
|
||||
#define PREAMBLE_SIZE 4
|
||||
|
||||
static uint8_t txbuf[PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE] = {0};
|
||||
|
||||
/*
|
||||
* As the trick here is to use the SPI to send a huge pattern of 0 and 1 to
|
||||
* the ws2812b protocol, we use this helper function to translate bytes into
|
||||
* 0s and 1s for the LED (with the appropriate timing).
|
||||
*/
|
||||
static uint8_t get_protocol_eq(uint8_t data, int pos) {
|
||||
uint8_t eq = 0;
|
||||
if (data & (1 << (2 * (3 - pos))))
|
||||
eq = 0b1110;
|
||||
else
|
||||
eq = 0b1000;
|
||||
if (data & (2 << (2 * (3 - pos))))
|
||||
eq += 0b11100000;
|
||||
else
|
||||
eq += 0b10000000;
|
||||
return eq;
|
||||
}
|
||||
|
||||
static void set_led_color_rgb(LED_TYPE color, int pos) {
|
||||
uint8_t* tx_start = &txbuf[PREAMBLE_SIZE];
|
||||
|
||||
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.g, j);
|
||||
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.r, j);
|
||||
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j);
|
||||
}
|
||||
|
||||
void ws2812_init(void) {
|
||||
#if defined(USE_GPIOV1)
|
||||
palSetLineMode(RGB_DI_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
|
||||
#else
|
||||
palSetLineMode(RGB_DI_PIN, PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL);
|
||||
#endif
|
||||
|
||||
// TODO: more dynamic baudrate
|
||||
static const SPIConfig spicfg = {
|
||||
NULL, PAL_PORT(RGB_DI_PIN), PAL_PAD(RGB_DI_PIN),
|
||||
SPI_CR1_BR_1 | SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us (2.25 MHz)
|
||||
};
|
||||
|
||||
spiAcquireBus(&WS2812_SPI); /* Acquire ownership of the bus. */
|
||||
spiStart(&WS2812_SPI, &spicfg); /* Setup transfer parameters. */
|
||||
spiSelect(&WS2812_SPI); /* Slave Select assertion. */
|
||||
}
|
||||
|
||||
void ws2812_setleds(LED_TYPE* ledarray, uint16_t leds) {
|
||||
static bool s_init = false;
|
||||
if (!s_init) {
|
||||
ws2812_init();
|
||||
s_init = true;
|
||||
}
|
||||
|
||||
for (uint8_t i = 0; i < leds; i++) {
|
||||
set_led_color_rgb(ledarray[i], i);
|
||||
}
|
||||
|
||||
// Send async - each led takes ~0.03ms, 50 leds ~1.5ms, animations flushing faster than send will cause issues.
|
||||
// Instead spiSend can be used to send synchronously (or the thread logic can be added back).
|
||||
#ifdef WS2812_SPI_SYNC
|
||||
spiSend(&WS2812_SPI, sizeof(txbuf) / sizeof(txbuf[0]), txbuf);
|
||||
#else
|
||||
spiStartSend(&WS2812_SPI, sizeof(txbuf) / sizeof(txbuf[0]), txbuf);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -32,16 +32,9 @@ void DRV_write(uint8_t drv_register, uint8_t settings) {
|
||||
}
|
||||
|
||||
uint8_t DRV_read(uint8_t regaddress) {
|
||||
#ifdef __AVR__
|
||||
i2c_readReg(DRV2605L_BASE_ADDRESS << 1, regaddress, DRV2605L_read_buffer, 1, 100);
|
||||
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
|
||||
#else
|
||||
DRV2605L_tx_register[0] = regaddress;
|
||||
if (MSG_OK != i2c_transmit_receive(DRV2605L_BASE_ADDRESS << 1, DRV2605L_tx_register, 1, DRV2605L_read_buffer, 1)) {
|
||||
printf("err reading reg \n");
|
||||
}
|
||||
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
|
||||
#endif
|
||||
|
||||
return DRV2605L_read_register;
|
||||
}
|
||||
|
||||
@@ -127,4 +120,4 @@ void DRV_pulse(uint8_t sequence) {
|
||||
DRV_write(DRV_GO, 0x00);
|
||||
DRV_write(DRV_WAVEFORM_SEQ_1, sequence);
|
||||
DRV_write(DRV_GO, 0x01);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
* 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 <stdint.h>
|
||||
|
||||
@@ -16,21 +16,9 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef __AVR__
|
||||
# include <avr/interrupt.h>
|
||||
# include <avr/io.h>
|
||||
# include <util/delay.h>
|
||||
#else
|
||||
# include "wait.h"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include "is31fl3731-simple.h"
|
||||
#include "i2c_master.h"
|
||||
#include "progmem.h"
|
||||
#include "print.h"
|
||||
#include "wait.h"
|
||||
|
||||
// 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)
|
||||
@@ -156,6 +144,7 @@ void IS31FL3731_init(uint8_t addr) {
|
||||
|
||||
// enable software shutdown
|
||||
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
|
||||
|
||||
// this delay was copied from other drivers, might not be needed
|
||||
wait_ms(10);
|
||||
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef IS31FL3731_DRIVER_H
|
||||
#define IS31FL3731_DRIVER_H
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct is31_led {
|
||||
uint8_t driver : 2;
|
||||
@@ -203,5 +205,3 @@ void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index);
|
||||
#define C9_14 0xB1
|
||||
#define C9_15 0xB2
|
||||
#define C9_16 0xB3
|
||||
|
||||
#endif // IS31FL3731_DRIVER_H
|
||||
|
||||
@@ -15,18 +15,9 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef __AVR__
|
||||
# include <avr/interrupt.h>
|
||||
# include <avr/io.h>
|
||||
# include <util/delay.h>
|
||||
#else
|
||||
# include "wait.h"
|
||||
#endif
|
||||
|
||||
#include "is31fl3731.h"
|
||||
#include <string.h>
|
||||
#include "i2c_master.h"
|
||||
#include "progmem.h"
|
||||
#include "wait.h"
|
||||
|
||||
// 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)
|
||||
@@ -141,12 +132,9 @@ void IS31FL3731_init(uint8_t addr) {
|
||||
|
||||
// enable software shutdown
|
||||
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
|
||||
// this delay was copied from other drivers, might not be needed
|
||||
#ifdef __AVR__
|
||||
_delay_ms(10);
|
||||
#else
|
||||
|
||||
// this delay was copied from other drivers, might not be needed
|
||||
wait_ms(10);
|
||||
#endif
|
||||
|
||||
// picture mode
|
||||
IS31FL3731_write_register(addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE);
|
||||
|
||||
@@ -15,8 +15,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef IS31FL3731_DRIVER_H
|
||||
#define IS31FL3731_DRIVER_H
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
@@ -207,5 +206,3 @@ void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index);
|
||||
#define C9_14 0xB1
|
||||
#define C9_15 0xB2
|
||||
#define C9_16 0xB3
|
||||
|
||||
#endif // IS31FL3731_DRIVER_H
|
||||
|
||||
@@ -16,18 +16,9 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef __AVR__
|
||||
# include <avr/interrupt.h>
|
||||
# include <avr/io.h>
|
||||
# include <util/delay.h>
|
||||
#else
|
||||
# include "wait.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include "i2c_master.h"
|
||||
#include "progmem.h"
|
||||
#include "is31fl3733.h"
|
||||
#include "i2c_master.h"
|
||||
#include "wait.h"
|
||||
|
||||
// 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)
|
||||
@@ -168,12 +159,8 @@ void IS31FL3733_init(uint8_t addr, uint8_t sync) {
|
||||
// Disable software shutdown.
|
||||
IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, (sync << 6) | 0x01);
|
||||
|
||||
// Wait 10ms to ensure the device has woken up.
|
||||
#ifdef __AVR__
|
||||
_delay_ms(10);
|
||||
#else
|
||||
// Wait 10ms to ensure the device has woken up.
|
||||
wait_ms(10);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef IS31FL3733_DRIVER_H
|
||||
#define IS31FL3733_DRIVER_H
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
@@ -250,5 +249,3 @@ void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index);
|
||||
#define L_14 0xBD
|
||||
#define L_15 0xBE
|
||||
#define L_16 0xBF
|
||||
|
||||
#endif // IS31FL3733_DRIVER_H
|
||||
|
||||
@@ -14,18 +14,9 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef __AVR__
|
||||
# include <avr/interrupt.h>
|
||||
# include <avr/io.h>
|
||||
# include <util/delay.h>
|
||||
#else
|
||||
# include "wait.h"
|
||||
#endif
|
||||
|
||||
#include "is31fl3736.h"
|
||||
#include <string.h>
|
||||
#include "i2c_master.h"
|
||||
#include "progmem.h"
|
||||
#include "wait.h"
|
||||
|
||||
// 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)
|
||||
@@ -154,12 +145,8 @@ void IS31FL3736_init(uint8_t addr) {
|
||||
// Disable software shutdown.
|
||||
IS31FL3736_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
|
||||
|
||||
// Wait 10ms to ensure the device has woken up.
|
||||
#ifdef __AVR__
|
||||
_delay_ms(10);
|
||||
#else
|
||||
// Wait 10ms to ensure the device has woken up.
|
||||
wait_ms(10);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||
@@ -263,7 +250,7 @@ void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2) {
|
||||
IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||
|
||||
IS31FL3736_write_pwm_buffer(addr1, g_pwm_buffer[0]);
|
||||
// IS31FL3736_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
||||
// IS31FL3736_write_pwm_buffer(addr2, g_pwm_buffer[1]);
|
||||
}
|
||||
g_pwm_buffer_update_required = false;
|
||||
}
|
||||
@@ -275,7 +262,7 @@ void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
|
||||
IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||
for (int i = 0; i < 24; i++) {
|
||||
IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i]);
|
||||
// IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i] );
|
||||
// IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,18 +16,9 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef __AVR__
|
||||
# include <avr/interrupt.h>
|
||||
# include <avr/io.h>
|
||||
# include <util/delay.h>
|
||||
#else
|
||||
# include "wait.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include "is31fl3737.h"
|
||||
#include "i2c_master.h"
|
||||
#include "progmem.h"
|
||||
#include "rgb_matrix.h"
|
||||
#include "wait.h"
|
||||
|
||||
// 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)
|
||||
@@ -156,12 +147,8 @@ void IS31FL3737_init(uint8_t addr) {
|
||||
// Disable software shutdown.
|
||||
IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
|
||||
|
||||
// Wait 10ms to ensure the device has woken up.
|
||||
#ifdef __AVR__
|
||||
_delay_ms(10);
|
||||
#else
|
||||
// Wait 10ms to ensure the device has woken up.
|
||||
wait_ms(10);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||
@@ -217,7 +204,7 @@ void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2) {
|
||||
IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||
|
||||
IS31FL3737_write_pwm_buffer(addr1, g_pwm_buffer[0]);
|
||||
// IS31FL3737_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
||||
// IS31FL3737_write_pwm_buffer(addr2, g_pwm_buffer[1]);
|
||||
}
|
||||
g_pwm_buffer_update_required = false;
|
||||
}
|
||||
@@ -229,7 +216,7 @@ void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
|
||||
IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||
for (int i = 0; i < 24; i++) {
|
||||
IS31FL3737_write_register(addr1, i, g_led_control_registers[0][i]);
|
||||
// IS31FL3737_write_register(addr2, i, g_led_control_registers[1][i] );
|
||||
// IS31FL3737_write_register(addr2, i, g_led_control_registers[1][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef IS31FL3737_DRIVER_H
|
||||
#define IS31FL3737_DRIVER_H
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
@@ -202,5 +201,3 @@ void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2);
|
||||
#define L_10 0xBB
|
||||
#define L_11 0xBC
|
||||
#define L_12 0xBD
|
||||
|
||||
#endif // IS31FL3737_DRIVER_H
|
||||
|
||||
@@ -224,6 +224,8 @@ void oled_write_raw_P(const char *data, uint16_t size);
|
||||
// Advances the cursor while writing, inverts the pixels if true
|
||||
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
|
||||
# define oled_write_ln_P(data, invert) oled_write(data, invert)
|
||||
|
||||
# define oled_write_raw_P(data, size) oled_write_raw(data, size)
|
||||
#endif // defined(__AVR__)
|
||||
|
||||
// Can be used to manually turn on the screen if it is off
|
||||
|
||||
@@ -46,23 +46,3 @@
|
||||
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
|
||||
// EEPROM usage
|
||||
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 34
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x08
|
||||
#define EEPROM_VERSION_ADDR 36
|
||||
|
||||
// Dynamic keymap starts after EEPROM version
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
|
||||
// Dynamic macro starts after dynamic keymaps (37+(4*12*9*2)) = (37+864)
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 901
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 123
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
|
||||
@@ -1,68 +1 @@
|
||||
# project specific files
|
||||
SRC = keyboards/wilba_tech/wt_main.c
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Processor frequency.
|
||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
#
|
||||
# This will be an integer division of F_USB below, as it is sourced by
|
||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||
# does not *change* the processor frequency - it should merely be updated to
|
||||
# reflect the processor speed set externally so that the code can use accurate
|
||||
# software delays.
|
||||
F_CPU = 16000000
|
||||
|
||||
|
||||
#
|
||||
# LUFA specific
|
||||
#
|
||||
# Target architecture (see library "Board Types" documentation).
|
||||
ARCH = AVR8
|
||||
|
||||
# Input clock frequency.
|
||||
# This will define a symbol, F_USB, in all source code files equal to the
|
||||
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||
# at the end, this will be done automatically to create a 32-bit value in your
|
||||
# source code.
|
||||
#
|
||||
# If no clock division is performed on the input clock inside the AVR (via the
|
||||
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||
F_USB = $(F_CPU)
|
||||
|
||||
# Interrupt driven control endpoint task(+60)
|
||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
|
||||
|
||||
# Boot Section
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
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 = yes # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
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
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
VIA_ENABLE = yes
|
||||
|
||||
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
@@ -30,5 +30,3 @@ 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
|
||||
|
||||
# project specific files
|
||||
SRC = keyboards/wilba_tech/wt_main.c
|
||||
|
||||
@@ -46,24 +46,3 @@
|
||||
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
|
||||
// EEPROM usage
|
||||
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 34
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x08
|
||||
#define EEPROM_VERSION_ADDR 36
|
||||
|
||||
// Dynamic keymap starts after EEPROM version
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
|
||||
// Dynamic macro starts after dynamic keymaps (37+(4*10*10*2)) = (37+800)
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 837
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 187
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
|
||||
|
||||
@@ -38,9 +38,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
|
||||
[1] = LAYOUT_ext65(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET ,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
),
|
||||
@@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[2] = LAYOUT_ext65(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
),
|
||||
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[3] = LAYOUT_ext65(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
)
|
||||
|
||||
@@ -38,9 +38,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
|
||||
[1] = LAYOUT_ext65(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET ,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
),
|
||||
@@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[2] = LAYOUT_ext65(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
),
|
||||
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[3] = LAYOUT_ext65(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
)
|
||||
|
||||
@@ -1,68 +1 @@
|
||||
# project specific files
|
||||
SRC = keyboards/wilba_tech/wt_main.c
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Processor frequency.
|
||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
#
|
||||
# This will be an integer division of F_USB below, as it is sourced by
|
||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||
# does not *change* the processor frequency - it should merely be updated to
|
||||
# reflect the processor speed set externally so that the code can use accurate
|
||||
# software delays.
|
||||
F_CPU = 16000000
|
||||
|
||||
|
||||
#
|
||||
# LUFA specific
|
||||
#
|
||||
# Target architecture (see library "Board Types" documentation).
|
||||
ARCH = AVR8
|
||||
|
||||
# Input clock frequency.
|
||||
# This will define a symbol, F_USB, in all source code files equal to the
|
||||
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||
# at the end, this will be done automatically to create a 32-bit value in your
|
||||
# source code.
|
||||
#
|
||||
# If no clock division is performed on the input clock inside the AVR (via the
|
||||
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||
F_USB = $(F_CPU)
|
||||
|
||||
# Interrupt driven control endpoint task(+60)
|
||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
|
||||
|
||||
# Boot Section
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
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 = yes # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
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
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
VIA_ENABLE = yes
|
||||
|
||||
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
@@ -29,6 +29,3 @@ 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
|
||||
|
||||
# project specific files
|
||||
SRC += keyboards/wilba_tech/wt_main.c
|
||||
|
||||
@@ -242,25 +242,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/* Bootmagic Lite key configuration */
|
||||
// #define BOOTMAGIC_LITE_ROW 0
|
||||
// #define BOOTMAGIC_LITE_COLUMN 0
|
||||
|
||||
/* VIA Configurator Compatibility */
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
|
||||
// EEPROM usage
|
||||
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 34
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x08
|
||||
#define EEPROM_VERSION_ADDR 36
|
||||
|
||||
// Dynamic keymap starts after EEPROM version
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
|
||||
// DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR = DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2)
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 637
|
||||
// DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE = 1024 - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 387
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
|
||||
@@ -1,85 +1 @@
|
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Processor frequency.
|
||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
#
|
||||
# This will be an integer division of F_USB below, as it is sourced by
|
||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||
# does not *change* the processor frequency - it should merely be updated to
|
||||
# reflect the processor speed set externally so that the code can use accurate
|
||||
# software delays.
|
||||
F_CPU = 16000000
|
||||
|
||||
|
||||
#
|
||||
# LUFA specific
|
||||
#
|
||||
# Target architecture (see library "Board Types" documentation).
|
||||
ARCH = AVR8
|
||||
|
||||
# Input clock frequency.
|
||||
# This will define a symbol, F_USB, in all source code files equal to the
|
||||
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||
# at the end, this will be done automatically to create a 32-bit value in your
|
||||
# source code.
|
||||
#
|
||||
# If no clock division is performed on the input clock inside the AVR (via the
|
||||
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||
F_USB = $(F_CPU)
|
||||
|
||||
# Interrupt driven control endpoint task(+60)
|
||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
|
||||
|
||||
# Bootloader selection
|
||||
# Teensy halfkay
|
||||
# Pro Micro caterina
|
||||
# Atmel DFU atmel-dfu
|
||||
# LUFA DFU lufa-dfu
|
||||
# QMK DFU qmk-dfu
|
||||
# atmega32a bootloadHID
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
|
||||
# If you don't know the bootloader type, then you can specify the
|
||||
# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
|
||||
# Teensy halfKay 512
|
||||
# Teensy++ halfKay 1024
|
||||
# Atmel DFU loader 4096
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
# OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # 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 = yes # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
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
|
||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||
|
||||
SRC += keyboards/wilba_tech/wt_main.c
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
VIA_ENABLE = yes
|
||||
|
||||
5
keyboards/atreus62/keymaps/hvp/config.h
Normal file
5
keyboards/atreus62/keymaps/hvp/config.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#define TAPPING_TERM 150
|
||||
#define IGNORE_MOD_TAP_INTERRUPT
|
||||
#define PERMISSIVE_HOLD
|
||||
67
keyboards/atreus62/keymaps/hvp/keymap.c
Normal file
67
keyboards/atreus62/keymaps/hvp/keymap.c
Normal file
@@ -0,0 +1,67 @@
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
#include "hvp.c"
|
||||
|
||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||
// entirely and just use numbers.
|
||||
|
||||
#define LT3_ESC LT(3, KC_ESC)
|
||||
#define LT4_TAB LT(4, KC_TAB)
|
||||
#define LT1_ENT LT(1, KC_ENTER)
|
||||
#define LT2_BSP LT(2, KC_BSPC)
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
LAYOUT( /* qwerty */
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC ,
|
||||
LT4_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC ,
|
||||
LT3_ESC, KC_A, KC_S, KC_D, LT(3,KC_F), LT(4,KC_G), KC_H, KC_J, KC_K, KC_L, TD(TD1), TD(TD2) ,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, TD(TD3), KC_SFTENT ,
|
||||
KC_LCTL, KC_APP, _______, KC_LGUI, KC_LALT,SFT_T(KC_SPC), LT2_BSP, LT1_ENT, SFT_T(KC_SPC), KC_LSFT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
|
||||
),
|
||||
|
||||
LAYOUT( /* Right */
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS ,
|
||||
KC_DEL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC ,
|
||||
KC_DEL, _______, _______, _______, _______, KC_LEFT_PAREN, KC_RIGHT_PAREN, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
|
||||
_______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
|
||||
),
|
||||
|
||||
LAYOUT(/* Left */
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS ,
|
||||
KC_TILDE, KC_EXCLAIM, KC_AT, KC_HASH, KC_DOLLAR, KC_PERCENT, KC_CIRCUMFLEX, KC_AMPERSAND, KC_ASTERISK, KC_LEFT_PAREN, KC_RIGHT_PAREN, KC_BSPC,
|
||||
KC_DELETE, _______, _______, _______, _______, KC_LEFT_PAREN, KC_RIGHT_PAREN, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_BSLS,
|
||||
_______ , _______ , _______ , _______ , _______ , KC_LEFT_CURLY_BRACE , KC_RIGHT_CURLY_BRACE ,KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_TILD,
|
||||
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , KC_HOME, KC_PGDN, KC_PGUP, KC_END
|
||||
),
|
||||
|
||||
|
||||
LAYOUT(/* Esc */
|
||||
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
|
||||
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
|
||||
KC_NO, KC_NO, KC_NO, D_NAVI, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_NO ,
|
||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_NO, KC_NO ,
|
||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MSTP, KC_MPLY, KC_NO, KC_MUTE, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT
|
||||
),
|
||||
|
||||
|
||||
|
||||
LAYOUT(/* Tab */
|
||||
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______ ,
|
||||
_______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, _______, _______ ,
|
||||
_______, _______, _______, _______, _______, _______, KC_0, KC_1, KC_2, KC_3, _______, _______ ,
|
||||
KC_PSCR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
|
||||
RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
),
|
||||
/*
|
||||
[_TRNS] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
),
|
||||
*/
|
||||
};
|
||||
10
keyboards/atreus62/keymaps/hvp/readme.md
Normal file
10
keyboards/atreus62/keymaps/hvp/readme.md
Normal file
@@ -0,0 +1,10 @@
|
||||
Keyboard: Atreus62
|
||||
Keys: 62 keyed ortho staggered keyboard with a split layout and num row.
|
||||
Layout: Swedish characters on main layer using tap dance. Built for Eurkey keyboard layout.
|
||||
Flash instructions: Flash using avrdude, will req the hvp user space to compile.
|
||||
|
||||
> make make atreus62:hvp:avrdude
|
||||
|
||||
Links:
|
||||
Github - https://github.com/qmk/qmk_firmware/tree/master/keyboards/atreus62
|
||||
Eurkey layout - https://eurkey.steffen.bruentjen.eu/
|
||||
1
keyboards/atreus62/keymaps/hvp/rules.mk
Normal file
1
keyboards/atreus62/keymaps/hvp/rules.mk
Normal file
@@ -0,0 +1 @@
|
||||
TAP_DANCE_ENABLE = yes
|
||||
@@ -17,9 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "bfake.h"
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {}
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
setPinOutput(D0);
|
||||
setPinOutput(D1);
|
||||
|
||||
@@ -32,7 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define MATRIX_COLS 11
|
||||
|
||||
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5, B6, B7 }
|
||||
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6}
|
||||
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5 }
|
||||
#define UNUSED_PINS
|
||||
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
/*
|
||||
Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
#include "matrix.h"
|
||||
|
||||
#ifndef DEBOUNCE
|
||||
#define DEBOUNCE 5
|
||||
#endif
|
||||
|
||||
static uint8_t debouncing = DEBOUNCE;
|
||||
|
||||
static matrix_row_t matrix[MATRIX_ROWS];
|
||||
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
|
||||
|
||||
void matrix_init(void) {
|
||||
// all outputs for rows high
|
||||
DDRB = 0xFF;
|
||||
PORTB = 0xFF;
|
||||
// all inputs for columns
|
||||
DDRA = 0x00;
|
||||
DDRC &= ~(0x111111<<2);
|
||||
DDRD &= ~(1<<PIND7);
|
||||
// all columns are pulled-up
|
||||
PORTA = 0xFF;
|
||||
PORTC |= (0b111111<<2);
|
||||
PORTD |= (1<<PIND7);
|
||||
|
||||
// initialize matrix state: all keys off
|
||||
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||
matrix[row] = 0x00;
|
||||
matrix_debouncing[row] = 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_set_row_status(uint8_t row) {
|
||||
DDRB = (1 << row);
|
||||
PORTB = ~(1 << row);
|
||||
}
|
||||
|
||||
uint8_t bit_reverse(uint8_t x) {
|
||||
x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
|
||||
x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
|
||||
x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
|
||||
return x;
|
||||
}
|
||||
|
||||
uint8_t matrix_scan(void) {
|
||||
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||
matrix_set_row_status(row);
|
||||
_delay_us(5);
|
||||
|
||||
matrix_row_t cols = (
|
||||
// cols 0..7, PORTA 0 -> 7
|
||||
(~PINA) & 0xFF
|
||||
) | (
|
||||
// cols 8..13, PORTC 7 -> 0
|
||||
bit_reverse((~PINC) & 0xFF) << 8
|
||||
) | (
|
||||
// col 14, PORTD 7
|
||||
((~PIND) & (1 << PIND7)) << 7
|
||||
);
|
||||
|
||||
if (matrix_debouncing[row] != cols) {
|
||||
matrix_debouncing[row] = cols;
|
||||
debouncing = DEBOUNCE;
|
||||
}
|
||||
}
|
||||
|
||||
if (debouncing) {
|
||||
if (--debouncing) {
|
||||
_delay_ms(1);
|
||||
} else {
|
||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
||||
matrix[i] = matrix_debouncing[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
matrix_scan_user();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
inline matrix_row_t matrix_get_row(uint8_t row) {
|
||||
return matrix[row];
|
||||
}
|
||||
|
||||
void matrix_print(void) {
|
||||
}
|
||||
@@ -22,7 +22,3 @@ RGBLIGHT_ENABLE = no
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
CUSTOM_MATRIX = yes
|
||||
SRC = matrix.c
|
||||
|
||||
@@ -58,26 +58,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define PIN_WS2812 15
|
||||
#define WS2812_SPI SPID2
|
||||
|
||||
|
||||
// EEPROM usage
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 40
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x03
|
||||
#define EEPROM_VERSION_ADDR 42
|
||||
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
|
||||
// start + layer * rows * col * 2
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
|
||||
#define EEPROM_CUSTOM_BACKLIGHT 644
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 645
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
// Backlight config starts after VIA's EEPROM usage,
|
||||
// dynamic keymaps start after this.
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
|
||||
@@ -1,5 +1 @@
|
||||
# rules.mk overrides to enable VIA
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
VIA_ENABLE = yes
|
||||
|
||||
@@ -53,7 +53,4 @@ CUSTOM_MATRIX = no # Custom matrix file
|
||||
# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
|
||||
RGBLIGHT_ENABLE = yes
|
||||
|
||||
# RAW_ENABLE = yes
|
||||
# DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
LAYOUTS = 60_ansi 60_tsangan_hhkb
|
||||
|
||||
@@ -50,26 +50,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
// EEPROM usage
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 34
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x02
|
||||
#define EEPROM_VERSION_ADDR 36
|
||||
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
|
||||
// start + layer * rows * col * 2
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
|
||||
#define EEPROM_CUSTOM_BACKLIGHT 678
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 679
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 202
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
* These options are also useful to firmware size reduction.
|
||||
|
||||
@@ -1,5 +1 @@
|
||||
# rules.mk overrides to enable VIA
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
VIA_ENABLE = yes
|
||||
|
||||
@@ -52,6 +52,3 @@ NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
CUSTOM_MATRIX = no # Custom matrix file
|
||||
# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
|
||||
RGBLIGHT_ENABLE = no
|
||||
|
||||
# RAW_ENABLE = yes
|
||||
# DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
@@ -58,26 +58,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define PIN_WS2812 15
|
||||
#define WS2812_SPI SPID2
|
||||
|
||||
|
||||
// EEPROM usage
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 40
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x03
|
||||
#define EEPROM_VERSION_ADDR 42
|
||||
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
|
||||
// start + layer * rows * col * 2
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
|
||||
#define EEPROM_CUSTOM_BACKLIGHT 644
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 645
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
// Backlight config starts after VIA's EEPROM usage,
|
||||
// dynamic keymaps start after this.
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
|
||||
@@ -1,5 +1 @@
|
||||
# rules.mk overrides to enable VIA
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
VIA_ENABLE = yes
|
||||
|
||||
@@ -1,5 +1 @@
|
||||
# rules.mk overrides to enable VIA
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
VIA_ENABLE = yes
|
||||
|
||||
@@ -55,7 +55,4 @@ CUSTOM_MATRIX = no # Custom matrix file
|
||||
# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
|
||||
RGBLIGHT_ENABLE = yes
|
||||
|
||||
# RAW_ENABLE = yes
|
||||
# DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
LAYOUTS = 60_ansi 60_tsangan_hhkb
|
||||
|
||||
@@ -50,25 +50,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
// EEPROM usage
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 40
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x02
|
||||
#define EEPROM_VERSION_ADDR 42
|
||||
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
|
||||
// start + layer * rows * col * 2
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
|
||||
#define EEPROM_CUSTOM_BACKLIGHT 684
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 685
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
// Backlight config starts after VIA's EEPROM usage,
|
||||
// dynamic keymaps start after this.
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
|
||||
@@ -64,41 +64,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
|
||||
// EEPROM usage
|
||||
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 40
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x01
|
||||
#define EEPROM_VERSION_ADDR 42
|
||||
|
||||
// Dynamic keymap starts after EEPROM version
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
|
||||
|
||||
// Dynamic macro starts after dynamic keymaps (35+(4*6*16*2)) = (35+768) = 803
|
||||
|
||||
// I'm also putting my custom stuff after that
|
||||
// 1 for enabled encoder modes
|
||||
// 1 for custom backlighting controls
|
||||
// 1 for OLED default mode
|
||||
// 6 for 3x custom encoder settings, left, right, and press (18 total)
|
||||
|
||||
#define DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES 811
|
||||
#define DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT 812
|
||||
#define DYNAMIC_KEYMAP_DEFAULT_OLED 813
|
||||
#define DYNAMIC_KEYMAP_CUSTOM_ENCODER 814
|
||||
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 832
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
|
||||
|
||||
// Custom config starts after VIA's EEPROM usage,
|
||||
// dynamic keymaps start after this.
|
||||
// Custom config Usage:
|
||||
// 1 for enabled encoder modes (1 byte)
|
||||
// 1 for custom backlighting controls (1 byte)
|
||||
// 1 for OLED default mode (1 byte)
|
||||
// 6 for 3x custom encoder settings, left, right, and press (18 bytes)
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 21
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# rules.mk overrides to enable VIA
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
VIA_ENABLE = yes
|
||||
@@ -1,5 +1 @@
|
||||
# rules.mk overrides to enable VIA
|
||||
|
||||
RAW_ENABLE = yes
|
||||
DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
VIA_ENABLE = yes
|
||||
|
||||
@@ -17,3 +17,20 @@
|
||||
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, KC_NO, K413, KC_NO, K415 }, \
|
||||
{ K500, K501, K502, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
|
||||
}
|
||||
|
||||
// Expose All Keys - Split backspace - ISO Extra keys - Split space bottom row
|
||||
#define LAYOUT_all( \
|
||||
K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K315, \
|
||||
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
|
||||
K500, K501, K502, K503, K505, K507, K509, K510, K511, K512, K513, K515 \
|
||||
) { \
|
||||
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
|
||||
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, KC_NO, K315 }, \
|
||||
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
|
||||
{ K500, K501, K502, K503, KC_NO, K505, KC_NO, K507, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
|
||||
}
|
||||
|
||||
@@ -51,7 +51,4 @@ ENCODER_ENABLE = yes
|
||||
QWIIC_ENABLE += MICRO_OLED
|
||||
#BACKLIGHT_ENABLE = yes
|
||||
|
||||
# RAW_ENABLE = yes
|
||||
# DYNAMIC_KEYMAP_ENABLE = yes
|
||||
|
||||
DEFAULT_FOLDER = cannonkeys/satisfaction75/rev1
|
||||
|
||||
@@ -15,11 +15,7 @@
|
||||
#include "raw_hid.h"
|
||||
#include "dynamic_keymap.h"
|
||||
#include "tmk_core/common/eeprom.h"
|
||||
|
||||
// HACK
|
||||
#include "keyboards/wilba_tech/via_api.h" // Temporary hack
|
||||
#include "keyboards/wilba_tech/via_keycodes.h" // Temporary hack
|
||||
|
||||
#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
|
||||
|
||||
/* Artificial delay added to get media keys to work in the encoder*/
|
||||
#define MEDIA_KEY_DELAY 10
|
||||
@@ -58,56 +54,20 @@ backlight_config_t kb_backlight_config = {
|
||||
.level = BACKLIGHT_LEVELS
|
||||
};
|
||||
|
||||
bool eeprom_is_valid(void)
|
||||
#ifdef VIA_ENABLE
|
||||
void raw_hid_receive_kb( uint8_t *data, uint8_t length )
|
||||
{
|
||||
return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC &&
|
||||
eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION);
|
||||
}
|
||||
|
||||
void eeprom_set_valid(bool valid)
|
||||
{
|
||||
eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF);
|
||||
eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF);
|
||||
}
|
||||
|
||||
void eeprom_reset(void)
|
||||
{
|
||||
// Set the VIA specific EEPROM state as invalid.
|
||||
eeprom_set_valid(false);
|
||||
// Set the TMK/QMK EEPROM state as invalid.
|
||||
eeconfig_disable();
|
||||
}
|
||||
|
||||
#ifdef RAW_ENABLE
|
||||
|
||||
void raw_hid_receive( uint8_t *data, uint8_t length )
|
||||
{
|
||||
uint8_t *command_id = &(data[0]);
|
||||
uint8_t *command_data = &(data[1]);
|
||||
switch ( *command_id )
|
||||
{
|
||||
case id_get_protocol_version:
|
||||
{
|
||||
command_data[0] = PROTOCOL_VERSION >> 8;
|
||||
command_data[1] = PROTOCOL_VERSION & 0xFF;
|
||||
break;
|
||||
}
|
||||
case id_get_keyboard_value:
|
||||
{
|
||||
uint8_t *command_id = &(data[0]);
|
||||
uint8_t *command_data = &(data[1]);
|
||||
switch ( *command_id )
|
||||
{
|
||||
case id_get_keyboard_value:
|
||||
{
|
||||
switch( command_data[0])
|
||||
{
|
||||
case id_uptime:
|
||||
{
|
||||
uint32_t value = timer_read32();
|
||||
command_data[1] = (value >> 24 ) & 0xFF;
|
||||
command_data[2] = (value >> 16 ) & 0xFF;
|
||||
command_data[3] = (value >> 8 ) & 0xFF;
|
||||
command_data[4] = value & 0xFF;
|
||||
break;
|
||||
}
|
||||
case id_oled_default_mode:
|
||||
{
|
||||
uint8_t default_oled = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED);
|
||||
uint8_t default_oled = eeprom_read_byte((uint8_t*)EEPROM_DEFAULT_OLED);
|
||||
command_data[1] = default_oled;
|
||||
break;
|
||||
}
|
||||
@@ -141,15 +101,14 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
case id_set_keyboard_value:
|
||||
{
|
||||
switch(command_data[0]){
|
||||
case id_oled_default_mode:
|
||||
{
|
||||
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED, command_data[1]);
|
||||
eeprom_update_byte((uint8_t*)EEPROM_DEFAULT_OLED, command_data[1]);
|
||||
break;
|
||||
}
|
||||
case id_oled_mode:
|
||||
@@ -161,7 +120,7 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
|
||||
case id_encoder_modes:
|
||||
{
|
||||
enabled_encoder_modes = command_data[1];
|
||||
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES, enabled_encoder_modes);
|
||||
eeprom_update_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES, enabled_encoder_modes);
|
||||
break;
|
||||
}
|
||||
case id_encoder_custom:
|
||||
@@ -180,95 +139,15 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
|
||||
}
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_get_keycode:
|
||||
{
|
||||
uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] );
|
||||
command_data[3] = keycode >> 8;
|
||||
command_data[4] = keycode & 0xFF;
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_set_keycode:
|
||||
{
|
||||
dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] );
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_reset:
|
||||
{
|
||||
dynamic_keymap_reset();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_get_count:
|
||||
{
|
||||
command_data[0] = dynamic_keymap_macro_get_count();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_get_buffer_size:
|
||||
{
|
||||
uint16_t size = dynamic_keymap_macro_get_buffer_size();
|
||||
command_data[0] = size >> 8;
|
||||
command_data[1] = size & 0xFF;
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_get_buffer:
|
||||
{
|
||||
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] );
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_reset:
|
||||
{
|
||||
dynamic_keymap_macro_reset();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_get_layer_count:
|
||||
{
|
||||
command_data[0] = dynamic_keymap_get_layer_count();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_get_buffer:
|
||||
{
|
||||
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
dynamic_keymap_get_buffer( offset, size, &command_data[3] );
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_set_buffer:
|
||||
{
|
||||
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
dynamic_keymap_set_buffer( offset, size, &command_data[3] );
|
||||
break;
|
||||
}
|
||||
#endif // DYNAMIC_KEYMAP_ENABLE
|
||||
case id_eeprom_reset:
|
||||
{
|
||||
eeprom_reset();
|
||||
break;
|
||||
}
|
||||
case id_bootloader_jump:
|
||||
{
|
||||
// Need to send data back before the jump
|
||||
// Informs host that the command is handled
|
||||
raw_hid_send( data, length );
|
||||
// Give host time to read it
|
||||
wait_ms(100);
|
||||
bootloader_jump();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Unhandled message.
|
||||
*command_id = id_unhandled;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Return same buffer with values changed
|
||||
raw_hid_send( data, length );
|
||||
|
||||
default:
|
||||
{
|
||||
// Unhandled message.
|
||||
*command_id = id_unhandled;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// DO NOT call raw_hid_send(data,length) here, let caller do this
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -349,18 +228,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
// Handle macros
|
||||
if (record->event.pressed) {
|
||||
if ( keycode >= MACRO00 && keycode <= MACRO15 )
|
||||
{
|
||||
uint8_t id = keycode - MACRO00;
|
||||
dynamic_keymap_macro_send(id);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif //DYNAMIC_KEYMAP_ENABLE
|
||||
|
||||
return process_record_user(keycode, record);
|
||||
}
|
||||
|
||||
@@ -392,59 +259,56 @@ void encoder_update_kb(uint8_t index, bool clockwise) {
|
||||
}
|
||||
}
|
||||
|
||||
void dynamic_keymap_custom_reset(void){
|
||||
void *p = (void*)(DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT);
|
||||
void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
|
||||
while ( p != end ) {
|
||||
eeprom_update_byte(p, 0);
|
||||
++p;
|
||||
}
|
||||
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES, 0x1F);
|
||||
void custom_config_reset(void){
|
||||
void *p = (void*)(VIA_EEPROM_CUSTOM_CONFIG_ADDR);
|
||||
void *end = (void*)(VIA_EEPROM_CUSTOM_CONFIG_ADDR+VIA_EEPROM_CUSTOM_CONFIG_SIZE);
|
||||
while ( p != end ) {
|
||||
eeprom_update_byte(p, 0);
|
||||
++p;
|
||||
}
|
||||
eeprom_update_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES, 0x1F);
|
||||
}
|
||||
|
||||
void save_backlight_config_to_eeprom(){
|
||||
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
|
||||
void backlight_config_save(){
|
||||
eeprom_update_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
|
||||
}
|
||||
|
||||
void load_custom_config(){
|
||||
kb_backlight_config.raw = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT);
|
||||
void custom_config_load(){
|
||||
kb_backlight_config.raw = eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT);
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
oled_mode = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED);
|
||||
enabled_encoder_modes = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES);
|
||||
oled_mode = eeprom_read_byte((uint8_t*)EEPROM_DEFAULT_OLED);
|
||||
enabled_encoder_modes = eeprom_read_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES);
|
||||
#endif
|
||||
}
|
||||
|
||||
void eeprom_init_kb(void)
|
||||
// Called from via_init() if VIA_ENABLE
|
||||
// Called from matrix_init_kb() if not VIA_ENABLE
|
||||
void via_init_kb(void)
|
||||
{
|
||||
// If the EEPROM has the magic, the data is good.
|
||||
// OK to load from EEPROM.
|
||||
if (eeprom_is_valid()) {
|
||||
load_custom_config();
|
||||
} else {
|
||||
// If the EEPROM has not been saved before, or is out of date,
|
||||
// save the default values to the EEPROM. Default values
|
||||
// come from construction of the zeal_backlight_config instance.
|
||||
//backlight_config_save();
|
||||
// If the EEPROM has the magic, the data is good.
|
||||
// OK to load from EEPROM.
|
||||
if (via_eeprom_is_valid()) {
|
||||
custom_config_load();
|
||||
} else {
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
// This resets the keymaps in EEPROM to what is in flash.
|
||||
dynamic_keymap_reset();
|
||||
// This resets the macros in EEPROM to nothing.
|
||||
dynamic_keymap_macro_reset();
|
||||
// Reset the custom stuff
|
||||
dynamic_keymap_custom_reset();
|
||||
custom_config_reset();
|
||||
#endif
|
||||
// Save the magic number last, in case saving was interrupted
|
||||
eeprom_set_valid(true);
|
||||
}
|
||||
// DO NOT set EEPROM valid here, let caller do this
|
||||
}
|
||||
}
|
||||
|
||||
void matrix_init_kb(void)
|
||||
{
|
||||
eeprom_init_kb();
|
||||
#ifndef VIA_ENABLE
|
||||
via_init_kb();
|
||||
via_eeprom_set_valid(true);
|
||||
#endif // VIA_ENABLE
|
||||
|
||||
rtcGetTime(&RTCD1, &last_timespec);
|
||||
queue_for_send = true;
|
||||
backlight_init_ports();
|
||||
matrix_init_user();
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
|
||||
@@ -472,3 +336,51 @@ void matrix_scan_kb(void) {
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
// In the case of VIA being disabled, we still need to check if
|
||||
// keyboard level EEPROM memory is valid before loading.
|
||||
// Thus these are copies of the same functions in VIA, since
|
||||
// the backlight settings reuse VIA's EEPROM magic/version,
|
||||
// and the ones in via.c won't be compiled in.
|
||||
//
|
||||
// Yes, this is sub-optimal, and is only here for completeness
|
||||
// (i.e. catering to the 1% of people that want wilba.tech LED bling
|
||||
// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
|
||||
//
|
||||
#ifndef VIA_ENABLE
|
||||
|
||||
bool via_eeprom_is_valid(void)
|
||||
{
|
||||
char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
|
||||
uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
|
||||
uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
|
||||
uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
|
||||
|
||||
return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
|
||||
eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
|
||||
eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
|
||||
}
|
||||
|
||||
// Sets VIA/keyboard level usage of EEPROM to valid/invalid
|
||||
// Keyboard level code (eg. via_init_kb()) should not call this
|
||||
void via_eeprom_set_valid(bool valid)
|
||||
{
|
||||
char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
|
||||
uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
|
||||
uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
|
||||
uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
|
||||
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
|
||||
}
|
||||
|
||||
void via_eeprom_reset(void)
|
||||
{
|
||||
// Set the VIA specific EEPROM state as invalid.
|
||||
via_eeprom_set_valid(false);
|
||||
// Set the TMK/QMK EEPROM state as invalid.
|
||||
eeconfig_disable();
|
||||
}
|
||||
|
||||
#endif // VIA_ENABLE
|
||||
@@ -8,6 +8,12 @@
|
||||
#include "rev1.h"
|
||||
#endif
|
||||
|
||||
#include "via.h" // only for EEPROM address
|
||||
#define EEPROM_ENABLED_ENCODER_MODES (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
|
||||
#define EEPROM_CUSTOM_BACKLIGHT (VIA_EEPROM_CUSTOM_CONFIG_ADDR+1)
|
||||
#define EEPROM_DEFAULT_OLED (VIA_EEPROM_CUSTOM_CONFIG_ADDR+2)
|
||||
#define EEPROM_CUSTOM_ENCODER (VIA_EEPROM_CUSTOM_CONFIG_ADDR+3)
|
||||
|
||||
/* screen off after this many milliseconds */
|
||||
#define ScreenOffInterval 60000 /* milliseconds */
|
||||
|
||||
@@ -117,5 +123,5 @@ void backlight_set(uint8_t level);
|
||||
bool is_breathing(void);
|
||||
void breathing_enable(void);
|
||||
void breathing_disable(void);
|
||||
void load_custom_config(void);
|
||||
void save_backlight_config_to_eeprom(void);
|
||||
void custom_config_load(void);
|
||||
void backlight_config_save(void);
|
||||
|
||||
@@ -12,7 +12,7 @@ void pre_encoder_mode_change(){
|
||||
timespec.millisecond = (hour_config * 60 + minute_config) * 60 * 1000;
|
||||
rtcSetTime(&RTCD1, ×pec);
|
||||
} else if (encoder_mode == ENC_MODE_BACKLIGHT){
|
||||
save_backlight_config_to_eeprom();
|
||||
backlight_config_save();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ uint16_t handle_encoder_press(){
|
||||
|
||||
uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
|
||||
void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
|
||||
//big endian
|
||||
uint16_t keycode = eeprom_read_byte(addr) << 8;
|
||||
keycode |= eeprom_read_byte(addr + 1);
|
||||
@@ -233,7 +233,7 @@ uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
|
||||
|
||||
void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
|
||||
void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
|
||||
eeprom_update_byte(addr, (uint8_t)(new_code >> 8));
|
||||
eeprom_update_byte(addr + 1, (uint8_t)(new_code & 0xFF));
|
||||
#endif
|
||||
|
||||
@@ -58,25 +58,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define PIN_WS2812 15
|
||||
#define WS2812_SPI SPID2
|
||||
|
||||
// EEPROM usage
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 40
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x02
|
||||
#define EEPROM_VERSION_ADDR 42
|
||||
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
|
||||
// start + layer * rows * col * 2
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
|
||||
#define EEPROM_CUSTOM_BACKLIGHT 684
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 685
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
// Backlight config starts after VIA's EEPROM usage,
|
||||
// dynamic keymaps start after this.
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
|
||||
@@ -10,11 +10,10 @@
|
||||
#include "raw_hid.h"
|
||||
#include "dynamic_keymap.h"
|
||||
#include "tmk_core/common/eeprom.h"
|
||||
#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
|
||||
|
||||
// HACK
|
||||
#include "keyboards/wilba_tech/via_api.h" // Temporary hack
|
||||
#include "keyboards/wilba_tech/via_keycodes.h" // Temporary hack
|
||||
|
||||
#include "via.h"
|
||||
#define EEPROM_CUSTOM_BACKLIGHT (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
|
||||
|
||||
backlight_config_t kb_backlight_config = {
|
||||
.enable = true,
|
||||
@@ -22,61 +21,29 @@ backlight_config_t kb_backlight_config = {
|
||||
.level = BACKLIGHT_LEVELS
|
||||
};
|
||||
|
||||
bool eeprom_is_valid(void)
|
||||
{
|
||||
return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC &&
|
||||
eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION);
|
||||
}
|
||||
|
||||
void eeprom_set_valid(bool valid)
|
||||
{
|
||||
eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF);
|
||||
eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF);
|
||||
}
|
||||
|
||||
void eeprom_reset(void)
|
||||
{
|
||||
eeprom_set_valid(false);
|
||||
eeconfig_disable();
|
||||
}
|
||||
|
||||
void save_backlight_config_to_eeprom(){
|
||||
void backlight_config_save(){
|
||||
eeprom_update_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
|
||||
}
|
||||
|
||||
void load_custom_config(){
|
||||
void backlight_config_load(){
|
||||
kb_backlight_config.raw = eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT);
|
||||
}
|
||||
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
void dynamic_keymap_custom_reset(void){
|
||||
void *p = (void*)(EEPROM_CUSTOM_BACKLIGHT);
|
||||
void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
|
||||
while ( p != end ) {
|
||||
eeprom_update_byte(p, 0);
|
||||
++p;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void eeprom_init_kb(void)
|
||||
// Called from via_init() if VIA_ENABLE
|
||||
// Called from matrix_init_kb() if not VIA_ENABLE
|
||||
void via_init_kb(void)
|
||||
{
|
||||
// If the EEPROM has the magic, the data is good.
|
||||
// OK to load from EEPROM.
|
||||
if (eeprom_is_valid()) {
|
||||
load_custom_config();
|
||||
if (via_eeprom_is_valid()) {
|
||||
backlight_config_load();
|
||||
} else {
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
// This resets the keymaps in EEPROM to what is in flash.
|
||||
dynamic_keymap_reset();
|
||||
// This resets the macros in EEPROM to nothing.
|
||||
dynamic_keymap_macro_reset();
|
||||
// Reset the custom stuff
|
||||
dynamic_keymap_custom_reset();
|
||||
#endif
|
||||
// Save the magic number last, in case saving was interrupted
|
||||
save_backlight_config_to_eeprom();
|
||||
eeprom_set_valid(true);
|
||||
// If the EEPROM has not been saved before, or is out of date,
|
||||
// save the default values to the EEPROM. Default values
|
||||
// come from construction of the backlight_config instance.
|
||||
backlight_config_save();
|
||||
|
||||
// DO NOT set EEPROM valid here, let caller do this
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,7 +51,13 @@ __attribute__ ((weak))
|
||||
void matrix_init_board(void);
|
||||
|
||||
void matrix_init_kb(void){
|
||||
eeprom_init_kb();
|
||||
// If VIA is disabled, we still need to load backlight settings.
|
||||
// Call via_init_kb() the same way as via_init(), with setting
|
||||
// EEPROM valid afterwards.
|
||||
#ifndef VIA_ENABLE
|
||||
via_init_kb();
|
||||
via_eeprom_set_valid(true);
|
||||
#endif // VIA_ENABLE
|
||||
/* MOSI pin*/
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
palSetPadMode(PORT_WS2812, PIN_WS2812, PAL_MODE_ALTERNATE(0));
|
||||
@@ -112,7 +85,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
kb_backlight_config.level = BACKLIGHT_LEVELS;
|
||||
}
|
||||
backlight_set(kb_backlight_config.level);
|
||||
save_backlight_config_to_eeprom();
|
||||
backlight_config_save();
|
||||
}
|
||||
return false;
|
||||
case BL_TOGG:
|
||||
@@ -123,7 +96,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
} else {
|
||||
backlight_set(0);
|
||||
}
|
||||
save_backlight_config_to_eeprom();
|
||||
backlight_config_save();
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -135,168 +108,71 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
kb_backlight_config.level = kb_backlight_config.level - 1;
|
||||
}
|
||||
backlight_set(kb_backlight_config.level);
|
||||
save_backlight_config_to_eeprom();
|
||||
backlight_config_save();
|
||||
}
|
||||
return false;
|
||||
case BL_BRTG:
|
||||
if (record->event.pressed) {
|
||||
kb_backlight_config.breathing = !kb_backlight_config.breathing;
|
||||
breathing_toggle();
|
||||
save_backlight_config_to_eeprom();
|
||||
backlight_config_save();
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
// Handle macros
|
||||
if (record->event.pressed) {
|
||||
if ( keycode >= MACRO00 && keycode <= MACRO15 )
|
||||
{
|
||||
uint8_t id = keycode - MACRO00;
|
||||
dynamic_keymap_macro_send(id);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif //DYNAMIC_KEYMAP_ENABLE
|
||||
|
||||
return process_record_user(keycode, record);;
|
||||
}
|
||||
|
||||
|
||||
// Start Dynamic Keymap code
|
||||
#ifdef RAW_ENABLE
|
||||
|
||||
void raw_hid_receive( uint8_t *data, uint8_t length )
|
||||
|
||||
//
|
||||
// In the case of VIA being disabled, we still need to check if
|
||||
// keyboard level EEPROM memory is valid before loading.
|
||||
// Thus these are copies of the same functions in VIA, since
|
||||
// the backlight settings reuse VIA's EEPROM magic/version,
|
||||
// and the ones in via.c won't be compiled in.
|
||||
//
|
||||
// Yes, this is sub-optimal, and is only here for completeness
|
||||
// (i.e. catering to the 1% of people that want wilba.tech LED bling
|
||||
// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
|
||||
//
|
||||
#ifndef VIA_ENABLE
|
||||
|
||||
bool via_eeprom_is_valid(void)
|
||||
{
|
||||
uint8_t *command_id = &(data[0]);
|
||||
uint8_t *command_data = &(data[1]);
|
||||
switch ( *command_id )
|
||||
{
|
||||
case id_get_protocol_version:
|
||||
{
|
||||
command_data[0] = PROTOCOL_VERSION >> 8;
|
||||
command_data[1] = PROTOCOL_VERSION & 0xFF;
|
||||
break;
|
||||
}
|
||||
case id_get_keyboard_value:
|
||||
{
|
||||
switch( command_data[0])
|
||||
{
|
||||
case id_uptime:
|
||||
{
|
||||
uint32_t value = timer_read32();
|
||||
command_data[1] = (value >> 24 ) & 0xFF;
|
||||
command_data[2] = (value >> 16 ) & 0xFF;
|
||||
command_data[3] = (value >> 8 ) & 0xFF;
|
||||
command_data[4] = value & 0xFF;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
*command_id = id_unhandled;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
|
||||
case id_dynamic_keymap_get_keycode:
|
||||
{
|
||||
uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] );
|
||||
command_data[3] = keycode >> 8;
|
||||
command_data[4] = keycode & 0xFF;
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_set_keycode:
|
||||
{
|
||||
dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] );
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_reset:
|
||||
{
|
||||
dynamic_keymap_reset();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_get_count:
|
||||
{
|
||||
command_data[0] = dynamic_keymap_macro_get_count();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_get_buffer_size:
|
||||
{
|
||||
uint16_t size = dynamic_keymap_macro_get_buffer_size();
|
||||
command_data[0] = size >> 8;
|
||||
command_data[1] = size & 0xFF;
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_get_buffer:
|
||||
{
|
||||
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] );
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_set_buffer:
|
||||
{
|
||||
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] );
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_reset:
|
||||
{
|
||||
dynamic_keymap_macro_reset();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_get_layer_count:
|
||||
{
|
||||
command_data[0] = dynamic_keymap_get_layer_count();
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_get_buffer:
|
||||
{
|
||||
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
dynamic_keymap_get_buffer( offset, size, &command_data[3] );
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_set_buffer:
|
||||
{
|
||||
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
dynamic_keymap_set_buffer( offset, size, &command_data[3] );
|
||||
break;
|
||||
}
|
||||
#endif // DYNAMIC_KEYMAP_ENABLE
|
||||
case id_eeprom_reset:
|
||||
{
|
||||
eeprom_reset();
|
||||
break;
|
||||
}
|
||||
case id_bootloader_jump:
|
||||
{
|
||||
// Need to send data back before the jump
|
||||
// Informs host that the command is handled
|
||||
raw_hid_send( data, length );
|
||||
// Give host time to read it
|
||||
wait_ms(100);
|
||||
bootloader_jump();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Unhandled message.
|
||||
*command_id = id_unhandled;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Return same buffer with values changed
|
||||
raw_hid_send( data, length );
|
||||
char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
|
||||
uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
|
||||
uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
|
||||
uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
|
||||
|
||||
return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
|
||||
eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
|
||||
eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
|
||||
}
|
||||
|
||||
#endif
|
||||
// Sets VIA/keyboard level usage of EEPROM to valid/invalid
|
||||
// Keyboard level code (eg. via_init_kb()) should not call this
|
||||
void via_eeprom_set_valid(bool valid)
|
||||
{
|
||||
char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
|
||||
uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
|
||||
uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
|
||||
uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
|
||||
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
|
||||
}
|
||||
|
||||
void via_eeprom_reset(void)
|
||||
{
|
||||
// Set the VIA specific EEPROM state as invalid.
|
||||
via_eeprom_set_valid(false);
|
||||
// Set the TMK/QMK EEPROM state as invalid.
|
||||
eeconfig_disable();
|
||||
}
|
||||
|
||||
#endif // VIA_ENABLE
|
||||
@@ -19,5 +19,5 @@ void backlight_set(uint8_t level);
|
||||
bool is_breathing(void);
|
||||
void breathing_enable(void);
|
||||
void breathing_disable(void);
|
||||
void load_custom_config(void);
|
||||
void save_backlight_config_to_eeprom(void);
|
||||
void backlight_config_load(void);
|
||||
void backlight_config_save(void);
|
||||
|
||||
@@ -58,25 +58,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define PIN_WS2812 15
|
||||
#define WS2812_SPI SPID2
|
||||
|
||||
// EEPROM usage
|
||||
// TODO: refactor with new user EEPROM code (coming soon)
|
||||
#define EEPROM_MAGIC 0x451F
|
||||
#define EEPROM_MAGIC_ADDR 40
|
||||
// Bump this every time we change what we store
|
||||
// This will automatically reset the EEPROM with defaults
|
||||
// and avoid loading invalid data from the EEPROM
|
||||
#define EEPROM_VERSION 0x02
|
||||
#define EEPROM_VERSION_ADDR 42
|
||||
|
||||
|
||||
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
|
||||
// Dynamic macro starts after dynamic keymaps (43+(4*4*15*2)) = (43+480) = 523
|
||||
// start + layer * rows * col * 2c
|
||||
#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
|
||||
#define EEPROM_CUSTOM_BACKLIGHT 523
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 524
|
||||
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 200
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
// Backlight config starts after VIA's EEPROM usage,
|
||||
// dynamic keymaps start after this.
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
|
||||
524
keyboards/cheshire/curiosity/chconf.h
Normal file
524
keyboards/cheshire/curiosity/chconf.h
Normal file
@@ -0,0 +1,524 @@
|
||||
/*
|
||||
ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file templates/chconf.h
|
||||
* @brief Configuration file template.
|
||||
* @details A copy of this file must be placed in each project directory, it
|
||||
* contains the application specific kernel settings.
|
||||
*
|
||||
* @addtogroup config
|
||||
* @details Kernel related settings and hooks.
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef CHCONF_H
|
||||
#define CHCONF_H
|
||||
|
||||
#define _CHIBIOS_RT_CONF_
|
||||
|
||||
/*===========================================================================*/
|
||||
/**
|
||||
* @name System timers settings
|
||||
* @{
|
||||
*/
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief System time counter resolution.
|
||||
* @note Allowed values are 16 or 32 bits.
|
||||
*/
|
||||
#define CH_CFG_ST_RESOLUTION 32
|
||||
|
||||
/**
|
||||
* @brief System tick frequency.
|
||||
* @details Frequency of the system timer that drives the system ticks. This
|
||||
* setting also defines the system tick time unit.
|
||||
*/
|
||||
#define CH_CFG_ST_FREQUENCY 10000
|
||||
|
||||
/**
|
||||
* @brief Time delta constant for the tick-less mode.
|
||||
* @note If this value is zero then the system uses the classic
|
||||
* periodic tick. This value represents the minimum number
|
||||
* of ticks that is safe to specify in a timeout directive.
|
||||
* The value one is not valid, timeouts are rounded up to
|
||||
* this value.
|
||||
*/
|
||||
#define CH_CFG_ST_TIMEDELTA 2
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/**
|
||||
* @name Kernel parameters and options
|
||||
* @{
|
||||
*/
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Round robin interval.
|
||||
* @details This constant is the number of system ticks allowed for the
|
||||
* threads before preemption occurs. Setting this value to zero
|
||||
* disables the preemption for threads with equal priority and the
|
||||
* round robin becomes cooperative. Note that higher priority
|
||||
* threads can still preempt, the kernel is always preemptive.
|
||||
* @note Disabling the round robin preemption makes the kernel more compact
|
||||
* and generally faster.
|
||||
* @note The round robin preemption is not supported in tickless mode and
|
||||
* must be set to zero in that case.
|
||||
*/
|
||||
#define CH_CFG_TIME_QUANTUM 0
|
||||
|
||||
/**
|
||||
* @brief Managed RAM size.
|
||||
* @details Size of the RAM area to be managed by the OS. If set to zero
|
||||
* then the whole available RAM is used. The core memory is made
|
||||
* available to the heap allocator and/or can be used directly through
|
||||
* the simplified core memory allocator.
|
||||
*
|
||||
* @note In order to let the OS manage the whole RAM the linker script must
|
||||
* provide the @p __heap_base__ and @p __heap_end__ symbols.
|
||||
* @note Requires @p CH_CFG_USE_MEMCORE.
|
||||
*/
|
||||
#define CH_CFG_MEMCORE_SIZE 0
|
||||
|
||||
/**
|
||||
* @brief Idle thread automatic spawn suppression.
|
||||
* @details When this option is activated the function @p chSysInit()
|
||||
* does not spawn the idle thread. The application @p main()
|
||||
* function becomes the idle thread and must implement an
|
||||
* infinite loop.
|
||||
*/
|
||||
#define CH_CFG_NO_IDLE_THREAD FALSE
|
||||
|
||||
/* Use __WFI in the idle thread for waiting. Does lower the power
|
||||
* consumption. */
|
||||
#define CORTEX_ENABLE_WFI_IDLE TRUE
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/**
|
||||
* @name Performance options
|
||||
* @{
|
||||
*/
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief OS optimization.
|
||||
* @details If enabled then time efficient rather than space efficient code
|
||||
* is used when two possible implementations exist.
|
||||
*
|
||||
* @note This is not related to the compiler optimization options.
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_OPTIMIZE_SPEED FALSE
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/**
|
||||
* @name Subsystem options
|
||||
* @{
|
||||
*/
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Time Measurement APIs.
|
||||
* @details If enabled then the time measurement APIs are included in
|
||||
* the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_TM FALSE
|
||||
|
||||
/**
|
||||
* @brief Threads registry APIs.
|
||||
* @details If enabled then the registry APIs are included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_REGISTRY TRUE
|
||||
|
||||
/**
|
||||
* @brief Threads synchronization APIs.
|
||||
* @details If enabled then the @p chThdWait() function is included in
|
||||
* the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_WAITEXIT TRUE
|
||||
|
||||
/**
|
||||
* @brief Semaphores APIs.
|
||||
* @details If enabled then the Semaphores APIs are included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_SEMAPHORES TRUE
|
||||
|
||||
/**
|
||||
* @brief Semaphores queuing mode.
|
||||
* @details If enabled then the threads are enqueued on semaphores by
|
||||
* priority rather than in FIFO order.
|
||||
*
|
||||
* @note The default is @p FALSE. Enable this if you have special
|
||||
* requirements.
|
||||
* @note Requires @p CH_CFG_USE_SEMAPHORES.
|
||||
*/
|
||||
#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
|
||||
|
||||
/**
|
||||
* @brief Mutexes APIs.
|
||||
* @details If enabled then the mutexes APIs are included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_MUTEXES TRUE
|
||||
|
||||
/**
|
||||
* @brief Enables recursive behavior on mutexes.
|
||||
* @note Recursive mutexes are heavier and have an increased
|
||||
* memory footprint.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
* @note Requires @p CH_CFG_USE_MUTEXES.
|
||||
*/
|
||||
#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
|
||||
|
||||
/**
|
||||
* @brief Conditional Variables APIs.
|
||||
* @details If enabled then the conditional variables APIs are included
|
||||
* in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
* @note Requires @p CH_CFG_USE_MUTEXES.
|
||||
*/
|
||||
#define CH_CFG_USE_CONDVARS TRUE
|
||||
|
||||
/**
|
||||
* @brief Conditional Variables APIs with timeout.
|
||||
* @details If enabled then the conditional variables APIs with timeout
|
||||
* specification are included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
* @note Requires @p CH_CFG_USE_CONDVARS.
|
||||
*/
|
||||
#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
|
||||
|
||||
/**
|
||||
* @brief Events Flags APIs.
|
||||
* @details If enabled then the event flags APIs are included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_EVENTS TRUE
|
||||
|
||||
/**
|
||||
* @brief Events Flags APIs with timeout.
|
||||
* @details If enabled then the events APIs with timeout specification
|
||||
* are included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
* @note Requires @p CH_CFG_USE_EVENTS.
|
||||
*/
|
||||
#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
|
||||
|
||||
/**
|
||||
* @brief Synchronous Messages APIs.
|
||||
* @details If enabled then the synchronous messages APIs are included
|
||||
* in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_MESSAGES TRUE
|
||||
|
||||
/**
|
||||
* @brief Synchronous Messages queuing mode.
|
||||
* @details If enabled then messages are served by priority rather than in
|
||||
* FIFO order.
|
||||
*
|
||||
* @note The default is @p FALSE. Enable this if you have special
|
||||
* requirements.
|
||||
* @note Requires @p CH_CFG_USE_MESSAGES.
|
||||
*/
|
||||
#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
|
||||
|
||||
/**
|
||||
* @brief Mailboxes APIs.
|
||||
* @details If enabled then the asynchronous messages (mailboxes) APIs are
|
||||
* included in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
* @note Requires @p CH_CFG_USE_SEMAPHORES.
|
||||
*/
|
||||
#define CH_CFG_USE_MAILBOXES TRUE
|
||||
|
||||
/**
|
||||
* @brief Core Memory Manager APIs.
|
||||
* @details If enabled then the core memory manager APIs are included
|
||||
* in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_MEMCORE FALSE
|
||||
|
||||
/**
|
||||
* @brief Heap Allocator APIs.
|
||||
* @details If enabled then the memory heap allocator APIs are included
|
||||
* in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
* @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
|
||||
* @p CH_CFG_USE_SEMAPHORES.
|
||||
* @note Mutexes are recommended.
|
||||
*/
|
||||
#define CH_CFG_USE_HEAP FALSE
|
||||
|
||||
/**
|
||||
* @brief Memory Pools Allocator APIs.
|
||||
* @details If enabled then the memory pools allocator APIs are included
|
||||
* in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#define CH_CFG_USE_MEMPOOLS FALSE
|
||||
|
||||
/**
|
||||
* @brief Dynamic Threads APIs.
|
||||
* @details If enabled then the dynamic threads creation APIs are included
|
||||
* in the kernel.
|
||||
*
|
||||
* @note The default is @p TRUE.
|
||||
* @note Requires @p CH_CFG_USE_WAITEXIT.
|
||||
* @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
|
||||
*/
|
||||
#define CH_CFG_USE_DYNAMIC FALSE
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/**
|
||||
* @name Debug options
|
||||
* @{
|
||||
*/
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Debug option, kernel statistics.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#define CH_DBG_STATISTICS FALSE
|
||||
|
||||
/**
|
||||
* @brief Debug option, system state check.
|
||||
* @details If enabled the correct call protocol for system APIs is checked
|
||||
* at runtime.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#define CH_DBG_SYSTEM_STATE_CHECK FALSE
|
||||
|
||||
/**
|
||||
* @brief Debug option, parameters checks.
|
||||
* @details If enabled then the checks on the API functions input
|
||||
* parameters are activated.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#define CH_DBG_ENABLE_CHECKS FALSE
|
||||
|
||||
/**
|
||||
* @brief Debug option, consistency checks.
|
||||
* @details If enabled then all the assertions in the kernel code are
|
||||
* activated. This includes consistency checks inside the kernel,
|
||||
* runtime anomalies and port-defined checks.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#define CH_DBG_ENABLE_ASSERTS FALSE
|
||||
|
||||
/**
|
||||
* @brief Debug option, trace buffer.
|
||||
* @details If enabled then the trace buffer is activated.
|
||||
*
|
||||
* @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
|
||||
*/
|
||||
#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
|
||||
|
||||
/**
|
||||
* @brief Trace buffer entries.
|
||||
* @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
|
||||
* different from @p CH_DBG_TRACE_MASK_DISABLED.
|
||||
*/
|
||||
#define CH_DBG_TRACE_BUFFER_SIZE 128
|
||||
|
||||
/**
|
||||
* @brief Debug option, stack checks.
|
||||
* @details If enabled then a runtime stack check is performed.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
* @note The stack check is performed in a architecture/port dependent way.
|
||||
* It may not be implemented or some ports.
|
||||
* @note The default failure mode is to halt the system with the global
|
||||
* @p panic_msg variable set to @p NULL.
|
||||
*/
|
||||
#define CH_DBG_ENABLE_STACK_CHECK FALSE
|
||||
|
||||
/**
|
||||
* @brief Debug option, stacks initialization.
|
||||
* @details If enabled then the threads working area is filled with a byte
|
||||
* value when a thread is created. This can be useful for the
|
||||
* runtime measurement of the used stack.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#define CH_DBG_FILL_THREADS FALSE
|
||||
|
||||
/**
|
||||
* @brief Debug option, threads profiling.
|
||||
* @details If enabled then a field is added to the @p thread_t structure that
|
||||
* counts the system ticks occurred while executing the thread.
|
||||
*
|
||||
* @note The default is @p FALSE.
|
||||
* @note This debug option is not currently compatible with the
|
||||
* tickless mode.
|
||||
*/
|
||||
#define CH_DBG_THREADS_PROFILING FALSE
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/**
|
||||
* @name Kernel hooks
|
||||
* @{
|
||||
*/
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Threads descriptor structure extension.
|
||||
* @details User fields added to the end of the @p thread_t structure.
|
||||
*/
|
||||
#define CH_CFG_THREAD_EXTRA_FIELDS \
|
||||
/* Add threads custom fields here.*/
|
||||
|
||||
/**
|
||||
* @brief Threads initialization hook.
|
||||
* @details User initialization code added to the @p chThdInit() API.
|
||||
*
|
||||
* @note It is invoked from within @p chThdInit() and implicitly from all
|
||||
* the threads creation APIs.
|
||||
*/
|
||||
#define CH_CFG_THREAD_INIT_HOOK(tp) { \
|
||||
/* Add threads initialization code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Threads finalization hook.
|
||||
* @details User finalization code added to the @p chThdExit() API.
|
||||
*/
|
||||
#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
|
||||
/* Add threads finalization code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Context switch hook.
|
||||
* @details This hook is invoked just before switching between threads.
|
||||
*/
|
||||
#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
|
||||
/* Context switch code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ISR enter hook.
|
||||
*/
|
||||
#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
|
||||
/* IRQ prologue code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ISR exit hook.
|
||||
*/
|
||||
#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
|
||||
/* IRQ epilogue code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Idle thread enter hook.
|
||||
* @note This hook is invoked within a critical zone, no OS functions
|
||||
* should be invoked from here.
|
||||
* @note This macro can be used to activate a power saving mode.
|
||||
*/
|
||||
#define CH_CFG_IDLE_ENTER_HOOK() { \
|
||||
/* Idle-enter code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Idle thread leave hook.
|
||||
* @note This hook is invoked within a critical zone, no OS functions
|
||||
* should be invoked from here.
|
||||
* @note This macro can be used to deactivate a power saving mode.
|
||||
*/
|
||||
#define CH_CFG_IDLE_LEAVE_HOOK() { \
|
||||
/* Idle-leave code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Idle Loop hook.
|
||||
* @details This hook is continuously invoked by the idle thread loop.
|
||||
*/
|
||||
#define CH_CFG_IDLE_LOOP_HOOK() { \
|
||||
/* Idle loop code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief System tick event hook.
|
||||
* @details This hook is invoked in the system tick handler immediately
|
||||
* after processing the virtual timers queue.
|
||||
*/
|
||||
#define CH_CFG_SYSTEM_TICK_HOOK() { \
|
||||
/* System tick event code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief System halt hook.
|
||||
* @details This hook is invoked in case to a system halting error before
|
||||
* the system is halted.
|
||||
*/
|
||||
#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
|
||||
/* System halt code here.*/ \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Trace hook.
|
||||
* @details This hook is invoked each time a new record is written in the
|
||||
* trace buffer.
|
||||
*/
|
||||
#define CH_CFG_TRACE_HOOK(tep) { \
|
||||
/* Trace code here.*/ \
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Port-specific settings (override port settings defaulted in chcore.h). */
|
||||
/*===========================================================================*/
|
||||
|
||||
#endif /* CHCONF_H */
|
||||
|
||||
/** @} */
|
||||
50
keyboards/cheshire/curiosity/config.h
Normal file
50
keyboards/cheshire/curiosity/config.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
Copyright 2019 zvecr<git@zvecr.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
#define VENDOR_ID 0xCAFE
|
||||
#define PRODUCT_ID 0x0FAD
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER Nightingale Studios/Cheshire Designs
|
||||
#define PRODUCT Curiosity
|
||||
#define DESCRIPTION Curiosity
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 5
|
||||
#define MATRIX_COLS 16
|
||||
|
||||
#define MATRIX_ROW_PINS { B13, B14, A4, A2, A1 }
|
||||
#define MATRIX_COL_PINS { B11, B10, B2, B1, B0, A7, A6, A5, B9, B8, B7, B6, B5, B4, B3, A15 }
|
||||
#define UNUSED_PINS
|
||||
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
|
||||
#define RGB_DI_PIN B15
|
||||
#define RGBLED_NUM 14
|
||||
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
|
||||
#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
|
||||
17
keyboards/cheshire/curiosity/curiosity.c
Normal file
17
keyboards/cheshire/curiosity/curiosity.c
Normal file
@@ -0,0 +1,17 @@
|
||||
#include "curiosity.h"
|
||||
|
||||
void matrix_init_board(void){
|
||||
setPinOutput(A8);
|
||||
setPinOutput(A9);
|
||||
setPinOutput(A10);
|
||||
}
|
||||
|
||||
bool led_update_kb(led_t led_state) {
|
||||
bool runDefault = led_update_user(led_state);
|
||||
if (runDefault) {
|
||||
writePin(A8, !led_state.num_lock);
|
||||
writePin(A9, !led_state.caps_lock);
|
||||
writePin(A10, !led_state.scroll_lock);
|
||||
}
|
||||
return runDefault;
|
||||
}
|
||||
42
keyboards/cheshire/curiosity/curiosity.h
Normal file
42
keyboards/cheshire/curiosity/curiosity.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/* Copyright 2019 zvecr<git@zvecr.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
#define ____ KC_NO
|
||||
|
||||
/* 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_default( \
|
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K108, K109, K110, K111, K112, K113, K114, K115, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K208, K209, K210, K211, K212, K213, K215, \
|
||||
K301, K302, K303, K304, K305, K306, K308, K309, K310, K311, K312, K313, K314, K315, \
|
||||
K401, K403, K405, K406, K409, K411, K414 \
|
||||
) \
|
||||
{ \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015}, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, ____, K108, K109, K110, K111, K112, K113, K114, K115}, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, ____, K208, K209, K210, K211, K212, K213, ____, K215}, \
|
||||
{ ____, K301, K302, K303, K304, K305, K306, ____, K308, K309, K310, K311, K312, K313, K314, K315}, \
|
||||
{ ____, K401, ____, K403, ____, K405, K406, ____, ____, K409, ____, K411, ____, ____, K414, ____}, \
|
||||
}
|
||||
353
keyboards/cheshire/curiosity/halconf.h
Normal file
353
keyboards/cheshire/curiosity/halconf.h
Normal file
@@ -0,0 +1,353 @@
|
||||
/*
|
||||
ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file templates/halconf.h
|
||||
* @brief HAL configuration header.
|
||||
* @details HAL configuration file, this file allows to enable or disable the
|
||||
* various device drivers from your application. You may also use
|
||||
* this file in order to override the device drivers default settings.
|
||||
*
|
||||
* @addtogroup HAL_CONF
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _HALCONF_H_
|
||||
#define _HALCONF_H_
|
||||
|
||||
#include "mcuconf.h"
|
||||
|
||||
/**
|
||||
* @brief Enables the PAL subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_PAL TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the ADC subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_ADC FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the CAN subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_CAN FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the DAC subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_DAC FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the EXT subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_EXT FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the GPT subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_GPT FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the I2C subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_I2C FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the I2S subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_I2S FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the ICU subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_ICU FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the MAC subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_MAC FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the MMC_SPI subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_MMC_SPI FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the PWM subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_PWM FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the RTC subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_RTC FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the SDC subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_SDC FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the SERIAL subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_SERIAL FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the SERIAL over USB subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_SERIAL_USB FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the SPI subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_SPI FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the UART subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_UART FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the USB subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_USB TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the WDG subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_WDG FALSE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* ADC driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Enables synchronous APIs.
|
||||
* @note Disabling this option saves both code and data space.
|
||||
*/
|
||||
#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
|
||||
#define ADC_USE_WAIT TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
|
||||
* @note Disabling this option saves both code and data space.
|
||||
*/
|
||||
#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||
#define ADC_USE_MUTUAL_EXCLUSION TRUE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* CAN driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Sleep mode related APIs inclusion switch.
|
||||
*/
|
||||
#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
|
||||
#define CAN_USE_SLEEP_MODE TRUE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* I2C driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Enables the mutual exclusion APIs on the I2C bus.
|
||||
*/
|
||||
#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||
#define I2C_USE_MUTUAL_EXCLUSION TRUE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* MAC driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Enables an event sources for incoming packets.
|
||||
*/
|
||||
#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
|
||||
#define MAC_USE_ZERO_COPY FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables an event sources for incoming packets.
|
||||
*/
|
||||
#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
|
||||
#define MAC_USE_EVENTS TRUE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* MMC_SPI driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Delays insertions.
|
||||
* @details If enabled this options inserts delays into the MMC waiting
|
||||
* routines releasing some extra CPU time for the threads with
|
||||
* lower priority, this may slow down the driver a bit however.
|
||||
* This option is recommended also if the SPI driver does not
|
||||
* use a DMA channel and heavily loads the CPU.
|
||||
*/
|
||||
#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
|
||||
#define MMC_NICE_WAITING TRUE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* SDC driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Number of initialization attempts before rejecting the card.
|
||||
* @note Attempts are performed at 10mS intervals.
|
||||
*/
|
||||
#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
|
||||
#define SDC_INIT_RETRY 100
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Include support for MMC cards.
|
||||
* @note MMC support is not yet implemented so this option must be kept
|
||||
* at @p FALSE.
|
||||
*/
|
||||
#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
|
||||
#define SDC_MMC_SUPPORT FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Delays insertions.
|
||||
* @details If enabled this options inserts delays into the MMC waiting
|
||||
* routines releasing some extra CPU time for the threads with
|
||||
* lower priority, this may slow down the driver a bit however.
|
||||
*/
|
||||
#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
|
||||
#define SDC_NICE_WAITING TRUE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* SERIAL driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Default bit rate.
|
||||
* @details Configuration parameter, this is the baud rate selected for the
|
||||
* default configuration.
|
||||
*/
|
||||
#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
|
||||
#define SERIAL_DEFAULT_BITRATE 38400
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Serial buffers size.
|
||||
* @details Configuration parameter, you can change the depth of the queue
|
||||
* buffers depending on the requirements of your application.
|
||||
* @note The default is 64 bytes for both the transmission and receive
|
||||
* buffers.
|
||||
*/
|
||||
#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
|
||||
#define SERIAL_BUFFERS_SIZE 16
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* SERIAL_USB driver related setting. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Serial over USB buffers size.
|
||||
* @details Configuration parameter, the buffer size must be a multiple of
|
||||
* the USB data endpoint maximum packet size.
|
||||
* @note The default is 64 bytes for both the transmission and receive
|
||||
* buffers.
|
||||
*/
|
||||
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
|
||||
#define SERIAL_USB_BUFFERS_SIZE 1
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* SPI driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Enables synchronous APIs.
|
||||
* @note Disabling this option saves both code and data space.
|
||||
*/
|
||||
#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
|
||||
#define SPI_USE_WAIT TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
|
||||
* @note Disabling this option saves both code and data space.
|
||||
*/
|
||||
#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||||
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* USB driver related settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Enables synchronous APIs.
|
||||
* @note Disabling this option saves both code and data space.
|
||||
*/
|
||||
#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
|
||||
#define USB_USE_WAIT TRUE
|
||||
#endif
|
||||
|
||||
#endif /* _HALCONF_H_ */
|
||||
|
||||
/** @} */
|
||||
82
keyboards/cheshire/curiosity/info.json
Normal file
82
keyboards/cheshire/curiosity/info.json
Normal file
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"keyboard_name": "Curiosity",
|
||||
"maintainer": "zvecr",
|
||||
"width": 19.75,
|
||||
"height": 5.25,
|
||||
"layouts": {
|
||||
"LAYOUT_default": {
|
||||
"layout": [
|
||||
{"label":"Esc", "x":0.5, "y":0},
|
||||
{"label":"`", "x":1.75, "y":0.25},
|
||||
{"label":"1", "x":2.75, "y":0.25},
|
||||
{"label":"2", "x":3.75, "y":0},
|
||||
{"label":"3", "x":4.75, "y":0.25},
|
||||
{"label":"4", "x":5.75, "y":0.25},
|
||||
{"label":"5", "x":6.75, "y":0.25},
|
||||
{"label":"6", "x":7.75, "y":0.25},
|
||||
{"label":"7", "x":11, "y":0.25},
|
||||
{"label":"8", "x":12, "y":0.25},
|
||||
{"label":"9", "x":13, "y":0.25},
|
||||
{"label":"0", "x":14, "y":0.25},
|
||||
{"label":"-", "x":15, "y":0},
|
||||
{"label":"=", "x":16, "y":0.25},
|
||||
{"label":"Del", "x":17, "y":0.25},
|
||||
{"label":"Backspace", "x":18, "y":0.25},
|
||||
|
||||
{"label":"PgUp", "x":0.25, "y":1},
|
||||
{"label":"Tab", "x":1.5, "y":1.25, "w":1.5},
|
||||
{"label":"Q", "x":3, "y":1.25},
|
||||
{"label":"W", "x":4.25, "y":1.25},
|
||||
{"label":"E", "x":5.25, "y":1.25},
|
||||
{"label":"R", "x":6.25, "y":1.25},
|
||||
{"label":"T", "x":7.25, "y":1.25},
|
||||
{"label":"Y", "x":10.5, "y":1.25},
|
||||
{"label":"U", "x":11.5, "y":1.25},
|
||||
{"label":"I", "x":12.5, "y":1.25},
|
||||
{"label":"O", "x":13.5, "y":1.25},
|
||||
{"label":"P", "x":14.75, "y":1.25},
|
||||
{"label":"{", "x":15.75, "y":1.25},
|
||||
{"label":"}", "x":16.75, "y":1.25},
|
||||
{"label":"|", "x":17.75, "y":1.25, "w":1.5},
|
||||
|
||||
{"label":"PgDn", "x":0, "y":2},
|
||||
{"label":"Caps Lock", "x":1.5, "y":2.25, "w":1.75},
|
||||
{"label":"A", "x":3.25, "y":2.25},
|
||||
{"label":"S", "x":4.5, "y":2.25},
|
||||
{"label":"D", "x":5.5, "y":2.25},
|
||||
{"label":"F", "x":6.5, "y":2.25},
|
||||
{"label":"G", "x":7.5, "y":2.25},
|
||||
{"label":"H", "x":10.75, "y":2.25},
|
||||
{"label":"J", "x":11.75, "y":2.25},
|
||||
{"label":"K", "x":12.75, "y":2.25},
|
||||
{"label":"L", "x":13.75, "y":2.25},
|
||||
{"label":":", "x":15.25, "y":2.25},
|
||||
{"label":"\"", "x":16.25, "y":2.25},
|
||||
{"label":"Enter", "x":17.25, "y":2.25, "w":2.25},
|
||||
|
||||
{"label":"Shift", "x":1.5, "y":3.25, "w":2.25},
|
||||
{"label":"Z", "x":3.75, "y":3.25},
|
||||
{"label":"X", "x":5, "y":3.25},
|
||||
{"label":"C", "x":6, "y":3.25},
|
||||
{"label":"V", "x":7, "y":3.25},
|
||||
{"label":"B", "x":8, "y":3.25},
|
||||
{"label":"Fn", "x":10.25, "y":3.25},
|
||||
{"label":"N", "x":11.25, "y":3.25},
|
||||
{"label":"M", "x":12.25, "y":3.25},
|
||||
{"label":"<", "x":13.25, "y":3.25},
|
||||
{"label":">", "x":15, "y":3.25},
|
||||
{"label":"?", "x":16, "y":3.25},
|
||||
{"label":"Shift", "x":17, "y":3.25, "w":1.75},
|
||||
{"label":"Fn", "x":18.75, "y":3.25},
|
||||
|
||||
{"label":"Ctrl", "x":1.5, "y":4.25, "w":1.5},
|
||||
{"label":"Alt", "x":5, "y":4.25, "w":1.5},
|
||||
{"label":"Space", "x":6.5, "y":4.25, "w":2},
|
||||
{"label":"Menu", "x":8.5, "y":4.25},
|
||||
{"label":"Space", "x":10.25, "y":4.25, "w":2.75},
|
||||
{"label":"Alt", "x":13, "y":4.25, "w":1.5},
|
||||
{"label":"Ctrl", "x":18, "y":4.25, "w":1.5}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user