Compare commits
110 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6854fa68dc | ||
|
|
14b6e49692 | ||
|
|
e9cd3a96c2 | ||
|
|
8856c484b6 | ||
|
|
b97841fdae | ||
|
|
69143bed9c | ||
|
|
ebd0e3b762 | ||
|
|
ec8301ae62 | ||
|
|
3d4d78387e | ||
|
|
c2582729f2 | ||
|
|
9d66f5ff76 | ||
|
|
06ebed5537 | ||
|
|
02d6fb4628 | ||
|
|
1b9ec89e20 | ||
|
|
7002e7de52 | ||
|
|
1e61a39210 | ||
|
|
5509cbb5f8 | ||
|
|
f650032fef | ||
|
|
fd787f74e9 | ||
|
|
75fe7904b6 | ||
|
|
b4ac82d2c0 | ||
|
|
9670523310 | ||
|
|
7763d8a32b | ||
|
|
3d9170402b | ||
|
|
b0192085bb | ||
|
|
c90261d549 | ||
|
|
5a756edf8b | ||
|
|
46ce16b8d4 | ||
|
|
d2acfba659 | ||
|
|
ac75d0ca8b | ||
|
|
10beb751ac | ||
|
|
e0528e1714 | ||
|
|
0afb3ab687 | ||
|
|
58fd3a78cf | ||
|
|
f1ed699fa2 | ||
|
|
43646beca8 | ||
|
|
308a71e4a3 | ||
|
|
ecf1f1ac32 | ||
|
|
b34fb9daa3 | ||
|
|
195f40949f | ||
|
|
b68c6bed18 | ||
|
|
ab24e78a5b | ||
|
|
4892d64795 | ||
|
|
c10d6440ce | ||
|
|
c109a9e202 | ||
|
|
5d59540c51 | ||
|
|
e12e219b4e | ||
|
|
3ab2ac18fc | ||
|
|
6e2eca7829 | ||
|
|
8f4fc1da8e | ||
|
|
5de0e5ac60 | ||
|
|
13a718f871 | ||
|
|
15d09552a4 | ||
|
|
0b100feb32 | ||
|
|
1742437f8b | ||
|
|
5093a0c0a6 | ||
|
|
7e524d97b1 | ||
|
|
2e53331a0f | ||
|
|
c6d60780f4 | ||
|
|
8666a495d8 | ||
|
|
33bbf44199 | ||
|
|
cc49118868 | ||
|
|
f8fd99f588 | ||
|
|
fa8c9dc907 | ||
|
|
0911e67bf6 | ||
|
|
57a7cee62a | ||
|
|
1af28a79db | ||
|
|
6881f8e340 | ||
|
|
00cd1f65e8 | ||
|
|
2c9a6c0bd2 | ||
|
|
0c94cbb256 | ||
|
|
275bfee860 | ||
|
|
8a655e3cfd | ||
|
|
8521619783 | ||
|
|
62184240df | ||
|
|
0b210ac68e | ||
|
|
56f7753afc | ||
|
|
a0803875c4 | ||
|
|
f5716bdadc | ||
|
|
b76b3c0e4f | ||
|
|
2661c3d909 | ||
|
|
c854e98d84 | ||
|
|
72d8e49717 | ||
|
|
0fd95b71b2 | ||
|
|
4d83bc2e75 | ||
|
|
cf7b05ab72 | ||
|
|
055f1945d0 | ||
|
|
fa4a3abf84 | ||
|
|
96c7ccd758 | ||
|
|
76d319ec19 | ||
|
|
aab0e8473f | ||
|
|
4a4c471b9e | ||
|
|
fcd75b2af2 | ||
|
|
f318c6872e | ||
|
|
ae1240c103 | ||
|
|
e75d366245 | ||
|
|
da20cdacc4 | ||
|
|
5a986d367e | ||
|
|
f6b66283a7 | ||
|
|
6ad425cbf9 | ||
|
|
33e501cd83 | ||
|
|
fa558abef3 | ||
|
|
25a2b3af93 | ||
|
|
43587c2e1f | ||
|
|
c51542795f | ||
|
|
7eb83173ed | ||
|
|
5581dd26b5 | ||
|
|
1ac637af0f | ||
|
|
36951d1a34 | ||
|
|
5190265a2c |
72
CHANGELOG.md
72
CHANGELOG.md
@@ -5,6 +5,76 @@ All notable changes to this project will be documented in this file.
|
||||
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
|
||||
|
||||
## [8.2.1] - 2018-05-02
|
||||
|
||||
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Don't suppress modifier keys upon releasing a layer.
|
||||
- Restore Caps Lock indicator when saving the configuration.
|
||||
|
||||
## [8.2.0] - 2018-04-20
|
||||
|
||||
Device Protocol: 4.**3.0** | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Change the scheduling of USB reports which changes mouse pointer speeds.
|
||||
- Disable LEDs while the host sleeps.
|
||||
- Make any key wake up the host while it sleeps.
|
||||
- Add UsbCommand_SwitchKeymap(). `DEVICEPROTOCOL:MINOR`
|
||||
- Make GCC optimize the release builds for execution speed (-O3).
|
||||
|
||||
## [8.1.5] - 2018-04-04
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Set key debounce timeout from 30ms to 60ms. This should eliminate key chattering.
|
||||
- Use the correct scancode for the menu key of the factory keymap.
|
||||
|
||||
## [8.1.4] - 2018-03-05
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Set key debounce timeout from 20ms to 30ms. This should eliminate key chattering.
|
||||
- Set double tap lock layer timeout from 250ms to 150ms. This should minimize the chance of locking layers accidentally by double tapping their keys.
|
||||
|
||||
## [8.1.3] - 2018-02-18
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Fix system keyboard descriptor, so it is byte-aligned.
|
||||
- Set key debounce timeout from 15ms to 20ms. This should at least reduce and hopefully eliminate key chattering.
|
||||
|
||||
## [8.1.2] - 2018-02-13
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Detect Caps Lock USB state and light up the Caps Lock icon of the LED display accordingly.
|
||||
- Set key debounce timeout from 10ms to 15ms. This should at least reduce and hopefully eliminate key chattering.
|
||||
|
||||
## [8.1.1] - 2018-02-11
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Lock layers every time when double-tapping their layer switcher keys, regardless of how many times the layer switcher key was tapped before.
|
||||
- Only lock layers via double-tapping if the second tap gets released within 100ms.
|
||||
|
||||
## [8.1.0] - 2018-01-15
|
||||
|
||||
Device Protocol: 4.**2**.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Enable left-half watchdog in reinit mode which seems to prevent freezes.
|
||||
- Slow down main bus I2C baud rate to 30kHz when BusPal is on to make firmware transfer more robust.
|
||||
- Implement UsbCommandId_GetSlaveI2cErrors. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement UsbCommandId_SetI2cBaudRate. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_CurrentKbootCommand. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_I2cMainBusBaudRate. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_Uptime. `DEVICEPROTOCOL:MINOR`
|
||||
|
||||
## [8.0.1] - 2017-12-25
|
||||
|
||||
Device Protocol: 4.1.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Implement I2C watchdog for the left keyboard half which should resolve the occasional hangs of the left keyboard half.
|
||||
|
||||
## [8.0.0] - 2017-12-15
|
||||
|
||||
Device Protocol: 4.**1.0** | Module Protocol: **4.0.0** | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
@@ -50,7 +120,7 @@ Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **3.0.0** | Hardw
|
||||
|
||||
- Implement mouse movement and scrolling deceleration and acceleration.
|
||||
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
|
||||
- Make the parser read additional user configuration properties: USERCONFIGMajorVersion, USERCONFIGMinorVersion, USERCONFIGPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
|
||||
- Make the parser read additional user configuration properties: userConfigMajorVersion, userConfigMinorVersion, userConfigPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
|
||||
|
||||
## [3.0.0] - 2017-11-15
|
||||
|
||||
|
||||
12
README.md
12
README.md
@@ -4,6 +4,10 @@
|
||||
|
||||
This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
|
||||
|
||||
## Updating to the latest firmware
|
||||
|
||||
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.
|
||||
|
||||
## Cloning the repository
|
||||
|
||||
Please make sure to clone this repo with:
|
||||
@@ -18,9 +22,13 @@ Install [Kinetis Design Studio](http://www.nxp.com/products/software-and-tools/r
|
||||
|
||||
## Building and flashing the firmware
|
||||
|
||||
For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk-left release jlink*, and click on the *Debug* button.
|
||||
For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk60-left_release_jlink*, and click on the *Debug* button.
|
||||
|
||||
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk-right release blhost*, and click on the *Debug* button. Please note that this update method only works on Linux out of the box. On other operating systems, you have to execute the relevant commands of the [blhost-unix.sh](right/build/kds/blhost-unix.sh) script.
|
||||
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first.
|
||||
|
||||
At this point, you can flash the right firmware via USB from KDS. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) that is Git submodule of the this repo and located in the `lib/agent` directory. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk60-right_release_kboot*, and click on the *Run* button.
|
||||
|
||||
From this point on, you can upgrade the firmwares of both halves via USB by using the uhk60-left_release_kboot and uhk60-right_release_kboot run configurations. Alternatively, you can use your SEGGER J-Link probe.
|
||||
|
||||
## Contributing
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<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">
|
||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath="">
|
||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.1547417078" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.765602671" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.910567930" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||
|
||||
1
left/build/.gitignore
vendored
1
left/build/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/.settings/
|
||||
/uhk60-left_debug/
|
||||
/uhk60-left_release/
|
||||
/uhk60-left_release/
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="2331"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
@@ -77,6 +77,6 @@
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -77,6 +77,6 @@
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
|
||||
// Macros:
|
||||
|
||||
#define I2C_WATCHDOG_VALUE_REINIT 1
|
||||
#define I2C_WATCHDOG_VALUE_REBOOT 2
|
||||
|
||||
// #define DEBUG_OVER_SPI
|
||||
#define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REINIT
|
||||
// #define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REBOOT
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,36 +3,40 @@
|
||||
#include "i2c_watchdog.h"
|
||||
#include "test_led.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "config.h"
|
||||
|
||||
//static uint32_t prevWatchdogCounter = 0;
|
||||
uint32_t I2cWatchdog_RecoveryCounter;
|
||||
volatile uint32_t I2cWatchdog_WatchCounter;
|
||||
/* NOTE: Because of a bug in the ROM bootloader of the KL03Z, the watchdog timer is disabled and cannot be re-enabled.
|
||||
* See https://community.nxp.com/thread/457893
|
||||
* Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
|
||||
*/
|
||||
#ifdef I2C_WATCHDOG
|
||||
static uint32_t prevWatchdogCounter = 0;
|
||||
static uint32_t I2cWatchdog_RecoveryCounter; /* counter for how many times we had to recover and restart */
|
||||
|
||||
void InitI2cWatchdog(void)
|
||||
void RunWatchdog(void)
|
||||
{
|
||||
lptmr_config_t lptmrConfig;
|
||||
LPTMR_GetDefaultConfig(&lptmrConfig);
|
||||
LPTMR_Init(LPTMR0, &lptmrConfig);
|
||||
LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(LPTMR_USEC_COUNT, LPTMR_SOURCE_CLOCK));
|
||||
LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
|
||||
EnableIRQ(LPTMR0_IRQn);
|
||||
LPTMR_StartTimer(LPTMR0);
|
||||
}
|
||||
/*
|
||||
void I2C_WATCHDOG_LPTMR_HANDLER(void)
|
||||
{
|
||||
TEST_LED_TOGGLE();
|
||||
I2cWatchdog_WatchCounter++;
|
||||
static volatile uint32_t I2cWatchdog_WatchCounter = 0; /* counter for timer */
|
||||
static int cntr = 0;
|
||||
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms
|
||||
// NVIC_SystemReset();
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
||||
InitI2c();
|
||||
cntr++;
|
||||
if (cntr==100) { /* we get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period */
|
||||
cntr=0;
|
||||
TEST_LED_TOGGLE();
|
||||
I2cWatchdog_WatchCounter++;
|
||||
|
||||
if (I2cWatchdog_WatchCounter>10) { /* do not check within the first 1000 ms, as I2C might not be running yet */
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms. I2C_Watchdog gets incremented for every I2C transaction
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REBOOT
|
||||
NVIC_SystemReset();
|
||||
#endif
|
||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REINIT
|
||||
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
||||
initI2c();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
prevWatchdogCounter = I2C_Watchdog; /* remember previous counter */
|
||||
}
|
||||
|
||||
prevWatchdogCounter = I2C_Watchdog;
|
||||
|
||||
LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitI2cWatchdog(void);
|
||||
void RunWatchdog(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "slave_protocol_handler.h"
|
||||
#include "i2c_watchdog.h"
|
||||
#include "debug_over_spi.h"
|
||||
#include "main.h"
|
||||
|
||||
i2c_slave_config_t slaveConfig;
|
||||
i2c_slave_handle_t slaveHandle;
|
||||
@@ -44,14 +45,14 @@ static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *u
|
||||
}
|
||||
}
|
||||
|
||||
void InitInterruptPriorities(void)
|
||||
void initInterruptPriorities(void)
|
||||
{
|
||||
NVIC_SetPriority(I2C0_IRQn, 1);
|
||||
NVIC_SetPriority(TPM1_IRQn, 1);
|
||||
NVIC_SetPriority(SPI0_IRQn, 1);
|
||||
}
|
||||
|
||||
void InitI2c(void)
|
||||
void initI2c(void)
|
||||
{
|
||||
port_pin_config_t pinConfig = {
|
||||
.pullSelect = kPORT_PullUp,
|
||||
@@ -81,11 +82,10 @@ void InitLedDriver(void)
|
||||
|
||||
void InitPeripherals(void)
|
||||
{
|
||||
InitInterruptPriorities();
|
||||
initInterruptPriorities();
|
||||
InitLedDriver();
|
||||
InitTestLed();
|
||||
LedPwm_Init();
|
||||
// InitI2cWatchdog();
|
||||
DebugOverSpi_Init();
|
||||
InitI2c();
|
||||
initI2c();
|
||||
}
|
||||
|
||||
@@ -11,6 +11,6 @@
|
||||
// Functions:
|
||||
|
||||
void InitPeripherals(void);
|
||||
void InitI2c(void);
|
||||
void initI2c(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
#include "fsl_lptmr.h"
|
||||
#include "key_scanner.h"
|
||||
#include "main.h"
|
||||
#include "config.h"
|
||||
#include "i2c_watchdog.h"
|
||||
|
||||
void KEY_SCANNER_HANDLER(void)
|
||||
{
|
||||
KeyMatrix_ScanRow(&keyMatrix);
|
||||
#ifdef I2C_WATCHDOG
|
||||
RunWatchdog();
|
||||
#endif
|
||||
LPTMR_ClearStatusFlags(KEY_SCANNER_LPTMR_BASEADDR, kLPTMR_TimerCompareFlag);
|
||||
}
|
||||
|
||||
|
||||
Submodule lib/KSDK_2.0_MK22FN512xxx12 updated: 7142722eed...e447ecee3a
Submodule lib/agent updated: b32c93f0f8...3d9c83f9f4
@@ -17,7 +17,7 @@
|
||||
<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">
|
||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath="">
|
||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.704315278" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.108613118" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.916504304" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||
@@ -136,9 +136,6 @@
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<fileInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.621318926" name="wormhole.c" rcbsApplicability="disable" resourcePath="bootloader-shared/wormhole.c" toolsToInvoke="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614">
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335"/>
|
||||
</fileInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
|
||||
@@ -196,21 +196,27 @@ SECTIONS
|
||||
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
||||
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
|
||||
|
||||
USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x800;
|
||||
/* Uninitialized data section */
|
||||
.bss :
|
||||
.bss : ALIGN(4)
|
||||
{
|
||||
/* This is used by the startup in order to initialize the .bss section */
|
||||
. = ALIGN(4);
|
||||
__START_BSS = .;
|
||||
__bss_start__ = .;
|
||||
*(.bss)
|
||||
*(.bss*)
|
||||
. = ALIGN(512);
|
||||
USB_RAM_START = .;
|
||||
. += USB_RAM_GAP;
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
} > m_data
|
||||
|
||||
.m_usb_bdt (NOLOAD) :
|
||||
{
|
||||
. = ALIGN(512);
|
||||
*(m_usb_bdt)
|
||||
} > m_data
|
||||
|
||||
.m_usb_global (NOLOAD) :
|
||||
{
|
||||
*(m_usb_global)
|
||||
__bss_end__ = .;
|
||||
__END_BSS = .;
|
||||
} > m_data
|
||||
@@ -239,17 +245,6 @@ SECTIONS
|
||||
. += STACK_SIZE;
|
||||
} > m_data_2
|
||||
|
||||
m_usb_bdt USB_RAM_START (NOLOAD) :
|
||||
{
|
||||
*(m_usb_bdt)
|
||||
USB_RAM_BDT_END = .;
|
||||
}
|
||||
|
||||
m_usb_global USB_RAM_BDT_END (NOLOAD) :
|
||||
{
|
||||
*(m_usb_global)
|
||||
}
|
||||
|
||||
/* Initializes stack on the end of block */
|
||||
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
||||
__StackLimit = __StackTop - STACK_SIZE;
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug/uhk-right.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug_standalone/uhk-right.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/uhk-right"/>
|
||||
</listAttribute>
|
||||
@@ -77,6 +77,6 @@
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -3,7 +3,4 @@
|
||||
|
||||
// Macros:
|
||||
|
||||
#define I2C_WATCHDOG
|
||||
// #define LED_DRIVER_STRESS_TEST
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "led_display.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "slave_drivers/is31fl3731_driver.h"
|
||||
#include "config.h"
|
||||
|
||||
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
|
||||
{
|
||||
@@ -55,6 +56,7 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
(void)dataModelMinorVersion;
|
||||
(void)dataModelPatchVersion;
|
||||
(void)deviceName;
|
||||
(void)doubleTapSwitchLayerTimeout;
|
||||
|
||||
// LED brightness
|
||||
|
||||
@@ -135,15 +137,15 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
// If parsing succeeded then apply the parsed values.
|
||||
|
||||
if (!ParserRunDry) {
|
||||
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
||||
// DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
||||
|
||||
// Update LED brightnesses and reinitialize LED drivers
|
||||
|
||||
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
|
||||
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
||||
KeyBacklightBrightness = keyBacklightBrightness;
|
||||
Slaves[SlaveId_LeftLedDriver].isConnected = false;
|
||||
Slaves[SlaveId_RightLedDriver].isConnected = false;
|
||||
|
||||
LedSlaveDriver_UpdateLeds();
|
||||
|
||||
// Update mouse key speeds
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
#include "config_parser/config_globals.h"
|
||||
#include "buffer.h"
|
||||
|
||||
bool IsEepromBusy;
|
||||
volatile bool IsEepromBusy;
|
||||
static eeprom_operation_t CurrentEepromOperation;
|
||||
static config_buffer_id_t CurrentConfigBufferId;
|
||||
status_t LastEepromTransferStatus;
|
||||
static status_t LastEepromTransferStatus;
|
||||
void (*SuccessCallback)(void);
|
||||
|
||||
static i2c_master_handle_t i2cHandle;
|
||||
|
||||
@@ -24,8 +24,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsEepromBusy;
|
||||
extern status_t EepromTransferStatus;
|
||||
extern volatile bool IsEepromBusy;
|
||||
|
||||
// Functions:
|
||||
|
||||
|
||||
@@ -10,11 +10,12 @@
|
||||
|
||||
// Main bus
|
||||
|
||||
#define I2C_MAIN_BUS_BASEADDR I2C0
|
||||
#define I2C_MAIN_BUS_IRQ_ID I2C0_IRQn
|
||||
#define I2C_MAIN_BUS_CLK_SRC I2C0_CLK_SRC
|
||||
#define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable.
|
||||
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7
|
||||
#define I2C_MAIN_BUS_BASEADDR I2C0
|
||||
#define I2C_MAIN_BUS_IRQ_ID I2C0_IRQn
|
||||
#define I2C_MAIN_BUS_CLK_SRC I2C0_CLK_SRC
|
||||
#define I2C_MAIN_BUS_NORMAL_BAUD_RATE 100000
|
||||
#define I2C_MAIN_BUS_BUSPAL_BAUD_RATE 30000
|
||||
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7
|
||||
|
||||
#define I2C_MAIN_BUS_SDA_GPIO GPIOD
|
||||
#define I2C_MAIN_BUS_SDA_PORT PORTD
|
||||
|
||||
25
right/src/i2c_error_logger.c
Normal file
25
right/src/i2c_error_logger.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "fsl_i2c.h"
|
||||
#include "i2c_error_logger.h"
|
||||
|
||||
i2c_slave_error_counter_t I2cSlaveErrorCounters[MAX_SLAVE_COUNT];
|
||||
|
||||
void LogI2cError(uint8_t slaveId, status_t status)
|
||||
{
|
||||
i2c_slave_error_counter_t *i2cSlaveErrorCounter = I2cSlaveErrorCounters + slaveId;
|
||||
uint8_t errorIdx;
|
||||
|
||||
for (errorIdx=0; errorIdx<i2cSlaveErrorCounter->errorTypeCount; errorIdx++) {
|
||||
i2c_error_count_t *currentI2cError = i2cSlaveErrorCounter->errors + errorIdx;
|
||||
if (currentI2cError->status == status) {
|
||||
currentI2cError->count++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (errorIdx == i2cSlaveErrorCounter->errorTypeCount && errorIdx < MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE) {
|
||||
i2cSlaveErrorCounter->errorTypeCount++;
|
||||
i2c_error_count_t *currentI2cError = i2cSlaveErrorCounter->errors + errorIdx;
|
||||
currentI2cError->status = status;
|
||||
currentI2cError->count = 1;
|
||||
}
|
||||
}
|
||||
33
right/src/i2c_error_logger.h
Normal file
33
right/src/i2c_error_logger.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef __I2C_ERROR_LOGGER_H__
|
||||
#define __I2C_ERROR_LOGGER_H__
|
||||
|
||||
// Includes:
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "slave_scheduler.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE 7
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef struct {
|
||||
status_t status;
|
||||
uint32_t count;
|
||||
} i2c_error_count_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t errorTypeCount;
|
||||
i2c_error_count_t errors[MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE];
|
||||
} i2c_slave_error_counter_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
extern i2c_slave_error_counter_t I2cSlaveErrorCounters[MAX_SLAVE_COUNT];
|
||||
|
||||
// Functions:
|
||||
|
||||
void LogI2cError(uint8_t slaveId, status_t status);
|
||||
|
||||
#endif
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "fsl_gpio.h"
|
||||
#include "i2c.h"
|
||||
#include "i2c_watchdog.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "init_peripherals.h"
|
||||
|
||||
uint32_t I2cWatchdog_WatchCounter;
|
||||
@@ -19,17 +18,13 @@ static uint32_t prevWatchdogCounter;
|
||||
void PIT_I2C_WATCHDOG_HANDLER(void)
|
||||
{
|
||||
I2cWatchdog_WatchCounter++;
|
||||
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there haven't been any interrupts recently
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
i2c_master_config_t masterConfig;
|
||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
||||
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
|
||||
InitI2cMainBus();
|
||||
InitSlaveScheduler();
|
||||
ReinitI2cMainBus();
|
||||
}
|
||||
|
||||
prevWatchdogCounter = I2C_Watchdog;
|
||||
|
||||
PIT_ClearStatusFlags(PIT, PIT_I2C_WATCHDOG_CHANNEL, PIT_TFLG_TIF_MASK);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,22 @@
|
||||
#include "timer.h"
|
||||
#include "key_debouncer.h"
|
||||
#include "usb_api.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
|
||||
void InitInterruptPriorities(void)
|
||||
bool IsBusPalOn;
|
||||
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
|
||||
volatile uint32_t I2cMainBusActualBaudRateBps;
|
||||
|
||||
static void initBusPalState(void) {
|
||||
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
|
||||
if (IsBusPalOn) {
|
||||
Wormhole.magicNumber = 0;
|
||||
I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_BUSPAL_BAUD_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
static void initInterruptPriorities(void)
|
||||
{
|
||||
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
|
||||
@@ -26,12 +40,12 @@ void InitInterruptPriorities(void)
|
||||
NVIC_SetPriority(USB_IRQ_ID, 3);
|
||||
}
|
||||
|
||||
void delay(void)
|
||||
static void delay(void)
|
||||
{
|
||||
for (volatile uint32_t i=0; i<62; i++);
|
||||
}
|
||||
|
||||
void recoverI2c(void)
|
||||
static void recoverI2c(void)
|
||||
{
|
||||
PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio);
|
||||
PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio);
|
||||
@@ -60,7 +74,7 @@ void recoverI2c(void)
|
||||
delay();
|
||||
}
|
||||
|
||||
void InitI2cMainBus(void)
|
||||
static void initI2cMainBus(void)
|
||||
{
|
||||
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK);
|
||||
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK);
|
||||
@@ -78,12 +92,20 @@ void InitI2cMainBus(void)
|
||||
|
||||
i2c_master_config_t masterConfig;
|
||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
||||
masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE;
|
||||
masterConfig.baudRate_Bps = I2cMainBusRequestedBaudRateBps;
|
||||
uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC);
|
||||
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock);
|
||||
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
|
||||
}
|
||||
|
||||
void initI2cEepromBus(void)
|
||||
void ReinitI2cMainBus(void)
|
||||
{
|
||||
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
|
||||
initI2cMainBus();
|
||||
InitSlaveScheduler();
|
||||
}
|
||||
|
||||
static void initI2cEepromBus(void)
|
||||
{
|
||||
port_pin_config_t pinConfig = {
|
||||
.pullSelect = kPORT_PullUp,
|
||||
@@ -91,7 +113,6 @@ void initI2cEepromBus(void)
|
||||
.mux = I2C_EEPROM_BUS_MUX,
|
||||
};
|
||||
|
||||
|
||||
CLOCK_EnableClock(I2C_EEPROM_BUS_SDA_CLOCK);
|
||||
CLOCK_EnableClock(I2C_EEPROM_BUS_SCL_CLOCK);
|
||||
|
||||
@@ -105,26 +126,25 @@ void initI2cEepromBus(void)
|
||||
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
|
||||
}
|
||||
|
||||
void InitI2c(void)
|
||||
static void initI2c(void)
|
||||
{
|
||||
InitI2cMainBus();
|
||||
initI2cMainBus();
|
||||
initI2cEepromBus();
|
||||
}
|
||||
|
||||
void InitPeripherals(void)
|
||||
{
|
||||
InitInterruptPriorities();
|
||||
initBusPalState();
|
||||
initInterruptPriorities();
|
||||
Timer_Init();
|
||||
InitLedDriver();
|
||||
InitResetButton();
|
||||
InitMergeSensor();
|
||||
ADC_Init();
|
||||
InitI2c();
|
||||
initI2c();
|
||||
InitTestLed();
|
||||
LedPwm_Init();
|
||||
#ifdef I2C_WATCHDOG
|
||||
InitI2cWatchdog();
|
||||
#endif
|
||||
InitKeyDebouncer();
|
||||
EEPROM_Init();
|
||||
}
|
||||
|
||||
@@ -5,9 +5,15 @@
|
||||
|
||||
#include "fsl_common.h"
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsBusPalOn;
|
||||
extern volatile uint32_t I2cMainBusRequestedBaudRateBps;
|
||||
extern volatile uint32_t I2cMainBusActualBaudRateBps;
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitPeripherals(void);
|
||||
void InitI2cMainBus(void);
|
||||
void ReinitI2cMainBus(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
// Macros:
|
||||
|
||||
#define KEY_DEBOUNCER_INTERVAL_MSEC 1
|
||||
#define KEY_DEBOUNCER_TIMEOUT_MSEC 10
|
||||
#define KEY_DEBOUNCER_TIMEOUT_MSEC 60
|
||||
|
||||
// Functions:
|
||||
|
||||
|
||||
@@ -6,17 +6,36 @@
|
||||
#include "config_parser/config_globals.h"
|
||||
#include "macros.h"
|
||||
|
||||
keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = { { "FTY", 0, 3 } };
|
||||
keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = {
|
||||
{
|
||||
.abbreviation = "FTY",
|
||||
.offset = 0,
|
||||
.abbreviationLen = 3
|
||||
}
|
||||
};
|
||||
|
||||
uint8_t AllKeymapsCount;
|
||||
uint8_t DefaultKeymapIndex;
|
||||
uint8_t CurrentKeymapIndex = 0;
|
||||
|
||||
void SwitchKeymap(uint8_t index)
|
||||
void SwitchKeymapById(uint8_t index)
|
||||
{
|
||||
CurrentKeymapIndex = index;
|
||||
ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset;
|
||||
ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount);
|
||||
LedDisplay_SetCurrentKeymapText();
|
||||
LedDisplay_UpdateText();
|
||||
}
|
||||
|
||||
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev)
|
||||
{
|
||||
for (uint8_t i=0; i<AllKeymapsCount; i++) {
|
||||
keymap_reference_t *keymap = AllKeymaps + i;
|
||||
if (keymap->abbreviationLen == length && memcmp(keymap->abbreviation, abbrev, length) == 0) {
|
||||
SwitchKeymapById(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// The factory keymap is initialized before it gets overwritten by the default keymap of the EEPROM.
|
||||
@@ -157,7 +176,7 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = HID_KEYBOARD_SC_MENU },
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_APPLICATION }},
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_RIGHT_SHIFT }},
|
||||
{ .type = KeyActionType_None },
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void SwitchKeymap(uint8_t index);
|
||||
void SwitchKeymapById(uint8_t index);
|
||||
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
|
||||
uint8_t IconsAndLayerTextsBrightness = 0xff;
|
||||
uint8_t AlphanumericSegmentsBrightness = 0xff;
|
||||
bool ledIconStates[LedDisplayIcon_Last];
|
||||
|
||||
static const uint16_t capitalLetterToSegmentSet[] = {
|
||||
static const uint16_t capitalLetterToSegmentMap[] = {
|
||||
0b0000000011110111,
|
||||
0b0001001010001111,
|
||||
0b0000000000111001,
|
||||
@@ -35,7 +36,7 @@ static const uint16_t capitalLetterToSegmentSet[] = {
|
||||
0b0000110000001001,
|
||||
};
|
||||
|
||||
static const uint16_t digitToSegmentSet[] = {
|
||||
static const uint16_t digitToSegmentMap[] = {
|
||||
0b0000110000111111,
|
||||
0b0000010000000110,
|
||||
0b0000100010001011,
|
||||
@@ -48,13 +49,13 @@ static const uint16_t digitToSegmentSet[] = {
|
||||
0b0000000011101111,
|
||||
};
|
||||
|
||||
static uint16_t characterToSegmentSet(char character)
|
||||
static uint16_t characterToSegmentMap(char character)
|
||||
{
|
||||
switch (character) {
|
||||
case 'A' ... 'Z':
|
||||
return capitalLetterToSegmentSet[character - 'A'];
|
||||
return capitalLetterToSegmentMap[character - 'A'];
|
||||
case '0' ... '9':
|
||||
return digitToSegmentSet[character - '0'];
|
||||
return digitToSegmentMap[character - '0'];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -65,11 +66,11 @@ void LedDisplay_SetText(uint8_t length, const char* text)
|
||||
|
||||
switch (length) {
|
||||
case 3:
|
||||
allSegmentSets = (uint64_t)characterToSegmentSet(text[2]) << 28;
|
||||
allSegmentSets = (uint64_t)characterToSegmentMap(text[2]) << 28;
|
||||
case 2:
|
||||
allSegmentSets |= characterToSegmentSet(text[1]) << 14;
|
||||
allSegmentSets |= characterToSegmentMap(text[1]) << 14;
|
||||
case 1:
|
||||
allSegmentSets |= characterToSegmentSet(text[0]);
|
||||
allSegmentSets |= characterToSegmentMap(text[0]);
|
||||
}
|
||||
|
||||
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0;
|
||||
@@ -84,13 +85,7 @@ void LedDisplay_SetText(uint8_t length, const char* text)
|
||||
}
|
||||
}
|
||||
|
||||
void LedDisplay_SetCurrentKeymapText(void)
|
||||
{
|
||||
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
|
||||
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
||||
}
|
||||
|
||||
void LedDisplay_SetLayer(uint8_t layerId)
|
||||
void LedDisplay_SetLayer(layer_id_t layerId)
|
||||
{
|
||||
for (uint8_t i = 13; i <= 45; i += 16) {
|
||||
LedDriverValues[LedDriverId_Left][i] = 0;
|
||||
@@ -101,7 +96,32 @@ void LedDisplay_SetLayer(uint8_t layerId)
|
||||
}
|
||||
}
|
||||
|
||||
bool LedDisplay_GetIcon(led_display_icon_t icon)
|
||||
{
|
||||
return LedDriverValues[LedDriverId_Left][8 + icon];
|
||||
}
|
||||
|
||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
||||
{
|
||||
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||
ledIconStates[icon] = isEnabled;
|
||||
LedDriverValues[LedDriverId_Left][icon + 8] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||
}
|
||||
|
||||
void LedDisplay_UpdateIcons(void)
|
||||
{
|
||||
for (uint8_t i=0; i<=LedDisplayIcon_Last; i++) {
|
||||
LedDisplay_SetIcon(i, ledIconStates[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void LedDisplay_UpdateText(void)
|
||||
{
|
||||
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
|
||||
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
||||
}
|
||||
|
||||
void LedDisplay_UpdateAll(void)
|
||||
{
|
||||
LedDisplay_UpdateIcons();
|
||||
LedDisplay_UpdateText();
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "layer.h"
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -12,6 +13,7 @@
|
||||
LedDisplayIcon_CapsLock,
|
||||
LedDisplayIcon_Agent,
|
||||
LedDisplayIcon_Adaptive,
|
||||
LedDisplayIcon_Last = LedDisplayIcon_Adaptive,
|
||||
} led_display_icon_t;
|
||||
|
||||
// Variables:
|
||||
@@ -22,8 +24,11 @@
|
||||
// Functions:
|
||||
|
||||
void LedDisplay_SetText(uint8_t length, const char* text);
|
||||
void LedDisplay_SetCurrentKeymapText(void);
|
||||
void LedDisplay_SetLayer(uint8_t layerId);
|
||||
void LedDisplay_SetLayer(layer_id_t layerId);
|
||||
bool LedDisplay_GetIcon(led_display_icon_t icon);
|
||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled);
|
||||
void LedDisplay_UpdateIcons(void);
|
||||
void LedDisplay_UpdateText(void);
|
||||
void LedDisplay_UpdateAll(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -5,22 +5,21 @@
|
||||
#include "slave_scheduler.h"
|
||||
#include "bus_pal_hardware.h"
|
||||
#include "command.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
#include "eeprom.h"
|
||||
#include "key_scanner.h"
|
||||
#include "usb_commands/usb_command_apply_config.h"
|
||||
#include "peripherals/reset_button.h"
|
||||
#include "usb_report_updater.h"
|
||||
|
||||
bool IsEepromInitialized = false;
|
||||
bool IsConfigInitialized = false;
|
||||
static bool IsEepromInitialized = false;
|
||||
static bool IsConfigInitialized = false;
|
||||
|
||||
void userConfigurationReadFinished(void)
|
||||
static void userConfigurationReadFinished(void)
|
||||
{
|
||||
IsEepromInitialized = true;
|
||||
}
|
||||
|
||||
void hardwareConfigurationReadFinished(void)
|
||||
static void hardwareConfigurationReadFinished(void)
|
||||
{
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished);
|
||||
}
|
||||
@@ -34,8 +33,7 @@ void main(void)
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
|
||||
}
|
||||
|
||||
if (Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal) {
|
||||
Wormhole.magicNumber = 0;
|
||||
if (IsBusPalOn) {
|
||||
init_hardware();
|
||||
handleUsbBusPalCommand();
|
||||
} else {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "fsl_port.h"
|
||||
#include "peripherals/adc.h"
|
||||
|
||||
adc16_channel_config_t adc16ChannelConfigStruct;
|
||||
static adc16_channel_config_t adc16ChannelConfigStruct;
|
||||
|
||||
void ADC_Init(void)
|
||||
{
|
||||
|
||||
@@ -62,6 +62,22 @@ static uint8_t setShutdownModeNormalBuffer[] = {LED_DRIVER_REGISTER_SHUTDOWN, SH
|
||||
static uint8_t setFrame1Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1};
|
||||
static uint8_t updatePwmRegistersBuffer[PWM_REGISTER_BUFFER_LENGTH];
|
||||
|
||||
void LedSlaveDriver_DisableLeds(void)
|
||||
{
|
||||
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
|
||||
memset(LedDriverValues[ledDriverId], 0, LED_DRIVER_LED_COUNT);
|
||||
}
|
||||
}
|
||||
|
||||
void LedSlaveDriver_UpdateLeds(void)
|
||||
{
|
||||
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
|
||||
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
|
||||
}
|
||||
|
||||
LedDisplay_UpdateAll();
|
||||
}
|
||||
|
||||
void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
{
|
||||
if (ledDriverId == ISO_KEY_LED_DRIVER_ID && IS_ISO) {
|
||||
@@ -74,10 +90,7 @@ void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
|
||||
|
||||
if (ledDriverId == LedDriverId_Left) {
|
||||
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, false);
|
||||
LedDisplay_SetIcon(LedDisplayIcon_Agent, false);
|
||||
LedDisplay_SetIcon(LedDisplayIcon_Adaptive, false);
|
||||
LedDisplay_SetCurrentKeymapText();
|
||||
LedDisplay_UpdateAll();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,10 +131,8 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
*ledIndex += chunkSize;
|
||||
if (*ledIndex >= LED_DRIVER_LED_COUNT) {
|
||||
*ledIndex = 0;
|
||||
#ifndef LED_DRIVER_STRESS_TEST
|
||||
memcpy(currentLedDriverState->targetLedValues, ledValues, LED_DRIVER_LED_COUNT);
|
||||
*ledDriverPhase = LedDriverPhase_UpdateChangedLedValues;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case LedDriverPhase_UpdateChangedLedValues: {
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
typedef enum {
|
||||
LedDriverId_Right,
|
||||
LedDriverId_Left,
|
||||
LedDriverId_Last = LedDriverId_Left,
|
||||
} led_driver_id_t;
|
||||
|
||||
typedef enum {
|
||||
@@ -49,6 +50,8 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void LedSlaveDriver_DisableLeds(void);
|
||||
void LedSlaveDriver_UpdateLeds(void);
|
||||
void LedSlaveDriver_Init(uint8_t ledDriverId);
|
||||
status_t LedSlaveDriver_Update(uint8_t ledDriverId);
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
kboot_driver_state_t KbootDriverState;
|
||||
|
||||
static uint8_t rxBuffer[MAX_KBOOT_COMMAND_LENGTH];
|
||||
static uint8_t rxBuffer[KBOOT_PACKAGE_MAX_LENGTH];
|
||||
static uint8_t pingCommand[] = {0x5a, 0xa6};
|
||||
static uint8_t resetCommand[] = {0x5a, 0xa4, 0x04, 0x00, 0x6f, 0x46, 0x0b, 0x00, 0x00, 0x00};
|
||||
static uint8_t ackMessage[] = {0x5a, 0xa1};
|
||||
@@ -27,50 +27,52 @@ status_t KbootSlaveDriver_Update(uint8_t kbootInstanceId)
|
||||
{
|
||||
status_t status = kStatus_Uhk_IdleSlave;
|
||||
|
||||
switch (KbootDriverState.commandType) {
|
||||
switch (KbootDriverState.command) {
|
||||
case KbootCommand_Idle:
|
||||
break;
|
||||
case KbootCommand_Ping:
|
||||
switch (KbootDriverState.phase) {
|
||||
case 0:
|
||||
case KbootPhase_SendPing:
|
||||
status = tx(pingCommand, sizeof(pingCommand));
|
||||
KbootDriverState.phase++;
|
||||
KbootDriverState.phase = KbootPhase_CheckPingStatus;
|
||||
break;
|
||||
case 1:
|
||||
case KbootPhase_CheckPingStatus:
|
||||
KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus;
|
||||
KbootDriverState.phase = KbootDriverState.status == kStatus_Success ? 2 : 0;
|
||||
return kStatus_Uhk_NoTransfer;
|
||||
case 2:
|
||||
status = rx(10);
|
||||
KbootDriverState.phase++;
|
||||
KbootDriverState.phase = KbootDriverState.status == kStatus_Success
|
||||
? KbootPhase_ReceivePingResponse
|
||||
: KbootPhase_SendPing;
|
||||
return kStatus_Uhk_IdleCycle;
|
||||
case KbootPhase_ReceivePingResponse:
|
||||
status = rx(KBOOT_PACKAGE_LENGTH_PING_RESPONSE);
|
||||
KbootDriverState.phase = KbootPhase_CheckPingResponseStatus;
|
||||
break;
|
||||
case 3:
|
||||
case KbootPhase_CheckPingResponseStatus:
|
||||
KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus;
|
||||
if (KbootDriverState.status == kStatus_Success) {
|
||||
KbootDriverState.commandType = KbootCommand_Idle;
|
||||
KbootDriverState.command = KbootCommand_Idle;
|
||||
} else {
|
||||
KbootDriverState.phase = 0;
|
||||
return kStatus_Uhk_NoTransfer;
|
||||
KbootDriverState.phase = KbootPhase_SendPing;
|
||||
return kStatus_Uhk_IdleCycle;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KbootCommand_Reset:
|
||||
switch (KbootDriverState.phase) {
|
||||
case 0:
|
||||
case KbootPhase_SendReset:
|
||||
status = tx(resetCommand, sizeof(resetCommand));
|
||||
KbootDriverState.phase++;
|
||||
KbootDriverState.phase = KbootPhase_ReceiveResetAck;
|
||||
break;
|
||||
case 1:
|
||||
status = rx(2);
|
||||
KbootDriverState.phase++;
|
||||
case KbootPhase_ReceiveResetAck:
|
||||
status = rx(KBOOT_PACKAGE_LENGTH_ACK);
|
||||
KbootDriverState.phase = KbootPhase_ReceiveResetGenericResponse;
|
||||
break;
|
||||
case 2:
|
||||
status = rx(18);
|
||||
KbootDriverState.phase++;
|
||||
case KbootPhase_ReceiveResetGenericResponse:
|
||||
status = rx(KBOOT_PACKAGE_LENGTH_GENERIC_RESPONSE);
|
||||
KbootDriverState.phase = KbootPhase_CheckResetSendAck;
|
||||
break;
|
||||
case 3:
|
||||
case KbootPhase_CheckResetSendAck:
|
||||
status = tx(ackMessage, sizeof(ackMessage));
|
||||
KbootDriverState.commandType = KbootCommand_Idle;
|
||||
KbootDriverState.command = KbootCommand_Idle;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -7,7 +7,10 @@
|
||||
|
||||
// Macros:
|
||||
|
||||
#define MAX_KBOOT_COMMAND_LENGTH 32
|
||||
#define KBOOT_PACKAGE_MAX_LENGTH 32
|
||||
#define KBOOT_PACKAGE_LENGTH_PING_RESPONSE 10
|
||||
#define KBOOT_PACKAGE_LENGTH_ACK 2
|
||||
#define KBOOT_PACKAGE_LENGTH_GENERIC_RESPONSE 18
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -21,8 +24,22 @@
|
||||
KbootCommand_Reset,
|
||||
} kboot_command_t;
|
||||
|
||||
typedef enum {
|
||||
KbootPhase_SendPing,
|
||||
KbootPhase_CheckPingStatus,
|
||||
KbootPhase_ReceivePingResponse,
|
||||
KbootPhase_CheckPingResponseStatus,
|
||||
} kboot_ping_phase_t;
|
||||
|
||||
typedef enum {
|
||||
KbootPhase_SendReset,
|
||||
KbootPhase_ReceiveResetAck,
|
||||
KbootPhase_ReceiveResetGenericResponse,
|
||||
KbootPhase_CheckResetSendAck,
|
||||
} kboot_reset_phase_t;
|
||||
|
||||
typedef struct {
|
||||
kboot_command_t commandType;
|
||||
kboot_command_t command;
|
||||
uint8_t i2cAddress;
|
||||
uint8_t phase;
|
||||
uint32_t status;
|
||||
|
||||
@@ -91,7 +91,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
case UhkModulePhase_ProcessSync: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
bool isSyncValid = memcmp(rxMessage->data, SlaveSyncString, SLAVE_SYNC_STRING_LENGTH) == 0;
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isSyncValid && isMessageValid
|
||||
? UhkModulePhase_RequestModuleProtocolVersion
|
||||
: UhkModulePhase_RequestSync;
|
||||
@@ -115,7 +115,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->moduleProtocolVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestFirmwareVersion : UhkModulePhase_RequestModuleProtocolVersion;
|
||||
break;
|
||||
}
|
||||
@@ -137,7 +137,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->firmwareVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestFirmwareVersion;
|
||||
break;
|
||||
}
|
||||
@@ -159,7 +159,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->moduleId = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleKeyCount : UhkModulePhase_RequestModuleId;
|
||||
break;
|
||||
}
|
||||
@@ -181,7 +181,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->keyCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModulePointerCount : UhkModulePhase_RequestModuleKeyCount;
|
||||
break;
|
||||
}
|
||||
@@ -203,7 +203,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->pointerCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModulePointerCount;
|
||||
break;
|
||||
}
|
||||
@@ -227,14 +227,14 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
KeyStates[slotId][keyId].current = keyStatesBuffer[keyId];
|
||||
}
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = UhkModulePhase_SetTestLed;
|
||||
break;
|
||||
|
||||
// Set test LED
|
||||
case UhkModulePhase_SetTestLed:
|
||||
if (uhkModuleSourceVars->isTestLedOn == uhkModuleTargetVars->isTestLedOn) {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
} else {
|
||||
txMessage.data[0] = SlaveCommand_SetTestLed;
|
||||
txMessage.data[1] = uhkModuleSourceVars->isTestLedOn;
|
||||
@@ -248,7 +248,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
// Set PWM brightness
|
||||
case UhkModulePhase_SetLedPwmBrightness:
|
||||
if (uhkModuleSourceVars->ledPwmBrightness == uhkModuleTargetVars->ledPwmBrightness) {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
} else {
|
||||
txMessage.data[0] = SlaveCommand_SetLedPwmBrightness;
|
||||
txMessage.data[1] = uhkModuleSourceVars->ledPwmBrightness;
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#include "slave_drivers/kboot_driver.h"
|
||||
#include "i2c.h"
|
||||
#include "i2c_addresses.h"
|
||||
#include "config.h"
|
||||
#include "i2c_error_logger.h"
|
||||
|
||||
uint32_t I2cSlaveScheduler_Counter;
|
||||
|
||||
@@ -48,23 +50,27 @@ uhk_slave_t Slaves[] = {
|
||||
|
||||
static void slaveSchedulerCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t previousStatus, void *userData)
|
||||
{
|
||||
bool isFirstIteration = true;
|
||||
bool isFirstCycle = true;
|
||||
bool isTransferScheduled = false;
|
||||
I2cSlaveScheduler_Counter++;
|
||||
|
||||
do {
|
||||
uhk_slave_t *previousSlave = Slaves + previousSlaveId;
|
||||
uhk_slave_t *currentSlave = Slaves + currentSlaveId;
|
||||
|
||||
previousSlave->previousStatus = previousStatus;
|
||||
if (isFirstCycle) {
|
||||
uhk_slave_t *previousSlave = Slaves + previousSlaveId;
|
||||
previousSlave->previousStatus = previousStatus;
|
||||
if (IS_STATUS_I2C_ERROR(previousStatus)) {
|
||||
LogI2cError(previousSlaveId, previousStatus);
|
||||
}
|
||||
|
||||
if (isFirstIteration) {
|
||||
bool wasPreviousSlaveConnected = previousSlave->isConnected;
|
||||
previousSlave->isConnected = previousStatus == kStatus_Success;
|
||||
if (wasPreviousSlaveConnected && !previousSlave->isConnected && previousSlave->disconnect) {
|
||||
previousSlave->disconnect(previousSlaveId);
|
||||
}
|
||||
isFirstIteration = false;
|
||||
|
||||
isFirstCycle = false;
|
||||
}
|
||||
|
||||
if (!currentSlave->isConnected) {
|
||||
@@ -72,18 +78,21 @@ static void slaveSchedulerCallback(I2C_Type *base, i2c_master_handle_t *handle,
|
||||
}
|
||||
|
||||
status_t currentStatus = currentSlave->update(currentSlave->perDriverId);
|
||||
isTransferScheduled = currentStatus != kStatus_Uhk_IdleSlave && currentStatus != kStatus_Uhk_NoTransfer;
|
||||
if (IS_STATUS_I2C_ERROR(currentStatus)) {
|
||||
LogI2cError(currentSlaveId, currentStatus);
|
||||
}
|
||||
isTransferScheduled = currentStatus != kStatus_Uhk_IdleSlave && currentStatus != kStatus_Uhk_IdleCycle;
|
||||
if (isTransferScheduled) {
|
||||
currentSlave->isConnected = true;
|
||||
}
|
||||
|
||||
if (currentStatus != kStatus_Uhk_NoTransfer) {
|
||||
if (currentStatus != kStatus_Uhk_IdleCycle) {
|
||||
previousSlaveId = currentSlaveId++;
|
||||
if (currentSlaveId >= SLAVE_COUNT) {
|
||||
currentSlaveId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentSlaveId >= (sizeof(Slaves) / sizeof(uhk_slave_t))) {
|
||||
currentSlaveId = 0;
|
||||
}
|
||||
} while (!isTransferScheduled);
|
||||
}
|
||||
|
||||
@@ -92,7 +101,7 @@ void InitSlaveScheduler(void)
|
||||
previousSlaveId = 0;
|
||||
currentSlaveId = 0;
|
||||
|
||||
for (uint8_t i=0; i<sizeof(Slaves) / sizeof(uhk_slave_t); i++) {
|
||||
for (uint8_t i=0; i<SLAVE_COUNT; i++) {
|
||||
uhk_slave_t *currentSlave = Slaves + i;
|
||||
currentSlave->isConnected = false;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,14 @@
|
||||
// Includes:
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "config.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define SLAVE_COUNT (sizeof(Slaves) / sizeof(uhk_slave_t))
|
||||
#define MAX_SLAVE_COUNT 6
|
||||
#define IS_VALID_SLAVE_ID(slaveId) (0 <= slaveId && slaveId <= MAX_SLAVE_COUNT)
|
||||
#define IS_STATUS_I2C_ERROR(status) (kStatus_I2C_Busy <= status && status <= kStatus_I2C_Timeout)
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -30,12 +38,12 @@
|
||||
} uhk_slave_t;
|
||||
|
||||
typedef enum {
|
||||
kStatusGroup_Uhk = -1,
|
||||
kStatusGroup_Uhk = 200,
|
||||
} uhk_status_group_t;
|
||||
|
||||
typedef enum {
|
||||
kStatus_Uhk_IdleSlave = MAKE_STATUS(kStatusGroup_Uhk, 0), // Another slave should be scheduled
|
||||
kStatus_Uhk_NoTransfer = MAKE_STATUS(kStatusGroup_Uhk, 1), // The same slave should be rescheduled
|
||||
kStatus_Uhk_IdleSlave = MAKE_STATUS(kStatusGroup_Uhk, 0), // Another slave should be scheduled
|
||||
kStatus_Uhk_IdleCycle = MAKE_STATUS(kStatusGroup_Uhk, 1), // The same slave should be rescheduled
|
||||
} uhk_status_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "fsl_pit.h"
|
||||
#include "timer.h"
|
||||
|
||||
uint32_t CurrentTime;
|
||||
static volatile uint32_t CurrentTime;
|
||||
|
||||
void PIT_TIMER_HANDLER(void)
|
||||
{
|
||||
@@ -24,6 +24,10 @@ void Timer_Init(void)
|
||||
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
||||
}
|
||||
|
||||
uint32_t Timer_GetCurrentTime() {
|
||||
return CurrentTime;
|
||||
}
|
||||
|
||||
void Timer_SetCurrentTime(uint32_t *time)
|
||||
{
|
||||
*time = CurrentTime;
|
||||
|
||||
@@ -9,13 +9,10 @@
|
||||
|
||||
#define TIMER_INTERVAL_MSEC 1
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint32_t CurrentTime;
|
||||
|
||||
// Functions:
|
||||
|
||||
void Timer_Init(void);
|
||||
uint32_t Timer_GetCurrentTime();
|
||||
void Timer_SetCurrentTime(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
||||
|
||||
@@ -45,15 +45,9 @@ void UsbCommand_ApplyConfig(void)
|
||||
}
|
||||
|
||||
// Switch to the keymap of the updated configuration of the same name or the default keymap.
|
||||
|
||||
for (uint8_t keymapId = 0; keymapId < AllKeymapsCount; keymapId++) {
|
||||
if (AllKeymaps[keymapId].abbreviationLen == oldKeymapAbbreviationLen &&
|
||||
!memcmp(oldKeymapAbbreviation, AllKeymaps[keymapId].abbreviation, oldKeymapAbbreviationLen))
|
||||
{
|
||||
SwitchKeymap(keymapId);
|
||||
return;
|
||||
}
|
||||
if (SwitchKeymapByAbbreviation(oldKeymapAbbreviationLen, oldKeymapAbbreviation)) {
|
||||
return;
|
||||
}
|
||||
|
||||
SwitchKeymap(DefaultKeymapIndex);
|
||||
SwitchKeymapById(DefaultKeymapIndex);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ void UsbCommand_GetDebugBuffer(void)
|
||||
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
||||
SetDebugBufferUint32(17, KeyScannerCounter);
|
||||
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
||||
SetDebugBufferUint32(25, CurrentTime);
|
||||
SetDebugBufferUint32(25, Timer_GetCurrentTime());
|
||||
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
||||
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
||||
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_property.h"
|
||||
#include "usb_commands/usb_command_get_device_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "versions.h"
|
||||
#include "slave_drivers/kboot_driver.h"
|
||||
#include "i2c.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "fsl_i2c.h"
|
||||
#include "timer.h"
|
||||
|
||||
version_t deviceProtocolVersion = {
|
||||
DEVICE_PROTOCOL_MAJOR_VERSION,
|
||||
@@ -41,7 +46,7 @@ version_t protocolVersions[] =
|
||||
|
||||
uint16_t configSizes[] = {HARDWARE_CONFIG_SIZE, USER_CONFIG_SIZE};
|
||||
|
||||
void UsbCommand_GetProperty(void)
|
||||
void UsbCommand_GetDeviceProperty(void)
|
||||
{
|
||||
uint8_t propertyId = GetUsbRxBufferUint8(1);
|
||||
|
||||
@@ -55,8 +60,19 @@ void UsbCommand_GetProperty(void)
|
||||
case DevicePropertyId_ConfigSizes:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&configSizes, sizeof(configSizes));
|
||||
break;
|
||||
case DevicePropertyId_CurrentKbootCommand:
|
||||
GenericHidOutBuffer[1] = KbootDriverState.command;
|
||||
break;
|
||||
case DevicePropertyId_I2cMainBusBaudRate:
|
||||
GenericHidOutBuffer[1] = I2C_MAIN_BUS_BASEADDR->F;
|
||||
SetUsbTxBufferUint32(2, I2cMainBusRequestedBaudRateBps);
|
||||
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
||||
break;
|
||||
case DevicePropertyId_Uptime:
|
||||
SetUsbTxBufferUint32(1, Timer_GetCurrentTime());
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetProperty_InvalidProperty);
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
23
right/src/usb_commands/usb_command_get_device_property.h
Normal file
23
right/src/usb_commands/usb_command_get_device_property.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
DevicePropertyId_DeviceProtocolVersion = 0,
|
||||
DevicePropertyId_ProtocolVersions = 1,
|
||||
DevicePropertyId_ConfigSizes = 2,
|
||||
DevicePropertyId_CurrentKbootCommand = 3,
|
||||
DevicePropertyId_I2cMainBusBaudRate = 4,
|
||||
DevicePropertyId_Uptime = 5,
|
||||
} device_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetDeviceProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_device_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetDeviceProperty(void);
|
||||
|
||||
#endif
|
||||
@@ -1,21 +0,0 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_module_properties.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slot.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
|
||||
void UsbCommand_GetModuleProperties()
|
||||
{
|
||||
slot_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_MODULE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_InvalidModuleSlotId);
|
||||
}
|
||||
|
||||
uint8_t moduleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
uhk_module_state_t *moduleState = UhkModuleStates + moduleDriverId;
|
||||
|
||||
GenericHidOutBuffer[1] = moduleState->moduleId;
|
||||
memcpy(GenericHidOutBuffer + 2, &moduleState->moduleProtocolVersion, sizeof(version_t));
|
||||
memcpy(GenericHidOutBuffer + 2 + sizeof(version_t), &moduleState->firmwareVersion, sizeof(version_t));
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
#ifndef __USB_COMMAND_GET_MODULE_PROPERTIES_H__
|
||||
#define __USB_COMMAND_GET_MODULE_PROPERTIES_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetModuleProperties();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_ReadConfig_InvalidModuleSlotId = 2,
|
||||
} usb_status_code_get_module_properties_t;
|
||||
|
||||
#endif
|
||||
26
right/src/usb_commands/usb_command_get_module_property.c
Normal file
26
right/src/usb_commands/usb_command_get_module_property.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_module_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slot.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
|
||||
void UsbCommand_GetModuleProperty()
|
||||
{
|
||||
slot_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_MODULE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidModuleSlotId);
|
||||
}
|
||||
|
||||
module_property_id_t modulePropertyId = GetUsbRxBufferUint8(2);
|
||||
switch (modulePropertyId) {
|
||||
case ModulePropertyId_VersionNumbers: {
|
||||
uint8_t moduleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
uhk_module_state_t *moduleState = UhkModuleStates + moduleDriverId;
|
||||
GenericHidOutBuffer[1] = moduleState->moduleId;
|
||||
memcpy(GenericHidOutBuffer + 2, &moduleState->moduleProtocolVersion, sizeof(version_t));
|
||||
memcpy(GenericHidOutBuffer + 8, &moduleState->firmwareVersion, sizeof(version_t));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
18
right/src/usb_commands/usb_command_get_module_property.h
Normal file
18
right/src/usb_commands/usb_command_get_module_property.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#ifndef __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetModuleProperty();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
ModulePropertyId_VersionNumbers = 0,
|
||||
} module_property_id_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetModuleProperty_InvalidModuleSlotId = 2,
|
||||
} usb_status_code_get_module_property_t;
|
||||
|
||||
#endif
|
||||
@@ -1,20 +0,0 @@
|
||||
#ifndef __USB_COMMAND_GET_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_PROPERTY_H__
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
DevicePropertyId_DeviceProtocolVersion = 0,
|
||||
DevicePropertyId_ProtocolVersions = 1,
|
||||
DevicePropertyId_ConfigSizes = 2,
|
||||
} system_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetProperty(void);
|
||||
|
||||
#endif
|
||||
19
right/src/usb_commands/usb_command_get_slave_i2c_errors.c
Normal file
19
right/src/usb_commands/usb_command_get_slave_i2c_errors.c
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "i2c_error_logger.h"
|
||||
|
||||
void UsbCommand_GetSlaveI2cErrors()
|
||||
{
|
||||
uint8_t slaveId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_SLAVE_ID(slaveId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidSlaveId);
|
||||
}
|
||||
|
||||
i2c_slave_error_counter_t *i2cSlaveErrorCounter = I2cSlaveErrorCounters + slaveId;
|
||||
|
||||
GenericHidOutBuffer[1] = i2cSlaveErrorCounter->errorTypeCount;
|
||||
memcpy(GenericHidOutBuffer + 2, i2cSlaveErrorCounter->errors, sizeof(i2c_error_count_t) * MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE);
|
||||
}
|
||||
14
right/src/usb_commands/usb_command_get_slave_i2c_errors.h
Normal file
14
right/src/usb_commands/usb_command_get_slave_i2c_errors.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
|
||||
#define __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetSlaveI2cErrors();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetModuleProperty_InvalidSlaveId = 2,
|
||||
} usb_status_code_get_slave_i2c_errors_t;
|
||||
|
||||
#endif
|
||||
@@ -6,5 +6,5 @@ void UsbCommand_SendKbootCommandToModule(void)
|
||||
{
|
||||
KbootDriverState.phase = 0;
|
||||
KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2);
|
||||
KbootDriverState.commandType = GetUsbRxBufferUint8(1); // Command should be set last.
|
||||
KbootDriverState.command = GetUsbRxBufferUint8(1); // Command should be set last.
|
||||
}
|
||||
|
||||
11
right/src/usb_commands/usb_command_set_i2c_baud_rate.c
Normal file
11
right/src/usb_commands/usb_command_set_i2c_baud_rate.c
Normal file
@@ -0,0 +1,11 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "usb_commands/usb_command_set_i2c_baud_rate.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "fsl_i2c.h"
|
||||
|
||||
void UsbCommand_SetI2cBaudRate(void)
|
||||
{
|
||||
uint32_t i2cBaudRate = GetUsbRxBufferUint32(1);
|
||||
I2cMainBusRequestedBaudRateBps = i2cBaudRate;
|
||||
ReinitI2cMainBus();
|
||||
}
|
||||
8
right/src/usb_commands/usb_command_set_i2c_baud_rate.h
Normal file
8
right/src/usb_commands/usb_command_set_i2c_baud_rate.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef __USB_COMMAND_SET_I2C_BAUD_RATE__
|
||||
#define __USB_COMMAND_SET_I2C_BAUD_RATE__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_SetI2cBaudRate(void);
|
||||
|
||||
#endif
|
||||
17
right/src/usb_commands/usb_command_switch_keymap.c
Normal file
17
right/src/usb_commands/usb_command_switch_keymap.c
Normal file
@@ -0,0 +1,17 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "usb_commands/usb_command_switch_keymap.h"
|
||||
#include "keymap.h"
|
||||
|
||||
void UsbCommand_SwitchKeymap(void)
|
||||
{
|
||||
uint32_t keymapLength = GetUsbRxBufferUint8(1);
|
||||
char *keymapAbbrev = (char*)GenericHidInBuffer + 2;
|
||||
|
||||
if (keymapLength > KEYMAP_ABBREVIATION_LENGTH) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_SwitchKeymap_InvalidAbbreviationLength);
|
||||
}
|
||||
|
||||
if (!SwitchKeymapByAbbreviation(keymapLength, keymapAbbrev)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_SwitchKeymap_InvalidAbbreviation);
|
||||
}
|
||||
}
|
||||
15
right/src/usb_commands/usb_command_switch_keymap.h
Normal file
15
right/src/usb_commands/usb_command_switch_keymap.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef __USB_COMMAND_SWITCH_KEYMAP_H__
|
||||
#define __USB_COMMAND_SWITCH_KEYMAP_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_SwitchKeymap(void);
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_SwitchKeymap_InvalidAbbreviationLength = 2,
|
||||
UsbStatusCode_SwitchKeymap_InvalidAbbreviation = 3,
|
||||
} usb_status_code_switch_keymap_t;
|
||||
|
||||
#endif
|
||||
@@ -1,3 +1,6 @@
|
||||
#include "config.h"
|
||||
#include "led_display.h"
|
||||
#include "slave_drivers/is31fl3731_driver.h"
|
||||
#include "usb_device_config.h"
|
||||
#include "usb_composite_device.h"
|
||||
#include "usb_descriptors/usb_descriptor_hid.h"
|
||||
@@ -160,21 +163,53 @@ static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
|
||||
}
|
||||
}};
|
||||
|
||||
bool IsHostSleeping = false;
|
||||
|
||||
static void suspendHost(void) {
|
||||
IsHostSleeping = true;
|
||||
LedSlaveDriver_DisableLeds();
|
||||
}
|
||||
|
||||
void WakeUpHost(bool sendResume) {
|
||||
if (sendResume) { // The device should wake up the host.
|
||||
// Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
|
||||
USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL);
|
||||
}
|
||||
|
||||
IsHostSleeping = false;
|
||||
LedSlaveDriver_UpdateLeds();
|
||||
}
|
||||
|
||||
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
|
||||
{
|
||||
usb_status_t status = kStatus_USB_Error;
|
||||
uint16_t *temp16 = (uint16_t*)param;
|
||||
uint8_t *temp8 = (uint8_t*)param;
|
||||
|
||||
if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface) {
|
||||
if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface && event != kUSB_DeviceEventSuspend && event != kUSB_DeviceEventResume) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (IsHostSleeping) {
|
||||
WakeUpHost(false); // Wake up the keyboard if there is any activity on the bus.
|
||||
}
|
||||
|
||||
switch (event) {
|
||||
case kUSB_DeviceEventBusReset:
|
||||
UsbCompositeDevice.attach = 0;
|
||||
status = kStatus_USB_Success;
|
||||
break;
|
||||
case kUSB_DeviceEventSuspend:
|
||||
if (UsbCompositeDevice.attach) {
|
||||
suspendHost(); // The host sends this event when it goes to sleep, so turn off all the LEDs.
|
||||
status = kStatus_USB_Success;
|
||||
}
|
||||
break;
|
||||
case kUSB_DeviceEventResume:
|
||||
// We will just wake up the host if there is any activity on the bus.
|
||||
// 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;
|
||||
break;
|
||||
case kUSB_DeviceEventSetConfiguration:
|
||||
UsbCompositeDevice.attach = 1;
|
||||
UsbCompositeDevice.currentConfiguration = *temp8;
|
||||
|
||||
@@ -28,10 +28,12 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsHostSleeping;
|
||||
extern usb_composite_device_t UsbCompositeDevice;
|
||||
|
||||
//Functions:
|
||||
|
||||
void InitUsb(void);
|
||||
void WakeUpHost(bool sendResume);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -36,7 +36,7 @@ uint8_t UsbBasicKeyboardReportDescriptor[USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LE
|
||||
|
||||
// Scancodes
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
||||
HID_RI_LOGICAL_MAXIMUM(16, 0xFF),
|
||||
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_KEY_CODES),
|
||||
HID_RI_USAGE_MINIMUM(8, 0x00),
|
||||
HID_RI_USAGE_MAXIMUM(8, 0xFF),
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
// Macros:
|
||||
|
||||
#define USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH 63
|
||||
#define USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH 64
|
||||
#define USB_BASIC_KEYBOARD_MAX_KEYS 6
|
||||
|
||||
// Variables:
|
||||
|
||||
@@ -10,7 +10,7 @@ uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH]
|
||||
// Input flowing from device to host
|
||||
HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_IN),
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
||||
HID_RI_LOGICAL_MAXIMUM(16, 0xFF),
|
||||
HID_RI_REPORT_SIZE(8, 0x08),
|
||||
HID_RI_REPORT_COUNT(8, USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE),
|
||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||
@@ -18,7 +18,7 @@ uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH]
|
||||
// Output flowing from host to device
|
||||
HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_OUT),
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
||||
HID_RI_LOGICAL_MAXIMUM(16, 0xFF),
|
||||
HID_RI_REPORT_SIZE(8, 0x08),
|
||||
HID_RI_REPORT_COUNT(8, USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE),
|
||||
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
// Macros:
|
||||
|
||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 31
|
||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 33
|
||||
|
||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX 0x80
|
||||
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION 0x81
|
||||
|
||||
@@ -5,14 +5,16 @@ uint8_t UsbSystemKeyboardReportDescriptor[USB_SYSTEM_KEYBOARD_REPORT_DESCRIPTOR_
|
||||
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_GENERIC_DESKTOP),
|
||||
HID_RI_USAGE(8, HID_RI_USAGE_GENERIC_DESKTOP_SYSTEM_CONTROL),
|
||||
HID_RI_COLLECTION(8, HID_RI_COLLECTION_APPLICATION),
|
||||
// System key
|
||||
HID_RI_REPORT_SIZE(8, 2),
|
||||
HID_RI_REPORT_COUNT(8, USB_SYSTEM_KEYBOARD_MAX_KEYS),
|
||||
HID_RI_LOGICAL_MINIMUM(8, 1),
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 3),
|
||||
HID_RI_USAGE(8, 0x82),
|
||||
HID_RI_USAGE(8, 0x81),
|
||||
HID_RI_USAGE(8, 0x83),
|
||||
HID_RI_INPUT(8, HID_IOF_NO_PREFERRED_STATE | HID_IOF_NULLSTATE),
|
||||
// System keys
|
||||
HID_RI_USAGE_MINIMUM(8, 0x81), // SYSTEM_POWER_DOWN, SYSTEM_SLEEP and SYSTEM_WAKE_UP
|
||||
HID_RI_USAGE_MAXIMUM(8, 0x83),
|
||||
HID_RI_REPORT_SIZE(8, 1),
|
||||
HID_RI_REPORT_COUNT(8, 3),
|
||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||
|
||||
// Padding
|
||||
HID_RI_REPORT_SIZE(8, 1),
|
||||
HID_RI_REPORT_COUNT(8, 5),
|
||||
HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||
HID_RI_END_COLLECTION(0),
|
||||
};
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
)
|
||||
|
||||
// Whether the device is self-powered: 1 supported, 0 not supported
|
||||
#define USB_DEVICE_CONFIG_SELF_POWER 1
|
||||
#define USB_DEVICE_CONFIG_SELF_POWER 0
|
||||
|
||||
// Whether device remote wakeup supported: 1 supported, 0 not supported
|
||||
#define USB_DEVICE_CONFIG_REMOTE_WAKEUP 0
|
||||
#define USB_DEVICE_CONFIG_REMOTE_WAKEUP 1
|
||||
|
||||
// The number of control endpoints, which is always 1
|
||||
#define USB_CONTROL_ENDPOINT_COUNT 1
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
#include "led_display.h"
|
||||
#include "usb_composite_device.h"
|
||||
|
||||
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
|
||||
uint32_t UsbBasicKeyboardActionCounter;
|
||||
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
|
||||
bool IsUsbBasicKeyboardReportSent = false;
|
||||
volatile bool IsUsbBasicKeyboardReportSent = false;
|
||||
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
||||
|
||||
usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
|
||||
static usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
|
||||
{
|
||||
return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports;
|
||||
}
|
||||
@@ -41,10 +43,28 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
||||
}
|
||||
break;
|
||||
case kUSB_DeviceHidEventGetReport:
|
||||
case kUSB_DeviceHidEventSetReport:
|
||||
case kUSB_DeviceHidEventRequestReportBuffer:
|
||||
error = kStatus_USB_InvalidRequest;
|
||||
break;
|
||||
case kUSB_DeviceHidEventSetReport: {
|
||||
usb_device_hid_report_struct_t *report = (usb_device_hid_report_struct_t*)param;
|
||||
if (report->reportType == USB_DEVICE_HID_REQUEST_GET_REPORT_TYPE_OUPUT && report->reportId == 0 && report->reportLength == 1) {
|
||||
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, report->reportBuffer[0] & HID_KEYBOARD_LED_CAPSLOCK);
|
||||
error = kStatus_USB_Success;
|
||||
} else {
|
||||
error = kStatus_USB_InvalidRequest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kUSB_DeviceHidEventRequestReportBuffer: {
|
||||
usb_device_hid_report_struct_t *report = (usb_device_hid_report_struct_t*)param;
|
||||
if (report->reportLength <= USB_BASIC_KEYBOARD_REPORT_LENGTH) {
|
||||
report->reportBuffer = usbBasicKeyboardInBuffer;
|
||||
error = kStatus_USB_Success;
|
||||
} else {
|
||||
error = kStatus_USB_InvalidRequest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kUSB_DeviceHidEventGetIdle:
|
||||
case kUSB_DeviceHidEventGetProtocol:
|
||||
case kUSB_DeviceHidEventSetIdle:
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbBasicKeyboardReportSent;
|
||||
extern volatile bool IsUsbBasicKeyboardReportSent;
|
||||
extern uint32_t UsbBasicKeyboardActionCounter;
|
||||
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
uint32_t UsbMediaKeyboardActionCounter;
|
||||
static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
|
||||
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
|
||||
bool IsUsbMediaKeyboardReportSent = false;
|
||||
volatile bool IsUsbMediaKeyboardReportSent = false;
|
||||
|
||||
usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
|
||||
static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
|
||||
{
|
||||
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbMediaKeyboardReportSent;
|
||||
extern volatile bool IsUsbMediaKeyboardReportSent;
|
||||
extern uint32_t UsbMediaKeyboardActionCounter;
|
||||
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
uint32_t UsbMouseActionCounter;
|
||||
static usb_mouse_report_t usbMouseReports[2];
|
||||
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
|
||||
bool IsUsbMouseReportSent = false;
|
||||
volatile bool IsUsbMouseReportSent = false;
|
||||
|
||||
usb_mouse_report_t* getInactiveUsbMouseReport(void)
|
||||
static usb_mouse_report_t* getInactiveUsbMouseReport(void)
|
||||
{
|
||||
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbMouseReportSent;
|
||||
extern volatile bool IsUsbMouseReportSent;
|
||||
extern uint32_t UsbMouseActionCounter;
|
||||
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
uint32_t UsbSystemKeyboardActionCounter;
|
||||
static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
|
||||
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
|
||||
bool IsUsbSystemKeyboardReportSent = false;
|
||||
volatile bool IsUsbSystemKeyboardReportSent = false;
|
||||
|
||||
usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
|
||||
static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
|
||||
{
|
||||
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbSystemKeyboardReportSent;
|
||||
extern volatile bool IsUsbSystemKeyboardReportSent;
|
||||
extern uint32_t UsbSystemKeyboardActionCounter;
|
||||
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "buffer.h"
|
||||
#include "usb_commands/usb_command_get_property.h"
|
||||
#include "usb_commands/usb_command_get_device_property.h"
|
||||
#include "usb_commands/usb_command_get_module_property.h"
|
||||
#include "usb_commands/usb_command_reenumerate.h"
|
||||
#include "usb_commands/usb_command_set_test_led.h"
|
||||
#include "usb_commands/usb_command_write_config.h"
|
||||
@@ -13,14 +14,17 @@
|
||||
#include "usb_commands/usb_command_get_debug_buffer.h"
|
||||
#include "usb_commands/usb_command_jump_to_module_bootloader.h"
|
||||
#include "usb_commands/usb_command_send_kboot_command_to_module.h"
|
||||
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
|
||||
#include "usb_commands/usb_command_set_i2c_baud_rate.h"
|
||||
#include "usb_commands/usb_command_switch_keymap.h"
|
||||
|
||||
void UsbProtocolHandler(void)
|
||||
{
|
||||
bzero(GenericHidOutBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH);
|
||||
uint8_t command = GetUsbRxBufferUint8(0);
|
||||
switch (command) {
|
||||
case UsbCommandId_GetProperty:
|
||||
UsbCommand_GetProperty();
|
||||
case UsbCommandId_GetDeviceProperty:
|
||||
UsbCommand_GetDeviceProperty();
|
||||
break;
|
||||
case UsbCommandId_Reenumerate:
|
||||
UsbCommand_Reenumerate();
|
||||
@@ -61,8 +65,17 @@ void UsbProtocolHandler(void)
|
||||
case UsbCommandId_SetLedPwmBrightness:
|
||||
UsbCommand_SetLedPwmBrightness();
|
||||
break;
|
||||
case UsbCommandId_GetModuleProperties:
|
||||
UsbCommand_GetModuleProperties();
|
||||
case UsbCommandId_GetModuleProperty:
|
||||
UsbCommand_GetModuleProperty();
|
||||
break;
|
||||
case UsbCommandId_GetSlaveI2cErrors:
|
||||
UsbCommand_GetSlaveI2cErrors();
|
||||
break;
|
||||
case UsbCommandId_SetI2cBaudRate:
|
||||
UsbCommand_SetI2cBaudRate();
|
||||
break;
|
||||
case UsbCommandId_SwitchKeymap:
|
||||
UsbCommand_SwitchKeymap();
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbCommandId_GetProperty = 0x00,
|
||||
UsbCommandId_GetDeviceProperty = 0x00,
|
||||
|
||||
UsbCommandId_Reenumerate = 0x01,
|
||||
UsbCommandId_JumpToModuleBootloader = 0x02,
|
||||
@@ -30,7 +30,10 @@
|
||||
UsbCommandId_GetDebugBuffer = 0x0b,
|
||||
UsbCommandId_GetAdcValue = 0x0c,
|
||||
UsbCommandId_SetLedPwmBrightness = 0x0d,
|
||||
UsbCommandId_GetModuleProperties = 0x0e,
|
||||
UsbCommandId_GetModuleProperty = 0x0e,
|
||||
UsbCommandId_GetSlaveI2cErrors = 0x0f,
|
||||
UsbCommandId_SetI2cBaudRate = 0x10,
|
||||
UsbCommandId_SwitchKeymap = 0x11,
|
||||
} usb_command_id_t;
|
||||
|
||||
typedef enum {
|
||||
|
||||
@@ -17,10 +17,11 @@
|
||||
#include "config_parser/parse_keymap.h"
|
||||
#include "usb_commands/usb_command_get_debug_buffer.h"
|
||||
|
||||
uint32_t UsbReportUpdateTime = 0;
|
||||
static uint32_t elapsedTime;
|
||||
static uint32_t mouseUsbReportUpdateTime = 0;
|
||||
static uint32_t mouseElapsedTime;
|
||||
|
||||
uint16_t DoubleTapSwitchLayerTimeout = 250;
|
||||
uint16_t DoubleTapSwitchLayerTimeout = 150;
|
||||
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
|
||||
|
||||
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
||||
|
||||
@@ -52,7 +53,7 @@ mouse_kinetic_state_t MouseScrollState = {
|
||||
.acceleratedSpeed = 50,
|
||||
};
|
||||
|
||||
void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||
static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||
{
|
||||
float initialSpeed = kineticState->intMultiplier * kineticState->initialSpeed;
|
||||
float acceleration = kineticState->intMultiplier * kineticState->acceleration;
|
||||
@@ -86,18 +87,18 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||
|
||||
if (isMoveAction) {
|
||||
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
||||
kineticState->currentSpeed += acceleration * elapsedTime / 1000;
|
||||
kineticState->currentSpeed += acceleration * (float)mouseElapsedTime / 1000.0f;
|
||||
if (kineticState->currentSpeed > kineticState->targetSpeed) {
|
||||
kineticState->currentSpeed = kineticState->targetSpeed;
|
||||
}
|
||||
} else {
|
||||
kineticState->currentSpeed -= acceleration * elapsedTime / 1000;
|
||||
kineticState->currentSpeed -= acceleration * (float)mouseElapsedTime / 1000.0f;
|
||||
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
||||
kineticState->currentSpeed = kineticState->targetSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
float distance = kineticState->currentSpeed * elapsedTime / 1000;
|
||||
float distance = kineticState->currentSpeed * (float)mouseElapsedTime / 1000.0f;
|
||||
|
||||
|
||||
if (kineticState->isScroll && !kineticState->wasMoveAction) {
|
||||
@@ -154,8 +155,10 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||
kineticState->wasMoveAction = isMoveAction;
|
||||
}
|
||||
|
||||
void processMouseActions()
|
||||
static void processMouseActions()
|
||||
{
|
||||
mouseElapsedTime = Timer_GetElapsedTimeAndSetCurrent(&mouseUsbReportUpdateTime);
|
||||
|
||||
processMouseKineticState(&MouseMoveState);
|
||||
ActiveUsbMouseReport->x = MouseMoveState.xOut;
|
||||
ActiveUsbMouseReport->y = MouseMoveState.yOut;
|
||||
@@ -191,11 +194,13 @@ static layer_id_t previousLayer = LayerId_Base;
|
||||
static uint8_t basicScancodeIndex = 0;
|
||||
static uint8_t mediaScancodeIndex = 0;
|
||||
static uint8_t systemScancodeIndex = 0;
|
||||
key_state_t *doubleTapSwitchLayerKey;
|
||||
uint32_t doubleTapSwitchLayerStartTime;
|
||||
|
||||
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) {
|
||||
return;
|
||||
}
|
||||
@@ -233,21 +238,25 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
||||
activeMouseStates[action->mouseAction] = true;
|
||||
break;
|
||||
case KeyActionType_SwitchLayer:
|
||||
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) {
|
||||
if (Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
||||
ToggledLayer = action->switchLayer.layer;
|
||||
}
|
||||
doubleTapSwitchLayerKey = NULL;
|
||||
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
||||
ToggledLayer = action->switchLayer.layer;
|
||||
doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime();
|
||||
} else {
|
||||
doubleTapSwitchLayerKey = keyState;
|
||||
doubleTapSwitchLayerStartTime = CurrentTime;
|
||||
}
|
||||
doubleTapSwitchLayerStartTime = Timer_GetCurrentTime();
|
||||
}
|
||||
break;
|
||||
case KeyActionType_SwitchKeymap:
|
||||
if (!keyState->previous) {
|
||||
SwitchKeymap(action->switchKeymap.keymapId);
|
||||
SwitchKeymapById(action->switchKeymap.keymapId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -258,14 +267,11 @@ static uint8_t secondaryRoleSlotId;
|
||||
static uint8_t secondaryRoleKeyId;
|
||||
static secondary_role_t secondaryRole;
|
||||
|
||||
#define pos 35
|
||||
void updateActiveUsbReports(void)
|
||||
static void updateActiveUsbReports(void)
|
||||
{
|
||||
SetDebugBufferUint32(pos, 1);
|
||||
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
|
||||
|
||||
static uint8_t previousModifiers = 0;
|
||||
elapsedTime = Timer_GetElapsedTimeAndSetCurrent(&UsbReportUpdateTime);
|
||||
|
||||
basicScancodeIndex = 0;
|
||||
mediaScancodeIndex = 0;
|
||||
@@ -282,7 +288,7 @@ void updateActiveUsbReports(void)
|
||||
if (activeLayer == LayerId_Base) {
|
||||
activeLayer = GetActiveLayer();
|
||||
}
|
||||
bool suppressKeys = previousLayer != LayerId_Base && activeLayer == LayerId_Base;
|
||||
bool layerGotReleased = previousLayer != LayerId_Base && activeLayer == LayerId_Base;
|
||||
LedDisplay_SetLayer(activeLayer);
|
||||
|
||||
if (MacroPlaying) {
|
||||
@@ -293,14 +299,12 @@ void updateActiveUsbReports(void)
|
||||
memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
|
||||
return;
|
||||
}
|
||||
SetDebugBufferUint32(pos, 2);
|
||||
|
||||
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
||||
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
||||
key_state_t *keyState = &KeyStates[slotId][keyId];
|
||||
key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId];
|
||||
|
||||
|
||||
if (keyState->debounceCounter < KEY_DEBOUNCER_TIMEOUT_MSEC) {
|
||||
keyState->current = keyState->previous;
|
||||
} else if (!keyState->previous && keyState->current) {
|
||||
@@ -308,7 +312,8 @@ void updateActiveUsbReports(void)
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -347,10 +352,8 @@ void updateActiveUsbReports(void)
|
||||
keyState->previous = keyState->current;
|
||||
}
|
||||
}
|
||||
SetDebugBufferUint32(pos, 4);
|
||||
|
||||
processMouseActions();
|
||||
SetDebugBufferUint32(pos, 5);
|
||||
|
||||
// When a layer switcher key gets pressed along with another key that produces some modifiers
|
||||
// and the accomanying key gets released then keep the related modifiers active a long as the
|
||||
@@ -365,55 +368,28 @@ void updateActiveUsbReports(void)
|
||||
|
||||
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
|
||||
previousLayer = activeLayer;
|
||||
SetDebugBufferUint32(pos, 7);
|
||||
}
|
||||
|
||||
bool UsbBasicKeyboardReportEverSent = false;
|
||||
bool UsbMediaKeyboardReportEverSent = false;
|
||||
bool UsbSystemKeyboardReportEverSent = false;
|
||||
bool UsbMouseReportEverSentEverSent = false;
|
||||
|
||||
uint32_t UsbReportUpdateCounter;
|
||||
static uint32_t lastUsbUpdateTime;
|
||||
static uint32_t lastMouseUpdateTime;
|
||||
|
||||
void UpdateUsbReports(void)
|
||||
{
|
||||
UsbReportUpdateCounter++;
|
||||
|
||||
if (Timer_GetElapsedTime(&lastUsbUpdateTime) > 100) {
|
||||
UsbBasicKeyboardReportEverSent = false;
|
||||
UsbMediaKeyboardReportEverSent = false;
|
||||
UsbSystemKeyboardReportEverSent = false;
|
||||
UsbMouseReportEverSentEverSent = false;
|
||||
// Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent.
|
||||
bool hasActiveMouseState = false;
|
||||
for (uint8_t i=0; i<ACTIVE_MOUSE_STATES_COUNT; i++) {
|
||||
hasActiveMouseState = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (IsUsbBasicKeyboardReportSent) {
|
||||
UsbBasicKeyboardReportEverSent = true;
|
||||
}
|
||||
if (IsUsbMediaKeyboardReportSent) {
|
||||
UsbMediaKeyboardReportEverSent = true;
|
||||
}
|
||||
if (IsUsbSystemKeyboardReportSent) {
|
||||
UsbSystemKeyboardReportEverSent = true;
|
||||
}
|
||||
if (IsUsbMouseReportSent) {
|
||||
UsbMouseReportEverSentEverSent = true;
|
||||
}
|
||||
|
||||
bool areUsbReportsSent = true;
|
||||
if (UsbBasicKeyboardReportEverSent) {
|
||||
areUsbReportsSent &= IsUsbBasicKeyboardReportSent;
|
||||
}
|
||||
if (UsbMediaKeyboardReportEverSent) {
|
||||
areUsbReportsSent &= IsUsbMediaKeyboardReportSent;
|
||||
}
|
||||
if (UsbSystemKeyboardReportEverSent) {
|
||||
areUsbReportsSent &= IsUsbSystemKeyboardReportSent;
|
||||
}
|
||||
if (UsbMouseReportEverSentEverSent) {
|
||||
areUsbReportsSent &= IsUsbMouseReportSent;
|
||||
}
|
||||
if (!areUsbReportsSent) {
|
||||
if (hasActiveMouseState) {
|
||||
if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_MOUSE_INTERRUPT_IN_INTERVAL) {
|
||||
return;
|
||||
}
|
||||
Timer_SetCurrentTime(&lastMouseUpdateTime);
|
||||
} else if (!IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -424,15 +400,35 @@ void UpdateUsbReports(void)
|
||||
|
||||
updateActiveUsbReports();
|
||||
|
||||
SwitchActiveUsbBasicKeyboardReport();
|
||||
SwitchActiveUsbMediaKeyboardReport();
|
||||
SwitchActiveUsbSystemKeyboardReport();
|
||||
SwitchActiveUsbMouseReport();
|
||||
static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF };
|
||||
if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) {
|
||||
last_basic_report = *ActiveUsbBasicKeyboardReport;
|
||||
SwitchActiveUsbBasicKeyboardReport();
|
||||
IsUsbBasicKeyboardReportSent = false;
|
||||
}
|
||||
|
||||
IsUsbBasicKeyboardReportSent = false;
|
||||
IsUsbMediaKeyboardReportSent = false;
|
||||
IsUsbSystemKeyboardReportSent = false;
|
||||
IsUsbMouseReportSent = false;
|
||||
static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF };
|
||||
if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) {
|
||||
last_media_report = *ActiveUsbMediaKeyboardReport;
|
||||
SwitchActiveUsbMediaKeyboardReport();
|
||||
IsUsbMediaKeyboardReportSent = false;
|
||||
}
|
||||
|
||||
Timer_SetCurrentTime(&lastUsbUpdateTime);
|
||||
static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF };
|
||||
if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) {
|
||||
last_system_report = *ActiveUsbSystemKeyboardReport;
|
||||
SwitchActiveUsbSystemKeyboardReport();
|
||||
IsUsbSystemKeyboardReportSent = false;
|
||||
}
|
||||
|
||||
static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF };
|
||||
if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) {
|
||||
last_mouse_report = *ActiveUsbMouseReport;
|
||||
SwitchActiveUsbMouseReport();
|
||||
IsUsbMouseReportSent = false;
|
||||
}
|
||||
|
||||
if ((previousLayer != LayerId_Base || !IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) && IsHostSleeping) {
|
||||
WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ for (const device of package.devices) {
|
||||
mkdir('-p', deviceDir);
|
||||
chmod(644, deviceSource);
|
||||
cp(deviceSource, `${deviceDir}/firmware.hex`);
|
||||
exec(`cd ${usbDir}; git pull origin master; git checkout master`);
|
||||
exec(`${usbDir}/user-config-json-to-bin.ts ${deviceDir}/config.bin`);
|
||||
}
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
"commander": "^2.11.0",
|
||||
"shelljs": "^0.7.8"
|
||||
},
|
||||
"firmwareVersion": "8.0.0",
|
||||
"deviceProtocolVersion": "4.1.0",
|
||||
"firmwareVersion": "8.2.1",
|
||||
"deviceProtocolVersion": "4.3.0",
|
||||
"moduleProtocolVersion": "4.0.0",
|
||||
"userConfigVersion": "4.0.0",
|
||||
"hardwareConfigVersion": "1.0.0",
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
// Variables:
|
||||
|
||||
#define FIRMWARE_MAJOR_VERSION 8
|
||||
#define FIRMWARE_MINOR_VERSION 0
|
||||
#define FIRMWARE_PATCH_VERSION 0
|
||||
#define FIRMWARE_MINOR_VERSION 2
|
||||
#define FIRMWARE_PATCH_VERSION 1
|
||||
|
||||
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
|
||||
#define DEVICE_PROTOCOL_MINOR_VERSION 1
|
||||
#define DEVICE_PROTOCOL_MINOR_VERSION 3
|
||||
#define DEVICE_PROTOCOL_PATCH_VERSION 0
|
||||
|
||||
#define MODULE_PROTOCOL_MAJOR_VERSION 4
|
||||
|
||||
Reference in New Issue
Block a user