87 Commits

Author SHA1 Message Date
László Monda
65006cc376 Bump firmware version to 8.3.1, update changelog, package.json, versions.h 2018-06-07 15:26:06 +02:00
László Monda
fc01b29823 Lowercase isLayerDoubleTapToggled. 2018-06-07 15:25:39 +02:00
László Monda
462595ef03 Extract handleSwitchLayerAction() 2018-06-07 14:50:49 +02:00
László Monda
b0d85795f4 Make the double tap to lock feature behave well. 2018-06-07 14:42:23 +02:00
László Monda
2c91ef51db Make releasing locked layers possible again. 2018-06-07 04:10:48 +02:00
László Monda
a54e7ac0a8 Set toggledLayers[action.switchLayer.layer] = true 2018-06-07 04:03:45 +02:00
László Monda
64f54c268b Clean up the layer toggle code a bit. 2018-06-07 03:55:40 +02:00
László Monda
d889d51a7d Merge pull request #120 from Lauszus/dev
The UHK now only sends out data when it changes
2018-06-07 03:02:36 +02:00
Kristian Sloth Lauszus
b284e9fa58 Make sure we send out a all zero report once when the a mouse report has been sent 2018-06-07 02:10:27 +02:00
Kristian Sloth Lauszus
1a0da7971a Send out the mouse report continuously if the report is not zeros 2018-06-07 01:56:16 +02:00
Kristian Sloth Lauszus
53a82a5f57 Removed unused variables, as the actions are no longer sent from within the interrupts 2018-06-07 01:50:12 +02:00
Kristian Sloth Lauszus
10985abcdb The UHK now only sends out data when it changes
Fixes #72, fixes #84 and fixes #85
2018-06-07 00:18:40 +02:00
László Monda
e60a282742 Bump firmware version to 8.3.0, update changelog and package.json 2018-06-03 14:36:18 +02:00
László Monda
a691b16ebe Make the serializer handle SwitchLayerMode_Hold, not only SwitchLayerMode_HoldAndDoubleTapToggle and SwitchLayerMode_Toggle. 2018-06-03 14:24:42 +02:00
László Monda
c38114648a Set key debounce timeout from 80ms to 100ms. This should further reduce key chattering. 2018-05-29 01:31:14 +02:00
László Monda
3fc4419f4f Bump firmware version to 8.2.5, update changelog, package.json, and versions.h 2018-05-27 01:53:41 +02:00
László Monda
033bdf6491 Merge initI2cMainBus() and initI2cEepromBus() as initI2cBus() 2018-05-27 01:43:14 +02:00
László Monda
18e3ba9558 Merge recoverI2c() and recoverI2cEeprom() as recoverI2cBus(), add i2c_bus_t. 2018-05-26 22:37:10 +02:00
László Monda
3fb552cc55 Reinitialize the EEPROM upon firmware startup and set the I2C EEPROM interrupt priority to 0. This seems to really fix #67. 2018-05-26 17:06:05 +02:00
László Monda
d093c84fb4 Fix HardwareConfig->signature{Length}="FTY" and re-release the latest version. 2018-05-21 15:25:24 +02:00
László Monda
95d7197394 Bump firmware version to 8.2.4, update the changelog, package.json and versions.h 2018-05-21 14:26:41 +02:00
László Monda
989774ced9 Make the EEPROM interrupt higher priority than the interrupts of the key scanner, key debouncer, I2C main bus and USB. Fixes #67. 2018-05-21 12:41:34 +02:00
László Monda
0e29276a56 Read the hardware and user configuration from the EEPROM even in factory reset mode. 2018-05-21 12:04:12 +02:00
László Monda
5b90d78518 Add IsFactoryResetModeEnabled. 2018-05-21 02:21:30 +02:00
László Monda
d2eb4b43c7 Add LED_DISPLAY_DEBUG_MODE and LedDisplay_DebugString, making the LED display usable for debugging purposes. 2018-05-20 12:00:05 +02:00
László Monda
a545324693 Set HardwareConfig->signature to "FTY" when the keyboard is in factory reset mode, so that Agent can act on it. 2018-05-20 01:36:27 +02:00
László Monda
27b02c32b5 Set key debounce timeout from 60ms to 80ms. This should further reduce key chattering. 2018-05-16 17:37:30 +02:00
László Monda
01e92e57f4 Bump firmware version to 8.2.3, update changelog, package.json and versions.h 2018-05-15 23:21:16 +02:00
László Monda
51b2631012 Make saving the user configuration faster by only writing the part of the EEPROM which actually contains the user configuration. Resolves #111. 2018-05-15 02:40:21 +02:00
László Monda
66c877f7bd Don't switch keymaps instead of playing macros. Fixes #86. 2018-05-15 01:47:24 +02:00
László Monda
7c1431f0ab Bump firmware version to 8.2.2, update changelog, package.json, versions.h 2018-05-09 00:24:24 +02:00
László Monda
772078f8f6 Don't use the link-time optimizer because it screws up the firmware. 2018-05-09 00:19:02 +02:00
László Monda
46244b8f5f Get rid of the -B parameter of make because it's been made redundant by make clean. 2018-05-09 00:11:33 +02:00
László Monda
5fc59f40bc Make clean the left and right firmwares before building them. 2018-05-08 13:00:10 +02:00
László Monda
460cd3c602 Merge pull request #115 from Lauszus/lto
Enable the link-time optimizer for the left side, as this was also us…
2018-05-08 01:39:12 +02:00
Kristian Sloth Lauszus
e391d6dac8 Enable the link-time optimizer for the left side, as this was also used before the Makefile were added 2018-05-08 01:22:52 +02:00
László Monda
41afff5ea4 Update README.md 2018-05-08 00:28:43 +02:00
László Monda
187ae2821b Update README.md 2018-05-08 00:23:11 +02:00
László Monda
cb52c273b4 Merge pull request #114 from Lauszus/dev
Removed unneeded sources
2018-05-08 00:02:47 +02:00
László Monda
5a523e64d8 Always unconditionally rebuild every object file when creating a release. 2018-05-08 00:00:08 +02:00
László Monda
970f622bff Set DEBUG=0 by default. 2018-05-07 23:56:28 +02:00
Kristian Sloth Lauszus
293438fa61 Removed unneeded sources 2018-05-07 22:23:21 +02:00
László Monda
455c1a30cb Make make-release.js work again now that the build system has changed. 2018-05-07 13:16:46 +02:00
László Monda
58e4919c0e Revert {left,right}/build/.cprojects 2018-05-07 09:06:44 +02:00
László Monda
dd7b0a6e3b Make builds parallel by adding -j8 to make commands in build configurations and external tool configurations. 2018-05-07 00:58:13 +02:00
László Monda
59396baf76 Don't make external configurations overwrite PATH. 2018-05-06 23:23:23 +02:00
László Monda
8d9340c05b Merge branch 'master' of github.com:UltimateHackingKeyboard/firmware 2018-05-06 23:20:17 +02:00
László Monda
0930a000fa Merge pull request #113 from Lauszus/make
Make
2018-05-06 23:00:27 +02:00
Kristian Sloth Lauszus
332560d2d2 Merge branch 'master' into make 2018-05-06 21:25:46 +02:00
Kristian Sloth Lauszus
0344a79f65 Updated the KSDK_2.0_MKL03Z8xxx4 submodule 2018-05-06 20:28:14 +02:00
Kristian Sloth Lauszus
4577b118bc Revert "Set the MCU type for both projects"
This reverts commit 8bb9711793.
2018-05-06 20:26:44 +02:00
László Monda
ad8aca5793 Merge branch 'make' of https://github.com/Lauszus/firmware 2018-05-06 20:19:07 +02:00
Kristian Sloth Lauszus
8bb9711793 Set the MCU type for both projects
This is needed if we want to use MCUXpresso's config tools
2018-05-06 20:16:51 +02:00
Kristian Sloth Lauszus
3cb0490e5e Modified launch configurations to use the Makefile to flash the firmware 2018-05-06 20:16:51 +02:00
Kristian Sloth Lauszus
58fa1ed6a4 Use the bundled Makefiles instead of having the IDE generate them automatically 2018-05-06 20:16:51 +02:00
László Monda
9aa78ef5bf Merge pull request #112 from Lauszus/descriptor
Fix vender specific usage page entry
2018-05-06 20:14:51 +02:00
Kristian Sloth Lauszus
7c4c354828 Updated LED status comment 2018-05-06 15:23:07 +02:00
Kristian Sloth Lauszus
c3407e1410 Added Makefiles as linked resources, so they show up in the IDE 2018-05-06 15:22:24 +02:00
Kristian Sloth Lauszus
492243f801 Added _pvHeapStart entry
This is needed for Semihosting
2018-05-06 15:19:38 +02:00
Kristian Sloth Lauszus
6f0b1adc14 Fix vender specific usage page entry
See: https://github.com/node-hid/node-hid/issues/258
2018-05-06 15:11:22 +02:00
László Monda
b917a97e93 Parse long media macro actions. 2018-05-03 00:42:20 +02:00
László Monda
bf69f28ed1 Merge pull request #110 from Lauszus/make
Added Makefiles for compiling the two projects
2018-05-03 00:22:05 +02:00
László Monda
6854fa68dc Bump firmware version to 8.2.1 and update the changelog. 2018-05-02 14:57:24 +02:00
László Monda
14b6e49692 Don't suppress modifiers upon releasing a layer. Fixes #82. 2018-05-02 14:49:56 +02:00
Kristian Sloth Lauszus
10802f3f73 Build both the debug and release builds 2018-05-02 10:47:25 +02:00
Kristian Sloth Lauszus
66252eabf0 Added JLink flash scripts 2018-05-02 10:47:25 +02:00
Kristian Sloth Lauszus
0c4c736552 Use automatic variables for getting the file name and use the MAKEFILE_LIST variable to rebuild the project when any of the Makefiles change 2018-05-02 09:34:19 +02:00
Kristian Sloth Lauszus
aa4105bdc3 Updated license to "GPLv2 or later", so it is compatible with GPLv3 2018-05-02 03:00:30 +02:00
Kristian Sloth Lauszus
101abffec4 Moved the linker script into the source directory 2018-05-02 02:56:03 +02:00
Kristian Sloth Lauszus
b8268f55a3 Moved the BL_APP_VECTOR_TABLE_ADDRESS define into Makedefs.mk 2018-05-02 02:56:03 +02:00
Kristian Sloth Lauszus
2214f00667 Added command for flashing the images via the bootloader 2018-05-02 02:31:39 +02:00
Kristian Sloth Lauszus
a2fae5bbef Readded Eclipse build 2018-05-02 01:08:20 +02:00
Kristian Sloth Lauszus
47e026006e Forgot to fix linker errors for both linker scripts in: e0528e1714 2018-05-02 01:05:40 +02:00
Kristian Sloth Lauszus
379d827982 Only compile the project using Make 2018-05-02 00:45:47 +02:00
Kristian Sloth Lauszus
d9d26814e8 Fix warnings 2018-05-02 00:35:28 +02:00
Kristian Sloth Lauszus
611c36fe00 Added Makefiles for compiling the two projects 2018-05-02 00:13:52 +02:00
László Monda
e9cd3a96c2 Don't reinitialize LED driver ICs upon suspend and resume. 2018-04-28 17:08:25 +02:00
László Monda
8856c484b6 Add LedDisplay_UpdateAll() 2018-04-28 16:21:54 +02:00
László Monda
b97841fdae Delete I2C_WATCHDOG and always enable the watchdog. 2018-04-28 15:04:56 +02:00
László Monda
69143bed9c Replace "computer" with "host". 2018-04-28 15:00:32 +02:00
László Monda
ebd0e3b762 Make ParseConfig() restore indicator icons. Fixes #107 2018-04-28 14:43:13 +02:00
László Monda
ec8301ae62 Expose IsHostSleeping instead of IsHostSleeping() 2018-04-28 13:11:25 +02:00
László Monda
3d4d78387e Remove LED_DRIVER_STRESS_TEST. 2018-04-28 12:36:12 +02:00
László Monda
c2582729f2 Remove LED_DRIVERS_ENABLED. 2018-04-28 11:43:01 +02:00
László Monda
9d66f5ff76 Rename identifiers. 2018-04-28 11:38:38 +02:00
László Monda
06ebed5537 Rename some variables and clean up coding style. 2018-04-28 11:19:01 +02:00
László Monda
02d6fb4628 Rename version from 8.1.6 to 8.2.0 because the minor device protocol version has changed. 2018-04-20 09:55:44 +02:00
67 changed files with 1164 additions and 559 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
package-lock.json package-lock.json
node_modules node_modules
build_make

View File

@@ -1,25 +1,36 @@
language: generic language: c
cache: cache:
directories: directories:
- $HOME/Library/Caches/Homebrew/Cask - $HOME/Library/Caches/Homebrew/Cask
install: eclipse -noSplash
-application org.eclipse.equinox.p2.director install: eclipse -noSplash
-repository http://gnuarmeclipse.sourceforge.net/updates -application org.eclipse.equinox.p2.director
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group -repository http://gnuarmeclipse.sourceforge.net/updates
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group
-profileProperties org.eclipse.update.install.features=true -profileProperties org.eclipse.update.install.features=true
script: eclipse -noSplash
-application org.eclipse.cdt.managedbuilder.core.headlessbuild before_script:
-import $TRAVIS_BUILD_DIR/left/build - tar -xf gcc-arm-none-eabi-7-2017-q4-major-*.tar.bz2
-import $TRAVIS_BUILD_DIR/right/build - export PATH=$PATH:$PWD/gcc-arm-none-eabi-7-2017-q4-major/bin
-build all
script:
- eclipse -noSplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -import $TRAVIS_BUILD_DIR/left/build -import $TRAVIS_BUILD_DIR/right/build -build all
- 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
matrix: matrix:
include: include:
- os: linux - os: linux
sudo: required sudo: required
before_install: before_install:
- curl https://nixos.org/nix/install | sh && . ~/.nix-profile/etc/profile.d/nix.sh - 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 - nix-env -i eclipse-cpp
- wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2"
- os: osx - os: osx
env: PATH="$PATH:/Applications/Eclipse CPP.app/Contents/MacOS" env: PATH="$PATH:/Applications/Eclipse CPP.app/Contents/MacOS"
before_install: brew update && brew bundle -v before_install:
- brew cask install eclipse-cpp
- wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-mac.tar.bz2"

View File

@@ -1,2 +0,0 @@
cask "eclipse-cpp"
cask "./gcc-arm-embedded.rb"

View File

@@ -5,7 +5,59 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions. and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [8.1.6] - 2018-04-10 ## [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 Device Protocol: 4.**3.0** | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0

View File

@@ -4,21 +4,17 @@
This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/). This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
## Updating to the latest firmware If you want to use the latest firmware version for your UHK, then instead of going through the pain of building the firmware, simply download the [latest release of Agent](https://github.com/UltimateHackingKeyboard/agent/releases/latest) and update to the latest firmware version within Agent with a click of a button.
Want to update your UHK to the latest firmware version? Simply download the [latest release of Agent](https://github.com/UltimateHackingKeyboard/agent/releases/latest) which includes the latest firmware version. You'll be easily able to update the firmware within Agent. If you're one of the brave few who wants to hack the firmware then read on.
## Cloning the repository 1. Make sure to clone this repo with:
Please make sure to clone this repo with:
`git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git` `git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git`
This will download the dependent submodules, which are required to build the firmware. 2. Download and install MCUXpresso IDE for [Linux](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/mcuxpressoide-10.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 3. In the IDE, import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button.
Install [Kinetis Design Studio](http://www.nxp.com/products/software-and-tools/run-time-software/kinetis-software-and-tools/ides-for-kinetis-mcus/kinetis-design-studio-integrated-development-environment-ide:KDS_IDE) (KDS), import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button.
## Building and flashing the firmware ## Building and flashing the firmware

View File

@@ -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
View 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

View File

@@ -5,16 +5,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_debug"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_debug">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
@@ -61,7 +61,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.2943267007" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.2943267007" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.9995899345" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.9995899345" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1777290613" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1777290613" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/debug" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1406291427" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-left}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1406291427" incrementalBuildTarget="all DEBUG=1" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2007968129" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2007968129" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1246588554" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1246588554" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.2122094274" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.2122094274" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -165,16 +165,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_release"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_release">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" name="uhk60-left_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" name="uhk60-left_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1802192936" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1802192936" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.918206081" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.918206081" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
@@ -220,7 +220,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.6545741443.1540890614" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.6545741443.1540890614" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1382191896" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1382191896" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.2107171855" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.2107171855" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1689719605" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-left}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1689719605" incrementalBuildTarget="all DEBUG=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1477971290" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1477971290" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.334227408" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.334227408" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1702866230" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1702866230" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>

View File

@@ -31,6 +31,16 @@
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures> </natures>
<linkedResources> <linkedResources>
<link>
<name>Makedefs.mk</name>
<type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/scripts/Makedefs.mk</locationURI>
</link>
<link>
<name>Makefile</name>
<type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/Makefile</locationURI>
</link>
<link> <link>
<name>drivers</name> <name>drivers</name>
<type>2</type> <type>2</type>

View File

@@ -1,34 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="leftHalf uhk60-left_debug/uhk-left.bin"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-module-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-left"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-left"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -1,48 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="leftHalf uhk60-left_release/uhk-left.bin"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-module-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-left"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-left"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

76
right/Makefile Normal file
View 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

View File

@@ -5,16 +5,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_release"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_release">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
@@ -57,7 +57,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.1518272175" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.1518272175" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.104956045" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.104956045" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1135747399" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1135747399" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.789002772" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.789002772" incrementalBuildTarget="all DEBUG=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2026990925" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2026990925" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.494477502" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.494477502" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1465555477" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1465555477" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -145,16 +145,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" name="uhk60-right_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" name="uhk60-right_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.622643167" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.622643167" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.274883814" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.274883814" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
@@ -197,7 +197,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2098763517" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2098763517" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.836473542" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.836473542" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1768350063" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1768350063" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1931309296" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1931309296" incrementalBuildTarget="all DEBUG=1" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.894450" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.894450" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.555709175" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.555709175" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1619685061" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1619685061" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -288,16 +288,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug_standalone"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug_standalone">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="Debug version of uhk60-right without the bootloader" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" name="uhk60-right_debug_standalone" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="Debug version of uhk60-right without the bootloader" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" name="uhk60-right_debug_standalone" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.788475280" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.788475280" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.402546001" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.402546001" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
@@ -340,7 +340,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2124713168" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2124713168" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1228214828" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1228214828" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1911575583" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1911575583" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1942759303" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1942759303" incrementalBuildTarget="all DEBUG=1 BL_APP_VECTOR_TABLE_ADDRESS=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1355758441" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1355758441" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.511724221" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.511724221" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1130167410" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1130167410" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -447,13 +447,13 @@
</scannerConfigBuildInfo> </scannerConfigBuildInfo>
</storageModule> </storageModule>
<storageModule moduleId="refreshScope" versionNumber="2"> <storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="uhk60-right_debug_standalone"> <configuration configurationName="uhk60-right_debug">
<resource resourceType="PROJECT" workspacePath="/uhk-right"/> <resource resourceType="PROJECT" workspacePath="/uhk-right"/>
</configuration> </configuration>
<configuration configurationName="uhk60-right_release"> <configuration configurationName="uhk60-right_release">
<resource resourceType="PROJECT" workspacePath="/uhk-right"/> <resource resourceType="PROJECT" workspacePath="/uhk-right"/>
</configuration> </configuration>
<configuration configurationName="uhk60-right_debug"> <configuration configurationName="uhk60-right_debug_standalone">
<resource resourceType="PROJECT" workspacePath="/uhk-right"/> <resource resourceType="PROJECT" workspacePath="/uhk-right"/>
</configuration> </configuration>
</storageModule> </storageModule>

View File

@@ -30,6 +30,16 @@
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures> </natures>
<linkedResources> <linkedResources>
<link>
<name>Makedefs.mk</name>
<type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/scripts/Makedefs.mk</locationURI>
</link>
<link>
<name>Makefile</name>
<type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/Makefile</locationURI>
</link>
<link> <link>
<name>bootloader-shared</name> <name>bootloader-shared</name>
<type>2</type> <type>2</type>

View File

@@ -204,21 +204,27 @@ SECTIONS
text_end = ORIGIN(m_text) + LENGTH(m_text); text_end = ORIGIN(m_text) + LENGTH(m_text);
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x800;
/* Uninitialized data section */ /* Uninitialized data section */
.bss : .bss : ALIGN(4)
{ {
/* This is used by the startup in order to initialize the .bss section */ /* This is used by the startup in order to initialize the .bss section */
. = ALIGN(4);
__START_BSS = .; __START_BSS = .;
__bss_start__ = .; __bss_start__ = .;
*(.bss) *(.bss)
*(.bss*) *(.bss*)
. = ALIGN(512);
USB_RAM_START = .;
. += USB_RAM_GAP;
*(COMMON) *(COMMON)
. = ALIGN(4); . = ALIGN(4);
} > m_data
.m_usb_bdt (NOLOAD) :
{
. = ALIGN(512);
*(m_usb_bdt)
} > m_data
.m_usb_global (NOLOAD) :
{
*(m_usb_global)
__bss_end__ = .; __bss_end__ = .;
__END_BSS = .; __END_BSS = .;
} > m_data } > m_data
@@ -247,17 +253,6 @@ SECTIONS
. += STACK_SIZE; . += STACK_SIZE;
} > m_data_2 } > m_data_2
m_usb_bdt USB_RAM_START (NOLOAD) :
{
*(m_usb_bdt)
USB_RAM_BDT_END = .;
}
m_usb_global USB_RAM_BDT_END (NOLOAD) :
{
*(m_usb_global)
}
/* Initializes stack on the end of block */ /* Initializes stack on the end of block */
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
__StackLimit = __StackTop - STACK_SIZE; __StackLimit = __StackTop - STACK_SIZE;

View File

@@ -1,49 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="bad_container_name" value="/uhk-l"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="uhk60-right_debug/uhk-right.hex"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-device-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-right"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;/&gt;&#10;"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -1,49 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="bad_container_name" value="/uhk-l"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="uhk60-right_release/uhk-right.hex"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-device-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-right"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;/&gt;&#10;"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -593,9 +593,6 @@ static status_t handle_command_internal(uint8_t *packet, uint32_t packetLength)
else else
{ {
#if FIXED_BUSPAL_BOOTLOADER #if FIXED_BUSPAL_BOOTLOADER
size_t offset;
int res;
status = kStatus_Success; /* set default */ status = kStatus_Success; /* set default */
res = WaitForStartByte(rxBuf, &offset); res = WaitForStartByte(rxBuf, &offset);
if (res==1 && offset==1) if (res==1 && offset==1)

View File

@@ -110,7 +110,7 @@ status_t serial_packet_read(const peripheral_descriptor_t *self,
// Receive the framing data packet. // Receive the framing data packet.
isPacketOk = true; isPacketOk = true;
status_t status = read_data_packet(&framingPacket, g_serialContext.data, packetType); status = read_data_packet(&framingPacket, g_serialContext.data, packetType);
if (status != kStatus_Success) if (status != kStatus_Success)
{ {
// No packet available. // No packet available.

View File

@@ -3,8 +3,4 @@
// Macros: // Macros:
#define I2C_WATCHDOG
#define LED_DRIVERS_ENABLED
// #define LED_DRIVER_STRESS_TEST
#endif #endif

View File

@@ -6,10 +6,13 @@ static uint8_t hardwareConfig[HARDWARE_CONFIG_SIZE];
static uint8_t ATTR_DATA2 stagingUserConfig[USER_CONFIG_SIZE]; static uint8_t ATTR_DATA2 stagingUserConfig[USER_CONFIG_SIZE];
static uint8_t validatedUserConfig[USER_CONFIG_SIZE]; static uint8_t validatedUserConfig[USER_CONFIG_SIZE];
uint16_t ValidatedUserConfigLength;
config_buffer_t HardwareConfigBuffer = { hardwareConfig }; config_buffer_t HardwareConfigBuffer = { hardwareConfig };
config_buffer_t StagingUserConfigBuffer = { stagingUserConfig }; config_buffer_t StagingUserConfigBuffer = { stagingUserConfig };
config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig }; config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
hardware_config_t *HardwareConfig = (hardware_config_t*)hardwareConfig;
bool ParserRunDry; bool ParserRunDry;
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId) bool IsConfigBufferIdValid(config_buffer_id_t configBufferId)

View File

@@ -6,6 +6,10 @@
#include "fsl_common.h" #include "fsl_common.h"
#include "basic_types.h" #include "basic_types.h"
// Macros:
#define HARDWARE_CONFIG_SIGNATURE_LENGTH 3
// Typedefs: // Typedefs:
typedef enum { typedef enum {
@@ -14,14 +18,29 @@
ConfigBufferId_ValidatedUserConfig, ConfigBufferId_ValidatedUserConfig,
} config_buffer_id_t; } config_buffer_id_t;
typedef struct {
uint8_t signatureLength;
char signature[HARDWARE_CONFIG_SIGNATURE_LENGTH];
uint8_t majorVersion;
uint8_t minorVersion;
uint8_t patchVersion;
uint8_t brandId;
uint8_t deviceId;
uint32_t uniqueId;
bool isVendorModeOn;
bool isIso;
} hardware_config_t;
// Variables: // Variables:
extern bool ParserRunDry; extern bool ParserRunDry;
extern uint16_t ValidatedUserConfigLength;
extern config_buffer_t HardwareConfigBuffer; extern config_buffer_t HardwareConfigBuffer;
extern config_buffer_t StagingUserConfigBuffer; extern config_buffer_t StagingUserConfigBuffer;
extern config_buffer_t ValidatedUserConfigBuffer; extern config_buffer_t ValidatedUserConfigBuffer;
extern hardware_config_t *HardwareConfig;
// Functions: // Functions:
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId); bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId); config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);

View File

@@ -51,7 +51,6 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
const char *deviceName = ReadString(buffer, &len); const char *deviceName = ReadString(buffer, &len);
uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer); uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
(void)userConfigLength;
(void)dataModelMajorVersion; (void)dataModelMajorVersion;
(void)dataModelMinorVersion; (void)dataModelMinorVersion;
(void)dataModelPatchVersion; (void)dataModelPatchVersion;
@@ -141,13 +140,14 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
// Update LED brightnesses and reinitialize LED drivers // Update LED brightnesses and reinitialize LED drivers
ValidatedUserConfigLength = userConfigLength;
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness; IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness; AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
KeyBacklightBrightness = keyBacklightBrightness; KeyBacklightBrightness = keyBacklightBrightness;
#ifdef LED_DRIVERS_ENABLED
Slaves[SlaveId_LeftLedDriver].isConnected = false; LedSlaveDriver_UpdateLeds();
Slaves[SlaveId_RightLedDriver].isConnected = false;
#endif
// Update mouse key speeds // Update mouse key speeds
MouseMoveState.initialSpeed = mouseMoveInitialSpeed; MouseMoveState.initialSpeed = mouseMoveInitialSpeed;

View File

@@ -48,7 +48,7 @@ static parser_error_t parseKeyStrokeAction(key_action_t *keyAction, uint8_t keyS
static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer) static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer)
{ {
uint8_t layer = ReadUInt8(buffer) + 1; uint8_t layer = ReadUInt8(buffer) + 1;
uint8_t mode = ReadBool(buffer) ? SwitchLayerMode_Toggle : SwitchLayerMode_HoldAndDoubleTapToggle; switch_layer_mode_t mode = ReadUInt8(buffer);
KeyAction->type = KeyActionType_SwitchLayer; KeyAction->type = KeyActionType_SwitchLayer;
KeyAction->switchLayer.layer = layer; KeyAction->switchLayer.layer = layer;
@@ -75,7 +75,7 @@ static parser_error_t parsePlayMacroAction(key_action_t *keyAction, config_buffe
if (macroIndex >= tempMacroCount) { if (macroIndex >= tempMacroCount) {
return ParserError_InvalidSerializedPlayMacroAction; return ParserError_InvalidSerializedPlayMacroAction;
} }
keyAction->type = KeyActionType_SwitchKeymap; keyAction->type = KeyActionType_PlayMacro;
keyAction->playMacro.macroId = macroIndex; keyAction->playMacro.macroId = macroIndex;
return ParserError_Success; return ParserError_Success;
} }
@@ -196,4 +196,3 @@ parser_error_t ParseKeymap(config_buffer_t *buffer, uint8_t keymapIdx, uint8_t k
} }
return ParserError_Success; return ParserError_Success;
} }

View File

@@ -7,13 +7,15 @@ parser_error_t parseKeyMacroAction(config_buffer_t *buffer, macro_action_t *macr
uint8_t keyMacroType = macroActionType - SerializedMacroActionType_KeyMacroAction; uint8_t keyMacroType = macroActionType - SerializedMacroActionType_KeyMacroAction;
uint8_t action = keyMacroType & 0b11; uint8_t action = keyMacroType & 0b11;
uint8_t type; uint8_t type;
uint8_t scancode; uint16_t scancode = 0;
uint8_t modifierMask; uint8_t modifierMask;
keyMacroType >>= 2; keyMacroType >>= 2;
type = keyMacroType & 0b11; type = keyMacroType & 0b11;
keyMacroType >>= 2; keyMacroType >>= 2;
scancode = keyMacroType & 0b10 ? ReadUInt8(buffer) : 0; if (keyMacroType & 0b10) {
scancode = type == SerializedKeystrokeType_LongMedia ? ReadUInt16(buffer) : ReadUInt8(buffer);
}
modifierMask = keyMacroType & 0b01 ? ReadUInt8(buffer) : 0; modifierMask = keyMacroType & 0b01 ? ReadUInt8(buffer) : 0;
macroAction->type = MacroActionType_Key; macroAction->type = MacroActionType_Key;
macroAction->key.action = action; macroAction->key.action = action;

View File

@@ -94,14 +94,14 @@ void EEPROM_Init(void)
I2C_MasterTransferCreateHandle(I2C_EEPROM_BUS_BASEADDR, &i2cHandle, i2cCallback, NULL); I2C_MasterTransferCreateHandle(I2C_EEPROM_BUS_BASEADDR, &i2cHandle, i2cCallback, NULL);
} }
status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback)) status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t configBufferId, void (*successCallback))
{ {
if (IsEepromBusy) { if (IsEepromBusy) {
return kStatus_I2C_Busy; return kStatus_I2C_Busy;
} }
CurrentEepromOperation = operation; CurrentEepromOperation = operation;
CurrentConfigBufferId = config_buffer_id; CurrentConfigBufferId = configBufferId;
SuccessCallback = successCallback; SuccessCallback = successCallback;
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig; bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
@@ -117,7 +117,8 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
case EepromOperation_Write: case EepromOperation_Write:
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer; sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;
sourceOffset = 0; sourceOffset = 0;
sourceLength = isHardwareConfig ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE; uint16_t userConfigSize = ValidatedUserConfigLength && configBufferId == ConfigBufferId_ValidatedUserConfig ? ValidatedUserConfigLength : USER_CONFIG_SIZE;
sourceLength = isHardwareConfig ? HARDWARE_CONFIG_SIZE : userConfigSize;
LastEepromTransferStatus = writePage(); LastEepromTransferStatus = writePage();
break; break;
} }

View File

@@ -35,10 +35,12 @@
#define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM. #define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM.
#define I2C_EEPROM_BUS_MUX kPORT_MuxAlt2 #define I2C_EEPROM_BUS_MUX kPORT_MuxAlt2
#define I2C_EEPROM_BUS_SDA_GPIO GPIOC
#define I2C_EEPROM_BUS_SDA_PORT PORTC #define I2C_EEPROM_BUS_SDA_PORT PORTC
#define I2C_EEPROM_BUS_SDA_CLOCK kCLOCK_PortC #define I2C_EEPROM_BUS_SDA_CLOCK kCLOCK_PortC
#define I2C_EEPROM_BUS_SDA_PIN 11 #define I2C_EEPROM_BUS_SDA_PIN 11
#define I2C_EEPROM_BUS_SCL_GPIO GPIOC
#define I2C_EEPROM_BUS_SCL_PORT PORTC #define I2C_EEPROM_BUS_SCL_PORT PORTC
#define I2C_EEPROM_BUS_SCL_CLOCK kCLOCK_PortC #define I2C_EEPROM_BUS_SCL_CLOCK kCLOCK_PortC
#define I2C_EEPROM_BUS_SCL_PIN 10 #define I2C_EEPROM_BUS_SCL_PIN 10

View File

@@ -21,6 +21,38 @@ bool IsBusPalOn;
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE; volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
volatile uint32_t I2cMainBusActualBaudRateBps; volatile uint32_t I2cMainBusActualBaudRateBps;
static i2c_bus_t i2cMainBus = {
.baseAddr = I2C_MAIN_BUS_BASEADDR,
.clockSrc = I2C_MAIN_BUS_CLK_SRC,
.mux = I2C_MAIN_BUS_MUX,
.sdaClock = I2C_MAIN_BUS_SDA_CLOCK,
.sdaGpio = I2C_MAIN_BUS_SDA_GPIO,
.sdaPort = I2C_MAIN_BUS_SDA_PORT,
.sdaPin = I2C_MAIN_BUS_SDA_PIN,
.sclClock = I2C_MAIN_BUS_SCL_CLOCK,
.sclGpio = I2C_MAIN_BUS_SCL_GPIO,
.sclPort = I2C_MAIN_BUS_SCL_PORT,
.sclPin = I2C_MAIN_BUS_SCL_PIN,
};
static i2c_bus_t i2cEepromBus = {
.baseAddr = I2C_EEPROM_BUS_BASEADDR,
.clockSrc = I2C_EEPROM_BUS_CLK_SRC,
.mux = I2C_EEPROM_BUS_MUX,
.sdaClock = I2C_EEPROM_BUS_SDA_CLOCK,
.sdaGpio = I2C_EEPROM_BUS_SDA_GPIO,
.sdaPort = I2C_EEPROM_BUS_SDA_PORT,
.sdaPin = I2C_EEPROM_BUS_SDA_PIN,
.sclClock = I2C_EEPROM_BUS_SCL_CLOCK,
.sclGpio = I2C_EEPROM_BUS_SCL_GPIO,
.sclPort = I2C_EEPROM_BUS_SCL_PORT,
.sclPin = I2C_EEPROM_BUS_SCL_PIN,
};
static void initBusPalState(void) { static void initBusPalState(void) {
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal; IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
if (IsBusPalOn) { if (IsBusPalOn) {
@@ -32,12 +64,12 @@ static void initBusPalState(void) {
static void initInterruptPriorities(void) static void initInterruptPriorities(void)
{ {
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1); NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2); NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0);
NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 3); NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3);
NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 3); NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 4);
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 3); NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 4);
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 3); NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 4);
NVIC_SetPriority(USB_IRQ_ID, 3); NVIC_SetPriority(USB_IRQ_ID, 4);
} }
static void delay(void) static void delay(void)
@@ -45,91 +77,73 @@ static void delay(void)
for (volatile uint32_t i=0; i<62; i++); for (volatile uint32_t i=0; i<62; i++);
} }
static void recoverI2c(void) static void recoverI2cBus(i2c_bus_t *i2cBus)
{ {
PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio); PORT_SetPinMux(i2cBus->sdaPort, i2cBus->sdaPin, kPORT_MuxAsGpio);
PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio); PORT_SetPinMux(i2cBus->sclPort, i2cBus->sclPin, kPORT_MuxAsGpio);
GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); GPIO_PinInit(i2cBus->sclGpio, i2cBus->sclPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
bool isOn = true; bool isOn = true;
for (int i=0; i<20; i++) { for (int i=0; i<20; i++) {
GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalInput}); GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalInput});
bool isSdaHigh = GPIO_ReadPinInput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN); bool isSdaHigh = GPIO_ReadPinInput(i2cBus->sdaGpio, i2cBus->sdaPin);
GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
if (isSdaHigh) { if (isSdaHigh) {
return; return;
} }
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, isOn); GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, isOn);
delay(); delay();
isOn = !isOn; isOn = !isOn;
} }
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0); GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 0);
delay(); delay();
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, 1);
delay(); delay();
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1); GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 1);
delay(); delay();
} }
static void initI2cMainBus(void) static void initI2cBus(i2c_bus_t *i2cBus)
{ {
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK); CLOCK_EnableClock(i2cBus->sdaClock);
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK); CLOCK_EnableClock(i2cBus->sclClock);
recoverI2c(); recoverI2cBus(i2cBus);
port_pin_config_t pinConfig = { port_pin_config_t pinConfig = {
.pullSelect = kPORT_PullUp, .pullSelect = kPORT_PullUp,
.openDrainEnable = kPORT_OpenDrainEnable, .openDrainEnable = kPORT_OpenDrainEnable,
.mux = I2C_MAIN_BUS_MUX, .mux = i2cBus->mux,
}; };
PORT_SetPinConfig(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, &pinConfig); PORT_SetPinConfig(i2cBus->sdaPort, i2cBus->sdaPin, &pinConfig);
PORT_SetPinConfig(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, &pinConfig); PORT_SetPinConfig(i2cBus->sclPort, i2cBus->sclPin, &pinConfig);
i2c_master_config_t masterConfig; i2c_master_config_t masterConfig;
I2C_MasterGetDefaultConfig(&masterConfig); I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = I2cMainBusRequestedBaudRateBps; masterConfig.baudRate_Bps = i2cBus == &i2cMainBus ? I2cMainBusRequestedBaudRateBps : I2C_EEPROM_BUS_BAUD_RATE;
uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC); uint32_t sourceClock = CLOCK_GetFreq(i2cBus->clockSrc);
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock); I2C_MasterInit(i2cBus->baseAddr, &masterConfig, sourceClock);
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
if (i2cBus == &i2cMainBus) {
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
}
} }
void ReinitI2cMainBus(void) void ReinitI2cMainBus(void)
{ {
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR); I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
initI2cMainBus(); initI2cBus(&i2cMainBus);
InitSlaveScheduler(); InitSlaveScheduler();
} }
static void initI2cEepromBus(void)
{
port_pin_config_t pinConfig = {
.pullSelect = kPORT_PullUp,
.openDrainEnable = kPORT_OpenDrainEnable,
.mux = I2C_EEPROM_BUS_MUX,
};
CLOCK_EnableClock(I2C_EEPROM_BUS_SDA_CLOCK);
CLOCK_EnableClock(I2C_EEPROM_BUS_SCL_CLOCK);
PORT_SetPinConfig(I2C_EEPROM_BUS_SDA_PORT, I2C_EEPROM_BUS_SDA_PIN, &pinConfig);
PORT_SetPinConfig(I2C_EEPROM_BUS_SCL_PORT, I2C_EEPROM_BUS_SCL_PIN, &pinConfig);
i2c_master_config_t masterConfig;
I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = I2C_EEPROM_BUS_BAUD_RATE;
uint32_t sourceClock = CLOCK_GetFreq(I2C_EEPROM_BUS_CLK_SRC);
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
}
static void initI2c(void) static void initI2c(void)
{ {
initI2cMainBus(); initI2cBus(&i2cMainBus);
initI2cEepromBus(); initI2cBus(&i2cEepromBus);
} }
void InitPeripherals(void) void InitPeripherals(void)
@@ -144,9 +158,7 @@ void InitPeripherals(void)
initI2c(); initI2c();
InitTestLed(); InitTestLed();
LedPwm_Init(); LedPwm_Init();
#ifdef I2C_WATCHDOG
InitI2cWatchdog(); InitI2cWatchdog();
#endif
InitKeyDebouncer(); InitKeyDebouncer();
EEPROM_Init(); EEPROM_Init();
} }

View File

@@ -1,10 +1,28 @@
#ifndef __INIT_PERIPHERALS_H__ #ifndef __INIT_PERIPHERALS_H__
#define __INIT_PERIPHERALS_H__ #define __INIT_PERIPHERALS_H__
// Includes // Includes:
#include "fsl_common.h" #include "fsl_common.h"
// Typedefs:
typedef struct {
clock_name_t clockSrc;
I2C_Type *baseAddr;
uint16_t mux;
clock_ip_name_t sdaClock;
GPIO_Type *sdaGpio;
PORT_Type *sdaPort;
uint32_t sdaPin;
clock_ip_name_t sclClock;
GPIO_Type *sclGpio;
PORT_Type *sclPort;
uint32_t sclPin;
} i2c_bus_t;
// Variables: // Variables:
extern bool IsBusPalOn; extern bool IsBusPalOn;

View File

@@ -19,7 +19,6 @@
KeyActionType_SwitchLayer, KeyActionType_SwitchLayer,
KeyActionType_SwitchKeymap, KeyActionType_SwitchKeymap,
KeyActionType_PlayMacro, KeyActionType_PlayMacro,
KeyActionType_Test,
} key_action_type_t; } key_action_type_t;
typedef enum { typedef enum {
@@ -29,9 +28,9 @@
} keystroke_type_t; } keystroke_type_t;
typedef enum { typedef enum {
SwitchLayerMode_Hold,
SwitchLayerMode_HoldAndDoubleTapToggle, SwitchLayerMode_HoldAndDoubleTapToggle,
SwitchLayerMode_Toggle, SwitchLayerMode_Toggle,
SwitchLayerMode_Hold,
} switch_layer_mode_t; } switch_layer_mode_t;
typedef enum { typedef enum {

View File

@@ -9,7 +9,7 @@
// Macros: // Macros:
#define KEY_DEBOUNCER_INTERVAL_MSEC 1 #define KEY_DEBOUNCER_INTERVAL_MSEC 1
#define KEY_DEBOUNCER_TIMEOUT_MSEC 60 #define KEY_DEBOUNCER_TIMEOUT_MSEC 100
// Functions: // Functions:

View File

@@ -23,7 +23,7 @@ void SwitchKeymapById(uint8_t index)
CurrentKeymapIndex = index; CurrentKeymapIndex = index;
ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset; ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset;
ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount); ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount);
LedDisplay_SetCurrentKeymapText(); LedDisplay_UpdateText();
} }
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev) bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev)

View File

@@ -5,12 +5,12 @@
#include "keymap.h" #include "keymap.h"
static bool heldLayers[LAYER_COUNT]; static bool heldLayers[LAYER_COUNT];
static switch_layer_mode_t pressedLayers[LAYER_COUNT]; static bool toggledLayers[LAYER_COUNT];
void updateLayerStates(void) void updateLayerStates(void)
{ {
memset(heldLayers, false, LAYER_COUNT); memset(heldLayers, false, LAYER_COUNT);
memset(pressedLayers, false, LAYER_COUNT); memset(toggledLayers, false, LAYER_COUNT);
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) { for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) { for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
@@ -20,9 +20,8 @@ void updateLayerStates(void)
if (action.type == KeyActionType_SwitchLayer) { if (action.type == KeyActionType_SwitchLayer) {
if (action.switchLayer.mode != SwitchLayerMode_Toggle) { if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
heldLayers[action.switchLayer.layer] = true; heldLayers[action.switchLayer.layer] = true;
} } else if (!keyState->previous) {
if (action.switchLayer.mode != SwitchLayerMode_Hold && !keyState->previous && keyState->current) { toggledLayers[action.switchLayer.layer] = true;
pressedLayers[action.switchLayer.layer] = action.switchLayer.mode;
} }
} }
} }
@@ -40,11 +39,11 @@ layer_id_t GetActiveLayer()
// Handle toggled layers // Handle toggled layers
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) { for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
if (pressedLayers[layerId]) { if (toggledLayers[layerId]) {
if (ToggledLayer == layerId) { if (ToggledLayer == layerId) {
ToggledLayer = LayerId_Base; ToggledLayer = LayerId_Base;
break; break;
} else if (ToggledLayer == LayerId_Base && pressedLayers[layerId] == SwitchLayerMode_Toggle) { } else if (ToggledLayer == LayerId_Base && toggledLayers[layerId] == SwitchLayerMode_Toggle) {
ToggledLayer = layerId; ToggledLayer = layerId;
break; break;
} }

View File

@@ -5,8 +5,10 @@
uint8_t IconsAndLayerTextsBrightness = 0xff; uint8_t IconsAndLayerTextsBrightness = 0xff;
uint8_t AlphanumericSegmentsBrightness = 0xff; uint8_t AlphanumericSegmentsBrightness = 0xff;
bool ledIconStates[LedDisplayIcon_Last];
char LedDisplay_DebugString[] = " ";
static const uint16_t capitalLetterToSegmentSet[] = { static const uint16_t capitalLetterToSegmentMap[] = {
0b0000000011110111, 0b0000000011110111,
0b0001001010001111, 0b0001001010001111,
0b0000000000111001, 0b0000000000111001,
@@ -35,7 +37,7 @@ static const uint16_t capitalLetterToSegmentSet[] = {
0b0000110000001001, 0b0000110000001001,
}; };
static const uint16_t digitToSegmentSet[] = { static const uint16_t digitToSegmentMap[] = {
0b0000110000111111, 0b0000110000111111,
0b0000010000000110, 0b0000010000000110,
0b0000100010001011, 0b0000100010001011,
@@ -48,13 +50,13 @@ static const uint16_t digitToSegmentSet[] = {
0b0000000011101111, 0b0000000011101111,
}; };
static uint16_t characterToSegmentSet(char character) static uint16_t characterToSegmentMap(char character)
{ {
switch (character) { switch (character) {
case 'A' ... 'Z': case 'A' ... 'Z':
return capitalLetterToSegmentSet[character - 'A']; return capitalLetterToSegmentMap[character - 'A'];
case '0' ... '9': case '0' ... '9':
return digitToSegmentSet[character - '0']; return digitToSegmentMap[character - '0'];
} }
return 0; return 0;
} }
@@ -65,11 +67,11 @@ void LedDisplay_SetText(uint8_t length, const char* text)
switch (length) { switch (length) {
case 3: case 3:
allSegmentSets = (uint64_t)characterToSegmentSet(text[2]) << 28; allSegmentSets = (uint64_t)characterToSegmentMap(text[2]) << 28;
case 2: case 2:
allSegmentSets |= characterToSegmentSet(text[1]) << 14; allSegmentSets |= characterToSegmentMap(text[1]) << 14;
case 1: case 1:
allSegmentSets |= characterToSegmentSet(text[0]); allSegmentSets |= characterToSegmentMap(text[0]);
} }
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0; LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0;
@@ -84,12 +86,6 @@ 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(layer_id_t layerId) void LedDisplay_SetLayer(layer_id_t layerId)
{ {
for (uint8_t i = 13; i <= 45; i += 16) { for (uint8_t i = 13; i <= 45; i += 16) {
@@ -108,5 +104,29 @@ bool LedDisplay_GetIcon(led_display_icon_t icon)
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled) 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();
} }

View File

@@ -7,26 +7,33 @@
#include <stdbool.h> #include <stdbool.h>
#include "layer.h" #include "layer.h"
// Macros:
#define LED_DISPLAY_DEBUG_MODE 0
// Typedefs: // Typedefs:
typedef enum { typedef enum {
LedDisplayIcon_CapsLock, LedDisplayIcon_CapsLock,
LedDisplayIcon_Agent, LedDisplayIcon_Agent,
LedDisplayIcon_Adaptive, LedDisplayIcon_Adaptive,
LedDisplayIcon_Last = LedDisplayIcon_Adaptive,
} led_display_icon_t; } led_display_icon_t;
// Variables: // Variables:
extern uint8_t IconsAndLayerTextsBrightness; extern uint8_t IconsAndLayerTextsBrightness;
extern uint8_t AlphanumericSegmentsBrightness; extern uint8_t AlphanumericSegmentsBrightness;
extern char LedDisplay_DebugString[];
// Functions: // Functions:
void LedDisplay_SetText(uint8_t length, const char* text); void LedDisplay_SetText(uint8_t length, const char* text);
void LedDisplay_SetCurrentKeymapText(void);
void LedDisplay_SetLayer(layer_id_t layerId); void LedDisplay_SetLayer(layer_id_t layerId);
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled);
bool LedDisplay_GetIcon(led_display_icon_t icon); 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 #endif

View 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 );
}

View File

@@ -39,7 +39,7 @@
struct { struct {
macro_sub_action_t action; macro_sub_action_t action;
keystroke_type_t type; keystroke_type_t type;
uint8_t scancode; uint16_t scancode;
uint8_t modifierMask; uint8_t modifierMask;
} ATTR_PACKED key; } ATTR_PACKED key;
struct { struct {

View File

@@ -9,6 +9,7 @@
#include "key_scanner.h" #include "key_scanner.h"
#include "usb_commands/usb_command_apply_config.h" #include "usb_commands/usb_command_apply_config.h"
#include "peripherals/reset_button.h" #include "peripherals/reset_button.h"
#include "config_parser/config_globals.h"
#include "usb_report_updater.h" #include "usb_report_updater.h"
static bool IsEepromInitialized = false; static bool IsEepromInitialized = false;
@@ -21,17 +22,21 @@ static void userConfigurationReadFinished(void)
static void hardwareConfigurationReadFinished(void) static void hardwareConfigurationReadFinished(void)
{ {
if (IsFactoryResetModeEnabled) {
HardwareConfig->signatureLength = HARDWARE_CONFIG_SIGNATURE_LENGTH;
strncpy(HardwareConfig->signature, "FTY", HARDWARE_CONFIG_SIGNATURE_LENGTH);
}
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished); EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished);
} }
void main(void) int main(void)
{ {
InitClock(); InitClock();
InitPeripherals(); InitPeripherals();
if (!RESET_BUTTON_IS_PRESSED) { IsFactoryResetModeEnabled = RESET_BUTTON_IS_PRESSED;
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
} EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
if (IsBusPalOn) { if (IsBusPalOn) {
init_hardware(); init_hardware();

View File

@@ -2,6 +2,8 @@
#include "fsl_port.h" #include "fsl_port.h"
#include "bootloader/wormhole.h" #include "bootloader/wormhole.h"
bool IsFactoryResetModeEnabled = false;
void RESET_BUTTON_IRQ_HANDLER(void) void RESET_BUTTON_IRQ_HANDLER(void)
{ {
Wormhole.magicNumber = WORMHOLE_MAGIC_NUMBER; Wormhole.magicNumber = WORMHOLE_MAGIC_NUMBER;

View File

@@ -16,6 +16,10 @@
#define RESET_BUTTON_IS_PRESSED !GPIO_ReadPinInput(RESET_BUTTON_GPIO, RESET_BUTTON_PIN) #define RESET_BUTTON_IS_PRESSED !GPIO_ReadPinInput(RESET_BUTTON_GPIO, RESET_BUTTON_PIN)
// Variables:
extern bool IsFactoryResetModeEnabled;
// Functions: // Functions:
void InitResetButton(void); void InitResetButton(void);

View File

@@ -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 setFrame1Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1};
static uint8_t updatePwmRegistersBuffer[PWM_REGISTER_BUFFER_LENGTH]; 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) void LedSlaveDriver_Init(uint8_t ledDriverId)
{ {
if (ledDriverId == ISO_KEY_LED_DRIVER_ID && IS_ISO) { 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); memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
if (ledDriverId == LedDriverId_Left) { if (ledDriverId == LedDriverId_Left) {
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, false); LedDisplay_UpdateAll();
LedDisplay_SetIcon(LedDisplayIcon_Agent, false);
LedDisplay_SetIcon(LedDisplayIcon_Adaptive, false);
LedDisplay_SetCurrentKeymapText();
} }
} }
@@ -118,10 +131,8 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
*ledIndex += chunkSize; *ledIndex += chunkSize;
if (*ledIndex >= LED_DRIVER_LED_COUNT) { if (*ledIndex >= LED_DRIVER_LED_COUNT) {
*ledIndex = 0; *ledIndex = 0;
#ifndef LED_DRIVER_STRESS_TEST
memcpy(currentLedDriverState->targetLedValues, ledValues, LED_DRIVER_LED_COUNT); memcpy(currentLedDriverState->targetLedValues, ledValues, LED_DRIVER_LED_COUNT);
*ledDriverPhase = LedDriverPhase_UpdateChangedLedValues; *ledDriverPhase = LedDriverPhase_UpdateChangedLedValues;
#endif
} }
break; break;
case LedDriverPhase_UpdateChangedLedValues: { case LedDriverPhase_UpdateChangedLedValues: {

View File

@@ -23,6 +23,7 @@
typedef enum { typedef enum {
LedDriverId_Right, LedDriverId_Right,
LedDriverId_Left, LedDriverId_Left,
LedDriverId_Last = LedDriverId_Left,
} led_driver_id_t; } led_driver_id_t;
typedef enum { typedef enum {
@@ -49,6 +50,8 @@
// Functions: // Functions:
void LedSlaveDriver_DisableLeds(void);
void LedSlaveDriver_UpdateLeds(void);
void LedSlaveDriver_Init(uint8_t ledDriverId); void LedSlaveDriver_Init(uint8_t ledDriverId);
status_t LedSlaveDriver_Update(uint8_t ledDriverId); status_t LedSlaveDriver_Update(uint8_t ledDriverId);

View File

@@ -265,10 +265,8 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
void UhkModuleSlaveDriver_Disconnect(uint8_t uhkModuleDriverId) void UhkModuleSlaveDriver_Disconnect(uint8_t uhkModuleDriverId)
{ {
#ifdef LED_DRIVERS_ENABLED
if (uhkModuleDriverId == SlaveId_LeftKeyboardHalf) { if (uhkModuleDriverId == SlaveId_LeftKeyboardHalf) {
Slaves[SlaveId_LeftLedDriver].isConnected = false; Slaves[SlaveId_LeftLedDriver].isConnected = false;
} }
UhkModuleStates[uhkModuleDriverId].moduleId = 0; UhkModuleStates[uhkModuleDriverId].moduleId = 0;
#endif
} }

View File

@@ -31,7 +31,6 @@ uhk_slave_t Slaves[] = {
.update = UhkModuleSlaveDriver_Update, .update = UhkModuleSlaveDriver_Update,
.perDriverId = UhkModuleDriverId_RightAddon, .perDriverId = UhkModuleDriverId_RightAddon,
}, },
#ifdef LED_DRIVERS_ENABLED
{ {
.init = LedSlaveDriver_Init, .init = LedSlaveDriver_Init,
.update = LedSlaveDriver_Update, .update = LedSlaveDriver_Update,
@@ -42,7 +41,6 @@ uhk_slave_t Slaves[] = {
.update = LedSlaveDriver_Update, .update = LedSlaveDriver_Update,
.perDriverId = LedDriverId_Left, .perDriverId = LedDriverId_Left,
}, },
#endif
{ {
.init = KbootSlaveDriver_Init, .init = KbootSlaveDriver_Init,
.update = KbootSlaveDriver_Update, .update = KbootSlaveDriver_Update,

View File

@@ -19,10 +19,8 @@
SlaveId_LeftKeyboardHalf, SlaveId_LeftKeyboardHalf,
SlaveId_LeftAddon, SlaveId_LeftAddon,
SlaveId_RightAddon, SlaveId_RightAddon,
#ifdef LED_DRIVERS_ENABLED
SlaveId_RightLedDriver, SlaveId_RightLedDriver,
SlaveId_LeftLedDriver, SlaveId_LeftLedDriver,
#endif
SlaveId_KbootDriver, SlaveId_KbootDriver,
} slave_id_t; } slave_id_t;

View File

@@ -1,6 +1,7 @@
#include "usb_commands/usb_command_apply_config.h" #include "usb_commands/usb_command_apply_config.h"
#include "config_parser/config_globals.h" #include "config_parser/config_globals.h"
#include "config_parser/parse_config.h" #include "config_parser/parse_config.h"
#include "peripherals/reset_button.h"
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "keymap.h" #include "keymap.h"
@@ -35,6 +36,10 @@ void UsbCommand_ApplyConfig(void)
ValidatedUserConfigBuffer.buffer = StagingUserConfigBuffer.buffer; ValidatedUserConfigBuffer.buffer = StagingUserConfigBuffer.buffer;
StagingUserConfigBuffer.buffer = temp; StagingUserConfigBuffer.buffer = temp;
if (IsFactoryResetModeEnabled) {
return;
}
ParserRunDry = false; ParserRunDry = false;
ValidatedUserConfigBuffer.offset = 0; ValidatedUserConfigBuffer.offset = 0;
parseConfigStatus = ParseConfig(&ValidatedUserConfigBuffer); parseConfigStatus = ParseConfig(&ValidatedUserConfigBuffer);

View File

@@ -163,58 +163,21 @@ static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
} }
}}; }};
static bool computerSleeping = false; bool IsHostSleeping = false;
#ifdef LED_DRIVERS_ENABLED
static uint8_t oldKeyBacklightBrightness = 0xFF;
static bool capsLockOn = false, agentOn = false, adaptiveOn = false;
#endif
bool IsComputerSleeping(void) { static void suspendHost(void) {
return computerSleeping; IsHostSleeping = true;
LedSlaveDriver_DisableLeds();
} }
static void ComputerIsSleeping(void) { void WakeUpHost(bool sendResume) {
computerSleeping = true; if (sendResume) { // The device should wake up the host.
#ifdef LED_DRIVERS_ENABLED // Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
// Save the state of the icons USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL);
capsLockOn = LedDisplay_GetIcon(LedDisplayIcon_CapsLock); }
agentOn = LedDisplay_GetIcon(LedDisplayIcon_Agent);
adaptiveOn = LedDisplay_GetIcon(LedDisplayIcon_Adaptive);
// Disable keyboard backlight IsHostSleeping = false;
oldKeyBacklightBrightness = KeyBacklightBrightness; LedSlaveDriver_UpdateLeds();
KeyBacklightBrightness = 0;
LedSlaveDriver_Init(LedDriverId_Right);
LedSlaveDriver_Init(LedDriverId_Left);
// Turn layer LEDs off
LedDisplay_SetLayer(LayerId_Base);
// Clear the text
LedDisplay_SetText(0, NULL);
#endif
}
void WakeupComputer(bool sendResume) {
if (sendResume) // The device should wake up the computer
USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL); // Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
computerSleeping = false; // The computer is now awake
#ifdef LED_DRIVERS_ENABLED
// Restore keyboard backlight and text
KeyBacklightBrightness = oldKeyBacklightBrightness;
LedSlaveDriver_Init(LedDriverId_Right);
LedSlaveDriver_Init(LedDriverId_Left);
// Update the active layer
LedDisplay_SetLayer(GetActiveLayer());
// Restore icon states
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, capsLockOn);
LedDisplay_SetIcon(LedDisplayIcon_Agent, agentOn);
LedDisplay_SetIcon(LedDisplayIcon_Adaptive, adaptiveOn);
#endif
} }
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param) static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
@@ -227,8 +190,9 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
return status; return status;
} }
if (computerSleeping) if (IsHostSleeping) {
WakeupComputer(false); // Wake up the keyboard if there is any activity on the bus WakeUpHost(false); // Wake up the keyboard if there is any activity on the bus.
}
switch (event) { switch (event) {
case kUSB_DeviceEventBusReset: case kUSB_DeviceEventBusReset:
@@ -237,13 +201,13 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
break; break;
case kUSB_DeviceEventSuspend: case kUSB_DeviceEventSuspend:
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
ComputerIsSleeping(); // The computer sends this event when it goes to sleep, so turn off all the LEDs suspendHost(); // The host sends this event when it goes to sleep, so turn off all the LEDs.
status = kStatus_USB_Success; status = kStatus_USB_Success;
} }
break; break;
case kUSB_DeviceEventResume: case kUSB_DeviceEventResume:
// We will just wake up the computer if there is any activity on the bus // We will just wake up the host if there is any activity on the bus.
// The problem is that the computer won't send a resume event when it boots, so the lights will never come back on // The problem is that the host won't send a resume event when it boots, so the lights will never come back on.
status = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetConfiguration: case kUSB_DeviceEventSetConfiguration:

View File

@@ -28,12 +28,12 @@
// Variables: // Variables:
extern bool IsHostSleeping;
extern usb_composite_device_t UsbCompositeDevice; extern usb_composite_device_t UsbCompositeDevice;
//Functions: //Functions:
void InitUsb(void); void InitUsb(void);
bool IsComputerSleeping(void); void WakeUpHost(bool sendResume);
void WakeupComputer(bool sendResume);
#endif #endif

View File

@@ -21,7 +21,7 @@ uint8_t UsbBasicKeyboardReportDescriptor[USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LE
HID_RI_REPORT_SIZE(8, 0x08), HID_RI_REPORT_SIZE(8, 0x08),
HID_RI_INPUT(8, HID_IOF_CONSTANT), HID_RI_INPUT(8, HID_IOF_CONSTANT),
// LED status // LED status - Num lock, Caps lock, Scroll lock, Compose, Kana
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_LEDS), HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_LEDS),
HID_RI_USAGE_MINIMUM(8, 0x01), HID_RI_USAGE_MINIMUM(8, 0x01),
HID_RI_USAGE_MAXIMUM(8, 0x05), HID_RI_USAGE_MAXIMUM(8, 0x05),

View File

@@ -3,7 +3,7 @@
#include "usb_descriptor_generic_hid_report.h" #include "usb_descriptor_generic_hid_report.h"
uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH] = { uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH] = {
HID_RI_USAGE_PAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX), HID_RI_USAGE_PAGE(16, (0xFF00 | USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX)),
HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION), HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION),
HID_RI_COLLECTION(8, HID_RI_COLLECTION_APPLICATION), HID_RI_COLLECTION(8, HID_RI_COLLECTION_APPLICATION),

View File

@@ -3,12 +3,12 @@
// Macros: // Macros:
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 33 #define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 34
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX 0x80 #define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX 0x00
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION 0x81 #define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION 0x01
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_IN 0x82 #define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_IN 0x02
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_OUT 0x83 #define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_OUT 0x03
// Variables: // Variables:

View File

@@ -4,7 +4,6 @@
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2]; static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
uint32_t UsbBasicKeyboardActionCounter; uint32_t UsbBasicKeyboardActionCounter;
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports; usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
volatile bool IsUsbBasicKeyboardReportSent = false;
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH]; static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
static usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void) static usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
@@ -22,14 +21,12 @@ void ResetActiveUsbBasicKeyboardReport(void)
bzero(ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH); bzero(ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
} }
static usb_status_t UsbBasicKeyboardAction(void) usb_status_t UsbBasicKeyboardAction(void)
{ {
usb_status_t status = USB_DeviceHidSend(
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
IsUsbBasicKeyboardReportSent = true;
UsbBasicKeyboardActionCounter++; UsbBasicKeyboardActionCounter++;
return status; return USB_DeviceHidSend(
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
} }
usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param) usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
@@ -38,10 +35,6 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
switch (event) { switch (event) {
case kUSB_DeviceHidEventSendResponse: case kUSB_DeviceHidEventSendResponse:
if (UsbCompositeDevice.attach) {
return UsbBasicKeyboardAction();
}
break;
case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventGetReport:
error = kStatus_USB_InvalidRequest; error = kStatus_USB_InvalidRequest;
break; break;
@@ -80,7 +73,7 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
{ {
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
return UsbBasicKeyboardAction(); //return UsbBasicKeyboardAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }
@@ -88,7 +81,7 @@ usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t con
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
{ {
if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == interface) { if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == interface) {
return UsbBasicKeyboardAction(); //return UsbBasicKeyboardAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }

View File

@@ -31,7 +31,6 @@
// Variables: // Variables:
extern volatile bool IsUsbBasicKeyboardReportSent;
extern uint32_t UsbBasicKeyboardActionCounter; extern uint32_t UsbBasicKeyboardActionCounter;
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport; extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
@@ -43,5 +42,6 @@
void ResetActiveUsbBasicKeyboardReport(void); void ResetActiveUsbBasicKeyboardReport(void);
void SwitchActiveUsbBasicKeyboardReport(void); void SwitchActiveUsbBasicKeyboardReport(void);
usb_status_t UsbBasicKeyboardAction(void);
#endif #endif

View File

@@ -3,7 +3,6 @@
uint32_t UsbMediaKeyboardActionCounter; uint32_t UsbMediaKeyboardActionCounter;
static usb_media_keyboard_report_t usbMediaKeyboardReports[2]; static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports; usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
volatile bool IsUsbMediaKeyboardReportSent = false;
static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void) static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
{ {
@@ -20,14 +19,12 @@ void ResetActiveUsbMediaKeyboardReport(void)
bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH); bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
} }
static usb_status_t UsbMediaKeyboardAction(void) usb_status_t UsbMediaKeyboardAction()
{ {
usb_status_t status = USB_DeviceHidSend(
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
IsUsbMediaKeyboardReportSent = true;
UsbMediaKeyboardActionCounter++; UsbMediaKeyboardActionCounter++;
return status; return USB_DeviceHidSend(
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
} }
usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param) usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
@@ -36,10 +33,6 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi
switch (event) { switch (event) {
case kUSB_DeviceHidEventSendResponse: case kUSB_DeviceHidEventSendResponse:
if (UsbCompositeDevice.attach) {
return UsbMediaKeyboardAction();
}
break;
case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventGetReport:
case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventSetReport:
case kUSB_DeviceHidEventRequestReportBuffer: case kUSB_DeviceHidEventRequestReportBuffer:
@@ -60,7 +53,7 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi
usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
{ {
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
return UsbMediaKeyboardAction(); //return UsbMediaKeyboardAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }
@@ -68,7 +61,7 @@ usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t con
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
{ {
if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == interface) { if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == interface) {
return UsbMediaKeyboardAction(); //return UsbMediaKeyboardAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }

View File

@@ -28,7 +28,6 @@
// Variables: // Variables:
extern volatile bool IsUsbMediaKeyboardReportSent;
extern uint32_t UsbMediaKeyboardActionCounter; extern uint32_t UsbMediaKeyboardActionCounter;
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport; extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
@@ -40,5 +39,6 @@
void ResetActiveUsbMediaKeyboardReport(void); void ResetActiveUsbMediaKeyboardReport(void);
void SwitchActiveUsbMediaKeyboardReport(void); void SwitchActiveUsbMediaKeyboardReport(void);
usb_status_t UsbMediaKeyboardAction();
#endif #endif

View File

@@ -3,7 +3,6 @@
uint32_t UsbMouseActionCounter; uint32_t UsbMouseActionCounter;
static usb_mouse_report_t usbMouseReports[2]; static usb_mouse_report_t usbMouseReports[2];
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports; usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
volatile bool IsUsbMouseReportSent = false;
static usb_mouse_report_t* getInactiveUsbMouseReport(void) static usb_mouse_report_t* getInactiveUsbMouseReport(void)
{ {
@@ -20,25 +19,31 @@ void ResetActiveUsbMouseReport(void)
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
} }
static volatile usb_status_t usbMouseAction(void) usb_status_t usbMouseAction(void)
{ {
usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport(); UsbMouseActionCounter++;
IsUsbMouseReportSent = true; return USB_DeviceHidSend(
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
(uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH); (uint8_t*)getInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH);
} }
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param) usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
{ {
UsbMouseActionCounter++; static bool usbMouseActionActive = false;
usb_status_t error = kStatus_USB_Error; usb_status_t error = kStatus_USB_Error;
switch (event) { switch (event) {
case kUSB_DeviceHidEventSendResponse: case kUSB_DeviceHidEventSendResponse:
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
return usbMouseAction(); // Send out the report continuously if the report is not zeros
usb_mouse_report_t *report = getInactiveUsbMouseReport();
uint8_t zeroBuf[sizeof(usb_mouse_report_t)] = { 0 };
bool reportChanged = memcmp(report, zeroBuf, sizeof(usb_mouse_report_t)) != 0;
if (usbMouseActionActive || reportChanged) {
usbMouseActionActive = reportChanged; // Used to send out all zeros once after a report has been sent
return usbMouseAction();
}
} }
break;
case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventGetReport:
case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventSetReport:
case kUSB_DeviceHidEventRequestReportBuffer: case kUSB_DeviceHidEventRequestReportBuffer:
@@ -59,7 +64,7 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param
usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration) usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration)
{ {
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
return usbMouseAction(); //return usbMouseAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }
@@ -67,7 +72,7 @@ usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configurati
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
{ {
if (USB_MOUSE_INTERFACE_INDEX == interface) { if (USB_MOUSE_INTERFACE_INDEX == interface) {
return usbMouseAction(); //return usbMouseAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }

View File

@@ -31,7 +31,6 @@
// Variables: // Variables:
extern volatile bool IsUsbMouseReportSent;
extern uint32_t UsbMouseActionCounter; extern uint32_t UsbMouseActionCounter;
extern usb_mouse_report_t* ActiveUsbMouseReport; extern usb_mouse_report_t* ActiveUsbMouseReport;
@@ -43,5 +42,6 @@
void ResetActiveUsbMouseReport(void); void ResetActiveUsbMouseReport(void);
void SwitchActiveUsbMouseReport(void); void SwitchActiveUsbMouseReport(void);
usb_status_t usbMouseAction(void);
#endif #endif

View File

@@ -3,7 +3,6 @@
uint32_t UsbSystemKeyboardActionCounter; uint32_t UsbSystemKeyboardActionCounter;
static usb_system_keyboard_report_t usbSystemKeyboardReports[2]; static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports; usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
volatile bool IsUsbSystemKeyboardReportSent = false;
static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport() static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
{ {
@@ -20,14 +19,12 @@ void ResetActiveUsbSystemKeyboardReport(void)
bzero(ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH); bzero(ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
} }
static usb_status_t UsbSystemKeyboardAction(void) usb_status_t UsbSystemKeyboardAction(void)
{ {
usb_status_t status = USB_DeviceHidSend(
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
IsUsbSystemKeyboardReportSent = true;
UsbSystemKeyboardActionCounter++; UsbSystemKeyboardActionCounter++;
return status; return USB_DeviceHidSend(
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
} }
usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param) usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
@@ -36,10 +33,6 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo
switch (event) { switch (event) {
case kUSB_DeviceHidEventSendResponse: case kUSB_DeviceHidEventSendResponse:
if (UsbCompositeDevice.attach) {
return UsbSystemKeyboardAction();
}
break;
case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventGetReport:
case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventSetReport:
case kUSB_DeviceHidEventRequestReportBuffer: case kUSB_DeviceHidEventRequestReportBuffer:
@@ -60,7 +53,7 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo
usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
{ {
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
return UsbSystemKeyboardAction(); //return UsbSystemKeyboardAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }
@@ -68,7 +61,7 @@ usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t co
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
{ {
if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == interface) { if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == interface) {
return UsbSystemKeyboardAction(); //return UsbSystemKeyboardAction();
} }
return kStatus_USB_Error; return kStatus_USB_Error;
} }

View File

@@ -29,7 +29,6 @@
// Variables: // Variables:
extern volatile bool IsUsbSystemKeyboardReportSent;
extern uint32_t UsbSystemKeyboardActionCounter; extern uint32_t UsbSystemKeyboardActionCounter;
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport; extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
@@ -41,5 +40,6 @@
void ResetActiveUsbSystemKeyboardReport(void); void ResetActiveUsbSystemKeyboardReport(void);
void SwitchActiveUsbSystemKeyboardReport(void); void SwitchActiveUsbSystemKeyboardReport(void);
usb_status_t UsbSystemKeyboardAction(void);
#endif #endif

View File

@@ -191,23 +191,56 @@ static void processMouseActions()
} }
static layer_id_t previousLayer = LayerId_Base; static layer_id_t previousLayer = LayerId_Base;
static void handleSwitchLayerAction(key_state_t *keyState, key_action_t *action)
{
static key_state_t *doubleTapSwitchLayerKey;
static uint32_t doubleTapSwitchLayerStartTime;
static uint32_t doubleTapSwitchLayerTriggerTime;
static bool isLayerDoubleTapToggled;
if (doubleTapSwitchLayerKey && doubleTapSwitchLayerKey != keyState && !keyState->previous) {
doubleTapSwitchLayerKey = NULL;
}
if (!keyState->previous && isLayerDoubleTapToggled && ToggledLayer == action->switchLayer.layer) {
ToggledLayer = LayerId_Base;
isLayerDoubleTapToggled = false;
}
if (action->type != KeyActionType_SwitchLayer) {
return;
}
if (keyState->previous && doubleTapSwitchLayerKey == keyState &&
Timer_GetElapsedTime(&doubleTapSwitchLayerTriggerTime) > DoubleTapSwitchLayerReleaseTimeout)
{
ToggledLayer = LayerId_Base;
}
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
ToggledLayer = action->switchLayer.layer;
isLayerDoubleTapToggled = true;
doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime();
} else {
doubleTapSwitchLayerKey = keyState;
}
doubleTapSwitchLayerStartTime = Timer_GetCurrentTime();
}
}
static uint8_t basicScancodeIndex = 0; static uint8_t basicScancodeIndex = 0;
static uint8_t mediaScancodeIndex = 0; static uint8_t mediaScancodeIndex = 0;
static uint8_t systemScancodeIndex = 0; static uint8_t systemScancodeIndex = 0;
static void applyKeyAction(key_state_t *keyState, key_action_t *action) static void applyKeyAction(key_state_t *keyState, key_action_t *action)
{ {
static key_state_t *doubleTapSwitchLayerKey;
static uint32_t doubleTapSwitchLayerStartTime;
static uint32_t doubleTapSwitchLayerTriggerTime;
if (keyState->suppressed) { if (keyState->suppressed) {
return; return;
} }
if (doubleTapSwitchLayerKey && doubleTapSwitchLayerKey != keyState && !keyState->previous) { handleSwitchLayerAction(keyState, action);
doubleTapSwitchLayerKey = NULL;
}
switch (action->type) { switch (action->type) {
case KeyActionType_Keystroke: case KeyActionType_Keystroke:
@@ -238,21 +271,7 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
activeMouseStates[action->mouseAction] = true; activeMouseStates[action->mouseAction] = true;
break; break;
case KeyActionType_SwitchLayer: case KeyActionType_SwitchLayer:
if (keyState->previous && doubleTapSwitchLayerKey == keyState && // Handled by handleSwitchLayerAction()
Timer_GetElapsedTime(&doubleTapSwitchLayerTriggerTime) > DoubleTapSwitchLayerReleaseTimeout)
{
ToggledLayer = LayerId_Base;
}
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
ToggledLayer = action->switchLayer.layer;
doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime();
} else {
doubleTapSwitchLayerKey = keyState;
}
doubleTapSwitchLayerStartTime = Timer_GetCurrentTime();
}
break; break;
case KeyActionType_SwitchKeymap: case KeyActionType_SwitchKeymap:
if (!keyState->previous) { if (!keyState->previous) {
@@ -288,7 +307,7 @@ static void updateActiveUsbReports(void)
if (activeLayer == LayerId_Base) { if (activeLayer == LayerId_Base) {
activeLayer = GetActiveLayer(); activeLayer = GetActiveLayer();
} }
bool suppressKeys = previousLayer != LayerId_Base && activeLayer == LayerId_Base; bool layerGotReleased = previousLayer != LayerId_Base && activeLayer == LayerId_Base;
LedDisplay_SetLayer(activeLayer); LedDisplay_SetLayer(activeLayer);
if (MacroPlaying) { if (MacroPlaying) {
@@ -305,7 +324,6 @@ static void updateActiveUsbReports(void)
key_state_t *keyState = &KeyStates[slotId][keyId]; key_state_t *keyState = &KeyStates[slotId][keyId];
key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId]; key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId];
if (keyState->debounceCounter < KEY_DEBOUNCER_TIMEOUT_MSEC) { if (keyState->debounceCounter < KEY_DEBOUNCER_TIMEOUT_MSEC) {
keyState->current = keyState->previous; keyState->current = keyState->previous;
} else if (!keyState->previous && keyState->current) { } else if (!keyState->previous && keyState->current) {
@@ -313,7 +331,8 @@ static void updateActiveUsbReports(void)
} }
if (keyState->current) { if (keyState->current) {
if (suppressKeys) { key_action_t *baseAction = &CurrentKeymap[LayerId_Base][slotId][keyId];
if (layerGotReleased && !(baseAction->type == KeyActionType_Keystroke && baseAction->keystroke.scancode == 0 && baseAction->keystroke.modifiers)) {
keyState->suppressed = true; keyState->suppressed = true;
} }
@@ -377,7 +396,7 @@ void UpdateUsbReports(void)
{ {
UsbReportUpdateCounter++; UsbReportUpdateCounter++;
// Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent // Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent.
bool hasActiveMouseState = false; bool hasActiveMouseState = false;
for (uint8_t i=0; i<ACTIVE_MOUSE_STATES_COUNT; i++) { for (uint8_t i=0; i<ACTIVE_MOUSE_STATES_COUNT; i++) {
hasActiveMouseState = true; hasActiveMouseState = true;
@@ -389,8 +408,6 @@ void UpdateUsbReports(void)
return; return;
} }
Timer_SetCurrentTime(&lastMouseUpdateTime); Timer_SetCurrentTime(&lastMouseUpdateTime);
} else if (!IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) {
return;
} }
ResetActiveUsbBasicKeyboardReport(); ResetActiveUsbBasicKeyboardReport();
@@ -401,34 +418,42 @@ void UpdateUsbReports(void)
updateActiveUsbReports(); updateActiveUsbReports();
static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF }; static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF };
bool HasUsbBasicKeyboardReportChanged = false;
if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) { if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) {
last_basic_report = *ActiveUsbBasicKeyboardReport; last_basic_report = *ActiveUsbBasicKeyboardReport;
SwitchActiveUsbBasicKeyboardReport(); SwitchActiveUsbBasicKeyboardReport();
IsUsbBasicKeyboardReportSent = false; HasUsbBasicKeyboardReportChanged = true;
UsbBasicKeyboardAction();
} }
static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF }; static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF };
bool HasUsbMediaKeyboardReportChanged = false;
if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) { if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) {
last_media_report = *ActiveUsbMediaKeyboardReport; last_media_report = *ActiveUsbMediaKeyboardReport;
HasUsbMediaKeyboardReportChanged = true;
SwitchActiveUsbMediaKeyboardReport(); SwitchActiveUsbMediaKeyboardReport();
IsUsbMediaKeyboardReportSent = false; UsbMediaKeyboardAction();
} }
static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF }; static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF };
bool HasUsbSystemKeyboardReportChanged = false;
if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) { if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) {
last_system_report = *ActiveUsbSystemKeyboardReport; last_system_report = *ActiveUsbSystemKeyboardReport;
HasUsbSystemKeyboardReportChanged = true;
SwitchActiveUsbSystemKeyboardReport(); SwitchActiveUsbSystemKeyboardReport();
IsUsbSystemKeyboardReportSent = false; UsbSystemKeyboardAction();
} }
static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF }; static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF };
bool HasUsbMouseReportChanged = false;
if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) { if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) {
last_mouse_report = *ActiveUsbMouseReport; last_mouse_report = *ActiveUsbMouseReport;
HasUsbMouseReportChanged = true;
SwitchActiveUsbMouseReport(); SwitchActiveUsbMouseReport();
IsUsbMouseReportSent = false; usbMouseAction();
} }
if ((previousLayer != LayerId_Base || !IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) && IsComputerSleeping()) { if ((previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged) && IsHostSleeping) {
WakeupComputer(true); // Wake up the computer if any key is pressed and the computer is sleeping WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping.
} }
} }

229
scripts/Makedefs.mk Normal file
View File

@@ -0,0 +1,229 @@
# Copyright (C) 2018 Kristian Lauszus. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Contact information
# -------------------
# Kristian Lauszus
# Web : http://www.lauszus.com
# e-mail : lauszus@gmail.com
# Debug using Semihosting.
SEMIHOSTING ?= 0
# Build directory.
BUILD_DIR ?= build_make
# Set default value (no bootloader) for the bootloader vector table address.
BL_APP_VECTOR_TABLE_ADDRESS ?= 0
# Preprocessor directives.
BUILD_FLAGS += -D__NEWLIB__ -D__USE_CMSIS -D__MCUXPRESSO -DCPU_$(PART) -D__STARTUP_CLEAR_BSS -DBL_APP_VECTOR_TABLE_ADDRESS=$(BL_APP_VECTOR_TABLE_ADDRESS)
# Path to project object file.
PROJECT_OBJ = $(BUILD_DIR)/$(PROJECT_NAME).axf
# Set the prefix for the tools to use.
PREFIX ?= arm-none-eabi
# Set WIN=1 manually for Windows Subsystem for Linux.
WIN ?= 0
# Determine if we are on a Windows machine and set the .exe suffix.
UNAME_S := $(shell uname -s)
ifeq ($(OS),Windows_NT) # Native Windows.
WIN = 1
endif
# Set J-Link executable.
ifeq ($(WIN),1)
JLINK := JLink.exe
else
JLINK := JLinkExe
endif
# We can not use the suffix command, as the PREFIX might contain spaces.
ifeq ($(WIN),1)
SUFFIX := .exe
endif
# The command for calling the compilers.
CC = $(PREFIX)-gcc$(SUFFIX)
CXX = $(PREFIX)-g++$(SUFFIX)
# The command for calling the linker.
LD = $(PREFIX)-g++$(SUFFIX)
# The command for extracting images from the linked executables.
OBJCOPY = $(PREFIX)-objcopy$(SUFFIX)
# The command for the size tool.
SIZE = $(PREFIX)-size$(SUFFIX)
# Auto-dependency generation flags.
DEPS = -MMD -MP
# The flags passed to the assembler.
AFLAGS = -mthumb \
$(CPU) \
$(FPU) \
$(DEPS) \
$(BUILD_FLAGS) \
-x assembler-with-cpp
# The flags passed to the compiler.
CFLAGS = -mthumb \
$(CPU) \
$(FPU) \
$(DEPS) \
-fno-builtin \
-ffunction-sections \
-fdata-sections \
-fno-common \
-Wdouble-promotion \
-Woverflow \
-Wall \
-Wshadow \
$(BUILD_FLAGS)
# Compiler options for C++ only.
CXXFLAGS = -felide-constructors -fno-exceptions -fno-rtti
# Set the C/C++ standard to use.
CSTD = -std=gnu11
CXXSTD = -std=gnu++14
# Make all warnings into errors when building using Travis CI.
ifdef TRAVIS
CFLAGS += -Werror
endif
# The flags passed to the linker.
LDFLAGS = --specs=nano.specs -mthumb $(CPU) $(FPU) -T $(LDSCRIPT) -Wl,-Map=$(PROJECT_OBJ:.axf=.map),--gc-sections,-print-memory-usage,-no-wchar-size-warning,--defsym=__heap_size__=$(HEAP_SIZE),--defsym=__stack_size__=$(STACK_SIZE),--defsym=__bl_app_vector_table_address__=$(BL_APP_VECTOR_TABLE_ADDRESS)
# Include the following archives.
LDARCHIVES = -Wl,--start-group -lg -lgcc -lm -Wl,--end-group
# Add flags to the build flags and linker depending on the build settings.
ifeq ($(SEMIHOSTING),1)
# Include Semihost library.
LDARCHIVES += -lcr_newlib_semihost
# Enable printf floating numbers.
LDFLAGS += -u _printf_float
else
# Include libnosys.a if Semihosting is disabled.
LDARCHIVES += -lnosys
endif
# Check if the DEBUG environment variable is set.
DEBUG ?= 0
ifeq ($(DEBUG),1)
CFLAGS += -O3 -g3 -DDEBUG
else
CFLAGS += -O3 -DNDEBUG
endif
# Add the include file paths to AFLAGS and CFLAGS.
AFLAGS += $(patsubst %,-I%,$(subst :, ,$(IPATH)))
CFLAGS += $(patsubst %,-I%,$(subst :, ,$(IPATH)))
# Create lists of C, C++ and assembly objects.
C_OBJS := $(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(basename $(filter %.c,$(abspath $(SOURCE))))))
CPP_OBJS := $(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(basename $(filter %.cpp,$(abspath $(SOURCE))))))
S_OBJS := $(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(basename $(filter %.S,$(abspath $(SOURCE))))))
# Create a list of all objects.
OBJS := $(C_OBJS) $(CPP_OBJS) $(S_OBJS)
# Define the commands used for compiling the project.
LD_CMD = $(LD) $(LDFLAGS) -o $(@) $(filter %.o %.a, $(^)) $(LDARCHIVES)
CC_CMD = $(CC) $(CFLAGS) $(CSTD) -c $(<) -o $(@)
CXX_CMD = $(CXX) $(CFLAGS) $(CXXFLAGS) $(CXXSTD) -c $(<) -o $(@)
AS_CMD = $(CC) $(AFLAGS) $(CSTD) -c $(<) -o $(@)
# Everyone need colors in their life!
INTERACTIVE := $(shell [ -t 0 ] && echo 1)
ifeq ($(INTERACTIVE),1)
color_default = \033[0m
color_bold = \033[01m
color_red = \033[31m
color_green = \033[32m
color_yellow = \033[33m
color_blue = \033[34m
color_magenta = \033[35m
color_cyan = \033[36m
color_orange = \033[38;5;172m
color_light_blue = \033[38;5;039m
color_gray = \033[38;5;008m
color_purple = \033[38;5;097m
endif
.PHONY: all clean flash flash-jlink
# The default rule, which causes the project to be built.
all: $(PROJECT_OBJ)
# The rule to clean out all the build products.
clean:
@rm -rf $(BUILD_DIR) $(wildcard *~)
@echo "$(color_red)Done cleaning!$(color_default)"
flash: all
@$(FLASH_CMD) || exit 1
flash-jlink: all
$(JLINK) -if SWD -CommandFile $(JLINK_SCRIPT) || exit 1
# Rebuild all objects when the Makefiles change.
$(OBJS): $(MAKEFILE_LIST)
# The rule for linking the application.
$(PROJECT_OBJ): $(OBJS) $(LDSCRIPT)
@if [ '$(VERBOSE)' = 1 ]; then \
echo $(LD_CMD); \
else \
echo " $(color_purple)LD$(color_default) $(@F)"; \
fi
@echo
@$(LD_CMD)
@echo
@if [ '$(VERBOSE)' = 1 ]; then \
$(SIZE) -Ax $(@); \
fi
@$(OBJCOPY) -O binary $(@) $(@:.axf=.bin)
@$(OBJCOPY) -O ihex $(@) $(@:.axf=.hex)
# The rule for building the object files from each source file.
$(C_OBJS): $(BUILD_DIR)/%.o : %.c
@mkdir -p $(@D)
@if [ '$(VERBOSE)' = 1 ]; then \
echo $(CC_CMD); \
else \
echo " $(color_green)CC$(color_default) $(<F)"; \
fi
@$(CC_CMD)
$(CPP_OBJS): $(BUILD_DIR)/%.o : %.cpp
@mkdir -p $(@D)
@if [ '$(VERBOSE)' = 1 ]; then \
echo $(CXX_CMD); \
else \
echo " $(color_cyan)CXX$(color_default) $(<F)"; \
fi
@$(CXX_CMD)
$(S_OBJS): $(BUILD_DIR)/%.o: %.S
@mkdir -p $(@D)
@if [ '$(VERBOSE)' = 1 ]; then \
echo $(AS_CMD); \
else \
echo " $(color_magenta)AS$(color_default) $(<F)"; \
fi
@$(AS_CMD)
# Include the automatically generated dependency files.
-include $(OBJS:.o=.d)

7
scripts/flash-left.jlink Normal file
View File

@@ -0,0 +1,7 @@
speed 4000
device MKL03Z32xxx4
connect
loadfile build_make/uhk_left.hex
RSetType 2
r
qc

View File

@@ -0,0 +1,7 @@
speed 4000
device MK22FN512xxx12
connect
loadfile build_make/uhk_right.hex
RSetType 2
r
qc

View File

@@ -13,22 +13,15 @@ const releaseName = `uhk-firmware-${version}`;
const releaseDir = `${__dirname}/${releaseName}`; const releaseDir = `${__dirname}/${releaseName}`;
const modulesDir = `${releaseDir}/modules`; const modulesDir = `${releaseDir}/modules`;
const releaseFile = `${__dirname}/${releaseName}.tar.bz2`; const releaseFile = `${__dirname}/${releaseName}.tar.bz2`;
const leftFirmwareFile = `${__dirname}/../left/build/uhk60-left_release/uhk-left.bin`; const leftFirmwareFile = `${__dirname}/../left/build_make/uhk_left.bin`;
const usbDir = `${__dirname}/../lib/agent/packages/usb`; const usbDir = `${__dirname}/../lib/agent/packages/usb`;
const deviceSourceFirmwares = package.devices.map(device => `${__dirname}/../${device.source}`); const deviceSourceFirmwares = package.devices.map(device => `${__dirname}/../${device.source}`);
const moduleSourceFirmwares = package.modules.map(module => `${__dirname}/../${module.source}`); const moduleSourceFirmwares = package.modules.map(module => `${__dirname}/../${module.source}`);
rm('-rf', releaseDir, releaseFile, deviceSourceFirmwares, moduleSourceFirmwares); rm('-rf', releaseDir, releaseFile, deviceSourceFirmwares, moduleSourceFirmwares);
exec(`/opt/Freescale/KDS_v3/eclipse/kinetis-design-studio \ exec(`cd ${__dirname}/../left; make clean; make -j8`);
--launcher.suppressErrors \ exec(`cd ${__dirname}/../right; make clean; make -j8`);
-noSplash \
-application org.eclipse.cdt.managedbuilder.core.headlessbuild \
-import ${__dirname}/../left/build \
-import ${__dirname}/../right/build \
-cleanBuild uhk-left \
-cleanBuild uhk-right`
);
for (const device of package.devices) { for (const device of package.devices) {
const deviceDir = `${releaseDir}/devices/${device.name}`; const deviceDir = `${releaseDir}/devices/${device.name}`;

View File

@@ -15,23 +15,23 @@
"commander": "^2.11.0", "commander": "^2.11.0",
"shelljs": "^0.7.8" "shelljs": "^0.7.8"
}, },
"firmwareVersion": "8.1.6", "firmwareVersion": "8.3.1",
"deviceProtocolVersion": "4.3.0", "deviceProtocolVersion": "4.3.1",
"moduleProtocolVersion": "4.0.0", "moduleProtocolVersion": "4.0.0",
"userConfigVersion": "4.0.0", "userConfigVersion": "4.1.0",
"hardwareConfigVersion": "1.0.0", "hardwareConfigVersion": "1.0.0",
"devices": [ "devices": [
{ {
"deviceId": 1, "deviceId": 1,
"name": "uhk60-right", "name": "uhk60-right",
"source": "right/build/uhk60-right_release/uhk-right.hex" "source": "right/build_make/uhk_right.hex"
} }
], ],
"modules": [ "modules": [
{ {
"moduleId": 1, "moduleId": 1,
"name": "uhk60-left", "name": "uhk60-left",
"source": "left/build/uhk60-left_release/uhk-left.bin" "source": "left/build_make/uhk_left.bin"
} }
] ]
} }

View File

@@ -19,19 +19,19 @@
// Variables: // Variables:
#define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MAJOR_VERSION 8
#define FIRMWARE_MINOR_VERSION 1 #define FIRMWARE_MINOR_VERSION 3
#define FIRMWARE_PATCH_VERSION 6 #define FIRMWARE_PATCH_VERSION 1
#define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MAJOR_VERSION 4
#define DEVICE_PROTOCOL_MINOR_VERSION 3 #define DEVICE_PROTOCOL_MINOR_VERSION 3
#define DEVICE_PROTOCOL_PATCH_VERSION 0 #define DEVICE_PROTOCOL_PATCH_VERSION 1
#define MODULE_PROTOCOL_MAJOR_VERSION 4 #define MODULE_PROTOCOL_MAJOR_VERSION 4
#define MODULE_PROTOCOL_MINOR_VERSION 0 #define MODULE_PROTOCOL_MINOR_VERSION 0
#define MODULE_PROTOCOL_PATCH_VERSION 0 #define MODULE_PROTOCOL_PATCH_VERSION 0
#define USER_CONFIG_MAJOR_VERSION 4 #define USER_CONFIG_MAJOR_VERSION 4
#define USER_CONFIG_MINOR_VERSION 0 #define USER_CONFIG_MINOR_VERSION 1
#define USER_CONFIG_PATCH_VERSION 0 #define USER_CONFIG_PATCH_VERSION 0
#define HARDWARE_CONFIG_MAJOR_VERSION 1 #define HARDWARE_CONFIG_MAJOR_VERSION 1