Compare commits
240 Commits
v8.2.1
...
action-cac
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21ae72dd9e | ||
|
|
5fe19abe06 | ||
|
|
06e34fdcbc | ||
|
|
cc6666b96d | ||
|
|
a22dfdd917 | ||
|
|
8b69a25dda | ||
|
|
6f2b45c27c | ||
|
|
98f7d512de | ||
|
|
c5cf738fd0 | ||
|
|
af31ae210a | ||
|
|
44799995b9 | ||
|
|
3f5f83a19b | ||
|
|
bc4f35e578 | ||
|
|
e9309aab16 | ||
|
|
f004b84399 | ||
|
|
58f8120611 | ||
|
|
5b71fb7aaa | ||
|
|
9d0f41bf5e | ||
|
|
47a3a8ad80 | ||
|
|
b4908bf2ac | ||
|
|
846342e851 | ||
|
|
3196abe574 | ||
|
|
5f0bae1840 | ||
|
|
c3a38c8b59 | ||
|
|
1f9d31cad4 | ||
|
|
b89de6655e | ||
|
|
4a1b747197 | ||
|
|
eca87d2f62 | ||
|
|
2e2b9d08a9 | ||
|
|
b4c2204e50 | ||
|
|
4c0546de6c | ||
|
|
bea4c34a51 | ||
|
|
bdc6232780 | ||
|
|
1d2d1c5049 | ||
|
|
67f07abd0d | ||
|
|
4bfcd6e02c | ||
|
|
7eb190489b | ||
|
|
640c034111 | ||
|
|
a6f12848ed | ||
|
|
47f6a27e48 | ||
|
|
9cc383a91d | ||
|
|
a441cdf5d2 | ||
|
|
8297dd5c48 | ||
|
|
225a481938 | ||
|
|
5572952dc8 | ||
|
|
7d011237f8 | ||
|
|
1a47c6e629 | ||
|
|
047a232e7e | ||
|
|
28f5999cbb | ||
|
|
fe7505a2df | ||
|
|
b6ac16074c | ||
|
|
0bf205c5d2 | ||
|
|
e4a99a9400 | ||
|
|
1e9b5833eb | ||
|
|
79b052fca7 | ||
|
|
baee0b5682 | ||
|
|
6153d54f59 | ||
|
|
0a6ebe2903 | ||
|
|
1fbbeb0f33 | ||
|
|
456f0e9e58 | ||
|
|
0248a0e79f | ||
|
|
0e5ec29433 | ||
|
|
2d7cd68459 | ||
|
|
5ac10fabcb | ||
|
|
b11017609d | ||
|
|
c3a5d258e5 | ||
|
|
a2866feb77 | ||
|
|
8c50192d6c | ||
|
|
63d82d92db | ||
|
|
1bced1be13 | ||
|
|
86196d438c | ||
|
|
d722b3d173 | ||
|
|
2ef5c49090 | ||
|
|
5a137392ee | ||
|
|
27d12ea31f | ||
|
|
9ba09ec8eb | ||
|
|
014addd777 | ||
|
|
4562a17155 | ||
|
|
950843ca2c | ||
|
|
9600f46f83 | ||
|
|
ef7589d83a | ||
|
|
84f48ed055 | ||
|
|
ebef301e27 | ||
|
|
5b8b8d93e4 | ||
|
|
d48049535e | ||
|
|
5bd479ab8e | ||
|
|
372151848a | ||
|
|
5b32c0da43 | ||
|
|
edf34de4b5 | ||
|
|
8c7eb079ec | ||
|
|
6612f7cced | ||
|
|
7606f311c8 | ||
|
|
9fe73233af | ||
|
|
cba1ef97b6 | ||
|
|
c69f664e85 | ||
|
|
6c895988de | ||
|
|
f16a004583 | ||
|
|
c870f335a7 | ||
|
|
b6f59563c7 | ||
|
|
409bd01af6 | ||
|
|
b9b5eb2c76 | ||
|
|
11a8ffbaf5 | ||
|
|
9938f14d20 | ||
|
|
217259ba63 | ||
|
|
e5afa33b79 | ||
|
|
d3dfc9bd2c | ||
|
|
8f6251bc4d | ||
|
|
b93f211502 | ||
|
|
69411e53e9 | ||
|
|
39819e6058 | ||
|
|
bd97bba4b5 | ||
|
|
4214f3e0b6 | ||
|
|
6eceb6ad30 | ||
|
|
994e2f6b79 | ||
|
|
baa5e8f037 | ||
|
|
cbd5f1b500 | ||
|
|
c1dc4be8c8 | ||
|
|
1bd8c7dca8 | ||
|
|
d72ea4dde5 | ||
|
|
5d621880ec | ||
|
|
5c3e2966c4 | ||
|
|
d21fe30139 | ||
|
|
224d9eae42 | ||
|
|
8c02f3db53 | ||
|
|
02bbeb7177 | ||
|
|
cdfabaec42 | ||
|
|
0e9525ce9a | ||
|
|
633a6cec77 | ||
|
|
d35a7cc644 | ||
|
|
76a91c010b | ||
|
|
54b0a595bc | ||
|
|
4b9aa0860c | ||
|
|
df8792a60d | ||
|
|
5988fce59b | ||
|
|
314eb0d771 | ||
|
|
c1f5a96e1b | ||
|
|
64592d7032 | ||
|
|
c6b180b8f5 | ||
|
|
0155447c6a | ||
|
|
04f4053bde | ||
|
|
09a58b607c | ||
|
|
be82530412 | ||
|
|
6e11c0b8af | ||
|
|
9fade6368c | ||
|
|
ff99c2e734 | ||
|
|
6d356114a8 | ||
|
|
3041132959 | ||
|
|
2877773cac | ||
|
|
a061febd01 | ||
|
|
e3773fd5c0 | ||
|
|
a92835454d | ||
|
|
64e5fa7ecb | ||
|
|
d1894fb62a | ||
|
|
fe7065be4a | ||
|
|
e7b3127af1 | ||
|
|
724378cf6c | ||
|
|
14eb9c6ec0 | ||
|
|
9a8b1ef8b9 | ||
|
|
2cc94bd1fc | ||
|
|
ad8de4dd56 | ||
|
|
5e97ad1b3c | ||
|
|
fe06ed0a4b | ||
|
|
d449123fab | ||
|
|
4d483e7896 | ||
|
|
b1cbeefa28 | ||
|
|
9be3cf4865 | ||
|
|
65006cc376 | ||
|
|
fc01b29823 | ||
|
|
462595ef03 | ||
|
|
b0d85795f4 | ||
|
|
2c91ef51db | ||
|
|
a54e7ac0a8 | ||
|
|
64f54c268b | ||
|
|
d889d51a7d | ||
|
|
b284e9fa58 | ||
|
|
1a0da7971a | ||
|
|
53a82a5f57 | ||
|
|
10985abcdb | ||
|
|
e60a282742 | ||
|
|
a691b16ebe | ||
|
|
c38114648a | ||
|
|
3fc4419f4f | ||
|
|
033bdf6491 | ||
|
|
18e3ba9558 | ||
|
|
3fb552cc55 | ||
|
|
d093c84fb4 | ||
|
|
95d7197394 | ||
|
|
989774ced9 | ||
|
|
0e29276a56 | ||
|
|
5b90d78518 | ||
|
|
d2eb4b43c7 | ||
|
|
a545324693 | ||
|
|
27b02c32b5 | ||
|
|
01e92e57f4 | ||
|
|
51b2631012 | ||
|
|
66c877f7bd | ||
|
|
7c1431f0ab | ||
|
|
772078f8f6 | ||
|
|
46244b8f5f | ||
|
|
5fc59f40bc | ||
|
|
460cd3c602 | ||
|
|
e391d6dac8 | ||
|
|
41afff5ea4 | ||
|
|
187ae2821b | ||
|
|
cb52c273b4 | ||
|
|
5a523e64d8 | ||
|
|
970f622bff | ||
|
|
293438fa61 | ||
|
|
455c1a30cb | ||
|
|
58e4919c0e | ||
|
|
dd7b0a6e3b | ||
|
|
59396baf76 | ||
|
|
8d9340c05b | ||
|
|
0930a000fa | ||
|
|
332560d2d2 | ||
|
|
0344a79f65 | ||
|
|
4577b118bc | ||
|
|
ad8aca5793 | ||
|
|
8bb9711793 | ||
|
|
3cb0490e5e | ||
|
|
58fa1ed6a4 | ||
|
|
9aa78ef5bf | ||
|
|
7c4c354828 | ||
|
|
c3407e1410 | ||
|
|
492243f801 | ||
|
|
6f0b1adc14 | ||
|
|
b917a97e93 | ||
|
|
bf69f28ed1 | ||
|
|
10802f3f73 | ||
|
|
66252eabf0 | ||
|
|
0c4c736552 | ||
|
|
aa4105bdc3 | ||
|
|
101abffec4 | ||
|
|
b8268f55a3 | ||
|
|
2214f00667 | ||
|
|
a2fae5bbef | ||
|
|
47e026006e | ||
|
|
379d827982 | ||
|
|
d9d26814e8 | ||
|
|
611c36fe00 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
package-lock.json
|
package-lock.json
|
||||||
node_modules
|
node_modules
|
||||||
|
build_make
|
||||||
|
|||||||
43
.travis.yml
43
.travis.yml
@@ -1,25 +1,22 @@
|
|||||||
language: generic
|
language: c
|
||||||
|
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
- $HOME/Library/Caches/Homebrew/Cask
|
# Cache for the gcc archives
|
||||||
install: eclipse -noSplash
|
- $HOME/gcc-cache/
|
||||||
-application org.eclipse.equinox.p2.director
|
|
||||||
-repository http://gnuarmeclipse.sourceforge.net/updates
|
install:
|
||||||
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group
|
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then GCC_NAME="gcc-arm-none-eabi-7-2017-q4-major-mac.tar.bz2"; else GCC_NAME="gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2"; fi
|
||||||
-profileProperties org.eclipse.update.install.features=true
|
- if test ! -e $HOME/gcc-cache/$GCC_NAME ; then wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/$GCC_NAME" -O $HOME/gcc-cache/$GCC_NAME ; fi
|
||||||
script: eclipse -noSplash
|
- tar -xf $HOME/gcc-cache/$GCC_NAME -C $HOME
|
||||||
-application org.eclipse.cdt.managedbuilder.core.headlessbuild
|
- export PATH=$PATH:$HOME/gcc-arm-none-eabi-7-2017-q4-major/bin
|
||||||
-import $TRAVIS_BUILD_DIR/left/build
|
|
||||||
-import $TRAVIS_BUILD_DIR/right/build
|
script:
|
||||||
-build all
|
- make -C left clean && make -j2 -C left DEBUG=1
|
||||||
matrix:
|
- make -C left clean && make -j2 -C left DEBUG=0
|
||||||
include:
|
- make -C right clean && make -j2 -C right DEBUG=1
|
||||||
- os: linux
|
- make -C right clean && make -j2 -C right DEBUG=0
|
||||||
sudo: required
|
|
||||||
before_install:
|
|
||||||
- curl https://nixos.org/nix/install | sh && . ~/.nix-profile/etc/profile.d/nix.sh
|
|
||||||
- nix-env -i gcc-arm-embedded-4.8-2014q1-20140314
|
|
||||||
- nix-env -i eclipse-cpp
|
|
||||||
- os: osx
|
|
||||||
env: PATH="$PATH:/Applications/Eclipse CPP.app/Contents/MacOS"
|
|
||||||
before_install: brew update && brew bundle -v
|
|
||||||
|
|||||||
128
CHANGELOG.md
128
CHANGELOG.md
@@ -5,6 +5,134 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
|
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
|
||||||
|
|
||||||
|
## [8.5.2] - 2018-10-06
|
||||||
|
|
||||||
|
Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Don't suppress keys upon keymap change.
|
||||||
|
|
||||||
|
## [8.5.1] - 2018-10-04
|
||||||
|
|
||||||
|
Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Reset UsbReportUpdateSemaphore if it gets stuck for 100ms. This should fix occasional freezes.
|
||||||
|
|
||||||
|
## [8.5.0] - 2018-10-04
|
||||||
|
|
||||||
|
Device Protocol: 4.**5.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Send primary role modifiers consistently.
|
||||||
|
- Only allow layer switcher keys to deactivate toggled layers.
|
||||||
|
- Deactivate secondary roles when switching keymaps.
|
||||||
|
- Use the correct scancode so that commas are outputted for macros.
|
||||||
|
- Move the pointer not by 1 but by 5 pixels when testing the USB stack to make the pointer easier to see.
|
||||||
|
- Expose UsbReportUpdateSemaphore via UsbCommand_{Get,Set}Variable() `DEVICEPROTOCOL:MINOR`
|
||||||
|
- Extract CurrentTime and remove Timer_{Get,Set}CurrentTime()
|
||||||
|
|
||||||
|
## [8.4.5] - 2018-08-21
|
||||||
|
|
||||||
|
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Suppress pressed keys when the layer or keymap changes.
|
||||||
|
|
||||||
|
## [8.4.4] - 2018-08-14
|
||||||
|
|
||||||
|
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Don't wake the host if a key is held down through the beginning of sleep.
|
||||||
|
- Ensure that secondary roles are triggered consistently.
|
||||||
|
|
||||||
|
## [8.4.3] - 2018-08-12
|
||||||
|
|
||||||
|
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Compensate "double tap to lock layer" timeouts for the timer fix to make them as long as before 8.3.3
|
||||||
|
|
||||||
|
## [8.4.2] - 2018-08-02
|
||||||
|
|
||||||
|
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Fix various bugs related to secondary role handling and sticky modifier states.
|
||||||
|
|
||||||
|
## [8.4.1] - 2018-07-31
|
||||||
|
|
||||||
|
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Make some improvements to the sleep/wake code.
|
||||||
|
|
||||||
|
## [8.4.0] - 2018-07-24
|
||||||
|
|
||||||
|
Device Protocol: 4.**4.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Rewrite the key debouncer and set the press and release timeouts to 50ms.
|
||||||
|
- Add hardcoded test keymap.
|
||||||
|
- Make debounce timeouts configurable via USB. `DEVICEPROTOCOL:MINOR`
|
||||||
|
- Make the hardcoded test keymap able to trigger via USB. `DEVICEPROTOCOL:MINOR`
|
||||||
|
- Allow the USB stack test mode to be activated via USB. `DEVICEPROTOCOL:MINOR`
|
||||||
|
|
||||||
|
## [8.3.3] - 2018-07-03
|
||||||
|
|
||||||
|
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Implement the macro engine.
|
||||||
|
- Fix the timer which makes it tick twice as fast as before.
|
||||||
|
- Fix the nondeterministic bug that made USB hang.
|
||||||
|
- Restore the Windows related commits of firmware 8.3.1 because the USB hang bug has been fixed.
|
||||||
|
- Restore debouncing to 100ms until it gets really fixed.
|
||||||
|
|
||||||
|
## [8.3.2] - 2018-06-27
|
||||||
|
|
||||||
|
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Make the debouncer debounce not only on key presses but also on key releases, and change the debounce interval from 100ms to the suggested 5ms of MX switches.
|
||||||
|
- Revert the Windows related commits of firmware 8.3.1 because they introduced a nondeterministic bug that made USB hang.
|
||||||
|
- Add base layer key mappings for the left and right add-ons for testing purposes.
|
||||||
|
|
||||||
|
## [8.3.1] - 2018-06-07
|
||||||
|
|
||||||
|
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Fix media key repetition bug on Windows.
|
||||||
|
- Fix bug that made Windows unable to sleep when the UHK was plugged in.
|
||||||
|
- Fix bug that made Chrome Remote Desktop blocked from interacting on Windows.
|
||||||
|
- Fix bug that made locked layers not release. This bug was introduced in the previous release.
|
||||||
|
|
||||||
|
## [8.3.0] - 2018-06-03
|
||||||
|
|
||||||
|
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.**1.0** | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Make the config parser handle switch layer actions with hold on double tap disabled. `USERCONFIG:MINOR`
|
||||||
|
- Set key debounce timeout from 80ms to 100ms. This should further reduce key chattering.
|
||||||
|
|
||||||
|
## [8.2.5] - 2018-05-27
|
||||||
|
|
||||||
|
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Now really fix the bug that made the hardware and user configuration not load from the EEPROM on some hosts right after firmware update.
|
||||||
|
|
||||||
|
## [8.2.4] - 2018-05-21
|
||||||
|
|
||||||
|
Device Protocol: 4.3.**1** | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Fix the bug that made the hardware and user configuration not load from the EEPROM on some hosts right after firmware update.
|
||||||
|
- Set the signature of the hardware config to "FTY" in the RAM when the keyboard is in factory reset mode, allowing Agent to be aware of the factory reset state. `DEVICEPROTOCOL:PATCH`
|
||||||
|
- Load the hardware and user configuration from the EEPROM even in factory reset mode.
|
||||||
|
- Set key debounce timeout from 60ms to 80ms. This should further reduce key chattering.
|
||||||
|
|
||||||
|
## [8.2.3] - 2018-05-15
|
||||||
|
|
||||||
|
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Don't switch keymaps instead of playing macros.
|
||||||
|
- Make saving the user configuration faster by only writing the part of the EEPROM which actually contains the user configuration.
|
||||||
|
|
||||||
|
## [8.2.2] - 2018-05-09
|
||||||
|
|
||||||
|
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.**1** | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Parse long media macro actions. `USERCONFIG:PATCH`
|
||||||
|
- Fix vendor-specific USB usage page entry. This makes the HIDAPI Linux/hidraw driver able to access interface 0.
|
||||||
|
|
||||||
## [8.2.1] - 2018-05-02
|
## [8.2.1] - 2018-05-02
|
||||||
|
|
||||||
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||||
|
|||||||
1
ISSUE_TEMPLATE
Normal file
1
ISSUE_TEMPLATE
Normal file
@@ -0,0 +1 @@
|
|||||||
|
If you're using Karabiner Elements on your Mac, then stop here! Make sure to close Karabiner Elements, then try to reproduce the issue again, even if you think that Karabiner Elements shouldn't be the cause. Karabiner Elements is the source of numerous problems, and we don't want to receive any more reports it causes.
|
||||||
24
README.md
24
README.md
@@ -4,31 +4,23 @@
|
|||||||
|
|
||||||
This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
|
This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
|
||||||
|
|
||||||
## Updating to the latest firmware
|
If you want to use the latest firmware version for your UHK, then instead of going through the pain of building the firmware, simply download the [latest release of Agent](https://github.com/UltimateHackingKeyboard/agent/releases/latest) and update to the latest firmware version within Agent with a click of a button.
|
||||||
|
|
||||||
Want to update your UHK to the latest firmware version? Simply download the [latest release of Agent](https://github.com/UltimateHackingKeyboard/agent/releases/latest) which includes the latest firmware version. You'll be easily able to update the firmware within Agent.
|
If you're one of the brave few who wants to hack the firmware then read on.
|
||||||
|
|
||||||
## Cloning the repository
|
1. Make sure to clone this repo with:
|
||||||
|
|
||||||
Please make sure to clone this repo with:
|
|
||||||
|
|
||||||
`git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git`
|
`git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git`
|
||||||
|
|
||||||
This will download the dependent submodules, which are required to build the firmware.
|
2. Download and install MCUXpresso IDE for [Linux](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/mcuxpressoide-10.2.1_795.x86_64.deb.bin), [Mac](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.2.1_795.pkg), or [Windows](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.2.1_795.exe).
|
||||||
|
|
||||||
## Importing the firmware
|
3. In the IDE, import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button.
|
||||||
|
|
||||||
Install [Kinetis Design Studio](http://www.nxp.com/products/software-and-tools/run-time-software/kinetis-software-and-tools/ides-for-kinetis-mcus/kinetis-design-studio-integrated-development-environment-ide:KDS_IDE) (KDS), import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button.
|
4. In order to be able to flash the firmware via USB from the IDE, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) which is Git submodule of the this repo and located in the `lib/agent` directory.
|
||||||
|
|
||||||
## Building and flashing the firmware
|
5. Finally, in the IDE, click on *Run -> External Tools -> External Tools Configurations*, then select a release firmware to be flashed such as *uhk60-right_release_kboot*, and click on the *Run* button.
|
||||||
|
|
||||||
For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk60-left_release_jlink*, and click on the *Debug* button.
|
Going forward, it's easier to flash the firmware of your choice by using the downwards toolbar icon which is located rightwards of the *green play + toolbox icon*.
|
||||||
|
|
||||||
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first.
|
|
||||||
|
|
||||||
At this point, you can flash the right firmware via USB from KDS. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) that is Git submodule of the this repo and located in the `lib/agent` directory. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk60-right_release_kboot*, and click on the *Run* button.
|
|
||||||
|
|
||||||
From this point on, you can upgrade the firmwares of both halves via USB by using the uhk60-left_release_kboot and uhk60-right_release_kboot run configurations. Alternatively, you can use your SEGGER J-Link probe.
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
cask 'gcc-arm-embedded' do
|
|
||||||
version '4_8-2014q3'
|
|
||||||
sha256 '6b30901738b09a8d22fdfff99e991217444b80ac492a6163af5c06a3baaa3487'
|
|
||||||
|
|
||||||
# launchpad.net/gcc-arm-embedded/ was verified as official when first introduced to the cask
|
|
||||||
url "https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q3-update/+download/gcc-arm-none-eabi-#{version}-20140805-mac.tar.bz2"
|
|
||||||
name 'GCC ARM Embedded'
|
|
||||||
homepage 'https://developer.arm.com/open-source/gnu-toolchain/gnu-rm'
|
|
||||||
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-addr2line"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ar"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-as"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-c++"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-c++filt"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-cpp"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-elfedit"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-g++"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc-ar"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc-nm"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc-ranlib"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcov"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gdb"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gprof"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ld"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ld.bfd"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-nm"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-objcopy"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-objdump"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ranlib"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-readelf"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-size"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-strings"
|
|
||||||
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-strip"
|
|
||||||
end
|
|
||||||
58
left/Makefile
Normal file
58
left/Makefile
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# Copyright (C) 2018 Kristian Lauszus. All rights reserved.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Contact information
|
||||||
|
# -------------------
|
||||||
|
# Kristian Lauszus
|
||||||
|
# Web : http://www.lauszus.com
|
||||||
|
# e-mail : lauszus@gmail.com
|
||||||
|
|
||||||
|
# Set project name.
|
||||||
|
PROJECT_NAME = uhk_left
|
||||||
|
|
||||||
|
# Defines the part type that this project uses.
|
||||||
|
PART = MKL03Z32VFK4
|
||||||
|
|
||||||
|
# Defines the linker script to use for the application.
|
||||||
|
LDSCRIPT = ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/gcc/MKL03Z32xxx4_flash.ld
|
||||||
|
|
||||||
|
# Size of the heap and stack.
|
||||||
|
HEAP_SIZE = 0
|
||||||
|
STACK_SIZE = 0x0050
|
||||||
|
|
||||||
|
# Set the compiler CPU and FPU options.
|
||||||
|
CPU = -mcpu=cortex-m0plus
|
||||||
|
FPU = -mfloat-abi=soft
|
||||||
|
|
||||||
|
# Command for flashing the left half of the keyboard.
|
||||||
|
FLASH_CMD = node ../lib/agent/packages/usb/update-module-firmware.js leftHalf $(PROJECT_OBJ:.axf=.bin)
|
||||||
|
|
||||||
|
# Path to the JLink script used for the left half.
|
||||||
|
JLINK_SCRIPT = ../scripts/flash-left.jlink
|
||||||
|
|
||||||
|
# Source files.
|
||||||
|
SOURCE = $(wildcard src/*.c) \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/system_MKL03Z4.c \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/gcc/startup_MKL03Z4.S \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_clock.c \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_gpio.c \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_i2c.c \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_lptmr.c \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_spi.c \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.c \
|
||||||
|
$(wildcard ../shared/*.c) \
|
||||||
|
$(wildcard ../shared/slave/*.c)
|
||||||
|
|
||||||
|
# Header files.
|
||||||
|
IPATH = src \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/CMSIS/Include \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4 \
|
||||||
|
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers \
|
||||||
|
../shared
|
||||||
|
|
||||||
|
# Include main Makefile.
|
||||||
|
include ../scripts/Makedefs.mk
|
||||||
@@ -5,16 +5,16 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_debug">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_debug">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
|
||||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath="">
|
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
|
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.2943267007" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.2943267007" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.9995899345" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.9995899345" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1777290613" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1777290613" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||||
<builder buildPath="${workspace_loc:/k64f}/debug" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1406291427" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
<builder buildPath="${workspace_loc:/uhk-left}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1406291427" incrementalBuildTarget="all DEBUG=1" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
||||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2007968129" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2007968129" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1246588554" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1246588554" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.2122094274" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.2122094274" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
||||||
@@ -165,16 +165,16 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_release">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_release">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" name="uhk60-left_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" name="uhk60-left_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
||||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078." name="/" resourcePath="">
|
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1802192936" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1802192936" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.918206081" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.918206081" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.6545741443.1540890614" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.6545741443.1540890614" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1382191896" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1382191896" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.2107171855" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.2107171855" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||||
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1689719605" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
<builder buildPath="${workspace_loc:/uhk-left}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1689719605" incrementalBuildTarget="all DEBUG=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
||||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1477971290" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1477971290" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.334227408" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.334227408" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1702866230" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1702866230" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
||||||
|
|||||||
@@ -31,6 +31,16 @@
|
|||||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
<linkedResources>
|
<linkedResources>
|
||||||
|
<link>
|
||||||
|
<name>Makedefs.mk</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-PROJECT_LOC/scripts/Makedefs.mk</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Makefile</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-1-PROJECT_LOC/Makefile</locationURI>
|
||||||
|
</link>
|
||||||
<link>
|
<link>
|
||||||
<name>drivers</name>
|
<name>drivers</name>
|
||||||
<type>2</type>
|
<type>2</type>
|
||||||
|
|||||||
@@ -1,34 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
|
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
|
|
||||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="leftHalf uhk60-left_debug/uhk-left.bin"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-module-firmware.js"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-left"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
|
||||||
<listEntry value="/uhk-left"/>
|
|
||||||
</listAttribute>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
|
||||||
<listEntry value="4"/>
|
|
||||||
</listAttribute>
|
|
||||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|||||||
@@ -1,48 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
|
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
|
|
||||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="leftHalf uhk60-left_release/uhk-left.bin"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-module-firmware.js"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-left"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
|
||||||
<listEntry value="/uhk-left"/>
|
|
||||||
</listAttribute>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
|
||||||
<listEntry value="4"/>
|
|
||||||
</listAttribute>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
|
|
||||||
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
|
|
||||||
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
|
|
||||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
#ifndef __CONFIG_H__
|
|
||||||
#define __CONFIG_H__
|
|
||||||
|
|
||||||
// Macros:
|
|
||||||
|
|
||||||
#define I2C_WATCHDOG_VALUE_REINIT 1
|
|
||||||
#define I2C_WATCHDOG_VALUE_REBOOT 2
|
|
||||||
|
|
||||||
// #define DEBUG_OVER_SPI
|
|
||||||
#define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REINIT
|
|
||||||
// #define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REBOOT
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#ifdef DEBUG_OVER_SPI
|
|
||||||
|
|
||||||
#include "debug_over_spi.h"
|
|
||||||
#include "config.h"
|
|
||||||
#include "fsl_gpio.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define EXAMPLE_SPI_MASTER (SPI0)
|
|
||||||
#define EXAMPLE_SPI_MASTER_SOURCE_CLOCK (kCLOCK_BusClk)
|
|
||||||
|
|
||||||
#define BUFFER_SIZE (64)
|
|
||||||
static uint8_t srcBuff[BUFFER_SIZE];
|
|
||||||
|
|
||||||
static spi_transfer_t xfer = {0};
|
|
||||||
static spi_master_config_t userConfig;
|
|
||||||
spi_master_handle_t handle;
|
|
||||||
|
|
||||||
static volatile bool masterFinished = true;
|
|
||||||
|
|
||||||
static void masterCallback(SPI_Type *base, spi_master_handle_t *masterHandle, status_t status, void *userData)
|
|
||||||
{
|
|
||||||
masterFinished = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DebugOverSpi_Init(void)
|
|
||||||
{
|
|
||||||
CLOCK_EnableClock(DEBUG_OVER_SPI_MOSI_CLOCK);
|
|
||||||
CLOCK_EnableClock(DEBUG_OVER_SPI_SCK_CLOCK);
|
|
||||||
|
|
||||||
PORT_SetPinMux(DEBUG_OVER_SPI_MOSI_PORT, DEBUG_OVER_SPI_MOSI_PIN, kPORT_MuxAlt3);
|
|
||||||
PORT_SetPinMux(DEBUG_OVER_SPI_SCK_PORT, DEBUG_OVER_SPI_SCK_PIN, kPORT_MuxAlt3);
|
|
||||||
|
|
||||||
GPIO_PinInit(DEBUG_OVER_SPI_MOSI_GPIO, DEBUG_OVER_SPI_MOSI_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
|
||||||
GPIO_PinInit(DEBUG_OVER_SPI_SCK_GPIO, DEBUG_OVER_SPI_SCK_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
|
||||||
|
|
||||||
GPIO_SetPinsOutput(DEBUG_OVER_SPI_MOSI_GPIO, 1U << DEBUG_OVER_SPI_MOSI_PIN);
|
|
||||||
GPIO_SetPinsOutput(DEBUG_OVER_SPI_SCK_GPIO, 1U << DEBUG_OVER_SPI_SCK_PIN);
|
|
||||||
|
|
||||||
SPI_MasterGetDefaultConfig(&userConfig);
|
|
||||||
uint32_t srcFreq = CLOCK_GetFreq(EXAMPLE_SPI_MASTER_SOURCE_CLOCK);
|
|
||||||
SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, srcFreq);
|
|
||||||
SPI_MasterTransferCreateHandle(EXAMPLE_SPI_MASTER, &handle, masterCallback, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DebugOverSpi_Send(uint8_t *tx, uint8_t len)
|
|
||||||
{
|
|
||||||
if (masterFinished) {
|
|
||||||
masterFinished = false;
|
|
||||||
memcpy(srcBuff, tx, MIN(BUFFER_SIZE, len));
|
|
||||||
xfer.txData = srcBuff;
|
|
||||||
xfer.dataSize = len;
|
|
||||||
SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &handle, &xfer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#ifdef DEBUG_OVER_SPI
|
|
||||||
|
|
||||||
#ifndef __DEBUG_OVER_SPI_H__
|
|
||||||
#define __DEBUG_OVER_SPI_H__
|
|
||||||
|
|
||||||
// Includes:
|
|
||||||
|
|
||||||
#include "fsl_common.h"
|
|
||||||
#include "fsl_port.h"
|
|
||||||
#include "fsl_spi.h"
|
|
||||||
|
|
||||||
// Macros:
|
|
||||||
|
|
||||||
#define DEBUG_OVER_SPI_MOSI_PORT PORTA
|
|
||||||
#define DEBUG_OVER_SPI_MOSI_GPIO GPIOA
|
|
||||||
#define DEBUG_OVER_SPI_MOSI_CLOCK kCLOCK_PortA
|
|
||||||
#define DEBUG_OVER_SPI_MOSI_PIN 7
|
|
||||||
|
|
||||||
#define DEBUG_OVER_SPI_SCK_PORT PORTB
|
|
||||||
#define DEBUG_OVER_SPI_SCK_GPIO GPIOB
|
|
||||||
#define DEBUG_OVER_SPI_SCK_CLOCK kCLOCK_PortB
|
|
||||||
#define DEBUG_OVER_SPI_SCK_PIN 0
|
|
||||||
|
|
||||||
// Functions:
|
|
||||||
|
|
||||||
void DebugOverSpi_Init(void);
|
|
||||||
void DebugOverSpi_Send(uint8_t *tx, uint8_t len);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define DebugOverSpi_Init()
|
|
||||||
#define DebugOverSpi_Send(tx, len)
|
|
||||||
#endif
|
|
||||||
@@ -3,40 +3,31 @@
|
|||||||
#include "i2c_watchdog.h"
|
#include "i2c_watchdog.h"
|
||||||
#include "test_led.h"
|
#include "test_led.h"
|
||||||
#include "init_peripherals.h"
|
#include "init_peripherals.h"
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
/* NOTE: Because of a bug in the ROM bootloader of the KL03Z, the watchdog timer is disabled and cannot be re-enabled.
|
// NOTE: Because of a bug in the ROM bootloader of the KL03Z, the watchdog timer is disabled and cannot be re-enabled.
|
||||||
* See https://community.nxp.com/thread/457893
|
// See https://community.nxp.com/thread/457893
|
||||||
* Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
|
// Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
|
||||||
*/
|
static uint32_t prevWatchdogCounter = 0;
|
||||||
#ifdef I2C_WATCHDOG
|
static uint32_t I2cWatchdog_RecoveryCounter; // Counter for how many times we had to recover and restart
|
||||||
static uint32_t prevWatchdogCounter = 0;
|
|
||||||
static uint32_t I2cWatchdog_RecoveryCounter; /* counter for how many times we had to recover and restart */
|
|
||||||
|
|
||||||
void RunWatchdog(void)
|
void RunWatchdog(void)
|
||||||
{
|
{
|
||||||
static volatile uint32_t I2cWatchdog_WatchCounter = 0; /* counter for timer */
|
static volatile uint32_t I2cWatchdog_WatchCounter = 0; // Counter for timer
|
||||||
static int cntr = 0;
|
static int counter = 0;
|
||||||
|
|
||||||
cntr++;
|
counter++;
|
||||||
if (cntr==100) { /* we get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period */
|
if (counter == 100) { // We get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period
|
||||||
cntr=0;
|
counter=0;
|
||||||
TEST_LED_TOGGLE();
|
TestLed_Toggle();
|
||||||
I2cWatchdog_WatchCounter++;
|
I2cWatchdog_WatchCounter++;
|
||||||
|
|
||||||
if (I2cWatchdog_WatchCounter>10) { /* do not check within the first 1000 ms, as I2C might not be running yet */
|
if (I2cWatchdog_WatchCounter > 10) { // Do not check within the first 1000 ms, as I2C might not be running yet
|
||||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms. I2C_Watchdog gets incremented for every I2C transaction
|
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms. I2C_Watchdog gets incremented for every I2C transaction
|
||||||
I2cWatchdog_RecoveryCounter++;
|
I2cWatchdog_RecoveryCounter++;
|
||||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REBOOT
|
|
||||||
NVIC_SystemReset();
|
|
||||||
#endif
|
|
||||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REINIT
|
|
||||||
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
||||||
initI2c();
|
initI2c();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
prevWatchdogCounter = I2C_Watchdog; /* remember previous counter */
|
prevWatchdogCounter = I2C_Watchdog;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
#include "led_pwm.h"
|
#include "led_pwm.h"
|
||||||
#include "slave_protocol_handler.h"
|
#include "slave_protocol_handler.h"
|
||||||
#include "i2c_watchdog.h"
|
#include "i2c_watchdog.h"
|
||||||
#include "debug_over_spi.h"
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
i2c_slave_config_t slaveConfig;
|
i2c_slave_config_t slaveConfig;
|
||||||
@@ -23,7 +22,6 @@ static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *u
|
|||||||
{
|
{
|
||||||
dosBuffer[0] = xfer->event;
|
dosBuffer[0] = xfer->event;
|
||||||
dosBuffer[1] = userData;
|
dosBuffer[1] = userData;
|
||||||
DebugOverSpi_Send(dosBuffer, 2);
|
|
||||||
|
|
||||||
switch (xfer->event) {
|
switch (xfer->event) {
|
||||||
case kI2C_SlaveTransmitEvent:
|
case kI2C_SlaveTransmitEvent:
|
||||||
@@ -84,8 +82,7 @@ void InitPeripherals(void)
|
|||||||
{
|
{
|
||||||
initInterruptPriorities();
|
initInterruptPriorities();
|
||||||
InitLedDriver();
|
InitLedDriver();
|
||||||
InitTestLed();
|
TestLed_Init();
|
||||||
LedPwm_Init();
|
LedPwm_Init();
|
||||||
DebugOverSpi_Init();
|
|
||||||
initI2c();
|
initI2c();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "fsl_lptmr.h"
|
#include "fsl_lptmr.h"
|
||||||
#include "key_scanner.h"
|
#include "key_scanner.h"
|
||||||
#include "config.h"
|
|
||||||
#include "i2c_watchdog.h"
|
#include "i2c_watchdog.h"
|
||||||
|
|
||||||
void KEY_SCANNER_HANDLER(void)
|
void KEY_SCANNER_HANDLER(void)
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "init_clock.h"
|
#include "slave/init_clock.h"
|
||||||
#include "init_peripherals.h"
|
#include "init_peripherals.h"
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "config.h"
|
|
||||||
#include "key_scanner.h"
|
#include "key_scanner.h"
|
||||||
|
|
||||||
DEFINE_BOOTLOADER_CONFIG_AREA(I2C_ADDRESS_LEFT_KEYBOARD_HALF_BOOTLOADER)
|
DEFINE_BOOTLOADER_CONFIG_AREA(I2C_ADDRESS_LEFT_KEYBOARD_HALF_BOOTLOADER)
|
||||||
@@ -15,11 +14,7 @@ key_matrix_t keyMatrix = {
|
|||||||
{PORTB, GPIOB, kCLOCK_PortB, 11},
|
{PORTB, GPIOB, kCLOCK_PortB, 11},
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 6},
|
{PORTA, GPIOA, kCLOCK_PortA, 6},
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 8},
|
{PORTA, GPIOA, kCLOCK_PortA, 8},
|
||||||
#ifdef DEBUG_OVER_SPI
|
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 8},
|
|
||||||
#else
|
|
||||||
{PORTB, GPIOB, kCLOCK_PortB, 0},
|
{PORTB, GPIOB, kCLOCK_PortB, 0},
|
||||||
#endif
|
|
||||||
{PORTB, GPIOB, kCLOCK_PortB, 6},
|
{PORTB, GPIOB, kCLOCK_PortB, 6},
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 3},
|
{PORTA, GPIOA, kCLOCK_PortA, 3},
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 12}
|
{PORTA, GPIOA, kCLOCK_PortA, 12}
|
||||||
@@ -28,11 +23,7 @@ key_matrix_t keyMatrix = {
|
|||||||
{PORTB, GPIOB, kCLOCK_PortB, 7},
|
{PORTB, GPIOB, kCLOCK_PortB, 7},
|
||||||
{PORTB, GPIOB, kCLOCK_PortB, 10},
|
{PORTB, GPIOB, kCLOCK_PortB, 10},
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 5},
|
{PORTA, GPIOA, kCLOCK_PortA, 5},
|
||||||
#ifdef DEBUG_OVER_SPI
|
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 5},
|
|
||||||
#else
|
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 7},
|
{PORTA, GPIOA, kCLOCK_PortA, 7},
|
||||||
#endif
|
|
||||||
{PORTA, GPIOA, kCLOCK_PortA, 4}
|
{PORTA, GPIOA, kCLOCK_PortA, 4}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ void SlaveRxHandler(void)
|
|||||||
case SlaveCommand_SetTestLed:
|
case SlaveCommand_SetTestLed:
|
||||||
TxMessage.length = 0;
|
TxMessage.length = 0;
|
||||||
bool isLedOn = RxMessage.data[1];
|
bool isLedOn = RxMessage.data[1];
|
||||||
TEST_LED_SET(isLedOn);
|
TestLed_Set(isLedOn);
|
||||||
break;
|
break;
|
||||||
case SlaveCommand_SetLedPwmBrightness:
|
case SlaveCommand_SetLedPwmBrightness:
|
||||||
TxMessage.length = 0;
|
TxMessage.length = 0;
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
#include "test_led.h"
|
#include "test_led.h"
|
||||||
#include "fsl_port.h"
|
#include "fsl_port.h"
|
||||||
|
|
||||||
extern void InitTestLed(void)
|
extern void TestLed_Init(void)
|
||||||
{
|
{
|
||||||
CLOCK_EnableClock(TEST_LED_CLOCK);
|
CLOCK_EnableClock(TEST_LED_CLOCK);
|
||||||
PORT_SetPinMux(TEST_LED_PORT, TEST_LED_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(TEST_LED_PORT, TEST_LED_PIN, kPORT_MuxAsGpio);
|
||||||
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
||||||
TEST_LED_ON();
|
TestLed_On();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,13 +15,28 @@
|
|||||||
#define TEST_LED_CLOCK kCLOCK_PortB
|
#define TEST_LED_CLOCK kCLOCK_PortB
|
||||||
#define TEST_LED_PIN 13
|
#define TEST_LED_PIN 13
|
||||||
|
|
||||||
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
static inline void TestLed_On(void)
|
||||||
#define TEST_LED_OFF() GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
{
|
||||||
#define TEST_LED_SET(state) GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_PIN, (state))
|
GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN);
|
||||||
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Off(void)
|
||||||
|
{
|
||||||
|
GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Set(bool state)
|
||||||
|
{
|
||||||
|
GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_PIN, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Toggle(void)
|
||||||
|
{
|
||||||
|
GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void InitTestLed(void);
|
void TestLed_Init(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Submodule lib/agent updated: 3d9c83f9f4...2ff65537a0
76
right/Makefile
Normal file
76
right/Makefile
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Copyright (C) 2018 Kristian Lauszus. All rights reserved.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Contact information
|
||||||
|
# -------------------
|
||||||
|
# Kristian Lauszus
|
||||||
|
# Web : http://www.lauszus.com
|
||||||
|
# e-mail : lauszus@gmail.com
|
||||||
|
|
||||||
|
# Set project name.
|
||||||
|
PROJECT_NAME = uhk_right
|
||||||
|
|
||||||
|
# Defines the part type that this project uses.
|
||||||
|
PART = MK22FN512VLH12
|
||||||
|
|
||||||
|
# Defines the linker script to use for the application.
|
||||||
|
LDSCRIPT = src/link/MK22FN512xxx12_flash.ld
|
||||||
|
|
||||||
|
# Size of the heap and stack.
|
||||||
|
HEAP_SIZE = 0x2000
|
||||||
|
STACK_SIZE = 0x0400
|
||||||
|
|
||||||
|
# Set the compiler CPU and FPU options.
|
||||||
|
CPU = -mcpu=cortex-m4
|
||||||
|
FPU = -mfpu=fpv4-sp-d16 -mfloat-abi=hard
|
||||||
|
|
||||||
|
# Command for flashing the right half of the keyboard.
|
||||||
|
FLASH_CMD = node ../lib/agent/packages/usb/update-device-firmware.js $(PROJECT_OBJ:.axf=.hex)
|
||||||
|
|
||||||
|
# Path to the JLink script used for the right half.
|
||||||
|
JLINK_SCRIPT = ../scripts/flash-right.jlink
|
||||||
|
|
||||||
|
# Preprocessor directives.
|
||||||
|
BUILD_FLAGS = -DCPU_$(PART)_cm4 -DUSB_STACK_BM -DBL_HAS_BOOTLOADER_CONFIG=1
|
||||||
|
|
||||||
|
# Address of the app vector table. The bootloader will take up the flash before this address.
|
||||||
|
BL_APP_VECTOR_TABLE_ADDRESS ?= 0xc000
|
||||||
|
|
||||||
|
# Source files.
|
||||||
|
SOURCE = $(wildcard src/*.c) \
|
||||||
|
$(wildcard src/*/*.c) \
|
||||||
|
$(wildcard src/*/*/*.c) \
|
||||||
|
../lib/bootloader/src/bootloader/src/wormhole.c \
|
||||||
|
$(wildcard ../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/device/*.c) \
|
||||||
|
$(wildcard ../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/osa/*.c) \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/system_MK22F51212.c \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/gcc/startup_MK22F51212.S \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_adc16.c \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_clock.c \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_ftm.c \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_gpio.c \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_i2c.c \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_pit.c \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_smc.c \
|
||||||
|
$(wildcard ../shared/*.c)
|
||||||
|
|
||||||
|
# Header files.
|
||||||
|
IPATH = src \
|
||||||
|
src/ksdk_usb \
|
||||||
|
src/buspal \
|
||||||
|
src/buspal/bm_usb \
|
||||||
|
../lib/bootloader/src \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/device \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/include \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/osa \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/CMSIS/Include \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212 \
|
||||||
|
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers \
|
||||||
|
../shared
|
||||||
|
|
||||||
|
# Include main Makefile.
|
||||||
|
include ../scripts/Makedefs.mk
|
||||||
@@ -5,16 +5,16 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_release">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_release">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
||||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath="">
|
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.1518272175" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.1518272175" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.104956045" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.104956045" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1135747399" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1135747399" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||||
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.789002772" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
<builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.789002772" incrementalBuildTarget="all DEBUG=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
||||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2026990925" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2026990925" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.494477502" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.494477502" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1465555477" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1465555477" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
||||||
@@ -145,16 +145,16 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" name="uhk60-right_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" name="uhk60-right_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
||||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062." name="/" resourcePath="">
|
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.622643167" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.622643167" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.274883814" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.274883814" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
|
||||||
@@ -197,7 +197,7 @@
|
|||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2098763517" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2098763517" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.836473542" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.836473542" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1768350063" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1768350063" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||||
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1931309296" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
<builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1931309296" incrementalBuildTarget="all DEBUG=1" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
||||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.894450" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.894450" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.555709175" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.555709175" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1619685061" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1619685061" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
||||||
@@ -288,16 +288,16 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug_standalone">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug_standalone">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="Debug version of uhk60-right without the bootloader" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" name="uhk60-right_debug_standalone" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="Debug version of uhk60-right without the bootloader" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" name="uhk60-right_debug_standalone" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
||||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142." name="/" resourcePath="">
|
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.788475280" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.788475280" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.402546001" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.402546001" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
|
||||||
@@ -340,7 +340,7 @@
|
|||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2124713168" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2124713168" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1228214828" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1228214828" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1911575583" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1911575583" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||||
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1942759303" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
<builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1942759303" incrementalBuildTarget="all DEBUG=1 BL_APP_VECTOR_TABLE_ADDRESS=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
||||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1355758441" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1355758441" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.511724221" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.511724221" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1130167410" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1130167410" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
|
||||||
@@ -447,14 +447,97 @@
|
|||||||
</scannerConfigBuildInfo>
|
</scannerConfigBuildInfo>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||||
<configuration configurationName="uhk60-right_debug_standalone">
|
<configuration configurationName="uhk60-right_debug">
|
||||||
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration configurationName="uhk60-right_release">
|
<configuration configurationName="uhk60-right_release">
|
||||||
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration configurationName="uhk60-right_debug">
|
<configuration configurationName="uhk60-right_debug_standalone">
|
||||||
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
|
<storageModule moduleId="com.crt.config">
|
||||||
|
<projectStorage><?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<TargetConfig>
|
||||||
|
<Properties property_3="NXP" property_4="MK22FN512xxx12" property_count="5" version="100200"/>
|
||||||
|
<infoList vendor="NXP"><info chip="MK22FN512xxx12" name="MK22FN512xxx12"><chip><name>MK22FN512xxx12</name>
|
||||||
|
<family>K2x</family>
|
||||||
|
<vendor>NXP</vendor>
|
||||||
|
<memory can_program="true" id="Flash" is_ro="true" size="0" type="Flash"/>
|
||||||
|
<memory id="RAM" size="0" type="RAM"/>
|
||||||
|
<memoryInstance derived_from="Flash" driver="FTFA_2K.cfx" id="PROGRAM_FLASH" location="0x00000000" size="0x00080000"/>
|
||||||
|
<memoryInstance derived_from="RAM" id="SRAM_UPPER" location="0x20000000" size="0x00010000"/>
|
||||||
|
<memoryInstance derived_from="RAM" id="SRAM_LOWER" location="0x1fff0000" size="0x00010000"/>
|
||||||
|
<peripheralInstance derived_from="FTFA-FlashConfig" determined="infoFile" id="FTFA-FlashConfig" location="0x400"/>
|
||||||
|
<peripheralInstance derived_from="DMA" determined="infoFile" id="DMA" location="0x40008000"/>
|
||||||
|
<peripheralInstance derived_from="FB" determined="infoFile" id="FB" location="0x4000C000"/>
|
||||||
|
<peripheralInstance derived_from="FMC" determined="infoFile" id="FMC" location="0x4001F000"/>
|
||||||
|
<peripheralInstance derived_from="FTFA" determined="infoFile" id="FTFA" location="0x40020000"/>
|
||||||
|
<peripheralInstance derived_from="DMAMUX" determined="infoFile" id="DMAMUX" location="0x40021000"/>
|
||||||
|
<peripheralInstance derived_from="FTM0" determined="infoFile" id="FTM0" location="0x40038000"/>
|
||||||
|
<peripheralInstance derived_from="FTM1" determined="infoFile" id="FTM1" location="0x40039000"/>
|
||||||
|
<peripheralInstance derived_from="FTM2" determined="infoFile" id="FTM2" location="0x4003A000"/>
|
||||||
|
<peripheralInstance derived_from="FTM3" determined="infoFile" id="FTM3" location="0x40026000"/>
|
||||||
|
<peripheralInstance derived_from="ADC0" determined="infoFile" id="ADC0" location="0x4003B000"/>
|
||||||
|
<peripheralInstance derived_from="ADC1" determined="infoFile" id="ADC1" location="0x40027000"/>
|
||||||
|
<peripheralInstance derived_from="DAC0" determined="infoFile" id="DAC0" location="0x4003F000"/>
|
||||||
|
<peripheralInstance derived_from="DAC1" determined="infoFile" id="DAC1" location="0x40028000"/>
|
||||||
|
<peripheralInstance derived_from="RNG" determined="infoFile" id="RNG" location="0x40029000"/>
|
||||||
|
<peripheralInstance derived_from="LPUART0" determined="infoFile" id="LPUART0" location="0x4002A000"/>
|
||||||
|
<peripheralInstance derived_from="SPI0" determined="infoFile" id="SPI0" location="0x4002C000"/>
|
||||||
|
<peripheralInstance derived_from="SPI1" determined="infoFile" id="SPI1" location="0x4002D000"/>
|
||||||
|
<peripheralInstance derived_from="I2S0" determined="infoFile" id="I2S0" location="0x4002F000"/>
|
||||||
|
<peripheralInstance derived_from="CRC" determined="infoFile" id="CRC" location="0x40032000"/>
|
||||||
|
<peripheralInstance derived_from="PDB0" determined="infoFile" id="PDB0" location="0x40036000"/>
|
||||||
|
<peripheralInstance derived_from="PIT" determined="infoFile" id="PIT" location="0x40037000"/>
|
||||||
|
<peripheralInstance derived_from="RTC" determined="infoFile" id="RTC" location="0x4003D000"/>
|
||||||
|
<peripheralInstance derived_from="RFVBAT" determined="infoFile" id="RFVBAT" location="0x4003E000"/>
|
||||||
|
<peripheralInstance derived_from="LPTMR0" determined="infoFile" id="LPTMR0" location="0x40040000"/>
|
||||||
|
<peripheralInstance derived_from="RFSYS" determined="infoFile" id="RFSYS" location="0x40041000"/>
|
||||||
|
<peripheralInstance derived_from="SIM" determined="infoFile" id="SIM" location="0x40047000"/>
|
||||||
|
<peripheralInstance derived_from="PORTA" determined="infoFile" id="PORTA" location="0x40049000"/>
|
||||||
|
<peripheralInstance derived_from="PORTB" determined="infoFile" id="PORTB" location="0x4004A000"/>
|
||||||
|
<peripheralInstance derived_from="PORTC" determined="infoFile" id="PORTC" location="0x4004B000"/>
|
||||||
|
<peripheralInstance derived_from="PORTD" determined="infoFile" id="PORTD" location="0x4004C000"/>
|
||||||
|
<peripheralInstance derived_from="PORTE" determined="infoFile" id="PORTE" location="0x4004D000"/>
|
||||||
|
<peripheralInstance derived_from="WDOG" determined="infoFile" id="WDOG" location="0x40052000"/>
|
||||||
|
<peripheralInstance derived_from="EWM" determined="infoFile" id="EWM" location="0x40061000"/>
|
||||||
|
<peripheralInstance derived_from="MCG" determined="infoFile" id="MCG" location="0x40064000"/>
|
||||||
|
<peripheralInstance derived_from="OSC" determined="infoFile" id="OSC" location="0x40065000"/>
|
||||||
|
<peripheralInstance derived_from="I2C0" determined="infoFile" id="I2C0" location="0x40066000"/>
|
||||||
|
<peripheralInstance derived_from="I2C1" determined="infoFile" id="I2C1" location="0x40067000"/>
|
||||||
|
<peripheralInstance derived_from="UART0" determined="infoFile" id="UART0" location="0x4006A000"/>
|
||||||
|
<peripheralInstance derived_from="UART1" determined="infoFile" id="UART1" location="0x4006B000"/>
|
||||||
|
<peripheralInstance derived_from="UART2" determined="infoFile" id="UART2" location="0x4006C000"/>
|
||||||
|
<peripheralInstance derived_from="USB0" determined="infoFile" id="USB0" location="0x40072000"/>
|
||||||
|
<peripheralInstance derived_from="CMP0" determined="infoFile" id="CMP0" location="0x40073000"/>
|
||||||
|
<peripheralInstance derived_from="CMP1" determined="infoFile" id="CMP1" location="0x40073008"/>
|
||||||
|
<peripheralInstance derived_from="VREF" determined="infoFile" id="VREF" location="0x40074000"/>
|
||||||
|
<peripheralInstance derived_from="LLWU" determined="infoFile" id="LLWU" location="0x4007C000"/>
|
||||||
|
<peripheralInstance derived_from="PMC" determined="infoFile" id="PMC" location="0x4007D000"/>
|
||||||
|
<peripheralInstance derived_from="SMC" determined="infoFile" id="SMC" location="0x4007E000"/>
|
||||||
|
<peripheralInstance derived_from="RCM" determined="infoFile" id="RCM" location="0x4007F000"/>
|
||||||
|
<peripheralInstance derived_from="GPIOA" determined="infoFile" id="GPIOA" location="0x400FF000"/>
|
||||||
|
<peripheralInstance derived_from="GPIOB" determined="infoFile" id="GPIOB" location="0x400FF040"/>
|
||||||
|
<peripheralInstance derived_from="GPIOC" determined="infoFile" id="GPIOC" location="0x400FF080"/>
|
||||||
|
<peripheralInstance derived_from="GPIOD" determined="infoFile" id="GPIOD" location="0x400FF0C0"/>
|
||||||
|
<peripheralInstance derived_from="GPIOE" determined="infoFile" id="GPIOE" location="0x400FF100"/>
|
||||||
|
<peripheralInstance derived_from="SystemControl" determined="infoFile" id="SystemControl" location="0xE000E000"/>
|
||||||
|
<peripheralInstance derived_from="SysTick" determined="infoFile" id="SysTick" location="0xE000E010"/>
|
||||||
|
<peripheralInstance derived_from="NVIC" determined="infoFile" id="NVIC" location="0xE000E100"/>
|
||||||
|
<peripheralInstance derived_from="MCM" determined="infoFile" id="MCM" location="0xE0080000"/>
|
||||||
|
</chip>
|
||||||
|
<processor><name gcc_name="cortex-m4">Cortex-M4</name>
|
||||||
|
<family>Cortex-M</family>
|
||||||
|
</processor>
|
||||||
|
<link href="MK22F51212_internal_peripheral.xml" show="embed" type="simple"/>
|
||||||
|
</info>
|
||||||
|
</infoList>
|
||||||
|
</TargetConfig></projectStorage>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="com.nxp.mcuxpresso.core.datamodels">
|
||||||
|
<sdkName>SDK_2.x_MK22FN512xxx12</sdkName>
|
||||||
|
<sdkVersion>2.2.0</sdkVersion>
|
||||||
|
</storageModule>
|
||||||
</cproject>
|
</cproject>
|
||||||
|
|||||||
@@ -30,6 +30,16 @@
|
|||||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
<linkedResources>
|
<linkedResources>
|
||||||
|
<link>
|
||||||
|
<name>Makedefs.mk</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-PROJECT_LOC/scripts/Makedefs.mk</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Makefile</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-1-PROJECT_LOC/Makefile</locationURI>
|
||||||
|
</link>
|
||||||
<link>
|
<link>
|
||||||
<name>bootloader-shared</name>
|
<name>bootloader-shared</name>
|
||||||
<type>2</type>
|
<type>2</type>
|
||||||
|
|||||||
@@ -204,21 +204,27 @@ SECTIONS
|
|||||||
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
||||||
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
|
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
|
||||||
|
|
||||||
USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x800;
|
|
||||||
/* Uninitialized data section */
|
/* Uninitialized data section */
|
||||||
.bss :
|
.bss : ALIGN(4)
|
||||||
{
|
{
|
||||||
/* This is used by the startup in order to initialize the .bss section */
|
/* This is used by the startup in order to initialize the .bss section */
|
||||||
. = ALIGN(4);
|
|
||||||
__START_BSS = .;
|
__START_BSS = .;
|
||||||
__bss_start__ = .;
|
__bss_start__ = .;
|
||||||
*(.bss)
|
*(.bss)
|
||||||
*(.bss*)
|
*(.bss*)
|
||||||
. = ALIGN(512);
|
|
||||||
USB_RAM_START = .;
|
|
||||||
. += USB_RAM_GAP;
|
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
.m_usb_bdt (NOLOAD) :
|
||||||
|
{
|
||||||
|
. = ALIGN(512);
|
||||||
|
*(m_usb_bdt)
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
.m_usb_global (NOLOAD) :
|
||||||
|
{
|
||||||
|
*(m_usb_global)
|
||||||
__bss_end__ = .;
|
__bss_end__ = .;
|
||||||
__END_BSS = .;
|
__END_BSS = .;
|
||||||
} > m_data
|
} > m_data
|
||||||
@@ -247,17 +253,6 @@ SECTIONS
|
|||||||
. += STACK_SIZE;
|
. += STACK_SIZE;
|
||||||
} > m_data_2
|
} > m_data_2
|
||||||
|
|
||||||
m_usb_bdt USB_RAM_START (NOLOAD) :
|
|
||||||
{
|
|
||||||
*(m_usb_bdt)
|
|
||||||
USB_RAM_BDT_END = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_usb_global USB_RAM_BDT_END (NOLOAD) :
|
|
||||||
{
|
|
||||||
*(m_usb_global)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initializes stack on the end of block */
|
/* Initializes stack on the end of block */
|
||||||
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
||||||
__StackLimit = __StackTop - STACK_SIZE;
|
__StackLimit = __StackTop - STACK_SIZE;
|
||||||
|
|||||||
@@ -1,49 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
<stringAttribute key="bad_container_name" value="/uhk-l"/>
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
|
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
|
|
||||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="uhk60-right_debug/uhk-right.hex"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-device-firmware.js"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
|
||||||
<listEntry value="/uhk-right"/>
|
|
||||||
</listAttribute>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
|
||||||
<listEntry value="4"/>
|
|
||||||
</listAttribute>
|
|
||||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
|
|
||||||
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
|
|
||||||
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
|
|
||||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|||||||
@@ -1,49 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
<stringAttribute key="bad_container_name" value="/uhk-l"/>
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
|
|
||||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
|
|
||||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="uhk60-right_release/uhk-right.hex"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-device-firmware.js"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331"/>
|
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
|
||||||
<listEntry value="/uhk-right"/>
|
|
||||||
</listAttribute>
|
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
|
||||||
<listEntry value="4"/>
|
|
||||||
</listAttribute>
|
|
||||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
|
|
||||||
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
|
|
||||||
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
|
|
||||||
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
|
|
||||||
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
|
|
||||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|||||||
@@ -593,9 +593,6 @@ static status_t handle_command_internal(uint8_t *packet, uint32_t packetLength)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if FIXED_BUSPAL_BOOTLOADER
|
#if FIXED_BUSPAL_BOOTLOADER
|
||||||
size_t offset;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
status = kStatus_Success; /* set default */
|
status = kStatus_Success; /* set default */
|
||||||
res = WaitForStartByte(rxBuf, &offset);
|
res = WaitForStartByte(rxBuf, &offset);
|
||||||
if (res==1 && offset==1)
|
if (res==1 && offset==1)
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ status_t serial_packet_read(const peripheral_descriptor_t *self,
|
|||||||
|
|
||||||
// Receive the framing data packet.
|
// Receive the framing data packet.
|
||||||
isPacketOk = true;
|
isPacketOk = true;
|
||||||
status_t status = read_data_packet(&framingPacket, g_serialContext.data, packetType);
|
status = read_data_packet(&framingPacket, g_serialContext.data, packetType);
|
||||||
if (status != kStatus_Success)
|
if (status != kStatus_Success)
|
||||||
{
|
{
|
||||||
// No packet available.
|
// No packet available.
|
||||||
|
|||||||
@@ -6,10 +6,13 @@ static uint8_t hardwareConfig[HARDWARE_CONFIG_SIZE];
|
|||||||
static uint8_t ATTR_DATA2 stagingUserConfig[USER_CONFIG_SIZE];
|
static uint8_t ATTR_DATA2 stagingUserConfig[USER_CONFIG_SIZE];
|
||||||
static uint8_t validatedUserConfig[USER_CONFIG_SIZE];
|
static uint8_t validatedUserConfig[USER_CONFIG_SIZE];
|
||||||
|
|
||||||
|
uint16_t ValidatedUserConfigLength;
|
||||||
config_buffer_t HardwareConfigBuffer = { hardwareConfig };
|
config_buffer_t HardwareConfigBuffer = { hardwareConfig };
|
||||||
config_buffer_t StagingUserConfigBuffer = { stagingUserConfig };
|
config_buffer_t StagingUserConfigBuffer = { stagingUserConfig };
|
||||||
config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
|
config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
|
||||||
|
|
||||||
|
hardware_config_t *HardwareConfig = (hardware_config_t*)hardwareConfig;
|
||||||
|
|
||||||
bool ParserRunDry;
|
bool ParserRunDry;
|
||||||
|
|
||||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId)
|
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId)
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
#include "fsl_common.h"
|
#include "fsl_common.h"
|
||||||
#include "basic_types.h"
|
#include "basic_types.h"
|
||||||
|
|
||||||
|
// Macros:
|
||||||
|
|
||||||
|
#define HARDWARE_CONFIG_SIGNATURE_LENGTH 3
|
||||||
|
|
||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -14,14 +18,29 @@
|
|||||||
ConfigBufferId_ValidatedUserConfig,
|
ConfigBufferId_ValidatedUserConfig,
|
||||||
} config_buffer_id_t;
|
} config_buffer_id_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t signatureLength;
|
||||||
|
char signature[HARDWARE_CONFIG_SIGNATURE_LENGTH];
|
||||||
|
uint8_t majorVersion;
|
||||||
|
uint8_t minorVersion;
|
||||||
|
uint8_t patchVersion;
|
||||||
|
uint8_t brandId;
|
||||||
|
uint8_t deviceId;
|
||||||
|
uint32_t uniqueId;
|
||||||
|
bool isVendorModeOn;
|
||||||
|
bool isIso;
|
||||||
|
} hardware_config_t;
|
||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool ParserRunDry;
|
extern bool ParserRunDry;
|
||||||
|
extern uint16_t ValidatedUserConfigLength;
|
||||||
extern config_buffer_t HardwareConfigBuffer;
|
extern config_buffer_t HardwareConfigBuffer;
|
||||||
extern config_buffer_t StagingUserConfigBuffer;
|
extern config_buffer_t StagingUserConfigBuffer;
|
||||||
extern config_buffer_t ValidatedUserConfigBuffer;
|
extern config_buffer_t ValidatedUserConfigBuffer;
|
||||||
|
extern hardware_config_t *HardwareConfig;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
|
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
|
||||||
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);
|
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
|||||||
const char *deviceName = ReadString(buffer, &len);
|
const char *deviceName = ReadString(buffer, &len);
|
||||||
uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
|
uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
|
||||||
|
|
||||||
(void)userConfigLength;
|
|
||||||
(void)dataModelMajorVersion;
|
(void)dataModelMajorVersion;
|
||||||
(void)dataModelMinorVersion;
|
(void)dataModelMinorVersion;
|
||||||
(void)dataModelPatchVersion;
|
(void)dataModelPatchVersion;
|
||||||
@@ -141,6 +140,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
|||||||
|
|
||||||
// Update LED brightnesses and reinitialize LED drivers
|
// Update LED brightnesses and reinitialize LED drivers
|
||||||
|
|
||||||
|
ValidatedUserConfigLength = userConfigLength;
|
||||||
|
|
||||||
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
|
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
|
||||||
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
||||||
KeyBacklightBrightness = keyBacklightBrightness;
|
KeyBacklightBrightness = keyBacklightBrightness;
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ static parser_error_t parseKeyStrokeAction(key_action_t *keyAction, uint8_t keyS
|
|||||||
static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer)
|
static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
uint8_t layer = ReadUInt8(buffer) + 1;
|
uint8_t layer = ReadUInt8(buffer) + 1;
|
||||||
uint8_t mode = ReadBool(buffer) ? SwitchLayerMode_Toggle : SwitchLayerMode_HoldAndDoubleTapToggle;
|
switch_layer_mode_t mode = ReadUInt8(buffer);
|
||||||
|
|
||||||
KeyAction->type = KeyActionType_SwitchLayer;
|
KeyAction->type = KeyActionType_SwitchLayer;
|
||||||
KeyAction->switchLayer.layer = layer;
|
KeyAction->switchLayer.layer = layer;
|
||||||
@@ -75,7 +75,7 @@ static parser_error_t parsePlayMacroAction(key_action_t *keyAction, config_buffe
|
|||||||
if (macroIndex >= tempMacroCount) {
|
if (macroIndex >= tempMacroCount) {
|
||||||
return ParserError_InvalidSerializedPlayMacroAction;
|
return ParserError_InvalidSerializedPlayMacroAction;
|
||||||
}
|
}
|
||||||
keyAction->type = KeyActionType_SwitchKeymap;
|
keyAction->type = KeyActionType_PlayMacro;
|
||||||
keyAction->playMacro.macroId = macroIndex;
|
keyAction->playMacro.macroId = macroIndex;
|
||||||
return ParserError_Success;
|
return ParserError_Success;
|
||||||
}
|
}
|
||||||
@@ -196,4 +196,3 @@ parser_error_t ParseKeymap(config_buffer_t *buffer, uint8_t keymapIdx, uint8_t k
|
|||||||
}
|
}
|
||||||
return ParserError_Success;
|
return ParserError_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,15 @@ parser_error_t parseKeyMacroAction(config_buffer_t *buffer, macro_action_t *macr
|
|||||||
uint8_t keyMacroType = macroActionType - SerializedMacroActionType_KeyMacroAction;
|
uint8_t keyMacroType = macroActionType - SerializedMacroActionType_KeyMacroAction;
|
||||||
uint8_t action = keyMacroType & 0b11;
|
uint8_t action = keyMacroType & 0b11;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
uint8_t scancode;
|
uint16_t scancode = 0;
|
||||||
uint8_t modifierMask;
|
uint8_t modifierMask;
|
||||||
|
|
||||||
keyMacroType >>= 2;
|
keyMacroType >>= 2;
|
||||||
type = keyMacroType & 0b11;
|
type = keyMacroType & 0b11;
|
||||||
keyMacroType >>= 2;
|
keyMacroType >>= 2;
|
||||||
scancode = keyMacroType & 0b10 ? ReadUInt8(buffer) : 0;
|
if (keyMacroType & 0b10) {
|
||||||
|
scancode = type == SerializedKeystrokeType_LongMedia ? ReadUInt16(buffer) : ReadUInt8(buffer);
|
||||||
|
}
|
||||||
modifierMask = keyMacroType & 0b01 ? ReadUInt8(buffer) : 0;
|
modifierMask = keyMacroType & 0b01 ? ReadUInt8(buffer) : 0;
|
||||||
macroAction->type = MacroActionType_Key;
|
macroAction->type = MacroActionType_Key;
|
||||||
macroAction->key.action = action;
|
macroAction->key.action = action;
|
||||||
@@ -58,7 +60,7 @@ parser_error_t parseScrollMouseMacroAction(config_buffer_t *buffer, macro_action
|
|||||||
|
|
||||||
parser_error_t parseDelayMacroAction(config_buffer_t *buffer, macro_action_t *macroAction)
|
parser_error_t parseDelayMacroAction(config_buffer_t *buffer, macro_action_t *macroAction)
|
||||||
{
|
{
|
||||||
int16_t delay = ReadInt16(buffer);
|
uint16_t delay = ReadUInt16(buffer);
|
||||||
|
|
||||||
macroAction->type = MacroActionType_Delay;
|
macroAction->type = MacroActionType_Delay;
|
||||||
macroAction->delay.delay = delay;
|
macroAction->delay.delay = delay;
|
||||||
|
|||||||
@@ -94,14 +94,14 @@ void EEPROM_Init(void)
|
|||||||
I2C_MasterTransferCreateHandle(I2C_EEPROM_BUS_BASEADDR, &i2cHandle, i2cCallback, NULL);
|
I2C_MasterTransferCreateHandle(I2C_EEPROM_BUS_BASEADDR, &i2cHandle, i2cCallback, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback))
|
status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t configBufferId, void (*successCallback))
|
||||||
{
|
{
|
||||||
if (IsEepromBusy) {
|
if (IsEepromBusy) {
|
||||||
return kStatus_I2C_Busy;
|
return kStatus_I2C_Busy;
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentEepromOperation = operation;
|
CurrentEepromOperation = operation;
|
||||||
CurrentConfigBufferId = config_buffer_id;
|
CurrentConfigBufferId = configBufferId;
|
||||||
SuccessCallback = successCallback;
|
SuccessCallback = successCallback;
|
||||||
|
|
||||||
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
|
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
|
||||||
@@ -117,7 +117,8 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
|
|||||||
case EepromOperation_Write:
|
case EepromOperation_Write:
|
||||||
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;
|
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;
|
||||||
sourceOffset = 0;
|
sourceOffset = 0;
|
||||||
sourceLength = isHardwareConfig ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE;
|
uint16_t userConfigSize = ValidatedUserConfigLength && configBufferId == ConfigBufferId_ValidatedUserConfig ? ValidatedUserConfigLength : USER_CONFIG_SIZE;
|
||||||
|
sourceLength = isHardwareConfig ? HARDWARE_CONFIG_SIZE : userConfigSize;
|
||||||
LastEepromTransferStatus = writePage();
|
LastEepromTransferStatus = writePage();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,10 +35,12 @@
|
|||||||
#define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM.
|
#define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM.
|
||||||
#define I2C_EEPROM_BUS_MUX kPORT_MuxAlt2
|
#define I2C_EEPROM_BUS_MUX kPORT_MuxAlt2
|
||||||
|
|
||||||
|
#define I2C_EEPROM_BUS_SDA_GPIO GPIOC
|
||||||
#define I2C_EEPROM_BUS_SDA_PORT PORTC
|
#define I2C_EEPROM_BUS_SDA_PORT PORTC
|
||||||
#define I2C_EEPROM_BUS_SDA_CLOCK kCLOCK_PortC
|
#define I2C_EEPROM_BUS_SDA_CLOCK kCLOCK_PortC
|
||||||
#define I2C_EEPROM_BUS_SDA_PIN 11
|
#define I2C_EEPROM_BUS_SDA_PIN 11
|
||||||
|
|
||||||
|
#define I2C_EEPROM_BUS_SCL_GPIO GPIOC
|
||||||
#define I2C_EEPROM_BUS_SCL_PORT PORTC
|
#define I2C_EEPROM_BUS_SCL_PORT PORTC
|
||||||
#define I2C_EEPROM_BUS_SCL_CLOCK kCLOCK_PortC
|
#define I2C_EEPROM_BUS_SCL_CLOCK kCLOCK_PortC
|
||||||
#define I2C_EEPROM_BUS_SCL_PIN 10
|
#define I2C_EEPROM_BUS_SCL_PIN 10
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
#include "init_peripherals.h"
|
#include "init_peripherals.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_debouncer.h"
|
|
||||||
#include "usb_api.h"
|
#include "usb_api.h"
|
||||||
#include "slave_scheduler.h"
|
#include "slave_scheduler.h"
|
||||||
#include "bootloader/wormhole.h"
|
#include "bootloader/wormhole.h"
|
||||||
@@ -21,6 +20,38 @@ bool IsBusPalOn;
|
|||||||
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
|
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
|
||||||
volatile uint32_t I2cMainBusActualBaudRateBps;
|
volatile uint32_t I2cMainBusActualBaudRateBps;
|
||||||
|
|
||||||
|
static i2c_bus_t i2cMainBus = {
|
||||||
|
.baseAddr = I2C_MAIN_BUS_BASEADDR,
|
||||||
|
.clockSrc = I2C_MAIN_BUS_CLK_SRC,
|
||||||
|
.mux = I2C_MAIN_BUS_MUX,
|
||||||
|
|
||||||
|
.sdaClock = I2C_MAIN_BUS_SDA_CLOCK,
|
||||||
|
.sdaGpio = I2C_MAIN_BUS_SDA_GPIO,
|
||||||
|
.sdaPort = I2C_MAIN_BUS_SDA_PORT,
|
||||||
|
.sdaPin = I2C_MAIN_BUS_SDA_PIN,
|
||||||
|
|
||||||
|
.sclClock = I2C_MAIN_BUS_SCL_CLOCK,
|
||||||
|
.sclGpio = I2C_MAIN_BUS_SCL_GPIO,
|
||||||
|
.sclPort = I2C_MAIN_BUS_SCL_PORT,
|
||||||
|
.sclPin = I2C_MAIN_BUS_SCL_PIN,
|
||||||
|
};
|
||||||
|
|
||||||
|
static i2c_bus_t i2cEepromBus = {
|
||||||
|
.baseAddr = I2C_EEPROM_BUS_BASEADDR,
|
||||||
|
.clockSrc = I2C_EEPROM_BUS_CLK_SRC,
|
||||||
|
.mux = I2C_EEPROM_BUS_MUX,
|
||||||
|
|
||||||
|
.sdaClock = I2C_EEPROM_BUS_SDA_CLOCK,
|
||||||
|
.sdaGpio = I2C_EEPROM_BUS_SDA_GPIO,
|
||||||
|
.sdaPort = I2C_EEPROM_BUS_SDA_PORT,
|
||||||
|
.sdaPin = I2C_EEPROM_BUS_SDA_PIN,
|
||||||
|
|
||||||
|
.sclClock = I2C_EEPROM_BUS_SCL_CLOCK,
|
||||||
|
.sclGpio = I2C_EEPROM_BUS_SCL_GPIO,
|
||||||
|
.sclPort = I2C_EEPROM_BUS_SCL_PORT,
|
||||||
|
.sclPin = I2C_EEPROM_BUS_SCL_PIN,
|
||||||
|
};
|
||||||
|
|
||||||
static void initBusPalState(void) {
|
static void initBusPalState(void) {
|
||||||
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
|
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
|
||||||
if (IsBusPalOn) {
|
if (IsBusPalOn) {
|
||||||
@@ -32,12 +63,10 @@ static void initBusPalState(void) {
|
|||||||
static void initInterruptPriorities(void)
|
static void initInterruptPriorities(void)
|
||||||
{
|
{
|
||||||
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||||
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
|
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0);
|
||||||
NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 3);
|
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3);
|
||||||
NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 3);
|
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 4);
|
||||||
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 3);
|
NVIC_SetPriority(USB_IRQ_ID, 4);
|
||||||
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 3);
|
|
||||||
NVIC_SetPriority(USB_IRQ_ID, 3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delay(void)
|
static void delay(void)
|
||||||
@@ -45,91 +74,73 @@ static void delay(void)
|
|||||||
for (volatile uint32_t i=0; i<62; i++);
|
for (volatile uint32_t i=0; i<62; i++);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void recoverI2c(void)
|
static void recoverI2cBus(i2c_bus_t *i2cBus)
|
||||||
{
|
{
|
||||||
PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(i2cBus->sdaPort, i2cBus->sdaPin, kPORT_MuxAsGpio);
|
||||||
PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(i2cBus->sclPort, i2cBus->sclPin, kPORT_MuxAsGpio);
|
||||||
GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
GPIO_PinInit(i2cBus->sclGpio, i2cBus->sclPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
||||||
|
|
||||||
bool isOn = true;
|
bool isOn = true;
|
||||||
for (int i=0; i<20; i++) {
|
for (int i=0; i<20; i++) {
|
||||||
GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalInput});
|
GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalInput});
|
||||||
bool isSdaHigh = GPIO_ReadPinInput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN);
|
bool isSdaHigh = GPIO_ReadPinInput(i2cBus->sdaGpio, i2cBus->sdaPin);
|
||||||
GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
||||||
|
|
||||||
if (isSdaHigh) {
|
if (isSdaHigh) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, isOn);
|
GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, isOn);
|
||||||
delay();
|
delay();
|
||||||
isOn = !isOn;
|
isOn = !isOn;
|
||||||
}
|
}
|
||||||
|
|
||||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0);
|
GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 0);
|
||||||
delay();
|
delay();
|
||||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1);
|
GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, 1);
|
||||||
delay();
|
delay();
|
||||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1);
|
GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 1);
|
||||||
delay();
|
delay();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initI2cMainBus(void)
|
static void initI2cBus(i2c_bus_t *i2cBus)
|
||||||
{
|
{
|
||||||
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK);
|
CLOCK_EnableClock(i2cBus->sdaClock);
|
||||||
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK);
|
CLOCK_EnableClock(i2cBus->sclClock);
|
||||||
|
|
||||||
recoverI2c();
|
recoverI2cBus(i2cBus);
|
||||||
|
|
||||||
port_pin_config_t pinConfig = {
|
port_pin_config_t pinConfig = {
|
||||||
.pullSelect = kPORT_PullUp,
|
.pullSelect = kPORT_PullUp,
|
||||||
.openDrainEnable = kPORT_OpenDrainEnable,
|
.openDrainEnable = kPORT_OpenDrainEnable,
|
||||||
.mux = I2C_MAIN_BUS_MUX,
|
.mux = i2cBus->mux,
|
||||||
};
|
};
|
||||||
|
|
||||||
PORT_SetPinConfig(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, &pinConfig);
|
PORT_SetPinConfig(i2cBus->sdaPort, i2cBus->sdaPin, &pinConfig);
|
||||||
PORT_SetPinConfig(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, &pinConfig);
|
PORT_SetPinConfig(i2cBus->sclPort, i2cBus->sclPin, &pinConfig);
|
||||||
|
|
||||||
i2c_master_config_t masterConfig;
|
i2c_master_config_t masterConfig;
|
||||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
I2C_MasterGetDefaultConfig(&masterConfig);
|
||||||
masterConfig.baudRate_Bps = I2cMainBusRequestedBaudRateBps;
|
masterConfig.baudRate_Bps = i2cBus == &i2cMainBus ? I2cMainBusRequestedBaudRateBps : I2C_EEPROM_BUS_BAUD_RATE;
|
||||||
uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC);
|
uint32_t sourceClock = CLOCK_GetFreq(i2cBus->clockSrc);
|
||||||
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock);
|
I2C_MasterInit(i2cBus->baseAddr, &masterConfig, sourceClock);
|
||||||
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
|
|
||||||
|
if (i2cBus == &i2cMainBus) {
|
||||||
|
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReinitI2cMainBus(void)
|
void ReinitI2cMainBus(void)
|
||||||
{
|
{
|
||||||
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
|
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
|
||||||
initI2cMainBus();
|
initI2cBus(&i2cMainBus);
|
||||||
InitSlaveScheduler();
|
InitSlaveScheduler();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initI2cEepromBus(void)
|
|
||||||
{
|
|
||||||
port_pin_config_t pinConfig = {
|
|
||||||
.pullSelect = kPORT_PullUp,
|
|
||||||
.openDrainEnable = kPORT_OpenDrainEnable,
|
|
||||||
.mux = I2C_EEPROM_BUS_MUX,
|
|
||||||
};
|
|
||||||
|
|
||||||
CLOCK_EnableClock(I2C_EEPROM_BUS_SDA_CLOCK);
|
|
||||||
CLOCK_EnableClock(I2C_EEPROM_BUS_SCL_CLOCK);
|
|
||||||
|
|
||||||
PORT_SetPinConfig(I2C_EEPROM_BUS_SDA_PORT, I2C_EEPROM_BUS_SDA_PIN, &pinConfig);
|
|
||||||
PORT_SetPinConfig(I2C_EEPROM_BUS_SCL_PORT, I2C_EEPROM_BUS_SCL_PIN, &pinConfig);
|
|
||||||
|
|
||||||
i2c_master_config_t masterConfig;
|
|
||||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
|
||||||
masterConfig.baudRate_Bps = I2C_EEPROM_BUS_BAUD_RATE;
|
|
||||||
uint32_t sourceClock = CLOCK_GetFreq(I2C_EEPROM_BUS_CLK_SRC);
|
|
||||||
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void initI2c(void)
|
static void initI2c(void)
|
||||||
{
|
{
|
||||||
initI2cMainBus();
|
initI2cBus(&i2cMainBus);
|
||||||
initI2cEepromBus();
|
initI2cBus(&i2cEepromBus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitPeripherals(void)
|
void InitPeripherals(void)
|
||||||
@@ -142,9 +153,8 @@ void InitPeripherals(void)
|
|||||||
InitMergeSensor();
|
InitMergeSensor();
|
||||||
ADC_Init();
|
ADC_Init();
|
||||||
initI2c();
|
initI2c();
|
||||||
InitTestLed();
|
TestLed_Init();
|
||||||
LedPwm_Init();
|
LedPwm_Init();
|
||||||
InitI2cWatchdog();
|
InitI2cWatchdog();
|
||||||
InitKeyDebouncer();
|
|
||||||
EEPROM_Init();
|
EEPROM_Init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,28 @@
|
|||||||
#ifndef __INIT_PERIPHERALS_H__
|
#ifndef __INIT_PERIPHERALS_H__
|
||||||
#define __INIT_PERIPHERALS_H__
|
#define __INIT_PERIPHERALS_H__
|
||||||
|
|
||||||
// Includes
|
// Includes:
|
||||||
|
|
||||||
#include "fsl_common.h"
|
#include "fsl_common.h"
|
||||||
|
|
||||||
|
// Typedefs:
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
clock_name_t clockSrc;
|
||||||
|
I2C_Type *baseAddr;
|
||||||
|
uint16_t mux;
|
||||||
|
|
||||||
|
clock_ip_name_t sdaClock;
|
||||||
|
GPIO_Type *sdaGpio;
|
||||||
|
PORT_Type *sdaPort;
|
||||||
|
uint32_t sdaPin;
|
||||||
|
|
||||||
|
clock_ip_name_t sclClock;
|
||||||
|
GPIO_Type *sclGpio;
|
||||||
|
PORT_Type *sclPort;
|
||||||
|
uint32_t sclPin;
|
||||||
|
} i2c_bus_t;
|
||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsBusPalOn;
|
extern bool IsBusPalOn;
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
KeyActionType_SwitchLayer,
|
KeyActionType_SwitchLayer,
|
||||||
KeyActionType_SwitchKeymap,
|
KeyActionType_SwitchKeymap,
|
||||||
KeyActionType_PlayMacro,
|
KeyActionType_PlayMacro,
|
||||||
KeyActionType_Test,
|
|
||||||
} key_action_type_t;
|
} key_action_type_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -29,9 +28,9 @@
|
|||||||
} keystroke_type_t;
|
} keystroke_type_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SwitchLayerMode_Hold,
|
|
||||||
SwitchLayerMode_HoldAndDoubleTapToggle,
|
SwitchLayerMode_HoldAndDoubleTapToggle,
|
||||||
SwitchLayerMode_Toggle,
|
SwitchLayerMode_Toggle,
|
||||||
|
SwitchLayerMode_Hold,
|
||||||
} switch_layer_mode_t;
|
} switch_layer_mode_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
#include "key_debouncer.h"
|
|
||||||
#include "fsl_pit.h"
|
|
||||||
#include "slot.h"
|
|
||||||
#include "module.h"
|
|
||||||
#include "key_states.h"
|
|
||||||
#include "peripherals/test_led.h"
|
|
||||||
|
|
||||||
void PIT_KEY_DEBOUNCER_HANDLER(void)
|
|
||||||
{
|
|
||||||
TEST_LED_TOGGLE();
|
|
||||||
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
|
||||||
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
|
||||||
uint8_t *debounceCounter = &KeyStates[slotId][keyId].debounceCounter;
|
|
||||||
if (*debounceCounter < 0xff) {
|
|
||||||
(*debounceCounter)++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PIT_ClearStatusFlags(PIT, PIT_KEY_DEBOUNCER_CHANNEL, PIT_TFLG_TIF_MASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitKeyDebouncer(void)
|
|
||||||
{
|
|
||||||
pit_config_t pitConfig;
|
|
||||||
PIT_GetDefaultConfig(&pitConfig);
|
|
||||||
PIT_Init(PIT, &pitConfig);
|
|
||||||
PIT_SetTimerPeriod(PIT, PIT_KEY_DEBOUNCER_CHANNEL, MSEC_TO_COUNT(KEY_DEBOUNCER_INTERVAL_MSEC, PIT_SOURCE_CLOCK));
|
|
||||||
PIT_EnableInterrupts(PIT, PIT_KEY_DEBOUNCER_CHANNEL, kPIT_TimerInterruptEnable);
|
|
||||||
EnableIRQ(PIT_KEY_DEBOUNCER_IRQ_ID);
|
|
||||||
PIT_StartTimer(PIT, PIT_KEY_DEBOUNCER_CHANNEL);
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#ifndef __KEY_DEBOUNCER_H__
|
|
||||||
#define __KEY_DEBOUNCER_H__
|
|
||||||
|
|
||||||
// Includes:
|
|
||||||
|
|
||||||
#include "peripherals/pit.h"
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
// Macros:
|
|
||||||
|
|
||||||
#define KEY_DEBOUNCER_INTERVAL_MSEC 1
|
|
||||||
#define KEY_DEBOUNCER_TIMEOUT_MSEC 60
|
|
||||||
|
|
||||||
// Functions:
|
|
||||||
|
|
||||||
void InitKeyDebouncer(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#include "fsl_pit.h"
|
|
||||||
#include "key_scanner.h"
|
|
||||||
|
|
||||||
uint32_t KeyScannerCounter;
|
|
||||||
|
|
||||||
void PIT_KEY_SCANNER_HANDLER(void)
|
|
||||||
{
|
|
||||||
KeyMatrix_ScanRow(&RightKeyMatrix);
|
|
||||||
KeyScannerCounter++;
|
|
||||||
PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitKeyScanner(void)
|
|
||||||
{
|
|
||||||
pit_config_t pitConfig;
|
|
||||||
PIT_GetDefaultConfig(&pitConfig);
|
|
||||||
PIT_Init(PIT, &pitConfig);
|
|
||||||
PIT_SetTimerPeriod(PIT, PIT_KEY_SCANNER_CHANNEL, USEC_TO_COUNT(KEY_SCANNER_INTERVAL_USEC, PIT_SOURCE_CLOCK));
|
|
||||||
PIT_EnableInterrupts(PIT, PIT_KEY_SCANNER_CHANNEL, kPIT_TimerInterruptEnable);
|
|
||||||
EnableIRQ(PIT_KEY_SCANNER_IRQ_ID);
|
|
||||||
PIT_StartTimer(PIT, PIT_KEY_SCANNER_CHANNEL);
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#ifndef __KEY_SCANNER_H__
|
|
||||||
#define __KEY_SCANNER_H__
|
|
||||||
|
|
||||||
// Includes:
|
|
||||||
|
|
||||||
#include "peripherals/pit.h"
|
|
||||||
#include "right_key_matrix.h"
|
|
||||||
|
|
||||||
// Macros:
|
|
||||||
|
|
||||||
#define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM)
|
|
||||||
|
|
||||||
// Variables:
|
|
||||||
|
|
||||||
extern uint32_t KeyScannerCounter;
|
|
||||||
|
|
||||||
// Functions:
|
|
||||||
|
|
||||||
void InitKeyScanner(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -10,10 +10,11 @@
|
|||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool previous;
|
uint8_t timestamp;
|
||||||
bool current;
|
bool previous : 1;
|
||||||
bool suppressed;
|
bool current : 1;
|
||||||
uint8_t debounceCounter;
|
bool suppressed : 1;
|
||||||
|
bool debouncing : 1;
|
||||||
} key_state_t;
|
} key_state_t;
|
||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|||||||
@@ -128,6 +128,102 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
|||||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_V }},
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_V }},
|
||||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_B }},
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_B }},
|
||||||
|
|
||||||
|
// Row 5
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_CONTROL }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
|
||||||
|
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Fn }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SPACE }},
|
||||||
|
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mod }},
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
},
|
||||||
|
|
||||||
|
// Left module
|
||||||
|
{
|
||||||
|
// Row 1
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_1_AND_EXCLAMATION }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_2_AND_AT }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_3_AND_HASHMARK }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_4_AND_DOLLAR }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_5_AND_PERCENTAGE }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_6_AND_CARET }},
|
||||||
|
|
||||||
|
// Row 2
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_TAB }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Q }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_W }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_E }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_R }},
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_T }},
|
||||||
|
|
||||||
|
// Row 3
|
||||||
|
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_A }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_S }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_D }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_F }},
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_G }},
|
||||||
|
|
||||||
|
// Row 4
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_SHIFT }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Z }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_X }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_C }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_V }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_B }},
|
||||||
|
|
||||||
|
// Row 5
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_CONTROL }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
|
||||||
|
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Fn }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SPACE }},
|
||||||
|
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mod }},
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
},
|
||||||
|
|
||||||
|
// Right module
|
||||||
|
{
|
||||||
|
// Row 1
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_1_AND_EXCLAMATION }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_2_AND_AT }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_3_AND_HASHMARK }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_4_AND_DOLLAR }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_5_AND_PERCENTAGE }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_6_AND_CARET }},
|
||||||
|
|
||||||
|
// Row 2
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_TAB }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Q }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_W }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_E }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_R }},
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_T }},
|
||||||
|
|
||||||
|
// Row 3
|
||||||
|
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_A }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_S }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_D }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_F }},
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_G }},
|
||||||
|
|
||||||
|
// Row 4
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_SHIFT }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Z }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_X }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_C }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_V }},
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_B }},
|
||||||
|
|
||||||
// Row 5
|
// Row 5
|
||||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_CONTROL }},
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_CONTROL }},
|
||||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
|
||||||
|
|||||||
@@ -5,24 +5,23 @@
|
|||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
|
|
||||||
static bool heldLayers[LAYER_COUNT];
|
static bool heldLayers[LAYER_COUNT];
|
||||||
static switch_layer_mode_t pressedLayers[LAYER_COUNT];
|
static bool toggledLayers[LAYER_COUNT];
|
||||||
|
|
||||||
void updateLayerStates(void)
|
void updateLayerStates(void)
|
||||||
{
|
{
|
||||||
memset(heldLayers, false, LAYER_COUNT);
|
memset(heldLayers, false, LAYER_COUNT);
|
||||||
memset(pressedLayers, false, LAYER_COUNT);
|
memset(toggledLayers, false, LAYER_COUNT);
|
||||||
|
|
||||||
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
||||||
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
||||||
key_state_t *keyState = &KeyStates[slotId][keyId];
|
key_state_t *keyState = &KeyStates[slotId][keyId];
|
||||||
if (keyState->current) {
|
if (keyState->current && !keyState->suppressed) {
|
||||||
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
|
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
|
||||||
if (action.type == KeyActionType_SwitchLayer) {
|
if (action.type == KeyActionType_SwitchLayer) {
|
||||||
if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
|
if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
|
||||||
heldLayers[action.switchLayer.layer] = true;
|
heldLayers[action.switchLayer.layer] = true;
|
||||||
}
|
} else if (!keyState->previous) {
|
||||||
if (action.switchLayer.mode != SwitchLayerMode_Hold && !keyState->previous && keyState->current) {
|
toggledLayers[action.switchLayer.layer] = true;
|
||||||
pressedLayers[action.switchLayer.layer] = action.switchLayer.mode;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -40,11 +39,11 @@ layer_id_t GetActiveLayer()
|
|||||||
// Handle toggled layers
|
// Handle toggled layers
|
||||||
|
|
||||||
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
|
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
|
||||||
if (pressedLayers[layerId]) {
|
if (toggledLayers[layerId]) {
|
||||||
if (ToggledLayer == layerId) {
|
if (ToggledLayer == layerId) {
|
||||||
ToggledLayer = LayerId_Base;
|
ToggledLayer = LayerId_Base;
|
||||||
break;
|
break;
|
||||||
} else if (ToggledLayer == LayerId_Base && pressedLayers[layerId] == SwitchLayerMode_Toggle) {
|
} else if (ToggledLayer == LayerId_Base && toggledLayers[layerId] == SwitchLayerMode_Toggle) {
|
||||||
ToggledLayer = layerId;
|
ToggledLayer = layerId;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
uint8_t IconsAndLayerTextsBrightness = 0xff;
|
uint8_t IconsAndLayerTextsBrightness = 0xff;
|
||||||
uint8_t AlphanumericSegmentsBrightness = 0xff;
|
uint8_t AlphanumericSegmentsBrightness = 0xff;
|
||||||
bool ledIconStates[LedDisplayIcon_Last];
|
bool ledIconStates[LedDisplayIcon_Last];
|
||||||
|
char LedDisplay_DebugString[] = " ";
|
||||||
|
|
||||||
static const uint16_t capitalLetterToSegmentMap[] = {
|
static const uint16_t capitalLetterToSegmentMap[] = {
|
||||||
0b0000000011110111,
|
0b0000000011110111,
|
||||||
@@ -109,15 +110,19 @@ void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
|||||||
|
|
||||||
void LedDisplay_UpdateIcons(void)
|
void LedDisplay_UpdateIcons(void)
|
||||||
{
|
{
|
||||||
for (uint8_t i=0; i<=LedDisplayIcon_Last; i++) {
|
for (led_display_icon_t i=0; i<=LedDisplayIcon_Last; i++) {
|
||||||
LedDisplay_SetIcon(i, ledIconStates[i]);
|
LedDisplay_SetIcon(i, ledIconStates[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LedDisplay_UpdateText(void)
|
void LedDisplay_UpdateText(void)
|
||||||
{
|
{
|
||||||
|
#if LED_DISPLAY_DEBUG_MODE == 0
|
||||||
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
|
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
|
||||||
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
||||||
|
#else
|
||||||
|
LedDisplay_SetText(strlen(LedDisplay_DebugString), LedDisplay_DebugString);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void LedDisplay_UpdateAll(void)
|
void LedDisplay_UpdateAll(void)
|
||||||
|
|||||||
@@ -7,6 +7,10 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "layer.h"
|
#include "layer.h"
|
||||||
|
|
||||||
|
// Macros:
|
||||||
|
|
||||||
|
#define LED_DISPLAY_DEBUG_MODE 0
|
||||||
|
|
||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -20,6 +24,7 @@
|
|||||||
|
|
||||||
extern uint8_t IconsAndLayerTextsBrightness;
|
extern uint8_t IconsAndLayerTextsBrightness;
|
||||||
extern uint8_t AlphanumericSegmentsBrightness;
|
extern uint8_t AlphanumericSegmentsBrightness;
|
||||||
|
extern char LedDisplay_DebugString[];
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
277
right/src/link/MK22FN512xxx12_flash.ld
Normal file
277
right/src/link/MK22FN512xxx12_flash.ld
Normal file
@@ -0,0 +1,277 @@
|
|||||||
|
/*
|
||||||
|
** ###################################################################
|
||||||
|
** Processors: MK22FN512CAP12
|
||||||
|
** MK22FN512VDC12
|
||||||
|
** MK22FN512VLH12
|
||||||
|
** MK22FN512VLL12
|
||||||
|
** MK22FN512VMP12
|
||||||
|
**
|
||||||
|
** Compiler: GNU C Compiler
|
||||||
|
** Reference manual: K22P121M120SF7RM, Rev. 1, March 24, 2014
|
||||||
|
** Version: rev. 2.8, 2015-02-19
|
||||||
|
** Build: b151217
|
||||||
|
**
|
||||||
|
** Abstract:
|
||||||
|
** Linker file for the GNU C Compiler
|
||||||
|
**
|
||||||
|
** Copyright (c) 2015 Freescale Semiconductor, Inc.
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
** are permitted provided that the following conditions are met:
|
||||||
|
**
|
||||||
|
** o Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
** of conditions and the following disclaimer.
|
||||||
|
**
|
||||||
|
** o Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
** list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
** other materials provided with the distribution.
|
||||||
|
**
|
||||||
|
** o Neither the name of Freescale Semiconductor, Inc. nor the names of its
|
||||||
|
** contributors may be used to endorse or promote products derived from this
|
||||||
|
** software without specific prior written permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**
|
||||||
|
** http: www.freescale.com
|
||||||
|
** mail: support@freescale.com
|
||||||
|
**
|
||||||
|
** ###################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Entry Point */
|
||||||
|
ENTRY(Reset_Handler)
|
||||||
|
|
||||||
|
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x2000;
|
||||||
|
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
|
||||||
|
M_VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x0400 : 0x0;
|
||||||
|
|
||||||
|
/* This should match the value in bootloader_config.h if KBOOT is used */
|
||||||
|
BL_APP_VECTOR_TABLE_ADDRESS = DEFINED(__bl_app_vector_table_address__) ? __bl_app_vector_table_address__ : 0;
|
||||||
|
|
||||||
|
/* Specify the memory areas */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
m_interrupts (RX) : ORIGIN = 0x0 + BL_APP_VECTOR_TABLE_ADDRESS, LENGTH = 0x00000400
|
||||||
|
m_text (RX) : ORIGIN = 0x00000400 + BL_APP_VECTOR_TABLE_ADDRESS, LENGTH = 512K - 0x400 - BL_APP_VECTOR_TABLE_ADDRESS
|
||||||
|
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000
|
||||||
|
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x0000FF00
|
||||||
|
m_noinit (RW) : ORIGIN = 0x2000FF00, LENGTH = 0x000000FF
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Define output sections */
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* The startup code goes first into internal flash */
|
||||||
|
.interrupts :
|
||||||
|
{
|
||||||
|
__VECTOR_TABLE = .;
|
||||||
|
. = ALIGN(4);
|
||||||
|
KEEP(*(.isr_vector)) /* Startup code */
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > m_interrupts
|
||||||
|
|
||||||
|
/* The program code and other data goes into internal flash */
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
*(.text) /* .text sections (code) */
|
||||||
|
*(.text*) /* .text* sections (code) */
|
||||||
|
*(.rodata) /* .rodata sections (constants, strings, etc.) */
|
||||||
|
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
|
||||||
|
*(.glue_7) /* glue arm to thumb code */
|
||||||
|
*(.glue_7t) /* glue thumb to arm code */
|
||||||
|
*(.eh_frame)
|
||||||
|
KEEP (*(.init))
|
||||||
|
KEEP (*(.fini))
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
.ARM.extab :
|
||||||
|
{
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
.ARM :
|
||||||
|
{
|
||||||
|
__exidx_start = .;
|
||||||
|
*(.ARM.exidx*)
|
||||||
|
__exidx_end = .;
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
.ctors :
|
||||||
|
{
|
||||||
|
__CTOR_LIST__ = .;
|
||||||
|
/* gcc uses crtbegin.o to find the start of
|
||||||
|
the constructors, so we make sure it is
|
||||||
|
first. Because this is a wildcard, it
|
||||||
|
doesn't matter if the user does not
|
||||||
|
actually link against crtbegin.o; the
|
||||||
|
linker won't look for a file to match a
|
||||||
|
wildcard. The wildcard also means that it
|
||||||
|
doesn't matter which directory crtbegin.o
|
||||||
|
is in. */
|
||||||
|
KEEP (*crtbegin.o(.ctors))
|
||||||
|
KEEP (*crtbegin?.o(.ctors))
|
||||||
|
/* We don't want to include the .ctor section from
|
||||||
|
from the crtend.o file until after the sorted ctors.
|
||||||
|
The .ctor section from the crtend file contains the
|
||||||
|
end of ctors marker and it must be last */
|
||||||
|
KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
|
||||||
|
KEEP (*(SORT(.ctors.*)))
|
||||||
|
KEEP (*(.ctors))
|
||||||
|
__CTOR_END__ = .;
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
.dtors :
|
||||||
|
{
|
||||||
|
__DTOR_LIST__ = .;
|
||||||
|
KEEP (*crtbegin.o(.dtors))
|
||||||
|
KEEP (*crtbegin?.o(.dtors))
|
||||||
|
KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
|
||||||
|
KEEP (*(SORT(.dtors.*)))
|
||||||
|
KEEP (*(.dtors))
|
||||||
|
__DTOR_END__ = .;
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
.preinit_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||||
|
KEEP (*(.preinit_array*))
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
.init_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN (__init_array_start = .);
|
||||||
|
KEEP (*(SORT(.init_array.*)))
|
||||||
|
KEEP (*(.init_array*))
|
||||||
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
.fini_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||||
|
KEEP (*(SORT(.fini_array.*)))
|
||||||
|
KEEP (*(.fini_array*))
|
||||||
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
|
} > m_text
|
||||||
|
|
||||||
|
__etext = .; /* define a global symbol at end of code */
|
||||||
|
__DATA_ROM = .; /* Symbol is used by startup for data initialization */
|
||||||
|
|
||||||
|
.interrupts_ram :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__VECTOR_RAM__ = .;
|
||||||
|
__interrupts_ram_start__ = .; /* Create a global symbol at data start */
|
||||||
|
*(.m_interrupts_ram) /* This is a user defined section */
|
||||||
|
. += M_VECTOR_RAM_SIZE;
|
||||||
|
. = ALIGN(4);
|
||||||
|
__interrupts_ram_end__ = .; /* Define a global symbol at data end */
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
__VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts);
|
||||||
|
__RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0;
|
||||||
|
|
||||||
|
.data : AT(__DATA_ROM)
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__DATA_RAM = .;
|
||||||
|
__data_start__ = .; /* create a global symbol at data start */
|
||||||
|
*(.data) /* .data sections */
|
||||||
|
*(.data*) /* .data* sections */
|
||||||
|
KEEP(*(.jcr*))
|
||||||
|
. = ALIGN(4);
|
||||||
|
__data_end__ = .; /* define a global symbol at data end */
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
__DATA_END = __DATA_ROM + (__data_end__ - __data_start__);
|
||||||
|
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
||||||
|
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
|
||||||
|
|
||||||
|
/* Uninitialized data section */
|
||||||
|
.bss : ALIGN(4)
|
||||||
|
{
|
||||||
|
/* This is used by the startup in order to initialize the .bss section */
|
||||||
|
__START_BSS = .;
|
||||||
|
__bss_start__ = .;
|
||||||
|
*(.bss)
|
||||||
|
*(.bss*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
.m_usb_bdt (NOLOAD) :
|
||||||
|
{
|
||||||
|
. = ALIGN(512);
|
||||||
|
*(m_usb_bdt)
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
.m_usb_global (NOLOAD) :
|
||||||
|
{
|
||||||
|
*(m_usb_global)
|
||||||
|
__bss_end__ = .;
|
||||||
|
__END_BSS = .;
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
.m_data_2 :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
*(.m_data_2) /* This is an User defined section */
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > m_data_2
|
||||||
|
|
||||||
|
.heap :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
__end__ = .;
|
||||||
|
PROVIDE(end = .);
|
||||||
|
_pvHeapStart = .; /* Add for _sbrk */
|
||||||
|
__HeapBase = .;
|
||||||
|
. += HEAP_SIZE;
|
||||||
|
__HeapLimit = .;
|
||||||
|
__heap_limit = .; /* Add for _sbrk */
|
||||||
|
} > m_data_2
|
||||||
|
|
||||||
|
.stack :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
. += STACK_SIZE;
|
||||||
|
} > m_data_2
|
||||||
|
|
||||||
|
/* Initializes stack on the end of block */
|
||||||
|
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
||||||
|
__StackLimit = __StackTop - STACK_SIZE;
|
||||||
|
PROVIDE(__stack = __StackTop);
|
||||||
|
|
||||||
|
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||||
|
|
||||||
|
ASSERT(__StackLimit >= __HeapLimit, "region m_data_2 overflowed with stack and heap")
|
||||||
|
|
||||||
|
.noinit (NOLOAD):
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
_noinit = .;
|
||||||
|
|
||||||
|
*(.noinit .noinit.*)
|
||||||
|
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
_end_noinit = .;
|
||||||
|
} > m_noinit
|
||||||
|
|
||||||
|
/* Mandatory to be word aligned, _sbrk assumes this */
|
||||||
|
PROVIDE ( end = _end_noinit ); /* was _ebss */
|
||||||
|
PROVIDE ( _end = _end_noinit );
|
||||||
|
PROVIDE ( __end = _end_noinit );
|
||||||
|
PROVIDE ( __end__ = _end_noinit );
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "config_parser/parse_macro.h"
|
#include "config_parser/parse_macro.h"
|
||||||
#include "config_parser/config_globals.h"
|
#include "config_parser/config_globals.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
macro_reference_t AllMacros[MAX_MACRO_NUM];
|
macro_reference_t AllMacros[MAX_MACRO_NUM];
|
||||||
uint8_t AllMacrosCount;
|
uint8_t AllMacrosCount;
|
||||||
@@ -18,69 +19,102 @@ uint8_t characterToScancode(char character)
|
|||||||
{
|
{
|
||||||
switch (character) {
|
switch (character) {
|
||||||
case 'A' ... 'Z':
|
case 'A' ... 'Z':
|
||||||
return 0;
|
|
||||||
case 'a' ... 'z':
|
case 'a' ... 'z':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_A - 1 + (character & 0x1F);
|
||||||
case '1' ... '9':
|
case '1' ... '9':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_1_AND_EXCLAMATION - 1 + (character & 0x0F);
|
||||||
case ')':
|
case ')':
|
||||||
case '0':
|
case '0':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS;
|
||||||
case '!':
|
case '!':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_1_AND_EXCLAMATION;
|
||||||
case '@':
|
case '@':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_2_AND_AT;
|
||||||
case '#':
|
case '#':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_3_AND_HASHMARK;
|
||||||
case '$':
|
case '$':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_4_AND_DOLLAR;
|
||||||
case '%':
|
case '%':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_5_AND_PERCENTAGE;
|
||||||
case '^':
|
case '^':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_6_AND_CARET;
|
||||||
case '&':
|
case '&':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_7_AND_AMPERSAND;
|
||||||
case '*':
|
case '*':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_8_AND_ASTERISK;
|
||||||
case '(':
|
case '(':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS;
|
||||||
case '`':
|
case '`':
|
||||||
case '~':
|
case '~':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE;
|
||||||
case '[':
|
case '[':
|
||||||
case '{':
|
case '{':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE;
|
||||||
case ']':
|
case ']':
|
||||||
case '}':
|
case '}':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE;
|
||||||
case ';':
|
case ';':
|
||||||
case ':':
|
case ':':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_SEMICOLON_AND_COLON;
|
||||||
case '\'':
|
case '\'':
|
||||||
case '\"':
|
case '\"':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE;
|
||||||
case '+':
|
case '+':
|
||||||
case '=':
|
case '=':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_EQUAL_AND_PLUS;
|
||||||
case '\\':
|
case '\\':
|
||||||
case '|':
|
case '|':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_BACKSLASH_AND_PIPE;
|
||||||
case '.':
|
case '.':
|
||||||
case '>':
|
case '>':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN;
|
||||||
case ',':
|
case ',':
|
||||||
case '<':
|
case '<':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN;
|
||||||
case '/':
|
case '/':
|
||||||
case '\?':
|
case '\?':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK;
|
||||||
case '-':
|
case '-':
|
||||||
case '_':
|
case '_':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE;
|
||||||
|
case '\n':
|
||||||
|
return HID_KEYBOARD_SC_ENTER;
|
||||||
|
case ' ':
|
||||||
|
return HID_KEYBOARD_SC_SPACE;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool characterToShift(char character)
|
||||||
|
{
|
||||||
|
switch (character) {
|
||||||
|
case 'A' ... 'Z':
|
||||||
|
case ')':
|
||||||
|
case '!':
|
||||||
|
case '@':
|
||||||
|
case '#':
|
||||||
|
case '$':
|
||||||
|
case '%':
|
||||||
|
case '^':
|
||||||
|
case '&':
|
||||||
|
case '*':
|
||||||
|
case '(':
|
||||||
|
case '~':
|
||||||
|
case '{':
|
||||||
|
case '}':
|
||||||
|
case ':':
|
||||||
|
case '\"':
|
||||||
|
case '+':
|
||||||
|
case '|':
|
||||||
|
case '>':
|
||||||
|
case '<':
|
||||||
|
case '\?':
|
||||||
|
case '_':
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void addBasicScancode(uint8_t scancode)
|
void addBasicScancode(uint8_t scancode)
|
||||||
{
|
{
|
||||||
if (!scancode) {
|
if (!scancode) {
|
||||||
@@ -184,89 +218,183 @@ void deleteSystemScancode(uint8_t scancode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool processKeyMacroAction(void)
|
void addScancode(uint16_t scancode, macro_sub_action_t type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case KeystrokeType_Basic:
|
||||||
|
addBasicScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_Media:
|
||||||
|
addMediaScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_System:
|
||||||
|
addSystemScancode(scancode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteScancode(uint16_t scancode, macro_sub_action_t type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case KeystrokeType_Basic:
|
||||||
|
deleteBasicScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_Media:
|
||||||
|
deleteMediaScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_System:
|
||||||
|
deleteSystemScancode(scancode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processKeyAction(void)
|
||||||
{
|
{
|
||||||
static bool pressStarted;
|
static bool pressStarted;
|
||||||
|
|
||||||
switch (currentMacroAction.key.action) {
|
switch (currentMacroAction.key.action) {
|
||||||
case MacroSubAction_Press:
|
case MacroSubAction_Tap:
|
||||||
if (!pressStarted) {
|
if (!pressStarted) {
|
||||||
pressStarted = true;
|
pressStarted = true;
|
||||||
addModifiers(currentMacroAction.key.modifierMask);
|
addModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
addBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_Media:
|
|
||||||
// addMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
addSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
pressStarted = false;
|
pressStarted = false;
|
||||||
deleteModifiers(currentMacroAction.key.modifierMask);
|
deleteModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
deleteBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_Media:
|
|
||||||
// deleteMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
deleteSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case MacroSubAction_Release:
|
case MacroSubAction_Release:
|
||||||
deleteModifiers(currentMacroAction.key.modifierMask);
|
deleteModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
deleteBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_Media:
|
|
||||||
// deleteMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
deleteSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case MacroSubAction_Hold:
|
case MacroSubAction_Press:
|
||||||
addModifiers(currentMacroAction.key.modifierMask);
|
addModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
addBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_Media:
|
|
||||||
// addMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
addSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool processDelayAction(void)
|
||||||
|
{
|
||||||
|
static bool inDelay;
|
||||||
|
static uint32_t delayStart;
|
||||||
|
|
||||||
|
if (inDelay) {
|
||||||
|
if (Timer_GetElapsedTime(&delayStart) >= currentMacroAction.delay.delay) {
|
||||||
|
inDelay = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
delayStart = CurrentTime;
|
||||||
|
inDelay = true;
|
||||||
|
}
|
||||||
|
return inDelay;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processMouseButtonAction(void)
|
||||||
|
{
|
||||||
|
static bool pressStarted;
|
||||||
|
|
||||||
|
switch (currentMacroAction.key.action) {
|
||||||
|
case MacroSubAction_Tap:
|
||||||
|
if (!pressStarted) {
|
||||||
|
pressStarted = true;
|
||||||
|
MacroMouseReport.buttons |= currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
pressStarted = false;
|
||||||
|
MacroMouseReport.buttons &= ~currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
break;
|
||||||
|
case MacroSubAction_Release:
|
||||||
|
MacroMouseReport.buttons &= ~currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
break;
|
||||||
|
case MacroSubAction_Press:
|
||||||
|
MacroMouseReport.buttons |= currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processMoveMouseAction(void)
|
||||||
|
{
|
||||||
|
static bool inMotion;
|
||||||
|
|
||||||
|
if (inMotion) {
|
||||||
|
MacroMouseReport.x = 0;
|
||||||
|
MacroMouseReport.y = 0;
|
||||||
|
inMotion = false;
|
||||||
|
} else {
|
||||||
|
MacroMouseReport.x = currentMacroAction.moveMouse.x;
|
||||||
|
MacroMouseReport.y = currentMacroAction.moveMouse.y;
|
||||||
|
inMotion = true;
|
||||||
|
}
|
||||||
|
return inMotion;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processScrollMouseAction(void)
|
||||||
|
{
|
||||||
|
static bool inMotion;
|
||||||
|
|
||||||
|
if (inMotion) {
|
||||||
|
MacroMouseReport.wheelX = 0;
|
||||||
|
MacroMouseReport.wheelY = 0;
|
||||||
|
inMotion = false;
|
||||||
|
} else {
|
||||||
|
MacroMouseReport.wheelX = currentMacroAction.scrollMouse.x;
|
||||||
|
MacroMouseReport.wheelY = currentMacroAction.scrollMouse.y;
|
||||||
|
inMotion = true;
|
||||||
|
}
|
||||||
|
return inMotion;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processTextAction(void)
|
||||||
|
{
|
||||||
|
static uint16_t textIndex;
|
||||||
|
static uint8_t reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
|
||||||
|
char character;
|
||||||
|
uint8_t scancode;
|
||||||
|
|
||||||
|
if (textIndex == currentMacroAction.text.textLen) {
|
||||||
|
textIndex = 0;
|
||||||
|
reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
|
||||||
|
memset(&MacroBasicKeyboardReport, 0, sizeof MacroBasicKeyboardReport);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (reportIndex == USB_BASIC_KEYBOARD_MAX_KEYS) {
|
||||||
|
reportIndex = 0;
|
||||||
|
memset(&MacroBasicKeyboardReport, 0, sizeof MacroBasicKeyboardReport);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
character = currentMacroAction.text.text[textIndex];
|
||||||
|
scancode = characterToScancode(character);
|
||||||
|
for (uint8_t i = 0; i < reportIndex; i++) {
|
||||||
|
if (MacroBasicKeyboardReport.scancodes[i] == scancode) {
|
||||||
|
reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MacroBasicKeyboardReport.scancodes[reportIndex++] = scancode;
|
||||||
|
MacroBasicKeyboardReport.modifiers = characterToShift(character) ? HID_KEYBOARD_MODIFIER_LEFTSHIFT : 0;
|
||||||
|
++textIndex;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool processCurrentMacroAction(void)
|
bool processCurrentMacroAction(void)
|
||||||
{
|
{
|
||||||
switch (currentMacroAction.type) {
|
switch (currentMacroAction.type) {
|
||||||
case MacroActionType_Delay:
|
case MacroActionType_Delay:
|
||||||
return false;
|
return processDelayAction();
|
||||||
case MacroActionType_Key:
|
case MacroActionType_Key:
|
||||||
return processKeyMacroAction();
|
return processKeyAction();
|
||||||
case MacroActionType_MouseButton:
|
case MacroActionType_MouseButton:
|
||||||
return false;
|
return processMouseButtonAction();
|
||||||
case MacroActionType_MoveMouse:
|
case MacroActionType_MoveMouse:
|
||||||
return false;
|
return processMoveMouseAction();
|
||||||
case MacroActionType_ScrollMouse:
|
case MacroActionType_ScrollMouse:
|
||||||
return false;
|
return processScrollMouseAction();
|
||||||
case MacroActionType_Text:
|
case MacroActionType_Text:
|
||||||
return false;
|
return processTextAction();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
} macro_reference_t;
|
} macro_reference_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
MacroSubAction_Tap,
|
||||||
MacroSubAction_Press,
|
MacroSubAction_Press,
|
||||||
MacroSubAction_Hold,
|
|
||||||
MacroSubAction_Release,
|
MacroSubAction_Release,
|
||||||
} macro_sub_action_t;
|
} macro_sub_action_t;
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
struct {
|
struct {
|
||||||
macro_sub_action_t action;
|
macro_sub_action_t action;
|
||||||
keystroke_type_t type;
|
keystroke_type_t type;
|
||||||
uint8_t scancode;
|
uint16_t scancode;
|
||||||
uint8_t modifierMask;
|
uint8_t modifierMask;
|
||||||
} ATTR_PACKED key;
|
} ATTR_PACKED key;
|
||||||
struct {
|
struct {
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
int16_t y;
|
int16_t y;
|
||||||
} ATTR_PACKED scrollMouse;
|
} ATTR_PACKED scrollMouse;
|
||||||
struct {
|
struct {
|
||||||
int16_t delay;
|
uint16_t delay;
|
||||||
} ATTR_PACKED delay;
|
} ATTR_PACKED delay;
|
||||||
struct {
|
struct {
|
||||||
const char *text;
|
const char *text;
|
||||||
|
|||||||
@@ -6,9 +6,10 @@
|
|||||||
#include "bus_pal_hardware.h"
|
#include "bus_pal_hardware.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "key_scanner.h"
|
#include "right_key_matrix.h"
|
||||||
#include "usb_commands/usb_command_apply_config.h"
|
#include "usb_commands/usb_command_apply_config.h"
|
||||||
#include "peripherals/reset_button.h"
|
#include "peripherals/reset_button.h"
|
||||||
|
#include "config_parser/config_globals.h"
|
||||||
#include "usb_report_updater.h"
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
static bool IsEepromInitialized = false;
|
static bool IsEepromInitialized = false;
|
||||||
@@ -21,17 +22,21 @@ static void userConfigurationReadFinished(void)
|
|||||||
|
|
||||||
static void hardwareConfigurationReadFinished(void)
|
static void hardwareConfigurationReadFinished(void)
|
||||||
{
|
{
|
||||||
|
if (IsFactoryResetModeEnabled) {
|
||||||
|
HardwareConfig->signatureLength = HARDWARE_CONFIG_SIGNATURE_LENGTH;
|
||||||
|
strncpy(HardwareConfig->signature, "FTY", HARDWARE_CONFIG_SIGNATURE_LENGTH);
|
||||||
|
}
|
||||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished);
|
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
InitClock();
|
InitClock();
|
||||||
InitPeripherals();
|
InitPeripherals();
|
||||||
|
|
||||||
if (!RESET_BUTTON_IS_PRESSED) {
|
IsFactoryResetModeEnabled = RESET_BUTTON_IS_PRESSED;
|
||||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
|
|
||||||
}
|
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
|
||||||
|
|
||||||
if (IsBusPalOn) {
|
if (IsBusPalOn) {
|
||||||
init_hardware();
|
init_hardware();
|
||||||
@@ -39,8 +44,6 @@ void main(void)
|
|||||||
} else {
|
} else {
|
||||||
InitSlaveScheduler();
|
InitSlaveScheduler();
|
||||||
KeyMatrix_Init(&RightKeyMatrix);
|
KeyMatrix_Init(&RightKeyMatrix);
|
||||||
InitKeyScanner();
|
|
||||||
UpdateUsbReports();
|
|
||||||
InitUsb();
|
InitUsb();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -48,6 +51,8 @@ void main(void)
|
|||||||
UsbCommand_ApplyConfig();
|
UsbCommand_ApplyConfig();
|
||||||
IsConfigInitialized = true;
|
IsConfigInitialized = true;
|
||||||
}
|
}
|
||||||
|
KeyMatrix_ScanRow(&RightKeyMatrix);
|
||||||
|
++MatrixScanCounter;
|
||||||
UpdateUsbReports();
|
UpdateUsbReports();
|
||||||
__WFI();
|
__WFI();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,12 +17,4 @@
|
|||||||
#define PIT_TIMER_IRQ_ID PIT1_IRQn
|
#define PIT_TIMER_IRQ_ID PIT1_IRQn
|
||||||
#define PIT_TIMER_CHANNEL kPIT_Chnl_1
|
#define PIT_TIMER_CHANNEL kPIT_Chnl_1
|
||||||
|
|
||||||
#define PIT_KEY_SCANNER_HANDLER PIT2_IRQHandler
|
|
||||||
#define PIT_KEY_SCANNER_IRQ_ID PIT2_IRQn
|
|
||||||
#define PIT_KEY_SCANNER_CHANNEL kPIT_Chnl_2
|
|
||||||
|
|
||||||
#define PIT_KEY_DEBOUNCER_HANDLER PIT3_IRQHandler
|
|
||||||
#define PIT_KEY_DEBOUNCER_IRQ_ID PIT3_IRQn
|
|
||||||
#define PIT_KEY_DEBOUNCER_CHANNEL kPIT_Chnl_3
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
#include "fsl_port.h"
|
#include "fsl_port.h"
|
||||||
#include "bootloader/wormhole.h"
|
#include "bootloader/wormhole.h"
|
||||||
|
|
||||||
|
bool IsFactoryResetModeEnabled = false;
|
||||||
|
|
||||||
void RESET_BUTTON_IRQ_HANDLER(void)
|
void RESET_BUTTON_IRQ_HANDLER(void)
|
||||||
{
|
{
|
||||||
Wormhole.magicNumber = WORMHOLE_MAGIC_NUMBER;
|
Wormhole.magicNumber = WORMHOLE_MAGIC_NUMBER;
|
||||||
|
|||||||
@@ -16,6 +16,10 @@
|
|||||||
|
|
||||||
#define RESET_BUTTON_IS_PRESSED !GPIO_ReadPinInput(RESET_BUTTON_GPIO, RESET_BUTTON_PIN)
|
#define RESET_BUTTON_IS_PRESSED !GPIO_ReadPinInput(RESET_BUTTON_GPIO, RESET_BUTTON_PIN)
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern bool IsFactoryResetModeEnabled;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void InitResetButton(void);
|
void InitResetButton(void);
|
||||||
|
|||||||
@@ -1,10 +1,31 @@
|
|||||||
#include "test_led.h"
|
#include "test_led.h"
|
||||||
#include "fsl_port.h"
|
#include "fsl_port.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
void InitTestLed(void)
|
void TestLed_Init(void)
|
||||||
{
|
{
|
||||||
CLOCK_EnableClock(TEST_LED_CLOCK);
|
CLOCK_EnableClock(TEST_LED_CLOCK);
|
||||||
PORT_SetPinMux(TEST_LED_GPIO_PORT, TEST_LED_GPIO_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(TEST_LED_GPIO_PORT, TEST_LED_GPIO_PIN, kPORT_MuxAsGpio);
|
||||||
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_GPIO_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_GPIO_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
||||||
TEST_LED_ON();
|
TestLed_On();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestLed_Blink(uint8_t times)
|
||||||
|
{
|
||||||
|
TestLed_Off();
|
||||||
|
Timer_Delay(500);
|
||||||
|
if (!times) {
|
||||||
|
TestLed_On();
|
||||||
|
Timer_Delay(500);
|
||||||
|
TestLed_Off();
|
||||||
|
Timer_Delay(500);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (times--) {
|
||||||
|
TestLed_On();
|
||||||
|
Timer_Delay(100);
|
||||||
|
TestLed_Off();
|
||||||
|
Timer_Delay(100);
|
||||||
|
}
|
||||||
|
Timer_Delay(400);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,13 +15,29 @@
|
|||||||
#define TEST_LED_CLOCK kCLOCK_PortD
|
#define TEST_LED_CLOCK kCLOCK_PortD
|
||||||
#define TEST_LED_GPIO_PIN 7U
|
#define TEST_LED_GPIO_PIN 7U
|
||||||
|
|
||||||
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
static inline void TestLed_On(void)
|
||||||
#define TEST_LED_OFF() GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
{
|
||||||
#define TEST_LED_SET(state) GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_GPIO_PIN, (state))
|
GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN);
|
||||||
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Off(void)
|
||||||
|
{
|
||||||
|
GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Set(bool state)
|
||||||
|
{
|
||||||
|
GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_GPIO_PIN, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Toggle(void)
|
||||||
|
{
|
||||||
|
GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void InitTestLed(void);
|
void TestLed_Init(void);
|
||||||
|
void TestLed_Blink(uint8_t times);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "right_key_matrix.h"
|
#include "right_key_matrix.h"
|
||||||
|
|
||||||
|
uint32_t MatrixScanCounter;
|
||||||
|
|
||||||
key_matrix_t RightKeyMatrix = {
|
key_matrix_t RightKeyMatrix = {
|
||||||
.colNum = RIGHT_KEY_MATRIX_COLS_NUM,
|
.colNum = RIGHT_KEY_MATRIX_COLS_NUM,
|
||||||
.rowNum = RIGHT_KEY_MATRIX_ROWS_NUM,
|
.rowNum = RIGHT_KEY_MATRIX_ROWS_NUM,
|
||||||
|
|||||||
@@ -14,5 +14,6 @@
|
|||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern key_matrix_t RightKeyMatrix;
|
extern key_matrix_t RightKeyMatrix;
|
||||||
|
extern uint32_t MatrixScanCounter;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
113
right/src/test_switches.c
Normal file
113
right/src/test_switches.c
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
#include "test_switches.h"
|
||||||
|
#include "led_display.h"
|
||||||
|
#include "key_action.h"
|
||||||
|
#include "keymap.h"
|
||||||
|
|
||||||
|
bool TestSwitches = false;
|
||||||
|
|
||||||
|
static const key_action_t TestKeymap[1][2][MAX_KEY_COUNT_PER_MODULE] = {
|
||||||
|
// Base layer
|
||||||
|
{
|
||||||
|
// Right keyboard half
|
||||||
|
{
|
||||||
|
// Row 1
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_7_AND_AMPERSAND } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_8_AND_ASTERISK } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_EQUAL_AND_PLUS } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_BACKSPACE } },
|
||||||
|
|
||||||
|
// Row 2
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_U } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_I } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_O } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_P } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_BACKSLASH_AND_PIPE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Y } },
|
||||||
|
|
||||||
|
// Row 3
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_J } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_K } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_L } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SEMICOLON_AND_COLON } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_PLUS } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_H } },
|
||||||
|
|
||||||
|
// Row 4
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_N } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_M } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_RIGHT_SHIFT } },
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
|
||||||
|
// Row 5
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_ASTERISK } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_7_AND_HOME } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT } },
|
||||||
|
},
|
||||||
|
|
||||||
|
// Left keyboard half
|
||||||
|
{
|
||||||
|
// Row 1
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_1_AND_EXCLAMATION } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_2_AND_AT } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_3_AND_HASHMARK } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_4_AND_DOLLAR } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_5_AND_PERCENTAGE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_6_AND_CARET } },
|
||||||
|
|
||||||
|
// Row 2
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_ESCAPE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Q } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_W } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_E } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_R } },
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_T } },
|
||||||
|
|
||||||
|
// Row 3
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_MINUS } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_A } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_S } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_D } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_F } },
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_G } },
|
||||||
|
|
||||||
|
// Row 4
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_SHIFT } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Z } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_X } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_C } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_V } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_B } },
|
||||||
|
|
||||||
|
// Row 5
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_1_AND_END } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_SLASH } },
|
||||||
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_5 } },
|
||||||
|
{ .type = KeyActionType_None },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void TestSwitches_Activate(void)
|
||||||
|
{
|
||||||
|
memcpy(&CurrentKeymap, &TestKeymap, sizeof TestKeymap);
|
||||||
|
LedDisplay_SetText(3, "TES");
|
||||||
|
}
|
||||||
16
right/src/test_switches.h
Normal file
16
right/src/test_switches.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef __TEST_MODE_H__
|
||||||
|
#define __TEST_MODE_H__
|
||||||
|
|
||||||
|
// Includes:
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
// Functions:
|
||||||
|
|
||||||
|
void TestSwitches_Activate(void);
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern bool TestSwitches;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,12 +1,18 @@
|
|||||||
#include "fsl_pit.h"
|
#include "fsl_pit.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "peripherals/test_led.h"
|
||||||
|
|
||||||
static volatile uint32_t CurrentTime;
|
volatile uint32_t CurrentTime;
|
||||||
|
static uint32_t timerClockFrequency;
|
||||||
|
static volatile uint32_t delayLength;
|
||||||
|
|
||||||
void PIT_TIMER_HANDLER(void)
|
void PIT_TIMER_HANDLER(void)
|
||||||
{
|
{
|
||||||
CurrentTime++;
|
CurrentTime++;
|
||||||
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, PIT_TFLG_TIF_MASK);
|
if (delayLength) {
|
||||||
|
--delayLength;
|
||||||
|
}
|
||||||
|
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, kPIT_TimerFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer_Init(void)
|
void Timer_Init(void)
|
||||||
@@ -15,28 +21,39 @@ void Timer_Init(void)
|
|||||||
PIT_GetDefaultConfig(&pitConfig);
|
PIT_GetDefaultConfig(&pitConfig);
|
||||||
PIT_Init(PIT, &pitConfig);
|
PIT_Init(PIT, &pitConfig);
|
||||||
|
|
||||||
// TODO: Why the interval needs to be multiplied by two to arrive to the correct timing?
|
timerClockFrequency = PIT_SOURCE_CLOCK;
|
||||||
// Figure it out and clean this up.
|
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC, timerClockFrequency));
|
||||||
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC*2, PIT_SOURCE_CLOCK));
|
|
||||||
|
|
||||||
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
|
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
|
||||||
EnableIRQ(PIT_TIMER_IRQ_ID);
|
EnableIRQ(PIT_TIMER_IRQ_ID);
|
||||||
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Timer_GetCurrentTime() {
|
uint32_t Timer_GetCurrentTimeMicros() {
|
||||||
return CurrentTime;
|
uint32_t primask, count, ms;
|
||||||
|
primask = DisableGlobalIRQ(); // Make sure the read is atomic
|
||||||
|
count = PIT_GetCurrentTimerCount(PIT, PIT_TIMER_CHANNEL); // Read the current timer count
|
||||||
|
ms = CurrentTime; // Read the overflow counter
|
||||||
|
EnableGlobalIRQ(primask); // Enable interrupts again if they where enabled before - this should make it interrupt safe
|
||||||
|
|
||||||
|
// Calculate the counter value in microseconds - note that the PIT timer is counting downward, so we need to subtract the count from the period value
|
||||||
|
uint32_t us = 1000U * TIMER_INTERVAL_MSEC - COUNT_TO_USEC(count, timerClockFrequency);
|
||||||
|
return ms * 1000U * TIMER_INTERVAL_MSEC + us;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer_SetCurrentTime(uint32_t *time)
|
void Timer_SetCurrentTimeMicros(uint32_t *time)
|
||||||
{
|
{
|
||||||
*time = CurrentTime;
|
*time = Timer_GetCurrentTimeMicros();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Timer_GetElapsedTime(uint32_t *time)
|
uint32_t Timer_GetElapsedTime(uint32_t *time)
|
||||||
{
|
{
|
||||||
uint32_t elapsedTime = CurrentTime - *time;
|
return CurrentTime - *time;
|
||||||
return elapsedTime;
|
}
|
||||||
|
|
||||||
|
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time)
|
||||||
|
{
|
||||||
|
return Timer_GetCurrentTimeMicros() - *time;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
||||||
@@ -45,3 +62,18 @@ uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
|||||||
*time = CurrentTime;
|
*time = CurrentTime;
|
||||||
return elapsedTime;
|
return elapsedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time)
|
||||||
|
{
|
||||||
|
uint32_t elapsedTime = Timer_GetElapsedTimeMicros(time);
|
||||||
|
*time = Timer_GetCurrentTimeMicros();
|
||||||
|
return elapsedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Timer_Delay(uint32_t length)
|
||||||
|
{
|
||||||
|
delayLength = length;
|
||||||
|
while (delayLength) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,12 +9,19 @@
|
|||||||
|
|
||||||
#define TIMER_INTERVAL_MSEC 1
|
#define TIMER_INTERVAL_MSEC 1
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern volatile uint32_t CurrentTime;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void Timer_Init(void);
|
void Timer_Init(void);
|
||||||
uint32_t Timer_GetCurrentTime();
|
uint32_t Timer_GetCurrentTimeMicros();
|
||||||
void Timer_SetCurrentTime(uint32_t *time);
|
void Timer_SetCurrentTimeMicros(uint32_t *time);
|
||||||
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
||||||
|
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time);
|
||||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
||||||
|
uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time);
|
||||||
|
void Timer_Delay(uint32_t length);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "usb_commands/usb_command_apply_config.h"
|
#include "usb_commands/usb_command_apply_config.h"
|
||||||
#include "config_parser/config_globals.h"
|
#include "config_parser/config_globals.h"
|
||||||
#include "config_parser/parse_config.h"
|
#include "config_parser/parse_config.h"
|
||||||
|
#include "peripherals/reset_button.h"
|
||||||
#include "usb_protocol_handler.h"
|
#include "usb_protocol_handler.h"
|
||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
|
|
||||||
@@ -35,6 +36,10 @@ void UsbCommand_ApplyConfig(void)
|
|||||||
ValidatedUserConfigBuffer.buffer = StagingUserConfigBuffer.buffer;
|
ValidatedUserConfigBuffer.buffer = StagingUserConfigBuffer.buffer;
|
||||||
StagingUserConfigBuffer.buffer = temp;
|
StagingUserConfigBuffer.buffer = temp;
|
||||||
|
|
||||||
|
if (IsFactoryResetModeEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ParserRunDry = false;
|
ParserRunDry = false;
|
||||||
ValidatedUserConfigBuffer.offset = 0;
|
ValidatedUserConfigBuffer.offset = 0;
|
||||||
parseConfigStatus = ParseConfig(&ValidatedUserConfigBuffer);
|
parseConfigStatus = ParseConfig(&ValidatedUserConfigBuffer);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "i2c_watchdog.h"
|
#include "i2c_watchdog.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_scanner.h"
|
#include "right_key_matrix.h"
|
||||||
#include "usb_report_updater.h"
|
#include "usb_report_updater.h"
|
||||||
#include "usb_interfaces/usb_interface_basic_keyboard.h"
|
#include "usb_interfaces/usb_interface_basic_keyboard.h"
|
||||||
#include "usb_interfaces/usb_interface_media_keyboard.h"
|
#include "usb_interfaces/usb_interface_media_keyboard.h"
|
||||||
@@ -20,9 +20,9 @@ void UsbCommand_GetDebugBuffer(void)
|
|||||||
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
|
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
|
||||||
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
|
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
|
||||||
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
||||||
SetDebugBufferUint32(17, KeyScannerCounter);
|
SetDebugBufferUint32(17, MatrixScanCounter);
|
||||||
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
||||||
SetDebugBufferUint32(25, Timer_GetCurrentTime());
|
SetDebugBufferUint32(25, CurrentTime);
|
||||||
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
||||||
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
||||||
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ void UsbCommand_GetDeviceProperty(void)
|
|||||||
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
||||||
break;
|
break;
|
||||||
case DevicePropertyId_Uptime:
|
case DevicePropertyId_Uptime:
|
||||||
SetUsbTxBufferUint32(1, Timer_GetCurrentTime());
|
SetUsbTxBufferUint32(1, CurrentTime);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
||||||
|
|||||||
28
right/src/usb_commands/usb_command_get_variable.c
Normal file
28
right/src/usb_commands/usb_command_get_variable.c
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#include "usb_protocol_handler.h"
|
||||||
|
#include "usb_commands/usb_command_get_variable.h"
|
||||||
|
#include "key_matrix.h"
|
||||||
|
#include "test_switches.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
|
void UsbCommand_GetVariable(void)
|
||||||
|
{
|
||||||
|
usb_variable_id_t variableId = GetUsbRxBufferUint8(1);
|
||||||
|
|
||||||
|
switch (variableId) {
|
||||||
|
case UsbVariable_TestSwitches:
|
||||||
|
SetUsbTxBufferUint8(1, TestSwitches);
|
||||||
|
break;
|
||||||
|
case UsbVariable_TestUsbStack:
|
||||||
|
SetUsbTxBufferUint8(1, TestUsbStack);
|
||||||
|
break;
|
||||||
|
case UsbVariable_DebounceTimePress:
|
||||||
|
SetUsbTxBufferUint8(1, DebounceTimePress);
|
||||||
|
break;
|
||||||
|
case UsbVariable_DebounceTimeRelease:
|
||||||
|
SetUsbTxBufferUint8(1, DebounceTimeRelease);
|
||||||
|
break;
|
||||||
|
case UsbVariable_UsbReportSemaphore:
|
||||||
|
SetUsbTxBufferUint8(1, UsbReportUpdateSemaphore);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
8
right/src/usb_commands/usb_command_get_variable.h
Normal file
8
right/src/usb_commands/usb_command_get_variable.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __USB_COMMAND_GET_VARIABLE_H__
|
||||||
|
#define __USB_COMMAND_GET_VARIABLE_H__
|
||||||
|
|
||||||
|
// Functions:
|
||||||
|
|
||||||
|
void UsbCommand_GetVariable(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -6,6 +6,6 @@
|
|||||||
void UsbCommand_SetTestLed(void)
|
void UsbCommand_SetTestLed(void)
|
||||||
{
|
{
|
||||||
bool isTestLedOn = GetUsbRxBufferUint8(1);
|
bool isTestLedOn = GetUsbRxBufferUint8(1);
|
||||||
TEST_LED_SET(isTestLedOn);
|
TestLed_Set(isTestLedOn);
|
||||||
UhkModuleStates[UhkModuleDriverId_LeftKeyboardHalf].sourceVars.isTestLedOn = isTestLedOn;
|
UhkModuleStates[UhkModuleDriverId_LeftKeyboardHalf].sourceVars.isTestLedOn = isTestLedOn;
|
||||||
}
|
}
|
||||||
|
|||||||
31
right/src/usb_commands/usb_command_set_variable.c
Normal file
31
right/src/usb_commands/usb_command_set_variable.c
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#include "usb_protocol_handler.h"
|
||||||
|
#include "usb_commands/usb_command_set_variable.h"
|
||||||
|
#include "key_matrix.h"
|
||||||
|
#include "test_switches.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
|
void UsbCommand_SetVariable(void)
|
||||||
|
{
|
||||||
|
usb_variable_id_t variableId = GetUsbRxBufferUint8(1);
|
||||||
|
|
||||||
|
switch (variableId) {
|
||||||
|
case UsbVariable_TestSwitches:
|
||||||
|
if (GetUsbRxBufferUint8(2)) {
|
||||||
|
TestSwitches = true;
|
||||||
|
TestSwitches_Activate();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UsbVariable_TestUsbStack:
|
||||||
|
TestUsbStack = GetUsbRxBufferUint8(2);
|
||||||
|
break;
|
||||||
|
case UsbVariable_DebounceTimePress:
|
||||||
|
DebounceTimePress = GetUsbRxBufferUint8(2);
|
||||||
|
break;
|
||||||
|
case UsbVariable_DebounceTimeRelease:
|
||||||
|
DebounceTimeRelease = GetUsbRxBufferUint8(2);
|
||||||
|
break;
|
||||||
|
case UsbVariable_UsbReportSemaphore:
|
||||||
|
UsbReportUpdateSemaphore = GetUsbRxBufferUint8(2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
8
right/src/usb_commands/usb_command_set_variable.h
Normal file
8
right/src/usb_commands/usb_command_set_variable.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __USB_COMMAND_SET_VARIABLE_H__
|
||||||
|
#define __USB_COMMAND_SET_VARIABLE_H__
|
||||||
|
|
||||||
|
// Functions:
|
||||||
|
|
||||||
|
void UsbCommand_SetVariable(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -163,23 +163,30 @@ static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
|
|||||||
}
|
}
|
||||||
}};
|
}};
|
||||||
|
|
||||||
bool IsHostSleeping = false;
|
volatile bool SleepModeActive = true;
|
||||||
|
static volatile bool wakeUpHostAllowed;
|
||||||
|
|
||||||
static void suspendHost(void) {
|
static void suspendUhk(void) {
|
||||||
IsHostSleeping = true;
|
SleepModeActive = true;
|
||||||
LedSlaveDriver_DisableLeds();
|
LedSlaveDriver_DisableLeds();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WakeUpHost(bool sendResume) {
|
static void wakeUpUhk(void) {
|
||||||
if (sendResume) { // The device should wake up the host.
|
SleepModeActive = false;
|
||||||
// Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
|
|
||||||
USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
IsHostSleeping = false;
|
|
||||||
LedSlaveDriver_UpdateLeds();
|
LedSlaveDriver_UpdateLeds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WakeUpHost(void) {
|
||||||
|
if (!wakeUpHostAllowed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
|
||||||
|
USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL);
|
||||||
|
while (SleepModeActive) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
|
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
|
||||||
{
|
{
|
||||||
usb_status_t status = kStatus_USB_Error;
|
usb_status_t status = kStatus_USB_Error;
|
||||||
@@ -190,10 +197,6 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsHostSleeping) {
|
|
||||||
WakeUpHost(false); // Wake up the keyboard if there is any activity on the bus.
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case kUSB_DeviceEventBusReset:
|
case kUSB_DeviceEventBusReset:
|
||||||
UsbCompositeDevice.attach = 0;
|
UsbCompositeDevice.attach = 0;
|
||||||
@@ -201,17 +204,17 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
|
|||||||
break;
|
break;
|
||||||
case kUSB_DeviceEventSuspend:
|
case kUSB_DeviceEventSuspend:
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
suspendHost(); // The host sends this event when it goes to sleep, so turn off all the LEDs.
|
suspendUhk(); // The host sends this event when it goes to sleep, so turn off all the LEDs.
|
||||||
status = kStatus_USB_Success;
|
status = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kUSB_DeviceEventResume:
|
case kUSB_DeviceEventResume:
|
||||||
// We will just wake up the host if there is any activity on the bus.
|
wakeUpUhk();
|
||||||
// The problem is that the host won't send a resume event when it boots, so the lights will never come back on.
|
|
||||||
status = kStatus_USB_Success;
|
status = kStatus_USB_Success;
|
||||||
break;
|
break;
|
||||||
case kUSB_DeviceEventSetConfiguration:
|
case kUSB_DeviceEventSetConfiguration:
|
||||||
UsbCompositeDevice.attach = 1;
|
UsbCompositeDevice.attach = 1;
|
||||||
|
wakeUpUhk();
|
||||||
UsbCompositeDevice.currentConfiguration = *temp8;
|
UsbCompositeDevice.currentConfiguration = *temp8;
|
||||||
UsbGenericHidSetConfiguration(UsbCompositeDevice.genericHidHandle, *temp8);
|
UsbGenericHidSetConfiguration(UsbCompositeDevice.genericHidHandle, *temp8);
|
||||||
UsbBasicKeyboardSetConfiguration(UsbCompositeDevice.basicKeyboardHandle, *temp8);
|
UsbBasicKeyboardSetConfiguration(UsbCompositeDevice.basicKeyboardHandle, *temp8);
|
||||||
@@ -266,6 +269,10 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
|
|||||||
case kUSB_DeviceEventGetHidPhysicalDescriptor:
|
case kUSB_DeviceEventGetHidPhysicalDescriptor:
|
||||||
status = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param);
|
status = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param);
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceEventSetRemoteWakeup:
|
||||||
|
wakeUpHostAllowed = *temp8;
|
||||||
|
status = kStatus_USB_Success;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|||||||
@@ -28,12 +28,12 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsHostSleeping;
|
extern volatile bool SleepModeActive;
|
||||||
extern usb_composite_device_t UsbCompositeDevice;
|
extern usb_composite_device_t UsbCompositeDevice;
|
||||||
|
|
||||||
//Functions:
|
//Functions:
|
||||||
|
|
||||||
void InitUsb(void);
|
void InitUsb(void);
|
||||||
void WakeUpHost(bool sendResume);
|
void WakeUpHost(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ uint8_t UsbBasicKeyboardReportDescriptor[USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LE
|
|||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
|
||||||
// LED status
|
// LED status - Num lock, Caps lock, Scroll lock, Compose, Kana
|
||||||
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_LEDS),
|
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_LEDS),
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x01),
|
HID_RI_USAGE_MINIMUM(8, 0x01),
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x05),
|
HID_RI_USAGE_MAXIMUM(8, 0x05),
|
||||||
|
|||||||
@@ -12,7 +12,13 @@
|
|||||||
// Macros:
|
// Macros:
|
||||||
|
|
||||||
#define USB_COMPOSITE_CONFIGURATION_INDEX 1
|
#define USB_COMPOSITE_CONFIGURATION_INDEX 1
|
||||||
#define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH 141
|
#define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH \
|
||||||
|
(5 * USB_DESCRIPTOR_LENGTH_INTERFACE + 5 * USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
6 * USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_CONFIGURE)
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern uint8_t UsbConfigurationDescriptor[USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH];
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "usb_descriptor_generic_hid_report.h"
|
#include "usb_descriptor_generic_hid_report.h"
|
||||||
|
|
||||||
uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH] = {
|
uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH] = {
|
||||||
HID_RI_USAGE_PAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX),
|
HID_RI_USAGE_PAGE(16, (0xFF00 | USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX)),
|
||||||
HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION),
|
HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION),
|
||||||
HID_RI_COLLECTION(8, HID_RI_COLLECTION_APPLICATION),
|
HID_RI_COLLECTION(8, HID_RI_COLLECTION_APPLICATION),
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
// Macros:
|
// Macros:
|
||||||
|
|
||||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 33
|
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 34
|
||||||
|
|
||||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX 0x80
|
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX 0x00
|
||||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION 0x81
|
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION 0x01
|
||||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_IN 0x82
|
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_IN 0x02
|
||||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_OUT 0x83
|
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_OUT 0x03
|
||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
|
|||||||
@@ -2,33 +2,80 @@
|
|||||||
#include "usb_descriptor_hid.h"
|
#include "usb_descriptor_hid.h"
|
||||||
#include "usb_descriptor_mouse_report.h"
|
#include "usb_descriptor_mouse_report.h"
|
||||||
#include "usb_descriptor_generic_hid_report.h"
|
#include "usb_descriptor_generic_hid_report.h"
|
||||||
|
#include "usb_descriptor_configuration.h"
|
||||||
|
|
||||||
|
#define USB_GENERIC_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_DESCRIPTOR_LENGTH_CONFIGURE + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_GENERIC_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
2 * USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_MOUSE_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
usb_status_t USB_DeviceGetHidDescriptor(
|
usb_status_t USB_DeviceGetHidDescriptor(
|
||||||
usb_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor)
|
usb_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor)
|
||||||
{
|
{
|
||||||
return kStatus_USB_InvalidRequest;
|
hidDescriptor->length = USB_DESCRIPTOR_LENGTH_HID;
|
||||||
|
|
||||||
|
switch (hidDescriptor->interfaceNumber) {
|
||||||
|
case USB_GENERIC_HID_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_GENERIC_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_BASIC_KEYBOARD_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_MEDIA_KEYBOARD_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_MOUSE_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MOUSE_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return kStatus_USB_InvalidRequest;
|
||||||
|
}
|
||||||
|
return kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t USB_DeviceGetHidReportDescriptor(
|
usb_status_t USB_DeviceGetHidReportDescriptor(
|
||||||
usb_device_handle handle, usb_device_get_hid_report_descriptor_struct_t *hidReportDescriptor)
|
usb_device_handle handle, usb_device_get_hid_report_descriptor_struct_t *hidReportDescriptor)
|
||||||
{
|
{
|
||||||
if (USB_GENERIC_HID_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
switch (hidReportDescriptor->interfaceNumber) {
|
||||||
hidReportDescriptor->buffer = UsbGenericHidReportDescriptor;
|
case USB_GENERIC_HID_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->buffer = UsbGenericHidReportDescriptor;
|
||||||
} else if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH;
|
||||||
hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor;
|
break;
|
||||||
hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
case USB_BASIC_KEYBOARD_INTERFACE_INDEX:
|
||||||
} else if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor;
|
||||||
hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor;
|
hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
||||||
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
break;
|
||||||
} else if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
case USB_MEDIA_KEYBOARD_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor;
|
hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor;
|
||||||
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
||||||
} else if (USB_MOUSE_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
break;
|
||||||
hidReportDescriptor->buffer = UsbMouseReportDescriptor;
|
case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor;
|
||||||
} else {
|
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
||||||
return kStatus_USB_InvalidRequest;
|
break;
|
||||||
|
case USB_MOUSE_INTERFACE_INDEX:
|
||||||
|
hidReportDescriptor->buffer = UsbMouseReportDescriptor;
|
||||||
|
hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return kStatus_USB_InvalidRequest;
|
||||||
}
|
}
|
||||||
return kStatus_USB_Success;
|
return kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
#include "led_display.h"
|
#include "led_display.h"
|
||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
|
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
|
||||||
uint32_t UsbBasicKeyboardActionCounter;
|
uint32_t UsbBasicKeyboardActionCounter;
|
||||||
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
|
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
|
||||||
volatile bool IsUsbBasicKeyboardReportSent = false;
|
|
||||||
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
||||||
|
|
||||||
static usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
|
usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports;
|
return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbBasicKeyboardReport(void)
|
static void SwitchActiveUsbBasicKeyboardReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbBasicKeyboardReport = getInactiveUsbBasicKeyboardReport();
|
ActiveUsbBasicKeyboardReport = GetInactiveUsbBasicKeyboardReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbBasicKeyboardReport(void)
|
void ResetActiveUsbBasicKeyboardReport(void)
|
||||||
@@ -22,14 +22,20 @@ void ResetActiveUsbBasicKeyboardReport(void)
|
|||||||
bzero(ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
bzero(ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_status_t UsbBasicKeyboardAction(void)
|
usb_status_t UsbBasicKeyboardAction(void)
|
||||||
{
|
{
|
||||||
usb_status_t status = USB_DeviceHidSend(
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
|
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
|
||||||
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
(uint8_t *)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
||||||
IsUsbBasicKeyboardReportSent = true;
|
if (usb_status == kStatus_USB_Success) {
|
||||||
UsbBasicKeyboardActionCounter++;
|
UsbBasicKeyboardActionCounter++;
|
||||||
return status;
|
SwitchActiveUsbBasicKeyboardReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
@@ -37,11 +43,14 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return UsbBasicKeyboardAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
error = kStatus_USB_InvalidRequest;
|
error = kStatus_USB_InvalidRequest;
|
||||||
break;
|
break;
|
||||||
@@ -61,7 +70,7 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
report->reportBuffer = usbBasicKeyboardInBuffer;
|
report->reportBuffer = usbBasicKeyboardInBuffer;
|
||||||
error = kStatus_USB_Success;
|
error = kStatus_USB_Success;
|
||||||
} else {
|
} else {
|
||||||
error = kStatus_USB_InvalidRequest;
|
error = kStatus_USB_AllocFail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -79,16 +88,10 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
|
|
||||||
usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return UsbBasicKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == interface) {
|
|
||||||
return UsbBasicKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbBasicKeyboardReportSent;
|
|
||||||
extern uint32_t UsbBasicKeyboardActionCounter;
|
extern uint32_t UsbBasicKeyboardActionCounter;
|
||||||
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
|
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
|
||||||
|
|
||||||
@@ -42,6 +41,7 @@
|
|||||||
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbBasicKeyboardReport(void);
|
void ResetActiveUsbBasicKeyboardReport(void);
|
||||||
void SwitchActiveUsbBasicKeyboardReport(void);
|
usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void);
|
||||||
|
usb_status_t UsbBasicKeyboardAction(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
|
|||||||
|
|
||||||
static usb_status_t UsbReceiveData(void)
|
static usb_status_t UsbReceiveData(void)
|
||||||
{
|
{
|
||||||
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle,
|
return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle,
|
||||||
USB_GENERIC_HID_ENDPOINT_OUT_INDEX,
|
USB_GENERIC_HID_ENDPOINT_OUT_INDEX,
|
||||||
GenericHidInBuffer,
|
GenericHidInBuffer,
|
||||||
@@ -18,7 +22,11 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
if (UsbCompositeDevice.attach) {
|
||||||
|
error = kStatus_USB_Success;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case kUSB_DeviceHidEventRecvResponse:
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
UsbProtocolHandler();
|
UsbProtocolHandler();
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
uint32_t UsbMediaKeyboardActionCounter;
|
uint32_t UsbMediaKeyboardActionCounter;
|
||||||
static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
|
static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
|
||||||
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
|
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
|
||||||
volatile bool IsUsbMediaKeyboardReportSent = false;
|
|
||||||
|
|
||||||
static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
|
usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
|
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbMediaKeyboardReport(void)
|
static void SwitchActiveUsbMediaKeyboardReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbMediaKeyboardReport = getInactiveUsbMediaKeyboardReport();
|
ActiveUsbMediaKeyboardReport = GetInactiveUsbMediaKeyboardReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbMediaKeyboardReport(void)
|
void ResetActiveUsbMediaKeyboardReport(void)
|
||||||
@@ -20,14 +20,20 @@ void ResetActiveUsbMediaKeyboardReport(void)
|
|||||||
bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_status_t UsbMediaKeyboardAction(void)
|
usb_status_t UsbMediaKeyboardAction(void)
|
||||||
{
|
{
|
||||||
usb_status_t status = USB_DeviceHidSend(
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
|
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
|
||||||
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
(uint8_t *)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
||||||
IsUsbMediaKeyboardReportSent = true;
|
if (usb_status == kStatus_USB_Success) {
|
||||||
UsbMediaKeyboardActionCounter++;
|
UsbMediaKeyboardActionCounter++;
|
||||||
return status;
|
SwitchActiveUsbMediaKeyboardReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
@@ -35,11 +41,14 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return UsbMediaKeyboardAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
case kUSB_DeviceHidEventSetReport:
|
case kUSB_DeviceHidEventSetReport:
|
||||||
case kUSB_DeviceHidEventRequestReportBuffer:
|
case kUSB_DeviceHidEventRequestReportBuffer:
|
||||||
@@ -59,16 +68,10 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
|
|
||||||
usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return UsbMediaKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == interface) {
|
|
||||||
return UsbMediaKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbMediaKeyboardReportSent;
|
|
||||||
extern uint32_t UsbMediaKeyboardActionCounter;
|
extern uint32_t UsbMediaKeyboardActionCounter;
|
||||||
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
|
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
|
||||||
|
|
||||||
@@ -39,6 +38,7 @@
|
|||||||
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbMediaKeyboardReport(void);
|
void ResetActiveUsbMediaKeyboardReport(void);
|
||||||
void SwitchActiveUsbMediaKeyboardReport(void);
|
usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void);
|
||||||
|
usb_status_t UsbMediaKeyboardAction();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
uint32_t UsbMouseActionCounter;
|
uint32_t UsbMouseActionCounter;
|
||||||
static usb_mouse_report_t usbMouseReports[2];
|
static usb_mouse_report_t usbMouseReports[2];
|
||||||
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
|
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
|
||||||
volatile bool IsUsbMouseReportSent = false;
|
|
||||||
|
|
||||||
static usb_mouse_report_t* getInactiveUsbMouseReport(void)
|
usb_mouse_report_t* GetInactiveUsbMouseReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
|
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbMouseReport(void)
|
static void SwitchActiveUsbMouseReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbMouseReport = getInactiveUsbMouseReport();
|
ActiveUsbMouseReport = GetInactiveUsbMouseReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbMouseReport(void)
|
void ResetActiveUsbMouseReport(void)
|
||||||
@@ -20,25 +20,35 @@ void ResetActiveUsbMouseReport(void)
|
|||||||
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
|
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile usb_status_t usbMouseAction(void)
|
usb_status_t UsbMouseAction(void)
|
||||||
{
|
{
|
||||||
usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport();
|
if (!UsbCompositeDevice.attach) {
|
||||||
IsUsbMouseReportSent = true;
|
return kStatus_USB_Error; // The device is not attached
|
||||||
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
|
}
|
||||||
(uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH);
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
|
UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
|
||||||
|
(uint8_t *)ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
|
||||||
|
if (usb_status == kStatus_USB_Success) {
|
||||||
|
UsbMouseActionCounter++;
|
||||||
|
SwitchActiveUsbMouseReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
{
|
{
|
||||||
UsbMouseActionCounter++;
|
|
||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_MOUSE_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return usbMouseAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
case kUSB_DeviceHidEventSetReport:
|
case kUSB_DeviceHidEventSetReport:
|
||||||
case kUSB_DeviceHidEventRequestReportBuffer:
|
case kUSB_DeviceHidEventRequestReportBuffer:
|
||||||
@@ -58,16 +68,10 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param
|
|||||||
|
|
||||||
usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return usbMouseAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_MOUSE_INTERFACE_INDEX == interface) {
|
|
||||||
return usbMouseAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbMouseReportSent;
|
|
||||||
extern uint32_t UsbMouseActionCounter;
|
extern uint32_t UsbMouseActionCounter;
|
||||||
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
||||||
|
|
||||||
@@ -42,6 +41,7 @@
|
|||||||
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbMouseReport(void);
|
void ResetActiveUsbMouseReport(void);
|
||||||
void SwitchActiveUsbMouseReport(void);
|
usb_mouse_report_t* GetInactiveUsbMouseReport(void);
|
||||||
|
usb_status_t UsbMouseAction(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
uint32_t UsbSystemKeyboardActionCounter;
|
uint32_t UsbSystemKeyboardActionCounter;
|
||||||
static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
|
static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
|
||||||
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
|
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
|
||||||
volatile bool IsUsbSystemKeyboardReportSent = false;
|
|
||||||
|
|
||||||
static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
|
usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport()
|
||||||
{
|
{
|
||||||
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
|
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbSystemKeyboardReport(void)
|
static void SwitchActiveUsbSystemKeyboardReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbSystemKeyboardReport = getInactiveUsbSystemKeyboardReport();
|
ActiveUsbSystemKeyboardReport = GetInactiveUsbSystemKeyboardReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbSystemKeyboardReport(void)
|
void ResetActiveUsbSystemKeyboardReport(void)
|
||||||
@@ -20,14 +20,20 @@ void ResetActiveUsbSystemKeyboardReport(void)
|
|||||||
bzero(ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
bzero(ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_status_t UsbSystemKeyboardAction(void)
|
usb_status_t UsbSystemKeyboardAction(void)
|
||||||
{
|
{
|
||||||
usb_status_t status = USB_DeviceHidSend(
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
|
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
|
||||||
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
(uint8_t *)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
||||||
IsUsbSystemKeyboardReportSent = true;
|
if (usb_status == kStatus_USB_Success) {
|
||||||
UsbSystemKeyboardActionCounter++;
|
UsbSystemKeyboardActionCounter++;
|
||||||
return status;
|
SwitchActiveUsbSystemKeyboardReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
@@ -35,11 +41,14 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return UsbSystemKeyboardAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
case kUSB_DeviceHidEventSetReport:
|
case kUSB_DeviceHidEventSetReport:
|
||||||
case kUSB_DeviceHidEventRequestReportBuffer:
|
case kUSB_DeviceHidEventRequestReportBuffer:
|
||||||
@@ -59,16 +68,10 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo
|
|||||||
|
|
||||||
usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return UsbSystemKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == interface) {
|
|
||||||
return UsbSystemKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbSystemKeyboardReportSent;
|
|
||||||
extern uint32_t UsbSystemKeyboardActionCounter;
|
extern uint32_t UsbSystemKeyboardActionCounter;
|
||||||
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
|
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
|
||||||
|
|
||||||
@@ -40,6 +39,7 @@
|
|||||||
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbSystemKeyboardReport(void);
|
void ResetActiveUsbSystemKeyboardReport(void);
|
||||||
void SwitchActiveUsbSystemKeyboardReport(void);
|
usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport();
|
||||||
|
usb_status_t UsbSystemKeyboardAction(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
|
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
|
||||||
#include "usb_commands/usb_command_set_i2c_baud_rate.h"
|
#include "usb_commands/usb_command_set_i2c_baud_rate.h"
|
||||||
#include "usb_commands/usb_command_switch_keymap.h"
|
#include "usb_commands/usb_command_switch_keymap.h"
|
||||||
|
#include "usb_commands/usb_command_get_variable.h"
|
||||||
|
#include "usb_commands/usb_command_set_variable.h"
|
||||||
|
|
||||||
void UsbProtocolHandler(void)
|
void UsbProtocolHandler(void)
|
||||||
{
|
{
|
||||||
@@ -77,6 +79,12 @@ void UsbProtocolHandler(void)
|
|||||||
case UsbCommandId_SwitchKeymap:
|
case UsbCommandId_SwitchKeymap:
|
||||||
UsbCommand_SwitchKeymap();
|
UsbCommand_SwitchKeymap();
|
||||||
break;
|
break;
|
||||||
|
case UsbCommandId_GetVariable:
|
||||||
|
UsbCommand_GetVariable();
|
||||||
|
break;
|
||||||
|
case UsbCommandId_SetVariable:
|
||||||
|
UsbCommand_SetVariable();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -34,8 +34,18 @@
|
|||||||
UsbCommandId_GetSlaveI2cErrors = 0x0f,
|
UsbCommandId_GetSlaveI2cErrors = 0x0f,
|
||||||
UsbCommandId_SetI2cBaudRate = 0x10,
|
UsbCommandId_SetI2cBaudRate = 0x10,
|
||||||
UsbCommandId_SwitchKeymap = 0x11,
|
UsbCommandId_SwitchKeymap = 0x11,
|
||||||
|
UsbCommandId_GetVariable = 0x12,
|
||||||
|
UsbCommandId_SetVariable = 0x13,
|
||||||
} usb_command_id_t;
|
} usb_command_id_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
UsbVariable_TestSwitches,
|
||||||
|
UsbVariable_TestUsbStack,
|
||||||
|
UsbVariable_DebounceTimePress,
|
||||||
|
UsbVariable_DebounceTimeRelease,
|
||||||
|
UsbVariable_UsbReportSemaphore,
|
||||||
|
} usb_variable_id_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UsbStatusCode_Success = 0,
|
UsbStatusCode_Success = 0,
|
||||||
UsbStatusCode_InvalidCommand = 1,
|
UsbStatusCode_InvalidCommand = 1,
|
||||||
|
|||||||
@@ -13,17 +13,21 @@
|
|||||||
#include "layer.h"
|
#include "layer.h"
|
||||||
#include "usb_report_updater.h"
|
#include "usb_report_updater.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_debouncer.h"
|
|
||||||
#include "config_parser/parse_keymap.h"
|
#include "config_parser/parse_keymap.h"
|
||||||
#include "usb_commands/usb_command_get_debug_buffer.h"
|
#include "usb_commands/usb_command_get_debug_buffer.h"
|
||||||
|
#include "arduino_hid/ConsumerAPI.h"
|
||||||
|
|
||||||
static uint32_t mouseUsbReportUpdateTime = 0;
|
static uint32_t mouseUsbReportUpdateTime = 0;
|
||||||
static uint32_t mouseElapsedTime;
|
static uint32_t mouseElapsedTime;
|
||||||
|
|
||||||
uint16_t DoubleTapSwitchLayerTimeout = 150;
|
uint16_t DoubleTapSwitchLayerTimeout = 300;
|
||||||
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
|
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 200;
|
||||||
|
|
||||||
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
||||||
|
bool TestUsbStack = false;
|
||||||
|
static key_action_t actionCache[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
|
||||||
|
|
||||||
|
volatile uint8_t UsbReportUpdateSemaphore = 0;
|
||||||
|
|
||||||
mouse_kinetic_state_t MouseMoveState = {
|
mouse_kinetic_state_t MouseMoveState = {
|
||||||
.isScroll = false,
|
.isScroll = false,
|
||||||
@@ -123,7 +127,7 @@ static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
|||||||
kineticState->xOut = xSumInt;
|
kineticState->xOut = xSumInt;
|
||||||
|
|
||||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0 && horizontalMovement) {
|
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0 && horizontalMovement) {
|
||||||
kineticState->xOut = kineticState->xSum > 0 ? 1 : -1;
|
kineticState->xOut = kineticState->xSum ? copysignf(1.0, kineticState->xSum) : 0;
|
||||||
kineticState->xSum = 0;
|
kineticState->xSum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +148,7 @@ static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
|||||||
kineticState->yOut = ySumInt;
|
kineticState->yOut = ySumInt;
|
||||||
|
|
||||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0 && verticalMovement) {
|
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0 && verticalMovement) {
|
||||||
kineticState->yOut = kineticState->ySum > 0 ? 1 : -1;
|
kineticState->yOut = kineticState->ySum ? copysignf(1.0, kineticState->ySum) : 0;
|
||||||
kineticState->ySum = 0;
|
kineticState->ySum = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -191,28 +195,71 @@ static void processMouseActions()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static layer_id_t previousLayer = LayerId_Base;
|
static layer_id_t previousLayer = LayerId_Base;
|
||||||
static uint8_t basicScancodeIndex = 0;
|
|
||||||
static uint8_t mediaScancodeIndex = 0;
|
|
||||||
static uint8_t systemScancodeIndex = 0;
|
|
||||||
|
|
||||||
static void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
static void handleSwitchLayerAction(key_state_t *keyState, key_action_t *action)
|
||||||
{
|
{
|
||||||
static key_state_t *doubleTapSwitchLayerKey;
|
static key_state_t *doubleTapSwitchLayerKey;
|
||||||
static uint32_t doubleTapSwitchLayerStartTime;
|
static uint32_t doubleTapSwitchLayerStartTime;
|
||||||
static uint32_t doubleTapSwitchLayerTriggerTime;
|
static uint32_t doubleTapSwitchLayerTriggerTime;
|
||||||
|
static bool isLayerDoubleTapToggled;
|
||||||
if (keyState->suppressed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doubleTapSwitchLayerKey && doubleTapSwitchLayerKey != keyState && !keyState->previous) {
|
if (doubleTapSwitchLayerKey && doubleTapSwitchLayerKey != keyState && !keyState->previous) {
|
||||||
doubleTapSwitchLayerKey = NULL;
|
doubleTapSwitchLayerKey = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (action->type != KeyActionType_SwitchLayer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!keyState->previous && isLayerDoubleTapToggled && ToggledLayer == action->switchLayer.layer) {
|
||||||
|
ToggledLayer = LayerId_Base;
|
||||||
|
isLayerDoubleTapToggled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keyState->previous && doubleTapSwitchLayerKey == keyState &&
|
||||||
|
Timer_GetElapsedTime(&doubleTapSwitchLayerTriggerTime) > DoubleTapSwitchLayerReleaseTimeout)
|
||||||
|
{
|
||||||
|
ToggledLayer = LayerId_Base;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
|
||||||
|
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
||||||
|
ToggledLayer = action->switchLayer.layer;
|
||||||
|
isLayerDoubleTapToggled = true;
|
||||||
|
doubleTapSwitchLayerTriggerTime = CurrentTime;
|
||||||
|
} else {
|
||||||
|
doubleTapSwitchLayerKey = keyState;
|
||||||
|
}
|
||||||
|
doubleTapSwitchLayerStartTime = CurrentTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t basicScancodeIndex = 0;
|
||||||
|
static uint8_t mediaScancodeIndex = 0;
|
||||||
|
static uint8_t systemScancodeIndex = 0;
|
||||||
|
static uint8_t stickyModifiers;
|
||||||
|
static uint8_t secondaryRoleState = SecondaryRoleState_Released;
|
||||||
|
static uint8_t secondaryRoleSlotId;
|
||||||
|
static uint8_t secondaryRoleKeyId;
|
||||||
|
static secondary_role_t secondaryRole;
|
||||||
|
|
||||||
|
static void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
||||||
|
{
|
||||||
|
if (keyState->suppressed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleSwitchLayerAction(keyState, action);
|
||||||
|
|
||||||
switch (action->type) {
|
switch (action->type) {
|
||||||
case KeyActionType_Keystroke:
|
case KeyActionType_Keystroke:
|
||||||
ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers;
|
if (action->keystroke.scancode) {
|
||||||
|
if (!keyState->previous) {
|
||||||
|
stickyModifiers = action->keystroke.modifiers;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers;
|
||||||
|
}
|
||||||
switch (action->keystroke.keystrokeType) {
|
switch (action->keystroke.keystrokeType) {
|
||||||
case KeystrokeType_Basic:
|
case KeystrokeType_Basic:
|
||||||
if (basicScancodeIndex >= USB_BASIC_KEYBOARD_MAX_KEYS || action->keystroke.scancode == 0) {
|
if (basicScancodeIndex >= USB_BASIC_KEYBOARD_MAX_KEYS || action->keystroke.scancode == 0) {
|
||||||
@@ -235,52 +282,47 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KeyActionType_Mouse:
|
case KeyActionType_Mouse:
|
||||||
|
if (!keyState->previous) {
|
||||||
|
stickyModifiers = 0;
|
||||||
|
}
|
||||||
activeMouseStates[action->mouseAction] = true;
|
activeMouseStates[action->mouseAction] = true;
|
||||||
break;
|
break;
|
||||||
case KeyActionType_SwitchLayer:
|
case KeyActionType_SwitchLayer:
|
||||||
if (keyState->previous && doubleTapSwitchLayerKey == keyState &&
|
// Handled by handleSwitchLayerAction()
|
||||||
Timer_GetElapsedTime(&doubleTapSwitchLayerTriggerTime) > DoubleTapSwitchLayerReleaseTimeout)
|
|
||||||
{
|
|
||||||
ToggledLayer = LayerId_Base;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
|
|
||||||
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
|
||||||
ToggledLayer = action->switchLayer.layer;
|
|
||||||
doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime();
|
|
||||||
} else {
|
|
||||||
doubleTapSwitchLayerKey = keyState;
|
|
||||||
}
|
|
||||||
doubleTapSwitchLayerStartTime = Timer_GetCurrentTime();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case KeyActionType_SwitchKeymap:
|
case KeyActionType_SwitchKeymap:
|
||||||
if (!keyState->previous) {
|
if (!keyState->previous) {
|
||||||
|
stickyModifiers = 0;
|
||||||
|
secondaryRoleState = SecondaryRoleState_Released;
|
||||||
SwitchKeymapById(action->switchKeymap.keymapId);
|
SwitchKeymapById(action->switchKeymap.keymapId);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case KeyActionType_PlayMacro:
|
||||||
|
if (!keyState->previous) {
|
||||||
|
stickyModifiers = 0;
|
||||||
|
Macros_StartMacro(action->playMacro.macroId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t secondaryRoleState = SecondaryRoleState_Released;
|
|
||||||
static uint8_t secondaryRoleSlotId;
|
|
||||||
static uint8_t secondaryRoleKeyId;
|
|
||||||
static secondary_role_t secondaryRole;
|
|
||||||
|
|
||||||
static void updateActiveUsbReports(void)
|
static void updateActiveUsbReports(void)
|
||||||
{
|
{
|
||||||
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
|
if (MacroPlaying) {
|
||||||
|
Macros_ContinueMacro();
|
||||||
|
memcpy(ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
|
||||||
|
memcpy(ActiveUsbBasicKeyboardReport, &MacroBasicKeyboardReport, sizeof MacroBasicKeyboardReport);
|
||||||
|
memcpy(ActiveUsbMediaKeyboardReport, &MacroMediaKeyboardReport, sizeof MacroMediaKeyboardReport);
|
||||||
|
memcpy(ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static uint8_t previousModifiers = 0;
|
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
|
||||||
|
|
||||||
basicScancodeIndex = 0;
|
basicScancodeIndex = 0;
|
||||||
mediaScancodeIndex = 0;
|
mediaScancodeIndex = 0;
|
||||||
systemScancodeIndex = 0;
|
systemScancodeIndex = 0;
|
||||||
|
|
||||||
for (uint8_t keyId=0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) {
|
|
||||||
KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId];
|
|
||||||
}
|
|
||||||
|
|
||||||
layer_id_t activeLayer = LayerId_Base;
|
layer_id_t activeLayer = LayerId_Base;
|
||||||
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole)) {
|
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole)) {
|
||||||
activeLayer = SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRole);
|
activeLayer = SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRole);
|
||||||
@@ -288,38 +330,66 @@ static void updateActiveUsbReports(void)
|
|||||||
if (activeLayer == LayerId_Base) {
|
if (activeLayer == LayerId_Base) {
|
||||||
activeLayer = GetActiveLayer();
|
activeLayer = GetActiveLayer();
|
||||||
}
|
}
|
||||||
bool layerGotReleased = previousLayer != LayerId_Base && activeLayer == LayerId_Base;
|
bool layerChanged = previousLayer != activeLayer;
|
||||||
|
if (layerChanged) {
|
||||||
|
stickyModifiers = 0;
|
||||||
|
}
|
||||||
LedDisplay_SetLayer(activeLayer);
|
LedDisplay_SetLayer(activeLayer);
|
||||||
|
|
||||||
if (MacroPlaying) {
|
if (TestUsbStack) {
|
||||||
Macros_ContinueMacro();
|
static bool simulateKeypresses, isEven, isEvenMedia;
|
||||||
memcpy(&ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
|
static uint32_t mediaCounter = 0;
|
||||||
memcpy(&ActiveUsbBasicKeyboardReport, &MacroBasicKeyboardReport, sizeof MacroBasicKeyboardReport);
|
key_state_t *testKeyState = &KeyStates[SlotId_LeftKeyboardHalf][0];
|
||||||
memcpy(&ActiveUsbMediaKeyboardReport, &MacroMediaKeyboardReport, sizeof MacroMediaKeyboardReport);
|
|
||||||
memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
|
if (activeLayer == LayerId_Fn && testKeyState->current && !testKeyState->previous) {
|
||||||
return;
|
simulateKeypresses = !simulateKeypresses;
|
||||||
|
}
|
||||||
|
if (simulateKeypresses) {
|
||||||
|
isEven = !isEven;
|
||||||
|
ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = isEven ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_BACKSPACE;
|
||||||
|
if (++mediaCounter % 200 == 0) {
|
||||||
|
isEvenMedia = !isEvenMedia;
|
||||||
|
ActiveUsbMediaKeyboardReport->scancodes[mediaScancodeIndex++] = isEvenMedia ? MEDIA_VOLUME_DOWN : MEDIA_VOLUME_UP;
|
||||||
|
}
|
||||||
|
MouseMoveState.xOut = isEven ? -5 : 5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
||||||
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
||||||
key_state_t *keyState = &KeyStates[slotId][keyId];
|
key_state_t *keyState = &KeyStates[slotId][keyId];
|
||||||
key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId];
|
key_action_t *action;
|
||||||
|
|
||||||
if (keyState->debounceCounter < KEY_DEBOUNCER_TIMEOUT_MSEC) {
|
if (keyState->debouncing) {
|
||||||
keyState->current = keyState->previous;
|
if ((uint8_t)(CurrentTime - keyState->timestamp) > (keyState->previous ? DebounceTimePress : DebounceTimeRelease)) {
|
||||||
} else if (!keyState->previous && keyState->current) {
|
keyState->debouncing = false;
|
||||||
keyState->debounceCounter = 0;
|
} else {
|
||||||
|
keyState->current = keyState->previous;
|
||||||
|
}
|
||||||
|
} else if (keyState->previous != keyState->current) {
|
||||||
|
keyState->timestamp = CurrentTime;
|
||||||
|
keyState->debouncing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keyState->current) {
|
if (keyState->current && !keyState->previous) {
|
||||||
key_action_t *baseAction = &CurrentKeymap[LayerId_Base][slotId][keyId];
|
if (SleepModeActive) {
|
||||||
if (layerGotReleased && !(baseAction->type == KeyActionType_Keystroke && baseAction->keystroke.scancode == 0 && baseAction->keystroke.modifiers)) {
|
WakeUpHost();
|
||||||
keyState->suppressed = true;
|
|
||||||
}
|
}
|
||||||
|
if (secondaryRoleState == SecondaryRoleState_Pressed) {
|
||||||
|
// Trigger secondary role.
|
||||||
|
secondaryRoleState = SecondaryRoleState_Triggered;
|
||||||
|
keyState->current = false;
|
||||||
|
} else {
|
||||||
|
actionCache[slotId][keyId] = CurrentKeymap[activeLayer][slotId][keyId];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
action = &actionCache[slotId][keyId];
|
||||||
|
|
||||||
|
if (keyState->current) {
|
||||||
if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) {
|
if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) {
|
||||||
// Press released secondary role key.
|
// Press released secondary role key.
|
||||||
if (!keyState->previous && action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole && secondaryRoleState == SecondaryRoleState_Released) {
|
if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Released) {
|
||||||
secondaryRoleState = SecondaryRoleState_Pressed;
|
secondaryRoleState = SecondaryRoleState_Pressed;
|
||||||
secondaryRoleSlotId = slotId;
|
secondaryRoleSlotId = slotId;
|
||||||
secondaryRoleKeyId = keyId;
|
secondaryRoleKeyId = keyId;
|
||||||
@@ -327,22 +397,16 @@ static void updateActiveUsbReports(void)
|
|||||||
keyState->suppressed = true;
|
keyState->suppressed = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Trigger secondary role.
|
applyKeyAction(keyState, action);
|
||||||
if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Pressed) {
|
|
||||||
secondaryRoleState = SecondaryRoleState_Triggered;
|
|
||||||
} else {
|
|
||||||
applyKeyAction(keyState, action);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (keyState->suppressed) {
|
keyState->suppressed = false;
|
||||||
keyState->suppressed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release secondary role key.
|
// Release secondary role key.
|
||||||
if (keyState->previous && secondaryRoleSlotId == slotId && secondaryRoleKeyId == keyId) {
|
if (keyState->previous && secondaryRoleSlotId == slotId && secondaryRoleKeyId == keyId) {
|
||||||
// Trigger primary role.
|
// Trigger primary role.
|
||||||
if (secondaryRoleState == SecondaryRoleState_Pressed) {
|
if (secondaryRoleState == SecondaryRoleState_Pressed) {
|
||||||
|
keyState->previous = false;
|
||||||
applyKeyAction(keyState, action);
|
applyKeyAction(keyState, action);
|
||||||
}
|
}
|
||||||
secondaryRoleState = SecondaryRoleState_Released;
|
secondaryRoleState = SecondaryRoleState_Released;
|
||||||
@@ -358,41 +422,36 @@ static void updateActiveUsbReports(void)
|
|||||||
// When a layer switcher key gets pressed along with another key that produces some modifiers
|
// When a layer switcher key gets pressed along with another key that produces some modifiers
|
||||||
// and the accomanying key gets released then keep the related modifiers active a long as the
|
// and the accomanying key gets released then keep the related modifiers active a long as the
|
||||||
// layer switcher key stays pressed. Useful for Alt+Tab keymappings and the like.
|
// layer switcher key stays pressed. Useful for Alt+Tab keymappings and the like.
|
||||||
if (activeLayer != LayerId_Base && activeLayer == PreviousHeldLayer && basicScancodeIndex == 0) {
|
ActiveUsbBasicKeyboardReport->modifiers |= stickyModifiers;
|
||||||
ActiveUsbBasicKeyboardReport->modifiers |= previousModifiers;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_MODIFIER(secondaryRole)) {
|
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_MODIFIER(secondaryRole)) {
|
||||||
ActiveUsbBasicKeyboardReport->modifiers |= SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRole);
|
ActiveUsbBasicKeyboardReport->modifiers |= SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRole);
|
||||||
}
|
}
|
||||||
|
|
||||||
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
|
|
||||||
previousLayer = activeLayer;
|
previousLayer = activeLayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t UsbReportUpdateCounter;
|
uint32_t UsbReportUpdateCounter;
|
||||||
static uint32_t lastMouseUpdateTime;
|
|
||||||
|
|
||||||
void UpdateUsbReports(void)
|
void UpdateUsbReports(void)
|
||||||
{
|
{
|
||||||
UsbReportUpdateCounter++;
|
static uint32_t lastUpdateTime;
|
||||||
|
|
||||||
// Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent.
|
for (uint8_t keyId = 0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) {
|
||||||
bool hasActiveMouseState = false;
|
KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId];
|
||||||
for (uint8_t i=0; i<ACTIVE_MOUSE_STATES_COUNT; i++) {
|
|
||||||
hasActiveMouseState = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasActiveMouseState) {
|
if (UsbReportUpdateSemaphore && !SleepModeActive) {
|
||||||
if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_MOUSE_INTERRUPT_IN_INTERVAL) {
|
if (Timer_GetElapsedTime(&lastUpdateTime) < USB_SEMAPHORE_TIMEOUT) {
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
UsbReportUpdateSemaphore = 0;
|
||||||
}
|
}
|
||||||
Timer_SetCurrentTime(&lastMouseUpdateTime);
|
|
||||||
} else if (!IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lastUpdateTime = CurrentTime;
|
||||||
|
UsbReportUpdateCounter++;
|
||||||
|
|
||||||
ResetActiveUsbBasicKeyboardReport();
|
ResetActiveUsbBasicKeyboardReport();
|
||||||
ResetActiveUsbMediaKeyboardReport();
|
ResetActiveUsbMediaKeyboardReport();
|
||||||
ResetActiveUsbSystemKeyboardReport();
|
ResetActiveUsbSystemKeyboardReport();
|
||||||
@@ -400,35 +459,38 @@ void UpdateUsbReports(void)
|
|||||||
|
|
||||||
updateActiveUsbReports();
|
updateActiveUsbReports();
|
||||||
|
|
||||||
static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF };
|
bool HasUsbBasicKeyboardReportChanged = memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0;
|
||||||
if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) {
|
bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0;
|
||||||
last_basic_report = *ActiveUsbBasicKeyboardReport;
|
bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0;
|
||||||
SwitchActiveUsbBasicKeyboardReport();
|
bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0;
|
||||||
IsUsbBasicKeyboardReportSent = false;
|
|
||||||
|
if (HasUsbBasicKeyboardReportChanged) {
|
||||||
|
usb_status_t status = UsbBasicKeyboardAction();
|
||||||
|
if (status == kStatus_USB_Success) {
|
||||||
|
UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF };
|
if (HasUsbMediaKeyboardReportChanged) {
|
||||||
if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) {
|
usb_status_t status = UsbMediaKeyboardAction();
|
||||||
last_media_report = *ActiveUsbMediaKeyboardReport;
|
if (status == kStatus_USB_Success) {
|
||||||
SwitchActiveUsbMediaKeyboardReport();
|
UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX;
|
||||||
IsUsbMediaKeyboardReportSent = false;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF };
|
if (HasUsbSystemKeyboardReportChanged) {
|
||||||
if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) {
|
usb_status_t status = UsbSystemKeyboardAction();
|
||||||
last_system_report = *ActiveUsbSystemKeyboardReport;
|
if (status == kStatus_USB_Success) {
|
||||||
SwitchActiveUsbSystemKeyboardReport();
|
UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX;
|
||||||
IsUsbSystemKeyboardReportSent = false;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF };
|
// Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change.
|
||||||
if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) {
|
if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y ||
|
||||||
last_mouse_report = *ActiveUsbMouseReport;
|
ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) {
|
||||||
SwitchActiveUsbMouseReport();
|
usb_status_t status = UsbMouseAction();
|
||||||
IsUsbMouseReportSent = false;
|
if (status == kStatus_USB_Success) {
|
||||||
}
|
UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX;
|
||||||
|
}
|
||||||
if ((previousLayer != LayerId_Base || !IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) && IsHostSleeping) {
|
|
||||||
WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
#define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1))
|
#define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1))
|
||||||
#define SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRoleLayer) ((secondaryRoleLayer) - SecondaryRole_RightSuper)
|
#define SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRoleLayer) ((secondaryRoleLayer) - SecondaryRole_RightSuper)
|
||||||
|
|
||||||
|
#define USB_SEMAPHORE_TIMEOUT 100 // ms
|
||||||
|
|
||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -70,6 +72,8 @@
|
|||||||
extern mouse_kinetic_state_t MouseMoveState;
|
extern mouse_kinetic_state_t MouseMoveState;
|
||||||
extern mouse_kinetic_state_t MouseScrollState;
|
extern mouse_kinetic_state_t MouseScrollState;
|
||||||
extern uint32_t UsbReportUpdateCounter;
|
extern uint32_t UsbReportUpdateCounter;
|
||||||
|
extern volatile uint8_t UsbReportUpdateSemaphore;
|
||||||
|
extern bool TestUsbStack;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
229
scripts/Makedefs.mk
Normal file
229
scripts/Makedefs.mk
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
# Copyright (C) 2018 Kristian Lauszus. All rights reserved.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Contact information
|
||||||
|
# -------------------
|
||||||
|
# Kristian Lauszus
|
||||||
|
# Web : http://www.lauszus.com
|
||||||
|
# e-mail : lauszus@gmail.com
|
||||||
|
|
||||||
|
# Debug using Semihosting.
|
||||||
|
SEMIHOSTING ?= 0
|
||||||
|
|
||||||
|
# Build directory.
|
||||||
|
BUILD_DIR ?= build_make
|
||||||
|
|
||||||
|
# Set default value (no bootloader) for the bootloader vector table address.
|
||||||
|
BL_APP_VECTOR_TABLE_ADDRESS ?= 0
|
||||||
|
|
||||||
|
# Preprocessor directives.
|
||||||
|
BUILD_FLAGS += -D__NEWLIB__ -D__USE_CMSIS -D__MCUXPRESSO -DCPU_$(PART) -D__STARTUP_CLEAR_BSS -DBL_APP_VECTOR_TABLE_ADDRESS=$(BL_APP_VECTOR_TABLE_ADDRESS)
|
||||||
|
|
||||||
|
# Path to project object file.
|
||||||
|
PROJECT_OBJ = $(BUILD_DIR)/$(PROJECT_NAME).axf
|
||||||
|
|
||||||
|
# Set the prefix for the tools to use.
|
||||||
|
PREFIX ?= arm-none-eabi
|
||||||
|
|
||||||
|
# Set WIN=1 manually for Windows Subsystem for Linux.
|
||||||
|
WIN ?= 0
|
||||||
|
|
||||||
|
# Determine if we are on a Windows machine and set the .exe suffix.
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
ifeq ($(OS),Windows_NT) # Native Windows.
|
||||||
|
WIN = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Set J-Link executable.
|
||||||
|
ifeq ($(WIN),1)
|
||||||
|
JLINK := JLink.exe
|
||||||
|
else
|
||||||
|
JLINK := JLinkExe
|
||||||
|
endif
|
||||||
|
|
||||||
|
# We can not use the suffix command, as the PREFIX might contain spaces.
|
||||||
|
ifeq ($(WIN),1)
|
||||||
|
SUFFIX := .exe
|
||||||
|
endif
|
||||||
|
|
||||||
|
# The command for calling the compilers.
|
||||||
|
CC = $(PREFIX)-gcc$(SUFFIX)
|
||||||
|
CXX = $(PREFIX)-g++$(SUFFIX)
|
||||||
|
|
||||||
|
# The command for calling the linker.
|
||||||
|
LD = $(PREFIX)-g++$(SUFFIX)
|
||||||
|
|
||||||
|
# The command for extracting images from the linked executables.
|
||||||
|
OBJCOPY = $(PREFIX)-objcopy$(SUFFIX)
|
||||||
|
|
||||||
|
# The command for the size tool.
|
||||||
|
SIZE = $(PREFIX)-size$(SUFFIX)
|
||||||
|
|
||||||
|
# Auto-dependency generation flags.
|
||||||
|
DEPS = -MMD -MP
|
||||||
|
|
||||||
|
# The flags passed to the assembler.
|
||||||
|
AFLAGS = -mthumb \
|
||||||
|
$(CPU) \
|
||||||
|
$(FPU) \
|
||||||
|
$(DEPS) \
|
||||||
|
$(BUILD_FLAGS) \
|
||||||
|
-x assembler-with-cpp
|
||||||
|
|
||||||
|
# The flags passed to the compiler.
|
||||||
|
CFLAGS = -mthumb \
|
||||||
|
$(CPU) \
|
||||||
|
$(FPU) \
|
||||||
|
$(DEPS) \
|
||||||
|
-fno-builtin \
|
||||||
|
-ffunction-sections \
|
||||||
|
-fdata-sections \
|
||||||
|
-fno-common \
|
||||||
|
-Wdouble-promotion \
|
||||||
|
-Woverflow \
|
||||||
|
-Wall \
|
||||||
|
-Wshadow \
|
||||||
|
$(BUILD_FLAGS)
|
||||||
|
|
||||||
|
# Compiler options for C++ only.
|
||||||
|
CXXFLAGS = -felide-constructors -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
# Set the C/C++ standard to use.
|
||||||
|
CSTD = -std=gnu11
|
||||||
|
CXXSTD = -std=gnu++14
|
||||||
|
|
||||||
|
# Make all warnings into errors when building using Travis CI.
|
||||||
|
ifdef TRAVIS
|
||||||
|
CFLAGS += -Werror
|
||||||
|
endif
|
||||||
|
|
||||||
|
# The flags passed to the linker.
|
||||||
|
LDFLAGS = --specs=nano.specs -mthumb $(CPU) $(FPU) -T $(LDSCRIPT) -Wl,-Map=$(PROJECT_OBJ:.axf=.map),--gc-sections,-print-memory-usage,-no-wchar-size-warning,--defsym=__heap_size__=$(HEAP_SIZE),--defsym=__stack_size__=$(STACK_SIZE),--defsym=__bl_app_vector_table_address__=$(BL_APP_VECTOR_TABLE_ADDRESS)
|
||||||
|
|
||||||
|
# Include the following archives.
|
||||||
|
LDARCHIVES = -Wl,--start-group -lg -lgcc -lm -Wl,--end-group
|
||||||
|
|
||||||
|
# Add flags to the build flags and linker depending on the build settings.
|
||||||
|
ifeq ($(SEMIHOSTING),1)
|
||||||
|
# Include Semihost library.
|
||||||
|
LDARCHIVES += -lcr_newlib_semihost
|
||||||
|
|
||||||
|
# Enable printf floating numbers.
|
||||||
|
LDFLAGS += -u _printf_float
|
||||||
|
else
|
||||||
|
# Include libnosys.a if Semihosting is disabled.
|
||||||
|
LDARCHIVES += -lnosys
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Check if the DEBUG environment variable is set.
|
||||||
|
DEBUG ?= 0
|
||||||
|
ifeq ($(DEBUG),1)
|
||||||
|
CFLAGS += -O3 -g3 -DDEBUG
|
||||||
|
else
|
||||||
|
CFLAGS += -O3 -DNDEBUG
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Add the include file paths to AFLAGS and CFLAGS.
|
||||||
|
AFLAGS += $(patsubst %,-I%,$(subst :, ,$(IPATH)))
|
||||||
|
CFLAGS += $(patsubst %,-I%,$(subst :, ,$(IPATH)))
|
||||||
|
|
||||||
|
# Create lists of C, C++ and assembly objects.
|
||||||
|
C_OBJS := $(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(basename $(filter %.c,$(abspath $(SOURCE))))))
|
||||||
|
CPP_OBJS := $(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(basename $(filter %.cpp,$(abspath $(SOURCE))))))
|
||||||
|
S_OBJS := $(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(basename $(filter %.S,$(abspath $(SOURCE))))))
|
||||||
|
|
||||||
|
# Create a list of all objects.
|
||||||
|
OBJS := $(C_OBJS) $(CPP_OBJS) $(S_OBJS)
|
||||||
|
|
||||||
|
# Define the commands used for compiling the project.
|
||||||
|
LD_CMD = $(LD) $(LDFLAGS) -o $(@) $(filter %.o %.a, $(^)) $(LDARCHIVES)
|
||||||
|
CC_CMD = $(CC) $(CFLAGS) $(CSTD) -c $(<) -o $(@)
|
||||||
|
CXX_CMD = $(CXX) $(CFLAGS) $(CXXFLAGS) $(CXXSTD) -c $(<) -o $(@)
|
||||||
|
AS_CMD = $(CC) $(AFLAGS) $(CSTD) -c $(<) -o $(@)
|
||||||
|
|
||||||
|
# Everyone need colors in their life!
|
||||||
|
INTERACTIVE := $(shell [ -t 0 ] && echo 1)
|
||||||
|
ifeq ($(INTERACTIVE),1)
|
||||||
|
color_default = \033[0m
|
||||||
|
color_bold = \033[01m
|
||||||
|
color_red = \033[31m
|
||||||
|
color_green = \033[32m
|
||||||
|
color_yellow = \033[33m
|
||||||
|
color_blue = \033[34m
|
||||||
|
color_magenta = \033[35m
|
||||||
|
color_cyan = \033[36m
|
||||||
|
color_orange = \033[38;5;172m
|
||||||
|
color_light_blue = \033[38;5;039m
|
||||||
|
color_gray = \033[38;5;008m
|
||||||
|
color_purple = \033[38;5;097m
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: all clean flash flash-jlink
|
||||||
|
|
||||||
|
# The default rule, which causes the project to be built.
|
||||||
|
all: $(PROJECT_OBJ)
|
||||||
|
|
||||||
|
# The rule to clean out all the build products.
|
||||||
|
clean:
|
||||||
|
@rm -rf $(BUILD_DIR) $(wildcard *~)
|
||||||
|
@echo "$(color_red)Done cleaning!$(color_default)"
|
||||||
|
|
||||||
|
flash: all
|
||||||
|
@$(FLASH_CMD) || exit 1
|
||||||
|
|
||||||
|
flash-jlink: all
|
||||||
|
$(JLINK) -if SWD -CommandFile $(JLINK_SCRIPT) || exit 1
|
||||||
|
|
||||||
|
# Rebuild all objects when the Makefiles change.
|
||||||
|
$(OBJS): $(MAKEFILE_LIST)
|
||||||
|
|
||||||
|
# The rule for linking the application.
|
||||||
|
$(PROJECT_OBJ): $(OBJS) $(LDSCRIPT)
|
||||||
|
@if [ '$(VERBOSE)' = 1 ]; then \
|
||||||
|
echo $(LD_CMD); \
|
||||||
|
else \
|
||||||
|
echo " $(color_purple)LD$(color_default) $(@F)"; \
|
||||||
|
fi
|
||||||
|
@echo
|
||||||
|
@$(LD_CMD)
|
||||||
|
@echo
|
||||||
|
@if [ '$(VERBOSE)' = 1 ]; then \
|
||||||
|
$(SIZE) -Ax $(@); \
|
||||||
|
fi
|
||||||
|
@$(OBJCOPY) -O binary $(@) $(@:.axf=.bin)
|
||||||
|
@$(OBJCOPY) -O ihex $(@) $(@:.axf=.hex)
|
||||||
|
|
||||||
|
# The rule for building the object files from each source file.
|
||||||
|
$(C_OBJS): $(BUILD_DIR)/%.o : %.c
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
@if [ '$(VERBOSE)' = 1 ]; then \
|
||||||
|
echo $(CC_CMD); \
|
||||||
|
else \
|
||||||
|
echo " $(color_green)CC$(color_default) $(<F)"; \
|
||||||
|
fi
|
||||||
|
@$(CC_CMD)
|
||||||
|
|
||||||
|
$(CPP_OBJS): $(BUILD_DIR)/%.o : %.cpp
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
@if [ '$(VERBOSE)' = 1 ]; then \
|
||||||
|
echo $(CXX_CMD); \
|
||||||
|
else \
|
||||||
|
echo " $(color_cyan)CXX$(color_default) $(<F)"; \
|
||||||
|
fi
|
||||||
|
@$(CXX_CMD)
|
||||||
|
|
||||||
|
$(S_OBJS): $(BUILD_DIR)/%.o: %.S
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
@if [ '$(VERBOSE)' = 1 ]; then \
|
||||||
|
echo $(AS_CMD); \
|
||||||
|
else \
|
||||||
|
echo " $(color_magenta)AS$(color_default) $(<F)"; \
|
||||||
|
fi
|
||||||
|
@$(AS_CMD)
|
||||||
|
|
||||||
|
# Include the automatically generated dependency files.
|
||||||
|
-include $(OBJS:.o=.d)
|
||||||
7
scripts/flash-left.jlink
Normal file
7
scripts/flash-left.jlink
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
speed 4000
|
||||||
|
device MKL03Z32xxx4
|
||||||
|
connect
|
||||||
|
loadfile build_make/uhk_left.hex
|
||||||
|
RSetType 2
|
||||||
|
r
|
||||||
|
qc
|
||||||
7
scripts/flash-right.jlink
Normal file
7
scripts/flash-right.jlink
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
speed 4000
|
||||||
|
device MK22FN512xxx12
|
||||||
|
connect
|
||||||
|
loadfile build_make/uhk_right.hex
|
||||||
|
RSetType 2
|
||||||
|
r
|
||||||
|
qc
|
||||||
@@ -13,22 +13,15 @@ const releaseName = `uhk-firmware-${version}`;
|
|||||||
const releaseDir = `${__dirname}/${releaseName}`;
|
const releaseDir = `${__dirname}/${releaseName}`;
|
||||||
const modulesDir = `${releaseDir}/modules`;
|
const modulesDir = `${releaseDir}/modules`;
|
||||||
const releaseFile = `${__dirname}/${releaseName}.tar.bz2`;
|
const releaseFile = `${__dirname}/${releaseName}.tar.bz2`;
|
||||||
const leftFirmwareFile = `${__dirname}/../left/build/uhk60-left_release/uhk-left.bin`;
|
const leftFirmwareFile = `${__dirname}/../left/build_make/uhk_left.bin`;
|
||||||
const usbDir = `${__dirname}/../lib/agent/packages/usb`;
|
const usbDir = `${__dirname}/../lib/agent/packages/usb`;
|
||||||
|
|
||||||
const deviceSourceFirmwares = package.devices.map(device => `${__dirname}/../${device.source}`);
|
const deviceSourceFirmwares = package.devices.map(device => `${__dirname}/../${device.source}`);
|
||||||
const moduleSourceFirmwares = package.modules.map(module => `${__dirname}/../${module.source}`);
|
const moduleSourceFirmwares = package.modules.map(module => `${__dirname}/../${module.source}`);
|
||||||
rm('-rf', releaseDir, releaseFile, deviceSourceFirmwares, moduleSourceFirmwares);
|
rm('-rf', releaseDir, releaseFile, deviceSourceFirmwares, moduleSourceFirmwares);
|
||||||
|
|
||||||
exec(`/opt/Freescale/KDS_v3/eclipse/kinetis-design-studio \
|
exec(`cd ${__dirname}/../left; make clean; make -j8`);
|
||||||
--launcher.suppressErrors \
|
exec(`cd ${__dirname}/../right; make clean; make -j8`);
|
||||||
-noSplash \
|
|
||||||
-application org.eclipse.cdt.managedbuilder.core.headlessbuild \
|
|
||||||
-import ${__dirname}/../left/build \
|
|
||||||
-import ${__dirname}/../right/build \
|
|
||||||
-cleanBuild uhk-left \
|
|
||||||
-cleanBuild uhk-right`
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const device of package.devices) {
|
for (const device of package.devices) {
|
||||||
const deviceDir = `${releaseDir}/devices/${device.name}`;
|
const deviceDir = `${releaseDir}/devices/${device.name}`;
|
||||||
|
|||||||
@@ -15,23 +15,23 @@
|
|||||||
"commander": "^2.11.0",
|
"commander": "^2.11.0",
|
||||||
"shelljs": "^0.7.8"
|
"shelljs": "^0.7.8"
|
||||||
},
|
},
|
||||||
"firmwareVersion": "8.2.1",
|
"firmwareVersion": "8.5.2",
|
||||||
"deviceProtocolVersion": "4.3.0",
|
"deviceProtocolVersion": "4.5.0",
|
||||||
"moduleProtocolVersion": "4.0.0",
|
"moduleProtocolVersion": "4.0.0",
|
||||||
"userConfigVersion": "4.0.0",
|
"userConfigVersion": "4.1.0",
|
||||||
"hardwareConfigVersion": "1.0.0",
|
"hardwareConfigVersion": "1.0.0",
|
||||||
"devices": [
|
"devices": [
|
||||||
{
|
{
|
||||||
"deviceId": 1,
|
"deviceId": 1,
|
||||||
"name": "uhk60-right",
|
"name": "uhk60-right",
|
||||||
"source": "right/build/uhk60-right_release/uhk-right.hex"
|
"source": "right/build_make/uhk_right.hex"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modules": [
|
"modules": [
|
||||||
{
|
{
|
||||||
"moduleId": 1,
|
"moduleId": 1,
|
||||||
"name": "uhk60-left",
|
"name": "uhk60-left",
|
||||||
"source": "left/build/uhk60-left_release/uhk-left.bin"
|
"source": "left/build_make/uhk_left.bin"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "fsl_gpio.h"
|
#include "fsl_gpio.h"
|
||||||
#include "key_matrix.h"
|
#include "key_matrix.h"
|
||||||
|
|
||||||
|
uint8_t DebounceTimePress = 50, DebounceTimeRelease = 50;
|
||||||
|
|
||||||
void KeyMatrix_Init(key_matrix_t *keyMatrix)
|
void KeyMatrix_Init(key_matrix_t *keyMatrix)
|
||||||
{
|
{
|
||||||
for (key_matrix_pin_t *row = keyMatrix->rows; row < keyMatrix->rows + keyMatrix->rowNum; row++) {
|
for (key_matrix_pin_t *row = keyMatrix->rows; row < keyMatrix->rows + keyMatrix->rowNum; row++) {
|
||||||
|
|||||||
@@ -28,6 +28,10 @@
|
|||||||
uint8_t keyStates[MAX_KEYS_IN_MATRIX];
|
uint8_t keyStates[MAX_KEYS_IN_MATRIX];
|
||||||
} key_matrix_t;
|
} key_matrix_t;
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern uint8_t DebounceTimePress, DebounceTimeRelease;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void KeyMatrix_Init(key_matrix_t *keyMatrix);
|
void KeyMatrix_Init(key_matrix_t *keyMatrix);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user