Compare commits
132 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc49118868 | ||
|
|
f8fd99f588 | ||
|
|
fa8c9dc907 | ||
|
|
0911e67bf6 | ||
|
|
57a7cee62a | ||
|
|
1af28a79db | ||
|
|
6881f8e340 | ||
|
|
00cd1f65e8 | ||
|
|
2c9a6c0bd2 | ||
|
|
0c94cbb256 | ||
|
|
275bfee860 | ||
|
|
8a655e3cfd | ||
|
|
8521619783 | ||
|
|
62184240df | ||
|
|
0b210ac68e | ||
|
|
56f7753afc | ||
|
|
a0803875c4 | ||
|
|
f5716bdadc | ||
|
|
b76b3c0e4f | ||
|
|
2661c3d909 | ||
|
|
c854e98d84 | ||
|
|
72d8e49717 | ||
|
|
0fd95b71b2 | ||
|
|
4d83bc2e75 | ||
|
|
cf7b05ab72 | ||
|
|
055f1945d0 | ||
|
|
fa4a3abf84 | ||
|
|
96c7ccd758 | ||
|
|
76d319ec19 | ||
|
|
aab0e8473f | ||
|
|
4a4c471b9e | ||
|
|
fcd75b2af2 | ||
|
|
f318c6872e | ||
|
|
ae1240c103 | ||
|
|
e75d366245 | ||
|
|
da20cdacc4 | ||
|
|
5a986d367e | ||
|
|
f6b66283a7 | ||
|
|
6ad425cbf9 | ||
|
|
33e501cd83 | ||
|
|
fa558abef3 | ||
|
|
25a2b3af93 | ||
|
|
43587c2e1f | ||
|
|
c51542795f | ||
|
|
7eb83173ed | ||
|
|
5581dd26b5 | ||
|
|
1ac637af0f | ||
|
|
36951d1a34 | ||
|
|
5190265a2c | ||
|
|
40bf252852 | ||
|
|
85e92d21b4 | ||
|
|
fd43e81e46 | ||
|
|
c994a97d03 | ||
|
|
d59ba83d99 | ||
|
|
c1b887cea8 | ||
|
|
bd53b73685 | ||
|
|
beb7c3d4ee | ||
|
|
17571a5feb | ||
|
|
83e782d74a | ||
|
|
312f56048b | ||
|
|
494621a841 | ||
|
|
94af52892c | ||
|
|
5862a34f18 | ||
|
|
9b9e5ed1b5 | ||
|
|
4393377365 | ||
|
|
1570364741 | ||
|
|
738a240860 | ||
|
|
43b48aa643 | ||
|
|
61a0540007 | ||
|
|
f2e313dd0a | ||
|
|
b239d0da50 | ||
|
|
23459e3791 | ||
|
|
6a54944cb1 | ||
|
|
a52df9da7e | ||
|
|
28f98f179a | ||
|
|
5798f9e4fb | ||
|
|
4fe5ce45ac | ||
|
|
a212c254a9 | ||
|
|
235e18d706 | ||
|
|
7c91f8f6d1 | ||
|
|
c8cfe53136 | ||
|
|
f1f47ece14 | ||
|
|
a0dba2fa66 | ||
|
|
0f34b01189 | ||
|
|
5a449ad5c5 | ||
|
|
0d6a5ae902 | ||
|
|
2f7f7b1cd2 | ||
|
|
2eb25ce05c | ||
|
|
6e47707037 | ||
|
|
0932c14a2c | ||
|
|
e57c2c21ca | ||
|
|
a5ce90779c | ||
|
|
e9bf3dc355 | ||
|
|
8cb8654459 | ||
|
|
745e8e1cf0 | ||
|
|
5341109845 | ||
|
|
ff0e5b0aa3 | ||
|
|
c4e79d8ed2 | ||
|
|
6780c8177c | ||
|
|
71d6db0f35 | ||
|
|
9b9bdbc03d | ||
|
|
bb5c118e97 | ||
|
|
b3cbb8ea97 | ||
|
|
f76780ec48 | ||
|
|
b7e73b7b38 | ||
|
|
7318175ce7 | ||
|
|
420078449d | ||
|
|
dda3799877 | ||
|
|
712b87182a | ||
|
|
46126e1e78 | ||
|
|
2ac9ca5d67 | ||
|
|
729e0be0ad | ||
|
|
0867132ba3 | ||
|
|
1b9273a5e5 | ||
|
|
ebbd74407d | ||
|
|
5df6220ab7 | ||
|
|
3d0993998c | ||
|
|
071be7e815 | ||
|
|
bb7faaa799 | ||
|
|
368c724e6a | ||
|
|
210ef31f27 | ||
|
|
0cb3c7e0ad | ||
|
|
ab7e25692a | ||
|
|
b68e8a736e | ||
|
|
4d211f0fe1 | ||
|
|
8429ee2b71 | ||
|
|
4bbc49f4ca | ||
|
|
322ee0b35f | ||
|
|
8252da86d8 | ||
|
|
086ab239b4 | ||
|
|
a7ba0add18 | ||
|
|
d2ef63184b |
115
CHANGELOG.md
115
CHANGELOG.md
@@ -5,9 +5,88 @@ 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.1.2] - 2018-02-13
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Detect Caps Lock USB state and light up the Caps Lock icon of the LED display accordingly.
|
||||
- Set key debounce timeout from 10ms to 15ms. This should at least reduce and hopefully eliminate key chattering.
|
||||
|
||||
## [8.1.1] - 2018-02-11
|
||||
|
||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Lock layers every time when double-tapping their layer switcher keys, regardless of how many times the layer switcher key was tapped before.
|
||||
- Only lock layers via double-tapping if the second tap gets released within 100ms.
|
||||
|
||||
## [8.1.0] - 2018-01-15
|
||||
|
||||
Device Protocol: 4.**2**.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Enable left-half watchdog in reinit mode which seems to prevent freezes.
|
||||
- Slow down main bus I2C baud rate to 30kHz when BusPal is on to make firmware transfer more robust.
|
||||
- Implement UsbCommandId_GetSlaveI2cErrors. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement UsbCommandId_SetI2cBaudRate. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_CurrentKbootCommand. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_I2cMainBusBaudRate. `DEVICEPROTOCOL:MINOR`
|
||||
- Implement DevicePropertyId_Uptime. `DEVICEPROTOCOL:MINOR`
|
||||
|
||||
## [8.0.1] - 2017-12-25
|
||||
|
||||
Device Protocol: 4.1.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Implement I2C watchdog for the left keyboard half which should resolve the occasional hangs of the left keyboard half.
|
||||
|
||||
## [8.0.0] - 2017-12-15
|
||||
|
||||
Device Protocol: 4.**1.0** | Module Protocol: **4.0.0** | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make the modules transfer the module protocol version and firmware version composed of a major, a minor and a patch number. `MODULEPROTOCOL:MAJOR`
|
||||
- Query module key count and pointer count in separate messages instead of a combined message for improved clarity. `MODULEPROTOCOL:MAJOR`
|
||||
- Add new UsbCommand_GetModuleProperties() device protocol command. `DEVICEPROTOCOL:MINOR`
|
||||
|
||||
## [7.0.0] - 2017-12-14
|
||||
|
||||
Device Protocol: **4.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make UsbCommand_JumpToModuleBootloader() more robust by not making it dependent on the state of the module driver.
|
||||
- Don't make horizontal scrolling and vertical scrolling affect each other.
|
||||
- Expose version numbers via the get property interface. `DEVICEPROTOCOL:MINOR`
|
||||
- Add DevicePropertyId_ConfigSizes. `DEVICEPROTOCOL:MINOR`
|
||||
- Remove DevicePropertyId_HardwareConfigSize and DevicePropertyId_UserConfigSize. `DEVICEPROTOCOL:MAJOR`
|
||||
|
||||
## [6.0.0] - 2017-12-12
|
||||
|
||||
Device Protocol: **3.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Change the value of almost every Device Protocol commands because there were unused intervals between them. `DEVICEPROTOCOL:MAJOR`
|
||||
- Disable LED display icons by default.
|
||||
- Update LED brightness levels upon applying the configuration.
|
||||
|
||||
## [5.0.1] - 2017-12-09
|
||||
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make key presses continue to emit scancodes even if a USB interface (typically the mouse interface) is not polled by the host anymore.
|
||||
- Make scrolling always immediately react to keypresses regardless of the previous internal scroll state.
|
||||
|
||||
## [5.0.0] - 2017-12-04
|
||||
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **4.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `USERCONFIG:MAJOR`
|
||||
|
||||
## [4.0.0] - 2017-11-30
|
||||
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **3.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Implement mouse movement and scrolling deceleration and acceleration.
|
||||
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
|
||||
- Make the parser read additional user configuration properties: userConfigMajorVersion, userConfigMinorVersion, userConfigPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
|
||||
|
||||
## [3.0.0] - 2017-11-15
|
||||
|
||||
Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protocol: 3.0.0 (major bump)
|
||||
Device Protocol: **2.0.0** | Module Protocol: **3.0.0** | User Config: **2.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Detect the use of USB interfaces and only wait for the ones that are actually used by the host.
|
||||
- Implement key debouncer.
|
||||
@@ -15,49 +94,49 @@ Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protoc
|
||||
- Make pressing the reset button revert to the factory preset.
|
||||
- Revert to the factory default state when the reset button is pressed upon firmware startup. Display FTY on the display in this case.
|
||||
- Make the LED display show the abbreviation of the current keymap even when it gets reinitialized by the I2C watchdog.
|
||||
- Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `SLAVEPROTOCOL:MAJOR`
|
||||
- Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `MODULEPROTOCOL:MAJOR`
|
||||
- Suppress pressed keys upon layer switcher key release.
|
||||
- Handle secondary role modifiers and layer switchers.
|
||||
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `USBPROTOCOL:MAJOR`
|
||||
- Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `USBPROTOCOL:MINOR`
|
||||
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `USBPROTOCOL:MAJOR`
|
||||
- Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `USBPROTOCOL:MAJOR`
|
||||
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `DEVICEPROTOCOL:MAJOR`
|
||||
- Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `DEVICEPROTOCOL:MINOR`
|
||||
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `DEVICEPROTOCOL:MAJOR`
|
||||
- Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `DEVICEPROTOCOL:MAJOR`
|
||||
- Switch keymap only upon keypress.
|
||||
- Handle layer toggle actions.
|
||||
- Keep the active layer active even if another layer switcher key gets pressed while holding it.
|
||||
- Read the new UserConfig.userConfigLength user config field. `DATAMODEL:MAJOR`
|
||||
- Read the new UserConfig.userConfigLength user config field. `USERCONFIG:MAJOR`
|
||||
- Change Ctrl and Alt back according to the official UHK factory keymap.
|
||||
- Update system keyboard HID descriptor which doesn't make the pointer go to the top left corner on OSX anymore.
|
||||
- Scan keyboard matrices in a more efficient manner from timer interrupts instead of the main loop.
|
||||
- Add UsbCommand_SendKbootCommand. `USBPROTOCOL:MINOR`
|
||||
- Make the reenumerate USB command accept a timeout value. `USBPROTOCOL:MINOR`
|
||||
- Make the config parser read the device name. `DATAMODEL:MAJOR`
|
||||
- Add UsbCommand_SendKbootCommand. `DEVICEPROTOCOL:MINOR`
|
||||
- Make the reenumerate USB command accept a timeout value. `DEVICEPROTOCOL:MINOR`
|
||||
- Make the config parser read the device name. `USERCONFIG:MAJOR`
|
||||
- Update release file format containing device and module directories and hex files instead of srec.
|
||||
- Remove obsolete ARM GCC build files.
|
||||
|
||||
## [2.1.0] - 2017-10-13
|
||||
|
||||
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.2.0 (minor bump) | Slave Protocol: 2.1.0 (minor bump)
|
||||
Device Protocol: 1.**2.0** | Module Protocol: 2.**1.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Add jumpToSlaveBootloader USB and slave protocol command. `USBPROTOCOL:MINOR` `SLAVEPROTOCOL:MINOR`
|
||||
- Add jumpToSlaveBootloader USB and Module Protocol command. `DEVICEPROTOCOL:MINOR` `MODULEPROTOCOL:MINOR`
|
||||
- Fix generic HID descriptor enumeration error.
|
||||
|
||||
## [2.0.0] - 2017-10-10
|
||||
|
||||
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.1.0 (minor bump) | Slave Protocol: 2.0.0 (major bump)
|
||||
Device Protocol: 1.**1.0** | Module Protocol: **2.0.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Read the hardware and user configuration area of the EEPROM upon startup and set the default keymap.
|
||||
- Greatly improve the I2C watchdog and drivers. Communication between the halves or the add-ons should never fail again.
|
||||
- Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `SLAVEPROTOCOL:MAJOR`
|
||||
- Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `MODULEPROTOCOL:MAJOR`
|
||||
- Make the master cache the output fields of slave modules, allowing for more frequent input updates.
|
||||
- Optimize I2C protocol scheduler resulting in increased roustness and more efficient use of I2C bandwidth.
|
||||
- Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `SLAVEPROTOCOL:MAJOR`
|
||||
- Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `MODULEPROTOCOL:MAJOR`
|
||||
- Add mechanism to dump the internal state of the KL03 via SPI for debugging purposes.
|
||||
- Add merge sensor state and attached module IDs to GetDebugInfo(). `USBPROTOCOL:PATCH`
|
||||
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `DATAMODEL:PATCH`
|
||||
- Add merge sensor state and attached module IDs to GetDebugInfo(). `DEVICEPROTOCOL:PATCH`
|
||||
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `USERCONFIG:PATCH`
|
||||
|
||||
## [1.0.0] - 2017-08-30
|
||||
|
||||
Data Model: 1.0.0 | USB Protocol: 1.0.0 | Slave Protocol: 1.0.0
|
||||
Device Protocol: 1.0.0 | Module Protocol: 1.0.0 | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- First Release
|
||||
|
||||
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
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
#define MODULE_PROTOCOL_VERSION 1
|
||||
#define MODULE_ID ModuleId_LeftKeyboardHalf
|
||||
#define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM)
|
||||
#define MODULE_HAS_POINTER false
|
||||
#define MODULE_POINTER_COUNT 0
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,10 +10,23 @@
|
||||
#include "bool_array_converter.h"
|
||||
#include "bootloader.h"
|
||||
#include "module.h"
|
||||
#include "versions.h"
|
||||
|
||||
i2c_message_t RxMessage;
|
||||
i2c_message_t TxMessage;
|
||||
|
||||
static version_t moduleProtocolVersion = {
|
||||
MODULE_PROTOCOL_MAJOR_VERSION,
|
||||
MODULE_PROTOCOL_MINOR_VERSION,
|
||||
MODULE_PROTOCOL_PATCH_VERSION,
|
||||
};
|
||||
|
||||
static version_t firmwareVersion = {
|
||||
FIRMWARE_MAJOR_VERSION,
|
||||
FIRMWARE_MINOR_VERSION,
|
||||
FIRMWARE_PATCH_VERSION,
|
||||
};
|
||||
|
||||
void SlaveRxHandler(void)
|
||||
{
|
||||
if (!CRC16_IsMessageValid(&RxMessage)) {
|
||||
@@ -51,21 +64,29 @@ void SlaveTxHandler(void)
|
||||
TxMessage.length = SLAVE_SYNC_STRING_LENGTH;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ModuleProtocolVersion: {
|
||||
memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t));
|
||||
TxMessage.length = sizeof(version_t);
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_FirmwareVersion: {
|
||||
memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t));
|
||||
TxMessage.length = sizeof(version_t);
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ModuleId: {
|
||||
TxMessage.data[0] = MODULE_ID;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ProtocolVersion: {
|
||||
TxMessage.data[0] = MODULE_PROTOCOL_VERSION;
|
||||
case SlaveProperty_KeyCount: {
|
||||
TxMessage.data[0] = MODULE_KEY_COUNT;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_Features: {
|
||||
uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data;
|
||||
moduleFeatures->keyCount = MODULE_KEY_COUNT;
|
||||
moduleFeatures->hasPointer = MODULE_HAS_POINTER;
|
||||
TxMessage.length = sizeof(uhk_module_features_t);
|
||||
case SlaveProperty_PointerCount: {
|
||||
TxMessage.data[0] = MODULE_POINTER_COUNT;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Submodule lib/KSDK_2.0_MK22FN512xxx12 updated: 7142722eed...9fbf2bbf08
Submodule lib/agent updated: 04b43896c5...9beadb4aac
@@ -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>
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
// Macros:
|
||||
|
||||
#define I2C_WATCHDOG
|
||||
#define LED_DRIVERS_ENABLED
|
||||
// #define LED_DRIVER_STRESS_TEST
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,7 +8,6 @@ uint8_t ReadUInt8(config_buffer_t *buffer)
|
||||
uint16_t ReadUInt16(config_buffer_t *buffer)
|
||||
{
|
||||
uint16_t uInt16 = ReadUInt8(buffer);
|
||||
|
||||
uInt16 |= ReadUInt8(buffer) << 8;
|
||||
return uInt16;
|
||||
}
|
||||
@@ -26,14 +25,12 @@ bool ReadBool(config_buffer_t *buffer)
|
||||
uint16_t ReadCompactLength(config_buffer_t *buffer)
|
||||
{
|
||||
uint16_t compactLength = ReadUInt8(buffer);
|
||||
|
||||
return compactLength == 0xFF ? ReadUInt16(buffer) : compactLength;
|
||||
}
|
||||
|
||||
const char *ReadString(config_buffer_t *buffer, uint16_t *len)
|
||||
{
|
||||
const char *string;
|
||||
|
||||
*len = ReadCompactLength(buffer);
|
||||
string = (const char *)(buffer->buffer + buffer->offset);
|
||||
buffer->offset += *len;
|
||||
|
||||
@@ -12,6 +12,11 @@ config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
|
||||
|
||||
bool ParserRunDry;
|
||||
|
||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId)
|
||||
{
|
||||
return ConfigBufferId_HardwareConfig <= configBufferId && configBufferId <= ConfigBufferId_ValidatedUserConfig;
|
||||
}
|
||||
|
||||
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
|
||||
{
|
||||
switch (configBufferId) {
|
||||
@@ -25,3 +30,16 @@ config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId)
|
||||
{
|
||||
switch (configBufferId) {
|
||||
case ConfigBufferId_HardwareConfig:
|
||||
return HARDWARE_CONFIG_SIZE;
|
||||
case ConfigBufferId_StagingUserConfig:
|
||||
case ConfigBufferId_ValidatedUserConfig:
|
||||
return USER_CONFIG_SIZE;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
|
||||
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);
|
||||
uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -4,35 +4,95 @@
|
||||
#include "keymap.h"
|
||||
#include "config_globals.h"
|
||||
#include "macros.h"
|
||||
#include "usb_report_updater.h"
|
||||
#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)
|
||||
{
|
||||
uint8_t id = ReadUInt8(buffer);
|
||||
uint8_t initialPointerSpeed = ReadUInt8(buffer);
|
||||
uint8_t pointerAcceleration = ReadUInt8(buffer);
|
||||
uint8_t maxPointerSpeed = ReadUInt8(buffer);
|
||||
uint8_t pointerMode = ReadUInt8(buffer); // move vs scroll
|
||||
uint8_t deceleratedPointerSpeedMultiplier = ReadUInt8(buffer);
|
||||
uint8_t basePointerSpeedMultiplier = ReadUInt8(buffer);
|
||||
uint8_t acceleratedPointerSpeed = ReadUInt8(buffer);
|
||||
uint16_t angularShift = ReadUInt16(buffer);
|
||||
uint8_t modLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
|
||||
uint8_t fnLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
|
||||
uint8_t mouseLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
|
||||
|
||||
(void)id;
|
||||
(void)initialPointerSpeed;
|
||||
(void)pointerAcceleration;
|
||||
(void)maxPointerSpeed;
|
||||
(void)pointerMode;
|
||||
(void)deceleratedPointerSpeedMultiplier;
|
||||
(void)basePointerSpeedMultiplier;
|
||||
(void)acceleratedPointerSpeed;
|
||||
(void)angularShift;
|
||||
(void)modLayerPointerFunction;
|
||||
(void)fnLayerPointerFunction;
|
||||
(void)mouseLayerPointerFunction;
|
||||
|
||||
return ParserError_Success;
|
||||
}
|
||||
|
||||
parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
{
|
||||
// Miscellaneous properties
|
||||
|
||||
uint16_t len;
|
||||
uint16_t macroCount;
|
||||
uint16_t keymapCount;
|
||||
parser_error_t errorCode;
|
||||
|
||||
uint16_t dataModelVersion = ReadUInt16(buffer);
|
||||
uint16_t dataModelMajorVersion = ReadUInt16(buffer);
|
||||
uint16_t dataModelMinorVersion = ReadUInt16(buffer);
|
||||
uint16_t dataModelPatchVersion = ReadUInt16(buffer);
|
||||
uint16_t userConfigLength = ReadUInt16(buffer);
|
||||
(void)userConfigLength;
|
||||
ReadString(buffer, &len); // Ignore device name
|
||||
uint16_t moduleConfigurationCount = ReadCompactLength(buffer);
|
||||
const char *deviceName = ReadString(buffer, &len);
|
||||
uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
|
||||
|
||||
(void)dataModelVersion;
|
||||
(void)userConfigLength;
|
||||
(void)dataModelMajorVersion;
|
||||
(void)dataModelMinorVersion;
|
||||
(void)dataModelPatchVersion;
|
||||
(void)deviceName;
|
||||
|
||||
// LED brightness
|
||||
|
||||
uint8_t iconsAndLayerTextsBrightness = ReadUInt8(buffer);
|
||||
uint8_t alphanumericSegmentsBrightness = ReadUInt8(buffer);
|
||||
uint8_t keyBacklightBrightness = ReadUInt8(buffer);
|
||||
|
||||
// Mouse kinetic properties
|
||||
|
||||
uint8_t mouseMoveInitialSpeed = ReadUInt8(buffer);
|
||||
uint8_t mouseMoveAcceleration = ReadUInt8(buffer);
|
||||
uint8_t mouseMoveDeceleratedSpeed = ReadUInt8(buffer);
|
||||
uint8_t mouseMoveBaseSpeed = ReadUInt8(buffer);
|
||||
uint8_t mouseMoveAcceleratedSpeed = ReadUInt8(buffer);
|
||||
uint8_t mouseScrollInitialSpeed = ReadUInt8(buffer);
|
||||
uint8_t mouseScrollAcceleration = ReadUInt8(buffer);
|
||||
uint8_t mouseScrollDeceleratedSpeed = ReadUInt8(buffer);
|
||||
uint8_t mouseScrollBaseSpeed = ReadUInt8(buffer);
|
||||
uint8_t mouseScrollAcceleratedSpeed = ReadUInt8(buffer);
|
||||
|
||||
if (mouseMoveInitialSpeed == 0 ||
|
||||
mouseMoveAcceleration == 0 ||
|
||||
mouseMoveDeceleratedSpeed == 0 ||
|
||||
mouseMoveBaseSpeed == 0 ||
|
||||
mouseMoveAcceleratedSpeed == 0 ||
|
||||
mouseScrollInitialSpeed == 0 ||
|
||||
mouseScrollAcceleration == 0 ||
|
||||
mouseScrollDeceleratedSpeed == 0 ||
|
||||
mouseScrollBaseSpeed == 0 ||
|
||||
mouseScrollAcceleratedSpeed == 0)
|
||||
{
|
||||
return ParserError_InvalidMouseKineticProperty;
|
||||
}
|
||||
|
||||
// Module configurations
|
||||
|
||||
uint16_t moduleConfigurationCount = ReadCompactLength(buffer);
|
||||
|
||||
if (moduleConfigurationCount > 255) {
|
||||
return ParserError_InvalidModuleConfigurationCount;
|
||||
@@ -45,6 +105,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
}
|
||||
}
|
||||
|
||||
// Macros
|
||||
|
||||
macroCount = ReadCompactLength(buffer);
|
||||
if (macroCount > MAX_MACRO_NUM) {
|
||||
return ParserError_InvalidMacroCount;
|
||||
@@ -57,6 +119,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
}
|
||||
}
|
||||
|
||||
// Keymaps
|
||||
|
||||
keymapCount = ReadCompactLength(buffer);
|
||||
if (keymapCount == 0 || keymapCount > MAX_KEYMAP_NUM) {
|
||||
return ParserError_InvalidKeymapCount;
|
||||
@@ -69,7 +133,36 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
}
|
||||
}
|
||||
|
||||
// If parsing succeeded then apply the parsed values.
|
||||
|
||||
if (!ParserRunDry) {
|
||||
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
||||
|
||||
// Update LED brightnesses and reinitialize LED drivers
|
||||
|
||||
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
|
||||
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
||||
KeyBacklightBrightness = keyBacklightBrightness;
|
||||
#ifdef LED_DRIVERS_ENABLED
|
||||
Slaves[SlaveId_LeftLedDriver].isConnected = false;
|
||||
Slaves[SlaveId_RightLedDriver].isConnected = false;
|
||||
#endif
|
||||
// Update mouse key speeds
|
||||
|
||||
MouseMoveState.initialSpeed = mouseMoveInitialSpeed;
|
||||
MouseMoveState.acceleration = mouseMoveAcceleration;
|
||||
MouseMoveState.deceleratedSpeed = mouseMoveDeceleratedSpeed;
|
||||
MouseMoveState.baseSpeed = mouseMoveBaseSpeed;
|
||||
MouseMoveState.acceleratedSpeed = mouseMoveAcceleratedSpeed;
|
||||
|
||||
MouseScrollState.initialSpeed = mouseScrollInitialSpeed;
|
||||
MouseScrollState.acceleration = mouseScrollAcceleration;
|
||||
MouseScrollState.deceleratedSpeed = mouseScrollDeceleratedSpeed;
|
||||
MouseScrollState.baseSpeed = mouseScrollBaseSpeed;
|
||||
MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed;
|
||||
|
||||
// Update counts
|
||||
|
||||
AllKeymapsCount = keymapCount;
|
||||
AllMacrosCount = macroCount;
|
||||
}
|
||||
|
||||
@@ -8,20 +8,21 @@
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
ParserError_Success,
|
||||
ParserError_InvalidSerializedKeystrokeType,
|
||||
ParserError_InvalidSerializedMouseAction,
|
||||
ParserError_InvalidSerializedKeyActionType,
|
||||
ParserError_InvalidLayerCount,
|
||||
ParserError_InvalidModuleCount,
|
||||
ParserError_InvalidActionCount,
|
||||
ParserError_InvalidSerializedMacroActionType,
|
||||
ParserError_InvalidSerializedSwitchKeymapAction,
|
||||
ParserError_InvalidModuleConfigurationCount,
|
||||
ParserError_InvalidKeymapCount,
|
||||
ParserError_InvalidAbbreviationLen,
|
||||
ParserError_InvalidMacroCount,
|
||||
ParserError_InvalidSerializedPlayMacroAction,
|
||||
ParserError_Success = 0,
|
||||
ParserError_InvalidSerializedKeystrokeType = 1,
|
||||
ParserError_InvalidSerializedMouseAction = 2,
|
||||
ParserError_InvalidSerializedKeyActionType = 3,
|
||||
ParserError_InvalidLayerCount = 4,
|
||||
ParserError_InvalidModuleCount = 5,
|
||||
ParserError_InvalidActionCount = 6,
|
||||
ParserError_InvalidSerializedMacroActionType = 7,
|
||||
ParserError_InvalidSerializedSwitchKeymapAction = 8,
|
||||
ParserError_InvalidModuleConfigurationCount = 9,
|
||||
ParserError_InvalidKeymapCount = 10,
|
||||
ParserError_InvalidAbbreviationLen = 11,
|
||||
ParserError_InvalidMacroCount = 12,
|
||||
ParserError_InvalidSerializedPlayMacroAction = 13,
|
||||
ParserError_InvalidMouseKineticProperty = 14,
|
||||
} parser_error_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
@@ -48,11 +48,11 @@ static parser_error_t parseKeyStrokeAction(key_action_t *keyAction, uint8_t keyS
|
||||
static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer)
|
||||
{
|
||||
uint8_t layer = ReadUInt8(buffer) + 1;
|
||||
bool isToggle = ReadBool(buffer);
|
||||
uint8_t mode = ReadBool(buffer) ? SwitchLayerMode_Toggle : SwitchLayerMode_HoldAndDoubleTapToggle;
|
||||
|
||||
KeyAction->type = KeyActionType_SwitchLayer;
|
||||
KeyAction->switchLayer.layer = layer;
|
||||
KeyAction->switchLayer.isToggle = isToggle;
|
||||
KeyAction->switchLayer.mode = mode;
|
||||
return ParserError_Success;
|
||||
}
|
||||
|
||||
@@ -82,53 +82,16 @@ static parser_error_t parsePlayMacroAction(key_action_t *keyAction, config_buffe
|
||||
|
||||
static parser_error_t parseMouseAction(key_action_t *keyAction, config_buffer_t *buffer)
|
||||
{
|
||||
uint8_t mouseAction = ReadUInt8(buffer);
|
||||
|
||||
keyAction->type = KeyActionType_Mouse;
|
||||
memset(&keyAction->mouse, 0, sizeof keyAction->mouse);
|
||||
switch (mouseAction) {
|
||||
case SerializedMouseAction_LeftClick:
|
||||
keyAction->mouse.buttonActions = MouseButton_Left;
|
||||
break;
|
||||
case SerializedMouseAction_MiddleClick:
|
||||
keyAction->mouse.buttonActions = MouseButton_Middle;
|
||||
break;
|
||||
case SerializedMouseAction_RightClick:
|
||||
keyAction->mouse.buttonActions = MouseButton_Right;
|
||||
break;
|
||||
case SerializedMouseAction_MoveUp:
|
||||
keyAction->mouse.moveActions = MouseMove_Up;
|
||||
break;
|
||||
case SerializedMouseAction_MoveDown:
|
||||
keyAction->mouse.moveActions = MouseMove_Down;
|
||||
break;
|
||||
case SerializedMouseAction_MoveLeft:
|
||||
keyAction->mouse.moveActions = MouseMove_Left;
|
||||
break;
|
||||
case SerializedMouseAction_MoveRight:
|
||||
keyAction->mouse.moveActions = MouseMove_Right;
|
||||
break;
|
||||
case SerializedMouseAction_ScrollUp:
|
||||
keyAction->mouse.scrollActions = MouseScroll_Up;
|
||||
break;
|
||||
case SerializedMouseAction_ScrollDown:
|
||||
keyAction->mouse.scrollActions = MouseScroll_Down;
|
||||
break;
|
||||
case SerializedMouseAction_ScrollLeft:
|
||||
keyAction->mouse.scrollActions = MouseScroll_Left;
|
||||
break;
|
||||
case SerializedMouseAction_ScrollRight:
|
||||
keyAction->mouse.scrollActions = MouseScroll_Right;
|
||||
break;
|
||||
case SerializedMouseAction_Accelerate:
|
||||
keyAction->mouse.moveActions = MouseMove_Accelerate;
|
||||
break;
|
||||
case SerializedMouseAction_Decelerate:
|
||||
keyAction->mouse.moveActions = MouseMove_Decelerate;
|
||||
break;
|
||||
default:
|
||||
return ParserError_InvalidSerializedMouseAction;
|
||||
|
||||
uint8_t mouseAction = ReadUInt8(buffer);
|
||||
if (mouseAction > SerializedMouseAction_Last) {
|
||||
return ParserError_InvalidSerializedMouseAction;
|
||||
}
|
||||
|
||||
memset(&keyAction->mouseAction, 0, sizeof keyAction->mouseAction);
|
||||
keyAction->mouseAction = mouseAction;
|
||||
|
||||
return ParserError_Success;
|
||||
}
|
||||
|
||||
@@ -153,7 +116,7 @@ static parser_error_t parseKeyAction(key_action_t *keyAction, config_buffer_t *b
|
||||
return ParserError_InvalidSerializedKeyActionType;
|
||||
}
|
||||
|
||||
static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buffer, uint8_t moduleId, uint8_t pointerRole)
|
||||
static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buffer, uint8_t moduleId)
|
||||
{
|
||||
parser_error_t errorCode;
|
||||
uint16_t actionCount = ReadCompactLength(buffer);
|
||||
@@ -174,9 +137,7 @@ static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buff
|
||||
static parser_error_t parseModule(config_buffer_t *buffer, uint8_t layer)
|
||||
{
|
||||
uint8_t moduleId = ReadUInt8(buffer);
|
||||
uint8_t pointerRole = ReadUInt8(buffer);
|
||||
|
||||
return parseKeyActions(layer, buffer, moduleId, pointerRole);
|
||||
return parseKeyActions(layer, buffer, moduleId);
|
||||
}
|
||||
|
||||
static parser_error_t parseLayer(config_buffer_t *buffer, uint8_t layer)
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
SerializedMouseAction_ScrollRight,
|
||||
SerializedMouseAction_Accelerate,
|
||||
SerializedMouseAction_Decelerate,
|
||||
SerializedMouseAction_Last = SerializedMouseAction_Decelerate,
|
||||
SerializedMouseAction_Button_4,
|
||||
SerializedMouseAction_Button_5,
|
||||
SerializedMouseAction_Button_6,
|
||||
} serialized_mouse_action_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
@@ -10,7 +10,7 @@ bool IsEepromBusy;
|
||||
static eeprom_operation_t CurrentEepromOperation;
|
||||
static config_buffer_id_t CurrentConfigBufferId;
|
||||
status_t LastEepromTransferStatus;
|
||||
void (*SuccessCallback)();
|
||||
void (*SuccessCallback)(void);
|
||||
|
||||
static i2c_master_handle_t i2cHandle;
|
||||
static i2c_master_transfer_t i2cTransfer;
|
||||
@@ -21,7 +21,6 @@ static uint16_t eepromStartAddress;
|
||||
static uint16_t sourceLength;
|
||||
static uint8_t writeLength;
|
||||
static bool isReadSent;
|
||||
static uint8_t addressBuffer[EEPROM_ADDRESS_LENGTH];
|
||||
|
||||
static status_t i2cAsyncWrite(uint8_t *data, size_t dataSize)
|
||||
{
|
||||
@@ -44,11 +43,10 @@ static status_t i2cAsyncRead(uint8_t *data, size_t dataSize)
|
||||
static status_t writePage(void)
|
||||
{
|
||||
static uint8_t buffer[EEPROM_BUFFER_SIZE];
|
||||
uint16_t targetEepromOffset = sourceOffset + eepromStartAddress;
|
||||
SetBufferUint16Be(buffer, 0, targetEepromOffset);
|
||||
SetBufferUint16Be(buffer, 0, eepromStartAddress + sourceOffset);
|
||||
writeLength = MIN(sourceLength - sourceOffset, EEPROM_PAGE_SIZE);
|
||||
memcpy(buffer+EEPROM_ADDRESS_LENGTH, sourceBuffer+sourceOffset, writeLength);
|
||||
status_t status = i2cAsyncWrite(buffer, writeLength+EEPROM_ADDRESS_LENGTH);
|
||||
memcpy(buffer+EEPROM_ADDRESS_SIZE, sourceBuffer+sourceOffset, writeLength);
|
||||
status_t status = i2cAsyncWrite(buffer, writeLength+EEPROM_ADDRESS_SIZE);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -104,16 +102,17 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
|
||||
|
||||
CurrentEepromOperation = operation;
|
||||
CurrentConfigBufferId = config_buffer_id;
|
||||
|
||||
SuccessCallback = successCallback;
|
||||
|
||||
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
|
||||
eepromStartAddress = isHardwareConfig ? 0 : HARDWARE_CONFIG_SIZE;
|
||||
SetBufferUint16Be(addressBuffer, 0, eepromStartAddress);
|
||||
|
||||
switch (CurrentEepromOperation) {
|
||||
case EepromOperation_Read:
|
||||
isReadSent = false;
|
||||
LastEepromTransferStatus = i2cAsyncWrite(addressBuffer, EEPROM_ADDRESS_LENGTH);
|
||||
static uint8_t addressBuffer[EEPROM_ADDRESS_SIZE];
|
||||
SetBufferUint16Be(addressBuffer, 0, eepromStartAddress);
|
||||
LastEepromTransferStatus = i2cAsyncWrite(addressBuffer, EEPROM_ADDRESS_SIZE);
|
||||
break;
|
||||
case EepromOperation_Write:
|
||||
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;
|
||||
@@ -126,3 +125,8 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
|
||||
IsEepromBusy = LastEepromTransferStatus == kStatus_Success;
|
||||
return LastEepromTransferStatus;
|
||||
}
|
||||
|
||||
bool IsEepromOperationValid(eeprom_operation_t operation)
|
||||
{
|
||||
return operation == EepromOperation_Read || operation == EepromOperation_Write;
|
||||
}
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
#define HARDWARE_CONFIG_SIZE 64
|
||||
#define USER_CONFIG_SIZE (EEPROM_SIZE - HARDWARE_CONFIG_SIZE)
|
||||
|
||||
#define EEPROM_ADDRESS_LENGTH 2
|
||||
#define EEPROM_ADDRESS_SIZE 2
|
||||
#define EEPROM_PAGE_SIZE 64
|
||||
#define EEPROM_BUFFER_SIZE (EEPROM_ADDRESS_LENGTH + EEPROM_PAGE_SIZE)
|
||||
#define EEPROM_BUFFER_SIZE (EEPROM_ADDRESS_SIZE + EEPROM_PAGE_SIZE)
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -31,5 +31,6 @@
|
||||
|
||||
void EEPROM_Init(void);
|
||||
status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback));
|
||||
bool IsEepromOperationValid(eeprom_operation_t operation);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,10 +10,12 @@
|
||||
|
||||
// Main bus
|
||||
|
||||
#define I2C_MAIN_BUS_BASEADDR I2C0
|
||||
#define I2C_MASTER_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
|
||||
@@ -28,8 +30,9 @@
|
||||
// EEPROM bus
|
||||
|
||||
#define I2C_EEPROM_BUS_BASEADDR I2C1
|
||||
#define I2C_EEPROM_BUS_IRQ_ID I2C1_IRQn
|
||||
#define I2C_EEPROM_BUS_CLK_SRC I2C1_CLK_SRC
|
||||
#define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM.
|
||||
#define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM.
|
||||
#define I2C_EEPROM_BUS_MUX kPORT_MuxAlt2
|
||||
|
||||
#define I2C_EEPROM_BUS_SDA_PORT PORTC
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,20 +8,36 @@
|
||||
#include "peripherals/led_driver.h"
|
||||
#include "peripherals/merge_sensor.h"
|
||||
#include "led_pwm.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "peripherals/adc.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "eeprom.h"
|
||||
#include "microseconds/microseconds_pit.c"
|
||||
#include "timer.h"
|
||||
#include "key_debouncer.h"
|
||||
#include "usb_api.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
|
||||
void InitInterruptPriorities(void)
|
||||
bool IsBusPalOn;
|
||||
uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
|
||||
uint32_t I2cMainBusActualBaudRateBps;
|
||||
|
||||
void initBusPalState(void) {
|
||||
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
|
||||
if (IsBusPalOn) {
|
||||
Wormhole.magicNumber = 0;
|
||||
I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_BUSPAL_BAUD_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
void initInterruptPriorities(void)
|
||||
{
|
||||
NVIC_SetPriority(I2C0_IRQn, 1);
|
||||
NVIC_SetPriority(I2C1_IRQn, 1);
|
||||
NVIC_SetPriority(USB0_IRQn, 1);
|
||||
NVIC_SetPriority(PIT1_IRQn, 6);
|
||||
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
|
||||
NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 3);
|
||||
NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 3);
|
||||
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 3);
|
||||
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 3);
|
||||
NVIC_SetPriority(USB_IRQ_ID, 3);
|
||||
}
|
||||
|
||||
void delay(void)
|
||||
@@ -58,7 +74,7 @@ void recoverI2c(void)
|
||||
delay();
|
||||
}
|
||||
|
||||
void InitI2cMainBus(void)
|
||||
void initI2cMainBus(void)
|
||||
{
|
||||
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK);
|
||||
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK);
|
||||
@@ -76,9 +92,17 @@ void InitI2cMainBus(void)
|
||||
|
||||
i2c_master_config_t masterConfig;
|
||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
||||
masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE;
|
||||
uint32_t sourceClock = CLOCK_GetFreq(I2C_MASTER_BUS_CLK_SRC);
|
||||
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 ReinitI2cMainBus(void)
|
||||
{
|
||||
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
|
||||
initI2cMainBus();
|
||||
InitSlaveScheduler();
|
||||
}
|
||||
|
||||
void initI2cEepromBus(void)
|
||||
@@ -89,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);
|
||||
|
||||
@@ -103,21 +126,22 @@ void initI2cEepromBus(void)
|
||||
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
|
||||
}
|
||||
|
||||
void InitI2c(void)
|
||||
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
|
||||
@@ -125,5 +149,4 @@ void InitPeripherals(void)
|
||||
#endif
|
||||
InitKeyDebouncer();
|
||||
EEPROM_Init();
|
||||
//microseconds_init();
|
||||
}
|
||||
|
||||
@@ -5,9 +5,15 @@
|
||||
|
||||
#include "fsl_common.h"
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsBusPalOn;
|
||||
extern uint32_t I2cMainBusRequestedBaudRateBps;
|
||||
extern uint32_t I2cMainBusActualBaudRateBps;
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitPeripherals(void);
|
||||
void InitI2cMainBus(void);
|
||||
void ReinitI2cMainBus(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef __ACTION_H__
|
||||
#define __ACTION_H__
|
||||
#ifndef __KEY_ACTION_H__
|
||||
#define __KEY_ACTION_H__
|
||||
|
||||
// Includes:
|
||||
|
||||
@@ -7,16 +7,8 @@
|
||||
#include "attributes.h"
|
||||
#include "lufa/HIDClassCommon.h"
|
||||
#include "usb_composite_device.h"
|
||||
#include "main.h"
|
||||
#include "module.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define MOUSE_WHEEL_SPEED 1
|
||||
#define MOUSE_WHEEL_DIVISOR 4
|
||||
|
||||
#define MOUSE_MAX_SPEED 10
|
||||
#define MOUSE_SPEED_ACCEL_DIVISOR 50
|
||||
#include "config_parser/parse_keymap.h"
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -36,32 +28,21 @@
|
||||
KeystrokeType_System,
|
||||
} keystroke_type_t;
|
||||
|
||||
typedef enum {
|
||||
SwitchLayerMode_Hold,
|
||||
SwitchLayerMode_HoldAndDoubleTapToggle,
|
||||
SwitchLayerMode_Toggle,
|
||||
} switch_layer_mode_t;
|
||||
|
||||
typedef enum {
|
||||
MouseButton_Left = 1 << 0,
|
||||
MouseButton_Right = 1 << 1,
|
||||
MouseButton_Middle = 1 << 2,
|
||||
MouseButton_4 = 1 << 3,
|
||||
MouseButton_5 = 1 << 4,
|
||||
MouseButton_t = 1 << 5,
|
||||
MouseButton_6 = 1 << 5,
|
||||
} mouse_button_t;
|
||||
|
||||
typedef enum {
|
||||
MouseMove_Up = 1 << 0,
|
||||
MouseMove_Down = 1 << 1,
|
||||
MouseMove_Left = 1 << 2,
|
||||
MouseMove_Right = 1 << 3,
|
||||
|
||||
MouseMove_Accelerate = 1 << 4,
|
||||
MouseMove_Decelerate = 1 << 5,
|
||||
} mouse_move_action_t;
|
||||
|
||||
typedef enum {
|
||||
MouseScroll_Up = 1 << 0,
|
||||
MouseScroll_Down = 1 << 1,
|
||||
MouseScroll_Left = 1 << 2,
|
||||
MouseScroll_Right = 1 << 3,
|
||||
} mouse_scroll_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t type;
|
||||
union {
|
||||
@@ -71,13 +52,9 @@
|
||||
uint8_t modifiers;
|
||||
uint16_t scancode;
|
||||
} ATTR_PACKED keystroke;
|
||||
serialized_mouse_action_t mouseAction;
|
||||
struct {
|
||||
mouse_button_t buttonActions;
|
||||
mouse_scroll_t scrollActions;
|
||||
mouse_move_action_t moveActions;
|
||||
} ATTR_PACKED mouse;
|
||||
struct {
|
||||
bool isToggle;
|
||||
switch_layer_mode_t mode;
|
||||
uint8_t layer;
|
||||
} ATTR_PACKED switchLayer;
|
||||
struct {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
// Macros:
|
||||
|
||||
#define KEY_DEBOUNCER_INTERVAL_MSEC 1
|
||||
#define KEY_DEBOUNCER_TIMEOUT_MSEC 10
|
||||
#define KEY_DEBOUNCER_TIMEOUT_MSEC 15
|
||||
|
||||
// Functions:
|
||||
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
#include "fsl_pit.h"
|
||||
#include "key_scanner.h"
|
||||
|
||||
uint32_t KeyScannerCounter;
|
||||
|
||||
void PIT_KEY_SCANNER_HANDLER(void)
|
||||
{
|
||||
KeyMatrix_ScanRow(&RightKeyMatrix);
|
||||
KeyScannerCounter++;
|
||||
PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
|
||||
#define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM)
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint32_t KeyScannerCounter;
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitKeyScanner(void);
|
||||
|
||||
@@ -332,23 +332,23 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
||||
{ .type = KeyActionType_None },
|
||||
|
||||
// Row 2
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_4 }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Up }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_5 }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_t }},
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_4 },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveUp },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_5 },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_6 },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .scrollActions = MouseScroll_Up }},
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_ScrollUp },
|
||||
|
||||
// Row 3
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Left }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Down }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Right }},
|
||||
{ .type = KeyActionType_Mouse, .mouseAction= SerializedMouseAction_MoveLeft },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveDown },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveRight },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .scrollActions = MouseScroll_Down }},
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_ScrollDown },
|
||||
|
||||
// Row 4
|
||||
{ .type = KeyActionType_None },
|
||||
@@ -391,9 +391,9 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
||||
// Row 3
|
||||
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Right }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Middle }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Left }},
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_RightClick },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MiddleClick },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_LeftClick },
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_None },
|
||||
|
||||
@@ -411,8 +411,8 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
|
||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
|
||||
{ .type = KeyActionType_None },
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Decelerate }},
|
||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Accelerate }},
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Decelerate },
|
||||
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Accelerate },
|
||||
{ .type = KeyActionType_None },
|
||||
}
|
||||
},
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "keymap.h"
|
||||
|
||||
static bool heldLayers[LAYER_COUNT];
|
||||
static bool pressedLayers[LAYER_COUNT];
|
||||
static switch_layer_mode_t pressedLayers[LAYER_COUNT];
|
||||
|
||||
void updateLayerStates(void)
|
||||
{
|
||||
@@ -18,10 +18,11 @@ void updateLayerStates(void)
|
||||
if (keyState->current) {
|
||||
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
|
||||
if (action.type == KeyActionType_SwitchLayer) {
|
||||
if (!action.switchLayer.isToggle) {
|
||||
if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
|
||||
heldLayers[action.switchLayer.layer] = true;
|
||||
} else if (!keyState->previous && keyState->current) {
|
||||
pressedLayers[action.switchLayer.layer] = true;
|
||||
}
|
||||
if (action.switchLayer.mode != SwitchLayerMode_Hold && !keyState->previous && keyState->current) {
|
||||
pressedLayers[action.switchLayer.layer] = action.switchLayer.mode;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,6 +31,7 @@ void updateLayerStates(void)
|
||||
}
|
||||
|
||||
layer_id_t PreviousHeldLayer = LayerId_Base;
|
||||
layer_id_t ToggledLayer = LayerId_Base;
|
||||
|
||||
layer_id_t GetActiveLayer()
|
||||
{
|
||||
@@ -37,22 +39,20 @@ layer_id_t GetActiveLayer()
|
||||
|
||||
// Handle toggled layers
|
||||
|
||||
static layer_id_t toggledLayer = LayerId_Base;
|
||||
|
||||
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
|
||||
if (pressedLayers[layerId]) {
|
||||
if (toggledLayer == layerId) {
|
||||
toggledLayer = LayerId_Base;
|
||||
if (ToggledLayer == layerId) {
|
||||
ToggledLayer = LayerId_Base;
|
||||
break;
|
||||
} else if (toggledLayer == LayerId_Base) {
|
||||
toggledLayer = layerId;
|
||||
} else if (ToggledLayer == LayerId_Base && pressedLayers[layerId] == SwitchLayerMode_Toggle) {
|
||||
ToggledLayer = layerId;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (toggledLayer != LayerId_Base) {
|
||||
return toggledLayer;
|
||||
if (ToggledLayer != LayerId_Base) {
|
||||
return ToggledLayer;
|
||||
}
|
||||
|
||||
// Handle held layers
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
// Variables:
|
||||
|
||||
extern layer_id_t PreviousHeldLayer;
|
||||
extern layer_id_t ToggledLayer;
|
||||
|
||||
// Functions:
|
||||
|
||||
layer_id_t GetActiveLayer();
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
#include "layer.h"
|
||||
#include "keymap.h"
|
||||
|
||||
uint8_t IconsAndLayerTextsBrightness = 0xff;
|
||||
uint8_t AlphanumericSegmentsBrightness = 0xff;
|
||||
|
||||
static const uint16_t capitalLetterToSegmentSet[] = {
|
||||
0b0000000011110111,
|
||||
0b0001001010001111,
|
||||
@@ -69,13 +72,13 @@ void LedDisplay_SetText(uint8_t length, const char* text)
|
||||
allSegmentSets |= characterToSegmentSet(text[0]);
|
||||
}
|
||||
|
||||
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0;
|
||||
LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? AlphanumericSegmentsBrightness : 0;
|
||||
allSegmentSets >>= 2;
|
||||
|
||||
for (uint8_t i = 24; i <= 136; i += 16) {
|
||||
for (uint8_t j = 0; j < 5; j++) {
|
||||
LedDriverValues[LedDriverId_Left][i + j] = allSegmentSets & 1 << j ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][i + j] = allSegmentSets & 1 << j ? AlphanumericSegmentsBrightness : 0;
|
||||
}
|
||||
allSegmentSets >>= 5;
|
||||
}
|
||||
@@ -94,11 +97,11 @@ void LedDisplay_SetLayer(uint8_t layerId)
|
||||
}
|
||||
|
||||
if (layerId >= LayerId_Mod && layerId <= LayerId_Mouse) {
|
||||
LedDriverValues[LedDriverId_Left][16 * layerId - 3] = LED_BRIGHTNESS_LEVEL;
|
||||
LedDriverValues[LedDriverId_Left][16 * layerId - 3] = IconsAndLayerTextsBrightness;
|
||||
}
|
||||
}
|
||||
|
||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
||||
{
|
||||
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
LedDisplayIcon_Adaptive,
|
||||
} led_display_icon_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint8_t IconsAndLayerTextsBrightness;
|
||||
extern uint8_t AlphanumericSegmentsBrightness;
|
||||
|
||||
// Functions:
|
||||
|
||||
void LedDisplay_SetText(uint8_t length, const char* text);
|
||||
|
||||
@@ -1,79 +1,15 @@
|
||||
#include "config.h"
|
||||
#include "main.h"
|
||||
#include "init_clock.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "usb_composite_device.h"
|
||||
#include "peripherals/led_driver.h"
|
||||
#include "key_action.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "peripherals/test_led.h"
|
||||
#include "usb_interfaces/usb_interface_basic_keyboard.h"
|
||||
#include "usb_interfaces/usb_interface_media_keyboard.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "bus_pal_hardware.h"
|
||||
#include "command.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
#include "eeprom.h"
|
||||
#include "right_key_matrix.h"
|
||||
#include "key_scanner.h"
|
||||
#include "key_states.h"
|
||||
#include "usb_commands/usb_command_apply_config.h"
|
||||
#include "peripherals/reset_button.h"
|
||||
|
||||
bool UsbBasicKeyboardReportEverSent = false;
|
||||
bool UsbMediaKeyboardReportEverSent = false;
|
||||
bool UsbSystemKeyboardReportEverSent = false;
|
||||
bool UsbMouseReportEverSentEverSent = false;
|
||||
|
||||
void updateUsbReports(void)
|
||||
{
|
||||
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) {
|
||||
return;
|
||||
}
|
||||
|
||||
ResetActiveUsbBasicKeyboardReport();
|
||||
ResetActiveUsbMediaKeyboardReport();
|
||||
ResetActiveUsbSystemKeyboardReport();
|
||||
ResetActiveUsbMouseReport();
|
||||
|
||||
UpdateActiveUsbReports();
|
||||
|
||||
SwitchActiveUsbBasicKeyboardReport();
|
||||
SwitchActiveUsbMediaKeyboardReport();
|
||||
SwitchActiveUsbSystemKeyboardReport();
|
||||
SwitchActiveUsbMouseReport();
|
||||
|
||||
IsUsbBasicKeyboardReportSent = false;
|
||||
IsUsbMediaKeyboardReportSent = false;
|
||||
IsUsbSystemKeyboardReportSent = false;
|
||||
IsUsbMouseReportSent = false;
|
||||
}
|
||||
#include "usb_report_updater.h"
|
||||
|
||||
bool IsEepromInitialized = false;
|
||||
bool IsConfigInitialized = false;
|
||||
@@ -97,15 +33,14 @@ 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 {
|
||||
InitSlaveScheduler();
|
||||
KeyMatrix_Init(&RightKeyMatrix);
|
||||
InitKeyScanner();
|
||||
updateUsbReports();
|
||||
UpdateUsbReports();
|
||||
InitUsb();
|
||||
|
||||
while (1) {
|
||||
@@ -113,7 +48,7 @@ void main(void)
|
||||
UsbCommand_ApplyConfig();
|
||||
IsConfigInitialized = true;
|
||||
}
|
||||
updateUsbReports();
|
||||
UpdateUsbReports();
|
||||
__WFI();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#ifndef __MAIN_H__
|
||||
#define __MAIN_H__
|
||||
|
||||
// Includes:
|
||||
|
||||
#include "key_matrix.h"
|
||||
#include "slot.h"
|
||||
#include "module.h"
|
||||
|
||||
#endif
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "slave_scheduler.h"
|
||||
#include "led_display.h"
|
||||
|
||||
uint8_t KeyBacklightBrightness = 0xff;
|
||||
uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
|
||||
|
||||
static led_driver_state_t ledDriverStates[LED_DRIVER_MAX_COUNT] = {
|
||||
@@ -70,8 +71,14 @@ void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
led_driver_state_t *currentLedDriverState = ledDriverStates + ledDriverId;
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrame;
|
||||
currentLedDriverState->ledIndex = 0;
|
||||
memset(LedDriverValues[ledDriverId], LED_BRIGHTNESS_LEVEL, LED_DRIVER_LED_COUNT);
|
||||
LedDisplay_SetCurrentKeymapText();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#define LED_CONTROL_REGISTERS_COMMAND_LENGTH 19
|
||||
#define PMW_REGISTER_UPDATE_CHUNK_SIZE 8
|
||||
#define PWM_REGISTER_BUFFER_LENGTH (1 + PMW_REGISTER_UPDATE_CHUNK_SIZE)
|
||||
#define LED_BRIGHTNESS_LEVEL 0xff
|
||||
|
||||
#define IS_ISO true
|
||||
#define ISO_KEY_LED_DRIVER_ID LedDriverId_Left
|
||||
@@ -45,6 +44,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint8_t KeyBacklightBrightness;
|
||||
extern uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
|
||||
|
||||
// Functions:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include "slave_scheduler.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
#include "slave_protocol.h"
|
||||
#include "main.h"
|
||||
#include "peripherals/test_led.h"
|
||||
#include "bool_array_converter.h"
|
||||
#include "crc16.h"
|
||||
@@ -70,6 +69,13 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
|
||||
switch (*uhkModulePhase) {
|
||||
|
||||
// Jump to bootloader
|
||||
case UhkModulePhase_JumpToBootloader:
|
||||
txMessage.data[0] = SlaveCommand_JumpToBootloader;
|
||||
txMessage.length = 1;
|
||||
status = tx(i2cAddress);
|
||||
break;
|
||||
|
||||
// Sync communication
|
||||
case UhkModulePhase_RequestSync:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
@@ -85,32 +91,54 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
case UhkModulePhase_ProcessSync: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
bool isSyncValid = memcmp(rxMessage->data, SlaveSyncString, SLAVE_SYNC_STRING_LENGTH) == 0;
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isSyncValid && isMessageValid
|
||||
? UhkModulePhase_RequestProtocolVersion
|
||||
? UhkModulePhase_RequestModuleProtocolVersion
|
||||
: UhkModulePhase_RequestSync;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get protocol version
|
||||
case UhkModulePhase_RequestProtocolVersion:
|
||||
// Get module protocol version
|
||||
case UhkModulePhase_RequestModuleProtocolVersion:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_ProtocolVersion;
|
||||
txMessage.data[1] = SlaveProperty_ModuleProtocolVersion;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveProtocolVersion;
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleProtocolVersion;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveProtocolVersion:
|
||||
case UhkModulePhase_ReceiveModuleProtocolVersion:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessProtocolVersion;
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleProtocolVersion;
|
||||
break;
|
||||
case UhkModulePhase_ProcessProtocolVersion: {
|
||||
case UhkModulePhase_ProcessModuleProtocolVersion: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->protocolVersion = rxMessage->data[0];
|
||||
memcpy(&uhkModuleState->moduleProtocolVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestProtocolVersion;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestFirmwareVersion : UhkModulePhase_RequestModuleProtocolVersion;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get firmware version
|
||||
case UhkModulePhase_RequestFirmwareVersion:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_FirmwareVersion;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveFirmwareVersion;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveFirmwareVersion:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessFirmwareVersion;
|
||||
break;
|
||||
case UhkModulePhase_ProcessFirmwareVersion: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->firmwareVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestFirmwareVersion;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -131,30 +159,52 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->moduleId = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleFeatures : UhkModulePhase_RequestModuleId;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleKeyCount : UhkModulePhase_RequestModuleId;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get module features
|
||||
case UhkModulePhase_RequestModuleFeatures:
|
||||
// Get module key count
|
||||
case UhkModulePhase_RequestModuleKeyCount:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_Features;
|
||||
txMessage.data[1] = SlaveProperty_KeyCount;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleFeatures;
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleKeyCount;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveModuleFeatures:
|
||||
case UhkModulePhase_ReceiveModuleKeyCount:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleFeatures;
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleKeyCount;
|
||||
break;
|
||||
case UhkModulePhase_ProcessModuleFeatures: {
|
||||
case UhkModulePhase_ProcessModuleKeyCount: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t));
|
||||
uhkModuleState->keyCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModuleFeatures;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModulePointerCount : UhkModulePhase_RequestModuleKeyCount;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get module pointer count
|
||||
case UhkModulePhase_RequestModulePointerCount:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_PointerCount;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModulePointerCount;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveModulePointerCount:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModulePointerCount;
|
||||
break;
|
||||
case UhkModulePhase_ProcessModulePointerCount: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->pointerCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModulePointerCount;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -172,32 +222,19 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
case UhkModulePhase_ProcessKeystates:
|
||||
if (CRC16_IsMessageValid(rxMessage)) {
|
||||
uint8_t slotId = uhkModuleDriverId + 1;
|
||||
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->features.keyCount);
|
||||
for (uint8_t keyId=0; keyId<uhkModuleState->features.keyCount; keyId++) {
|
||||
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->keyCount);
|
||||
for (uint8_t keyId=0; keyId<uhkModuleState->keyCount; keyId++) {
|
||||
KeyStates[slotId][keyId].current = keyStatesBuffer[keyId];
|
||||
}
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = UhkModulePhase_JumpToBootloader;
|
||||
break;
|
||||
|
||||
// Jump to bootloader
|
||||
case UhkModulePhase_JumpToBootloader:
|
||||
if (uhkModuleState->jumpToBootloader) {
|
||||
txMessage.data[0] = SlaveCommand_JumpToBootloader;
|
||||
txMessage.length = 1;
|
||||
status = tx(i2cAddress);
|
||||
uhkModuleState->jumpToBootloader = false;
|
||||
} else {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
}
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
*uhkModulePhase = UhkModulePhase_SetTestLed;
|
||||
break;
|
||||
|
||||
// Set test LED
|
||||
case UhkModulePhase_SetTestLed:
|
||||
if (uhkModuleSourceVars->isTestLedOn == uhkModuleTargetVars->isTestLedOn) {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
status = kStatus_Uhk_IdleCycle;
|
||||
} else {
|
||||
txMessage.data[0] = SlaveCommand_SetTestLed;
|
||||
txMessage.data[1] = uhkModuleSourceVars->isTestLedOn;
|
||||
@@ -211,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;
|
||||
@@ -228,8 +265,10 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
|
||||
void UhkModuleSlaveDriver_Disconnect(uint8_t uhkModuleDriverId)
|
||||
{
|
||||
#ifdef LED_DRIVERS_ENABLED
|
||||
if (uhkModuleDriverId == SlaveId_LeftKeyboardHalf) {
|
||||
Slaves[SlaveId_LeftLedDriver].isConnected = false;
|
||||
}
|
||||
UhkModuleStates[uhkModuleDriverId].moduleId = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "crc16.h"
|
||||
#include "versions.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
@@ -29,19 +30,29 @@
|
||||
UhkModulePhase_ProcessSync,
|
||||
|
||||
// Get protocol version
|
||||
UhkModulePhase_RequestProtocolVersion,
|
||||
UhkModulePhase_ReceiveProtocolVersion,
|
||||
UhkModulePhase_ProcessProtocolVersion,
|
||||
UhkModulePhase_RequestModuleProtocolVersion,
|
||||
UhkModulePhase_ReceiveModuleProtocolVersion,
|
||||
UhkModulePhase_ProcessModuleProtocolVersion,
|
||||
|
||||
// Get firmware version
|
||||
UhkModulePhase_RequestFirmwareVersion,
|
||||
UhkModulePhase_ReceiveFirmwareVersion,
|
||||
UhkModulePhase_ProcessFirmwareVersion,
|
||||
|
||||
// Get module id
|
||||
UhkModulePhase_RequestModuleId,
|
||||
UhkModulePhase_ReceiveModuleId,
|
||||
UhkModulePhase_ProcessModuleId,
|
||||
|
||||
// Get module features
|
||||
UhkModulePhase_RequestModuleFeatures,
|
||||
UhkModulePhase_ReceiveModuleFeatures,
|
||||
UhkModulePhase_ProcessModuleFeatures,
|
||||
// Get module key count
|
||||
UhkModulePhase_RequestModuleKeyCount,
|
||||
UhkModulePhase_ReceiveModuleKeyCount,
|
||||
UhkModulePhase_ProcessModuleKeyCount,
|
||||
|
||||
// Get module key count
|
||||
UhkModulePhase_RequestModulePointerCount,
|
||||
UhkModulePhase_ReceiveModulePointerCount,
|
||||
UhkModulePhase_ProcessModulePointerCount,
|
||||
|
||||
// Get key states
|
||||
UhkModulePhase_RequestKeyStates,
|
||||
@@ -49,9 +60,9 @@
|
||||
UhkModulePhase_ProcessKeystates,
|
||||
|
||||
// Misc phases
|
||||
UhkModulePhase_JumpToBootloader,
|
||||
UhkModulePhase_SetTestLed,
|
||||
UhkModulePhase_SetLedPwmBrightness,
|
||||
UhkModulePhase_JumpToBootloader,
|
||||
|
||||
} uhk_module_phase_t;
|
||||
|
||||
@@ -62,15 +73,16 @@
|
||||
|
||||
typedef struct {
|
||||
uint8_t moduleId;
|
||||
uint8_t protocolVersion;
|
||||
version_t moduleProtocolVersion;
|
||||
version_t firmwareVersion;
|
||||
uhk_module_phase_t phase;
|
||||
uhk_module_vars_t sourceVars;
|
||||
uhk_module_vars_t targetVars;
|
||||
i2c_message_t rxMessage;
|
||||
uint8_t firmwareI2cAddress;
|
||||
uint8_t bootloaderI2cAddress;
|
||||
uhk_module_features_t features;
|
||||
bool jumpToBootloader;
|
||||
uint8_t keyCount;
|
||||
uint8_t pointerCount;
|
||||
} uhk_module_state_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "fsl_i2c.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "slot.h"
|
||||
#include "main.h"
|
||||
#include "slave_drivers/is31fl3731_driver.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
#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;
|
||||
|
||||
@@ -30,6 +31,7 @@ uhk_slave_t Slaves[] = {
|
||||
.update = UhkModuleSlaveDriver_Update,
|
||||
.perDriverId = UhkModuleDriverId_RightAddon,
|
||||
},
|
||||
#ifdef LED_DRIVERS_ENABLED
|
||||
{
|
||||
.init = LedSlaveDriver_Init,
|
||||
.update = LedSlaveDriver_Update,
|
||||
@@ -40,6 +42,7 @@ uhk_slave_t Slaves[] = {
|
||||
.update = LedSlaveDriver_Update,
|
||||
.perDriverId = LedDriverId_Left,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.init = KbootSlaveDriver_Init,
|
||||
.update = KbootSlaveDriver_Update,
|
||||
@@ -49,23 +52,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) {
|
||||
@@ -73,18 +80,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);
|
||||
}
|
||||
|
||||
@@ -93,7 +103,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:
|
||||
|
||||
@@ -11,8 +19,10 @@
|
||||
SlaveId_LeftKeyboardHalf,
|
||||
SlaveId_LeftAddon,
|
||||
SlaveId_RightAddon,
|
||||
#ifdef LED_DRIVERS_ENABLED
|
||||
SlaveId_RightLedDriver,
|
||||
SlaveId_LeftLedDriver,
|
||||
#endif
|
||||
SlaveId_KbootDriver,
|
||||
} slave_id_t;
|
||||
|
||||
@@ -30,12 +40,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:
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
// Macros:
|
||||
|
||||
#define SLOT_COUNT 4
|
||||
#define IS_VALID_SLAVE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule)
|
||||
#define IS_VALID_MODULE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule)
|
||||
|
||||
// Typedefs:
|
||||
|
||||
|
||||
@@ -14,15 +14,30 @@ void Timer_Init(void)
|
||||
pit_config_t pitConfig;
|
||||
PIT_GetDefaultConfig(&pitConfig);
|
||||
PIT_Init(PIT, &pitConfig);
|
||||
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC, PIT_SOURCE_CLOCK));
|
||||
|
||||
// TODO: Why the interval needs to be multiplied by two to arrive to the correct timing?
|
||||
// Figure it out and clean this up.
|
||||
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC*2, PIT_SOURCE_CLOCK));
|
||||
|
||||
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
|
||||
EnableIRQ(PIT_TIMER_IRQ_ID);
|
||||
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
||||
}
|
||||
|
||||
void Timer_SetCurrentTime(uint32_t *time)
|
||||
{
|
||||
*time = CurrentTime;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetElapsedTime(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = CurrentTime - *time;
|
||||
return elapsedTime;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = Timer_GetElapsedTime(time);
|
||||
*time = CurrentTime;
|
||||
return elapsedTime;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
// Functions:
|
||||
|
||||
void Timer_Init(void);
|
||||
void Timer_SetCurrentTime(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#define USB_DEVICE_CLASS 0x00
|
||||
#define USB_DEVICE_SUBCLASS 0x00
|
||||
#define USB_DEVICE_PROTOCOL 0x00
|
||||
#define USB_IRQ_ID USB0_IRQn
|
||||
|
||||
#define USB_INTERFACE_ALTERNATE_SETTING_NONE 0x00
|
||||
#define USB_STRING_DESCRIPTOR_NONE 0x00
|
||||
|
||||
@@ -5,6 +5,12 @@
|
||||
#include "i2c_watchdog.h"
|
||||
#include "buffer.h"
|
||||
#include "timer.h"
|
||||
#include "key_scanner.h"
|
||||
#include "usb_report_updater.h"
|
||||
#include "usb_interfaces/usb_interface_basic_keyboard.h"
|
||||
#include "usb_interfaces/usb_interface_media_keyboard.h"
|
||||
#include "usb_interfaces/usb_interface_system_keyboard.h"
|
||||
#include "usb_interfaces/usb_interface_mouse.h"
|
||||
|
||||
uint8_t DebugBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
|
||||
|
||||
@@ -14,15 +20,16 @@ void UsbCommand_GetDebugBuffer(void)
|
||||
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
|
||||
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
|
||||
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
||||
SetDebugBufferUint32(40, CurrentTime);
|
||||
SetDebugBufferUint32(17, KeyScannerCounter);
|
||||
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
||||
SetDebugBufferUint32(25, CurrentTime);
|
||||
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
||||
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
||||
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
||||
SetDebugBufferUint32(41, UsbSystemKeyboardActionCounter);
|
||||
SetDebugBufferUint32(45, UsbMouseActionCounter);
|
||||
|
||||
memcpy(GenericHidOutBuffer, DebugBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH);
|
||||
|
||||
/* uint64_t ticks = microseconds_get_ticks();
|
||||
uint32_t microseconds = microseconds_convert_to_microseconds(ticks);
|
||||
uint32_t milliseconds = microseconds/1000;
|
||||
*(uint32_t*)(GenericHidOutBuffer+1) = ticks;
|
||||
*/
|
||||
}
|
||||
|
||||
void SetDebugBufferUint8(uint32_t offset, uint8_t value)
|
||||
@@ -39,3 +46,23 @@ void SetDebugBufferUint32(uint32_t offset, uint32_t value)
|
||||
{
|
||||
SetBufferUint32(DebugBuffer, offset, value);
|
||||
}
|
||||
|
||||
void SetDebugBufferInt8(uint32_t offset, int8_t value)
|
||||
{
|
||||
SetBufferInt8(DebugBuffer, offset, value);
|
||||
}
|
||||
|
||||
void SetDebugBufferInt16(uint32_t offset, int16_t value)
|
||||
{
|
||||
SetBufferInt16(DebugBuffer, offset, value);
|
||||
}
|
||||
|
||||
void SetDebugBufferInt32(uint32_t offset, int32_t value)
|
||||
{
|
||||
SetBufferInt32(DebugBuffer, offset, value);
|
||||
}
|
||||
|
||||
void SetDebugBufferFloat(uint32_t offset, float value)
|
||||
{
|
||||
*(float*)(DebugBuffer + offset) = value;
|
||||
}
|
||||
|
||||
@@ -17,4 +17,10 @@
|
||||
void SetDebugBufferUint16(uint32_t offset, uint16_t value);
|
||||
void SetDebugBufferUint32(uint32_t offset, uint32_t value);
|
||||
|
||||
void SetDebugBufferInt8(uint32_t offset, int8_t value);
|
||||
void SetDebugBufferInt16(uint32_t offset, int16_t value);
|
||||
void SetDebugBufferInt32(uint32_t offset, int32_t value);
|
||||
|
||||
void SetDebugBufferFloat(uint32_t offset, float value);
|
||||
|
||||
#endif
|
||||
|
||||
78
right/src/usb_commands/usb_command_get_device_property.c
Normal file
78
right/src/usb_commands/usb_command_get_device_property.c
Normal file
@@ -0,0 +1,78 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_device_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "versions.h"
|
||||
#include "slave_drivers/kboot_driver.h"
|
||||
#include "i2c.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "fsl_i2c.h"
|
||||
#include "timer.h"
|
||||
|
||||
version_t deviceProtocolVersion = {
|
||||
DEVICE_PROTOCOL_MAJOR_VERSION,
|
||||
DEVICE_PROTOCOL_MINOR_VERSION,
|
||||
DEVICE_PROTOCOL_PATCH_VERSION,
|
||||
};
|
||||
|
||||
version_t protocolVersions[] =
|
||||
{
|
||||
{
|
||||
FIRMWARE_MAJOR_VERSION,
|
||||
FIRMWARE_MINOR_VERSION,
|
||||
FIRMWARE_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
DEVICE_PROTOCOL_MAJOR_VERSION,
|
||||
DEVICE_PROTOCOL_MINOR_VERSION,
|
||||
DEVICE_PROTOCOL_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
MODULE_PROTOCOL_MAJOR_VERSION,
|
||||
MODULE_PROTOCOL_MINOR_VERSION,
|
||||
MODULE_PROTOCOL_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
USER_CONFIG_MAJOR_VERSION,
|
||||
USER_CONFIG_MINOR_VERSION,
|
||||
USER_CONFIG_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
HARDWARE_CONFIG_MAJOR_VERSION,
|
||||
HARDWARE_CONFIG_MINOR_VERSION,
|
||||
HARDWARE_CONFIG_PATCH_VERSION,
|
||||
}
|
||||
};
|
||||
|
||||
uint16_t configSizes[] = {HARDWARE_CONFIG_SIZE, USER_CONFIG_SIZE};
|
||||
|
||||
void UsbCommand_GetDeviceProperty(void)
|
||||
{
|
||||
uint8_t propertyId = GetUsbRxBufferUint8(1);
|
||||
|
||||
switch (propertyId) {
|
||||
case DevicePropertyId_DeviceProtocolVersion:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&deviceProtocolVersion, sizeof(deviceProtocolVersion));
|
||||
break;
|
||||
case DevicePropertyId_ProtocolVersions:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&protocolVersions, sizeof(protocolVersions));
|
||||
break;
|
||||
case DevicePropertyId_ConfigSizes:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&configSizes, sizeof(configSizes));
|
||||
break;
|
||||
case DevicePropertyId_CurrentKbootCommand:
|
||||
GenericHidOutBuffer[1] = KbootDriverState.command;
|
||||
break;
|
||||
case DevicePropertyId_I2cMainBusBaudRate:
|
||||
GenericHidOutBuffer[1] = I2C_MAIN_BUS_BASEADDR->F;
|
||||
SetUsbTxBufferUint32(2, I2cMainBusRequestedBaudRateBps);
|
||||
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
||||
break;
|
||||
case DevicePropertyId_Uptime:
|
||||
SetUsbTxBufferUint32(1, CurrentTime);
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
23
right/src/usb_commands/usb_command_get_device_property.h
Normal file
23
right/src/usb_commands/usb_command_get_device_property.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
DevicePropertyId_DeviceProtocolVersion = 0,
|
||||
DevicePropertyId_ProtocolVersions = 1,
|
||||
DevicePropertyId_ConfigSizes = 2,
|
||||
DevicePropertyId_CurrentKbootCommand = 3,
|
||||
DevicePropertyId_I2cMainBusBaudRate = 4,
|
||||
DevicePropertyId_Uptime = 5,
|
||||
} device_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetDeviceProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_device_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetDeviceProperty(void);
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_keyboard_state.h"
|
||||
#include "usb_commands/usb_command_get_device_state.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "peripherals/merge_sensor.h"
|
||||
26
right/src/usb_commands/usb_command_get_module_property.c
Normal file
26
right/src/usb_commands/usb_command_get_module_property.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_module_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slot.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
|
||||
void UsbCommand_GetModuleProperty()
|
||||
{
|
||||
slot_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_MODULE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidModuleSlotId);
|
||||
}
|
||||
|
||||
module_property_id_t modulePropertyId = GetUsbRxBufferUint8(2);
|
||||
switch (modulePropertyId) {
|
||||
case ModulePropertyId_VersionNumbers: {
|
||||
uint8_t moduleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
uhk_module_state_t *moduleState = UhkModuleStates + moduleDriverId;
|
||||
GenericHidOutBuffer[1] = moduleState->moduleId;
|
||||
memcpy(GenericHidOutBuffer + 2, &moduleState->moduleProtocolVersion, sizeof(version_t));
|
||||
memcpy(GenericHidOutBuffer + 8, &moduleState->firmwareVersion, sizeof(version_t));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
18
right/src/usb_commands/usb_command_get_module_property.h
Normal file
18
right/src/usb_commands/usb_command_get_module_property.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#ifndef __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetModuleProperty();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
ModulePropertyId_VersionNumbers = 0,
|
||||
} module_property_id_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetModuleProperty_InvalidModuleSlotId = 2,
|
||||
} usb_status_code_get_module_property_t;
|
||||
|
||||
#endif
|
||||
@@ -1,33 +0,0 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_GetProperty(void)
|
||||
{
|
||||
uint8_t propertyId = GetUsbRxBufferUint8(1);
|
||||
|
||||
switch (propertyId) {
|
||||
case SystemPropertyId_UsbProtocolVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_USB_PROTOCOL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_BridgeProtocolVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_DataModelVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_DATA_MODEL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_FirmwareVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_FIRMWARE_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_HardwareConfigSize:
|
||||
SetUsbTxBufferUint16(1, HARDWARE_CONFIG_SIZE);
|
||||
break;
|
||||
case SystemPropertyId_UserConfigSize:
|
||||
SetUsbTxBufferUint16(1, USER_CONFIG_SIZE);
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetProperty_InvalidProperty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#ifndef __USB_COMMAND_GET_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_PROPERTY_H__
|
||||
|
||||
// Macros:
|
||||
|
||||
#define SYSTEM_PROPERTY_USB_PROTOCOL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_DATA_MODEL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_FIRMWARE_VERSION 1
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
SystemPropertyId_UsbProtocolVersion = 0,
|
||||
SystemPropertyId_BridgeProtocolVersion = 1,
|
||||
SystemPropertyId_DataModelVersion = 2,
|
||||
SystemPropertyId_FirmwareVersion = 3,
|
||||
SystemPropertyId_HardwareConfigSize = 4,
|
||||
SystemPropertyId_UserConfigSize = 5,
|
||||
} system_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetProperty(void);
|
||||
|
||||
#endif
|
||||
19
right/src/usb_commands/usb_command_get_slave_i2c_errors.c
Normal file
19
right/src/usb_commands/usb_command_get_slave_i2c_errors.c
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "i2c_error_logger.h"
|
||||
|
||||
void UsbCommand_GetSlaveI2cErrors()
|
||||
{
|
||||
uint8_t slaveId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_SLAVE_ID(slaveId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidSlaveId);
|
||||
}
|
||||
|
||||
i2c_slave_error_counter_t *i2cSlaveErrorCounter = I2cSlaveErrorCounters + slaveId;
|
||||
|
||||
GenericHidOutBuffer[1] = i2cSlaveErrorCounter->errorTypeCount;
|
||||
memcpy(GenericHidOutBuffer + 2, i2cSlaveErrorCounter->errors, sizeof(i2c_error_count_t) * MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE);
|
||||
}
|
||||
14
right/src/usb_commands/usb_command_get_slave_i2c_errors.h
Normal file
14
right/src/usb_commands/usb_command_get_slave_i2c_errors.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
|
||||
#define __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetSlaveI2cErrors();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetModuleProperty_InvalidSlaveId = 2,
|
||||
} usb_status_code_get_slave_i2c_errors_t;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "usb_commands/usb_command_jump_to_module_bootloader.h"
|
||||
#include "slot.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
|
||||
void UsbCommand_JumpToModuleBootloader(void)
|
||||
{
|
||||
uint8_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_MODULE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId);
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t uhkModuleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
UhkModuleStates[uhkModuleDriverId].phase = UhkModulePhase_JumpToBootloader;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
#ifndef __USB_COMMAND_JUMP_TO_MODULE_BOOTLOADER_H__
|
||||
#define __USB_COMMAND_JUMP_TO_MODULE_BOOTLOADER_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_JumpToModuleBootloader(void);
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId = 2,
|
||||
} usb_status_code_jump_to_module_bootloader_t;
|
||||
|
||||
#endif
|
||||
@@ -1,17 +0,0 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "usb_commands/usb_command_jump_to_slave_bootloader.h"
|
||||
#include "slot.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
|
||||
void UsbCommand_JumpToSlaveBootloader(void)
|
||||
{
|
||||
uint8_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_SLAVE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_JumpToSlaveBootloader_InvalidSlaveSlotId);
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t uhkModuleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
UhkModuleStates[uhkModuleDriverId].jumpToBootloader = true;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
#ifndef __USB_COMMAND_JUMP_TO_SLAVE_BOOTLOADER_H__
|
||||
#define __USB_COMMAND_JUMP_TO_SLAVE_BOOTLOADER_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_JumpToSlaveBootloader(void);
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_JumpToSlaveBootloader_InvalidSlaveSlotId = 2,
|
||||
} usb_status_code_jump_to_slave_bootloader_t;
|
||||
|
||||
#endif
|
||||
25
right/src/usb_commands/usb_command_launch_eeprom_transfer.c
Normal file
25
right/src/usb_commands/usb_command_launch_eeprom_transfer.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_launch_eeprom_transfer.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "config_parser/config_globals.h"
|
||||
|
||||
void UsbCommand_LaunchEepromTransfer(void)
|
||||
{
|
||||
eeprom_operation_t eepromOperation = GetUsbRxBufferUint8(1);
|
||||
config_buffer_id_t configBufferId = GetUsbRxBufferUint8(2);
|
||||
|
||||
if (!IsEepromOperationValid(eepromOperation)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_InvalidEepromOperation);
|
||||
}
|
||||
|
||||
if (!IsConfigBufferIdValid(configBufferId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_InvalidConfigBufferId);
|
||||
}
|
||||
|
||||
status_t status = EEPROM_LaunchTransfer(eepromOperation, configBufferId, NULL);
|
||||
if (status != kStatus_Success) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_TransferError);
|
||||
SetUsbTxBufferUint32(1, status);
|
||||
}
|
||||
}
|
||||
16
right/src/usb_commands/usb_command_launch_eeprom_transfer.h
Normal file
16
right/src/usb_commands/usb_command_launch_eeprom_transfer.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifndef __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_H__
|
||||
#define __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_H__
|
||||
|
||||
// Typedef
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_LaunchEepromTransfer_InvalidEepromOperation = 2,
|
||||
UsbStatusCode_LaunchEepromTransfer_InvalidConfigBufferId = 3,
|
||||
UsbStatusCode_LaunchEepromTransfer_TransferError = 4,
|
||||
} usb_status_code_launch_eeprom_transfer_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_LaunchEepromTransfer(void);
|
||||
|
||||
#endif
|
||||
@@ -1,23 +0,0 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_launch_eeprom_transfer_legacy.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_LaunchEepromTransferLegacy(void)
|
||||
{
|
||||
uint8_t legacyEepromTransferId = GetUsbRxBufferUint8(1);
|
||||
switch (legacyEepromTransferId) {
|
||||
case 0:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, NULL);
|
||||
break;
|
||||
case 1:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Write, ConfigBufferId_HardwareConfig, NULL);
|
||||
break;
|
||||
case 2:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_ValidatedUserConfig, NULL);
|
||||
break;
|
||||
case 3:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Write, ConfigBufferId_ValidatedUserConfig, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
#ifndef __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_LEGACY_H__
|
||||
#define __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_LEGACY_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_LaunchEepromTransferLegacy(void);
|
||||
|
||||
#endif
|
||||
@@ -3,23 +3,28 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_ReadConfig(bool isHardware)
|
||||
void UsbCommand_ReadConfig()
|
||||
{
|
||||
uint8_t length = GetUsbRxBufferUint8(1);
|
||||
uint16_t offset = GetUsbRxBufferUint16(2);
|
||||
config_buffer_id_t configBufferId = GetUsbRxBufferUint8(1);
|
||||
uint8_t length = GetUsbRxBufferUint8(2);
|
||||
uint16_t offset = GetUsbRxBufferUint16(3);
|
||||
|
||||
if (!IsConfigBufferIdValid(configBufferId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_InvalidConfigBufferId);
|
||||
}
|
||||
|
||||
if (length > USB_GENERIC_HID_OUT_BUFFER_LENGTH - USB_STATUS_CODE_SIZE) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_LengthTooLarge);
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : ValidatedUserConfigBuffer.buffer;
|
||||
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE;
|
||||
config_buffer_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId);
|
||||
uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
|
||||
|
||||
if (offset + length > bufferLength) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_BufferOutOfBounds);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer + offset, length);
|
||||
memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer->buffer + offset, length);
|
||||
}
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_ReadConfig(bool isHardware);
|
||||
void UsbCommand_ReadConfig();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_ReadConfig_LengthTooLarge = 2,
|
||||
UsbStatusCode_ReadConfig_BufferOutOfBounds = 3,
|
||||
UsbStatusCode_ReadConfig_InvalidConfigBufferId = 2,
|
||||
UsbStatusCode_ReadConfig_LengthTooLarge = 3,
|
||||
UsbStatusCode_ReadConfig_BufferOutOfBounds = 4,
|
||||
} usb_status_code_read_config_t;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "usb_commands/usb_command_send_kboot_command.h"
|
||||
#include "slave_drivers/kboot_driver.h"
|
||||
|
||||
void UsbCommand_SendKbootCommand(void)
|
||||
{
|
||||
KbootDriverState.phase = 0;
|
||||
KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2);
|
||||
KbootDriverState.commandType = GetUsbRxBufferUint8(1); // Command should be set last.
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
#ifndef __USB_COMMAND_SEND_KBOOT_COMMAND_H__
|
||||
#define __USB_COMMAND_SEND_KBOOT_COMMAND_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_SendKbootCommand(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,10 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "usb_commands/usb_command_send_kboot_command_to_module.h"
|
||||
#include "slave_drivers/kboot_driver.h"
|
||||
|
||||
void UsbCommand_SendKbootCommandToModule(void)
|
||||
{
|
||||
KbootDriverState.phase = 0;
|
||||
KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2);
|
||||
KbootDriverState.command = GetUsbRxBufferUint8(1); // Command should be set last.
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef __USB_COMMAND_SEND_KBOOT_COMMAND_TO_MODULE_H__
|
||||
#define __USB_COMMAND_SEND_KBOOT_COMMAND_TO_MODULE_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_SendKbootCommandToModule(void);
|
||||
|
||||
#endif
|
||||
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
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_WriteConfig(bool isHardware)
|
||||
void UsbCommand_WriteConfig(config_buffer_id_t configBufferId)
|
||||
{
|
||||
uint8_t length = GetUsbRxBufferUint8(1);
|
||||
uint16_t offset = GetUsbRxBufferUint16(2);
|
||||
@@ -14,8 +14,8 @@ void UsbCommand_WriteConfig(bool isHardware)
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : StagingUserConfigBuffer.buffer;
|
||||
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE;
|
||||
uint8_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId)->buffer;
|
||||
uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
|
||||
|
||||
if (offset + length > bufferLength) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_WriteConfig_BufferOutOfBounds);
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#ifndef __USB_COMMAND_WRITE_CONFIG_H__
|
||||
#define __USB_COMMAND_WRITE_CONFIG_H__
|
||||
|
||||
// Functions:
|
||||
// Includes:
|
||||
|
||||
void UsbCommand_WriteConfig(bool isHardware);
|
||||
#include "config_parser/config_globals.h"
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -12,4 +12,8 @@
|
||||
UsbStatusCode_WriteConfig_BufferOutOfBounds = 3,
|
||||
} usb_status_code_write_config_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_WriteConfig(config_buffer_id_t configBufferId);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -5,37 +5,175 @@
|
||||
#include "bus_pal_hardware.h"
|
||||
#include "bootloader/wormhole.h"
|
||||
|
||||
static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param);
|
||||
usb_composite_device_t UsbCompositeDevice;
|
||||
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param);
|
||||
|
||||
usb_device_class_config_struct_t UsbDeviceCompositeClassConfig[USB_DEVICE_CONFIG_HID] = {
|
||||
{UsbGenericHidCallback, (class_handle_t)NULL, &UsbGenericHidClass},
|
||||
{UsbBasicKeyboardCallback, (class_handle_t)NULL, &UsbBasicKeyboardClass},
|
||||
{UsbMediaKeyboardCallback, (class_handle_t)NULL, &UsbMediaKeyboardClass},
|
||||
{UsbSystemKeyboardCallback, (class_handle_t)NULL, &UsbSystemKeyboardClass},
|
||||
{UsbMouseCallback, (class_handle_t)NULL, &UsbMouseClass},
|
||||
};
|
||||
static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
|
||||
.deviceCallback = usbDeviceCallback,
|
||||
.count = USB_DEVICE_CONFIG_HID,
|
||||
.config = (usb_device_class_config_struct_t[USB_DEVICE_CONFIG_HID]) {{
|
||||
.classCallback = UsbGenericHidCallback,
|
||||
.classInfomation = (usb_device_class_struct_t[]) {{
|
||||
.type = kUSB_DeviceClassTypeHid,
|
||||
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
|
||||
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
|
||||
.count = USB_GENERIC_HID_INTERFACE_COUNT,
|
||||
.interfaces = (usb_device_interfaces_struct_t[USB_GENERIC_HID_INTERFACE_COUNT]) {{
|
||||
.classCode = USB_CLASS_HID,
|
||||
.subclassCode = USB_HID_SUBCLASS_NONE,
|
||||
.protocolCode = USB_HID_PROTOCOL_NONE,
|
||||
.interfaceNumber = USB_GENERIC_HID_INTERFACE_INDEX,
|
||||
.count = 1,
|
||||
.interface = (usb_device_interface_struct_t[]) {{
|
||||
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
.endpointList = {
|
||||
.count = USB_GENERIC_HID_ENDPOINT_COUNT,
|
||||
.endpoint = (usb_device_endpoint_struct_t[USB_GENERIC_HID_ENDPOINT_COUNT]) {
|
||||
{
|
||||
.endpointAddress = USB_GENERIC_HID_ENDPOINT_IN_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
.transferType = USB_ENDPOINT_INTERRUPT,
|
||||
.maxPacketSize = USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE,
|
||||
},
|
||||
{
|
||||
.endpointAddress = USB_GENERIC_HID_ENDPOINT_OUT_INDEX | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
.transferType = USB_ENDPOINT_INTERRUPT,
|
||||
.maxPacketSize = USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE,
|
||||
}
|
||||
}
|
||||
}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
},
|
||||
{
|
||||
.classCallback = UsbBasicKeyboardCallback,
|
||||
.classInfomation = (usb_device_class_struct_t[]) {{
|
||||
.type = kUSB_DeviceClassTypeHid,
|
||||
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
|
||||
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
|
||||
.count = USB_BASIC_KEYBOARD_INTERFACE_COUNT,
|
||||
.interfaces = (usb_device_interfaces_struct_t[USB_BASIC_KEYBOARD_INTERFACE_COUNT]) {{
|
||||
.classCode = USB_CLASS_HID,
|
||||
.subclassCode = USB_HID_SUBCLASS_BOOT,
|
||||
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
|
||||
.interfaceNumber = USB_BASIC_KEYBOARD_INTERFACE_INDEX,
|
||||
.count = 1,
|
||||
.interface = (usb_device_interface_struct_t[]) {{
|
||||
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
.endpointList = {
|
||||
USB_BASIC_KEYBOARD_ENDPOINT_COUNT,
|
||||
(usb_device_endpoint_struct_t[USB_BASIC_KEYBOARD_ENDPOINT_COUNT]) {{
|
||||
.endpointAddress = USB_BASIC_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
.transferType = USB_ENDPOINT_INTERRUPT,
|
||||
.maxPacketSize = USB_BASIC_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
|
||||
}}
|
||||
}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
},
|
||||
{
|
||||
.classCallback = UsbMediaKeyboardCallback,
|
||||
.classInfomation = (usb_device_class_struct_t[]) {{
|
||||
.type = kUSB_DeviceClassTypeHid,
|
||||
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
|
||||
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
|
||||
.count = USB_MEDIA_KEYBOARD_INTERFACE_COUNT,
|
||||
.interfaces = (usb_device_interfaces_struct_t[USB_MEDIA_KEYBOARD_INTERFACE_COUNT]) {{
|
||||
.classCode = USB_CLASS_HID,
|
||||
.subclassCode = USB_HID_SUBCLASS_BOOT,
|
||||
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
|
||||
.interfaceNumber = USB_MEDIA_KEYBOARD_INTERFACE_INDEX,
|
||||
.count = 1,
|
||||
.interface = (usb_device_interface_struct_t[]) {{
|
||||
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
.endpointList = {
|
||||
USB_MEDIA_KEYBOARD_ENDPOINT_COUNT,
|
||||
(usb_device_endpoint_struct_t[USB_MEDIA_KEYBOARD_ENDPOINT_COUNT]) {{
|
||||
.endpointAddress = USB_MEDIA_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
.transferType = USB_ENDPOINT_INTERRUPT,
|
||||
.maxPacketSize = USB_MEDIA_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
|
||||
}}
|
||||
}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
},
|
||||
{
|
||||
.classCallback = UsbSystemKeyboardCallback,
|
||||
.classInfomation = (usb_device_class_struct_t[]) {{
|
||||
.type = kUSB_DeviceClassTypeHid,
|
||||
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
|
||||
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
|
||||
.count = USB_SYSTEM_KEYBOARD_INTERFACE_COUNT,
|
||||
.interfaces = (usb_device_interfaces_struct_t[USB_SYSTEM_KEYBOARD_INTERFACE_COUNT]) {{
|
||||
.classCode = USB_CLASS_HID,
|
||||
.subclassCode = USB_HID_SUBCLASS_BOOT,
|
||||
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
|
||||
.interfaceNumber = USB_SYSTEM_KEYBOARD_INTERFACE_INDEX,
|
||||
.count = 1,
|
||||
.interface = (usb_device_interface_struct_t[]) {{
|
||||
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
.endpointList = {
|
||||
USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT,
|
||||
(usb_device_endpoint_struct_t[USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT]) {{
|
||||
.endpointAddress = USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
.transferType = USB_ENDPOINT_INTERRUPT,
|
||||
.maxPacketSize = USB_SYSTEM_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
|
||||
}}
|
||||
}
|
||||
}}
|
||||
}}
|
||||
}},
|
||||
}}
|
||||
},
|
||||
{
|
||||
.classCallback = UsbMouseCallback,
|
||||
.classInfomation = (usb_device_class_struct_t[]) {{
|
||||
.type = kUSB_DeviceClassTypeHid,
|
||||
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
|
||||
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
|
||||
.count = USB_MOUSE_INTERFACE_COUNT,
|
||||
.interfaces = (usb_device_interfaces_struct_t[USB_MOUSE_INTERFACE_COUNT]) {{
|
||||
.classCode = USB_CLASS_HID,
|
||||
.subclassCode = USB_HID_SUBCLASS_BOOT,
|
||||
.protocolCode = USB_HID_PROTOCOL_MOUSE,
|
||||
.interfaceNumber = USB_MOUSE_INTERFACE_INDEX,
|
||||
.count = 1,
|
||||
.interface = (usb_device_interface_struct_t[]) {{
|
||||
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
.endpointList = {
|
||||
USB_MOUSE_ENDPOINT_COUNT,
|
||||
(usb_device_endpoint_struct_t[USB_MOUSE_ENDPOINT_COUNT]) {{
|
||||
.endpointAddress = USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
.transferType = USB_ENDPOINT_INTERRUPT,
|
||||
.maxPacketSize = USB_MOUSE_INTERRUPT_IN_PACKET_SIZE,
|
||||
}}
|
||||
}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
}
|
||||
}};
|
||||
|
||||
usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
|
||||
UsbDeviceCompositeClassConfig,
|
||||
UsbDeviceCallback,
|
||||
USB_DEVICE_CONFIG_HID
|
||||
};
|
||||
|
||||
static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
|
||||
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
|
||||
{
|
||||
usb_status_t error = kStatus_USB_Error;
|
||||
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) {
|
||||
return error;
|
||||
return status;
|
||||
}
|
||||
|
||||
switch (event) {
|
||||
case kUSB_DeviceEventBusReset:
|
||||
UsbCompositeDevice.attach = 0;
|
||||
error = kStatus_USB_Success;
|
||||
status = kStatus_USB_Success;
|
||||
break;
|
||||
case kUSB_DeviceEventSetConfiguration:
|
||||
UsbCompositeDevice.attach = 1;
|
||||
@@ -45,11 +183,11 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
|
||||
UsbMediaKeyboardSetConfiguration(UsbCompositeDevice.mediaKeyboardHandle, *temp8);
|
||||
UsbSystemKeyboardSetConfiguration(UsbCompositeDevice.systemKeyboardHandle, *temp8);
|
||||
UsbMouseSetConfiguration(UsbCompositeDevice.mouseHandle, *temp8);
|
||||
error = kStatus_USB_Success;
|
||||
status = kStatus_USB_Success;
|
||||
break;
|
||||
case kUSB_DeviceEventGetConfiguration:
|
||||
*temp8 = UsbCompositeDevice.currentConfiguration;
|
||||
error = kStatus_USB_Success;
|
||||
status = kStatus_USB_Success;
|
||||
break;
|
||||
case kUSB_DeviceEventSetInterface:
|
||||
if (UsbCompositeDevice.attach) {
|
||||
@@ -62,7 +200,7 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
|
||||
UsbMediaKeyboardSetInterface(UsbCompositeDevice.mediaKeyboardHandle, interface, alternateSetting);
|
||||
UsbSystemKeyboardSetInterface(UsbCompositeDevice.systemKeyboardHandle, interface, alternateSetting);
|
||||
UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting);
|
||||
error = kStatus_USB_Success;
|
||||
status = kStatus_USB_Success;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -70,32 +208,32 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
|
||||
uint8_t interface = (uint8_t)((*temp16 & 0xFF00) >> 8);
|
||||
if (interface < USB_DEVICE_CONFIG_HID) {
|
||||
*temp16 = (*temp16 & 0xFF00) | UsbCompositeDevice.currentInterfaceAlternateSetting[interface];
|
||||
error = kStatus_USB_Success;
|
||||
status = kStatus_USB_Success;
|
||||
} else {
|
||||
error = kStatus_USB_InvalidRequest;
|
||||
status = kStatus_USB_InvalidRequest;
|
||||
}
|
||||
break;
|
||||
case kUSB_DeviceEventGetDeviceDescriptor:
|
||||
error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param);
|
||||
status = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param);
|
||||
break;
|
||||
case kUSB_DeviceEventGetConfigurationDescriptor:
|
||||
error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param);
|
||||
status = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param);
|
||||
break;
|
||||
case kUSB_DeviceEventGetStringDescriptor:
|
||||
error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param);
|
||||
status = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param);
|
||||
break;
|
||||
case kUSB_DeviceEventGetHidDescriptor:
|
||||
error = USB_DeviceGetHidDescriptor(handle, (usb_device_get_hid_descriptor_struct_t *)param);
|
||||
status = USB_DeviceGetHidDescriptor(handle, (usb_device_get_hid_descriptor_struct_t *)param);
|
||||
break;
|
||||
case kUSB_DeviceEventGetHidReportDescriptor:
|
||||
error = USB_DeviceGetHidReportDescriptor(handle, (usb_device_get_hid_report_descriptor_struct_t *)param);
|
||||
status = USB_DeviceGetHidReportDescriptor(handle, (usb_device_get_hid_report_descriptor_struct_t *)param);
|
||||
break;
|
||||
case kUSB_DeviceEventGetHidPhysicalDescriptor:
|
||||
error = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param);
|
||||
status = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param);
|
||||
break;
|
||||
}
|
||||
|
||||
return error;
|
||||
return status;
|
||||
}
|
||||
|
||||
void USB0_IRQHandler(void)
|
||||
@@ -107,9 +245,6 @@ void USB0_IRQHandler(void)
|
||||
|
||||
void InitUsb(void)
|
||||
{
|
||||
uint8_t usbDeviceKhciIrq[] = USB_IRQS;
|
||||
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
|
||||
|
||||
SystemCoreClockUpdate();
|
||||
CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000);
|
||||
|
||||
@@ -121,7 +256,8 @@ void InitUsb(void)
|
||||
UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle;
|
||||
UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle;
|
||||
|
||||
NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY);
|
||||
uint8_t usbDeviceKhciIrq[] = USB_IRQS;
|
||||
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
|
||||
NVIC_EnableIRQ((IRQn_Type)irqNumber);
|
||||
|
||||
USB_DeviceRun(UsbCompositeDevice.deviceHandle);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,48 +1,11 @@
|
||||
#include "main.h"
|
||||
#include "key_action.h"
|
||||
#include "fsl_port.h"
|
||||
#include "usb_api.h"
|
||||
#include "led_display.h"
|
||||
#include "usb_composite_device.h"
|
||||
#include "peripherals/test_led.h"
|
||||
#include "fsl_i2c.h"
|
||||
#include "i2c.h"
|
||||
#include "i2c_addresses.h"
|
||||
|
||||
static usb_device_endpoint_struct_t UsbBasicKeyboardEndpoints[USB_BASIC_KEYBOARD_ENDPOINT_COUNT] = {{
|
||||
USB_BASIC_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
USB_ENDPOINT_INTERRUPT,
|
||||
USB_BASIC_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
|
||||
}};
|
||||
|
||||
static usb_device_interface_struct_t UsbBasicKeyboardInterface[] = {{
|
||||
USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
{USB_BASIC_KEYBOARD_ENDPOINT_COUNT, UsbBasicKeyboardEndpoints},
|
||||
NULL,
|
||||
}};
|
||||
|
||||
static usb_device_interfaces_struct_t UsbBasicKeyboardInterfaces[USB_BASIC_KEYBOARD_INTERFACE_COUNT] = {{
|
||||
USB_CLASS_HID,
|
||||
USB_HID_SUBCLASS_BOOT,
|
||||
USB_HID_PROTOCOL_KEYBOARD,
|
||||
USB_BASIC_KEYBOARD_INTERFACE_INDEX,
|
||||
UsbBasicKeyboardInterface,
|
||||
sizeof(UsbBasicKeyboardInterface) / sizeof(usb_device_interfaces_struct_t),
|
||||
}};
|
||||
|
||||
static usb_device_interface_list_t UsbBasicKeyboardInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
|
||||
USB_BASIC_KEYBOARD_INTERFACE_COUNT,
|
||||
UsbBasicKeyboardInterfaces,
|
||||
}};
|
||||
|
||||
usb_device_class_struct_t UsbBasicKeyboardClass = {
|
||||
UsbBasicKeyboardInterfaceList,
|
||||
kUSB_DeviceClassTypeHid,
|
||||
USB_DEVICE_CONFIGURATION_COUNT,
|
||||
};
|
||||
|
||||
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
|
||||
uint32_t UsbBasicKeyboardActionCounter;
|
||||
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
|
||||
bool IsUsbBasicKeyboardReportSent = false;
|
||||
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
||||
|
||||
usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
|
||||
{
|
||||
@@ -65,6 +28,7 @@ static usb_status_t UsbBasicKeyboardAction(void)
|
||||
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
|
||||
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
||||
IsUsbBasicKeyboardReportSent = true;
|
||||
UsbBasicKeyboardActionCounter++;
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -79,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:
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbBasicKeyboardReportSent;
|
||||
extern usb_device_class_struct_t UsbBasicKeyboardClass;
|
||||
extern uint32_t UsbBasicKeyboardActionCounter;
|
||||
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
|
||||
|
||||
// Functions:
|
||||
|
||||
@@ -1,47 +1,7 @@
|
||||
#include "usb_composite_device.h"
|
||||
#include "usb_interface_generic_hid.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
|
||||
static usb_device_endpoint_struct_t UsbGenericHidEndpoints[USB_GENERIC_HID_ENDPOINT_COUNT] =
|
||||
{
|
||||
{
|
||||
USB_GENERIC_HID_ENDPOINT_IN_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
USB_ENDPOINT_INTERRUPT,
|
||||
USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE,
|
||||
},
|
||||
{
|
||||
USB_GENERIC_HID_ENDPOINT_OUT_INDEX | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
USB_ENDPOINT_INTERRUPT,
|
||||
USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE,
|
||||
}
|
||||
};
|
||||
|
||||
static usb_device_interface_struct_t UsbGenericHidInterface[] = {{
|
||||
USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
{USB_GENERIC_HID_ENDPOINT_COUNT, UsbGenericHidEndpoints},
|
||||
NULL,
|
||||
}};
|
||||
|
||||
static usb_device_interfaces_struct_t UsbGenericHidInterfaces[USB_GENERIC_HID_INTERFACE_COUNT] = {{
|
||||
USB_CLASS_HID,
|
||||
USB_HID_SUBCLASS_NONE,
|
||||
USB_HID_PROTOCOL_NONE,
|
||||
USB_GENERIC_HID_INTERFACE_INDEX,
|
||||
UsbGenericHidInterface,
|
||||
sizeof(UsbGenericHidInterface) / sizeof(usb_device_interfaces_struct_t),
|
||||
}};
|
||||
|
||||
static usb_device_interface_list_t UsbGenericHidInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
|
||||
USB_GENERIC_HID_INTERFACE_COUNT,
|
||||
UsbGenericHidInterfaces,
|
||||
}};
|
||||
|
||||
usb_device_class_struct_t UsbGenericHidClass = {
|
||||
UsbGenericHidInterfaceList,
|
||||
kUSB_DeviceClassTypeHid,
|
||||
USB_DEVICE_CONFIGURATION_COUNT,
|
||||
};
|
||||
|
||||
uint32_t UsbGenericHidActionCounter;
|
||||
uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH];
|
||||
uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
|
||||
|
||||
@@ -67,6 +27,7 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *
|
||||
USB_GENERIC_HID_ENDPOINT_IN_INDEX,
|
||||
GenericHidOutBuffer,
|
||||
USB_GENERIC_HID_OUT_BUFFER_LENGTH);
|
||||
UsbGenericHidActionCounter++;
|
||||
return UsbReceiveData();
|
||||
break;
|
||||
case kUSB_DeviceHidEventGetReport:
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern usb_device_class_struct_t UsbGenericHidClass;
|
||||
extern uint32_t UsbGenericHidActionCounter;
|
||||
extern uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH];
|
||||
extern uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
|
||||
|
||||
|
||||
@@ -1,45 +1,6 @@
|
||||
#include "main.h"
|
||||
#include "key_action.h"
|
||||
#include "fsl_port.h"
|
||||
#include "usb_api.h"
|
||||
#include "usb_composite_device.h"
|
||||
#include "peripherals/test_led.h"
|
||||
#include "fsl_i2c.h"
|
||||
#include "i2c.h"
|
||||
#include "i2c_addresses.h"
|
||||
|
||||
static usb_device_endpoint_struct_t UsbMediaKeyboardEndpoints[USB_MEDIA_KEYBOARD_ENDPOINT_COUNT] = {{
|
||||
USB_MEDIA_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
USB_ENDPOINT_INTERRUPT,
|
||||
USB_MEDIA_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
|
||||
}};
|
||||
|
||||
static usb_device_interface_struct_t UsbMediaKeyboardInterface[] = {{
|
||||
USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
{USB_MEDIA_KEYBOARD_ENDPOINT_COUNT, UsbMediaKeyboardEndpoints},
|
||||
NULL,
|
||||
}};
|
||||
|
||||
static usb_device_interfaces_struct_t UsbMediaKeyboardInterfaces[USB_MEDIA_KEYBOARD_INTERFACE_COUNT] = {{
|
||||
USB_CLASS_HID,
|
||||
USB_HID_SUBCLASS_BOOT,
|
||||
USB_HID_PROTOCOL_KEYBOARD,
|
||||
USB_MEDIA_KEYBOARD_INTERFACE_INDEX,
|
||||
UsbMediaKeyboardInterface,
|
||||
sizeof(UsbMediaKeyboardInterface) / sizeof(usb_device_interfaces_struct_t),
|
||||
}};
|
||||
|
||||
static usb_device_interface_list_t UsbMediaKeyboardInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
|
||||
USB_MEDIA_KEYBOARD_INTERFACE_COUNT,
|
||||
UsbMediaKeyboardInterfaces,
|
||||
}};
|
||||
|
||||
usb_device_class_struct_t UsbMediaKeyboardClass = {
|
||||
UsbMediaKeyboardInterfaceList,
|
||||
kUSB_DeviceClassTypeHid,
|
||||
USB_DEVICE_CONFIGURATION_COUNT,
|
||||
};
|
||||
|
||||
uint32_t UsbMediaKeyboardActionCounter;
|
||||
static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
|
||||
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
|
||||
bool IsUsbMediaKeyboardReportSent = false;
|
||||
@@ -65,6 +26,7 @@ static usb_status_t UsbMediaKeyboardAction(void)
|
||||
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
|
||||
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
||||
IsUsbMediaKeyboardReportSent = true;
|
||||
UsbMediaKeyboardActionCounter++;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbMediaKeyboardReportSent;
|
||||
extern usb_device_class_struct_t UsbMediaKeyboardClass;
|
||||
extern uint32_t UsbMediaKeyboardActionCounter;
|
||||
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
|
||||
|
||||
// Functions:
|
||||
|
||||
@@ -1,45 +1,7 @@
|
||||
#include "usb_composite_device.h"
|
||||
#include "usb_interface_mouse.h"
|
||||
#include "fsl_i2c.h"
|
||||
#include "i2c.h"
|
||||
#include "peripherals/reset_button.h"
|
||||
#include "key_action.h"
|
||||
#include "buffer.h"
|
||||
#include "usb_commands/usb_command_get_debug_buffer.h"
|
||||
|
||||
static usb_device_endpoint_struct_t UsbMouseEndpoints[USB_MOUSE_ENDPOINT_COUNT] = {{
|
||||
USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
USB_ENDPOINT_INTERRUPT,
|
||||
USB_MOUSE_INTERRUPT_IN_PACKET_SIZE,
|
||||
}};
|
||||
|
||||
static usb_device_interface_struct_t UsbMouseInterface[] = {{
|
||||
USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
{USB_MOUSE_ENDPOINT_COUNT, UsbMouseEndpoints},
|
||||
NULL,
|
||||
}};
|
||||
|
||||
static usb_device_interfaces_struct_t UsbMouseInterfaces[USB_MOUSE_INTERFACE_COUNT] = {{
|
||||
USB_CLASS_HID,
|
||||
USB_HID_SUBCLASS_BOOT,
|
||||
USB_HID_PROTOCOL_MOUSE,
|
||||
USB_MOUSE_INTERFACE_INDEX,
|
||||
UsbMouseInterface,
|
||||
sizeof(UsbMouseInterface) / sizeof(usb_device_interfaces_struct_t),
|
||||
}};
|
||||
|
||||
static usb_device_interface_list_t UsbMouseInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
|
||||
USB_MOUSE_INTERFACE_COUNT,
|
||||
UsbMouseInterfaces,
|
||||
}};
|
||||
|
||||
usb_device_class_struct_t UsbMouseClass = {
|
||||
UsbMouseInterfaceList,
|
||||
kUSB_DeviceClassTypeHid,
|
||||
USB_DEVICE_CONFIGURATION_COUNT,
|
||||
};
|
||||
|
||||
usb_mouse_report_t usbMouseReports[2];
|
||||
uint32_t UsbMouseActionCounter;
|
||||
static usb_mouse_report_t usbMouseReports[2];
|
||||
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
|
||||
bool IsUsbMouseReportSent = false;
|
||||
|
||||
@@ -58,16 +20,9 @@ void ResetActiveUsbMouseReport(void)
|
||||
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
|
||||
}
|
||||
|
||||
static uint32_t count1 = 0;
|
||||
static uint32_t count2 = 0;
|
||||
static uint32_t count3 = 0;
|
||||
|
||||
static volatile usb_status_t usbMouseAction(void)
|
||||
{
|
||||
count3++;
|
||||
usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport();
|
||||
SetDebugBufferUint16(29, mouseReport->x);
|
||||
SetDebugBufferUint16(31, mouseReport->y);
|
||||
IsUsbMouseReportSent = true;
|
||||
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
|
||||
(uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH);
|
||||
@@ -75,17 +30,11 @@ static volatile usb_status_t usbMouseAction(void)
|
||||
|
||||
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
|
||||
{
|
||||
SetDebugBufferUint32(17, count1);
|
||||
SetDebugBufferUint32(21, count2);
|
||||
SetDebugBufferUint32(25, count3);
|
||||
|
||||
count1++;
|
||||
|
||||
UsbMouseActionCounter++;
|
||||
usb_status_t error = kStatus_USB_Error;
|
||||
|
||||
switch (event) {
|
||||
case kUSB_DeviceHidEventSendResponse:
|
||||
count2++;
|
||||
if (UsbCompositeDevice.attach) {
|
||||
return usbMouseAction();
|
||||
}
|
||||
|
||||
@@ -25,14 +25,14 @@
|
||||
uint8_t buttons;
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
int8_t wheelX;
|
||||
int8_t wheelY;
|
||||
int8_t wheelX;
|
||||
} ATTR_PACKED usb_mouse_report_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbMouseReportSent;
|
||||
extern usb_device_class_struct_t UsbMouseClass;
|
||||
extern uint32_t UsbMouseActionCounter;
|
||||
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
||||
|
||||
// Functions:
|
||||
|
||||
@@ -1,45 +1,6 @@
|
||||
#include "main.h"
|
||||
#include "key_action.h"
|
||||
#include "fsl_port.h"
|
||||
#include "usb_api.h"
|
||||
#include "usb_composite_device.h"
|
||||
#include "peripherals/test_led.h"
|
||||
#include "fsl_i2c.h"
|
||||
#include "i2c.h"
|
||||
#include "i2c_addresses.h"
|
||||
|
||||
static usb_device_endpoint_struct_t UsbSystemKeyboardEndpoints[USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT] = {{
|
||||
USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
|
||||
USB_ENDPOINT_INTERRUPT,
|
||||
USB_SYSTEM_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
|
||||
}};
|
||||
|
||||
static usb_device_interface_struct_t UsbSystemKeyboardInterface[] = {{
|
||||
USB_INTERFACE_ALTERNATE_SETTING_NONE,
|
||||
{USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT, UsbSystemKeyboardEndpoints},
|
||||
NULL,
|
||||
}};
|
||||
|
||||
static usb_device_interfaces_struct_t UsbSystemKeyboardInterfaces[USB_SYSTEM_KEYBOARD_INTERFACE_COUNT] = {{
|
||||
USB_CLASS_HID,
|
||||
USB_HID_SUBCLASS_BOOT,
|
||||
USB_HID_PROTOCOL_KEYBOARD,
|
||||
USB_SYSTEM_KEYBOARD_INTERFACE_INDEX,
|
||||
UsbSystemKeyboardInterface,
|
||||
sizeof(UsbSystemKeyboardInterface) / sizeof(usb_device_interfaces_struct_t),
|
||||
}};
|
||||
|
||||
static usb_device_interface_list_t UsbSystemKeyboardInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
|
||||
USB_SYSTEM_KEYBOARD_INTERFACE_COUNT,
|
||||
UsbSystemKeyboardInterfaces,
|
||||
}};
|
||||
|
||||
usb_device_class_struct_t UsbSystemKeyboardClass = {
|
||||
UsbSystemKeyboardInterfaceList,
|
||||
kUSB_DeviceClassTypeHid,
|
||||
USB_DEVICE_CONFIGURATION_COUNT,
|
||||
};
|
||||
|
||||
uint32_t UsbSystemKeyboardActionCounter;
|
||||
static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
|
||||
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
|
||||
bool IsUsbSystemKeyboardReportSent = false;
|
||||
@@ -65,6 +26,7 @@ static usb_status_t UsbSystemKeyboardAction(void)
|
||||
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
|
||||
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
||||
IsUsbSystemKeyboardReportSent = true;
|
||||
UsbSystemKeyboardActionCounter++;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
// Variables:
|
||||
|
||||
extern bool IsUsbSystemKeyboardReportSent;
|
||||
extern usb_device_class_struct_t UsbSystemKeyboardClass;
|
||||
extern uint32_t UsbSystemKeyboardActionCounter;
|
||||
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
|
||||
|
||||
// Functions:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user