Compare commits
326 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
6854fa68dc | ||
|
|
14b6e49692 | ||
|
|
10802f3f73 | ||
|
|
66252eabf0 | ||
|
|
0c4c736552 | ||
|
|
aa4105bdc3 | ||
|
|
101abffec4 | ||
|
|
b8268f55a3 | ||
|
|
2214f00667 | ||
|
|
a2fae5bbef | ||
|
|
47e026006e | ||
|
|
379d827982 | ||
|
|
d9d26814e8 | ||
|
|
611c36fe00 | ||
|
|
e9cd3a96c2 | ||
|
|
8856c484b6 | ||
|
|
b97841fdae | ||
|
|
69143bed9c | ||
|
|
ebd0e3b762 | ||
|
|
ec8301ae62 | ||
|
|
3d4d78387e | ||
|
|
c2582729f2 | ||
|
|
9d66f5ff76 | ||
|
|
06ebed5537 | ||
|
|
02d6fb4628 | ||
|
|
1b9ec89e20 | ||
|
|
7002e7de52 | ||
|
|
1e61a39210 | ||
|
|
5509cbb5f8 | ||
|
|
f650032fef | ||
|
|
fd787f74e9 | ||
|
|
75fe7904b6 | ||
|
|
b4ac82d2c0 | ||
|
|
9670523310 | ||
|
|
7763d8a32b | ||
|
|
3d9170402b | ||
|
|
b0192085bb | ||
|
|
c90261d549 | ||
|
|
5a756edf8b | ||
|
|
46ce16b8d4 | ||
|
|
d2acfba659 | ||
|
|
ac75d0ca8b | ||
|
|
10beb751ac | ||
|
|
e0528e1714 | ||
|
|
0afb3ab687 | ||
|
|
58fd3a78cf | ||
|
|
f1ed699fa2 | ||
|
|
43646beca8 | ||
|
|
308a71e4a3 | ||
|
|
ecf1f1ac32 | ||
|
|
b34fb9daa3 | ||
|
|
195f40949f | ||
|
|
b68c6bed18 | ||
|
|
ab24e78a5b | ||
|
|
4892d64795 | ||
|
|
c10d6440ce | ||
|
|
c109a9e202 | ||
|
|
5d59540c51 | ||
|
|
e12e219b4e | ||
|
|
3ab2ac18fc | ||
|
|
6e2eca7829 | ||
|
|
8f4fc1da8e | ||
|
|
5de0e5ac60 | ||
|
|
13a718f871 | ||
|
|
15d09552a4 | ||
|
|
0b100feb32 | ||
|
|
1742437f8b | ||
|
|
5093a0c0a6 | ||
|
|
7e524d97b1 | ||
|
|
2e53331a0f | ||
|
|
c6d60780f4 | ||
|
|
8666a495d8 | ||
|
|
33bbf44199 | ||
|
|
cc49118868 | ||
|
|
f8fd99f588 | ||
|
|
fa8c9dc907 | ||
|
|
0911e67bf6 | ||
|
|
57a7cee62a | ||
|
|
1af28a79db | ||
|
|
6881f8e340 | ||
|
|
00cd1f65e8 | ||
|
|
2c9a6c0bd2 | ||
|
|
0c94cbb256 | ||
|
|
275bfee860 | ||
|
|
8a655e3cfd | ||
|
|
8521619783 | ||
|
|
62184240df | ||
|
|
0b210ac68e | ||
|
|
56f7753afc | ||
|
|
a0803875c4 | ||
|
|
f5716bdadc | ||
|
|
b76b3c0e4f | ||
|
|
2661c3d909 | ||
|
|
c854e98d84 | ||
|
|
72d8e49717 | ||
|
|
0fd95b71b2 | ||
|
|
4d83bc2e75 | ||
|
|
cf7b05ab72 | ||
|
|
055f1945d0 | ||
|
|
fa4a3abf84 | ||
|
|
96c7ccd758 | ||
|
|
76d319ec19 | ||
|
|
aab0e8473f | ||
|
|
4a4c471b9e | ||
|
|
fcd75b2af2 | ||
|
|
f318c6872e | ||
|
|
ae1240c103 | ||
|
|
e75d366245 | ||
|
|
da20cdacc4 | ||
|
|
5a986d367e | ||
|
|
f6b66283a7 | ||
|
|
6ad425cbf9 | ||
|
|
33e501cd83 | ||
|
|
fa558abef3 | ||
|
|
25a2b3af93 | ||
|
|
43587c2e1f | ||
|
|
c51542795f | ||
|
|
7eb83173ed | ||
|
|
5581dd26b5 | ||
|
|
1ac637af0f | ||
|
|
36951d1a34 | ||
|
|
5190265a2c | ||
|
|
40bf252852 | ||
|
|
85e92d21b4 | ||
|
|
fd43e81e46 | ||
|
|
c994a97d03 | ||
|
|
d59ba83d99 | ||
|
|
c1b887cea8 | ||
|
|
bd53b73685 | ||
|
|
beb7c3d4ee | ||
|
|
17571a5feb | ||
|
|
83e782d74a | ||
|
|
312f56048b | ||
|
|
494621a841 | ||
|
|
94af52892c | ||
|
|
5862a34f18 | ||
|
|
9b9e5ed1b5 | ||
|
|
4393377365 | ||
|
|
1570364741 | ||
|
|
738a240860 | ||
|
|
43b48aa643 | ||
|
|
61a0540007 | ||
|
|
f2e313dd0a | ||
|
|
b239d0da50 | ||
|
|
23459e3791 | ||
|
|
6a54944cb1 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
package-lock.json
|
||||
node_modules
|
||||
build_make
|
||||
|
||||
43
.travis.yml
43
.travis.yml
@@ -1,25 +1,22 @@
|
||||
language: generic
|
||||
language: c
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/Library/Caches/Homebrew/Cask
|
||||
install: eclipse -noSplash
|
||||
-application org.eclipse.equinox.p2.director
|
||||
-repository http://gnuarmeclipse.sourceforge.net/updates
|
||||
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group
|
||||
-profileProperties org.eclipse.update.install.features=true
|
||||
script: eclipse -noSplash
|
||||
-application org.eclipse.cdt.managedbuilder.core.headlessbuild
|
||||
-import $TRAVIS_BUILD_DIR/left/build
|
||||
-import $TRAVIS_BUILD_DIR/right/build
|
||||
-build all
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
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
|
||||
# Cache for the gcc archives
|
||||
- $HOME/gcc-cache/
|
||||
|
||||
install:
|
||||
- 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
|
||||
- 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
|
||||
- tar -xf $HOME/gcc-cache/$GCC_NAME -C $HOME
|
||||
- export PATH=$PATH:$HOME/gcc-arm-none-eabi-7-2017-q4-major/bin
|
||||
|
||||
script:
|
||||
- make -C left clean && make -j2 -C left DEBUG=1
|
||||
- make -C left clean && make -j2 -C left DEBUG=0
|
||||
- make -C right clean && make -j2 -C right DEBUG=1
|
||||
- make -C right clean && make -j2 -C right DEBUG=0
|
||||
|
||||
222
CHANGELOG.md
222
CHANGELOG.md
@@ -5,38 +5,210 @@ 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/)
|
||||
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
|
||||
|
||||
## [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 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
|
||||
|
||||
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Don't suppress modifier keys upon releasing a layer.
|
||||
- Restore Caps Lock indicator when saving the configuration.
|
||||
|
||||
## [8.2.0] - 2018-04-20
|
||||
|
||||
Device Protocol: 4.**3.0** | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Change the scheduling of USB reports which changes mouse pointer speeds.
|
||||
- Disable LEDs while the host sleeps.
|
||||
- Make any key wake up the host while it sleeps.
|
||||
- Add UsbCommand_SwitchKeymap(). `DEVICEPROTOCOL:MINOR`
|
||||
- Make GCC optimize the release builds for execution speed (-O3).
|
||||
|
||||
## [8.1.5] - 2018-04-04
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Set key debounce timeout from 30ms to 60ms. This should eliminate key chattering.
|
||||
- Use the correct scancode for the menu key of the factory keymap.
|
||||
|
||||
## [8.1.4] - 2018-03-05
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Set key debounce timeout from 20ms to 30ms. This should eliminate key chattering.
|
||||
- Set double tap lock layer timeout from 250ms to 150ms. This should minimize the chance of locking layers accidentally by double tapping their keys.
|
||||
|
||||
## [8.1.3] - 2018-02-18
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Fix system keyboard descriptor, so it is byte-aligned.
|
||||
- Set key debounce timeout from 15ms to 20ms. This should at least reduce and hopefully eliminate key chattering.
|
||||
|
||||
## [8.1.2] - 2018-02-13
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Detect Caps Lock USB state and light up the Caps Lock icon of the LED display accordingly.
|
||||
- Set key debounce timeout from 10ms to 15ms. This should at least reduce and hopefully eliminate key chattering.
|
||||
|
||||
## [8.1.1] - 2018-02-11
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Lock layers every time when double-tapping their layer switcher keys, regardless of how many times the layer switcher key was tapped before.
|
||||
- Only lock layers via double-tapping if the second tap gets released within 100ms.
|
||||
|
||||
## [8.1.0] - 2018-01-15
|
||||
|
||||
Device Protocol: 4.**2**.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Enable left-half watchdog in reinit mode which seems to prevent freezes.
|
||||
- Slow down main bus I2C baud rate to 30kHz when BusPal is on to make firmware transfer more robust.
|
||||
- Implement UsbCommandId_GetSlaveI2cErrors. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement UsbCommandId_SetI2cBaudRate. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_CurrentKbootCommand. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_I2cMainBusBaudRate. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_Uptime. `DEVICEPROTOCOL:MINOR`
|
||||
|
||||
## [8.0.1] - 2017-12-25
|
||||
|
||||
Device Protocol: 4.1.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Implement I2C watchdog for the left keyboard half which should resolve the occasional hangs of the left keyboard half.
|
||||
|
||||
## [8.0.0] - 2017-12-15
|
||||
|
||||
Device Protocol: 4.**1.0** | Module Protocol: **4.0.0** | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make the modules transfer the module protocol version and firmware version composed of a major, a minor and a patch number. `MODULEPROTOCOL:MAJOR`
|
||||
- Query module key count and pointer count in separate messages instead of a combined message for improved clarity. `MODULEPROTOCOL:MAJOR`
|
||||
- Add new UsbCommand_GetModuleProperties() device protocol command. `DEVICEPROTOCOL:MINOR`
|
||||
|
||||
## [7.0.0] - 2017-12-14
|
||||
|
||||
Device Protocol: **4.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make UsbCommand_JumpToModuleBootloader() more robust by not making it dependent on the state of the module driver.
|
||||
- Don't make horizontal scrolling and vertical scrolling affect each other.
|
||||
- Expose version numbers via the get property interface. `DEVICEPROTOCOL:MINOR`
|
||||
- Add DevicePropertyId_ConfigSizes. `DEVICEPROTOCOL:MINOR`
|
||||
- Remove DevicePropertyId_HardwareConfigSize and DevicePropertyId_UserConfigSize. `DEVICEPROTOCOL:MAJOR`
|
||||
|
||||
## [6.0.0] - 2017-12-12
|
||||
|
||||
Data Model: 4.0.0 (unchanged) | USB Protocol: 3.0.0 (major bump) | Slave Protocol: 3.0.0 (unchanged)
|
||||
Device Protocol: **3.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Change the value of almost every USB protocol commands because there were unused intervals between them. `USBPROTOCOL:MAJOR`
|
||||
- Change the value of almost every Device Protocol commands because there were unused intervals between them. `DEVICEPROTOCOL:MAJOR`
|
||||
- Disable LED display icons by default.
|
||||
- Update LED brightness levels upon applying the configuration.
|
||||
|
||||
## [5.0.1] - 2017-12-09
|
||||
|
||||
Data Model: 4.0.0 (unchanged) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make key presses continue to emit scancodes even if a USB interface (typically the mouse interface) is not polled by the host anymore.
|
||||
- Make scrolling always immediately react to keypresses regardless of the previous internal scroll state.
|
||||
|
||||
## [5.0.0] - 2017-12-04
|
||||
|
||||
Data Model: 4.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **4.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `DATAMODEL:MAJOR`
|
||||
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `USERCONFIG:MAJOR`
|
||||
|
||||
## [4.0.0] - 2017-11-30
|
||||
|
||||
Data Model: 3.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **3.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Implement mouse movement and scrolling deceleration and acceleration.
|
||||
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
|
||||
- Make the parser read additional user configuration properties: dataModelMajorVersion, dataModelMinorVersion, dataModelPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `DATAMODEL:MAJOR`
|
||||
- Make the parser read additional user configuration properties: userConfigMajorVersion, userConfigMinorVersion, userConfigPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
|
||||
|
||||
## [3.0.0] - 2017-11-15
|
||||
|
||||
Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protocol: 3.0.0 (major bump)
|
||||
Device Protocol: **2.0.0** | Module Protocol: **3.0.0** | User Config: **2.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Detect the use of USB interfaces and only wait for the ones that are actually used by the host.
|
||||
- Implement key debouncer.
|
||||
@@ -44,49 +216,49 @@ Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protoc
|
||||
- Make pressing the reset button revert to the factory preset.
|
||||
- Revert to the factory default state when the reset button is pressed upon firmware startup. Display FTY on the display in this case.
|
||||
- Make the LED display show the abbreviation of the current keymap even when it gets reinitialized by the I2C watchdog.
|
||||
- Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `SLAVEPROTOCOL:MAJOR`
|
||||
- Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `MODULEPROTOCOL:MAJOR`
|
||||
- Suppress pressed keys upon layer switcher key release.
|
||||
- Handle secondary role modifiers and layer switchers.
|
||||
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `USBPROTOCOL:MAJOR`
|
||||
- Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `USBPROTOCOL:MINOR`
|
||||
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `USBPROTOCOL:MAJOR`
|
||||
- Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `USBPROTOCOL:MAJOR`
|
||||
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `DEVICEPROTOCOL:MAJOR`
|
||||
- Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `DEVICEPROTOCOL:MINOR`
|
||||
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `DEVICEPROTOCOL:MAJOR`
|
||||
- Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `DEVICEPROTOCOL:MAJOR`
|
||||
- Switch keymap only upon keypress.
|
||||
- Handle layer toggle actions.
|
||||
- Keep the active layer active even if another layer switcher key gets pressed while holding it.
|
||||
- Read the new UserConfig.userConfigLength user config field. `DATAMODEL:MAJOR`
|
||||
- Read the new UserConfig.userConfigLength user config field. `USERCONFIG:MAJOR`
|
||||
- Change Ctrl and Alt back according to the official UHK factory keymap.
|
||||
- Update system keyboard HID descriptor which doesn't make the pointer go to the top left corner on OSX anymore.
|
||||
- Scan keyboard matrices in a more efficient manner from timer interrupts instead of the main loop.
|
||||
- Add UsbCommand_SendKbootCommand. `USBPROTOCOL:MINOR`
|
||||
- Make the reenumerate USB command accept a timeout value. `USBPROTOCOL:MINOR`
|
||||
- Make the config parser read the device name. `DATAMODEL:MAJOR`
|
||||
- Add UsbCommand_SendKbootCommand. `DEVICEPROTOCOL:MINOR`
|
||||
- Make the reenumerate USB command accept a timeout value. `DEVICEPROTOCOL:MINOR`
|
||||
- Make the config parser read the device name. `USERCONFIG:MAJOR`
|
||||
- Update release file format containing device and module directories and hex files instead of srec.
|
||||
- Remove obsolete ARM GCC build files.
|
||||
|
||||
## [2.1.0] - 2017-10-13
|
||||
|
||||
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.2.0 (minor bump) | Slave Protocol: 2.1.0 (minor bump)
|
||||
Device Protocol: 1.**2.0** | Module Protocol: 2.**1.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Add jumpToSlaveBootloader USB and slave protocol command. `USBPROTOCOL:MINOR` `SLAVEPROTOCOL:MINOR`
|
||||
- Add jumpToSlaveBootloader USB and Module Protocol command. `DEVICEPROTOCOL:MINOR` `MODULEPROTOCOL:MINOR`
|
||||
- Fix generic HID descriptor enumeration error.
|
||||
|
||||
## [2.0.0] - 2017-10-10
|
||||
|
||||
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.1.0 (minor bump) | Slave Protocol: 2.0.0 (major bump)
|
||||
Device Protocol: 1.**1.0** | Module Protocol: **2.0.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Read the hardware and user configuration area of the EEPROM upon startup and set the default keymap.
|
||||
- Greatly improve the I2C watchdog and drivers. Communication between the halves or the add-ons should never fail again.
|
||||
- Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `SLAVEPROTOCOL:MAJOR`
|
||||
- Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `MODULEPROTOCOL:MAJOR`
|
||||
- Make the master cache the output fields of slave modules, allowing for more frequent input updates.
|
||||
- Optimize I2C protocol scheduler resulting in increased roustness and more efficient use of I2C bandwidth.
|
||||
- Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `SLAVEPROTOCOL:MAJOR`
|
||||
- Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `MODULEPROTOCOL:MAJOR`
|
||||
- Add mechanism to dump the internal state of the KL03 via SPI for debugging purposes.
|
||||
- Add merge sensor state and attached module IDs to GetDebugInfo(). `USBPROTOCOL:PATCH`
|
||||
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `DATAMODEL:PATCH`
|
||||
- Add merge sensor state and attached module IDs to GetDebugInfo(). `DEVICEPROTOCOL:PATCH`
|
||||
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `USERCONFIG:PATCH`
|
||||
|
||||
## [1.0.0] - 2017-08-30
|
||||
|
||||
Data Model: 1.0.0 | USB Protocol: 1.0.0 | Slave Protocol: 1.0.0
|
||||
Device Protocol: 1.0.0 | Module Protocol: 1.0.0 | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- First Release
|
||||
|
||||
20
README.md
20
README.md
@@ -4,23 +4,27 @@
|
||||
|
||||
This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
|
||||
|
||||
## Cloning the repository
|
||||
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.
|
||||
|
||||
Please make sure to clone this repo with:
|
||||
If you're one of the brave few who wants to hack the firmware then read on.
|
||||
|
||||
1. Make sure to clone this repo with:
|
||||
|
||||
`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.1.1_606.x86_64.deb.bin), [Mac](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.pkg), or [Windows](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.exe).
|
||||
|
||||
## Importing the firmware
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
## Building and flashing the firmware
|
||||
|
||||
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 -> uhk-left release jlink*, and click on the *Debug* 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.
|
||||
|
||||
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk-right release blhost*, and click on the *Debug* button. Please note that this update method only works on Linux out of the box. On other operating systems, you have to execute the relevant commands of the [blhost-unix.sh](right/build/kds/blhost-unix.sh) script.
|
||||
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
|
||||
|
||||
|
||||
@@ -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
|
||||
57
left/Makefile
Normal file
57
left/Makefile
Normal file
@@ -0,0 +1,57 @@
|
||||
# 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)
|
||||
|
||||
# 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,19 +5,19 @@
|
||||
<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/>
|
||||
<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.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.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.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<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="">
|
||||
<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.none" 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"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.1547417078" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.765602671" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.910567930" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||
@@ -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.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"/>
|
||||
<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">
|
||||
<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"/>
|
||||
@@ -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">
|
||||
<externalSettings/>
|
||||
<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.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.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.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<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="">
|
||||
<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"/>
|
||||
@@ -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.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"/>
|
||||
<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">
|
||||
<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"/>
|
||||
|
||||
1
left/build/.gitignore
vendored
1
left/build/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/.settings/
|
||||
/uhk60-left_debug/
|
||||
/uhk60-left_release/
|
||||
/uhk60-left_release/
|
||||
|
||||
@@ -31,6 +31,16 @@
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
<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>
|
||||
<name>drivers</name>
|
||||
<type>2</type>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="2331"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
@@ -77,6 +77,6 @@
|
||||
<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="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -1,34 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
||||
<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 type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -77,6 +77,6 @@
|
||||
<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="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -1,48 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
||||
<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 type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
|
||||
// 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
|
||||
|
||||
@@ -3,36 +3,40 @@
|
||||
#include "i2c_watchdog.h"
|
||||
#include "test_led.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "config.h"
|
||||
|
||||
//static uint32_t prevWatchdogCounter = 0;
|
||||
uint32_t I2cWatchdog_RecoveryCounter;
|
||||
volatile uint32_t I2cWatchdog_WatchCounter;
|
||||
/* 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
|
||||
* Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
|
||||
*/
|
||||
#ifdef I2C_WATCHDOG
|
||||
static uint32_t prevWatchdogCounter = 0;
|
||||
static uint32_t I2cWatchdog_RecoveryCounter; /* counter for how many times we had to recover and restart */
|
||||
|
||||
void InitI2cWatchdog(void)
|
||||
void RunWatchdog(void)
|
||||
{
|
||||
lptmr_config_t lptmrConfig;
|
||||
LPTMR_GetDefaultConfig(&lptmrConfig);
|
||||
LPTMR_Init(LPTMR0, &lptmrConfig);
|
||||
LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(LPTMR_USEC_COUNT, LPTMR_SOURCE_CLOCK));
|
||||
LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
|
||||
EnableIRQ(LPTMR0_IRQn);
|
||||
LPTMR_StartTimer(LPTMR0);
|
||||
}
|
||||
/*
|
||||
void I2C_WATCHDOG_LPTMR_HANDLER(void)
|
||||
{
|
||||
TEST_LED_TOGGLE();
|
||||
static volatile uint32_t I2cWatchdog_WatchCounter = 0; /* counter for timer */
|
||||
static int cntr = 0;
|
||||
|
||||
cntr++;
|
||||
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 */
|
||||
cntr=0;
|
||||
TestLed_Toggle();
|
||||
I2cWatchdog_WatchCounter++;
|
||||
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms
|
||||
// NVIC_SystemReset();
|
||||
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
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REBOOT
|
||||
NVIC_SystemReset();
|
||||
#endif
|
||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REINIT
|
||||
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
||||
InitI2c();
|
||||
initI2c();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
prevWatchdogCounter = I2C_Watchdog; /* remember previous counter */
|
||||
}
|
||||
|
||||
prevWatchdogCounter = I2C_Watchdog;
|
||||
|
||||
LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitI2cWatchdog(void);
|
||||
void RunWatchdog(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "slave_protocol_handler.h"
|
||||
#include "i2c_watchdog.h"
|
||||
#include "debug_over_spi.h"
|
||||
#include "main.h"
|
||||
|
||||
i2c_slave_config_t slaveConfig;
|
||||
i2c_slave_handle_t slaveHandle;
|
||||
@@ -44,14 +45,14 @@ static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *u
|
||||
}
|
||||
}
|
||||
|
||||
void InitInterruptPriorities(void)
|
||||
void initInterruptPriorities(void)
|
||||
{
|
||||
NVIC_SetPriority(I2C0_IRQn, 1);
|
||||
NVIC_SetPriority(TPM1_IRQn, 1);
|
||||
NVIC_SetPriority(SPI0_IRQn, 1);
|
||||
}
|
||||
|
||||
void InitI2c(void)
|
||||
void initI2c(void)
|
||||
{
|
||||
port_pin_config_t pinConfig = {
|
||||
.pullSelect = kPORT_PullUp,
|
||||
@@ -81,11 +82,10 @@ void InitLedDriver(void)
|
||||
|
||||
void InitPeripherals(void)
|
||||
{
|
||||
InitInterruptPriorities();
|
||||
initInterruptPriorities();
|
||||
InitLedDriver();
|
||||
InitTestLed();
|
||||
TestLed_Init();
|
||||
LedPwm_Init();
|
||||
// InitI2cWatchdog();
|
||||
DebugOverSpi_Init();
|
||||
InitI2c();
|
||||
initI2c();
|
||||
}
|
||||
|
||||
@@ -11,6 +11,6 @@
|
||||
// Functions:
|
||||
|
||||
void InitPeripherals(void);
|
||||
void InitI2c(void);
|
||||
void initI2c(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
#include "fsl_lptmr.h"
|
||||
#include "key_scanner.h"
|
||||
#include "main.h"
|
||||
#include "config.h"
|
||||
#include "i2c_watchdog.h"
|
||||
|
||||
void KEY_SCANNER_HANDLER(void)
|
||||
{
|
||||
KeyMatrix_ScanRow(&keyMatrix);
|
||||
#ifdef I2C_WATCHDOG
|
||||
RunWatchdog();
|
||||
#endif
|
||||
LPTMR_ClearStatusFlags(KEY_SCANNER_LPTMR_BASEADDR, kLPTMR_TimerCompareFlag);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
#define MODULE_PROTOCOL_VERSION 1
|
||||
#define MODULE_ID ModuleId_LeftKeyboardHalf
|
||||
#define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM)
|
||||
#define MODULE_HAS_POINTER false
|
||||
#define MODULE_POINTER_COUNT 0
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,10 +10,23 @@
|
||||
#include "bool_array_converter.h"
|
||||
#include "bootloader.h"
|
||||
#include "module.h"
|
||||
#include "versions.h"
|
||||
|
||||
i2c_message_t RxMessage;
|
||||
i2c_message_t TxMessage;
|
||||
|
||||
static version_t moduleProtocolVersion = {
|
||||
MODULE_PROTOCOL_MAJOR_VERSION,
|
||||
MODULE_PROTOCOL_MINOR_VERSION,
|
||||
MODULE_PROTOCOL_PATCH_VERSION,
|
||||
};
|
||||
|
||||
static version_t firmwareVersion = {
|
||||
FIRMWARE_MAJOR_VERSION,
|
||||
FIRMWARE_MINOR_VERSION,
|
||||
FIRMWARE_PATCH_VERSION,
|
||||
};
|
||||
|
||||
void SlaveRxHandler(void)
|
||||
{
|
||||
if (!CRC16_IsMessageValid(&RxMessage)) {
|
||||
@@ -29,7 +42,7 @@ void SlaveRxHandler(void)
|
||||
case SlaveCommand_SetTestLed:
|
||||
TxMessage.length = 0;
|
||||
bool isLedOn = RxMessage.data[1];
|
||||
TEST_LED_SET(isLedOn);
|
||||
TestLed_Set(isLedOn);
|
||||
break;
|
||||
case SlaveCommand_SetLedPwmBrightness:
|
||||
TxMessage.length = 0;
|
||||
@@ -51,21 +64,29 @@ void SlaveTxHandler(void)
|
||||
TxMessage.length = SLAVE_SYNC_STRING_LENGTH;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ModuleProtocolVersion: {
|
||||
memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t));
|
||||
TxMessage.length = sizeof(version_t);
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_FirmwareVersion: {
|
||||
memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t));
|
||||
TxMessage.length = sizeof(version_t);
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ModuleId: {
|
||||
TxMessage.data[0] = MODULE_ID;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ProtocolVersion: {
|
||||
TxMessage.data[0] = MODULE_PROTOCOL_VERSION;
|
||||
case SlaveProperty_KeyCount: {
|
||||
TxMessage.data[0] = MODULE_KEY_COUNT;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_Features: {
|
||||
uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data;
|
||||
moduleFeatures->keyCount = MODULE_KEY_COUNT;
|
||||
moduleFeatures->hasPointer = MODULE_HAS_POINTER;
|
||||
TxMessage.length = sizeof(uhk_module_features_t);
|
||||
case SlaveProperty_PointerCount: {
|
||||
TxMessage.data[0] = MODULE_POINTER_COUNT;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "test_led.h"
|
||||
#include "fsl_port.h"
|
||||
|
||||
extern void InitTestLed(void)
|
||||
extern void TestLed_Init(void)
|
||||
{
|
||||
CLOCK_EnableClock(TEST_LED_CLOCK);
|
||||
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});
|
||||
TEST_LED_ON();
|
||||
TestLed_On();
|
||||
}
|
||||
|
||||
@@ -15,13 +15,28 @@
|
||||
#define TEST_LED_CLOCK kCLOCK_PortB
|
||||
#define TEST_LED_PIN 13
|
||||
|
||||
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
||||
#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))
|
||||
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
||||
static inline void TestLed_On(void)
|
||||
{
|
||||
GPIO_SetPinsOutput(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:
|
||||
|
||||
void InitTestLed(void);
|
||||
void TestLed_Init(void);
|
||||
|
||||
#endif
|
||||
|
||||
Submodule lib/KSDK_2.0_MK22FN512xxx12 updated: 7142722eed...e447ecee3a
Submodule lib/agent updated: 04b43896c5...fa32f95438
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,19 +5,19 @@
|
||||
<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/>
|
||||
<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.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.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.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<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="">
|
||||
<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.size" 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"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.704315278" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.108613118" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.916504304" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||
@@ -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.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"/>
|
||||
<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">
|
||||
<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"/>
|
||||
@@ -136,9 +136,6 @@
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<fileInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.621318926" name="wormhole.c" rcbsApplicability="disable" resourcePath="bootloader-shared/wormhole.c" toolsToInvoke="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614">
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335"/>
|
||||
</fileInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
@@ -148,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">
|
||||
<externalSettings/>
|
||||
<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.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.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.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<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="">
|
||||
<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"/>
|
||||
@@ -200,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.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"/>
|
||||
<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">
|
||||
<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"/>
|
||||
@@ -291,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">
|
||||
<externalSettings/>
|
||||
<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.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.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.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<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="">
|
||||
<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"/>
|
||||
@@ -343,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.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"/>
|
||||
<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">
|
||||
<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"/>
|
||||
@@ -450,14 +447,97 @@
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||
<configuration configurationName="uhk60-right_debug_standalone">
|
||||
<configuration configurationName="uhk60-right_debug">
|
||||
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
||||
</configuration>
|
||||
<configuration configurationName="uhk60-right_release">
|
||||
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
||||
</configuration>
|
||||
<configuration configurationName="uhk60-right_debug">
|
||||
<configuration configurationName="uhk60-right_debug_standalone">
|
||||
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
||||
</configuration>
|
||||
</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="70200"/>
|
||||
<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="512" type="Flash"/>
|
||||
<memory id="RAM" size="128" type="RAM"/>
|
||||
<memoryInstance derived_from="Flash" driver="FTFA_2K.cfx" id="PROGRAM_FLASH" location="0x0" size="0x80000"/>
|
||||
<memoryInstance derived_from="RAM" id="SRAM_UPPER" location="0x20000000" size="0x10000"/>
|
||||
<memoryInstance derived_from="RAM" id="SRAM_LOWER" location="0x1fff0000" size="0x10000"/>
|
||||
<peripheralInstance derived_from="FTFA_FlashConfig" id="FTFA_FlashConfig" location="0x400"/>
|
||||
<peripheralInstance derived_from="DMA" id="DMA" location="0x40008000"/>
|
||||
<peripheralInstance derived_from="FB" id="FB" location="0x4000C000"/>
|
||||
<peripheralInstance derived_from="FMC" id="FMC" location="0x4001F000"/>
|
||||
<peripheralInstance derived_from="FTFA" id="FTFA" location="0x40020000"/>
|
||||
<peripheralInstance derived_from="DMAMUX" id="DMAMUX" location="0x40021000"/>
|
||||
<peripheralInstance derived_from="FTM0" id="FTM0" location="0x40038000"/>
|
||||
<peripheralInstance derived_from="FTM1" id="FTM1" location="0x40039000"/>
|
||||
<peripheralInstance derived_from="FTM2" id="FTM2" location="0x4003A000"/>
|
||||
<peripheralInstance derived_from="FTM3" id="FTM3" location="0x40026000"/>
|
||||
<peripheralInstance derived_from="ADC0" id="ADC0" location="0x4003B000"/>
|
||||
<peripheralInstance derived_from="ADC1" id="ADC1" location="0x40027000"/>
|
||||
<peripheralInstance derived_from="DAC0" id="DAC0" location="0x4003F000"/>
|
||||
<peripheralInstance derived_from="DAC1" id="DAC1" location="0x40028000"/>
|
||||
<peripheralInstance derived_from="RNG" id="RNG" location="0x40029000"/>
|
||||
<peripheralInstance derived_from="LPUART0" id="LPUART0" location="0x4002A000"/>
|
||||
<peripheralInstance derived_from="SPI0" id="SPI0" location="0x4002C000"/>
|
||||
<peripheralInstance derived_from="SPI1" id="SPI1" location="0x4002D000"/>
|
||||
<peripheralInstance derived_from="I2S0" id="I2S0" location="0x4002F000"/>
|
||||
<peripheralInstance derived_from="CRC" id="CRC" location="0x40032000"/>
|
||||
<peripheralInstance derived_from="PDB0" id="PDB0" location="0x40036000"/>
|
||||
<peripheralInstance derived_from="PIT" id="PIT" location="0x40037000"/>
|
||||
<peripheralInstance derived_from="RTC" id="RTC" location="0x4003D000"/>
|
||||
<peripheralInstance derived_from="RFVBAT" id="RFVBAT" location="0x4003E000"/>
|
||||
<peripheralInstance derived_from="LPTMR0" id="LPTMR0" location="0x40040000"/>
|
||||
<peripheralInstance derived_from="RFSYS" id="RFSYS" location="0x40041000"/>
|
||||
<peripheralInstance derived_from="SIM" id="SIM" location="0x40047000"/>
|
||||
<peripheralInstance derived_from="PORTA" id="PORTA" location="0x40049000"/>
|
||||
<peripheralInstance derived_from="PORTB" id="PORTB" location="0x4004A000"/>
|
||||
<peripheralInstance derived_from="PORTC" id="PORTC" location="0x4004B000"/>
|
||||
<peripheralInstance derived_from="PORTD" id="PORTD" location="0x4004C000"/>
|
||||
<peripheralInstance derived_from="PORTE" id="PORTE" location="0x4004D000"/>
|
||||
<peripheralInstance derived_from="WDOG" id="WDOG" location="0x40052000"/>
|
||||
<peripheralInstance derived_from="EWM" id="EWM" location="0x40061000"/>
|
||||
<peripheralInstance derived_from="MCG" id="MCG" location="0x40064000"/>
|
||||
<peripheralInstance derived_from="OSC" id="OSC" location="0x40065000"/>
|
||||
<peripheralInstance derived_from="I2C0" id="I2C0" location="0x40066000"/>
|
||||
<peripheralInstance derived_from="I2C1" id="I2C1" location="0x40067000"/>
|
||||
<peripheralInstance derived_from="UART0" id="UART0" location="0x4006A000"/>
|
||||
<peripheralInstance derived_from="UART1" id="UART1" location="0x4006B000"/>
|
||||
<peripheralInstance derived_from="UART2" id="UART2" location="0x4006C000"/>
|
||||
<peripheralInstance derived_from="USB0" id="USB0" location="0x40072000"/>
|
||||
<peripheralInstance derived_from="CMP0" id="CMP0" location="0x40073000"/>
|
||||
<peripheralInstance derived_from="CMP1" id="CMP1" location="0x40073008"/>
|
||||
<peripheralInstance derived_from="VREF" id="VREF" location="0x40074000"/>
|
||||
<peripheralInstance derived_from="LLWU" id="LLWU" location="0x4007C000"/>
|
||||
<peripheralInstance derived_from="PMC" id="PMC" location="0x4007D000"/>
|
||||
<peripheralInstance derived_from="SMC" id="SMC" location="0x4007E000"/>
|
||||
<peripheralInstance derived_from="RCM" id="RCM" location="0x4007F000"/>
|
||||
<peripheralInstance derived_from="GPIOA" id="GPIOA" location="0x400FF000"/>
|
||||
<peripheralInstance derived_from="GPIOB" id="GPIOB" location="0x400FF040"/>
|
||||
<peripheralInstance derived_from="GPIOC" id="GPIOC" location="0x400FF080"/>
|
||||
<peripheralInstance derived_from="GPIOD" id="GPIOD" location="0x400FF0C0"/>
|
||||
<peripheralInstance derived_from="GPIOE" id="GPIOE" location="0x400FF100"/>
|
||||
<peripheralInstance derived_from="SystemControl" id="SystemControl" location="0xE000E000"/>
|
||||
<peripheralInstance derived_from="SysTick" id="SysTick" location="0xE000E010"/>
|
||||
<peripheralInstance derived_from="NVIC" id="NVIC" location="0xE000E100"/>
|
||||
<peripheralInstance derived_from="MCM" 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.3.1</sdkVersion>
|
||||
</storageModule>
|
||||
</cproject>
|
||||
|
||||
@@ -30,6 +30,16 @@
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
<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>
|
||||
<name>bootloader-shared</name>
|
||||
<type>2</type>
|
||||
|
||||
@@ -196,21 +196,27 @@ SECTIONS
|
||||
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
||||
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 */
|
||||
.bss :
|
||||
.bss : ALIGN(4)
|
||||
{
|
||||
/* This is used by the startup in order to initialize the .bss section */
|
||||
. = ALIGN(4);
|
||||
__START_BSS = .;
|
||||
__bss_start__ = .;
|
||||
*(.bss)
|
||||
*(.bss*)
|
||||
. = ALIGN(512);
|
||||
USB_RAM_START = .;
|
||||
. += USB_RAM_GAP;
|
||||
*(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
|
||||
@@ -239,17 +245,6 @@ SECTIONS
|
||||
. += STACK_SIZE;
|
||||
} > 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 */
|
||||
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
||||
__StackLimit = __StackTop - STACK_SIZE;
|
||||
|
||||
@@ -204,21 +204,27 @@ SECTIONS
|
||||
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
||||
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 */
|
||||
.bss :
|
||||
.bss : ALIGN(4)
|
||||
{
|
||||
/* This is used by the startup in order to initialize the .bss section */
|
||||
. = ALIGN(4);
|
||||
__START_BSS = .;
|
||||
__bss_start__ = .;
|
||||
*(.bss)
|
||||
*(.bss*)
|
||||
. = ALIGN(512);
|
||||
USB_RAM_START = .;
|
||||
. += USB_RAM_GAP;
|
||||
*(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
|
||||
@@ -247,17 +253,6 @@ SECTIONS
|
||||
. += STACK_SIZE;
|
||||
} > 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 */
|
||||
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
||||
__StackLimit = __StackTop - STACK_SIZE;
|
||||
|
||||
@@ -1,49 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
||||
<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="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 type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="/uhk-l"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
<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_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug/uhk-right.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug_standalone/uhk-right.elf"/>
|
||||
<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.2081695142"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/uhk-right"/>
|
||||
</listAttribute>
|
||||
@@ -77,6 +77,6 @@
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -1,49 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
||||
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
||||
<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="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 type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="/uhk-l"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -593,9 +593,6 @@ static status_t handle_command_internal(uint8_t *packet, uint32_t packetLength)
|
||||
else
|
||||
{
|
||||
#if FIXED_BUSPAL_BOOTLOADER
|
||||
size_t offset;
|
||||
int res;
|
||||
|
||||
status = kStatus_Success; /* set default */
|
||||
res = WaitForStartByte(rxBuf, &offset);
|
||||
if (res==1 && offset==1)
|
||||
|
||||
@@ -110,7 +110,7 @@ status_t serial_packet_read(const peripheral_descriptor_t *self,
|
||||
|
||||
// Receive the framing data packet.
|
||||
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)
|
||||
{
|
||||
// No packet available.
|
||||
|
||||
@@ -3,7 +3,4 @@
|
||||
|
||||
// Macros:
|
||||
|
||||
#define I2C_WATCHDOG
|
||||
// #define LED_DRIVER_STRESS_TEST
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,10 +6,13 @@ static uint8_t hardwareConfig[HARDWARE_CONFIG_SIZE];
|
||||
static uint8_t ATTR_DATA2 stagingUserConfig[USER_CONFIG_SIZE];
|
||||
static uint8_t validatedUserConfig[USER_CONFIG_SIZE];
|
||||
|
||||
uint16_t ValidatedUserConfigLength;
|
||||
config_buffer_t HardwareConfigBuffer = { hardwareConfig };
|
||||
config_buffer_t StagingUserConfigBuffer = { stagingUserConfig };
|
||||
config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
|
||||
|
||||
hardware_config_t *HardwareConfig = (hardware_config_t*)hardwareConfig;
|
||||
|
||||
bool ParserRunDry;
|
||||
|
||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId)
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
#include "fsl_common.h"
|
||||
#include "basic_types.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define HARDWARE_CONFIG_SIGNATURE_LENGTH 3
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
@@ -14,14 +18,29 @@
|
||||
ConfigBufferId_ValidatedUserConfig,
|
||||
} 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:
|
||||
|
||||
extern bool ParserRunDry;
|
||||
extern uint16_t ValidatedUserConfigLength;
|
||||
extern config_buffer_t HardwareConfigBuffer;
|
||||
extern config_buffer_t StagingUserConfigBuffer;
|
||||
extern config_buffer_t ValidatedUserConfigBuffer;
|
||||
extern hardware_config_t *HardwareConfig;
|
||||
|
||||
// Functions:
|
||||
// Functions:
|
||||
|
||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
|
||||
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "led_display.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "slave_drivers/is31fl3731_driver.h"
|
||||
#include "config.h"
|
||||
|
||||
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
|
||||
{
|
||||
@@ -50,11 +51,11 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
const char *deviceName = ReadString(buffer, &len);
|
||||
uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
|
||||
|
||||
(void)userConfigLength;
|
||||
(void)dataModelMajorVersion;
|
||||
(void)dataModelMinorVersion;
|
||||
(void)dataModelPatchVersion;
|
||||
(void)deviceName;
|
||||
(void)doubleTapSwitchLayerTimeout;
|
||||
|
||||
// LED brightness
|
||||
|
||||
@@ -135,15 +136,17 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
// If parsing succeeded then apply the parsed values.
|
||||
|
||||
if (!ParserRunDry) {
|
||||
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
||||
// DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
||||
|
||||
// Update LED brightnesses and reinitialize LED drivers
|
||||
|
||||
ValidatedUserConfigLength = userConfigLength;
|
||||
|
||||
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
|
||||
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
||||
KeyBacklightBrightness = keyBacklightBrightness;
|
||||
Slaves[SlaveId_LeftLedDriver].isConnected = false;
|
||||
Slaves[SlaveId_RightLedDriver].isConnected = false;
|
||||
|
||||
LedSlaveDriver_UpdateLeds();
|
||||
|
||||
// Update mouse key speeds
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
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->switchLayer.layer = layer;
|
||||
@@ -75,7 +75,7 @@ static parser_error_t parsePlayMacroAction(key_action_t *keyAction, config_buffe
|
||||
if (macroIndex >= tempMacroCount) {
|
||||
return ParserError_InvalidSerializedPlayMacroAction;
|
||||
}
|
||||
keyAction->type = KeyActionType_SwitchKeymap;
|
||||
keyAction->type = KeyActionType_PlayMacro;
|
||||
keyAction->playMacro.macroId = macroIndex;
|
||||
return ParserError_Success;
|
||||
}
|
||||
@@ -196,4 +196,3 @@ parser_error_t ParseKeymap(config_buffer_t *buffer, uint8_t keymapIdx, uint8_t k
|
||||
}
|
||||
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 action = keyMacroType & 0b11;
|
||||
uint8_t type;
|
||||
uint8_t scancode;
|
||||
uint16_t scancode = 0;
|
||||
uint8_t modifierMask;
|
||||
|
||||
keyMacroType >>= 2;
|
||||
type = keyMacroType & 0b11;
|
||||
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;
|
||||
macroAction->type = MacroActionType_Key;
|
||||
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)
|
||||
{
|
||||
int16_t delay = ReadInt16(buffer);
|
||||
uint16_t delay = ReadUInt16(buffer);
|
||||
|
||||
macroAction->type = MacroActionType_Delay;
|
||||
macroAction->delay.delay = delay;
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
#include "config_parser/config_globals.h"
|
||||
#include "buffer.h"
|
||||
|
||||
bool IsEepromBusy;
|
||||
volatile bool IsEepromBusy;
|
||||
static eeprom_operation_t CurrentEepromOperation;
|
||||
static config_buffer_id_t CurrentConfigBufferId;
|
||||
status_t LastEepromTransferStatus;
|
||||
static status_t LastEepromTransferStatus;
|
||||
void (*SuccessCallback)(void);
|
||||
|
||||
static i2c_master_handle_t i2cHandle;
|
||||
@@ -94,14 +94,14 @@ void EEPROM_Init(void)
|
||||
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) {
|
||||
return kStatus_I2C_Busy;
|
||||
}
|
||||
|
||||
CurrentEepromOperation = operation;
|
||||
CurrentConfigBufferId = config_buffer_id;
|
||||
CurrentConfigBufferId = configBufferId;
|
||||
SuccessCallback = successCallback;
|
||||
|
||||
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
|
||||
@@ -117,7 +117,8 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
|
||||
case EepromOperation_Write:
|
||||
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;
|
||||
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();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -24,8 +24,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsEepromBusy;
|
||||
extern status_t EepromTransferStatus;
|
||||
extern volatile bool IsEepromBusy;
|
||||
|
||||
// Functions:
|
||||
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
#define I2C_MAIN_BUS_BASEADDR I2C0
|
||||
#define I2C_MAIN_BUS_IRQ_ID I2C0_IRQn
|
||||
#define I2C_MAIN_BUS_CLK_SRC I2C0_CLK_SRC
|
||||
#define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable.
|
||||
#define I2C_MAIN_BUS_NORMAL_BAUD_RATE 100000
|
||||
#define I2C_MAIN_BUS_BUSPAL_BAUD_RATE 30000
|
||||
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7
|
||||
|
||||
#define I2C_MAIN_BUS_SDA_GPIO GPIOD
|
||||
@@ -34,10 +35,12 @@
|
||||
#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_SDA_GPIO GPIOC
|
||||
#define I2C_EEPROM_BUS_SDA_PORT PORTC
|
||||
#define I2C_EEPROM_BUS_SDA_CLOCK kCLOCK_PortC
|
||||
#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_CLOCK kCLOCK_PortC
|
||||
#define I2C_EEPROM_BUS_SCL_PIN 10
|
||||
|
||||
25
right/src/i2c_error_logger.c
Normal file
25
right/src/i2c_error_logger.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "fsl_i2c.h"
|
||||
#include "i2c_error_logger.h"
|
||||
|
||||
i2c_slave_error_counter_t I2cSlaveErrorCounters[MAX_SLAVE_COUNT];
|
||||
|
||||
void LogI2cError(uint8_t slaveId, status_t status)
|
||||
{
|
||||
i2c_slave_error_counter_t *i2cSlaveErrorCounter = I2cSlaveErrorCounters + slaveId;
|
||||
uint8_t errorIdx;
|
||||
|
||||
for (errorIdx=0; errorIdx<i2cSlaveErrorCounter->errorTypeCount; errorIdx++) {
|
||||
i2c_error_count_t *currentI2cError = i2cSlaveErrorCounter->errors + errorIdx;
|
||||
if (currentI2cError->status == status) {
|
||||
currentI2cError->count++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (errorIdx == i2cSlaveErrorCounter->errorTypeCount && errorIdx < MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE) {
|
||||
i2cSlaveErrorCounter->errorTypeCount++;
|
||||
i2c_error_count_t *currentI2cError = i2cSlaveErrorCounter->errors + errorIdx;
|
||||
currentI2cError->status = status;
|
||||
currentI2cError->count = 1;
|
||||
}
|
||||
}
|
||||
33
right/src/i2c_error_logger.h
Normal file
33
right/src/i2c_error_logger.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef __I2C_ERROR_LOGGER_H__
|
||||
#define __I2C_ERROR_LOGGER_H__
|
||||
|
||||
// Includes:
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "slave_scheduler.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE 7
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef struct {
|
||||
status_t status;
|
||||
uint32_t count;
|
||||
} i2c_error_count_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t errorTypeCount;
|
||||
i2c_error_count_t errors[MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE];
|
||||
} i2c_slave_error_counter_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
extern i2c_slave_error_counter_t I2cSlaveErrorCounters[MAX_SLAVE_COUNT];
|
||||
|
||||
// Functions:
|
||||
|
||||
void LogI2cError(uint8_t slaveId, status_t status);
|
||||
|
||||
#endif
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "fsl_gpio.h"
|
||||
#include "i2c.h"
|
||||
#include "i2c_watchdog.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "init_peripherals.h"
|
||||
|
||||
uint32_t I2cWatchdog_WatchCounter;
|
||||
@@ -19,17 +18,13 @@ static uint32_t prevWatchdogCounter;
|
||||
void PIT_I2C_WATCHDOG_HANDLER(void)
|
||||
{
|
||||
I2cWatchdog_WatchCounter++;
|
||||
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there haven't been any interrupts recently
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
i2c_master_config_t masterConfig;
|
||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
||||
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
|
||||
InitI2cMainBus();
|
||||
InitSlaveScheduler();
|
||||
ReinitI2cMainBus();
|
||||
}
|
||||
|
||||
prevWatchdogCounter = I2C_Watchdog;
|
||||
|
||||
PIT_ClearStatusFlags(PIT, PIT_I2C_WATCHDOG_CHANNEL, PIT_TFLG_TIF_MASK);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,119 +12,149 @@
|
||||
#include "init_peripherals.h"
|
||||
#include "eeprom.h"
|
||||
#include "timer.h"
|
||||
#include "key_debouncer.h"
|
||||
#include "usb_api.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
|
||||
void InitInterruptPriorities(void)
|
||||
{
|
||||
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
|
||||
NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 3);
|
||||
NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 3);
|
||||
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 3);
|
||||
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 3);
|
||||
NVIC_SetPriority(USB_IRQ_ID, 3);
|
||||
bool IsBusPalOn;
|
||||
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
|
||||
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) {
|
||||
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
|
||||
if (IsBusPalOn) {
|
||||
Wormhole.magicNumber = 0;
|
||||
I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_BUSPAL_BAUD_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
void delay(void)
|
||||
static void initInterruptPriorities(void)
|
||||
{
|
||||
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0);
|
||||
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3);
|
||||
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 4);
|
||||
NVIC_SetPriority(USB_IRQ_ID, 4);
|
||||
}
|
||||
|
||||
static void delay(void)
|
||||
{
|
||||
for (volatile uint32_t i=0; i<62; i++);
|
||||
}
|
||||
|
||||
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(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio);
|
||||
GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
||||
PORT_SetPinMux(i2cBus->sdaPort, i2cBus->sdaPin, kPORT_MuxAsGpio);
|
||||
PORT_SetPinMux(i2cBus->sclPort, i2cBus->sclPin, kPORT_MuxAsGpio);
|
||||
GPIO_PinInit(i2cBus->sclGpio, i2cBus->sclPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
||||
|
||||
bool isOn = true;
|
||||
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});
|
||||
bool isSdaHigh = GPIO_ReadPinInput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN);
|
||||
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_DigitalInput});
|
||||
bool isSdaHigh = GPIO_ReadPinInput(i2cBus->sdaGpio, i2cBus->sdaPin);
|
||||
GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
||||
|
||||
if (isSdaHigh) {
|
||||
return;
|
||||
}
|
||||
|
||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, isOn);
|
||||
GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, isOn);
|
||||
delay();
|
||||
isOn = !isOn;
|
||||
}
|
||||
|
||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0);
|
||||
GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 0);
|
||||
delay();
|
||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1);
|
||||
GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, 1);
|
||||
delay();
|
||||
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1);
|
||||
GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 1);
|
||||
delay();
|
||||
}
|
||||
|
||||
void InitI2cMainBus(void)
|
||||
static void initI2cBus(i2c_bus_t *i2cBus)
|
||||
{
|
||||
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK);
|
||||
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK);
|
||||
CLOCK_EnableClock(i2cBus->sdaClock);
|
||||
CLOCK_EnableClock(i2cBus->sclClock);
|
||||
|
||||
recoverI2c();
|
||||
recoverI2cBus(i2cBus);
|
||||
|
||||
port_pin_config_t pinConfig = {
|
||||
.pullSelect = kPORT_PullUp,
|
||||
.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(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, &pinConfig);
|
||||
PORT_SetPinConfig(i2cBus->sdaPort, i2cBus->sdaPin, &pinConfig);
|
||||
PORT_SetPinConfig(i2cBus->sclPort, i2cBus->sclPin, &pinConfig);
|
||||
|
||||
i2c_master_config_t masterConfig;
|
||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
||||
masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE;
|
||||
uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC);
|
||||
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock);
|
||||
masterConfig.baudRate_Bps = i2cBus == &i2cMainBus ? I2cMainBusRequestedBaudRateBps : I2C_EEPROM_BUS_BAUD_RATE;
|
||||
uint32_t sourceClock = CLOCK_GetFreq(i2cBus->clockSrc);
|
||||
I2C_MasterInit(i2cBus->baseAddr, &masterConfig, sourceClock);
|
||||
|
||||
if (i2cBus == &i2cMainBus) {
|
||||
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
|
||||
}
|
||||
}
|
||||
|
||||
void initI2cEepromBus(void)
|
||||
void ReinitI2cMainBus(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);
|
||||
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
|
||||
initI2cBus(&i2cMainBus);
|
||||
InitSlaveScheduler();
|
||||
}
|
||||
|
||||
void InitI2c(void)
|
||||
static void initI2c(void)
|
||||
{
|
||||
InitI2cMainBus();
|
||||
initI2cEepromBus();
|
||||
initI2cBus(&i2cMainBus);
|
||||
initI2cBus(&i2cEepromBus);
|
||||
}
|
||||
|
||||
void InitPeripherals(void)
|
||||
{
|
||||
InitInterruptPriorities();
|
||||
initBusPalState();
|
||||
initInterruptPriorities();
|
||||
Timer_Init();
|
||||
InitLedDriver();
|
||||
InitResetButton();
|
||||
InitMergeSensor();
|
||||
ADC_Init();
|
||||
InitI2c();
|
||||
InitTestLed();
|
||||
initI2c();
|
||||
TestLed_Init();
|
||||
LedPwm_Init();
|
||||
#ifdef I2C_WATCHDOG
|
||||
InitI2cWatchdog();
|
||||
#endif
|
||||
InitKeyDebouncer();
|
||||
EEPROM_Init();
|
||||
}
|
||||
|
||||
@@ -1,13 +1,37 @@
|
||||
#ifndef __INIT_PERIPHERALS_H__
|
||||
#define __INIT_PERIPHERALS_H__
|
||||
|
||||
// Includes
|
||||
// Includes:
|
||||
|
||||
#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:
|
||||
|
||||
extern bool IsBusPalOn;
|
||||
extern volatile uint32_t I2cMainBusRequestedBaudRateBps;
|
||||
extern volatile uint32_t I2cMainBusActualBaudRateBps;
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitPeripherals(void);
|
||||
void InitI2cMainBus(void);
|
||||
void ReinitI2cMainBus(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
KeyActionType_SwitchLayer,
|
||||
KeyActionType_SwitchKeymap,
|
||||
KeyActionType_PlayMacro,
|
||||
KeyActionType_Test,
|
||||
} key_action_type_t;
|
||||
|
||||
typedef enum {
|
||||
@@ -29,9 +28,9 @@
|
||||
} keystroke_type_t;
|
||||
|
||||
typedef enum {
|
||||
SwitchLayerMode_Hold,
|
||||
SwitchLayerMode_HoldAndDoubleTapToggle,
|
||||
SwitchLayerMode_Toggle,
|
||||
SwitchLayerMode_Hold,
|
||||
} switch_layer_mode_t;
|
||||
|
||||
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 10
|
||||
|
||||
// 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:
|
||||
|
||||
typedef struct {
|
||||
bool previous;
|
||||
bool current;
|
||||
bool suppressed;
|
||||
uint8_t debounceCounter;
|
||||
uint8_t timestamp;
|
||||
bool previous : 1;
|
||||
bool current : 1;
|
||||
bool suppressed : 1;
|
||||
bool debouncing : 1;
|
||||
} key_state_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
@@ -6,17 +6,36 @@
|
||||
#include "config_parser/config_globals.h"
|
||||
#include "macros.h"
|
||||
|
||||
keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = { { "FTY", 0, 3 } };
|
||||
keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = {
|
||||
{
|
||||
.abbreviation = "FTY",
|
||||
.offset = 0,
|
||||
.abbreviationLen = 3
|
||||
}
|
||||
};
|
||||
|
||||
uint8_t AllKeymapsCount;
|
||||
uint8_t DefaultKeymapIndex;
|
||||
uint8_t CurrentKeymapIndex = 0;
|
||||
|
||||
void SwitchKeymap(uint8_t index)
|
||||
void SwitchKeymapById(uint8_t index)
|
||||
{
|
||||
CurrentKeymapIndex = index;
|
||||
ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset;
|
||||
ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount);
|
||||
LedDisplay_SetCurrentKeymapText();
|
||||
LedDisplay_UpdateText();
|
||||
}
|
||||
|
||||
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev)
|
||||
{
|
||||
for (uint8_t i=0; i<AllKeymapsCount; i++) {
|
||||
keymap_reference_t *keymap = AllKeymaps + i;
|
||||
if (keymap->abbreviationLen == length && memcmp(keymap->abbreviation, abbrev, length) == 0) {
|
||||
SwitchKeymapById(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// The factory keymap is initialized before it gets overwritten by the default keymap of the EEPROM.
|
||||
@@ -109,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_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
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_CONTROL }},
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
|
||||
@@ -157,7 +272,7 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = HID_KEYBOARD_SC_MENU },
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_APPLICATION }},
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_RIGHT_SHIFT }},
|
||||
{ .type = KeyActionType_None },
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void SwitchKeymap(uint8_t index);
|
||||
void SwitchKeymapById(uint8_t index);
|
||||
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
#include "keymap.h"
|
||||
|
||||
static bool heldLayers[LAYER_COUNT];
|
||||
static switch_layer_mode_t pressedLayers[LAYER_COUNT];
|
||||
static bool toggledLayers[LAYER_COUNT];
|
||||
|
||||
void updateLayerStates(void)
|
||||
{
|
||||
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 keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
||||
@@ -20,9 +20,8 @@ void updateLayerStates(void)
|
||||
if (action.type == KeyActionType_SwitchLayer) {
|
||||
if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
|
||||
heldLayers[action.switchLayer.layer] = true;
|
||||
}
|
||||
if (action.switchLayer.mode != SwitchLayerMode_Hold && !keyState->previous && keyState->current) {
|
||||
pressedLayers[action.switchLayer.layer] = action.switchLayer.mode;
|
||||
} else if (!keyState->previous) {
|
||||
toggledLayers[action.switchLayer.layer] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,11 +39,11 @@ layer_id_t GetActiveLayer()
|
||||
// Handle toggled layers
|
||||
|
||||
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
|
||||
if (pressedLayers[layerId]) {
|
||||
if (toggledLayers[layerId]) {
|
||||
if (ToggledLayer == layerId) {
|
||||
ToggledLayer = LayerId_Base;
|
||||
break;
|
||||
} else if (ToggledLayer == LayerId_Base && pressedLayers[layerId] == SwitchLayerMode_Toggle) {
|
||||
} else if (ToggledLayer == LayerId_Base && toggledLayers[layerId] == SwitchLayerMode_Toggle) {
|
||||
ToggledLayer = layerId;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
|
||||
uint8_t IconsAndLayerTextsBrightness = 0xff;
|
||||
uint8_t AlphanumericSegmentsBrightness = 0xff;
|
||||
bool ledIconStates[LedDisplayIcon_Last];
|
||||
char LedDisplay_DebugString[] = " ";
|
||||
|
||||
static const uint16_t capitalLetterToSegmentSet[] = {
|
||||
static const uint16_t capitalLetterToSegmentMap[] = {
|
||||
0b0000000011110111,
|
||||
0b0001001010001111,
|
||||
0b0000000000111001,
|
||||
@@ -35,7 +37,7 @@ static const uint16_t capitalLetterToSegmentSet[] = {
|
||||
0b0000110000001001,
|
||||
};
|
||||
|
||||
static const uint16_t digitToSegmentSet[] = {
|
||||
static const uint16_t digitToSegmentMap[] = {
|
||||
0b0000110000111111,
|
||||
0b0000010000000110,
|
||||
0b0000100010001011,
|
||||
@@ -48,13 +50,13 @@ static const uint16_t digitToSegmentSet[] = {
|
||||
0b0000000011101111,
|
||||
};
|
||||
|
||||
static uint16_t characterToSegmentSet(char character)
|
||||
static uint16_t characterToSegmentMap(char character)
|
||||
{
|
||||
switch (character) {
|
||||
case 'A' ... 'Z':
|
||||
return capitalLetterToSegmentSet[character - 'A'];
|
||||
return capitalLetterToSegmentMap[character - 'A'];
|
||||
case '0' ... '9':
|
||||
return digitToSegmentSet[character - '0'];
|
||||
return digitToSegmentMap[character - '0'];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -65,11 +67,11 @@ void LedDisplay_SetText(uint8_t length, const char* text)
|
||||
|
||||
switch (length) {
|
||||
case 3:
|
||||
allSegmentSets = (uint64_t)characterToSegmentSet(text[2]) << 28;
|
||||
allSegmentSets = (uint64_t)characterToSegmentMap(text[2]) << 28;
|
||||
case 2:
|
||||
allSegmentSets |= characterToSegmentSet(text[1]) << 14;
|
||||
allSegmentSets |= characterToSegmentMap(text[1]) << 14;
|
||||
case 1:
|
||||
allSegmentSets |= characterToSegmentSet(text[0]);
|
||||
allSegmentSets |= characterToSegmentMap(text[0]);
|
||||
}
|
||||
|
||||
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0;
|
||||
@@ -84,13 +86,7 @@ void LedDisplay_SetText(uint8_t length, const char* text)
|
||||
}
|
||||
}
|
||||
|
||||
void LedDisplay_SetCurrentKeymapText(void)
|
||||
{
|
||||
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
|
||||
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
||||
}
|
||||
|
||||
void LedDisplay_SetLayer(uint8_t layerId)
|
||||
void LedDisplay_SetLayer(layer_id_t layerId)
|
||||
{
|
||||
for (uint8_t i = 13; i <= 45; i += 16) {
|
||||
LedDriverValues[LedDriverId_Left][i] = 0;
|
||||
@@ -101,7 +97,36 @@ void LedDisplay_SetLayer(uint8_t layerId)
|
||||
}
|
||||
}
|
||||
|
||||
bool LedDisplay_GetIcon(led_display_icon_t icon)
|
||||
{
|
||||
return LedDriverValues[LedDriverId_Left][8 + icon];
|
||||
}
|
||||
|
||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
||||
{
|
||||
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||
ledIconStates[icon] = isEnabled;
|
||||
LedDriverValues[LedDriverId_Left][icon + 8] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||
}
|
||||
|
||||
void LedDisplay_UpdateIcons(void)
|
||||
{
|
||||
for (led_display_icon_t i=0; i<=LedDisplayIcon_Last; i++) {
|
||||
LedDisplay_SetIcon(i, ledIconStates[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void LedDisplay_UpdateText(void)
|
||||
{
|
||||
#if LED_DISPLAY_DEBUG_MODE == 0
|
||||
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
|
||||
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
||||
#else
|
||||
LedDisplay_SetText(strlen(LedDisplay_DebugString), LedDisplay_DebugString);
|
||||
#endif
|
||||
}
|
||||
|
||||
void LedDisplay_UpdateAll(void)
|
||||
{
|
||||
LedDisplay_UpdateIcons();
|
||||
LedDisplay_UpdateText();
|
||||
}
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "layer.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define LED_DISPLAY_DEBUG_MODE 0
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -12,18 +17,23 @@
|
||||
LedDisplayIcon_CapsLock,
|
||||
LedDisplayIcon_Agent,
|
||||
LedDisplayIcon_Adaptive,
|
||||
LedDisplayIcon_Last = LedDisplayIcon_Adaptive,
|
||||
} led_display_icon_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint8_t IconsAndLayerTextsBrightness;
|
||||
extern uint8_t AlphanumericSegmentsBrightness;
|
||||
extern char LedDisplay_DebugString[];
|
||||
|
||||
// Functions:
|
||||
|
||||
void LedDisplay_SetText(uint8_t length, const char* text);
|
||||
void LedDisplay_SetCurrentKeymapText(void);
|
||||
void LedDisplay_SetLayer(uint8_t layerId);
|
||||
void LedDisplay_SetLayer(layer_id_t layerId);
|
||||
bool LedDisplay_GetIcon(led_display_icon_t icon);
|
||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled);
|
||||
void LedDisplay_UpdateIcons(void);
|
||||
void LedDisplay_UpdateText(void);
|
||||
void LedDisplay_UpdateAll(void);
|
||||
|
||||
#endif
|
||||
|
||||
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 "config_parser/parse_macro.h"
|
||||
#include "config_parser/config_globals.h"
|
||||
#include "timer.h"
|
||||
|
||||
macro_reference_t AllMacros[MAX_MACRO_NUM];
|
||||
uint8_t AllMacrosCount;
|
||||
@@ -18,69 +19,102 @@ uint8_t characterToScancode(char character)
|
||||
{
|
||||
switch (character) {
|
||||
case 'A' ... 'Z':
|
||||
return 0;
|
||||
case 'a' ... 'z':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_A - 1 + (character & 0x1F);
|
||||
case '1' ... '9':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_1_AND_EXCLAMATION - 1 + (character & 0x0F);
|
||||
case ')':
|
||||
case '0':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS;
|
||||
case '!':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_1_AND_EXCLAMATION;
|
||||
case '@':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_2_AND_AT;
|
||||
case '#':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_3_AND_HASHMARK;
|
||||
case '$':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_4_AND_DOLLAR;
|
||||
case '%':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_5_AND_PERCENTAGE;
|
||||
case '^':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_6_AND_CARET;
|
||||
case '&':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_7_AND_AMPERSAND;
|
||||
case '*':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_8_AND_ASTERISK;
|
||||
case '(':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS;
|
||||
case '`':
|
||||
case '~':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE;
|
||||
case '[':
|
||||
case '{':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE;
|
||||
case ']':
|
||||
case '}':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE;
|
||||
case ';':
|
||||
case ':':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_SEMICOLON_AND_COLON;
|
||||
case '\'':
|
||||
case '\"':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE;
|
||||
case '+':
|
||||
case '=':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_EQUAL_AND_PLUS;
|
||||
case '\\':
|
||||
case '|':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_BACKSLASH_AND_PIPE;
|
||||
case '.':
|
||||
case '>':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN;
|
||||
case ',':
|
||||
case '<':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN;
|
||||
case '/':
|
||||
case '\?':
|
||||
return 0;
|
||||
return HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK;
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
switch (currentMacroAction.key.action) {
|
||||
case MacroSubAction_Press:
|
||||
case MacroSubAction_Tap:
|
||||
if (!pressStarted) {
|
||||
pressStarted = true;
|
||||
addModifiers(currentMacroAction.key.modifierMask);
|
||||
switch (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;
|
||||
}
|
||||
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||
return true;
|
||||
}
|
||||
pressStarted = false;
|
||||
deleteModifiers(currentMacroAction.key.modifierMask);
|
||||
switch (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;
|
||||
}
|
||||
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||
break;
|
||||
case MacroSubAction_Release:
|
||||
deleteModifiers(currentMacroAction.key.modifierMask);
|
||||
switch (currentMacroAction.key.type) {
|
||||
case KeystrokeType_Basic:
|
||||
deleteBasicScancode(currentMacroAction.key.scancode);
|
||||
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||
break;
|
||||
case KeystrokeType_Media:
|
||||
// deleteMediaScancode(currentMacroAction.key.scancode);
|
||||
break;
|
||||
case KeystrokeType_System:
|
||||
deleteSystemScancode(currentMacroAction.key.scancode);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MacroSubAction_Hold:
|
||||
case MacroSubAction_Press:
|
||||
addModifiers(currentMacroAction.key.modifierMask);
|
||||
switch (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;
|
||||
}
|
||||
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool processDelayAction(void)
|
||||
{
|
||||
static bool inDelay;
|
||||
static uint32_t delayStart;
|
||||
|
||||
if (inDelay) {
|
||||
if (Timer_GetElapsedTime(&delayStart) >= currentMacroAction.delay.delay) {
|
||||
inDelay = false;
|
||||
}
|
||||
} else {
|
||||
Timer_SetCurrentTime(&delayStart);
|
||||
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)
|
||||
{
|
||||
switch (currentMacroAction.type) {
|
||||
case MacroActionType_Delay:
|
||||
return false;
|
||||
return processDelayAction();
|
||||
case MacroActionType_Key:
|
||||
return processKeyMacroAction();
|
||||
return processKeyAction();
|
||||
case MacroActionType_MouseButton:
|
||||
return false;
|
||||
return processMouseButtonAction();
|
||||
case MacroActionType_MoveMouse:
|
||||
return false;
|
||||
return processMoveMouseAction();
|
||||
case MacroActionType_ScrollMouse:
|
||||
return false;
|
||||
return processScrollMouseAction();
|
||||
case MacroActionType_Text:
|
||||
return false;
|
||||
return processTextAction();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
} macro_reference_t;
|
||||
|
||||
typedef enum {
|
||||
MacroSubAction_Tap,
|
||||
MacroSubAction_Press,
|
||||
MacroSubAction_Hold,
|
||||
MacroSubAction_Release,
|
||||
} macro_sub_action_t;
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
struct {
|
||||
macro_sub_action_t action;
|
||||
keystroke_type_t type;
|
||||
uint8_t scancode;
|
||||
uint16_t scancode;
|
||||
uint8_t modifierMask;
|
||||
} ATTR_PACKED key;
|
||||
struct {
|
||||
@@ -55,7 +55,7 @@
|
||||
int16_t y;
|
||||
} ATTR_PACKED scrollMouse;
|
||||
struct {
|
||||
int16_t delay;
|
||||
uint16_t delay;
|
||||
} ATTR_PACKED delay;
|
||||
struct {
|
||||
const char *text;
|
||||
|
||||
@@ -5,44 +5,45 @@
|
||||
#include "slave_scheduler.h"
|
||||
#include "bus_pal_hardware.h"
|
||||
#include "command.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
#include "eeprom.h"
|
||||
#include "key_scanner.h"
|
||||
#include "right_key_matrix.h"
|
||||
#include "usb_commands/usb_command_apply_config.h"
|
||||
#include "peripherals/reset_button.h"
|
||||
#include "config_parser/config_globals.h"
|
||||
#include "usb_report_updater.h"
|
||||
|
||||
bool IsEepromInitialized = false;
|
||||
bool IsConfigInitialized = false;
|
||||
static bool IsEepromInitialized = false;
|
||||
static bool IsConfigInitialized = false;
|
||||
|
||||
void userConfigurationReadFinished(void)
|
||||
static void userConfigurationReadFinished(void)
|
||||
{
|
||||
IsEepromInitialized = true;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
void main(void)
|
||||
int main(void)
|
||||
{
|
||||
InitClock();
|
||||
InitPeripherals();
|
||||
|
||||
if (!RESET_BUTTON_IS_PRESSED) {
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
|
||||
}
|
||||
IsFactoryResetModeEnabled = RESET_BUTTON_IS_PRESSED;
|
||||
|
||||
if (Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal) {
|
||||
Wormhole.magicNumber = 0;
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
|
||||
|
||||
if (IsBusPalOn) {
|
||||
init_hardware();
|
||||
handleUsbBusPalCommand();
|
||||
} else {
|
||||
InitSlaveScheduler();
|
||||
KeyMatrix_Init(&RightKeyMatrix);
|
||||
InitKeyScanner();
|
||||
UpdateUsbReports();
|
||||
InitUsb();
|
||||
|
||||
while (1) {
|
||||
@@ -50,6 +51,8 @@ void main(void)
|
||||
UsbCommand_ApplyConfig();
|
||||
IsConfigInitialized = true;
|
||||
}
|
||||
KeyMatrix_ScanRow(&RightKeyMatrix);
|
||||
++MatrixScanCounter;
|
||||
UpdateUsbReports();
|
||||
__WFI();
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "fsl_port.h"
|
||||
#include "peripherals/adc.h"
|
||||
|
||||
adc16_channel_config_t adc16ChannelConfigStruct;
|
||||
static adc16_channel_config_t adc16ChannelConfigStruct;
|
||||
|
||||
void ADC_Init(void)
|
||||
{
|
||||
|
||||
@@ -17,12 +17,4 @@
|
||||
#define PIT_TIMER_IRQ_ID PIT1_IRQn
|
||||
#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
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#include "fsl_port.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
|
||||
bool IsFactoryResetModeEnabled = false;
|
||||
|
||||
void RESET_BUTTON_IRQ_HANDLER(void)
|
||||
{
|
||||
Wormhole.magicNumber = WORMHOLE_MAGIC_NUMBER;
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
|
||||
#define RESET_BUTTON_IS_PRESSED !GPIO_ReadPinInput(RESET_BUTTON_GPIO, RESET_BUTTON_PIN)
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsFactoryResetModeEnabled;
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitResetButton(void);
|
||||
|
||||
@@ -1,10 +1,31 @@
|
||||
#include "test_led.h"
|
||||
#include "fsl_port.h"
|
||||
#include "timer.h"
|
||||
|
||||
void InitTestLed(void)
|
||||
void TestLed_Init(void)
|
||||
{
|
||||
CLOCK_EnableClock(TEST_LED_CLOCK);
|
||||
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});
|
||||
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_GPIO_PIN 7U
|
||||
|
||||
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
||||
#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))
|
||||
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
||||
static inline void TestLed_On(void)
|
||||
{
|
||||
GPIO_SetPinsOutput(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:
|
||||
|
||||
void InitTestLed(void);
|
||||
void TestLed_Init(void);
|
||||
void TestLed_Blink(uint8_t times);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#include "right_key_matrix.h"
|
||||
|
||||
uint32_t MatrixScanCounter;
|
||||
|
||||
key_matrix_t RightKeyMatrix = {
|
||||
.colNum = RIGHT_KEY_MATRIX_COLS_NUM,
|
||||
.rowNum = RIGHT_KEY_MATRIX_ROWS_NUM,
|
||||
|
||||
@@ -14,5 +14,6 @@
|
||||
// Variables:
|
||||
|
||||
extern key_matrix_t RightKeyMatrix;
|
||||
extern uint32_t MatrixScanCounter;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -62,6 +62,22 @@ static uint8_t setShutdownModeNormalBuffer[] = {LED_DRIVER_REGISTER_SHUTDOWN, SH
|
||||
static uint8_t setFrame1Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1};
|
||||
static uint8_t updatePwmRegistersBuffer[PWM_REGISTER_BUFFER_LENGTH];
|
||||
|
||||
void LedSlaveDriver_DisableLeds(void)
|
||||
{
|
||||
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
|
||||
memset(LedDriverValues[ledDriverId], 0, LED_DRIVER_LED_COUNT);
|
||||
}
|
||||
}
|
||||
|
||||
void LedSlaveDriver_UpdateLeds(void)
|
||||
{
|
||||
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
|
||||
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
|
||||
}
|
||||
|
||||
LedDisplay_UpdateAll();
|
||||
}
|
||||
|
||||
void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
{
|
||||
if (ledDriverId == ISO_KEY_LED_DRIVER_ID && IS_ISO) {
|
||||
@@ -74,10 +90,7 @@ void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
|
||||
|
||||
if (ledDriverId == LedDriverId_Left) {
|
||||
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, false);
|
||||
LedDisplay_SetIcon(LedDisplayIcon_Agent, false);
|
||||
LedDisplay_SetIcon(LedDisplayIcon_Adaptive, false);
|
||||
LedDisplay_SetCurrentKeymapText();
|
||||
LedDisplay_UpdateAll();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,10 +131,8 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
*ledIndex += chunkSize;
|
||||
if (*ledIndex >= LED_DRIVER_LED_COUNT) {
|
||||
*ledIndex = 0;
|
||||
#ifndef LED_DRIVER_STRESS_TEST
|
||||
memcpy(currentLedDriverState->targetLedValues, ledValues, LED_DRIVER_LED_COUNT);
|
||||
*ledDriverPhase = LedDriverPhase_UpdateChangedLedValues;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case LedDriverPhase_UpdateChangedLedValues: {
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
typedef enum {
|
||||
LedDriverId_Right,
|
||||
LedDriverId_Left,
|
||||
LedDriverId_Last = LedDriverId_Left,
|
||||
} led_driver_id_t;
|
||||
|
||||
typedef enum {
|
||||
@@ -49,6 +50,8 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void LedSlaveDriver_DisableLeds(void);
|
||||
void LedSlaveDriver_UpdateLeds(void);
|
||||
void LedSlaveDriver_Init(uint8_t ledDriverId);
|
||||
status_t LedSlaveDriver_Update(uint8_t ledDriverId);
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
kboot_driver_state_t KbootDriverState;
|
||||
|
||||
static uint8_t rxBuffer[MAX_KBOOT_COMMAND_LENGTH];
|
||||
static uint8_t rxBuffer[KBOOT_PACKAGE_MAX_LENGTH];
|
||||
static uint8_t pingCommand[] = {0x5a, 0xa6};
|
||||
static uint8_t resetCommand[] = {0x5a, 0xa4, 0x04, 0x00, 0x6f, 0x46, 0x0b, 0x00, 0x00, 0x00};
|
||||
static uint8_t ackMessage[] = {0x5a, 0xa1};
|
||||
@@ -27,50 +27,52 @@ status_t KbootSlaveDriver_Update(uint8_t kbootInstanceId)
|
||||
{
|
||||
status_t status = kStatus_Uhk_IdleSlave;
|
||||
|
||||
switch (KbootDriverState.commandType) {
|
||||
switch (KbootDriverState.command) {
|
||||
case KbootCommand_Idle:
|
||||
break;
|
||||
case KbootCommand_Ping:
|
||||
switch (KbootDriverState.phase) {
|
||||
case 0:
|
||||
case KbootPhase_SendPing:
|
||||
status = tx(pingCommand, sizeof(pingCommand));
|
||||
KbootDriverState.phase++;
|
||||
KbootDriverState.phase = KbootPhase_CheckPingStatus;
|
||||
break;
|
||||
case 1:
|
||||
case KbootPhase_CheckPingStatus:
|
||||
KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus;
|
||||
KbootDriverState.phase = KbootDriverState.status == kStatus_Success ? 2 : 0;
|
||||
return kStatus_Uhk_NoTransfer;
|
||||
case 2:
|
||||
status = rx(10);
|
||||
KbootDriverState.phase++;
|
||||
KbootDriverState.phase = KbootDriverState.status == kStatus_Success
|
||||
? KbootPhase_ReceivePingResponse
|
||||
: KbootPhase_SendPing;
|
||||
return kStatus_Uhk_IdleCycle;
|
||||
case KbootPhase_ReceivePingResponse:
|
||||
status = rx(KBOOT_PACKAGE_LENGTH_PING_RESPONSE);
|
||||
KbootDriverState.phase = KbootPhase_CheckPingResponseStatus;
|
||||
break;
|
||||
case 3:
|
||||
case KbootPhase_CheckPingResponseStatus:
|
||||
KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus;
|
||||
if (KbootDriverState.status == kStatus_Success) {
|
||||
KbootDriverState.commandType = KbootCommand_Idle;
|
||||
KbootDriverState.command = KbootCommand_Idle;
|
||||
} else {
|
||||
KbootDriverState.phase = 0;
|
||||
return kStatus_Uhk_NoTransfer;
|
||||
KbootDriverState.phase = KbootPhase_SendPing;
|
||||
return kStatus_Uhk_IdleCycle;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KbootCommand_Reset:
|
||||
switch (KbootDriverState.phase) {
|
||||
case 0:
|
||||
case KbootPhase_SendReset:
|
||||
status = tx(resetCommand, sizeof(resetCommand));
|
||||
KbootDriverState.phase++;
|
||||
KbootDriverState.phase = KbootPhase_ReceiveResetAck;
|
||||
break;
|
||||
case 1:
|
||||
status = rx(2);
|
||||
KbootDriverState.phase++;
|
||||
case KbootPhase_ReceiveResetAck:
|
||||
status = rx(KBOOT_PACKAGE_LENGTH_ACK);
|
||||
KbootDriverState.phase = KbootPhase_ReceiveResetGenericResponse;
|
||||
break;
|
||||
case 2:
|
||||
status = rx(18);
|
||||
KbootDriverState.phase++;
|
||||
case KbootPhase_ReceiveResetGenericResponse:
|
||||
status = rx(KBOOT_PACKAGE_LENGTH_GENERIC_RESPONSE);
|
||||
KbootDriverState.phase = KbootPhase_CheckResetSendAck;
|
||||
break;
|
||||
case 3:
|
||||
case KbootPhase_CheckResetSendAck:
|
||||
status = tx(ackMessage, sizeof(ackMessage));
|
||||
KbootDriverState.commandType = KbootCommand_Idle;
|
||||
KbootDriverState.command = KbootCommand_Idle;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -7,7 +7,10 @@
|
||||
|
||||
// Macros:
|
||||
|
||||
#define MAX_KBOOT_COMMAND_LENGTH 32
|
||||
#define KBOOT_PACKAGE_MAX_LENGTH 32
|
||||
#define KBOOT_PACKAGE_LENGTH_PING_RESPONSE 10
|
||||
#define KBOOT_PACKAGE_LENGTH_ACK 2
|
||||
#define KBOOT_PACKAGE_LENGTH_GENERIC_RESPONSE 18
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -21,8 +24,22 @@
|
||||
KbootCommand_Reset,
|
||||
} kboot_command_t;
|
||||
|
||||
typedef enum {
|
||||
KbootPhase_SendPing,
|
||||
KbootPhase_CheckPingStatus,
|
||||
KbootPhase_ReceivePingResponse,
|
||||
KbootPhase_CheckPingResponseStatus,
|
||||
} kboot_ping_phase_t;
|
||||
|
||||
typedef enum {
|
||||
KbootPhase_SendReset,
|
||||
KbootPhase_ReceiveResetAck,
|
||||
KbootPhase_ReceiveResetGenericResponse,
|
||||
KbootPhase_CheckResetSendAck,
|
||||
} kboot_reset_phase_t;
|
||||
|
||||
typedef struct {
|
||||
kboot_command_t commandType;
|
||||
kboot_command_t command;
|
||||
uint8_t i2cAddress;
|
||||
uint8_t phase;
|
||||
uint32_t status;
|
||||
|
||||
@@ -69,6 +69,13 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
|
||||
switch (*uhkModulePhase) {
|
||||
|
||||
// Jump to bootloader
|
||||
case UhkModulePhase_JumpToBootloader:
|
||||
txMessage.data[0] = SlaveCommand_JumpToBootloader;
|
||||
txMessage.length = 1;
|
||||
status = tx(i2cAddress);
|
||||
break;
|
||||
|
||||
// Sync communication
|
||||
case UhkModulePhase_RequestSync:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
@@ -84,32 +91,54 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
case UhkModulePhase_ProcessSync: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
bool isSyncValid = memcmp(rxMessage->data, SlaveSyncString, SLAVE_SYNC_STRING_LENGTH) == 0;
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isSyncValid && isMessageValid
|
||||
? UhkModulePhase_RequestProtocolVersion
|
||||
? UhkModulePhase_RequestModuleProtocolVersion
|
||||
: UhkModulePhase_RequestSync;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get protocol version
|
||||
case UhkModulePhase_RequestProtocolVersion:
|
||||
// Get module protocol version
|
||||
case UhkModulePhase_RequestModuleProtocolVersion:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_ProtocolVersion;
|
||||
txMessage.data[1] = SlaveProperty_ModuleProtocolVersion;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveProtocolVersion;
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleProtocolVersion;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveProtocolVersion:
|
||||
case UhkModulePhase_ReceiveModuleProtocolVersion:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessProtocolVersion;
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleProtocolVersion;
|
||||
break;
|
||||
case UhkModulePhase_ProcessProtocolVersion: {
|
||||
case UhkModulePhase_ProcessModuleProtocolVersion: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->protocolVersion = rxMessage->data[0];
|
||||
memcpy(&uhkModuleState->moduleProtocolVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestProtocolVersion;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestFirmwareVersion : UhkModulePhase_RequestModuleProtocolVersion;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get firmware version
|
||||
case UhkModulePhase_RequestFirmwareVersion:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_FirmwareVersion;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveFirmwareVersion;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveFirmwareVersion:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessFirmwareVersion;
|
||||
break;
|
||||
case UhkModulePhase_ProcessFirmwareVersion: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->firmwareVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestFirmwareVersion;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -130,30 +159,52 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->moduleId = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleFeatures : UhkModulePhase_RequestModuleId;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleKeyCount : UhkModulePhase_RequestModuleId;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get module features
|
||||
case UhkModulePhase_RequestModuleFeatures:
|
||||
// Get module key count
|
||||
case UhkModulePhase_RequestModuleKeyCount:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_Features;
|
||||
txMessage.data[1] = SlaveProperty_KeyCount;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleFeatures;
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleKeyCount;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveModuleFeatures:
|
||||
case UhkModulePhase_ReceiveModuleKeyCount:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleFeatures;
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleKeyCount;
|
||||
break;
|
||||
case UhkModulePhase_ProcessModuleFeatures: {
|
||||
case UhkModulePhase_ProcessModuleKeyCount: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t));
|
||||
uhkModuleState->keyCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModuleFeatures;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModulePointerCount : UhkModulePhase_RequestModuleKeyCount;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get module pointer count
|
||||
case UhkModulePhase_RequestModulePointerCount:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_PointerCount;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModulePointerCount;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveModulePointerCount:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModulePointerCount;
|
||||
break;
|
||||
case UhkModulePhase_ProcessModulePointerCount: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->pointerCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModulePointerCount;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -171,32 +222,19 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
case UhkModulePhase_ProcessKeystates:
|
||||
if (CRC16_IsMessageValid(rxMessage)) {
|
||||
uint8_t slotId = uhkModuleDriverId + 1;
|
||||
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->features.keyCount);
|
||||
for (uint8_t keyId=0; keyId<uhkModuleState->features.keyCount; keyId++) {
|
||||
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->keyCount);
|
||||
for (uint8_t keyId=0; keyId<uhkModuleState->keyCount; keyId++) {
|
||||
KeyStates[slotId][keyId].current = keyStatesBuffer[keyId];
|
||||
}
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = UhkModulePhase_JumpToBootloader;
|
||||
break;
|
||||
|
||||
// Jump to bootloader
|
||||
case UhkModulePhase_JumpToBootloader:
|
||||
if (uhkModuleState->jumpToBootloader) {
|
||||
txMessage.data[0] = SlaveCommand_JumpToBootloader;
|
||||
txMessage.length = 1;
|
||||
status = tx(i2cAddress);
|
||||
uhkModuleState->jumpToBootloader = false;
|
||||
} else {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
}
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = UhkModulePhase_SetTestLed;
|
||||
break;
|
||||
|
||||
// Set test LED
|
||||
case UhkModulePhase_SetTestLed:
|
||||
if (uhkModuleSourceVars->isTestLedOn == uhkModuleTargetVars->isTestLedOn) {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
} else {
|
||||
txMessage.data[0] = SlaveCommand_SetTestLed;
|
||||
txMessage.data[1] = uhkModuleSourceVars->isTestLedOn;
|
||||
@@ -210,7 +248,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
// Set PWM brightness
|
||||
case UhkModulePhase_SetLedPwmBrightness:
|
||||
if (uhkModuleSourceVars->ledPwmBrightness == uhkModuleTargetVars->ledPwmBrightness) {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
} else {
|
||||
txMessage.data[0] = SlaveCommand_SetLedPwmBrightness;
|
||||
txMessage.data[1] = uhkModuleSourceVars->ledPwmBrightness;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "crc16.h"
|
||||
#include "versions.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
@@ -29,19 +30,29 @@
|
||||
UhkModulePhase_ProcessSync,
|
||||
|
||||
// Get protocol version
|
||||
UhkModulePhase_RequestProtocolVersion,
|
||||
UhkModulePhase_ReceiveProtocolVersion,
|
||||
UhkModulePhase_ProcessProtocolVersion,
|
||||
UhkModulePhase_RequestModuleProtocolVersion,
|
||||
UhkModulePhase_ReceiveModuleProtocolVersion,
|
||||
UhkModulePhase_ProcessModuleProtocolVersion,
|
||||
|
||||
// Get firmware version
|
||||
UhkModulePhase_RequestFirmwareVersion,
|
||||
UhkModulePhase_ReceiveFirmwareVersion,
|
||||
UhkModulePhase_ProcessFirmwareVersion,
|
||||
|
||||
// Get module id
|
||||
UhkModulePhase_RequestModuleId,
|
||||
UhkModulePhase_ReceiveModuleId,
|
||||
UhkModulePhase_ProcessModuleId,
|
||||
|
||||
// Get module features
|
||||
UhkModulePhase_RequestModuleFeatures,
|
||||
UhkModulePhase_ReceiveModuleFeatures,
|
||||
UhkModulePhase_ProcessModuleFeatures,
|
||||
// Get module key count
|
||||
UhkModulePhase_RequestModuleKeyCount,
|
||||
UhkModulePhase_ReceiveModuleKeyCount,
|
||||
UhkModulePhase_ProcessModuleKeyCount,
|
||||
|
||||
// Get module key count
|
||||
UhkModulePhase_RequestModulePointerCount,
|
||||
UhkModulePhase_ReceiveModulePointerCount,
|
||||
UhkModulePhase_ProcessModulePointerCount,
|
||||
|
||||
// Get key states
|
||||
UhkModulePhase_RequestKeyStates,
|
||||
@@ -49,9 +60,9 @@
|
||||
UhkModulePhase_ProcessKeystates,
|
||||
|
||||
// Misc phases
|
||||
UhkModulePhase_JumpToBootloader,
|
||||
UhkModulePhase_SetTestLed,
|
||||
UhkModulePhase_SetLedPwmBrightness,
|
||||
UhkModulePhase_JumpToBootloader,
|
||||
|
||||
} uhk_module_phase_t;
|
||||
|
||||
@@ -62,15 +73,16 @@
|
||||
|
||||
typedef struct {
|
||||
uint8_t moduleId;
|
||||
uint8_t protocolVersion;
|
||||
version_t moduleProtocolVersion;
|
||||
version_t firmwareVersion;
|
||||
uhk_module_phase_t phase;
|
||||
uhk_module_vars_t sourceVars;
|
||||
uhk_module_vars_t targetVars;
|
||||
i2c_message_t rxMessage;
|
||||
uint8_t firmwareI2cAddress;
|
||||
uint8_t bootloaderI2cAddress;
|
||||
uhk_module_features_t features;
|
||||
bool jumpToBootloader;
|
||||
uint8_t keyCount;
|
||||
uint8_t pointerCount;
|
||||
} uhk_module_state_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#include "slave_drivers/kboot_driver.h"
|
||||
#include "i2c.h"
|
||||
#include "i2c_addresses.h"
|
||||
#include "config.h"
|
||||
#include "i2c_error_logger.h"
|
||||
|
||||
uint32_t I2cSlaveScheduler_Counter;
|
||||
|
||||
@@ -48,23 +50,27 @@ uhk_slave_t Slaves[] = {
|
||||
|
||||
static void slaveSchedulerCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t previousStatus, void *userData)
|
||||
{
|
||||
bool isFirstIteration = true;
|
||||
bool isFirstCycle = true;
|
||||
bool isTransferScheduled = false;
|
||||
I2cSlaveScheduler_Counter++;
|
||||
|
||||
do {
|
||||
uhk_slave_t *previousSlave = Slaves + previousSlaveId;
|
||||
uhk_slave_t *currentSlave = Slaves + currentSlaveId;
|
||||
|
||||
if (isFirstCycle) {
|
||||
uhk_slave_t *previousSlave = Slaves + previousSlaveId;
|
||||
previousSlave->previousStatus = previousStatus;
|
||||
if (IS_STATUS_I2C_ERROR(previousStatus)) {
|
||||
LogI2cError(previousSlaveId, previousStatus);
|
||||
}
|
||||
|
||||
if (isFirstIteration) {
|
||||
bool wasPreviousSlaveConnected = previousSlave->isConnected;
|
||||
previousSlave->isConnected = previousStatus == kStatus_Success;
|
||||
if (wasPreviousSlaveConnected && !previousSlave->isConnected && previousSlave->disconnect) {
|
||||
previousSlave->disconnect(previousSlaveId);
|
||||
}
|
||||
isFirstIteration = false;
|
||||
|
||||
isFirstCycle = false;
|
||||
}
|
||||
|
||||
if (!currentSlave->isConnected) {
|
||||
@@ -72,18 +78,21 @@ static void slaveSchedulerCallback(I2C_Type *base, i2c_master_handle_t *handle,
|
||||
}
|
||||
|
||||
status_t currentStatus = currentSlave->update(currentSlave->perDriverId);
|
||||
isTransferScheduled = currentStatus != kStatus_Uhk_IdleSlave && currentStatus != kStatus_Uhk_NoTransfer;
|
||||
if (IS_STATUS_I2C_ERROR(currentStatus)) {
|
||||
LogI2cError(currentSlaveId, currentStatus);
|
||||
}
|
||||
isTransferScheduled = currentStatus != kStatus_Uhk_IdleSlave && currentStatus != kStatus_Uhk_IdleCycle;
|
||||
if (isTransferScheduled) {
|
||||
currentSlave->isConnected = true;
|
||||
}
|
||||
|
||||
if (currentStatus != kStatus_Uhk_NoTransfer) {
|
||||
if (currentStatus != kStatus_Uhk_IdleCycle) {
|
||||
previousSlaveId = currentSlaveId++;
|
||||
}
|
||||
|
||||
if (currentSlaveId >= (sizeof(Slaves) / sizeof(uhk_slave_t))) {
|
||||
if (currentSlaveId >= SLAVE_COUNT) {
|
||||
currentSlaveId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
} while (!isTransferScheduled);
|
||||
}
|
||||
|
||||
@@ -92,7 +101,7 @@ void InitSlaveScheduler(void)
|
||||
previousSlaveId = 0;
|
||||
currentSlaveId = 0;
|
||||
|
||||
for (uint8_t i=0; i<sizeof(Slaves) / sizeof(uhk_slave_t); i++) {
|
||||
for (uint8_t i=0; i<SLAVE_COUNT; i++) {
|
||||
uhk_slave_t *currentSlave = Slaves + i;
|
||||
currentSlave->isConnected = false;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,14 @@
|
||||
// Includes:
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "config.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define SLAVE_COUNT (sizeof(Slaves) / sizeof(uhk_slave_t))
|
||||
#define MAX_SLAVE_COUNT 6
|
||||
#define IS_VALID_SLAVE_ID(slaveId) (0 <= slaveId && slaveId <= MAX_SLAVE_COUNT)
|
||||
#define IS_STATUS_I2C_ERROR(status) (kStatus_I2C_Busy <= status && status <= kStatus_I2C_Timeout)
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -30,12 +38,12 @@
|
||||
} uhk_slave_t;
|
||||
|
||||
typedef enum {
|
||||
kStatusGroup_Uhk = -1,
|
||||
kStatusGroup_Uhk = 200,
|
||||
} uhk_status_group_t;
|
||||
|
||||
typedef enum {
|
||||
kStatus_Uhk_IdleSlave = MAKE_STATUS(kStatusGroup_Uhk, 0), // Another slave should be scheduled
|
||||
kStatus_Uhk_NoTransfer = MAKE_STATUS(kStatusGroup_Uhk, 1), // The same slave should be rescheduled
|
||||
kStatus_Uhk_IdleCycle = MAKE_STATUS(kStatusGroup_Uhk, 1), // The same slave should be rescheduled
|
||||
} uhk_status_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
// Macros:
|
||||
|
||||
#define SLOT_COUNT 4
|
||||
#define IS_VALID_SLAVE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule)
|
||||
#define IS_VALID_MODULE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule)
|
||||
|
||||
// Typedefs:
|
||||
|
||||
|
||||
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,17 @@
|
||||
#include "fsl_pit.h"
|
||||
#include "timer.h"
|
||||
#include "peripherals/test_led.h"
|
||||
|
||||
uint32_t CurrentTime;
|
||||
static uint32_t timerClockFrequency;
|
||||
static volatile uint32_t currentTime, delayLength;
|
||||
|
||||
void PIT_TIMER_HANDLER(void)
|
||||
{
|
||||
CurrentTime++;
|
||||
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, PIT_TFLG_TIF_MASK);
|
||||
currentTime++;
|
||||
if (delayLength) {
|
||||
--delayLength;
|
||||
}
|
||||
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, kPIT_TimerFlag);
|
||||
}
|
||||
|
||||
void Timer_Init(void)
|
||||
@@ -15,29 +20,70 @@ void Timer_Init(void)
|
||||
PIT_GetDefaultConfig(&pitConfig);
|
||||
PIT_Init(PIT, &pitConfig);
|
||||
|
||||
// TODO: Why the interval needs to be multiplied by two to arrive to the correct timing?
|
||||
// Figure it out and clean this up.
|
||||
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC*2, PIT_SOURCE_CLOCK));
|
||||
timerClockFrequency = PIT_SOURCE_CLOCK;
|
||||
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC, timerClockFrequency));
|
||||
|
||||
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
|
||||
EnableIRQ(PIT_TIMER_IRQ_ID);
|
||||
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
||||
}
|
||||
|
||||
uint32_t Timer_GetCurrentTime() {
|
||||
return currentTime;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetCurrentTimeMicros() {
|
||||
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)
|
||||
{
|
||||
*time = CurrentTime;
|
||||
*time = Timer_GetCurrentTime();
|
||||
}
|
||||
|
||||
void Timer_SetCurrentTimeMicros(uint32_t *time)
|
||||
{
|
||||
*time = Timer_GetCurrentTimeMicros();
|
||||
}
|
||||
|
||||
uint32_t Timer_GetElapsedTime(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = CurrentTime - *time;
|
||||
uint32_t elapsedTime = Timer_GetCurrentTime() - *time;
|
||||
return elapsedTime;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = Timer_GetCurrentTimeMicros() - *time;
|
||||
return elapsedTime;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = Timer_GetElapsedTime(time);
|
||||
*time = CurrentTime;
|
||||
*time = Timer_GetCurrentTime();
|
||||
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,15 +9,17 @@
|
||||
|
||||
#define TIMER_INTERVAL_MSEC 1
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint32_t CurrentTime;
|
||||
|
||||
// Functions:
|
||||
|
||||
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_GetElapsedTimeMicros(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time);
|
||||
void Timer_Delay(uint32_t length);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "usb_commands/usb_command_apply_config.h"
|
||||
#include "config_parser/config_globals.h"
|
||||
#include "config_parser/parse_config.h"
|
||||
#include "peripherals/reset_button.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "keymap.h"
|
||||
|
||||
@@ -35,6 +36,10 @@ void UsbCommand_ApplyConfig(void)
|
||||
ValidatedUserConfigBuffer.buffer = StagingUserConfigBuffer.buffer;
|
||||
StagingUserConfigBuffer.buffer = temp;
|
||||
|
||||
if (IsFactoryResetModeEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
ParserRunDry = false;
|
||||
ValidatedUserConfigBuffer.offset = 0;
|
||||
parseConfigStatus = ParseConfig(&ValidatedUserConfigBuffer);
|
||||
@@ -45,15 +50,9 @@ void UsbCommand_ApplyConfig(void)
|
||||
}
|
||||
|
||||
// Switch to the keymap of the updated configuration of the same name or the default keymap.
|
||||
|
||||
for (uint8_t keymapId = 0; keymapId < AllKeymapsCount; keymapId++) {
|
||||
if (AllKeymaps[keymapId].abbreviationLen == oldKeymapAbbreviationLen &&
|
||||
!memcmp(oldKeymapAbbreviation, AllKeymaps[keymapId].abbreviation, oldKeymapAbbreviationLen))
|
||||
{
|
||||
SwitchKeymap(keymapId);
|
||||
if (SwitchKeymapByAbbreviation(oldKeymapAbbreviationLen, oldKeymapAbbreviation)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
SwitchKeymap(DefaultKeymapIndex);
|
||||
SwitchKeymapById(DefaultKeymapIndex);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "i2c_watchdog.h"
|
||||
#include "buffer.h"
|
||||
#include "timer.h"
|
||||
#include "key_scanner.h"
|
||||
#include "right_key_matrix.h"
|
||||
#include "usb_report_updater.h"
|
||||
#include "usb_interfaces/usb_interface_basic_keyboard.h"
|
||||
#include "usb_interfaces/usb_interface_media_keyboard.h"
|
||||
@@ -20,9 +20,9 @@ void UsbCommand_GetDebugBuffer(void)
|
||||
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
|
||||
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
|
||||
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
||||
SetDebugBufferUint32(17, KeyScannerCounter);
|
||||
SetDebugBufferUint32(17, MatrixScanCounter);
|
||||
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
||||
SetDebugBufferUint32(25, CurrentTime);
|
||||
SetDebugBufferUint32(25, Timer_GetCurrentTime());
|
||||
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
||||
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
||||
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
||||
|
||||
78
right/src/usb_commands/usb_command_get_device_property.c
Normal file
78
right/src/usb_commands/usb_command_get_device_property.c
Normal file
@@ -0,0 +1,78 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_device_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "versions.h"
|
||||
#include "slave_drivers/kboot_driver.h"
|
||||
#include "i2c.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "fsl_i2c.h"
|
||||
#include "timer.h"
|
||||
|
||||
version_t deviceProtocolVersion = {
|
||||
DEVICE_PROTOCOL_MAJOR_VERSION,
|
||||
DEVICE_PROTOCOL_MINOR_VERSION,
|
||||
DEVICE_PROTOCOL_PATCH_VERSION,
|
||||
};
|
||||
|
||||
version_t protocolVersions[] =
|
||||
{
|
||||
{
|
||||
FIRMWARE_MAJOR_VERSION,
|
||||
FIRMWARE_MINOR_VERSION,
|
||||
FIRMWARE_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
DEVICE_PROTOCOL_MAJOR_VERSION,
|
||||
DEVICE_PROTOCOL_MINOR_VERSION,
|
||||
DEVICE_PROTOCOL_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
MODULE_PROTOCOL_MAJOR_VERSION,
|
||||
MODULE_PROTOCOL_MINOR_VERSION,
|
||||
MODULE_PROTOCOL_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
USER_CONFIG_MAJOR_VERSION,
|
||||
USER_CONFIG_MINOR_VERSION,
|
||||
USER_CONFIG_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
HARDWARE_CONFIG_MAJOR_VERSION,
|
||||
HARDWARE_CONFIG_MINOR_VERSION,
|
||||
HARDWARE_CONFIG_PATCH_VERSION,
|
||||
}
|
||||
};
|
||||
|
||||
uint16_t configSizes[] = {HARDWARE_CONFIG_SIZE, USER_CONFIG_SIZE};
|
||||
|
||||
void UsbCommand_GetDeviceProperty(void)
|
||||
{
|
||||
uint8_t propertyId = GetUsbRxBufferUint8(1);
|
||||
|
||||
switch (propertyId) {
|
||||
case DevicePropertyId_DeviceProtocolVersion:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&deviceProtocolVersion, sizeof(deviceProtocolVersion));
|
||||
break;
|
||||
case DevicePropertyId_ProtocolVersions:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&protocolVersions, sizeof(protocolVersions));
|
||||
break;
|
||||
case DevicePropertyId_ConfigSizes:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&configSizes, sizeof(configSizes));
|
||||
break;
|
||||
case DevicePropertyId_CurrentKbootCommand:
|
||||
GenericHidOutBuffer[1] = KbootDriverState.command;
|
||||
break;
|
||||
case DevicePropertyId_I2cMainBusBaudRate:
|
||||
GenericHidOutBuffer[1] = I2C_MAIN_BUS_BASEADDR->F;
|
||||
SetUsbTxBufferUint32(2, I2cMainBusRequestedBaudRateBps);
|
||||
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
||||
break;
|
||||
case DevicePropertyId_Uptime:
|
||||
SetUsbTxBufferUint32(1, Timer_GetCurrentTime());
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
23
right/src/usb_commands/usb_command_get_device_property.h
Normal file
23
right/src/usb_commands/usb_command_get_device_property.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
DevicePropertyId_DeviceProtocolVersion = 0,
|
||||
DevicePropertyId_ProtocolVersions = 1,
|
||||
DevicePropertyId_ConfigSizes = 2,
|
||||
DevicePropertyId_CurrentKbootCommand = 3,
|
||||
DevicePropertyId_I2cMainBusBaudRate = 4,
|
||||
DevicePropertyId_Uptime = 5,
|
||||
} device_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetDeviceProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_device_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetDeviceProperty(void);
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_keyboard_state.h"
|
||||
#include "usb_commands/usb_command_get_device_state.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "peripherals/merge_sensor.h"
|
||||
26
right/src/usb_commands/usb_command_get_module_property.c
Normal file
26
right/src/usb_commands/usb_command_get_module_property.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_module_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slot.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
|
||||
void UsbCommand_GetModuleProperty()
|
||||
{
|
||||
slot_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_MODULE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidModuleSlotId);
|
||||
}
|
||||
|
||||
module_property_id_t modulePropertyId = GetUsbRxBufferUint8(2);
|
||||
switch (modulePropertyId) {
|
||||
case ModulePropertyId_VersionNumbers: {
|
||||
uint8_t moduleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
uhk_module_state_t *moduleState = UhkModuleStates + moduleDriverId;
|
||||
GenericHidOutBuffer[1] = moduleState->moduleId;
|
||||
memcpy(GenericHidOutBuffer + 2, &moduleState->moduleProtocolVersion, sizeof(version_t));
|
||||
memcpy(GenericHidOutBuffer + 8, &moduleState->firmwareVersion, sizeof(version_t));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
18
right/src/usb_commands/usb_command_get_module_property.h
Normal file
18
right/src/usb_commands/usb_command_get_module_property.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#ifndef __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetModuleProperty();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
ModulePropertyId_VersionNumbers = 0,
|
||||
} module_property_id_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetModuleProperty_InvalidModuleSlotId = 2,
|
||||
} usb_status_code_get_module_property_t;
|
||||
|
||||
#endif
|
||||
@@ -1,33 +0,0 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_GetProperty(void)
|
||||
{
|
||||
uint8_t propertyId = GetUsbRxBufferUint8(1);
|
||||
|
||||
switch (propertyId) {
|
||||
case SystemPropertyId_UsbProtocolVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_USB_PROTOCOL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_BridgeProtocolVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_DataModelVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_DATA_MODEL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_FirmwareVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_FIRMWARE_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_HardwareConfigSize:
|
||||
SetUsbTxBufferUint16(1, HARDWARE_CONFIG_SIZE);
|
||||
break;
|
||||
case SystemPropertyId_UserConfigSize:
|
||||
SetUsbTxBufferUint16(1, USER_CONFIG_SIZE);
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetProperty_InvalidProperty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#ifndef __USB_COMMAND_GET_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_PROPERTY_H__
|
||||
|
||||
// Macros:
|
||||
|
||||
#define SYSTEM_PROPERTY_USB_PROTOCOL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_DATA_MODEL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_FIRMWARE_VERSION 1
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
SystemPropertyId_UsbProtocolVersion = 0,
|
||||
SystemPropertyId_BridgeProtocolVersion = 1,
|
||||
SystemPropertyId_DataModelVersion = 2,
|
||||
SystemPropertyId_FirmwareVersion = 3,
|
||||
SystemPropertyId_HardwareConfigSize = 4,
|
||||
SystemPropertyId_UserConfigSize = 5,
|
||||
} system_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetProperty(void);
|
||||
|
||||
#endif
|
||||
19
right/src/usb_commands/usb_command_get_slave_i2c_errors.c
Normal file
19
right/src/usb_commands/usb_command_get_slave_i2c_errors.c
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "i2c_error_logger.h"
|
||||
|
||||
void UsbCommand_GetSlaveI2cErrors()
|
||||
{
|
||||
uint8_t slaveId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_SLAVE_ID(slaveId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidSlaveId);
|
||||
}
|
||||
|
||||
i2c_slave_error_counter_t *i2cSlaveErrorCounter = I2cSlaveErrorCounters + slaveId;
|
||||
|
||||
GenericHidOutBuffer[1] = i2cSlaveErrorCounter->errorTypeCount;
|
||||
memcpy(GenericHidOutBuffer + 2, i2cSlaveErrorCounter->errors, sizeof(i2c_error_count_t) * MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE);
|
||||
}
|
||||
14
right/src/usb_commands/usb_command_get_slave_i2c_errors.h
Normal file
14
right/src/usb_commands/usb_command_get_slave_i2c_errors.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
|
||||
#define __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetSlaveI2cErrors();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetModuleProperty_InvalidSlaveId = 2,
|
||||
} usb_status_code_get_slave_i2c_errors_t;
|
||||
|
||||
#endif
|
||||
25
right/src/usb_commands/usb_command_get_variable.c
Normal file
25
right/src/usb_commands/usb_command_get_variable.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user