42 Commits

Author SHA1 Message Date
László Monda
17571a5feb Bump version to 7.0.0. Update changelog and package.json 2017-12-14 21:51:07 +01:00
László Monda
83e782d74a Remove DevicePropertyId_HardwareConfigSize and DevicePropertyId_UserConfigSize 2017-12-14 21:49:15 +01:00
László Monda
312f56048b Add DevicePropertyId_ConfigSizes. 2017-12-14 16:40:44 +01:00
László Monda
494621a841 Expose version numbers via the get property interface. 2017-12-14 16:16:11 +01:00
László Monda
94af52892c Add generate-versions-h.js and versions.h. Execute generate-versions-h.js from make-release.js 2017-12-14 15:41:20 +01:00
László Monda
5862a34f18 Use const instead of let wherever possible in make-release.js 2017-12-14 04:01:13 +01:00
László Monda
9b9e5ed1b5 Rename the version property to firmwareVersion in package.json 2017-12-14 03:52:56 +01:00
László Monda
4393377365 Rename version properties in package.json 2017-12-14 03:48:59 +01:00
László Monda
1570364741 Add hardware config versions to releases. 2017-12-14 03:38:24 +01:00
László Monda
738a240860 Rename slave protocol to module protocol. 2017-12-14 03:36:29 +01:00
László Monda
43b48aa643 Rename USB protocol to device protocol. 2017-12-14 03:25:47 +01:00
László Monda
61a0540007 Rename data model to user config. 2017-12-14 03:24:29 +01:00
László Monda
f2e313dd0a Put the data model version as the last element of the version list. 2017-12-14 03:22:04 +01:00
László Monda
b239d0da50 Mark bumped version numbers by making them bold. 2017-12-14 03:14:41 +01:00
László Monda
23459e3791 Don't make horizontal scrolling and vertical scrolling affect each other. 2017-12-14 01:30:06 +01:00
László Monda
6a54944cb1 Make UsbCommand_JumpToModuleBootloader() more robust by not making it dependent on the state of the module driver. 2017-12-13 01:27:04 +01:00
László Monda
a52df9da7e Bump version to 6.0.0, update changelog and package.json 2017-12-12 18:44:12 +01:00
László Monda
28f98f179a Change the value of UsbCommandId_{GetDeviceState,SetTestLed,GetDebugBuffer,GetAdcValue,SetLedPwmBrightness}. 2017-12-12 18:38:01 +01:00
László Monda
5798f9e4fb Refactor UsbCommandId_LaunchEepromTransfer, change its arguments, and change its ID to 0x08. 2017-12-12 03:24:34 +01:00
László Monda
4fe5ce45ac Change UsbCommandId_ApplyConfig to 0x07. 2017-12-12 02:15:20 +01:00
László Monda
a212c254a9 Change UsbCommandId_WriteHardwareConfig and UsbCommandId_WriteUserConfig to 0x05 and 0x06. 2017-12-12 01:59:53 +01:00
László Monda
235e18d706 Fix UsbCommandId_WriteHardwareConfig that I previously screwed up. 2017-12-12 01:29:49 +01:00
László Monda
7c91f8f6d1 Replace UsbCommandId_ReadHardwareConfig and UsbCommandId_ReadUserConfig with UsbCommandId_ReadConfig. 2017-12-12 01:22:26 +01:00
László Monda
c8cfe53136 Change UsbCommandId_SendKbootCommandToModule from 0x13 to 0x03. 2017-12-11 22:15:46 +01:00
László Monda
f1f47ece14 Change UsbCommandId_JumpToModuleBootloader from 0x12 to 0x02. 2017-12-11 21:44:35 +01:00
László Monda
a0dba2fa66 Change UsbCommandId_SetTestLed from 0x02 to 0x14. 2017-12-11 21:21:41 +01:00
László Monda
0f34b01189 Update LED brightness levels upon applying the configuration. 2017-12-10 20:48:26 +01:00
László Monda
5a449ad5c5 Disable LED display icons by default. 2017-12-10 15:35:03 +01:00
László Monda
0d6a5ae902 Bump firmware version number to 5.0.1 and update changelog. 2017-12-09 16:44:11 +01:00
László Monda
2f7f7b1cd2 Make scrolling immediately react to keypresses regardless of the previous internal scroll state. 2017-12-07 04:44:45 +01:00
László Monda
2eb25ce05c Make UpdateUsbReports() not exit prematurely even if a previously active USB interface is not polled anymore by the host. Tweak the Timer API to not set the current time automatically. 2017-12-07 03:24:53 +01:00
László Monda
6e47707037 Rename the misleadingly named error variable of usbDeviceCallback() to status. Clean up InitUsb() a bit. 2017-12-05 00:56:52 +01:00
László Monda
0932c14a2c Lowercamelcase UsbDeviceCallback because it's local. 2017-12-04 22:51:04 +01:00
László Monda
e57c2c21ca Don't define the NULL members of UsbDeviceCompositeConfigList. 2017-12-04 20:43:57 +01:00
László Monda
a5ce90779c Merge all the substructures of UsbDeviceCompositeConfigList across different files to a single structure. 2017-12-04 20:41:22 +01:00
László Monda
e9bf3dc355 Expand UsbDeviceCompositeClassConfig and UsbDeviceCompositeConfigList using structure member names. 2017-12-04 20:05:28 +01:00
László Monda
8cb8654459 Merge the substructures of UsbMouseClass into a single structure. 2017-12-04 19:57:43 +01:00
László Monda
745e8e1cf0 Merge the substructures of UsbSystemKeyboardClass into a single structure. 2017-12-04 19:50:39 +01:00
László Monda
5341109845 Merge the substructures of UsbMediaKeyboardClass into a single structure. 2017-12-04 19:41:51 +01:00
László Monda
ff0e5b0aa3 Merge the structs of UsbBasicKeyboardClass into a single structure. 2017-12-04 19:33:53 +01:00
László Monda
c4e79d8ed2 Merge the all the structures of UsbGenericHidClass into a single structure. 2017-12-04 19:16:04 +01:00
László Monda
6780c8177c Expose per-interface count values for debugging purposes via USB. 2017-12-04 17:38:31 +01:00
48 changed files with 645 additions and 433 deletions

View File

@@ -5,23 +5,48 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions. and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [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 ## [5.0.0] - 2017-12-04
Data Model: 4.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged) Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **4.0.0** | Hardware Config: 1.0.0
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `DATAMODEL:MAJOR` - Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `USERCONFIG:MAJOR`
## [4.0.0] - 2017-11-30 ## [4.0.0] - 2017-11-30
Data Model: 3.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged) Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **3.0.0** | Hardware Config: 1.0.0
- Implement mouse movement and scrolling deceleration and acceleration. - Implement mouse movement and scrolling deceleration and acceleration.
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable. - Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
- Make the parser read additional user configuration properties: dataModelMajorVersion, dataModelMinorVersion, dataModelPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `DATAMODEL:MAJOR` - Make the parser read additional user configuration properties: USERCONFIGMajorVersion, USERCONFIGMinorVersion, USERCONFIGPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
## [3.0.0] - 2017-11-15 ## [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. - Detect the use of USB interfaces and only wait for the ones that are actually used by the host.
- Implement key debouncer. - Implement key debouncer.
@@ -29,49 +54,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. - 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. - 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. - 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. - Suppress pressed keys upon layer switcher key release.
- Handle secondary role modifiers and layer switchers. - Handle secondary role modifiers and layer switchers.
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `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. `USBPROTOCOL:MINOR` - Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `DEVICEPROTOCOL:MINOR`
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `USBPROTOCOL:MAJOR` - 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. `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. `DEVICEPROTOCOL:MAJOR`
- Switch keymap only upon keypress. - Switch keymap only upon keypress.
- Handle layer toggle actions. - Handle layer toggle actions.
- Keep the active layer active even if another layer switcher key gets pressed while holding it. - 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. - 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. - 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. - Scan keyboard matrices in a more efficient manner from timer interrupts instead of the main loop.
- Add UsbCommand_SendKbootCommand. `USBPROTOCOL:MINOR` - Add UsbCommand_SendKbootCommand. `DEVICEPROTOCOL:MINOR`
- Make the reenumerate USB command accept a timeout value. `USBPROTOCOL:MINOR` - Make the reenumerate USB command accept a timeout value. `DEVICEPROTOCOL:MINOR`
- Make the config parser read the device name. `DATAMODEL:MAJOR` - 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. - Update release file format containing device and module directories and hex files instead of srec.
- Remove obsolete ARM GCC build files. - Remove obsolete ARM GCC build files.
## [2.1.0] - 2017-10-13 ## [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. - Fix generic HID descriptor enumeration error.
## [2.0.0] - 2017-10-10 ## [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. - 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. - 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. - 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. - 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 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` - Add merge sensor state and attached module IDs to GetDebugInfo(). `DEVICEPROTOCOL:PATCH`
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `DATAMODEL:PATCH` - Throw ParserError_InvalidKeymapCount if keymapCount == 0. `USERCONFIG:PATCH`
## [1.0.0] - 2017-08-30 ## [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 - First Release

View File

@@ -12,6 +12,11 @@ config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
bool ParserRunDry; 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) config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
{ {
switch (configBufferId) { switch (configBufferId) {
@@ -25,3 +30,16 @@ config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
return NULL; 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;
}
}

View File

@@ -23,6 +23,8 @@
// Functions: // Functions:
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId); config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);
uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId);
#endif #endif

View File

@@ -5,6 +5,9 @@
#include "config_globals.h" #include "config_globals.h"
#include "macros.h" #include "macros.h"
#include "usb_report_updater.h" #include "usb_report_updater.h"
#include "led_display.h"
#include "slave_scheduler.h"
#include "slave_drivers/is31fl3731_driver.h"
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer) static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
{ {
@@ -59,10 +62,6 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
uint8_t alphanumericSegmentsBrightness = ReadUInt8(buffer); uint8_t alphanumericSegmentsBrightness = ReadUInt8(buffer);
uint8_t keyBacklightBrightness = ReadUInt8(buffer); uint8_t keyBacklightBrightness = ReadUInt8(buffer);
(void)iconsAndLayerTextsBrightness;
(void)alphanumericSegmentsBrightness;
(void)keyBacklightBrightness;
// Mouse kinetic properties // Mouse kinetic properties
uint8_t mouseMoveInitialSpeed = ReadUInt8(buffer); uint8_t mouseMoveInitialSpeed = ReadUInt8(buffer);
@@ -138,6 +137,16 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
if (!ParserRunDry) { if (!ParserRunDry) {
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout; DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
// Update LED brightnesses and reinitialize LED drivers
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
KeyBacklightBrightness = keyBacklightBrightness;
Slaves[SlaveId_LeftLedDriver].isConnected = false;
Slaves[SlaveId_RightLedDriver].isConnected = false;
// Update mouse key speeds
MouseMoveState.initialSpeed = mouseMoveInitialSpeed; MouseMoveState.initialSpeed = mouseMoveInitialSpeed;
MouseMoveState.acceleration = mouseMoveAcceleration; MouseMoveState.acceleration = mouseMoveAcceleration;
MouseMoveState.deceleratedSpeed = mouseMoveDeceleratedSpeed; MouseMoveState.deceleratedSpeed = mouseMoveDeceleratedSpeed;
@@ -150,6 +159,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
MouseScrollState.baseSpeed = mouseScrollBaseSpeed; MouseScrollState.baseSpeed = mouseScrollBaseSpeed;
MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed; MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed;
// Update counts
AllKeymapsCount = keymapCount; AllKeymapsCount = keymapCount;
AllMacrosCount = macroCount; AllMacrosCount = macroCount;
} }

View File

@@ -125,3 +125,8 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
IsEepromBusy = LastEepromTransferStatus == kStatus_Success; IsEepromBusy = LastEepromTransferStatus == kStatus_Success;
return LastEepromTransferStatus; return LastEepromTransferStatus;
} }
bool IsEepromOperationValid(eeprom_operation_t operation)
{
return operation == EepromOperation_Read || operation == EepromOperation_Write;
}

View File

@@ -31,5 +31,6 @@
void EEPROM_Init(void); void EEPROM_Init(void);
status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback)); status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback));
bool IsEepromOperationValid(eeprom_operation_t operation);
#endif #endif

View File

@@ -1,9 +1,12 @@
#include "fsl_pit.h" #include "fsl_pit.h"
#include "key_scanner.h" #include "key_scanner.h"
uint32_t KeyScannerCounter;
void PIT_KEY_SCANNER_HANDLER(void) void PIT_KEY_SCANNER_HANDLER(void)
{ {
KeyMatrix_ScanRow(&RightKeyMatrix); KeyMatrix_ScanRow(&RightKeyMatrix);
KeyScannerCounter++;
PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK); PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK);
} }

View File

@@ -10,6 +10,10 @@
#define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM) #define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM)
// Variables:
extern uint32_t KeyScannerCounter;
// Functions: // Functions:
void InitKeyScanner(void); void InitKeyScanner(void);

View File

@@ -3,6 +3,9 @@
#include "layer.h" #include "layer.h"
#include "keymap.h" #include "keymap.h"
uint8_t IconsAndLayerTextsBrightness = 0xff;
uint8_t AlphanumericSegmentsBrightness = 0xff;
static const uint16_t capitalLetterToSegmentSet[] = { static const uint16_t capitalLetterToSegmentSet[] = {
0b0000000011110111, 0b0000000011110111,
0b0001001010001111, 0b0001001010001111,
@@ -69,13 +72,13 @@ void LedDisplay_SetText(uint8_t length, const char* text)
allSegmentSets |= characterToSegmentSet(text[0]); allSegmentSets |= characterToSegmentSet(text[0]);
} }
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? LED_BRIGHTNESS_LEVEL : 0; LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0;
LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? LED_BRIGHTNESS_LEVEL : 0; LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? AlphanumericSegmentsBrightness : 0;
allSegmentSets >>= 2; allSegmentSets >>= 2;
for (uint8_t i = 24; i <= 136; i += 16) { for (uint8_t i = 24; i <= 136; i += 16) {
for (uint8_t j = 0; j < 5; j++) { 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; allSegmentSets >>= 5;
} }
@@ -94,11 +97,11 @@ void LedDisplay_SetLayer(uint8_t layerId)
} }
if (layerId >= LayerId_Mod && layerId <= LayerId_Mouse) { 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) 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;
} }

View File

@@ -14,6 +14,11 @@
LedDisplayIcon_Adaptive, LedDisplayIcon_Adaptive,
} led_display_icon_t; } led_display_icon_t;
// Variables:
extern uint8_t IconsAndLayerTextsBrightness;
extern uint8_t AlphanumericSegmentsBrightness;
// Functions: // Functions:
void LedDisplay_SetText(uint8_t length, const char* text); void LedDisplay_SetText(uint8_t length, const char* text);

View File

@@ -3,6 +3,7 @@
#include "slave_scheduler.h" #include "slave_scheduler.h"
#include "led_display.h" #include "led_display.h"
uint8_t KeyBacklightBrightness = 0xff;
uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT]; uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
static led_driver_state_t ledDriverStates[LED_DRIVER_MAX_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; led_driver_state_t *currentLedDriverState = ledDriverStates + ledDriverId;
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrame; currentLedDriverState->phase = LedDriverPhase_SetFunctionFrame;
currentLedDriverState->ledIndex = 0; currentLedDriverState->ledIndex = 0;
memset(LedDriverValues[ledDriverId], LED_BRIGHTNESS_LEVEL, LED_DRIVER_LED_COUNT); memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
LedDisplay_SetCurrentKeymapText();
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) status_t LedSlaveDriver_Update(uint8_t ledDriverId)

View File

@@ -12,7 +12,6 @@
#define LED_CONTROL_REGISTERS_COMMAND_LENGTH 19 #define LED_CONTROL_REGISTERS_COMMAND_LENGTH 19
#define PMW_REGISTER_UPDATE_CHUNK_SIZE 8 #define PMW_REGISTER_UPDATE_CHUNK_SIZE 8
#define PWM_REGISTER_BUFFER_LENGTH (1 + PMW_REGISTER_UPDATE_CHUNK_SIZE) #define PWM_REGISTER_BUFFER_LENGTH (1 + PMW_REGISTER_UPDATE_CHUNK_SIZE)
#define LED_BRIGHTNESS_LEVEL 0xff
#define IS_ISO true #define IS_ISO true
#define ISO_KEY_LED_DRIVER_ID LedDriverId_Left #define ISO_KEY_LED_DRIVER_ID LedDriverId_Left
@@ -45,6 +44,7 @@
// Variables: // Variables:
extern uint8_t KeyBacklightBrightness;
extern uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT]; extern uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
// Functions: // Functions:

View File

@@ -69,6 +69,13 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
switch (*uhkModulePhase) { switch (*uhkModulePhase) {
// Jump to bootloader
case UhkModulePhase_JumpToBootloader:
txMessage.data[0] = SlaveCommand_JumpToBootloader;
txMessage.length = 1;
status = tx(i2cAddress);
break;
// Sync communication // Sync communication
case UhkModulePhase_RequestSync: case UhkModulePhase_RequestSync:
txMessage.data[0] = SlaveCommand_RequestProperty; txMessage.data[0] = SlaveCommand_RequestProperty;
@@ -177,19 +184,6 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
} }
} }
status = kStatus_Uhk_NoTransfer; 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;
}
*uhkModulePhase = UhkModulePhase_SetTestLed; *uhkModulePhase = UhkModulePhase_SetTestLed;
break; break;

View File

@@ -49,9 +49,9 @@
UhkModulePhase_ProcessKeystates, UhkModulePhase_ProcessKeystates,
// Misc phases // Misc phases
UhkModulePhase_JumpToBootloader,
UhkModulePhase_SetTestLed, UhkModulePhase_SetTestLed,
UhkModulePhase_SetLedPwmBrightness, UhkModulePhase_SetLedPwmBrightness,
UhkModulePhase_JumpToBootloader,
} uhk_module_phase_t; } uhk_module_phase_t;
@@ -70,7 +70,6 @@
uint8_t firmwareI2cAddress; uint8_t firmwareI2cAddress;
uint8_t bootloaderI2cAddress; uint8_t bootloaderI2cAddress;
uhk_module_features_t features; uhk_module_features_t features;
bool jumpToBootloader;
} uhk_module_state_t; } uhk_module_state_t;
typedef struct { typedef struct {

View File

@@ -24,9 +24,20 @@ void Timer_Init(void)
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL); PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
} }
void Timer_SetCurrentTime(uint32_t *time)
{
*time = CurrentTime;
}
uint32_t Timer_GetElapsedTime(uint32_t *time) uint32_t Timer_GetElapsedTime(uint32_t *time)
{ {
uint32_t elapsedTime = CurrentTime - *time; uint32_t elapsedTime = CurrentTime - *time;
return elapsedTime;
}
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
{
uint32_t elapsedTime = Timer_GetElapsedTime(time);
*time = CurrentTime; *time = CurrentTime;
return elapsedTime; return elapsedTime;
} }

View File

@@ -16,6 +16,8 @@
// Functions: // Functions:
void Timer_Init(void); void Timer_Init(void);
void Timer_SetCurrentTime(uint32_t *time);
uint32_t Timer_GetElapsedTime(uint32_t *time); uint32_t Timer_GetElapsedTime(uint32_t *time);
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
#endif #endif

View File

@@ -5,6 +5,12 @@
#include "i2c_watchdog.h" #include "i2c_watchdog.h"
#include "buffer.h" #include "buffer.h"
#include "timer.h" #include "timer.h"
#include "key_scanner.h"
#include "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]; uint8_t DebugBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
@@ -14,7 +20,14 @@ void UsbCommand_GetDebugBuffer(void)
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter); SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter); SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter); SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
SetDebugBufferUint32(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); memcpy(GenericHidOutBuffer, DebugBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH);
} }

View File

@@ -2,29 +2,58 @@
#include "usb_commands/usb_command_get_property.h" #include "usb_commands/usb_command_get_property.h"
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "eeprom.h" #include "eeprom.h"
#include "versions.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_GetProperty(void) void UsbCommand_GetProperty(void)
{ {
uint8_t propertyId = GetUsbRxBufferUint8(1); uint8_t propertyId = GetUsbRxBufferUint8(1);
switch (propertyId) { switch (propertyId) {
case SystemPropertyId_UsbProtocolVersion: case DevicePropertyId_DeviceProtocolVersion:
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_USB_PROTOCOL_VERSION); memcpy(GenericHidOutBuffer+1, (uint8_t*)&deviceProtocolVersion, sizeof(deviceProtocolVersion));
break; break;
case SystemPropertyId_BridgeProtocolVersion: case DevicePropertyId_ProtocolVersions:
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION); memcpy(GenericHidOutBuffer+1, (uint8_t*)&protocolVersions, sizeof(protocolVersions));
break; break;
case SystemPropertyId_DataModelVersion: case DevicePropertyId_ConfigSizes:
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_DATA_MODEL_VERSION); memcpy(GenericHidOutBuffer+1, (uint8_t*)&configSizes, sizeof(configSizes));
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; break;
default: default:
SetUsbTxBufferUint8(0, UsbStatusCode_GetProperty_InvalidProperty); SetUsbTxBufferUint8(0, UsbStatusCode_GetProperty_InvalidProperty);

View File

@@ -1,22 +1,12 @@
#ifndef __USB_COMMAND_GET_PROPERTY_H__ #ifndef __USB_COMMAND_GET_PROPERTY_H__
#define __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: // Typedefs:
typedef enum { typedef enum {
SystemPropertyId_UsbProtocolVersion = 0, DevicePropertyId_DeviceProtocolVersion = 0,
SystemPropertyId_BridgeProtocolVersion = 1, DevicePropertyId_ProtocolVersions = 1,
SystemPropertyId_DataModelVersion = 2, DevicePropertyId_ConfigSizes = 2,
SystemPropertyId_FirmwareVersion = 3,
SystemPropertyId_HardwareConfigSize = 4,
SystemPropertyId_UserConfigSize = 5,
} system_property_t; } system_property_t;
typedef enum { typedef enum {

View File

@@ -13,5 +13,5 @@ void UsbCommand_JumpToModuleBootloader(void)
} }
uint8_t uhkModuleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId); uint8_t uhkModuleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
UhkModuleStates[uhkModuleDriverId].jumpToBootloader = true; UhkModuleStates[uhkModuleDriverId].phase = UhkModulePhase_JumpToBootloader;
} }

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

View 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

View File

@@ -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;
}
}

View File

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

View File

@@ -3,23 +3,28 @@
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "eeprom.h" #include "eeprom.h"
void UsbCommand_ReadConfig(bool isHardware) void UsbCommand_ReadConfig()
{ {
uint8_t length = GetUsbRxBufferUint8(1); config_buffer_id_t configBufferId = GetUsbRxBufferUint8(1);
uint16_t offset = GetUsbRxBufferUint16(2); 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) { if (length > USB_GENERIC_HID_OUT_BUFFER_LENGTH - USB_STATUS_CODE_SIZE) {
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_LengthTooLarge); SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_LengthTooLarge);
return; return;
} }
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : ValidatedUserConfigBuffer.buffer; config_buffer_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId);
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE; uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
if (offset + length > bufferLength) { if (offset + length > bufferLength) {
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_BufferOutOfBounds); SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_BufferOutOfBounds);
return; return;
} }
memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer + offset, length); memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer->buffer + offset, length);
} }

View File

@@ -3,13 +3,14 @@
// Functions: // Functions:
void UsbCommand_ReadConfig(bool isHardware); void UsbCommand_ReadConfig();
// Typedefs: // Typedefs:
typedef enum { typedef enum {
UsbStatusCode_ReadConfig_LengthTooLarge = 2, UsbStatusCode_ReadConfig_InvalidConfigBufferId = 2,
UsbStatusCode_ReadConfig_BufferOutOfBounds = 3, UsbStatusCode_ReadConfig_LengthTooLarge = 3,
UsbStatusCode_ReadConfig_BufferOutOfBounds = 4,
} usb_status_code_read_config_t; } usb_status_code_read_config_t;
#endif #endif

View File

@@ -3,7 +3,7 @@
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "eeprom.h" #include "eeprom.h"
void UsbCommand_WriteConfig(bool isHardware) void UsbCommand_WriteConfig(config_buffer_id_t configBufferId)
{ {
uint8_t length = GetUsbRxBufferUint8(1); uint8_t length = GetUsbRxBufferUint8(1);
uint16_t offset = GetUsbRxBufferUint16(2); uint16_t offset = GetUsbRxBufferUint16(2);
@@ -14,8 +14,8 @@ void UsbCommand_WriteConfig(bool isHardware)
return; return;
} }
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : StagingUserConfigBuffer.buffer; uint8_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId)->buffer;
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE; uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
if (offset + length > bufferLength) { if (offset + length > bufferLength) {
SetUsbTxBufferUint8(0, UsbStatusCode_WriteConfig_BufferOutOfBounds); SetUsbTxBufferUint8(0, UsbStatusCode_WriteConfig_BufferOutOfBounds);

View File

@@ -1,9 +1,9 @@
#ifndef __USB_COMMAND_WRITE_CONFIG_H__ #ifndef __USB_COMMAND_WRITE_CONFIG_H__
#define __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: // Typedefs:
@@ -12,4 +12,8 @@
UsbStatusCode_WriteConfig_BufferOutOfBounds = 3, UsbStatusCode_WriteConfig_BufferOutOfBounds = 3,
} usb_status_code_write_config_t; } usb_status_code_write_config_t;
// Functions:
void UsbCommand_WriteConfig(config_buffer_id_t configBufferId);
#endif #endif

View File

@@ -5,37 +5,175 @@
#include "bus_pal_hardware.h" #include "bus_pal_hardware.h"
#include "bootloader/wormhole.h" #include "bootloader/wormhole.h"
static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param);
usb_composite_device_t UsbCompositeDevice; 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] = { static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
{UsbGenericHidCallback, (class_handle_t)NULL, &UsbGenericHidClass}, .deviceCallback = usbDeviceCallback,
{UsbBasicKeyboardCallback, (class_handle_t)NULL, &UsbBasicKeyboardClass}, .count = USB_DEVICE_CONFIG_HID,
{UsbMediaKeyboardCallback, (class_handle_t)NULL, &UsbMediaKeyboardClass}, .config = (usb_device_class_config_struct_t[USB_DEVICE_CONFIG_HID]) {{
{UsbSystemKeyboardCallback, (class_handle_t)NULL, &UsbSystemKeyboardClass}, .classCallback = UsbGenericHidCallback,
{UsbMouseCallback, (class_handle_t)NULL, &UsbMouseClass}, .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 = { static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
UsbDeviceCompositeClassConfig,
UsbDeviceCallback,
USB_DEVICE_CONFIG_HID
};
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; uint16_t *temp16 = (uint16_t*)param;
uint8_t *temp8 = (uint8_t*)param; uint8_t *temp8 = (uint8_t*)param;
if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface) { if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface) {
return error; return status;
} }
switch (event) { switch (event) {
case kUSB_DeviceEventBusReset: case kUSB_DeviceEventBusReset:
UsbCompositeDevice.attach = 0; UsbCompositeDevice.attach = 0;
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetConfiguration: case kUSB_DeviceEventSetConfiguration:
UsbCompositeDevice.attach = 1; UsbCompositeDevice.attach = 1;
@@ -45,11 +183,11 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
UsbMediaKeyboardSetConfiguration(UsbCompositeDevice.mediaKeyboardHandle, *temp8); UsbMediaKeyboardSetConfiguration(UsbCompositeDevice.mediaKeyboardHandle, *temp8);
UsbSystemKeyboardSetConfiguration(UsbCompositeDevice.systemKeyboardHandle, *temp8); UsbSystemKeyboardSetConfiguration(UsbCompositeDevice.systemKeyboardHandle, *temp8);
UsbMouseSetConfiguration(UsbCompositeDevice.mouseHandle, *temp8); UsbMouseSetConfiguration(UsbCompositeDevice.mouseHandle, *temp8);
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventGetConfiguration: case kUSB_DeviceEventGetConfiguration:
*temp8 = UsbCompositeDevice.currentConfiguration; *temp8 = UsbCompositeDevice.currentConfiguration;
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetInterface: case kUSB_DeviceEventSetInterface:
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
@@ -62,7 +200,7 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
UsbMediaKeyboardSetInterface(UsbCompositeDevice.mediaKeyboardHandle, interface, alternateSetting); UsbMediaKeyboardSetInterface(UsbCompositeDevice.mediaKeyboardHandle, interface, alternateSetting);
UsbSystemKeyboardSetInterface(UsbCompositeDevice.systemKeyboardHandle, interface, alternateSetting); UsbSystemKeyboardSetInterface(UsbCompositeDevice.systemKeyboardHandle, interface, alternateSetting);
UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting); UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting);
error = kStatus_USB_Success; status = kStatus_USB_Success;
} }
} }
break; 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); uint8_t interface = (uint8_t)((*temp16 & 0xFF00) >> 8);
if (interface < USB_DEVICE_CONFIG_HID) { if (interface < USB_DEVICE_CONFIG_HID) {
*temp16 = (*temp16 & 0xFF00) | UsbCompositeDevice.currentInterfaceAlternateSetting[interface]; *temp16 = (*temp16 & 0xFF00) | UsbCompositeDevice.currentInterfaceAlternateSetting[interface];
error = kStatus_USB_Success; status = kStatus_USB_Success;
} else { } else {
error = kStatus_USB_InvalidRequest; status = kStatus_USB_InvalidRequest;
} }
break; break;
case kUSB_DeviceEventGetDeviceDescriptor: 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; break;
case kUSB_DeviceEventGetConfigurationDescriptor: 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; break;
case kUSB_DeviceEventGetStringDescriptor: 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; break;
case kUSB_DeviceEventGetHidDescriptor: 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; break;
case kUSB_DeviceEventGetHidReportDescriptor: 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; break;
case kUSB_DeviceEventGetHidPhysicalDescriptor: 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; break;
} }
return error; return status;
} }
void USB0_IRQHandler(void) void USB0_IRQHandler(void)
@@ -107,9 +245,6 @@ void USB0_IRQHandler(void)
void InitUsb(void) void InitUsb(void)
{ {
uint8_t usbDeviceKhciIrq[] = USB_IRQS;
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
SystemCoreClockUpdate(); SystemCoreClockUpdate();
CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000); CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000);
@@ -121,6 +256,8 @@ void InitUsb(void)
UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle; UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle;
UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle; UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle;
uint8_t usbDeviceKhciIrq[] = USB_IRQS;
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
NVIC_EnableIRQ((IRQn_Type)irqNumber); NVIC_EnableIRQ((IRQn_Type)irqNumber);
USB_DeviceRun(UsbCompositeDevice.deviceHandle); USB_DeviceRun(UsbCompositeDevice.deviceHandle);

View File

@@ -1,45 +1,7 @@
#include "key_action.h"
#include "fsl_port.h"
#include "usb_api.h"
#include "usb_composite_device.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]; static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
uint32_t UsbBasicKeyboardActionCounter;
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports; usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
bool IsUsbBasicKeyboardReportSent = false; bool IsUsbBasicKeyboardReportSent = false;
@@ -64,6 +26,7 @@ static usb_status_t UsbBasicKeyboardAction(void)
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); (uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
IsUsbBasicKeyboardReportSent = true; IsUsbBasicKeyboardReportSent = true;
UsbBasicKeyboardActionCounter++;
return status; return status;
} }

View File

@@ -32,7 +32,7 @@
// Variables: // Variables:
extern bool IsUsbBasicKeyboardReportSent; extern bool IsUsbBasicKeyboardReportSent;
extern usb_device_class_struct_t UsbBasicKeyboardClass; extern uint32_t UsbBasicKeyboardActionCounter;
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport; extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
// Functions: // Functions:

View File

@@ -1,47 +1,7 @@
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "usb_interface_generic_hid.h"
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
static usb_device_endpoint_struct_t UsbGenericHidEndpoints[USB_GENERIC_HID_ENDPOINT_COUNT] = uint32_t UsbGenericHidActionCounter;
{
{
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,
};
uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH]; uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH];
uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_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, USB_GENERIC_HID_ENDPOINT_IN_INDEX,
GenericHidOutBuffer, GenericHidOutBuffer,
USB_GENERIC_HID_OUT_BUFFER_LENGTH); USB_GENERIC_HID_OUT_BUFFER_LENGTH);
UsbGenericHidActionCounter++;
return UsbReceiveData(); return UsbReceiveData();
break; break;
case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventGetReport:

View File

@@ -25,7 +25,7 @@
// Variables: // 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 GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH];
extern uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH]; extern uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];

View File

@@ -1,44 +1,6 @@
#include "key_action.h"
#include "fsl_port.h"
#include "usb_api.h"
#include "usb_composite_device.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]; static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports; usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
bool IsUsbMediaKeyboardReportSent = false; bool IsUsbMediaKeyboardReportSent = false;
@@ -64,6 +26,7 @@ static usb_status_t UsbMediaKeyboardAction(void)
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); (uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
IsUsbMediaKeyboardReportSent = true; IsUsbMediaKeyboardReportSent = true;
UsbMediaKeyboardActionCounter++;
return status; return status;
} }

View File

@@ -29,7 +29,7 @@
// Variables: // Variables:
extern bool IsUsbMediaKeyboardReportSent; extern bool IsUsbMediaKeyboardReportSent;
extern usb_device_class_struct_t UsbMediaKeyboardClass; extern uint32_t UsbMediaKeyboardActionCounter;
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport; extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
// Functions: // Functions:

View File

@@ -1,45 +1,7 @@
#include "usb_composite_device.h" #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] = {{ uint32_t UsbMouseActionCounter;
USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), static usb_mouse_report_t usbMouseReports[2];
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];
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports; usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
bool IsUsbMouseReportSent = false; bool IsUsbMouseReportSent = false;
@@ -58,16 +20,9 @@ void ResetActiveUsbMouseReport(void)
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); 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) static volatile usb_status_t usbMouseAction(void)
{ {
count3++;
usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport(); usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport();
SetDebugBufferUint16(29, mouseReport->x);
SetDebugBufferUint16(31, mouseReport->y);
IsUsbMouseReportSent = true; IsUsbMouseReportSent = true;
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
(uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH); (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) usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
{ {
SetDebugBufferUint32(17, count1); UsbMouseActionCounter++;
SetDebugBufferUint32(21, count2);
SetDebugBufferUint32(25, count3);
count1++;
usb_status_t error = kStatus_USB_Error; usb_status_t error = kStatus_USB_Error;
switch (event) { switch (event) {
case kUSB_DeviceHidEventSendResponse: case kUSB_DeviceHidEventSendResponse:
count2++;
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
return usbMouseAction(); return usbMouseAction();
} }

View File

@@ -32,7 +32,7 @@
// Variables: // Variables:
extern bool IsUsbMouseReportSent; extern bool IsUsbMouseReportSent;
extern usb_device_class_struct_t UsbMouseClass; extern uint32_t UsbMouseActionCounter;
extern usb_mouse_report_t* ActiveUsbMouseReport; extern usb_mouse_report_t* ActiveUsbMouseReport;
// Functions: // Functions:

View File

@@ -1,44 +1,6 @@
#include "key_action.h"
#include "fsl_port.h"
#include "usb_api.h"
#include "usb_composite_device.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]; static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports; usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
bool IsUsbSystemKeyboardReportSent = false; bool IsUsbSystemKeyboardReportSent = false;
@@ -64,6 +26,7 @@ static usb_status_t UsbSystemKeyboardAction(void)
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); (uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
IsUsbSystemKeyboardReportSent = true; IsUsbSystemKeyboardReportSent = true;
UsbSystemKeyboardActionCounter++;
return status; return status;
} }

View File

@@ -30,7 +30,7 @@
// Variables: // Variables:
extern bool IsUsbSystemKeyboardReportSent; extern bool IsUsbSystemKeyboardReportSent;
extern usb_device_class_struct_t UsbSystemKeyboardClass; extern uint32_t UsbSystemKeyboardActionCounter;
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport; extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
// Functions: // Functions:

View File

@@ -7,7 +7,7 @@
#include "usb_commands/usb_command_apply_config.h" #include "usb_commands/usb_command_apply_config.h"
#include "usb_commands/usb_command_set_led_pwm_brightness.h" #include "usb_commands/usb_command_set_led_pwm_brightness.h"
#include "usb_commands/usb_command_get_adc_value.h" #include "usb_commands/usb_command_get_adc_value.h"
#include "usb_commands/usb_command_launch_eeprom_transfer_legacy.h" #include "usb_commands/usb_command_launch_eeprom_transfer.h"
#include "usb_commands/usb_command_read_config.h" #include "usb_commands/usb_command_read_config.h"
#include "usb_commands/usb_command_get_keyboard_state.h" #include "usb_commands/usb_command_get_keyboard_state.h"
#include "usb_commands/usb_command_get_debug_buffer.h" #include "usb_commands/usb_command_get_debug_buffer.h"
@@ -25,45 +25,42 @@ void UsbProtocolHandler(void)
case UsbCommandId_Reenumerate: case UsbCommandId_Reenumerate:
UsbCommand_Reenumerate(); UsbCommand_Reenumerate();
break; break;
case UsbCommandId_SetTestLed:
UsbCommand_SetTestLed();
break;
case UsbCommandId_WriteUserConfig:
UsbCommand_WriteConfig(false);
break;
case UsbCommandId_ApplyConfig:
UsbCommand_ApplyConfig();
break;
case UsbCommandId_SetLedPwmBrightness:
UsbCommand_SetLedPwmBrightness();
break;
case UsbCommandId_GetAdcValue:
UsbCommand_GetAdcValue();
break;
case UsbCommandId_LaunchEepromTransferLegacy:
UsbCommand_LaunchEepromTransferLegacy();
break;
case UsbCommandId_ReadHardwareConfig:
UsbCommand_ReadConfig(true);
break;
case UsbCommandId_WriteHardwareConfig:
UsbCommand_WriteConfig(true);
break;
case UsbCommandId_ReadUserConfig:
UsbCommand_ReadConfig(false);
break;
case UsbCommandId_GetKeyboardState:
UsbCommand_GetKeyboardState();
break;
case UsbCommandId_GetDebugBuffer:
UsbCommand_GetDebugBuffer();
break;
case UsbCommandId_JumpToModuleBootloader: case UsbCommandId_JumpToModuleBootloader:
UsbCommand_JumpToModuleBootloader(); UsbCommand_JumpToModuleBootloader();
break; break;
case UsbCommandId_SendKbootCommandToModule: case UsbCommandId_SendKbootCommandToModule:
UsbCommand_SendKbootCommandToModule(); UsbCommand_SendKbootCommandToModule();
break; break;
case UsbCommandId_ReadConfig:
UsbCommand_ReadConfig();
break;
case UsbCommandId_WriteHardwareConfig:
UsbCommand_WriteConfig(ConfigBufferId_HardwareConfig);
break;
case UsbCommandId_WriteStagingUserConfig:
UsbCommand_WriteConfig(ConfigBufferId_StagingUserConfig);
break;
case UsbCommandId_ApplyConfig:
UsbCommand_ApplyConfig();
break;
case UsbCommandId_LaunchEepromTransfer:
UsbCommand_LaunchEepromTransfer();
break;
case UsbCommandId_GetDeviceState:
UsbCommand_GetKeyboardState();
break;
case UsbCommandId_SetTestLed:
UsbCommand_SetTestLed();
break;
case UsbCommandId_GetDebugBuffer:
UsbCommand_GetDebugBuffer();
break;
case UsbCommandId_GetAdcValue:
UsbCommand_GetAdcValue();
break;
case UsbCommandId_SetLedPwmBrightness:
UsbCommand_SetLedPwmBrightness();
break;
default: default:
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand); SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
break; break;

View File

@@ -13,21 +13,23 @@
// Typedefs: // Typedefs:
typedef enum { typedef enum {
UsbCommandId_GetProperty = 0x00, UsbCommandId_GetProperty = 0x00,
UsbCommandId_Reenumerate = 0x01,
UsbCommandId_SetTestLed = 0x02, UsbCommandId_Reenumerate = 0x01,
UsbCommandId_WriteUserConfig = 0x08, UsbCommandId_JumpToModuleBootloader = 0x02,
UsbCommandId_ApplyConfig = 0x09, UsbCommandId_SendKbootCommandToModule = 0x03,
UsbCommandId_SetLedPwmBrightness = 0x0A,
UsbCommandId_GetAdcValue = 0x0B, UsbCommandId_ReadConfig = 0x04,
UsbCommandId_LaunchEepromTransferLegacy = 0x0C, UsbCommandId_WriteHardwareConfig = 0x05,
UsbCommandId_ReadHardwareConfig = 0x0D, UsbCommandId_WriteStagingUserConfig = 0x06,
UsbCommandId_WriteHardwareConfig = 0x0E, UsbCommandId_ApplyConfig = 0x07,
UsbCommandId_ReadUserConfig = 0x0F, UsbCommandId_LaunchEepromTransfer = 0x08,
UsbCommandId_GetKeyboardState = 0x10,
UsbCommandId_GetDebugBuffer = 0x11, UsbCommandId_GetDeviceState = 0x09,
UsbCommandId_JumpToModuleBootloader = 0x12, UsbCommandId_SetTestLed = 0x0a,
UsbCommandId_SendKbootCommandToModule = 0x13, UsbCommandId_GetDebugBuffer = 0x0b,
UsbCommandId_GetAdcValue = 0x0c,
UsbCommandId_SetLedPwmBrightness = 0x0d,
} usb_command_id_t; } usb_command_id_t;
typedef enum { typedef enum {

View File

@@ -25,6 +25,7 @@ uint16_t DoubleTapSwitchLayerTimeout = 250;
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
mouse_kinetic_state_t MouseMoveState = { mouse_kinetic_state_t MouseMoveState = {
.isScroll = false,
.upState = SerializedMouseAction_MoveUp, .upState = SerializedMouseAction_MoveUp,
.downState = SerializedMouseAction_MoveDown, .downState = SerializedMouseAction_MoveDown,
.leftState = SerializedMouseAction_MoveLeft, .leftState = SerializedMouseAction_MoveLeft,
@@ -38,6 +39,7 @@ mouse_kinetic_state_t MouseMoveState = {
}; };
mouse_kinetic_state_t MouseScrollState = { mouse_kinetic_state_t MouseScrollState = {
.isScroll = true,
.upState = SerializedMouseAction_ScrollDown, .upState = SerializedMouseAction_ScrollDown,
.downState = SerializedMouseAction_ScrollUp, .downState = SerializedMouseAction_ScrollUp,
.leftState = SerializedMouseAction_ScrollLeft, .leftState = SerializedMouseAction_ScrollLeft,
@@ -97,10 +99,21 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
float distance = kineticState->currentSpeed * elapsedTime / 1000; float distance = kineticState->currentSpeed * elapsedTime / 1000;
if (kineticState->isScroll && !kineticState->wasMoveAction) {
kineticState->xSum = 0;
kineticState->ySum = 0;
}
// Update horizontal state
bool horizontalMovement = true;
if (activeMouseStates[kineticState->leftState]) { if (activeMouseStates[kineticState->leftState]) {
kineticState->xSum -= distance; kineticState->xSum -= distance;
} else if (activeMouseStates[kineticState->rightState]) { } else if (activeMouseStates[kineticState->rightState]) {
kineticState->xSum += distance; kineticState->xSum += distance;
} else {
horizontalMovement = false;
} }
float xSumInt; float xSumInt;
@@ -108,16 +121,31 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
kineticState->xSum = xSumFrac; kineticState->xSum = xSumFrac;
kineticState->xOut = xSumInt; kineticState->xOut = xSumInt;
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0 && horizontalMovement) {
kineticState->xOut = kineticState->xSum > 0 ? 1 : -1;
kineticState->xSum = 0;
}
// Update vertical state
bool verticalMovement = true;
if (activeMouseStates[kineticState->upState]) { if (activeMouseStates[kineticState->upState]) {
kineticState->ySum -= distance; kineticState->ySum -= distance;
} else if (activeMouseStates[kineticState->downState]) { } else if (activeMouseStates[kineticState->downState]) {
kineticState->ySum += distance; kineticState->ySum += distance;
} else {
verticalMovement = false;
} }
float ySumInt; float ySumInt;
float ySumFrac = modff(kineticState->ySum, &ySumInt); float ySumFrac = modff(kineticState->ySum, &ySumInt);
kineticState->ySum = ySumFrac; kineticState->ySum = ySumFrac;
kineticState->yOut = ySumInt; kineticState->yOut = ySumInt;
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0 && verticalMovement) {
kineticState->yOut = kineticState->ySum > 0 ? 1 : -1;
kineticState->ySum = 0;
}
} else { } else {
kineticState->currentSpeed = 0; kineticState->currentSpeed = 0;
} }
@@ -207,7 +235,7 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
case KeyActionType_SwitchLayer: case KeyActionType_SwitchLayer:
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) { if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
if (doubleTapSwitchLayerKey) { if (doubleTapSwitchLayerKey) {
if (Timer_GetElapsedTime(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) { if (Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
ToggledLayer = action->switchLayer.layer; ToggledLayer = action->switchLayer.layer;
} }
doubleTapSwitchLayerKey = NULL; doubleTapSwitchLayerKey = NULL;
@@ -230,12 +258,14 @@ static uint8_t secondaryRoleSlotId;
static uint8_t secondaryRoleKeyId; static uint8_t secondaryRoleKeyId;
static secondary_role_t secondaryRole; static secondary_role_t secondaryRole;
#define pos 35
void updateActiveUsbReports(void) void updateActiveUsbReports(void)
{ {
SetDebugBufferUint32(pos, 1);
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT); memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
static uint8_t previousModifiers = 0; static uint8_t previousModifiers = 0;
elapsedTime = Timer_GetElapsedTime(&UsbReportUpdateTime); elapsedTime = Timer_GetElapsedTimeAndSetCurrent(&UsbReportUpdateTime);
basicScancodeIndex = 0; basicScancodeIndex = 0;
mediaScancodeIndex = 0; mediaScancodeIndex = 0;
@@ -263,6 +293,7 @@ void updateActiveUsbReports(void)
memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport); memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
return; return;
} }
SetDebugBufferUint32(pos, 2);
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) { for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) { for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
@@ -316,8 +347,10 @@ void updateActiveUsbReports(void)
keyState->previous = keyState->current; keyState->previous = keyState->current;
} }
} }
SetDebugBufferUint32(pos, 4);
processMouseActions(); processMouseActions();
SetDebugBufferUint32(pos, 5);
// When a layer switcher key gets pressed along with another key that produces some modifiers // When a layer switcher key gets pressed along with another key that produces some modifiers
// and the accomanying key gets released then keep the related modifiers active a long as the // and the accomanying key gets released then keep the related modifiers active a long as the
@@ -332,6 +365,7 @@ void updateActiveUsbReports(void)
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers; previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
previousLayer = activeLayer; previousLayer = activeLayer;
SetDebugBufferUint32(pos, 7);
} }
bool UsbBasicKeyboardReportEverSent = false; bool UsbBasicKeyboardReportEverSent = false;
@@ -339,8 +373,20 @@ bool UsbMediaKeyboardReportEverSent = false;
bool UsbSystemKeyboardReportEverSent = false; bool UsbSystemKeyboardReportEverSent = false;
bool UsbMouseReportEverSentEverSent = false; bool UsbMouseReportEverSentEverSent = false;
uint32_t UsbReportUpdateCounter;
static uint32_t lastUsbUpdateTime;
void UpdateUsbReports(void) void UpdateUsbReports(void)
{ {
UsbReportUpdateCounter++;
if (Timer_GetElapsedTime(&lastUsbUpdateTime) > 100) {
UsbBasicKeyboardReportEverSent = false;
UsbMediaKeyboardReportEverSent = false;
UsbSystemKeyboardReportEverSent = false;
UsbMouseReportEverSentEverSent = false;
}
if (IsUsbBasicKeyboardReportSent) { if (IsUsbBasicKeyboardReportSent) {
UsbBasicKeyboardReportEverSent = true; UsbBasicKeyboardReportEverSent = true;
} }
@@ -387,4 +433,6 @@ void UpdateUsbReports(void)
IsUsbMediaKeyboardReportSent = false; IsUsbMediaKeyboardReportSent = false;
IsUsbSystemKeyboardReportSent = false; IsUsbSystemKeyboardReportSent = false;
IsUsbMouseReportSent = false; IsUsbMouseReportSent = false;
Timer_SetCurrentTime(&lastUsbUpdateTime);
} }

View File

@@ -43,6 +43,7 @@
} mouse_speed_t; } mouse_speed_t;
typedef struct { typedef struct {
bool isScroll;
bool wasMoveAction; bool wasMoveAction;
serialized_mouse_action_t upState; serialized_mouse_action_t upState;
serialized_mouse_action_t downState; serialized_mouse_action_t downState;
@@ -68,6 +69,7 @@
extern uint16_t DoubleTapSwitchLayerTimeout; extern uint16_t DoubleTapSwitchLayerTimeout;
extern mouse_kinetic_state_t MouseMoveState; extern mouse_kinetic_state_t MouseMoveState;
extern mouse_kinetic_state_t MouseScrollState; extern mouse_kinetic_state_t MouseScrollState;
extern uint32_t UsbReportUpdateCounter;
// Functions: // Functions:

41
scripts/generate-versions-h.js Executable file
View File

@@ -0,0 +1,41 @@
#!/usr/bin/env node
const fs = require('fs');
const versionPropertyPrefixes = ['firmware', 'deviceProtocol', 'moduleProtocol', 'userConfig', 'hardwareConfig'];
const patchVersions = ['Major', 'Minor', 'Patch'];
const package = JSON.parse(fs.readFileSync(`${__dirname}/package.json`));
const versionVariables = versionPropertyPrefixes.map(versionPropertyPrefix => {
const versionPropertyName = `${versionPropertyPrefix}Version`
const versionPropertyValues = package[versionPropertyName].split('.');
return patchVersions.map(patchVersion => {
const versionPropertyValue = versionPropertyValues.shift();
const versionPropertyMacroName = `${versionPropertyPrefix}${patchVersion}Version`.split(/(?=[A-Z])/).join('_').toUpperCase()
return ` #define ${versionPropertyMacroName} ${versionPropertyValue}`;
}).join('\n') + '\n';
}).join('\n');
fs.writeFileSync(`${__dirname}/../shared/versions.h`,
`// Please do not edit this file by hand!
// It is to be regenerated by /scripts/generate-versions-h.js
#ifndef __VERSIONS_H__
#define __VERSIONS_H__
// Includes:
#include "fsl_common.h"
// Typedefs:
typedef struct {
uint16_t major;
uint16_t minor;
uint16_t patch;
} version_t;
// Variables:
${versionVariables}
#endif
`);

View File

@@ -5,8 +5,10 @@ require('shelljs/global');
config.fatal = true; config.fatal = true;
config.verbose = true; config.verbose = true;
exec(`${__dirname}/generate-versions-h.js`);
const package = JSON.parse(fs.readFileSync(`${__dirname}/package.json`)); const package = JSON.parse(fs.readFileSync(`${__dirname}/package.json`));
const version = package.version; const version = package.firmwareVersion;
const releaseName = `uhk-firmware-${version}`; const releaseName = `uhk-firmware-${version}`;
const releaseDir = `${__dirname}/${releaseName}`; const releaseDir = `${__dirname}/${releaseName}`;
const modulesDir = `${releaseDir}/modules`; const modulesDir = `${releaseDir}/modules`;
@@ -28,7 +30,7 @@ exec(`/opt/Freescale/KDS_v3/eclipse/kinetis-design-studio \
-cleanBuild uhk-right` -cleanBuild uhk-right`
); );
for (let device of package.devices) { for (const device of package.devices) {
const deviceDir = `${releaseDir}/devices/${device.name}`; const deviceDir = `${releaseDir}/devices/${device.name}`;
const deviceSource = `${__dirname}/../${device.source}`; const deviceSource = `${__dirname}/../${device.source}`;
mkdir('-p', deviceDir); mkdir('-p', deviceDir);
@@ -37,7 +39,7 @@ for (let device of package.devices) {
exec(`${usbDir}/user-config-json-to-bin.ts ${deviceDir}/config.bin`); exec(`${usbDir}/user-config-json-to-bin.ts ${deviceDir}/config.bin`);
} }
for (let module of package.modules) { for (const module of package.modules) {
const moduleDir = `${releaseDir}/modules`; const moduleDir = `${releaseDir}/modules`;
const moduleSource = `${__dirname}/../${module.source}`; const moduleSource = `${__dirname}/../${module.source}`;
mkdir('-p', moduleDir); mkdir('-p', moduleDir);

View File

@@ -15,10 +15,11 @@
"commander": "^2.11.0", "commander": "^2.11.0",
"shelljs": "^0.7.8" "shelljs": "^0.7.8"
}, },
"version": "5.0.0", "firmwareVersion": "7.0.0",
"dataModelVersion": "4.0.0", "deviceProtocolVersion": "4.0.0",
"usbProtocolVersion": "2.0.0", "moduleProtocolVersion": "3.0.0",
"slaveProtocolVersion": "3.0.0", "userConfigVersion": "4.0.0",
"hardwareConfigVersion": "1.0.0",
"devices": [ "devices": [
{ {
"deviceId": 1, "deviceId": 1,

41
shared/versions.h Normal file
View File

@@ -0,0 +1,41 @@
// Please do not edit this file by hand!
// It is to be regenerated by /scripts/generate-versions-h.js
#ifndef __VERSIONS_H__
#define __VERSIONS_H__
// Includes:
#include "fsl_common.h"
// Typedefs:
typedef struct {
uint16_t major;
uint16_t minor;
uint16_t patch;
} version_t;
// Variables:
#define FIRMWARE_MAJOR_VERSION 6
#define FIRMWARE_MINOR_VERSION 0
#define FIRMWARE_PATCH_VERSION 0
#define DEVICE_PROTOCOL_MAJOR_VERSION 3
#define DEVICE_PROTOCOL_MINOR_VERSION 0
#define DEVICE_PROTOCOL_PATCH_VERSION 0
#define MODULE_PROTOCOL_MAJOR_VERSION 3
#define MODULE_PROTOCOL_MINOR_VERSION 0
#define MODULE_PROTOCOL_PATCH_VERSION 0
#define USER_CONFIG_MAJOR_VERSION 4
#define USER_CONFIG_MINOR_VERSION 0
#define USER_CONFIG_PATCH_VERSION 0
#define HARDWARE_CONFIG_MAJOR_VERSION 1
#define HARDWARE_CONFIG_MINOR_VERSION 0
#define HARDWARE_CONFIG_PATCH_VERSION 0
#endif