Merge branch 'zmkfirmware:main' into main
This commit is contained in:
commit
2fa63e36dc
18 changed files with 170 additions and 142 deletions
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -2,5 +2,6 @@
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"*.overlay": "dts",
|
"*.overlay": "dts",
|
||||||
"*.keymap": "dts"
|
"*.keymap": "dts"
|
||||||
}
|
},
|
||||||
|
"python.formatting.provider": "black"
|
||||||
}
|
}
|
|
@ -3,5 +3,5 @@
|
||||||
board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse")
|
board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse")
|
||||||
board_runner_args(jlink "--device=STM32F303CC" "--speed=4000")
|
board_runner_args(jlink "--device=STM32F303CC" "--speed=4000")
|
||||||
|
|
||||||
include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake)
|
include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake)
|
||||||
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
|
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
|
||||||
|
|
|
@ -29,7 +29,8 @@
|
||||||
ext-power {
|
ext-power {
|
||||||
compatible = "zmk,ext-power-generic";
|
compatible = "zmk,ext-power-generic";
|
||||||
label = "EXT_POWER";
|
label = "EXT_POWER";
|
||||||
control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
|
control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
|
||||||
|
init-delay-ms = <50>;
|
||||||
};
|
};
|
||||||
|
|
||||||
vbatt {
|
vbatt {
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
compatible = "zmk,ext-power-generic";
|
compatible = "zmk,ext-power-generic";
|
||||||
label = "EXT_POWER";
|
label = "EXT_POWER";
|
||||||
control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
|
control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
|
||||||
init-delay-ms = <10>;
|
init-delay-ms = <50>;
|
||||||
};
|
};
|
||||||
|
|
||||||
vbatt {
|
vbatt {
|
||||||
|
|
|
@ -28,21 +28,20 @@ echo "Running $testcase:"
|
||||||
|
|
||||||
west build -d build/$testcase -b native_posix -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1
|
west build -d build/$testcase -b native_posix -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1
|
||||||
if [ $? -gt 0 ]; then
|
if [ $? -gt 0 ]; then
|
||||||
echo "FAIL: $testcase did not build" >> ./build/tests/pass-fail.log
|
echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log
|
||||||
exit 1
|
exit 1
|
||||||
else
|
fi
|
||||||
|
|
||||||
./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log
|
./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log
|
||||||
diff -au $testcase/keycode_events.snapshot build/$testcase/keycode_events.log
|
diff -au $testcase/keycode_events.snapshot build/$testcase/keycode_events.log
|
||||||
if [ $? -gt 0 ]; then
|
if [ $? -gt 0 ]; then
|
||||||
if [ -f $testcase/pending ]; then
|
if [ -f $testcase/pending ]; then
|
||||||
echo "PEND: $testcase" >> ./build/tests/pass-fail.log
|
echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log
|
||||||
exit 0
|
exit 0
|
||||||
else
|
fi
|
||||||
echo "FAIL: $testcase" >> ./build/tests/pass-fail.log
|
echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
echo "PASS: $testcase" >> ./build/tests/pass-fail.log
|
echo "PASS: $testcase" | tee -a ./build/tests/pass-fail.log
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
|
@ -1,15 +1,13 @@
|
||||||
# Copyright (c) 2021 The ZMK Contributors
|
# Copyright (c) 2021 The ZMK Contributors
|
||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
'''Metadata command for ZMK.'''
|
"""Metadata command for ZMK."""
|
||||||
|
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
import glob
|
import glob
|
||||||
import json
|
import json
|
||||||
from jsonschema import validate, ValidationError
|
import jsonschema
|
||||||
import os
|
|
||||||
import sys
|
import sys
|
||||||
import yaml
|
import yaml
|
||||||
from textwrap import dedent # just for nicer code indentation
|
|
||||||
|
|
||||||
from west.commands import WestCommand
|
from west.commands import WestCommand
|
||||||
from west import log # use this for user output
|
from west import log # use this for user output
|
||||||
|
@ -18,42 +16,49 @@ from west import log # use this for user output
|
||||||
class Metadata(WestCommand):
|
class Metadata(WestCommand):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(
|
super().__init__(
|
||||||
'metadata', # gets stored as self.name
|
name="metadata",
|
||||||
'ZMK hardware metadata commands', # self.help
|
help="ZMK hardware metadata commands",
|
||||||
# self.description:
|
description="Operate on the board/shield metadata.",
|
||||||
dedent('''Operate on the board/shield metadata.'''))
|
)
|
||||||
|
|
||||||
def do_add_parser(self, parser_adder):
|
def do_add_parser(self, parser_adder):
|
||||||
parser = parser_adder.add_parser(self.name,
|
parser = parser_adder.add_parser(
|
||||||
help=self.help,
|
self.name, help=self.help, description=self.description
|
||||||
description=self.description)
|
)
|
||||||
|
|
||||||
parser.add_argument('subcommand', default="check",
|
parser.add_argument(
|
||||||
help='The subcommand to run. Defaults to "check".', nargs="?")
|
"subcommand",
|
||||||
|
default="check",
|
||||||
|
help='The subcommand to run. Defaults to "check".',
|
||||||
|
nargs="?",
|
||||||
|
)
|
||||||
return parser # gets stored as self.parser
|
return parser # gets stored as self.parser
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def schema(self):
|
def schema(self):
|
||||||
return json.load(
|
return json.load(open("../schema/hardware-metadata.schema.json", "r"))
|
||||||
open("../schema/hardware-metadata.schema.json", 'r'))
|
|
||||||
|
|
||||||
def validate_file(self, file):
|
def validate_file(self, file):
|
||||||
print("Validating: " + file)
|
print("Validating: " + file)
|
||||||
with open(file, 'r') as stream:
|
with open(file, "r") as stream:
|
||||||
try:
|
try:
|
||||||
validate(yaml.safe_load(stream), self.schema)
|
jsonschema.validate(yaml.safe_load(stream), self.schema)
|
||||||
except yaml.YAMLError as exc:
|
except yaml.YAMLError as exc:
|
||||||
print("Failed loading metadata yaml: " + file)
|
print("Failed loading metadata yaml: " + file)
|
||||||
print(exc)
|
print(exc)
|
||||||
return False
|
return False
|
||||||
except ValidationError as vexc:
|
except jsonschema.ValidationError as vexc:
|
||||||
print("Failed validation of: " + file)
|
print("Failed validation of: " + file)
|
||||||
print(vexc)
|
print(vexc)
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def do_run(self, args, unknown_args):
|
def do_run(self, args, unknown_args):
|
||||||
status = all([self.validate_file(f) for f in glob.glob(
|
status = all(
|
||||||
"boards/**/*.zmk.yml", recursive=True)])
|
[
|
||||||
|
self.validate_file(f)
|
||||||
|
for f in glob.glob("boards/**/*.zmk.yml", recursive=True)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
sys.exit(0 if status else 1)
|
sys.exit(0 if status else 1)
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
# Copyright (c) 2020 The ZMK Contributors
|
# Copyright (c) 2020 The ZMK Contributors
|
||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
'''Test runner for ZMK.'''
|
"""Test runner for ZMK."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
from textwrap import dedent # just for nicer code indentation
|
|
||||||
|
|
||||||
from west.commands import WestCommand
|
from west.commands import WestCommand
|
||||||
from west import log # use this for user output
|
from west import log # use this for user output
|
||||||
|
@ -13,23 +12,30 @@ from west import log # use this for user output
|
||||||
class Test(WestCommand):
|
class Test(WestCommand):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(
|
super().__init__(
|
||||||
'test', # gets stored as self.name
|
name="test",
|
||||||
'run ZMK testsuite', # self.help
|
help="run ZMK testsuite",
|
||||||
# self.description:
|
description="Run the ZMK testsuite.",
|
||||||
dedent('''Run the ZMK testsuite.'''))
|
)
|
||||||
|
|
||||||
def do_add_parser(self, parser_adder):
|
def do_add_parser(self, parser_adder):
|
||||||
parser = parser_adder.add_parser(self.name,
|
parser = parser_adder.add_parser(
|
||||||
|
self.name,
|
||||||
help=self.help,
|
help=self.help,
|
||||||
description=self.description)
|
description=self.description,
|
||||||
|
)
|
||||||
|
|
||||||
parser.add_argument('test_path', default="all",
|
parser.add_argument(
|
||||||
help='The path to the test. Defaults to "all".', nargs="?")
|
"test_path",
|
||||||
return parser # gets stored as self.parser
|
default="all",
|
||||||
|
help='The path to the test. Defaults to "all".',
|
||||||
|
nargs="?",
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
def do_run(self, args, unknown_args):
|
def do_run(self, args, unknown_args):
|
||||||
# the run-test script assumes the app directory is the current dir.
|
# the run-test script assumes the app directory is the current dir.
|
||||||
os.chdir(f'{self.topdir}/app')
|
os.chdir(f"{self.topdir}/app")
|
||||||
completed_process = subprocess.run(
|
completed_process = subprocess.run(
|
||||||
[f'{self.topdir}/app/run-test.sh', args.test_path])
|
[f"{self.topdir}/app/run-test.sh", args.test_path]
|
||||||
|
)
|
||||||
exit(completed_process.returncode)
|
exit(completed_process.returncode)
|
||||||
|
|
|
@ -42,9 +42,9 @@ For basic usage, please see [mod-tap](mod-tap.md) and [layer-tap](layers.md) pag
|
||||||
|
|
||||||
Defines how long a key must be pressed to trigger Hold behavior.
|
Defines how long a key must be pressed to trigger Hold behavior.
|
||||||
|
|
||||||
#### `quick_tap_ms`
|
#### `quick-tap-ms`
|
||||||
|
|
||||||
If you press a tapped hold-tap again within `quick_tap_ms` milliseconds, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled).
|
If you press a tapped hold-tap again within `quick-tap-ms` milliseconds, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled).
|
||||||
|
|
||||||
In QMK, unlike ZMK, this functionality is enabled by default, and you turn it off using `TAPPING_FORCE_HOLD`.
|
In QMK, unlike ZMK, this functionality is enabled by default, and you turn it off using `TAPPING_FORCE_HOLD`.
|
||||||
|
|
||||||
|
@ -62,12 +62,12 @@ For example, if you press `&mt LEFT_SHIFT A` and then release it without pressin
|
||||||
|
|
||||||
#### Positional hold-tap and `hold-trigger-key-positions`
|
#### Positional hold-tap and `hold-trigger-key-positions`
|
||||||
|
|
||||||
- Including `hold-trigger-key-postions` in your hold-tap definition turns on the positional hold-tap feature.
|
- Including `hold-trigger-key-positions` in your hold-tap definition turns on the positional hold-tap feature.
|
||||||
- With positional hold-tap enabled, if you press any key **NOT** listed in `hold-trigger-key-positions` before `tapping-term-ms` expires, it will produce a tap.
|
- With positional hold-tap enabled, if you press any key **NOT** listed in `hold-trigger-key-positions` before `tapping-term-ms` expires, it will produce a tap.
|
||||||
- In all other situations, positional hold-tap will not modify the behavior of your hold-tap.
|
- In all other situations, positional hold-tap will not modify the behavior of your hold-tap.
|
||||||
- Positional hold-tap is useful with home-row modifiers. If you have a home-row modifier key in the left hand for example, by including only keys positions from the right hand in `hold-trigger-key-positions`, you will only get hold behaviors during cross-hand key combinations.
|
- Positional hold-tap is useful with home-row modifiers. If you have a home-row modifier key in the left hand for example, by including only keys positions from the right hand in `hold-trigger-key-positions`, you will only get hold behaviors during cross-hand key combinations.
|
||||||
- Note that `hold-trigger-key-postions` is an array of key position indexes. Key positions are numbered according to your keymap, starting with 0. So if the first key in your keymap is Q, this key is in position 0. The next key (probably W) will be in position 1, et cetera.
|
- Note that `hold-trigger-key-positions` is an array of key position indexes. Key positions are numbered according to your keymap, starting with 0. So if the first key in your keymap is Q, this key is in position 0. The next key (probably W) will be in position 1, et cetera.
|
||||||
- See the following example, which uses a hold-tap behavior definition, configured with the `hold-preferrred` flavor, and with positional hold-tap enabled:
|
- See the following example, which uses a hold-tap behavior definition, configured with the `hold-preferred` flavor, and with positional hold-tap enabled:
|
||||||
|
|
||||||
```
|
```
|
||||||
#include <dt-bindings/zmk/keys.h>
|
#include <dt-bindings/zmk/keys.h>
|
||||||
|
@ -150,7 +150,7 @@ The following are suggested hold-tap configurations that work well with home row
|
||||||
label = "HOMEROW_MODS";
|
label = "HOMEROW_MODS";
|
||||||
#binding-cells = <2>;
|
#binding-cells = <2>;
|
||||||
tapping-term-ms = <150>;
|
tapping-term-ms = <150>;
|
||||||
quick_tap_ms = <0>;
|
quick-tap-ms = <0>;
|
||||||
flavor = "tap-preferred";
|
flavor = "tap-preferred";
|
||||||
bindings = <&kp>, <&kp>;
|
bindings = <&kp>, <&kp>;
|
||||||
};
|
};
|
||||||
|
@ -181,7 +181,7 @@ The following are suggested hold-tap configurations that work well with home row
|
||||||
label = "HOMEROW_MODS";
|
label = "HOMEROW_MODS";
|
||||||
#binding-cells = <2>;
|
#binding-cells = <2>;
|
||||||
tapping-term-ms = <200>; // <---[[moderate duration]]
|
tapping-term-ms = <200>; // <---[[moderate duration]]
|
||||||
quick_tap_ms = <0>;
|
quick-tap-ms = <0>;
|
||||||
flavor = "balanced";
|
flavor = "balanced";
|
||||||
bindings = <&kp>, <&kp>;
|
bindings = <&kp>, <&kp>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,6 +12,12 @@ keyboard to USB for power but outputting to a different device over bluetooth.
|
||||||
By default, output is sent to USB when both USB and BLE are connected.
|
By default, output is sent to USB when both USB and BLE are connected.
|
||||||
Once you select a different output, it will be remembered until you change it again.
|
Once you select a different output, it will be remembered until you change it again.
|
||||||
|
|
||||||
|
:::note Powering the keyboard via USB
|
||||||
|
ZMK is not always able to detect if the other end of a USB connection accepts keyboard input or not.
|
||||||
|
So if you are using USB only to power your keyboard (for example with a charger or a portable power bank), you will want
|
||||||
|
to select the BLE output through below behavior to be able to send keystrokes to the selected bluetooth profile.
|
||||||
|
:::
|
||||||
|
|
||||||
## Output Command Defines
|
## Output Command Defines
|
||||||
|
|
||||||
Output command defines are provided through the [`dt-bindings/zmk/outputs.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/outputs.h)
|
Output command defines are provided through the [`dt-bindings/zmk/outputs.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/outputs.h)
|
||||||
|
|
|
@ -26,7 +26,7 @@ From here on, building and flashing ZMK should all be done from the `app/` subdi
|
||||||
cd app
|
cd app
|
||||||
```
|
```
|
||||||
|
|
||||||
To build for your particular keyboard, the behaviour varies slightly depending on if you are building for a keyboard with
|
To build for your particular keyboard, the behavior varies slightly depending on if you are building for a keyboard with
|
||||||
an onboard MCU, or one that uses an MCU board addon.
|
an onboard MCU, or one that uses an MCU board addon.
|
||||||
|
|
||||||
### Keyboard (Shield) + MCU Board
|
### Keyboard (Shield) + MCU Board
|
||||||
|
@ -99,6 +99,10 @@ For instance, building kyria firmware from a user `myUser`'s `zmk-config` folder
|
||||||
west build -b nice_nano -- -DSHIELD=kyria_left -DZMK_CONFIG="C:/Users/myUser/Documents/Github/zmk-config/config"
|
west build -b nice_nano -- -DSHIELD=kyria_left -DZMK_CONFIG="C:/Users/myUser/Documents/Github/zmk-config/config"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
:::caution
|
||||||
|
The above command must still be invoked from the `zmk/app` directory as noted above, rather than the config directory. Otherwise, you will encounter errors such as `ERROR: source directory "." does not contain a CMakeLists.txt; is this really what you want to build?`. Alternatively you can add the `-s /path/to/zmk/app` flag to your `west` command.
|
||||||
|
:::
|
||||||
|
|
||||||
In order to make your `zmk-config` folder available when building within the VSCode Remote Container, you need to create a docker volume named `zmk-config`
|
In order to make your `zmk-config` folder available when building within the VSCode Remote Container, you need to create a docker volume named `zmk-config`
|
||||||
by binding it to the full path of your config directory. If you have run the VSCode Remote Container before, it is likely that docker has created this
|
by binding it to the full path of your config directory. If you have run the VSCode Remote Container before, it is likely that docker has created this
|
||||||
volume automatically -- we need to delete the default volume before binding it to the correct path. Follow the following steps:
|
volume automatically -- we need to delete the default volume before binding it to the correct path. Follow the following steps:
|
||||||
|
|
|
@ -100,7 +100,7 @@ Boards and shields should document the sets of hardware features found on them u
|
||||||
|
|
||||||
The `siblings` array is used to identify multiple hardware items designed to be used together as one logical device. Right now, that primarily is used to identify the two halves of a split keyboard, but future enhancements will include more complicated and flexible combinations.
|
The `siblings` array is used to identify multiple hardware items designed to be used together as one logical device. Right now, that primarily is used to identify the two halves of a split keyboard, but future enhancements will include more complicated and flexible combinations.
|
||||||
|
|
||||||
The array should contrain the complete harware IDs of the siblings that combine in the logical device, e.g. with the `corne.zmk.yml` file:
|
The array should contain the complete hardware IDs of the siblings that combine in the logical device, e.g. with the `corne.zmk.yml` file:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
id: corne
|
id: corne
|
||||||
|
|
|
@ -360,7 +360,7 @@ The two `#include` lines at the top of the keymap are required in order to bring
|
||||||
Further documentation on behaviors and bindings is forthcoming, but a summary of the current behaviors you can bind to key positions is as follows:
|
Further documentation on behaviors and bindings is forthcoming, but a summary of the current behaviors you can bind to key positions is as follows:
|
||||||
|
|
||||||
- `kp` is the "key press" behavior, and takes a single binding argument of the key code from the 'keyboard/keypad" HID usage table.
|
- `kp` is the "key press" behavior, and takes a single binding argument of the key code from the 'keyboard/keypad" HID usage table.
|
||||||
- `mo` is the "momentary layer" behaviour, and takes a single binding argument of the numeric ID of the layer to momentarily enable when that key is held.
|
- `mo` is the "momentary layer" behavior, and takes a single binding argument of the numeric ID of the layer to momentarily enable when that key is held.
|
||||||
- `trans` is the "transparent" behavior, useful to be place in higher layers above `mo` bindings to be sure the key release is handled by the lower layer. No binding arguments are required.
|
- `trans` is the "transparent" behavior, useful to be place in higher layers above `mo` bindings to be sure the key release is handled by the lower layer. No binding arguments are required.
|
||||||
- `mt` is the "mod-tap" behavior, and takes two binding arguments, the modifier to use if held, and the keycode to send if tapped.
|
- `mt` is the "mod-tap" behavior, and takes two binding arguments, the modifier to use if held, and the keycode to send if tapped.
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ As a best-in-class RTOS, Zephyr™ brings many [benefits](https://www.zephyrproj
|
||||||
- Powerful hardware abstraction and configuration using [DeviceTree](https://docs.zephyrproject.org/latest/guides/dts/index.html) and [Kconfig](https://docs.zephyrproject.org/latest/guides/kconfig/index.html).
|
- Powerful hardware abstraction and configuration using [DeviceTree](https://docs.zephyrproject.org/latest/guides/dts/index.html) and [Kconfig](https://docs.zephyrproject.org/latest/guides/kconfig/index.html).
|
||||||
- A BLE stack that periodically obtains [qualification](https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-qual.html) listings, making it easier for final products to obtain qualification from the Bluetooth® SIG.
|
- A BLE stack that periodically obtains [qualification](https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-qual.html) listings, making it easier for final products to obtain qualification from the Bluetooth® SIG.
|
||||||
- Multi-processor support, which is critical for power efficiency in upcoming MCUs.
|
- Multi-processor support, which is critical for power efficiency in upcoming MCUs.
|
||||||
- Permissive licencing with its Apache 2.0 open source [license](https://www.apache.org/licenses/LICENSE-2.0).
|
- Permissive licensing with its Apache 2.0 open source [license](https://www.apache.org/licenses/LICENSE-2.0).
|
||||||
- A buzzing developer [community](https://github.com/zephyrproject-rtos/zephyr) including many leading [embedded technology](https://www.zephyrproject.org/project-members) companies.
|
- A buzzing developer [community](https://github.com/zephyrproject-rtos/zephyr) including many leading [embedded technology](https://www.zephyrproject.org/project-members) companies.
|
||||||
- Long term support (LTS) with security updates.
|
- Long term support (LTS) with security updates.
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ That’s an excellent question! There are already great keyboard firmwares avail
|
||||||
- Zephyr™
|
- Zephyr™
|
||||||
- See [Why Zephyr™?](#why-zephyr)
|
- See [Why Zephyr™?](#why-zephyr)
|
||||||
- Licensing
|
- Licensing
|
||||||
- Just like other open source firmware, ZMK is all about the free and the sharing. However, some other projects use the GPL licence which prevents integration of libraries and drivers whose licenses are not GPL-compatible (such as some embedded BLE drivers). ZMK uses the permissive [MIT](https://github.com/zmkfirmware/zmk/blob/main/LICENSE) license which doesn’t have this limitation.
|
- Just like other open source firmware, ZMK is all about the free and the sharing. However, some other projects use the GPL license which prevents integration of libraries and drivers whose licenses are not GPL-compatible (such as some embedded BLE drivers). ZMK uses the permissive [MIT](https://github.com/zmkfirmware/zmk/blob/main/LICENSE) license which doesn’t have this limitation.
|
||||||
- Wireless First
|
- Wireless First
|
||||||
- ZMK is designed for the future, and we believe the future is wireless. So power efficiency plays a critical role in every design decision, just like in Zephyr™.
|
- ZMK is designed for the future, and we believe the future is wireless. So power efficiency plays a critical role in every design decision, just like in Zephyr™.
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ that defines just one layer for this keymap:
|
||||||
|
|
||||||
Each layer should have:
|
Each layer should have:
|
||||||
|
|
||||||
1. A `bindings` property this will be a list of behaviour bindings, one for each key position for the keyboard.
|
1. A `bindings` property this will be a list of behavior bindings, one for each key position for the keyboard.
|
||||||
1. (Optional) A `sensor-bindings` property that will be a list of behavior bindings for each sensor on the keyboard. (Currently, only encoders are supported as sensor hardware, but in the future devices like trackpoints would be supported the same way)
|
1. (Optional) A `sensor-bindings` property that will be a list of behavior bindings for each sensor on the keyboard. (Currently, only encoders are supported as sensor hardware, but in the future devices like trackpoints would be supported the same way)
|
||||||
|
|
||||||
For the full set of possible behaviors, start at the [Key Press](../behaviors/key-press.md) behavior.
|
For the full set of possible behaviors, start at the [Key Press](../behaviors/key-press.md) behavior.
|
||||||
|
|
|
@ -3,9 +3,7 @@ title: Troubleshooting
|
||||||
sidebar_title: Troubleshooting
|
sidebar_title: Troubleshooting
|
||||||
---
|
---
|
||||||
|
|
||||||
### Summary
|
The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite).
|
||||||
|
|
||||||
The following page provides suggestions for common errors that may occur during firmware compilation. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite).
|
|
||||||
|
|
||||||
### File Transfer Error
|
### File Transfer Error
|
||||||
|
|
||||||
|
@ -76,3 +74,7 @@ CONFIG_BT_CTLR_TX_PWR_PLUS_8=y
|
||||||
```
|
```
|
||||||
|
|
||||||
For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_BT_CTLR_TX_PWR_PLUS_8.html)
|
For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_BT_CTLR_TX_PWR_PLUS_8.html)
|
||||||
|
|
||||||
|
### Other notes and warnings
|
||||||
|
|
||||||
|
- If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger.
|
||||||
|
|
|
@ -143,6 +143,10 @@ GitHub Repo: https://github.com/petejohanson/zmk-config.git
|
||||||
|
|
||||||
Only the GitHub username is required; if you are happy with the defaults offered in the square brackets, you can simply hit `Enter`.
|
Only the GitHub username is required; if you are happy with the defaults offered in the square brackets, you can simply hit `Enter`.
|
||||||
|
|
||||||
|
:::note
|
||||||
|
If you are using SSH keys for git push, change GitHub Repo field to the SSH scheme, e.g. `git@github.com:petejohanson/zmk-config.git`.
|
||||||
|
:::
|
||||||
|
|
||||||
### Confirming Selections
|
### Confirming Selections
|
||||||
|
|
||||||
The setup script will confirm all of your selections one last time, before performing the setup:
|
The setup script will confirm all of your selections one last time, before performing the setup:
|
||||||
|
|
|
@ -1368,7 +1368,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=84",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=84",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -1393,7 +1393,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=84",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=84",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -2664,7 +2664,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -2711,7 +2711,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3089,7 +3089,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3110,7 +3110,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3131,7 +3131,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3152,7 +3152,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3173,7 +3173,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3215,7 +3215,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -3236,7 +3236,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -3257,7 +3257,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -3278,7 +3278,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: false,
|
linux: false,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3320,7 +3320,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: false,
|
linux: false,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3341,7 +3341,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3362,7 +3362,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: false,
|
linux: false,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3383,7 +3383,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3404,7 +3404,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3425,7 +3425,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3446,7 +3446,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3467,7 +3467,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3488,7 +3488,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3572,7 +3572,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3593,7 +3593,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3614,7 +3614,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3635,7 +3635,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3656,7 +3656,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -3866,7 +3866,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: false,
|
linux: false,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -4013,7 +4013,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4034,7 +4034,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=87",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4265,7 +4265,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4287,7 +4287,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4309,7 +4309,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4331,7 +4331,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4375,7 +4375,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4397,7 +4397,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4419,7 +4419,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -4507,7 +4507,7 @@ export default [
|
||||||
documentation:
|
documentation:
|
||||||
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
"https://source.android.com/devices/input/keyboard-devices#hid-keyboard-and-keypad-page-0x07",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: false,
|
macos: false,
|
||||||
|
@ -5001,7 +5001,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5022,7 +5022,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5043,7 +5043,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: false,
|
linux: false,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5148,7 +5148,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5169,7 +5169,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -5190,7 +5190,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -5211,7 +5211,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5232,7 +5232,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5253,7 +5253,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5274,7 +5274,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=134",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5778,7 +5778,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5799,7 +5799,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5820,7 +5820,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5841,7 +5841,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5862,7 +5862,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5883,7 +5883,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -5904,7 +5904,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -5925,7 +5925,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5967,7 +5967,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -5988,7 +5988,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -6009,7 +6009,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -6051,7 +6051,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=137",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -6093,7 +6093,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -6114,7 +6114,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -6135,7 +6135,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -6156,7 +6156,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=139",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: true,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: true,
|
android: true,
|
||||||
macos: true,
|
macos: true,
|
||||||
|
@ -6177,7 +6177,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=141",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=141",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: null,
|
android: null,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -7143,7 +7143,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -7164,7 +7164,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -7185,7 +7185,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -7206,7 +7206,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=150",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
@ -7626,7 +7626,7 @@ export default [
|
||||||
],
|
],
|
||||||
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=152",
|
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=152",
|
||||||
os: {
|
os: {
|
||||||
windows: null,
|
windows: false,
|
||||||
linux: true,
|
linux: true,
|
||||||
android: false,
|
android: false,
|
||||||
macos: null,
|
macos: null,
|
||||||
|
|
|
@ -54,7 +54,7 @@ if [[ $curl_exists == "true" && $wget_exists == "true" ]]; then
|
||||||
download_command="curl -fsOL "
|
download_command="curl -fsOL "
|
||||||
fi
|
fi
|
||||||
elif [[ $curl_exists == "true" ]]; then
|
elif [[ $curl_exists == "true" ]]; then
|
||||||
download_command="curl -O "
|
download_command="curl -fsOL "
|
||||||
elif [[ $wget_exists == "true" ]]; then
|
elif [[ $wget_exists == "true" ]]; then
|
||||||
download_command="wget "
|
download_command="wget "
|
||||||
else
|
else
|
||||||
|
|
Loading…
Add table
Reference in a new issue