Browse Source

Merge branch 'main' into bluetooth/battery-reporting

xmkb
Nick Winans 4 years ago committed by GitHub
parent
commit
70ffcca3b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      .devcontainer/.bashrc
  2. 11
      .devcontainer/Dockerfile
  3. 11
      .devcontainer/devcontainer.json
  4. 6
      .gitattributes
  5. 7
      .github/workflows/build.yml
  6. 4
      .github/workflows/clang-format-lint.yml
  7. 120
      CONTRIBUTING.md
  8. 6
      app/CMakeLists.txt
  9. 83
      app/Kconfig
  10. 10
      app/boards/arm/nice_nano/nice_nano.dts
  11. 13
      app/boards/arm/nrf52840_m2/CMakeLists.txt
  12. 10
      app/boards/arm/nrf52840_m2/Kconfig
  13. 10
      app/boards/arm/nrf52840_m2/Kconfig.board
  14. 30
      app/boards/arm/nrf52840_m2/Kconfig.defconfig
  15. 9
      app/boards/arm/nrf52840_m2/board.cmake
  16. 97
      app/boards/arm/nrf52840_m2/nrf52840_m2.dts
  17. 15
      app/boards/arm/nrf52840_m2/nrf52840_m2.yaml
  18. 23
      app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig
  19. 5
      app/boards/arm/nrfmicro/nrfmicro_11.dts
  20. 5
      app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts
  21. 9
      app/boards/arm/nrfmicro/nrfmicro_13.dts
  22. 11
      app/boards/arm/nrfmicro/pinmux.c
  23. 3
      app/boards/arm/planck/Kconfig.defconfig
  24. 3
      app/boards/arm/planck/board.cmake
  25. 14
      app/boards/shields/Kconfig.defconfig
  26. 5
      app/boards/shields/Kconfig.shield
  27. 2
      app/boards/shields/clueboard_california/Kconfig.defconfig
  28. 6
      app/boards/shields/clueboard_california/clueboard_california.keymap
  29. 6
      app/boards/shields/corne/corne.keymap
  30. 23
      app/boards/shields/cradio/Kconfig.defconfig
  31. 8
      app/boards/shields/cradio/Kconfig.shield
  32. 50
      app/boards/shields/cradio/cradio.dtsi
  33. 43
      app/boards/shields/cradio/cradio.keymap
  34. 5
      app/boards/shields/cradio/cradio_left.conf
  35. 7
      app/boards/shields/cradio/cradio_left.overlay
  36. 5
      app/boards/shields/cradio/cradio_right.conf
  37. 11
      app/boards/shields/cradio/cradio_right.overlay
  38. 7
      app/boards/shields/iris/iris.keymap
  39. 6
      app/boards/shields/kyria/kyria.keymap
  40. 9
      app/boards/shields/lily58/lily58.keymap
  41. 11
      app/boards/shields/m60/Kconfig.defconfig
  42. 7
      app/boards/shields/m60/Kconfig.shield
  43. 0
      app/boards/shields/m60/m60.conf
  44. 42
      app/boards/shields/m60/m60.keymap
  45. 66
      app/boards/shields/m60/m60.overlay
  46. 14
      app/boards/shields/m60/readme.md
  47. 60
      app/boards/shields/microdox/Kconfig.defconfig
  48. 8
      app/boards/shields/microdox/Kconfig.shield
  49. 34
      app/boards/shields/microdox/boards/nice_nano.overlay
  50. 6
      app/boards/shields/microdox/microdox.conf
  51. 66
      app/boards/shields/microdox/microdox.dtsi
  52. 73
      app/boards/shields/microdox/microdox.keymap
  53. 2
      app/boards/shields/microdox/microdox_left.conf
  54. 17
      app/boards/shields/microdox/microdox_left.overlay
  55. 2
      app/boards/shields/microdox/microdox_right.conf
  56. 21
      app/boards/shields/microdox/microdox_right.overlay
  57. 0
      app/boards/shields/qaz/qaz.conf
  58. 17
      app/boards/shields/quefrency/Kconfig.defconfig
  59. 8
      app/boards/shields/quefrency/Kconfig.shield
  60. 0
      app/boards/shields/quefrency/quefrency.conf
  61. 32
      app/boards/shields/quefrency/quefrency.dtsi
  62. 51
      app/boards/shields/quefrency/quefrency.keymap
  63. 2
      app/boards/shields/quefrency/quefrency_left.conf
  64. 37
      app/boards/shields/quefrency/quefrency_left.overlay
  65. 2
      app/boards/shields/quefrency/quefrency_right.conf
  66. 45
      app/boards/shields/quefrency/quefrency_right.overlay
  67. 2
      app/boards/shields/romac/romac.keymap
  68. 9
      app/boards/shields/romac_plus/Kconfig.defconfig
  69. 5
      app/boards/shields/romac_plus/Kconfig.shield
  70. 28
      app/boards/shields/romac_plus/boards/nice_nano.overlay
  71. 6
      app/boards/shields/romac_plus/romac_plus.conf
  72. 56
      app/boards/shields/romac_plus/romac_plus.dtsi
  73. 49
      app/boards/shields/romac_plus/romac_plus.keymap
  74. 31
      app/boards/shields/romac_plus/romac_plus.overlay
  75. 6
      app/boards/shields/sofle/sofle.keymap
  76. 3
      app/boards/shields/splitreus62/splitreus62.keymap
  77. 9
      app/boards/shields/tg4x/Kconfig.defconfig
  78. 5
      app/boards/shields/tg4x/Kconfig.shield
  79. 58
      app/boards/shields/tg4x/tg4x.keymap
  80. 56
      app/boards/shields/tg4x/tg4x.overlay
  81. 8
      app/drivers/zephyr/Kconfig
  82. 2
      app/drivers/zephyr/ec11.c
  83. 16
      app/drivers/zephyr/kscan_gpio_direct.c
  84. 69
      app/drivers/zephyr/kscan_gpio_matrix.c
  85. 1
      app/dts/behaviors.dtsi
  86. 9
      app/dts/behaviors/ext_power.dtsi
  87. 10
      app/dts/bindings/behaviors/zmk,behavior-ext-power.yaml
  88. 2
      app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml
  89. 20
      app/dts/bindings/zmk,ext-power-generic.yaml
  90. 5
      app/dts/bindings/zmk,keymap-sensors.yaml
  91. 44
      app/include/drivers/behavior.h
  92. 104
      app/include/drivers/ext_power.h
  93. 2
      app/include/dt-bindings/zmk/bt.h
  94. 13
      app/include/dt-bindings/zmk/ext_power.h
  95. 5
      app/include/dt-bindings/zmk/keys.h
  96. 6
      app/include/dt-bindings/zmk/kscan-mock.h
  97. 5
      app/include/dt-bindings/zmk/matrix-transform.h
  98. 5
      app/include/dt-bindings/zmk/rgb.h
  99. 6
      app/include/zmk/behavior.h
  100. 2
      app/include/zmk/ble/profile.h
  101. Some files were not shown because too many files have changed in this diff Show More

8
.devcontainer/.bashrc

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
export LS_OPTIONS='-F --color=auto'
alias ls='ls $LS_OPTIONS'
if [ "${CODESPACES}" = "true" ]; then
export WORKSPACE_DIR="$HOME/workspace/zmk"
fi
if [ -f "$WORKSPACE_DIR/zephyr/zephyr-env.sh" ]; then
source "$WORKSPACE_DIR/zephyr/zephyr-env.sh"
fi

11
.devcontainer/Dockerfile

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
FROM zmkfirmware/zephyr-west-action-arm
RUN apt-get -y update && \
apt-get -y upgrade && \
apt-get install --no-install-recommends -y \
ssh \
gpg && \
rm -rf /var/lib/apt/lists/*
COPY .bashrc tmp
RUN mv /tmp/.bashrc ~/.bashrc

11
.devcontainer/devcontainer.json

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
{
"name": "ZMK Development",
"dockerFile": "Dockerfile",
"extensions": ["ms-vscode.cpptools"],
"runArgs": ["--security-opt", "label=disable"],
"containerEnv": {"WORKSPACE_DIR": "${containerWorkspaceFolder}"},
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
}

6
.gitattributes vendored

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
* text=auto
# Always use Unix-style line endings for Bash scripts so they work in
# Docker on Windows.
.bashrc text eol=lf
*.sh text eol=lf

7
.github/workflows/build.yml

@ -16,8 +16,13 @@ jobs: @@ -16,8 +16,13 @@ jobs:
- kyria_right
- lily58_left
- lily58_right
- iris_left
- iris_right
- romac
- romac_plus
- settings_reset
- quefrency_left
- quefrency_right
include:
- board: proton_c
shield: clueboard_california
@ -70,7 +75,7 @@ jobs: @@ -70,7 +75,7 @@ jobs:
args: 'build "-s app -b ${{ matrix.board }} -- -DSHIELD=${{ matrix.shield }}"'
- name: Archive Build
uses: actions/upload-artifact@v2
if: ${{ matrix.board == 'nice_nano' }}
if: ${{ matrix.board != 'proton_c' }}
with:
name: "${{ matrix.board }}-${{ matrix.shield }}-zmk-uf2"
path: build/zephyr/zmk.uf2

4
.github/workflows/clang-format-lint.yml

@ -6,11 +6,15 @@ on: @@ -6,11 +6,15 @@ on:
- "app/boards/**/*.c"
- "app/include/**/*.h"
- "app/src/**"
- "app/drivers/**/*.c"
- "app/drivers/**/*.h"
pull_request:
paths:
- "app/boards/**/*.c"
- "app/include/**/*.h"
- "app/src/**"
- "app/drivers/**/*.c"
- "app/drivers/**/*.h"
jobs:
build:

120
CONTRIBUTING.md

@ -0,0 +1,120 @@ @@ -0,0 +1,120 @@
# Contributing To ZMK
Thanks for taking an interest in contributing to ZMK! After reading through the documentation, if
you have any questions, please come join us on the
[ZMK Discord Server][discord-invite].
## Code of Conduct
All community members are expected to abide by the [Code of Conduct][code-of-conduct].
For any and all conduct inquiries or concerns, please contact conduct@zmkfirmware.dev.
[code-of-conduct]: https://github.com/zmkfirmware/zmk/blob/main/CODE_OF_CONDUCT.md
## How Can I Contribute
There are many different ways that you can contribute to ZMK, several of which require no coding
abilities. These include:
- Chat Support
- Issue Reporting/Commenting
- Testing
- Documentation
- Code Contributions
## Chat Support
Providing user support on the [ZMK Discord Server][discord-invite] is a great way to help the
project. In particular, answering questions in the [#help](https://discord.com/channels/719497620560543766/719909884769992755) channel is incredibly appreciated.
## Issue Reporting/Commenting
Often, you might encounter unexpected behavior when building, flashing, or running the ZMK
firmware. Submitting or commenting on issues on GitHub is a great way to contribute to the
ZMK project.
### Before Submitting a Report
- Review the [Frequently Asked Questions](https://zmkfirmware.dev/docs/faq).
- Check the [Troubleshooting Guide](https://zmkfirmware.dev/docs/troubleshooting) for answers.
- Search the [open issues](https://github.com/zmkfirmware/zmk/issues) for an existing report that
matches your problem.
### Opening A Report
To open a report:
- Head to https://github.com/zmkfirmware/zmk/issues/new
- Provide an accurate summary of the issue in the title.
- Provide as much detail as you can about the issue including:
- What [board/shield](https://zmkfirmware.dev/docs/faq#what-is-a-board) you are using.
- A link to the user repository, if you used it to build your firmware.
- Exact steps to reproduce the problem.
- Any relevant screenshots or [logs](https://zmkfirmware.dev/docs/dev-guide-usb-logging)
## Testing
The `help wanted` label will be added to any [pull requests](https://github.com/zmkfirmware/zmk/pulls?q=is%3Aopen+is%3Apr+label%3A%22help+wanted%22)
or [issues](https://github.com/zmkfirmware/zmk/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22)
where user testing can assist the ZMK contributors to verify fixes, confirm
bugs, etc.
When providing testing feedback, please provide:
- Exact steps used to test
- Any hardware details relevant to testing
- Pass/fail summary for testing.
- Full details of any failures, including:
- Logs
- Screenshots
## Documentation
Quality documentation is a huge part of what makes a successful project. Contributions to add
documentation to areas not currently covered are greatly appreciated.
### Contributing
- The documentation site can be found in the main ZMK repo, in the
[docs/](https://github.com/zmkfirmware/zmk/tree/main/docs) subdirectory.
- The documentation is maintained using [Docusaurus V2](https://v2.docusaurus.io/docs/).
- To get started, from the `docs/` directory, run `npm ci` and then `npm start`.
- Enhancements should be submitted as pull requests to the `main` branch of ZMK.
## Code Contributions
### Development Setup
To get your development environment setup going, start at the
[basic setup](https://zmkfirmware.dev/docs/dev-setup) docs, and make sure you can build and flash
your own locally built firmware.
### Formatting
ZMK uses `clang-format` to ensure consist formatting for our source code. Before submitting your
changes, make sure you've manually run `clang-format`, or have your IDE configured to auto-format
on save.
### Commit Messages
The ZMK project is working towards, but not yet enforcing, the use of
[conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) for commit messages.
Further documentation and details will be provided here soon.
### Pull Requests
When opening a pull request with your changes, please:
- Submit the PR to the `main` branch of the
[`zmkfirmware/zmk`](https://github.com/zmkfirmware/zmk) repository.
- Use a descriptive title that summarizes the change.
- In the description, include:
- References to any open issues fixed by the PR.
- Feature added by the PR
- Bugs fixed by the PR.
- Testing you've performed locally.
- Requested testing by reviewers or testers.
- Screenshots or logs that support understanding the change.
[discord-invite]: https://zmkfirmware.dev/community/discord/invite

6
app/CMakeLists.txt

@ -23,6 +23,7 @@ zephyr_linker_sources(RODATA include/linker/zmk-events.ld) @@ -23,6 +23,7 @@ zephyr_linker_sources(RODATA include/linker/zmk-events.ld)
# Add your source file to the "app" target. This must come after
# find_package(Zephyr) which defines the target.
target_include_directories(app PRIVATE include)
target_sources_ifdef(CONFIG_ZMK_SLEEP app PRIVATE src/power.c)
target_sources(app PRIVATE src/kscan.c)
target_sources(app PRIVATE src/matrix_transform.c)
target_sources(app PRIVATE src/hid.c)
@ -30,6 +31,7 @@ target_sources(app PRIVATE src/sensors.c) @@ -30,6 +31,7 @@ target_sources(app PRIVATE src/sensors.c)
target_sources_ifdef(CONFIG_ZMK_DISPLAY app PRIVATE src/display.c)
target_sources(app PRIVATE src/event_manager.c)
target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/ble_unpair_combo.c)
target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/ext_power_generic.c)
target_sources(app PRIVATE src/events/position_state_changed.c)
target_sources(app PRIVATE src/events/keycode_state_changed.c)
target_sources(app PRIVATE src/events/modifiers_state_changed.c)
@ -44,6 +46,7 @@ if (NOT CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL) @@ -44,6 +46,7 @@ if (NOT CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL)
target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
target_sources(app PRIVATE src/behaviors/behavior_none.c)
target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c)
target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/behaviors/behavior_ext_power.c)
target_sources(app PRIVATE src/keymap.c)
endif()
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/behaviors/behavior_rgb_underglow.c)
@ -54,11 +57,12 @@ target_sources_ifdef(CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL app PRIVATE src/split/ @@ -54,11 +57,12 @@ target_sources_ifdef(CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL app PRIVATE src/split/
target_sources_ifdef(CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL app PRIVATE src/split/bluetooth/central.c)
target_sources_ifdef(CONFIG_ZMK_KSCAN_MOCK_DRIVER app PRIVATE src/kscan_mock.c)
target_sources_ifdef(CONFIG_ZMK_KSCAN_COMPOSITE_DRIVER app PRIVATE src/kscan_composite.c)
target_sources_ifdef(CONFIG_ZMK_USB app PRIVATE src/usb_hid.c)
target_sources_ifdef(CONFIG_USB app PRIVATE src/usb.c)
target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/hog.c)
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c)
target_sources(app PRIVATE src/endpoints.c)
target_sources(app PRIVATE src/hid_listener.c)
target_sources_ifdef(CONFIG_SETTINGS app PRIVATE src/settings.c)
target_sources(app PRIVATE src/main.c)
zephyr_cc_option(-Wfatal-errors)

83
app/Kconfig

@ -9,6 +9,15 @@ config USB_DEVICE_PRODUCT @@ -9,6 +9,15 @@ config USB_DEVICE_PRODUCT
config BT_DEVICE_NAME
default ZMK_KEYBOARD_NAME
config USB_DEVICE_VID
default 0x1D50
config USB_DEVICE_PID
default 0x615E
config USB_DEVICE_MANUFACTURER
default "ZMK Project"
config ZMK_KSCAN_EVENT_QUEUE_SIZE
int "Size of the event queue for KSCAN events to buffer events"
default 4
@ -21,12 +30,16 @@ menuconfig ZMK_USB @@ -21,12 +30,16 @@ menuconfig ZMK_USB
select USB_DEVICE_STACK
select USB_DEVICE_HID
if ZMK_USB
if USB
config ZMK_USB_INIT_PRIORITY
int "Init Priority"
default 50
endif
if ZMK_USB
config USB_NUMOF_EP_WRITE_RETRIES
default 10
@ -72,6 +85,29 @@ endif @@ -72,6 +85,29 @@ endif
endmenu
menuconfig ZMK_SLEEP
bool "Enable deep sleep support"
imply USB
if ZMK_SLEEP
config SYS_POWER_DEEP_SLEEP_STATES
default y
choice SYS_PM_POLICY
default SYS_PM_POLICY_APP
endchoice
config ZMK_IDLE_SLEEP_TIMEOUT
int "Milliseconds to wait to sleep when going idle"
default 900000
endif
config ZMK_EXT_POWER
bool "Enable support to control external power output"
default y
config ZMK_DISPLAY
bool "ZMK display support"
default n
@ -108,7 +144,6 @@ config ZMK_SPLIT_BLE_ROLE_CENTRAL @@ -108,7 +144,6 @@ config ZMK_SPLIT_BLE_ROLE_CENTRAL
config ZMK_SPLIT_BLE_ROLE_PERIPHERAL
bool "Peripheral"
select BT_KEYS_OVERWRITE_OLDEST
if ZMK_SPLIT_BLE_ROLE_PERIPHERAL
@ -132,14 +167,28 @@ endif @@ -132,14 +167,28 @@ endif
endif
if ZMK_BLE && (!ZMK_SPLIT_BLE || ZMK_SPLIT_BLE_ROLE_CENTRAL)
if ZMK_BLE
if ZMK_SPLIT_BLE && ZMK_SPLIT_BLE_ROLE_CENTRAL
config BT_MAX_CONN
default 6
config BT_MAX_PAIRED
default 6
endif
if !ZMK_SPLIT_BLE
config BT_MAX_CONN
default 5
config BT_MAX_PAIRED
default 5
endif
endif
endmenu
@ -168,6 +217,10 @@ menuconfig ZMK_RGB_UNDERGLOW @@ -168,6 +217,10 @@ menuconfig ZMK_RGB_UNDERGLOW
if ZMK_RGB_UNDERGLOW
# This default value cuts down on tons of excess .conf files, if you're using GPIO, manually disable this
config SPI
default y
config ZMK_RGB_UNDERGLOW_HUE_STEP
int "RGB underglow hue step in degrees of 360"
default 10
@ -180,6 +233,30 @@ config ZMK_RGB_UNDERGLOW_BRT_STEP @@ -180,6 +233,30 @@ config ZMK_RGB_UNDERGLOW_BRT_STEP
int "RGB underglow brightness step in percent"
default 10
config ZMK_RGB_UNDERGLOW_HUE_START
int "RGB underglow start hue value from 0-359"
default 0
config ZMK_RGB_UNDERGLOW_SAT_START
int "RGB underglow start saturations value from 0-100"
default 100
config ZMK_RGB_UNDERGLOW_BRT_START
int "RGB underglow start brightness value from 0-100"
default 100
config ZMK_RGB_UNDERGLOW_SPD_START
int "RGB underglow start animation speed value from 1-5"
default 3
config ZMK_RGB_UNDERGLOW_EFF_START
int "RGB underglow start effect int value related to the effect enum list"
default 0
config ZMK_RGB_UNDERGLOW_ON_START
bool "Whether RGB underglow starts on by default"
default y
endif
endmenu

10
app/boards/arm/nice_nano/nice_nano.dts

@ -29,6 +29,12 @@ @@ -29,6 +29,12 @@
};
};
ext-power {
compatible = "zmk,ext-power-generic";
label = "EXT_POWER";
control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
};
vbatt {
compatible = "zmk,battery-voltage-divider";
label = "VOLTAGE_DIVIDER";
@ -42,6 +48,10 @@ @@ -42,6 +48,10 @@
status = "okay";
};
&gpiote {
status = "okay";
};
&gpio0 {
status = "okay";
};

13
app/boards/arm/nrf52840_m2/CMakeLists.txt

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
set_property(GLOBAL APPEND PROPERTY extra_post_build_commands
COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py
-c
-b 0x26000
-f 0xADA52840
-o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2
${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin
)

10
app/boards/arm/nrf52840_m2/Kconfig

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
config BOARD_ENABLE_DCDC
bool "Enable DCDC mode"
select SOC_DCDC_NRF52X
default y
depends on BOARD_NRF52840_M2

10
app/boards/arm/nrf52840_m2/Kconfig.board

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
# Maker Diary nrf52840 M.2 board configuration
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
config BOARD_NRF52840_M2
bool "nrf52480_m2"
depends on SOC_NRF52840_QIAA

30
app/boards/arm/nrf52840_m2/Kconfig.defconfig

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
if BOARD_NRF52840_M2
config BOARD
default "nrf52480_m2"
if USB
config USB_NRFX
default y
config USB_DEVICE_STACK
default y
endif # USB
config BT_CTLR
default BT
config ZMK_BLE
default y
config ZMK_USB
default y
endif # BOARD_NRF52840_M2

9
app/boards/arm/nrf52840_m2/board.cmake

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset")
include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake)

97
app/boards/arm/nrf52840_m2/nrf52840_m2.dts

@ -0,0 +1,97 @@ @@ -0,0 +1,97 @@
/*
* Copyright (c) 2020 The ZMK Contributors
* SPDX-License-Identifier: MIT
*/
/dts-v1/;
#include <nordic/nrf52840_qiaa.dtsi>
/ {
model = "Makerdiary nRF52840 M.2 module";
compatible = "makerdiary,nrf52840_m2";
chosen {
zephyr,code-partition = &code_partition;
//zephyr,console = &uart0;
//zephyr,bt-mon-uart = &uart0;
//zephyr,bt-c2h-uart = &uart0;
zephyr,sram = &sram0;
zephyr,flash = &flash0;
};
leds {
compatible = "gpio-leds";
red_led: led_0 {
gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
label = "Red LED";
};
green_led: led_1 {
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
label = "Green LED";
};
blue_led: led_2 {
gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>;
label = "Blue LED";
};
};
};
&gpio0 {
status = "okay";
};
&gpio1 {
status = "okay";
};
&uart0 {
compatible = "nordic,nrf-uart";
status = "okay";
current-speed = <115200>;
tx-pin = <16>;
rx-pin = <15>;
rts-pin = <14>;
cts-pin = <13>;
};
&usbd {
compatible = "nordic,nrf-usbd";
status = "okay";
};
&flash0 {
/*
* For more information, see:
* http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html
*/
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "adafruit_boot";
reg = <0x000000000 0x0000C000>;
};
code_partition: partition@26000 {
label = "code_partition";
reg = <0x00026000 0x000d2000>;
};
/*
* The flash starting at 0x000f8000 and ending at
* 0x000fffff is reserved for use by the application.
*/
/*
* Storage partition will be used by FCB/LittleFS/NVS
* if enabled.
*/
storage_partition: partition@f8000 {
label = "storage";
reg = <0x000f8000 0x00008000>;
};
};
};

15
app/boards/arm/nrf52840_m2/nrf52840_m2.yaml

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
identifier: nrf52840_m2
name: Makerdiary nRF52840 M.2 module
type: mcu
arch: arm
toolchain:
- zephyr
- gnuarmemb
- xtools
supported:
- adc
- usb_device
- ble
- ieee802154
- pwm
- watchdog

23
app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
CONFIG_SOC_SERIES_NRF52X=y
CONFIG_SOC_NRF52840_QIAA=y
CONFIG_BOARD_NRF52840_M2=y
# Enable MPU
CONFIG_ARM_MPU=y
# enable GPIO
CONFIG_GPIO=y
CONFIG_USE_DT_CODE_PARTITION=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y
CONFIG_NVS=y
CONFIG_SETTINGS_NVS=y
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_FLASH_MAP=y

5
app/boards/arm/nrfmicro/nrfmicro_11.dts

@ -26,6 +26,11 @@ @@ -26,6 +26,11 @@
};
};
ext-power {
compatible = "zmk,ext-power-generic";
label = "EXT_POWER";
control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
};
};
&gpio0 {

5
app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts

@ -26,6 +26,11 @@ @@ -26,6 +26,11 @@
};
};
ext-power {
compatible = "zmk,ext-power-generic";
label = "EXT_POWER";
control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
};
};
&gpio0 {

9
app/boards/arm/nrfmicro/nrfmicro_13.dts

@ -26,6 +26,12 @@ @@ -26,6 +26,12 @@
};
};
ext-power {
compatible = "zmk,ext-power-generic";
label = "EXT_POWER";
control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
};
vbatt {
compatible = "zmk,battery-voltage-divider";
label = "VOLTAGE_DIVIDER";
@ -33,7 +39,10 @@ @@ -33,7 +39,10 @@
output-ohms = <2000000>;
full-ohms = <(2000000 + 820000)>;
};
};
&adc {
status = "okay";
};
&gpio0 {

11
app/boards/arm/nrfmicro/pinmux.c

@ -14,25 +14,14 @@ @@ -14,25 +14,14 @@
static int pinmux_nrfmicro_init(struct device *port) {
ARG_UNUSED(port);
struct device *p1 = device_get_binding("GPIO_1");
#if CONFIG_BOARD_NRFMICRO_13
struct device *p0 = device_get_binding("GPIO_0");
// enable EXT_VCC (use 0 for nRFMicro 1.3, use 1 for nRFMicro 1.1)
gpio_pin_configure(p1, 9, GPIO_OUTPUT);
gpio_pin_set(p1, 9, 0);
#if CONFIG_BOARD_NRFMICRO_CHARGER
gpio_pin_configure(p0, 5, GPIO_OUTPUT);
gpio_pin_set(p0, 5, 0);
#else
gpio_pin_configure(p0, 5, GPIO_INPUT);
#endif
#else
// enable EXT_VCC (use 0 for nRFMicro 1.3, use 1 for nRFMicro 1.1)
gpio_pin_configure(p1, 9, GPIO_OUTPUT);
gpio_pin_set(p1, 9, 1);
#endif
return 0;
}

3
app/boards/arm/planck/Kconfig.defconfig

@ -11,4 +11,7 @@ config ZMK_KEYBOARD_NAME @@ -11,4 +11,7 @@ config ZMK_KEYBOARD_NAME
config ZMK_USB
default y
config ZMK_KSCAN_MATRIX_POLLING
default y
endif # BOARD_PLANCK_REV6

3
app/boards/arm/planck/board.cmake

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
# SPDX-License-Identifier: MIT
board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse")
board_runner_args(jlink "--device=STM32F303VC" "--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)

14
app/boards/shields/Kconfig.defconfig

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
config ZMK_KEYBOARD_NAME
default "cradios"
# Unable to use interrupts as the same pin number is used
# across A & B controllers, and STM32F303CCT6 can't enable
# interrutps for multiple controllers for the same "line"
# for the external interrupts.
config ZMK_KSCAN_GPIO_POLLING
default y

5
app/boards/shields/Kconfig.shield

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
# Copyright (c) 2020 Pete Johanson
# SPDX-License-Identifier: MIT
config SHIELD_CRADIOS
def_bool $(shields_list_contains,cradios)

2
app/boards/shields/clueboard_california/Kconfig.defconfig

@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME
# across A & B controllers, and STM32F303CCT6 can't enable
# interrutps for multiple controllers for the same "line"
# for the external interrupts.
config ZMK_KSCAN_GPIO_POLLING
config ZMK_KSCAN_DIRECT_POLLING
default y
endif

6
app/boards/shields/clueboard_california/clueboard_california.keymap

@ -1,3 +1,9 @@ @@ -1,3 +1,9 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>

6
app/boards/shields/corne/corne.keymap

@ -1,3 +1,9 @@ @@ -1,3 +1,9 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>

23
app/boards/shields/cradio/Kconfig.defconfig

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
if SHIELD_CRADIO_LEFT
config ZMK_KEYBOARD_NAME
default "cradio left"
endif
if SHIELD_CRADIO_RIGHT
config ZMK_KEYBOARD_NAME
default "cradio right"
endif
if SHIELD_CRADIO_RIGHT || SHIELD_CRADIO_LEFT
config ZMK_KSCAN_DIRECT_POLLING
default y
endif

8
app/boards/shields/cradio/Kconfig.shield

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_CRADIO_LEFT
def_bool $(shields_list_contains,cradio_left)
config SHIELD_CRADIO_RIGHT
def_bool $(shields_list_contains,cradio_right)

50
app/boards/shields/cradio/cradio.dtsi

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix-transform.h>
/ {
chosen {
zmk,kscan = &kscan0;
//zmk,matrix_transform = &default_transform;
};
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <34>;
rows = <1>;
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17)
RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22)
RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27)
RC(0,15) RC(0,16) RC(0,33) RC(0,32)
>;
kscan0: kscan {
compatible = "zmk,kscan-gpio-direct";
label = "KSCAN";
input-gpios
= <&pro_micro_d 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_a 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_a 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_a 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_a 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_a 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro_d 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
;
};
};
};

43
app/boards/shields/cradio/cradio.keymap

@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
/ {
keymap {
compatible = "zmk,keymap";
default_layer {
bindings = <
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SCLN
&kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &kp FSLH
&mo 1 &kp LCTL &kp SPC &mo 2
>;
};
upper_layer {
bindings = <
&kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0
&bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp H &kp J &kp K &kp L &kp SCLN
&kp LSFT &trans &trans &trans &trans &trans &trans &trans &trans &trans
&mo 1 &kp LCTL &kp SPC &mo 2
>;
};
lower_layer {
bindings = <
&kp BANG &kp ATSN &kp HASH &kp CURU &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN
&trans &trans &trans &trans &trans &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp PIPE
&trans &trans &trans &trans &trans &trans &trans &trans &kp BSLH &kp TILD
&mo 1 &kp LCTL &kp SPC &mo 2
>;
};
};
};

5
app/boards/shields/cradio/cradio_left.conf

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
CONFIG_ZMK_SPLIT=y
CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL=y

7
app/boards/shields/cradio/cradio_left.overlay

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "cradio.dtsi"

5
app/boards/shields/cradio/cradio_right.conf

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
CONFIG_ZMK_SPLIT=y
CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL=y

11
app/boards/shields/cradio/cradio_right.overlay

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "cradio.dtsi"
&default_transform {
col-offset = <17>;
};

7
app/boards/shields/iris/iris.keymap

@ -1,5 +1,8 @@ @@ -1,5 +1,8 @@
# Copyright (c) 2020 Pete Johanson, Kurtis Lew
# SPDX-License-Identifier: MIT
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>

6
app/boards/shields/kyria/kyria.keymap

@ -1,3 +1,9 @@ @@ -1,3 +1,9 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>

9
app/boards/shields/lily58/lily58.keymap

@ -1,6 +1,13 @@ @@ -1,6 +1,13 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/ext_power.h>
/ {
keymap {
@ -35,7 +42,7 @@ @@ -35,7 +42,7 @@
&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12
&kp GRAV &kp BANG &kp ATSN &kp HASH &kp CURU &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN &kp TILD
&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp KPLS &kp LCUR &kp RCUR &kp PIPE
&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp KPLS &kp LCUR &kp RCUR &kp PIPE
&trans &trans &trans &trans &trans &trans &trans &trans
>;

11
app/boards/shields/m60/Kconfig.defconfig

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
if SHIELD_M60
config ZMK_KEYBOARD_NAME
default "m60"
endif

7
app/boards/shields/m60/Kconfig.shield

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
#
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
#
config SHIELD_M60
def_bool $(shields_list_contains,m60)

0
app/boards/shields/m60/m60.conf

42
app/boards/shields/m60/m60.keymap

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
/ {
keymap0: keymap {
compatible = "zmk,keymap";
default_layer {
// ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |
// | CTL | WIN | ALT | SPACE | ALT | MO(1) | WIN | CTRL |
// ------------------------------------------------------------------------------------------
bindings = <
&kp ESC &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 &kp MINUS &kp EQL &kp BKSP
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH
&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SCLN &kp QUOT &kp RET
&kp LSFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &kp FSLH &kp RSFT
&kp LCTL &kp LGUI &kp LALT &kp SPC &kp RALT &mo 1 &kp RGUI &kp RCTL
>;
};
fn_layer {
bindings = <
&kp GRAV &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader
&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &reset
&trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LARW &kp DARW &kp UARW &kp RARW &none &none &trans
&trans &none &none &none &none &none &none &none &none &none &none &trans
&trans &trans &trans &trans &trans &trans &trans &trans
>;
};
};
};

66
app/boards/shields/m60/m60.overlay

@ -0,0 +1,66 @@ @@ -0,0 +1,66 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix-transform.h>
/ {
chosen {
zmk,kscan = &kscan0;
zmk,matrix_transform = &default_transform;
};
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";
diode-direction = "col2row";
row-gpios
= <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
col-gpios
= <&gpio0 19 GPIO_ACTIVE_HIGH>
, <&gpio0 20 GPIO_ACTIVE_HIGH>
, <&gpio0 21 GPIO_ACTIVE_HIGH>
, <&gpio0 22 GPIO_ACTIVE_HIGH>
, <&gpio0 23 GPIO_ACTIVE_HIGH>
, <&gpio0 24 GPIO_ACTIVE_HIGH>
, <&gpio0 25 GPIO_ACTIVE_HIGH>
, <&gpio0 26 GPIO_ACTIVE_HIGH>
;
};
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <8>;
rows = <8>;
// | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 |
// | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX24 | MX25 | MX26 | MX27 | MX28 |
// | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 |
// | MX42 | MX43 | MX44 | MX45 | MX46 | MX47 | MX48 | MX49 | MX50 | MX51 | MX52 | MX53 |
// | MX54 | MX55 | MX56 | MX57 | MX58 | MX59 | MX60 | MX61 |
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5)
RC(3,3) RC(3,2) RC(3,1) RC(3,0) RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(1,7) RC(1,6)
RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(5,0)
RC(6,4) RC(6,3) RC(6,2) RC(6,1) RC(6,0) RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1)
RC(6,5) RC(6,6) RC(6,7) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4)
>;
};
bt_unpair_combo: bt_unpair_combo {
compatible = "zmk,bt-unpair-combo";
key-positions = <0 53>;
};
};

14
app/boards/shields/m60/readme.md

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
# [Makerdiary M60](https://wiki.makerdiary.com/m60)
A 60% ANSI keyboard designed and manufactured by Makerdiary.
http://makerdiary.com
## Features
- Per key RGB LED.
- Uses makerdiary M.2 nRF52840 module
- Matrix wiring
## Hardware Notes
https://wiki.makerdiary.com/m60/developer_guide/hardware/

60
app/boards/shields/microdox/Kconfig.defconfig

@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
if SHIELD_MICRODOX_LEFT
config ZMK_KEYBOARD_NAME
default "Microdox Left"
endif
if SHIELD_MICRODOX_RIGHT
config ZMK_KEYBOARD_NAME
default "Microdox Right"
endif
if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT
config ZMK_SPLIT
default y
if ZMK_DISPLAY
config I2C
default y
config SSD1306
default y
config SSD1306_REVERSE_MODE
default y
endif # ZMK_DISPLAY
if LVGL
config LVGL_HOR_RES
default 128
config LVGL_VER_RES
default 32
config LVGL_VDB_SIZE
default 64
config LVGL_DPI
default 148
config LVGL_BITS_PER_PIXEL
default 1
choice LVGL_COLOR_DEPTH
default LVGL_COLOR_DEPTH_1
endchoice
endif # LVGL
endif

8
app/boards/shields/microdox/Kconfig.shield

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_MICRODOX_LEFT
def_bool $(shields_list_contains,microdox_left)
config SHIELD_MICRODOX_RIGHT
def_bool $(shields_list_contains,microdox_right)

34
app/boards/shields/microdox/boards/nice_nano.overlay

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
&spi1 {
compatible = "nordic,nrf-spi";
/* Cannot be used together with i2c0. */
status = "okay";
mosi-pin = <6>;
// Unused pins, needed for SPI definition, but not used by the ws2812 driver itself.
sck-pin = <5>;
miso-pin = <7>;
led_strip: ws2812@0 {
compatible = "worldsemi,ws2812-spi";
label = "SK6812mini";
/* SPI */
reg = <0>; /* ignored, but necessary for SPI bindings */
spi-max-frequency = <4000000>;
/* WS2812 */
chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */
spi-one-frame = <0x70>;
spi-zero-frame = <0x40>;
};
};
/ {
chosen {
zmk,underglow = &led_strip;
};
};

6
app/boards/shields/microdox/microdox.conf

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
# Uncomment the following lines to enable the Corne RGB Underglow
# ZMK_RGB_UNDERGLOW=y
# CONFIG_WS2812_STRIP=y
# Uncomment the following line to enable the Corne OLED Display
# CONFIG_ZMK_DISPLAY=y

66
app/boards/shields/microdox/microdox.dtsi

@ -0,0 +1,66 @@ @@ -0,0 +1,66 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix-transform.h>
/ {
chosen {
zmk,kscan = &kscan0;
zmk,matrix_transform = &default_transform;
};
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <10>;
rows = <4>;
// | SW1 | SW2 | SW3 | SW4 | SW5 | | SW5 | SW4 | SW3 | SW2 | SW1 |
// | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 |
// | SW11 | SW12 | SW13 | SW14 | SW15 | | SW15 | SW14 | SW13 | SW12 | SW11 |
// | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 |
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9)
RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9)
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9)
RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7)
>;
};
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";
diode-direction = "col2row";
row-gpios
= <&pro_micro_d 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
// TODO: per-key RGB node(s)?
};
&pro_micro_i2c {
status = "okay";
oled: ssd1306@3c {
compatible = "solomon,ssd1306fb";
reg = <0x3c>;
label = "DISPLAY";
width = <128>;
height = <32>;
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <31>;
segment-remap;
com-invdir;
com-sequential;
prechargep = <0x22>;
};
};

73
app/boards/shields/microdox/microdox.keymap

@ -0,0 +1,73 @@ @@ -0,0 +1,73 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
/ {
keymap {
compatible = "zmk,keymap";
default_layer {
// -----------------------------------------------------------------------------------------
// | Q | W | E | R | T | | Y | U | I | O | P |
// | A | S | D | F | G | | H | J | K | L | ; |
// | Z | X | C | V | B | | N | M | , | . | / |
// | GUI | NAV | SHFT | | SPC | SYM | ALT |
bindings = <
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SCLN
&kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &kp FSLH
&kp LGUI &mo 1 &kp LSFT &kp SPC &mo 2 &kp RALT
>;
};
nav_layer {
// -----------------------------------------------------------------------------------------
// |BTCLR| | ESC | ~ | | | TAB | HOME | UP | END | DEL |
// | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BKSP |
// | BT2 | | | | | | \ | ENT | | | |
// | | | | | | | |
bindings = <
&bt BT_CLR &trans &kp ESC &kp TILD &trans &kp TAB &kp HOME &kp UARW &kp END &kp DEL
&bt BT_SEL 0 &kp GUI &kp RALT &kp LCTL &mo 3 &kp FSLH &kp LARW &kp DARW &kp RARW &kp BKSP
&bt BT_SEL 1 &trans &trans &trans &trans &kp BSLH &kp RET &trans &trans &trans
&trans &trans &trans &trans &trans &trans
>;
};
sym_layer {
// -----------------------------------------------------------------------------------------
// | ! | @ | # | $ | % | | ^ | & | * | ( | ) |
// | | | | | | | - | = | { | } | "|" |
// | | | | | | | _ | + | [ | ] | \ |
// | GUI | | SPC | | ENT | | ALT |
bindings = <
&kp BANG &kp ATSN &kp HASH &kp CURU &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN
&trans &trans &trans &trans &trans &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp PIPE
&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp BSLH
&kp LGUI &trans &kp SPC &kp RET &trans &kp RALT
>;
};
// This layer is unreachable until "tri layer state" is sorted out.
// Leaving it here for completeness.
num_layer {
// -----------------------------------------------------------------------------------------
// | | | | | | | A | 7 | 8 | 9 | D |
// | | | | | | | B | 4 | 5 | 6 | E |
// | | | | | | | C | 1 | 2 | 3 | F |
// | | | | | 0 | . | |
bindings = <
&trans &trans &trans &trans &trans &kp A &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp D
&trans &trans &trans &trans &trans &kp B &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp E
&trans &trans &trans &trans &trans &kp C &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp F
&trans &trans &trans &kp NUM_0 &kp DOT &trans
>;
};
};
};

2
app/boards/shields/microdox/microdox_left.conf

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
CONFIG_ZMK_SPLIT=y
CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL=y

17
app/boards/shields/microdox/microdox_left.overlay

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "microdox.dtsi"
&kscan0 {
col-gpios
= <&pro_micro_a 3 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 2 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 1 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 0 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 15 GPIO_ACTIVE_HIGH>
;
};

2
app/boards/shields/microdox/microdox_right.conf

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
CONFIG_ZMK_SPLIT=y
CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL=y

21
app/boards/shields/microdox/microdox_right.overlay

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "microdox.dtsi"
&default_transform {
col-offset = <5>;
};
&kscan0 {
col-gpios
= <&pro_micro_d 15 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 0 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 1 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 2 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 3 GPIO_ACTIVE_HIGH>
;
};

0
app/boards/shields/qaz/qaz.conf

17
app/boards/shields/quefrency/Kconfig.defconfig

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
#Copyright (c) 2020 The ZMK Contributors
#SPDX-License-Identifier: MIT
if SHIELD_QUEFRENCY_LEFT
config ZMK_KEYBOARD_NAME
default "Quefrency Left"
endif
if SHIELD_QUEFRENCY_RIGHT
config ZMK_KEYBOARD_NAME
default "Quefrency Right"
endif

8
app/boards/shields/quefrency/Kconfig.shield

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_QUEFRENCY_LEFT
def_bool $(shields_list_contains,quefrency_left)
config SHIELD_QUEFRENCY_RIGHT
def_bool $(shields_list_contains,quefrency_right)

0
app/boards/shields/quefrency/quefrency.conf

32
app/boards/shields/quefrency/quefrency.dtsi

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix-transform.h>
/ {
chosen {
zmk,kscan = &kscan0;
zmk,matrix_transform = &default_transform;
};
/*
* This transform correspondsto the 60% left without macro keypad and 65% right, even this
* combination of PCBs can have keys in different locations based on configuration.
*/
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <15>;
rows = <6>;
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13)
RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(5,14)
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13)
RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11)
RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9)
>;
};
};

51
app/boards/shields/quefrency/quefrency.keymap

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/keys.h>
/ {
keymap {
compatible = "zmk,keymap";
// ---------------------------------------------- -----------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BKSPC | ` |
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | [ | ] | \ | DEL |
// | LCTRL | A | S | D | F | G | | H | J | K | L | ; | ' | ENTER | PGUP |
// | SHIFT | Z | X | C | V | B | | N | M | , | . | / | RSHFT | UP | PGDN |
// | LCTRL | LGUI | LALT | SPACE | FN | | SPACE | RALT | FN | RCTRL | LFT | DWN | RGHT |
// ------------------------------------------- ------------------------------------------------------
default_layer {
bindings = <
&kp ESC &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 /**/ &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 &kp MINUS &kp EQL &kp BKSP &kp GRAV
&kp TAB &kp Q &kp W &kp E &kp R &kp T /**/ &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME
&kp LCTL &kp A &kp S &kp D &kp F &kp G /**/ &kp H &kp J &kp K &kp L &kp SCLN &kp QUOT &kp RET &kp PGUP
&kp LSFT &kp Z &kp X &kp C &kp V &kp B /**/ &kp N &kp M &kp CMMA &kp DOT &kp FSLH &kp RSFT &kp UARW &kp PGDN
&kp LCTL &kp LGUI &kp LALT &kp SPC &mo 1 /**/ &kp SPC &kp RALT &mo 1 &kp RCTL &kp LARW &kp DARW &kp RARW
>;
};
// ---------------------------------------------- -----------------------------------------------------
// |BT_CLR| F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | |BT_CLR|
// | | BT-0 | BT-1| BT-2 | | | | | | | | | | | | |
// | | | | | | | | | | | | | | | |
// | | | | | | | | | | | | | | | |
// | | | | | | | | | | | | | |
// ------------------------------------------- ------------------------------------------------------
fn_layer {
bindings = <
&bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 /**/ &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &bt BT_CLR
&trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans /**/ &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans /**/ &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans /**/ &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans /**/ &trans &trans &trans &trans &trans &trans &trans
>;
};
};
};

2
app/boards/shields/quefrency/quefrency_left.conf

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
CONFIG_ZMK_SPLIT=y
CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL=y

37
app/boards/shields/quefrency/quefrency_left.overlay

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "quefrency.dtsi"
/ {
/* This kscan is for the 60% left half without macro keys the
* macro pad layout may require different column and row pins
*/
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";
diode-direction = "col2row";
col-gpios
= <&pro_micro_a 2 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 1 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 0 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 15 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 14 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 16 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 10 GPIO_ACTIVE_HIGH>
;
row-gpios
= <&pro_micro_a 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
};

2
app/boards/shields/quefrency/quefrency_right.conf

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
CONFIG_ZMK_SPLIT=y
CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL=y

45
app/boards/shields/quefrency/quefrency_right.overlay

@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "quefrency.dtsi"
&default_transform {
col-offset = <7>;
};
/ {
/* This kscan is for the 65% right half the 60% right half
* may require different column and row pins
*/
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";
diode-direction = "col2row";
col-gpios
= <&pro_micro_a 2 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 1 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 0 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 15 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 14 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 16 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 10 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 5 GPIO_ACTIVE_HIGH>
;
row-gpios
= <&pro_micro_a 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
};

2
app/boards/shields/romac/romac.keymap

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright (c) 2020 Pete Johanson, Richard Jones
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

9
app/boards/shields/romac_plus/Kconfig.defconfig

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
if SHIELD_ROMAC_PLUS
config ZMK_KEYBOARD_NAME
default "RoMac+ v4"
endif

5
app/boards/shields/romac_plus/Kconfig.shield

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_ROMAC_PLUS
def_bool $(shields_list_contains,romac_plus)

28
app/boards/shields/romac_plus/boards/nice_nano.overlay

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
&spi1 {
compatible = "nordic,nrf-spi";
status = "okay";
mosi-pin = <6>;
// Unused pins, needed for SPI definition, but not used by the ws2812 driver itself.
sck-pin = <5>;
miso-pin = <7>;
led_strip: ws2812@0 {
compatible = "worldsemi,ws2812-spi";
label = "WS2812";
/* SPI */
reg = <0>; /* ignored, but necessary for SPI bindings */
spi-max-frequency = <4000000>;
/* WS2812 */
chain-length = <10>; /* arbitrary; change at will */
spi-one-frame = <0x70>;
spi-zero-frame = <0x40>;
};
};
/ {
chosen {
zmk,underglow = &led_strip;
};
};

6
app/boards/shields/romac_plus/romac_plus.conf

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
# Uncomment to enable encoder
#CONFIG_EC11=y
#CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y

56
app/boards/shields/romac_plus/romac_plus.dtsi

@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix-transform.h>
/ {
chosen {
zmk,kscan = &kscan0;
zmk,matrix_transform = &default_transform;
};
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <3>;
rows = <4>;
map = <
RC(0,0) RC(0,1) RC(0,2)
RC(1,0) RC(1,1) RC(1,2)
RC(2,0) RC(2,1) RC(2,2)
RC(3,0) RC(3,1) RC(3,2)
>;
};
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";
diode-direction = "col2row";
row-gpios
= <&pro_micro_d 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
left_encoder: encoder_left {
compatible = "alps,ec11";
label = "LEFT_ENCODER";
a-gpios = <&pro_micro_d 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
b-gpios = <&pro_micro_d 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
resolution = <4>;
status = "disabled";
};
sensors {
compatible = "zmk,keymap-sensors";
sensors = <&left_encoder>;
};
// TODO: per-key RGB node(s)?
};

49
app/boards/shields/romac_plus/romac_plus.keymap

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/keys.h>
/ {
keymap {
compatible = "zmk,keymap";
default_layer {
// --------------------------
// | 7 | 8 | 9 |
// | 4 | 5 | 6 |
// | 1 | 2 | 3 |
// | M_PLAY | 0 | MO(1) |
// --------------------------
bindings = <
&kp NUM_7 &kp NUM_8 &kp NUM_9
&kp NUM_4 &kp NUM_5 &kp NUM_6
&kp NUM_1 &kp NUM_2 &kp NUM_3
&cp M_PLAY &kp NUM_0 &mo 1
>;
sensor-bindings = <&inc_dec_cp M_NEXT M_PREV>;
};
nav_layer {
// --------------------------
// | BT_CLR | HOME | PGUP |
// | _ | END | PGDN |
// | _ | _ | _ |
// | _ | _ | _ |
// --------------------------
bindings = <
&bt BT_CLR &kp HOME &kp PGUP
&trans &kp END &kp PGDN
&trans &trans &trans
&trans &trans &trans
>;
sensor-bindings = <&inc_dec_kp A B>;
};
};
};

31
app/boards/shields/romac_plus/romac_plus.overlay

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "romac_plus.dtsi"
/ {
chosen {
zmk,kscan = &kscan0;
};
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";
diode-direction = "col2row";
col-gpios
= <&pro_micro_a 1 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 2 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 3 GPIO_ACTIVE_HIGH>
;
};
};
&left_encoder {
status = "okay";
};

6
app/boards/shields/sofle/sofle.keymap

@ -1,3 +1,9 @@ @@ -1,3 +1,9 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>

3
app/boards/shields/splitreus62/splitreus62.keymap

@ -1,9 +1,10 @@ @@ -1,9 +1,10 @@
/*
* Copyright (c) 2020 Derek Schmell
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>

9
app/boards/shields/tg4x/Kconfig.defconfig

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
if SHIELD_TG4X
config ZMK_KEYBOARD_NAME
default "TG4X"
endif

5
app/boards/shields/tg4x/Kconfig.shield

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_TG4X
def_bool $(shields_list_contains,tg4x)

58
app/boards/shields/tg4x/tg4x.keymap

@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
#define DEFAULT 0
#define LOWER 1
#define RAISE 2
/ {
behaviors {
hm: homerow_mods {
compatible = "zmk,behavior-hold-tap";
label = "homerow mods";
#binding-cells = <2>;
tapping_term_ms = <225>;
flavor = "tap-preferred";
bindings = <&kp>, <&kp>;
};
};
};
/ {
keymap {
compatible = "zmk,keymap";
default_layer {
bindings = <
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BKSP
&kp TAB &hm LGUI A &hm LALT S &hm LCTL D &hm LSFT F &kp G &kp H &hm RSFT J &hm RCTL K &hm RALT L &hm RGUI SCLN &kp RET
&kp LSFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &kp FSLH &kp QUOT
&kp LCTL &kp LALT &kp LGUI &lt 1 BKSP &lt 2 SPC &kp LARW &kp DARW &kp UARW &kp RARW
>;
};
lower {
bindings = <
&kp GRAV &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PRSC
&kp DEL &trans &kp VOLU &trans &trans &trans &trans &kp LARW &kp DARW &kp UARW &kp RARW &trans
&trans &trans &kp VOLD &trans &trans &trans &trans &trans &trans &bt BT_PRV &bt BT_NXT &bt BT_CLR
&bootloader &reset &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3
>;
};
raise {
bindings = <
&kp GRAV &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 &kp PRSC
&kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp BSLH
&trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp TILD &kp HOME &kp PGUP &kp PGDN &kp END
&trans &trans &trans &trans &trans &trans &kp M_NEXT &kp M_VOLD &kp M_VOLU &kp M_PLAY
>;
};
};
};

56
app/boards/shields/tg4x/tg4x.overlay

@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
/*
* Copyright (c) 2020 The ZMK Contrbutors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix-transform.h>
/ {
chosen {
zmk,kscan = &kscan0;
zmk,matrix_transform = &default_transform;
};
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <7>;
rows = <8>;
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,5)
RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4)
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4)
RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,5) RC(7,1) RC(7,2) RC(7,3) RC(7,4)
>;
};
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";
diode-direction = "col2row";
col-gpios
= <&pro_micro_d 1 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 14 GPIO_ACTIVE_HIGH>
, <&pro_micro_d 15 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 0 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 1 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 2 GPIO_ACTIVE_HIGH>
, <&pro_micro_a 3 GPIO_ACTIVE_HIGH>
;
row-gpios
= <&pro_micro_a 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_a 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro_d 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
};

8
app/drivers/zephyr/Kconfig

@ -5,8 +5,12 @@ config ZMK_KSCAN_GPIO_DRIVER @@ -5,8 +5,12 @@ config ZMK_KSCAN_GPIO_DRIVER
if ZMK_KSCAN_GPIO_DRIVER
config ZMK_KSCAN_GPIO_POLLING
bool "Poll for key event triggers instead of using interrupts"
config ZMK_KSCAN_MATRIX_POLLING
bool "Poll for key event triggers instead of using interrupts on matrix boards."
default n
config ZMK_KSCAN_DIRECT_POLLING
bool "Poll for key event triggers instead of using interrupts on direct wired boards."
default n
endif

2
app/drivers/zephyr/ec11.c

@ -142,7 +142,7 @@ int ec11_init(struct device *dev) { @@ -142,7 +142,7 @@ int ec11_init(struct device *dev) {
.b_flags = DT_INST_GPIO_FLAGS(n, b_gpios), \
COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \
}; \
DEVICE_AND_API_INIT(ec11, DT_INST_LABEL(n), ec11_init, &ec11_data_##n, &ec11_cfg_##n, \
DEVICE_AND_API_INIT(ec11_##n, DT_INST_LABEL(n), ec11_init, &ec11_data_##n, &ec11_cfg_##n, \
POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &ec11_driver_api);
DT_INST_FOREACH_STATUS_OKAY(EC11_INST)

16
app/drivers/zephyr/kscan_gpio_direct.c

@ -33,9 +33,9 @@ struct kscan_gpio_config { @@ -33,9 +33,9 @@ struct kscan_gpio_config {
};
struct kscan_gpio_data {
#if defined(CONFIG_ZMK_KSCAN_GPIO_POLLING)
#if defined(CONFIG_ZMK_KSCAN_DIRECT_POLLING)
struct k_timer poll_timer;
#endif /* defined(CONFIG_ZMK_KSCAN_GPIO_POLLING) */
#endif /* defined(CONFIG_ZMK_KSCAN_DIRECT_POLLING) */
kscan_callback_t callback;
union work_reference work;
struct device *dev;
@ -53,7 +53,7 @@ static const struct kscan_gpio_item_config *kscan_gpio_input_configs(struct devi @@ -53,7 +53,7 @@ static const struct kscan_gpio_item_config *kscan_gpio_input_configs(struct devi
return cfg->inputs;
}
#if !defined(CONFIG_ZMK_KSCAN_GPIO_POLLING)
#if !defined(CONFIG_ZMK_KSCAN_DIRECT_POLLING)
struct kscan_gpio_irq_callback {
union work_reference *work;
@ -101,7 +101,7 @@ static void kscan_gpio_irq_callback_handler(struct device *dev, struct gpio_call @@ -101,7 +101,7 @@ static void kscan_gpio_irq_callback_handler(struct device *dev, struct gpio_call
}
}
#else /* !defined(CONFIG_ZMK_KSCAN_GPIO_POLLING) */
#else /* !defined(CONFIG_ZMK_KSCAN_DIRECT_POLLING) */
static void kscan_gpio_timer_handler(struct k_timer *timer) {
struct kscan_gpio_data *data = CONTAINER_OF(timer, struct kscan_gpio_data, poll_timer);
@ -120,7 +120,7 @@ static int kscan_gpio_direct_disable(struct device *dev) { @@ -120,7 +120,7 @@ static int kscan_gpio_direct_disable(struct device *dev) {
return 0;
}
#endif /* defined(CONFIG_ZMK_KSCAN_GPIO_POLLING) */
#endif /* defined(CONFIG_ZMK_KSCAN_DIRECT_POLLING) */
static int kscan_gpio_direct_configure(struct device *dev, kscan_callback_t callback) {
struct kscan_gpio_data *data = dev->driver_data;
@ -173,7 +173,7 @@ static const struct kscan_driver_api gpio_driver_api = { @@ -173,7 +173,7 @@ static const struct kscan_driver_api gpio_driver_api = {
#define INST_INPUT_LEN(n) DT_INST_PROP_LEN(n, input_gpios)
#define GPIO_INST_INIT(n) \
COND_CODE_0(CONFIG_ZMK_KSCAN_GPIO_POLLING, \
COND_CODE_0(IS_ENABLED(CONFIG_ZMK_KSCAN_DIRECT_POLLING), \
(static struct kscan_gpio_irq_callback irq_callbacks_##n[INST_INPUT_LEN(n)];), ()) \
static struct kscan_gpio_data kscan_gpio_data_##n = { \
.inputs = {[INST_INPUT_LEN(n) - 1] = NULL}}; \
@ -195,7 +195,7 @@ static const struct kscan_driver_api gpio_driver_api = { @@ -195,7 +195,7 @@ static const struct kscan_driver_api gpio_driver_api = {
return err; \
} \
COND_CODE_0( \
CONFIG_ZMK_KSCAN_GPIO_POLLING, \
IS_ENABLED(CONFIG_ZMK_KSCAN_DIRECT_POLLING), \
(irq_callbacks_##n[i].work = &data->work; \
irq_callbacks_##n[i].debounce_period = cfg->debounce_period; \
gpio_init_callback(&irq_callbacks_##n[i].callback, \
@ -208,7 +208,7 @@ static const struct kscan_driver_api gpio_driver_api = { @@ -208,7 +208,7 @@ static const struct kscan_driver_api gpio_driver_api = {
()) \
} \
data->dev = dev; \
COND_CODE_1(CONFIG_ZMK_KSCAN_GPIO_POLLING, \
COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KSCAN_DIRECT_POLLING), \
(k_timer_init(&data->poll_timer, kscan_gpio_timer_handler, NULL);), ()) \
if (cfg->debounce_period > 0) { \
k_delayed_work_init(&data->work.delayed, kscan_gpio_work_handler); \

69
app/drivers/zephyr/kscan_gpio_matrix.c

@ -31,6 +31,7 @@ struct kscan_gpio_item_config { @@ -31,6 +31,7 @@ struct kscan_gpio_item_config {
#define _KSCAN_GPIO_ROW_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, row_gpios, idx)
#define _KSCAN_GPIO_COL_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, col_gpios, idx)
#if !defined(CONFIG_ZMK_KSCAN_MATRIX_POLLING)
static int kscan_gpio_config_interrupts(struct device **devices,
const struct kscan_gpio_item_config *configs, size_t len,
gpio_flags_t flags) {
@ -48,6 +49,8 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -48,6 +49,8 @@ static int kscan_gpio_config_interrupts(struct device **devices,
return 0;
}
#endif
#define INST_MATRIX_ROWS(n) DT_INST_PROP_LEN(n, row_gpios)
#define INST_MATRIX_COLS(n) DT_INST_PROP_LEN(n, col_gpios)
#define INST_OUTPUT_LEN(n) \
@ -61,6 +64,7 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -61,6 +64,7 @@ static int kscan_gpio_config_interrupts(struct device **devices,
struct kscan_gpio_irq_callback_##n { \
struct COND_CODE_0(DT_INST_PROP(n, debounce_period), (k_work), (k_delayed_work)) * work; \
struct gpio_callback callback; \
struct device *dev; \
}; \
static struct kscan_gpio_irq_callback_##n irq_callbacks_##n[INST_INPUT_LEN(n)]; \
struct kscan_gpio_config_##n { \
@ -69,6 +73,7 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -69,6 +73,7 @@ static int kscan_gpio_config_interrupts(struct device **devices,
}; \
struct kscan_gpio_data_##n { \
kscan_callback_t callback; \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, (struct k_timer poll_timer;), ()) \
struct COND_CODE_0(DT_INST_PROP(n, debounce_period), (k_work), (k_delayed_work)) work; \
bool matrix_state[INST_MATRIX_ROWS(n)][INST_MATRIX_COLS(n)]; \
struct device *rows[INST_MATRIX_ROWS(n)]; \
@ -96,21 +101,25 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -96,21 +101,25 @@ static int kscan_gpio_config_interrupts(struct device **devices,
return ( \
COND_CODE_0(DT_ENUM_IDX(DT_DRV_INST(n), diode_direction), (cfg->rows), (cfg->cols))); \
} \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, (), \
( \
static int kscan_gpio_enable_interrupts_##n(struct device *dev) { \
return kscan_gpio_config_interrupts( \
kscan_gpio_input_devices_##n(dev), kscan_gpio_input_configs_##n(dev), \
INST_INPUT_LEN(n), GPIO_INT_LEVEL_ACTIVE); \
} static int kscan_gpio_disable_interrupts_##n(struct device *dev) { \
return kscan_gpio_config_interrupts(kscan_gpio_input_devices_##n(dev), \
kscan_gpio_input_configs_##n(dev), INST_INPUT_LEN(n), \
GPIO_INT_DEBOUNCE | GPIO_INT_EDGE_BOTH); \
} \
static int kscan_gpio_disable_interrupts_##n(struct device *dev) { \
return kscan_gpio_config_interrupts(kscan_gpio_input_devices_##n(dev), \
kscan_gpio_input_configs_##n(dev), INST_INPUT_LEN(n), \
GPIO_INT_DISABLE); \
} \
kscan_gpio_input_configs_##n(dev), \
INST_INPUT_LEN(n), GPIO_INT_DISABLE); \
})) \
static void kscan_gpio_set_output_state_##n(struct device *dev, int value) { \
int err; \
for (int i = 0; i < INST_OUTPUT_LEN(n); i++) { \
struct device *in_dev = kscan_gpio_output_devices_##n(dev)[i]; \
const struct kscan_gpio_item_config *cfg = &kscan_gpio_output_configs_##n(dev)[i]; \
gpio_pin_set(in_dev, cfg->pin, value); \
if ((err = gpio_pin_set(in_dev, cfg->pin, value))) { \
LOG_DBG("FAILED TO SET OUTPUT %d to %d", cfg->pin, err); \
} \
} \
} \
static void kscan_gpio_set_matrix_state_##n( \
@ -128,7 +137,6 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -128,7 +137,6 @@ static int kscan_gpio_config_interrupts(struct device **devices,
/* Disable our interrupts temporarily while we scan, to avoid */ \
/* re-entry while we iterate columns and set them active one by one */ \
/* to get pressed state for each matrix cell. */ \
kscan_gpio_disable_interrupts_##n(dev); \
kscan_gpio_set_output_state_##n(dev, 0); \
for (int o = 0; o < INST_OUTPUT_LEN(n); o++) { \
struct device *out_dev = kscan_gpio_output_devices_##n(dev)[o]; \
@ -143,10 +151,8 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -143,10 +151,8 @@ static int kscan_gpio_config_interrupts(struct device **devices,
} \
gpio_pin_set(out_dev, out_cfg->pin, 0); \
} \
/* Set all our outputs as active again, then re-enable interrupts, */ \
/* so we can trigger interrupts again for future press/release */ \
/* Set all our outputs as active again. */ \
kscan_gpio_set_output_state_##n(dev, 1); \
kscan_gpio_enable_interrupts_##n(dev); \
for (int r = 0; r < INST_MATRIX_ROWS(n); r++) { \
for (int c = 0; c < INST_MATRIX_COLS(n); c++) { \
bool pressed = read_state[r][c]; \
@ -165,6 +171,9 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -165,6 +171,9 @@ static int kscan_gpio_config_interrupts(struct device **devices,
k_delayed_work_cancel(&data->work); \
k_delayed_work_submit(&data->work, K_MSEC(5)); \
})) \
} else { \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, (), \
(kscan_gpio_enable_interrupts_##n(dev);)) \
} \
return 0; \
} \
@ -176,12 +185,15 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -176,12 +185,15 @@ static int kscan_gpio_config_interrupts(struct device **devices,
gpio_port_pins_t pin) { \
struct kscan_gpio_irq_callback_##n *data = \
CONTAINER_OF(cb, struct kscan_gpio_irq_callback_##n, callback); \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, (), \
(kscan_gpio_disable_interrupts_##n(data->dev);)) \
COND_CODE_0(DT_INST_PROP(n, debounce_period), ({ k_work_submit(data->work); }), ({ \
k_delayed_work_cancel(data->work); \
k_delayed_work_submit(data->work, \
K_MSEC(DT_INST_PROP(n, debounce_period))); \
})) \
} \
\
static struct kscan_gpio_data_##n kscan_gpio_data_##n = { \
.rows = {[INST_MATRIX_ROWS(n) - 1] = NULL}, .cols = {[INST_MATRIX_COLS(n) - 1] = NULL}}; \
static int kscan_gpio_configure_##n(struct device *dev, kscan_callback_t callback) { \
@ -190,15 +202,29 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -190,15 +202,29 @@ static int kscan_gpio_config_interrupts(struct device **devices,
return -EINVAL; \
} \
data->callback = callback; \
LOG_DBG("Configured GPIO %d", n); \
return 0; \
}; \
static int kscan_gpio_enable_##n(struct device *dev) { \
int err = kscan_gpio_enable_interrupts_##n(dev); \
if (err) { \
return err; \
} \
return kscan_gpio_read_##n(dev); \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, \
(struct kscan_gpio_data_##n *data = dev->driver_data; \
k_timer_start(&data->poll_timer, K_MSEC(10), K_MSEC(10)); return 0;), \
(int err = kscan_gpio_enable_interrupts_##n(dev); \
if (err) { return err; } return kscan_gpio_read_##n(dev);)) \
}; \
static int kscan_gpio_disable_##n(struct device *dev) { \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, \
(struct kscan_gpio_data_##n *data = dev->driver_data; \
k_timer_stop(&data->poll_timer); return 0;), \
(return kscan_gpio_disable_interrupts_##n(dev);)) \
}; \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, \
(static void kscan_gpio_timer_handler(struct k_timer *timer) { \
struct kscan_gpio_data_##n *data = \
CONTAINER_OF(timer, struct kscan_gpio_data_##n, poll_timer); \
k_work_submit(&data->work.work); \
}), \
()) \
static int kscan_gpio_init_##n(struct device *dev) { \
struct kscan_gpio_data_##n *data = dev->driver_data; \
int err; \
@ -214,8 +240,11 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -214,8 +240,11 @@ static int kscan_gpio_config_interrupts(struct device **devices,
if (err) { \
LOG_ERR("Unable to configure pin %d on %s for input", in_cfg->pin, in_cfg->label); \
return err; \
} else { \
LOG_DBG("Configured pin %d on %s for input", in_cfg->pin, in_cfg->label); \
} \
irq_callbacks_##n[i].work = &data->work; \
irq_callbacks_##n[i].dev = dev; \
gpio_init_callback(&irq_callbacks_##n[i].callback, \
kscan_gpio_irq_callback_handler_##n, BIT(in_cfg->pin)); \
err = gpio_add_callback(input_devices[i], &irq_callbacks_##n[i].callback); \
@ -241,6 +270,8 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -241,6 +270,8 @@ static int kscan_gpio_config_interrupts(struct device **devices,
} \
} \
data->dev = dev; \
COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, \
(k_timer_init(&data->poll_timer, kscan_gpio_timer_handler, NULL);), ()) \
(COND_CODE_0(DT_INST_PROP(n, debounce_period), (k_work_init), (k_delayed_work_init)))( \
&data->work, kscan_gpio_work_handler_##n); \
return 0; \
@ -248,7 +279,7 @@ static int kscan_gpio_config_interrupts(struct device **devices, @@ -248,7 +279,7 @@ static int kscan_gpio_config_interrupts(struct device **devices,
static const struct kscan_driver_api gpio_driver_api_##n = { \
.config = kscan_gpio_configure_##n, \
.enable_callback = kscan_gpio_enable_##n, \
.disable_callback = kscan_gpio_disable_interrupts_##n, \
.disable_callback = kscan_gpio_disable_##n, \
}; \
static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \
.rows = {UTIL_LISTIFY(INST_MATRIX_ROWS(n), _KSCAN_GPIO_ROW_CFG_INIT, n)}, \

1
app/dts/behaviors.dtsi

@ -9,3 +9,4 @@ @@ -9,3 +9,4 @@
#include <behaviors/sensor_rotate_key_press.dtsi>
#include <behaviors/rgb_underglow.dtsi>
#include <behaviors/bluetooth.dtsi>
#include <behaviors/ext_power.dtsi>

9
app/dts/behaviors/ext_power.dtsi

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
/ {
behaviors {
ext_power: behavior_ext_power {
compatible = "zmk,behavior-ext-power";
label = "EXT_POWER_BEHAVIOR";
#binding-cells = <1>;
};
};
};

10
app/dts/bindings/behaviors/zmk,behavior-ext-power.yaml

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
#
# Copyright (c) 2020, The ZMK Contributors
# SPDX-License-Identifier: MIT
#
description: External power control Behavior
compatible: "zmk,behavior-ext-power"
include: one_param.yaml

2
app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
# Copyright (c) 2020, Pete Johanson
# Copyright (c) 2020, The ZMK Contributors
# SPDX-License-Identifier: MIT
description: Sensor rotate key press/release behavior

20
app/dts/bindings/zmk,ext-power-generic.yaml

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
#
# Copyright (c) 2020, The ZMK Contributors
# SPDX-License-Identifier: MIT
#
description: |
Generic driver for controlling the external power output
by toggling the control-gpio pin status
(Only in supported hardware)
compatible: "zmk,ext-power-generic"
properties:
control-gpios:
type: phandle-array
required: true
label:
type: string
required: true

5
app/dts/bindings/zmk,keymap-sensors.yaml

@ -1,3 +1,8 @@ @@ -1,3 +1,8 @@
#
# Copyright (c) 2020, The ZMK Contributors
# SPDX-License-Identifier: MIT
#
description: |
Allows defining the collection of sensors bound in the keymap layers

44
app/include/drivers/behavior.h

@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
#include <stddef.h>
#include <device.h>
#include <zmk/keys.h>
#include <zmk/behavior.h>
/**
* @cond INTERNAL_HIDDEN
@ -19,10 +20,10 @@ @@ -19,10 +20,10 @@
* (Internal use only.)
*/
typedef int (*behavior_keymap_binding_callback_t)(struct device *dev, u32_t position, u32_t param1,
u32_t param2);
typedef int (*behavior_sensor_keymap_binding_callback_t)(struct device *dev, struct device *sensor,
u32_t param1, u32_t param2);
typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event);
typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding,
struct device *sensor);
__subsystem struct behavior_driver_api {
behavior_keymap_binding_callback_t binding_pressed;
@ -42,18 +43,19 @@ __subsystem struct behavior_driver_api { @@ -42,18 +43,19 @@ __subsystem struct behavior_driver_api {
* @retval 0 If successful.
* @retval Negative errno code if failure.
*/
__syscall int behavior_keymap_binding_pressed(struct device *dev, u32_t position, u32_t param1,
u32_t param2);
__syscall int behavior_keymap_binding_pressed(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event);
static inline int z_impl_behavior_keymap_binding_pressed(struct device *dev, u32_t position,
u32_t param1, u32_t param2) {
static inline int z_impl_behavior_keymap_binding_pressed(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) {
struct device *dev = device_get_binding(binding->behavior_dev);
const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->driver_api;
if (api->binding_pressed == NULL) {
return -ENOTSUP;
}
return api->binding_pressed(dev, position, param1, param2);
return api->binding_pressed(binding, event);
}
/**
@ -64,18 +66,19 @@ static inline int z_impl_behavior_keymap_binding_pressed(struct device *dev, u32 @@ -64,18 +66,19 @@ static inline int z_impl_behavior_keymap_binding_pressed(struct device *dev, u32
* @retval 0 If successful.
* @retval Negative errno code if failure.
*/
__syscall int behavior_keymap_binding_released(struct device *dev, u32_t position, u32_t param1,
u32_t param2);
__syscall int behavior_keymap_binding_released(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event);
static inline int z_impl_behavior_keymap_binding_released(struct device *dev, u32_t position,
u32_t param1, u32_t param2) {
static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) {
struct device *dev = device_get_binding(binding->behavior_dev);
const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->driver_api;
if (api->binding_released == NULL) {
return -ENOTSUP;
}
return api->binding_released(dev, position, param1, param2);
return api->binding_released(binding, event);
}
/**
@ -88,19 +91,20 @@ static inline int z_impl_behavior_keymap_binding_released(struct device *dev, u3 @@ -88,19 +91,20 @@ static inline int z_impl_behavior_keymap_binding_released(struct device *dev, u3
* @retval 0 If successful.
* @retval Negative errno code if failure.
*/
__syscall int behavior_sensor_keymap_binding_triggered(struct device *dev, struct device *sensor,
u32_t param1, u32_t param2);
__syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding,
struct device *sensor);
static inline int z_impl_behavior_sensor_keymap_binding_triggered(struct device *dev,
struct device *sensor,
u32_t param1, u32_t param2) {
static inline int
z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding,
struct device *sensor) {
struct device *dev = device_get_binding(binding->behavior_dev);
const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->driver_api;
if (api->sensor_binding_triggered == NULL) {
return -ENOTSUP;
}
return api->sensor_binding_triggered(dev, sensor, param1, param2);
return api->sensor_binding_triggered(binding, sensor);
}
/**

104
app/include/drivers/ext_power.h

@ -0,0 +1,104 @@ @@ -0,0 +1,104 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <zephyr/types.h>
#include <stddef.h>
#include <device.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @cond INTERNAL_HIDDEN
*
* Behavior driver API definition and system call entry points.
*
* (Internal use only.)
*/
typedef int (*ext_power_enable_t)(struct device *dev);
typedef int (*ext_power_disable_t)(struct device *dev);
typedef int (*ext_power_get_t)(struct device *dev);
__subsystem struct ext_power_api {
ext_power_enable_t enable;
ext_power_disable_t disable;
ext_power_get_t get;
};
/**
* @endcond
*/
/**
* @brief Enable the external power output
* @param dev Pointer to the device structure for the driver instance.
*
* @retval 0 If successful.
* @retval Negative errno code if failure.
*/
__syscall int ext_power_enable(struct device *dev);
static inline int z_impl_ext_power_enable(struct device *dev) {
const struct ext_power_api *api = (const struct ext_power_api *)dev->driver_api;
if (api->enable == NULL) {
return -ENOTSUP;
}
return api->enable(dev);
}
/**
* @brief Disable the external power output
* @param dev Pointer to the device structure for the driver instance.
*
* @retval 0 If successful.
* @retval Negative errno code if failure.
*/
__syscall int ext_power_disable(struct device *dev);
static inline int z_impl_ext_power_disable(struct device *dev) {
const struct ext_power_api *api = (const struct ext_power_api *)dev->driver_api;
if (api->disable == NULL) {
return -ENOTSUP;
}
return api->disable(dev);
}
/**
* @brief Get the current status of the external power output
* @param dev Pointer to the device structure for the driver instance.
*
* @retval 0 If ext power is disabled.
* @retval 1 if ext power is enabled.
* @retval Negative errno code if failure.
*/
__syscall int ext_power_get(struct device *dev);
static inline int z_impl_ext_power_get(struct device *dev) {
const struct ext_power_api *api = (const struct ext_power_api *)dev->driver_api;
if (api->get == NULL) {
return -ENOTSUP;
}
return api->get(dev);
}
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#include <syscalls/ext_power.h>

2
app/include/dt-bindings/zmk/bt.h

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com>
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

13
app/include/dt-bindings/zmk/ext_power.h

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#define EXT_POWER_OFF_CMD 0
#define EXT_POWER_ON_CMD 1
#define EXT_POWER_TOGGLE_CMD 2
#define EP_ON EXT_POWER_ON_CMD
#define EP_OFF EXT_POWER_OFF_CMD
#define EP_TOG EXT_POWER_TOGGLE_CMD

5
app/include/dt-bindings/zmk/keys.h

@ -1,3 +1,8 @@ @@ -1,3 +1,8 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#pragma once

6
app/include/dt-bindings/zmk/kscan-mock.h

@ -1,3 +1,9 @@ @@ -1,3 +1,9 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#define ZMK_MOCK_IS_PRESS(v) ((v & (0x01 << 31)) != 0)

5
app/include/dt-bindings/zmk/matrix-transform.h

@ -1,3 +1,8 @@ @@ -1,3 +1,8 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#define KT_ROW(item) (item >> 8)
#define KT_COL(item) (item & 0xFF)

5
app/include/dt-bindings/zmk/rgb.h

@ -1,3 +1,8 @@ @@ -1,3 +1,8 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#define RGB_TOG 0
#define RGB_HUI 1

6
app/include/zmk/behavior.h

@ -11,3 +11,9 @@ struct zmk_behavior_binding { @@ -11,3 +11,9 @@ struct zmk_behavior_binding {
u32_t param1;
u32_t param2;
};
struct zmk_behavior_binding_event {
int layer;
u32_t position;
s64_t timestamp;
};

2
app/include/zmk/ble/profile.h

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com>
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save