Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
21
CHANGELOG.md
21
CHANGELOG.md
@@ -5,6 +5,27 @@ 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.
|
||||||
|
|
||||||
|
## [5.0.1] - 2017-12-09
|
||||||
|
|
||||||
|
Data Model: 4.0.0 (unchanged) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
|
||||||
|
|
||||||
|
- Make key presses continue to emit scancodes even if a USB interface (typically the mouse interface) is not polled by the host anymore.
|
||||||
|
- Make scrolling always immediately react to keypresses regardless of the previous internal scroll state.
|
||||||
|
|
||||||
|
## [5.0.0] - 2017-12-04
|
||||||
|
|
||||||
|
Data Model: 4.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
|
||||||
|
|
||||||
|
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `DATAMODEL:MAJOR`
|
||||||
|
|
||||||
|
## [4.0.0] - 2017-11-30
|
||||||
|
|
||||||
|
Data Model: 3.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
|
||||||
|
|
||||||
|
- Implement mouse movement and scrolling deceleration and acceleration.
|
||||||
|
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
|
||||||
|
- Make the parser read additional user configuration properties: dataModelMajorVersion, dataModelMinorVersion, dataModelPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `DATAMODEL:MAJOR`
|
||||||
|
|
||||||
## [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)
|
Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protocol: 3.0.0 (major bump)
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ uint8_t ReadUInt8(config_buffer_t *buffer)
|
|||||||
uint16_t ReadUInt16(config_buffer_t *buffer)
|
uint16_t ReadUInt16(config_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
uint16_t uInt16 = ReadUInt8(buffer);
|
uint16_t uInt16 = ReadUInt8(buffer);
|
||||||
|
|
||||||
uInt16 |= ReadUInt8(buffer) << 8;
|
uInt16 |= ReadUInt8(buffer) << 8;
|
||||||
return uInt16;
|
return uInt16;
|
||||||
}
|
}
|
||||||
@@ -26,14 +25,12 @@ bool ReadBool(config_buffer_t *buffer)
|
|||||||
uint16_t ReadCompactLength(config_buffer_t *buffer)
|
uint16_t ReadCompactLength(config_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
uint16_t compactLength = ReadUInt8(buffer);
|
uint16_t compactLength = ReadUInt8(buffer);
|
||||||
|
|
||||||
return compactLength == 0xFF ? ReadUInt16(buffer) : compactLength;
|
return compactLength == 0xFF ? ReadUInt16(buffer) : compactLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *ReadString(config_buffer_t *buffer, uint16_t *len)
|
const char *ReadString(config_buffer_t *buffer, uint16_t *len)
|
||||||
{
|
{
|
||||||
const char *string;
|
const char *string;
|
||||||
|
|
||||||
*len = ReadCompactLength(buffer);
|
*len = ReadCompactLength(buffer);
|
||||||
string = (const char *)(buffer->buffer + buffer->offset);
|
string = (const char *)(buffer->buffer + buffer->offset);
|
||||||
buffer->offset += *len;
|
buffer->offset += *len;
|
||||||
|
|||||||
@@ -4,35 +4,95 @@
|
|||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
#include "config_globals.h"
|
#include "config_globals.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
|
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
uint8_t id = ReadUInt8(buffer);
|
uint8_t id = ReadUInt8(buffer);
|
||||||
uint8_t initialPointerSpeed = ReadUInt8(buffer);
|
uint8_t pointerMode = ReadUInt8(buffer); // move vs scroll
|
||||||
uint8_t pointerAcceleration = ReadUInt8(buffer);
|
uint8_t deceleratedPointerSpeedMultiplier = ReadUInt8(buffer);
|
||||||
uint8_t maxPointerSpeed = 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)id;
|
||||||
(void)initialPointerSpeed;
|
(void)pointerMode;
|
||||||
(void)pointerAcceleration;
|
(void)deceleratedPointerSpeedMultiplier;
|
||||||
(void)maxPointerSpeed;
|
(void)basePointerSpeedMultiplier;
|
||||||
|
(void)acceleratedPointerSpeed;
|
||||||
|
(void)angularShift;
|
||||||
|
(void)modLayerPointerFunction;
|
||||||
|
(void)fnLayerPointerFunction;
|
||||||
|
(void)mouseLayerPointerFunction;
|
||||||
|
|
||||||
return ParserError_Success;
|
return ParserError_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
parser_error_t ParseConfig(config_buffer_t *buffer)
|
parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
|
// Miscellaneous properties
|
||||||
|
|
||||||
uint16_t len;
|
uint16_t len;
|
||||||
uint16_t macroCount;
|
uint16_t macroCount;
|
||||||
uint16_t keymapCount;
|
uint16_t keymapCount;
|
||||||
parser_error_t errorCode;
|
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);
|
uint16_t userConfigLength = ReadUInt16(buffer);
|
||||||
(void)userConfigLength;
|
const char *deviceName = ReadString(buffer, &len);
|
||||||
ReadString(buffer, &len); // Ignore device name
|
uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
|
||||||
uint16_t moduleConfigurationCount = ReadCompactLength(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);
|
||||||
|
|
||||||
|
(void)iconsAndLayerTextsBrightness;
|
||||||
|
(void)alphanumericSegmentsBrightness;
|
||||||
|
(void)keyBacklightBrightness;
|
||||||
|
|
||||||
|
// 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) {
|
if (moduleConfigurationCount > 255) {
|
||||||
return ParserError_InvalidModuleConfigurationCount;
|
return ParserError_InvalidModuleConfigurationCount;
|
||||||
@@ -45,6 +105,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Macros
|
||||||
|
|
||||||
macroCount = ReadCompactLength(buffer);
|
macroCount = ReadCompactLength(buffer);
|
||||||
if (macroCount > MAX_MACRO_NUM) {
|
if (macroCount > MAX_MACRO_NUM) {
|
||||||
return ParserError_InvalidMacroCount;
|
return ParserError_InvalidMacroCount;
|
||||||
@@ -57,6 +119,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Keymaps
|
||||||
|
|
||||||
keymapCount = ReadCompactLength(buffer);
|
keymapCount = ReadCompactLength(buffer);
|
||||||
if (keymapCount == 0 || keymapCount > MAX_KEYMAP_NUM) {
|
if (keymapCount == 0 || keymapCount > MAX_KEYMAP_NUM) {
|
||||||
return ParserError_InvalidKeymapCount;
|
return ParserError_InvalidKeymapCount;
|
||||||
@@ -69,7 +133,23 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If parsing succeeded then apply the parsed values.
|
||||||
|
|
||||||
if (!ParserRunDry) {
|
if (!ParserRunDry) {
|
||||||
|
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
AllKeymapsCount = keymapCount;
|
AllKeymapsCount = keymapCount;
|
||||||
AllMacrosCount = macroCount;
|
AllMacrosCount = macroCount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,20 +8,21 @@
|
|||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ParserError_Success,
|
ParserError_Success = 0,
|
||||||
ParserError_InvalidSerializedKeystrokeType,
|
ParserError_InvalidSerializedKeystrokeType = 1,
|
||||||
ParserError_InvalidSerializedMouseAction,
|
ParserError_InvalidSerializedMouseAction = 2,
|
||||||
ParserError_InvalidSerializedKeyActionType,
|
ParserError_InvalidSerializedKeyActionType = 3,
|
||||||
ParserError_InvalidLayerCount,
|
ParserError_InvalidLayerCount = 4,
|
||||||
ParserError_InvalidModuleCount,
|
ParserError_InvalidModuleCount = 5,
|
||||||
ParserError_InvalidActionCount,
|
ParserError_InvalidActionCount = 6,
|
||||||
ParserError_InvalidSerializedMacroActionType,
|
ParserError_InvalidSerializedMacroActionType = 7,
|
||||||
ParserError_InvalidSerializedSwitchKeymapAction,
|
ParserError_InvalidSerializedSwitchKeymapAction = 8,
|
||||||
ParserError_InvalidModuleConfigurationCount,
|
ParserError_InvalidModuleConfigurationCount = 9,
|
||||||
ParserError_InvalidKeymapCount,
|
ParserError_InvalidKeymapCount = 10,
|
||||||
ParserError_InvalidAbbreviationLen,
|
ParserError_InvalidAbbreviationLen = 11,
|
||||||
ParserError_InvalidMacroCount,
|
ParserError_InvalidMacroCount = 12,
|
||||||
ParserError_InvalidSerializedPlayMacroAction,
|
ParserError_InvalidSerializedPlayMacroAction = 13,
|
||||||
|
ParserError_InvalidMouseKineticProperty = 14,
|
||||||
} parser_error_t;
|
} parser_error_t;
|
||||||
|
|
||||||
// Functions:
|
// 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)
|
static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
uint8_t layer = ReadUInt8(buffer) + 1;
|
uint8_t layer = ReadUInt8(buffer) + 1;
|
||||||
bool isToggle = ReadBool(buffer);
|
uint8_t mode = ReadBool(buffer) ? SwitchLayerMode_Toggle : SwitchLayerMode_HoldAndDoubleTapToggle;
|
||||||
|
|
||||||
KeyAction->type = KeyActionType_SwitchLayer;
|
KeyAction->type = KeyActionType_SwitchLayer;
|
||||||
KeyAction->switchLayer.layer = layer;
|
KeyAction->switchLayer.layer = layer;
|
||||||
KeyAction->switchLayer.isToggle = isToggle;
|
KeyAction->switchLayer.mode = mode;
|
||||||
return ParserError_Success;
|
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)
|
static parser_error_t parseMouseAction(key_action_t *keyAction, config_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
uint8_t mouseAction = ReadUInt8(buffer);
|
|
||||||
|
|
||||||
keyAction->type = KeyActionType_Mouse;
|
keyAction->type = KeyActionType_Mouse;
|
||||||
memset(&keyAction->mouse, 0, sizeof keyAction->mouse);
|
|
||||||
switch (mouseAction) {
|
uint8_t mouseAction = ReadUInt8(buffer);
|
||||||
case SerializedMouseAction_LeftClick:
|
if (mouseAction > SerializedMouseAction_Last) {
|
||||||
keyAction->mouse.buttonActions = MouseButton_Left;
|
return ParserError_InvalidSerializedMouseAction;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(&keyAction->mouseAction, 0, sizeof keyAction->mouseAction);
|
||||||
|
keyAction->mouseAction = mouseAction;
|
||||||
|
|
||||||
return ParserError_Success;
|
return ParserError_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +116,7 @@ static parser_error_t parseKeyAction(key_action_t *keyAction, config_buffer_t *b
|
|||||||
return ParserError_InvalidSerializedKeyActionType;
|
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;
|
parser_error_t errorCode;
|
||||||
uint16_t actionCount = ReadCompactLength(buffer);
|
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)
|
static parser_error_t parseModule(config_buffer_t *buffer, uint8_t layer)
|
||||||
{
|
{
|
||||||
uint8_t moduleId = ReadUInt8(buffer);
|
uint8_t moduleId = ReadUInt8(buffer);
|
||||||
uint8_t pointerRole = ReadUInt8(buffer);
|
return parseKeyActions(layer, buffer, moduleId);
|
||||||
|
|
||||||
return parseKeyActions(layer, buffer, moduleId, pointerRole);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static parser_error_t parseLayer(config_buffer_t *buffer, uint8_t layer)
|
static parser_error_t parseLayer(config_buffer_t *buffer, uint8_t layer)
|
||||||
|
|||||||
@@ -48,6 +48,10 @@
|
|||||||
SerializedMouseAction_ScrollRight,
|
SerializedMouseAction_ScrollRight,
|
||||||
SerializedMouseAction_Accelerate,
|
SerializedMouseAction_Accelerate,
|
||||||
SerializedMouseAction_Decelerate,
|
SerializedMouseAction_Decelerate,
|
||||||
|
SerializedMouseAction_Last = SerializedMouseAction_Decelerate,
|
||||||
|
SerializedMouseAction_Button_4,
|
||||||
|
SerializedMouseAction_Button_5,
|
||||||
|
SerializedMouseAction_Button_6,
|
||||||
} serialized_mouse_action_t;
|
} serialized_mouse_action_t;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ bool IsEepromBusy;
|
|||||||
static eeprom_operation_t CurrentEepromOperation;
|
static eeprom_operation_t CurrentEepromOperation;
|
||||||
static config_buffer_id_t CurrentConfigBufferId;
|
static config_buffer_id_t CurrentConfigBufferId;
|
||||||
status_t LastEepromTransferStatus;
|
status_t LastEepromTransferStatus;
|
||||||
void (*SuccessCallback)();
|
void (*SuccessCallback)(void);
|
||||||
|
|
||||||
static i2c_master_handle_t i2cHandle;
|
static i2c_master_handle_t i2cHandle;
|
||||||
static i2c_master_transfer_t i2cTransfer;
|
static i2c_master_transfer_t i2cTransfer;
|
||||||
@@ -21,7 +21,6 @@ static uint16_t eepromStartAddress;
|
|||||||
static uint16_t sourceLength;
|
static uint16_t sourceLength;
|
||||||
static uint8_t writeLength;
|
static uint8_t writeLength;
|
||||||
static bool isReadSent;
|
static bool isReadSent;
|
||||||
static uint8_t addressBuffer[EEPROM_ADDRESS_LENGTH];
|
|
||||||
|
|
||||||
static status_t i2cAsyncWrite(uint8_t *data, size_t dataSize)
|
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 status_t writePage(void)
|
||||||
{
|
{
|
||||||
static uint8_t buffer[EEPROM_BUFFER_SIZE];
|
static uint8_t buffer[EEPROM_BUFFER_SIZE];
|
||||||
uint16_t targetEepromOffset = sourceOffset + eepromStartAddress;
|
SetBufferUint16Be(buffer, 0, eepromStartAddress + sourceOffset);
|
||||||
SetBufferUint16Be(buffer, 0, targetEepromOffset);
|
|
||||||
writeLength = MIN(sourceLength - sourceOffset, EEPROM_PAGE_SIZE);
|
writeLength = MIN(sourceLength - sourceOffset, EEPROM_PAGE_SIZE);
|
||||||
memcpy(buffer+EEPROM_ADDRESS_LENGTH, sourceBuffer+sourceOffset, writeLength);
|
memcpy(buffer+EEPROM_ADDRESS_SIZE, sourceBuffer+sourceOffset, writeLength);
|
||||||
status_t status = i2cAsyncWrite(buffer, writeLength+EEPROM_ADDRESS_LENGTH);
|
status_t status = i2cAsyncWrite(buffer, writeLength+EEPROM_ADDRESS_SIZE);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,16 +102,17 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
|
|||||||
|
|
||||||
CurrentEepromOperation = operation;
|
CurrentEepromOperation = operation;
|
||||||
CurrentConfigBufferId = config_buffer_id;
|
CurrentConfigBufferId = config_buffer_id;
|
||||||
|
|
||||||
SuccessCallback = successCallback;
|
SuccessCallback = successCallback;
|
||||||
|
|
||||||
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
|
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
|
||||||
eepromStartAddress = isHardwareConfig ? 0 : HARDWARE_CONFIG_SIZE;
|
eepromStartAddress = isHardwareConfig ? 0 : HARDWARE_CONFIG_SIZE;
|
||||||
SetBufferUint16Be(addressBuffer, 0, eepromStartAddress);
|
|
||||||
|
|
||||||
switch (CurrentEepromOperation) {
|
switch (CurrentEepromOperation) {
|
||||||
case EepromOperation_Read:
|
case EepromOperation_Read:
|
||||||
isReadSent = false;
|
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;
|
break;
|
||||||
case EepromOperation_Write:
|
case EepromOperation_Write:
|
||||||
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;
|
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;
|
||||||
|
|||||||
@@ -11,9 +11,9 @@
|
|||||||
#define HARDWARE_CONFIG_SIZE 64
|
#define HARDWARE_CONFIG_SIZE 64
|
||||||
#define USER_CONFIG_SIZE (EEPROM_SIZE - HARDWARE_CONFIG_SIZE)
|
#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_PAGE_SIZE 64
|
||||||
#define EEPROM_BUFFER_SIZE (EEPROM_ADDRESS_LENGTH + EEPROM_PAGE_SIZE)
|
#define EEPROM_BUFFER_SIZE (EEPROM_ADDRESS_SIZE + EEPROM_PAGE_SIZE)
|
||||||
|
|
||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,9 @@
|
|||||||
// Main bus
|
// Main bus
|
||||||
|
|
||||||
#define I2C_MAIN_BUS_BASEADDR I2C0
|
#define I2C_MAIN_BUS_BASEADDR I2C0
|
||||||
#define I2C_MASTER_BUS_CLK_SRC I2C0_CLK_SRC
|
#define I2C_MAIN_BUS_IRQ_ID I2C0_IRQn
|
||||||
#define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable.
|
#define I2C_MAIN_BUS_CLK_SRC I2C0_CLK_SRC
|
||||||
|
#define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable.
|
||||||
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7
|
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7
|
||||||
|
|
||||||
#define I2C_MAIN_BUS_SDA_GPIO GPIOD
|
#define I2C_MAIN_BUS_SDA_GPIO GPIOD
|
||||||
@@ -28,8 +29,9 @@
|
|||||||
// EEPROM bus
|
// EEPROM bus
|
||||||
|
|
||||||
#define I2C_EEPROM_BUS_BASEADDR I2C1
|
#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_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_MUX kPORT_MuxAlt2
|
||||||
|
|
||||||
#define I2C_EEPROM_BUS_SDA_PORT PORTC
|
#define I2C_EEPROM_BUS_SDA_PORT PORTC
|
||||||
|
|||||||
@@ -8,20 +8,22 @@
|
|||||||
#include "peripherals/led_driver.h"
|
#include "peripherals/led_driver.h"
|
||||||
#include "peripherals/merge_sensor.h"
|
#include "peripherals/merge_sensor.h"
|
||||||
#include "led_pwm.h"
|
#include "led_pwm.h"
|
||||||
#include "slave_scheduler.h"
|
|
||||||
#include "peripherals/adc.h"
|
#include "peripherals/adc.h"
|
||||||
#include "init_peripherals.h"
|
#include "init_peripherals.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "microseconds/microseconds_pit.c"
|
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_debouncer.h"
|
#include "key_debouncer.h"
|
||||||
|
#include "usb_api.h"
|
||||||
|
|
||||||
void InitInterruptPriorities(void)
|
void InitInterruptPriorities(void)
|
||||||
{
|
{
|
||||||
NVIC_SetPriority(I2C0_IRQn, 1);
|
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||||
NVIC_SetPriority(I2C1_IRQn, 1);
|
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
|
||||||
NVIC_SetPriority(USB0_IRQn, 1);
|
NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 3);
|
||||||
NVIC_SetPriority(PIT1_IRQn, 6);
|
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)
|
void delay(void)
|
||||||
@@ -77,7 +79,7 @@ void InitI2cMainBus(void)
|
|||||||
i2c_master_config_t masterConfig;
|
i2c_master_config_t masterConfig;
|
||||||
I2C_MasterGetDefaultConfig(&masterConfig);
|
I2C_MasterGetDefaultConfig(&masterConfig);
|
||||||
masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE;
|
masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE;
|
||||||
uint32_t sourceClock = CLOCK_GetFreq(I2C_MASTER_BUS_CLK_SRC);
|
uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC);
|
||||||
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock);
|
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,5 +127,4 @@ void InitPeripherals(void)
|
|||||||
#endif
|
#endif
|
||||||
InitKeyDebouncer();
|
InitKeyDebouncer();
|
||||||
EEPROM_Init();
|
EEPROM_Init();
|
||||||
//microseconds_init();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef __ACTION_H__
|
#ifndef __KEY_ACTION_H__
|
||||||
#define __ACTION_H__
|
#define __KEY_ACTION_H__
|
||||||
|
|
||||||
// Includes:
|
// Includes:
|
||||||
|
|
||||||
@@ -7,16 +7,8 @@
|
|||||||
#include "attributes.h"
|
#include "attributes.h"
|
||||||
#include "lufa/HIDClassCommon.h"
|
#include "lufa/HIDClassCommon.h"
|
||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
#include "main.h"
|
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
|
#include "config_parser/parse_keymap.h"
|
||||||
// Macros:
|
|
||||||
|
|
||||||
#define MOUSE_WHEEL_SPEED 1
|
|
||||||
#define MOUSE_WHEEL_DIVISOR 4
|
|
||||||
|
|
||||||
#define MOUSE_MAX_SPEED 10
|
|
||||||
#define MOUSE_SPEED_ACCEL_DIVISOR 50
|
|
||||||
|
|
||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
@@ -36,32 +28,21 @@
|
|||||||
KeystrokeType_System,
|
KeystrokeType_System,
|
||||||
} keystroke_type_t;
|
} keystroke_type_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SwitchLayerMode_Hold,
|
||||||
|
SwitchLayerMode_HoldAndDoubleTapToggle,
|
||||||
|
SwitchLayerMode_Toggle,
|
||||||
|
} switch_layer_mode_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MouseButton_Left = 1 << 0,
|
MouseButton_Left = 1 << 0,
|
||||||
MouseButton_Right = 1 << 1,
|
MouseButton_Right = 1 << 1,
|
||||||
MouseButton_Middle = 1 << 2,
|
MouseButton_Middle = 1 << 2,
|
||||||
MouseButton_4 = 1 << 3,
|
MouseButton_4 = 1 << 3,
|
||||||
MouseButton_5 = 1 << 4,
|
MouseButton_5 = 1 << 4,
|
||||||
MouseButton_t = 1 << 5,
|
MouseButton_6 = 1 << 5,
|
||||||
} mouse_button_t;
|
} 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 {
|
typedef struct {
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
union {
|
union {
|
||||||
@@ -71,13 +52,9 @@
|
|||||||
uint8_t modifiers;
|
uint8_t modifiers;
|
||||||
uint16_t scancode;
|
uint16_t scancode;
|
||||||
} ATTR_PACKED keystroke;
|
} ATTR_PACKED keystroke;
|
||||||
|
serialized_mouse_action_t mouseAction;
|
||||||
struct {
|
struct {
|
||||||
mouse_button_t buttonActions;
|
switch_layer_mode_t mode;
|
||||||
mouse_scroll_t scrollActions;
|
|
||||||
mouse_move_action_t moveActions;
|
|
||||||
} ATTR_PACKED mouse;
|
|
||||||
struct {
|
|
||||||
bool isToggle;
|
|
||||||
uint8_t layer;
|
uint8_t layer;
|
||||||
} ATTR_PACKED switchLayer;
|
} ATTR_PACKED switchLayer;
|
||||||
struct {
|
struct {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -332,23 +332,23 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
|||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
|
|
||||||
// Row 2
|
// Row 2
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_4 }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_4 },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Up }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveUp },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_5 }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_5 },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_t }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_6 },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .scrollActions = MouseScroll_Up }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_ScrollUp },
|
||||||
|
|
||||||
// Row 3
|
// Row 3
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Left }},
|
{ .type = KeyActionType_Mouse, .mouseAction= SerializedMouseAction_MoveLeft },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Down }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveDown },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Right }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveRight },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .scrollActions = MouseScroll_Down }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_ScrollDown },
|
||||||
|
|
||||||
// Row 4
|
// Row 4
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
@@ -391,9 +391,9 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
|
|||||||
// Row 3
|
// Row 3
|
||||||
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
|
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Right }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_RightClick },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Middle }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MiddleClick },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Left }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_LeftClick },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .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_GUI }},
|
||||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Decelerate }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Decelerate },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Accelerate }},
|
{ .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Accelerate },
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
|
|
||||||
static bool heldLayers[LAYER_COUNT];
|
static bool heldLayers[LAYER_COUNT];
|
||||||
static bool pressedLayers[LAYER_COUNT];
|
static switch_layer_mode_t pressedLayers[LAYER_COUNT];
|
||||||
|
|
||||||
void updateLayerStates(void)
|
void updateLayerStates(void)
|
||||||
{
|
{
|
||||||
@@ -18,10 +18,11 @@ void updateLayerStates(void)
|
|||||||
if (keyState->current) {
|
if (keyState->current) {
|
||||||
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
|
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
|
||||||
if (action.type == KeyActionType_SwitchLayer) {
|
if (action.type == KeyActionType_SwitchLayer) {
|
||||||
if (!action.switchLayer.isToggle) {
|
if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
|
||||||
heldLayers[action.switchLayer.layer] = true;
|
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 PreviousHeldLayer = LayerId_Base;
|
||||||
|
layer_id_t ToggledLayer = LayerId_Base;
|
||||||
|
|
||||||
layer_id_t GetActiveLayer()
|
layer_id_t GetActiveLayer()
|
||||||
{
|
{
|
||||||
@@ -37,22 +39,20 @@ layer_id_t GetActiveLayer()
|
|||||||
|
|
||||||
// Handle toggled layers
|
// Handle toggled layers
|
||||||
|
|
||||||
static layer_id_t toggledLayer = LayerId_Base;
|
|
||||||
|
|
||||||
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
|
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
|
||||||
if (pressedLayers[layerId]) {
|
if (pressedLayers[layerId]) {
|
||||||
if (toggledLayer == layerId) {
|
if (ToggledLayer == layerId) {
|
||||||
toggledLayer = LayerId_Base;
|
ToggledLayer = LayerId_Base;
|
||||||
break;
|
break;
|
||||||
} else if (toggledLayer == LayerId_Base) {
|
} else if (ToggledLayer == LayerId_Base && pressedLayers[layerId] == SwitchLayerMode_Toggle) {
|
||||||
toggledLayer = layerId;
|
ToggledLayer = layerId;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toggledLayer != LayerId_Base) {
|
if (ToggledLayer != LayerId_Base) {
|
||||||
return toggledLayer;
|
return ToggledLayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle held layers
|
// Handle held layers
|
||||||
|
|||||||
@@ -21,10 +21,10 @@
|
|||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern layer_id_t PreviousHeldLayer;
|
extern layer_id_t PreviousHeldLayer;
|
||||||
|
extern layer_id_t ToggledLayer;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
layer_id_t GetActiveLayer();
|
layer_id_t GetActiveLayer();
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,79 +1,16 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "main.h"
|
|
||||||
#include "init_clock.h"
|
#include "init_clock.h"
|
||||||
#include "init_peripherals.h"
|
#include "init_peripherals.h"
|
||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
#include "peripherals/led_driver.h"
|
|
||||||
#include "key_action.h"
|
|
||||||
#include "slave_scheduler.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 "bus_pal_hardware.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "bootloader/wormhole.h"
|
#include "bootloader/wormhole.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "right_key_matrix.h"
|
|
||||||
#include "key_scanner.h"
|
#include "key_scanner.h"
|
||||||
#include "key_states.h"
|
|
||||||
#include "usb_commands/usb_command_apply_config.h"
|
#include "usb_commands/usb_command_apply_config.h"
|
||||||
#include "peripherals/reset_button.h"
|
#include "peripherals/reset_button.h"
|
||||||
|
#include "usb_report_updater.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsEepromInitialized = false;
|
bool IsEepromInitialized = false;
|
||||||
bool IsConfigInitialized = false;
|
bool IsConfigInitialized = false;
|
||||||
@@ -105,7 +42,7 @@ void main(void)
|
|||||||
InitSlaveScheduler();
|
InitSlaveScheduler();
|
||||||
KeyMatrix_Init(&RightKeyMatrix);
|
KeyMatrix_Init(&RightKeyMatrix);
|
||||||
InitKeyScanner();
|
InitKeyScanner();
|
||||||
updateUsbReports();
|
UpdateUsbReports();
|
||||||
InitUsb();
|
InitUsb();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -113,7 +50,7 @@ void main(void)
|
|||||||
UsbCommand_ApplyConfig();
|
UsbCommand_ApplyConfig();
|
||||||
IsConfigInitialized = true;
|
IsConfigInitialized = true;
|
||||||
}
|
}
|
||||||
updateUsbReports();
|
UpdateUsbReports();
|
||||||
__WFI();
|
__WFI();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
#ifndef __MAIN_H__
|
|
||||||
#define __MAIN_H__
|
|
||||||
|
|
||||||
// Includes:
|
|
||||||
|
|
||||||
#include "key_matrix.h"
|
|
||||||
#include "slot.h"
|
|
||||||
#include "module.h"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
#include "slave_scheduler.h"
|
#include "slave_scheduler.h"
|
||||||
#include "slave_drivers/uhk_module_driver.h"
|
#include "slave_drivers/uhk_module_driver.h"
|
||||||
#include "slave_protocol.h"
|
#include "slave_protocol.h"
|
||||||
#include "main.h"
|
|
||||||
#include "peripherals/test_led.h"
|
#include "peripherals/test_led.h"
|
||||||
#include "bool_array_converter.h"
|
#include "bool_array_converter.h"
|
||||||
#include "crc16.h"
|
#include "crc16.h"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#include "fsl_i2c.h"
|
#include "fsl_i2c.h"
|
||||||
#include "slave_scheduler.h"
|
#include "slave_scheduler.h"
|
||||||
#include "slot.h"
|
#include "slot.h"
|
||||||
#include "main.h"
|
|
||||||
#include "slave_drivers/is31fl3731_driver.h"
|
#include "slave_drivers/is31fl3731_driver.h"
|
||||||
#include "slave_drivers/uhk_module_driver.h"
|
#include "slave_drivers/uhk_module_driver.h"
|
||||||
#include "slave_drivers/kboot_driver.h"
|
#include "slave_drivers/kboot_driver.h"
|
||||||
|
|||||||
@@ -14,15 +14,30 @@ void Timer_Init(void)
|
|||||||
pit_config_t pitConfig;
|
pit_config_t pitConfig;
|
||||||
PIT_GetDefaultConfig(&pitConfig);
|
PIT_GetDefaultConfig(&pitConfig);
|
||||||
PIT_Init(PIT, &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);
|
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
|
||||||
EnableIRQ(PIT_TIMER_IRQ_ID);
|
EnableIRQ(PIT_TIMER_IRQ_ID);
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#define USB_DEVICE_CLASS 0x00
|
#define USB_DEVICE_CLASS 0x00
|
||||||
#define USB_DEVICE_SUBCLASS 0x00
|
#define USB_DEVICE_SUBCLASS 0x00
|
||||||
#define USB_DEVICE_PROTOCOL 0x00
|
#define USB_DEVICE_PROTOCOL 0x00
|
||||||
|
#define USB_IRQ_ID USB0_IRQn
|
||||||
|
|
||||||
#define USB_INTERFACE_ALTERNATE_SETTING_NONE 0x00
|
#define USB_INTERFACE_ALTERNATE_SETTING_NONE 0x00
|
||||||
#define USB_STRING_DESCRIPTOR_NONE 0x00
|
#define USB_STRING_DESCRIPTOR_NONE 0x00
|
||||||
|
|||||||
@@ -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,15 +20,16 @@ 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);
|
||||||
|
|
||||||
/* 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)
|
void SetDebugBufferUint8(uint32_t offset, uint8_t value)
|
||||||
@@ -39,3 +46,23 @@ void SetDebugBufferUint32(uint32_t offset, uint32_t value)
|
|||||||
{
|
{
|
||||||
SetBufferUint32(DebugBuffer, offset, 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 SetDebugBufferUint16(uint32_t offset, uint16_t value);
|
||||||
void SetDebugBufferUint32(uint32_t offset, uint32_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
|
#endif
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
#include "usb_protocol_handler.h"
|
#include "usb_protocol_handler.h"
|
||||||
#include "usb_commands/usb_command_jump_to_slave_bootloader.h"
|
#include "usb_commands/usb_command_jump_to_module_bootloader.h"
|
||||||
#include "slot.h"
|
#include "slot.h"
|
||||||
#include "slave_drivers/uhk_module_driver.h"
|
#include "slave_drivers/uhk_module_driver.h"
|
||||||
|
|
||||||
void UsbCommand_JumpToSlaveBootloader(void)
|
void UsbCommand_JumpToModuleBootloader(void)
|
||||||
{
|
{
|
||||||
uint8_t slotId = GetUsbRxBufferUint8(1);
|
uint8_t slotId = GetUsbRxBufferUint8(1);
|
||||||
|
|
||||||
if (!IS_VALID_SLAVE_SLOT(slotId)) {
|
if (!IS_VALID_SLAVE_SLOT(slotId)) {
|
||||||
SetUsbTxBufferUint8(0, UsbStatusCode_JumpToSlaveBootloader_InvalidSlaveSlotId);
|
SetUsbTxBufferUint8(0, UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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,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
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#ifndef __USB_COMMAND_SEND_KBOOT_COMMAND_H__
|
|
||||||
#define __USB_COMMAND_SEND_KBOOT_COMMAND_H__
|
|
||||||
|
|
||||||
// Functions:
|
|
||||||
|
|
||||||
void UsbCommand_SendKbootCommand(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
#include "usb_protocol_handler.h"
|
#include "usb_protocol_handler.h"
|
||||||
#include "usb_commands/usb_command_send_kboot_command.h"
|
#include "usb_commands/usb_command_send_kboot_command_to_module.h"
|
||||||
#include "slave_drivers/kboot_driver.h"
|
#include "slave_drivers/kboot_driver.h"
|
||||||
|
|
||||||
void UsbCommand_SendKbootCommand(void)
|
void UsbCommand_SendKbootCommandToModule(void)
|
||||||
{
|
{
|
||||||
KbootDriverState.phase = 0;
|
KbootDriverState.phase = 0;
|
||||||
KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2);
|
KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2);
|
||||||
@@ -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
|
||||||
@@ -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,7 +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;
|
||||||
|
|
||||||
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);
|
NVIC_EnableIRQ((IRQn_Type)irqNumber);
|
||||||
|
|
||||||
USB_DeviceRun(UsbCompositeDevice.deviceHandle);
|
USB_DeviceRun(UsbCompositeDevice.deviceHandle);
|
||||||
|
|||||||
@@ -1,46 +1,7 @@
|
|||||||
#include "main.h"
|
|
||||||
#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;
|
||||||
|
|
||||||
@@ -65,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|
||||||
|
|||||||
@@ -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 "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;
|
||||||
@@ -65,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,14 +25,14 @@
|
|||||||
uint8_t buttons;
|
uint8_t buttons;
|
||||||
int16_t x;
|
int16_t x;
|
||||||
int16_t y;
|
int16_t y;
|
||||||
int8_t wheelX;
|
|
||||||
int8_t wheelY;
|
int8_t wheelY;
|
||||||
|
int8_t wheelX;
|
||||||
} ATTR_PACKED usb_mouse_report_t;
|
} ATTR_PACKED usb_mouse_report_t;
|
||||||
|
|
||||||
// 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:
|
||||||
|
|||||||
@@ -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 "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;
|
||||||
@@ -65,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
#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"
|
||||||
#include "usb_commands/usb_command_jump_to_slave_bootloader.h"
|
#include "usb_commands/usb_command_jump_to_module_bootloader.h"
|
||||||
#include "usb_commands/usb_command_send_kboot_command.h"
|
#include "usb_commands/usb_command_send_kboot_command_to_module.h"
|
||||||
|
|
||||||
void UsbProtocolHandler(void)
|
void UsbProtocolHandler(void)
|
||||||
{
|
{
|
||||||
@@ -55,14 +55,14 @@ void UsbProtocolHandler(void)
|
|||||||
case UsbCommandId_GetKeyboardState:
|
case UsbCommandId_GetKeyboardState:
|
||||||
UsbCommand_GetKeyboardState();
|
UsbCommand_GetKeyboardState();
|
||||||
break;
|
break;
|
||||||
case UsbCommandId_GetDebugInfo:
|
case UsbCommandId_GetDebugBuffer:
|
||||||
UsbCommand_GetDebugBuffer();
|
UsbCommand_GetDebugBuffer();
|
||||||
break;
|
break;
|
||||||
case UsbCommandId_JumpToModuleBootloader:
|
case UsbCommandId_JumpToModuleBootloader:
|
||||||
UsbCommand_JumpToSlaveBootloader();
|
UsbCommand_JumpToModuleBootloader();
|
||||||
break;
|
break;
|
||||||
case UsbCommandId_SendKbootCommandToModule:
|
case UsbCommandId_SendKbootCommandToModule:
|
||||||
UsbCommand_SendKbootCommand();
|
UsbCommand_SendKbootCommandToModule();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
||||||
|
|||||||
@@ -13,21 +13,21 @@
|
|||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UsbCommandId_GetProperty = 0,
|
UsbCommandId_GetProperty = 0x00,
|
||||||
UsbCommandId_Reenumerate = 1,
|
UsbCommandId_Reenumerate = 0x01,
|
||||||
UsbCommandId_SetTestLed = 2,
|
UsbCommandId_SetTestLed = 0x02,
|
||||||
UsbCommandId_WriteUserConfig = 8,
|
UsbCommandId_WriteUserConfig = 0x08,
|
||||||
UsbCommandId_ApplyConfig = 9,
|
UsbCommandId_ApplyConfig = 0x09,
|
||||||
UsbCommandId_SetLedPwmBrightness = 10,
|
UsbCommandId_SetLedPwmBrightness = 0x0A,
|
||||||
UsbCommandId_GetAdcValue = 11,
|
UsbCommandId_GetAdcValue = 0x0B,
|
||||||
UsbCommandId_LaunchEepromTransferLegacy = 12,
|
UsbCommandId_LaunchEepromTransferLegacy = 0x0C,
|
||||||
UsbCommandId_ReadHardwareConfig = 13,
|
UsbCommandId_ReadHardwareConfig = 0x0D,
|
||||||
UsbCommandId_WriteHardwareConfig = 14,
|
UsbCommandId_WriteHardwareConfig = 0x0E,
|
||||||
UsbCommandId_ReadUserConfig = 15,
|
UsbCommandId_ReadUserConfig = 0x0F,
|
||||||
UsbCommandId_GetKeyboardState = 16,
|
UsbCommandId_GetKeyboardState = 0x10,
|
||||||
UsbCommandId_GetDebugInfo = 17,
|
UsbCommandId_GetDebugBuffer = 0x11,
|
||||||
UsbCommandId_JumpToModuleBootloader = 18,
|
UsbCommandId_JumpToModuleBootloader = 0x12,
|
||||||
UsbCommandId_SendKbootCommandToModule = 19,
|
UsbCommandId_SendKbootCommandToModule = 0x13,
|
||||||
} usb_command_id_t;
|
} usb_command_id_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <math.h>
|
||||||
#include "key_action.h"
|
#include "key_action.h"
|
||||||
#include "led_display.h"
|
#include "led_display.h"
|
||||||
#include "layer.h"
|
#include "layer.h"
|
||||||
@@ -13,76 +14,174 @@
|
|||||||
#include "usb_report_updater.h"
|
#include "usb_report_updater.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_debouncer.h"
|
#include "key_debouncer.h"
|
||||||
|
#include "config_parser/parse_keymap.h"
|
||||||
|
#include "usb_commands/usb_command_get_debug_buffer.h"
|
||||||
|
|
||||||
uint32_t UsbReportUpdateTime = 0;
|
uint32_t UsbReportUpdateTime = 0;
|
||||||
|
|
||||||
static uint8_t mouseWheelDivisorCounter = 0;
|
|
||||||
static uint8_t mouseSpeedAccelDivisorCounter = 0;
|
|
||||||
static uint8_t mouseSpeed = 10;
|
|
||||||
static bool wasPreviousMouseActionWheelAction = false;
|
|
||||||
static uint32_t elapsedTime;
|
static uint32_t elapsedTime;
|
||||||
|
|
||||||
void processMouseAction(key_action_t *action)
|
uint16_t DoubleTapSwitchLayerTimeout = 250;
|
||||||
|
|
||||||
|
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
||||||
|
|
||||||
|
mouse_kinetic_state_t MouseMoveState = {
|
||||||
|
.isScroll = false,
|
||||||
|
.upState = SerializedMouseAction_MoveUp,
|
||||||
|
.downState = SerializedMouseAction_MoveDown,
|
||||||
|
.leftState = SerializedMouseAction_MoveLeft,
|
||||||
|
.rightState = SerializedMouseAction_MoveRight,
|
||||||
|
.intMultiplier = 25,
|
||||||
|
.initialSpeed = 5,
|
||||||
|
.acceleration = 35,
|
||||||
|
.deceleratedSpeed = 10,
|
||||||
|
.baseSpeed = 40,
|
||||||
|
.acceleratedSpeed = 80,
|
||||||
|
};
|
||||||
|
|
||||||
|
mouse_kinetic_state_t MouseScrollState = {
|
||||||
|
.isScroll = true,
|
||||||
|
.upState = SerializedMouseAction_ScrollDown,
|
||||||
|
.downState = SerializedMouseAction_ScrollUp,
|
||||||
|
.leftState = SerializedMouseAction_ScrollLeft,
|
||||||
|
.rightState = SerializedMouseAction_ScrollRight,
|
||||||
|
.intMultiplier = 1,
|
||||||
|
.initialSpeed = 20,
|
||||||
|
.acceleration = 20,
|
||||||
|
.deceleratedSpeed = 10,
|
||||||
|
.baseSpeed = 20,
|
||||||
|
.acceleratedSpeed = 50,
|
||||||
|
};
|
||||||
|
|
||||||
|
void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||||
{
|
{
|
||||||
bool isWheelAction = action->mouse.scrollActions && !action->mouse.moveActions && !action->mouse.buttonActions;
|
float initialSpeed = kineticState->intMultiplier * kineticState->initialSpeed;
|
||||||
uint16_t distance = mouseSpeed * elapsedTime / 25;
|
float acceleration = kineticState->intMultiplier * kineticState->acceleration;
|
||||||
|
float deceleratedSpeed = kineticState->intMultiplier * kineticState->deceleratedSpeed;
|
||||||
|
float baseSpeed = kineticState->intMultiplier * kineticState->baseSpeed;
|
||||||
|
float acceleratedSpeed = kineticState->intMultiplier * kineticState->acceleratedSpeed;
|
||||||
|
|
||||||
if (isWheelAction && wasPreviousMouseActionWheelAction) {
|
if (!kineticState->wasMoveAction && !activeMouseStates[SerializedMouseAction_Decelerate]) {
|
||||||
mouseWheelDivisorCounter++;
|
kineticState->currentSpeed = initialSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action->mouse.scrollActions) {
|
bool isMoveAction = activeMouseStates[kineticState->upState] ||
|
||||||
if (mouseWheelDivisorCounter == MOUSE_WHEEL_DIVISOR) {
|
activeMouseStates[kineticState->downState] ||
|
||||||
mouseWheelDivisorCounter = 0;
|
activeMouseStates[kineticState->leftState] ||
|
||||||
if (action->mouse.scrollActions & MouseScroll_Up) {
|
activeMouseStates[kineticState->rightState];
|
||||||
ActiveUsbMouseReport->wheelX = 1;
|
|
||||||
}
|
mouse_speed_t mouseSpeed = MouseSpeed_Normal;
|
||||||
if (action->mouse.scrollActions & MouseScroll_Down) {
|
if (activeMouseStates[SerializedMouseAction_Accelerate]) {
|
||||||
ActiveUsbMouseReport->wheelX = -1;
|
kineticState->targetSpeed = acceleratedSpeed;
|
||||||
}
|
mouseSpeed = MouseSpeed_Accelerated;
|
||||||
}
|
} else if (activeMouseStates[SerializedMouseAction_Decelerate]) {
|
||||||
|
kineticState->targetSpeed = deceleratedSpeed;
|
||||||
|
mouseSpeed = MouseSpeed_Decelerated;
|
||||||
|
} else if (isMoveAction) {
|
||||||
|
kineticState->targetSpeed = baseSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action->mouse.moveActions & MouseMove_Accelerate || action->mouse.moveActions & MouseMove_Decelerate) {
|
if (mouseSpeed == MouseSpeed_Accelerated || (kineticState->wasMoveAction && isMoveAction && (kineticState->prevMouseSpeed != mouseSpeed))) {
|
||||||
mouseSpeedAccelDivisorCounter++;
|
kineticState->currentSpeed = kineticState->targetSpeed;
|
||||||
|
|
||||||
if (mouseSpeedAccelDivisorCounter == MOUSE_SPEED_ACCEL_DIVISOR) {
|
|
||||||
mouseSpeedAccelDivisorCounter = 0;
|
|
||||||
|
|
||||||
if (action->mouse.moveActions & MouseMove_Accelerate) {
|
|
||||||
if (mouseSpeed < MOUSE_MAX_SPEED) {
|
|
||||||
mouseSpeed++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (action->mouse.moveActions & MouseMove_Decelerate) {
|
|
||||||
if (mouseSpeed > 1) {
|
|
||||||
mouseSpeed--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (action->mouse.moveActions) {
|
|
||||||
if (action->mouse.moveActions & MouseMove_Left) {
|
|
||||||
ActiveUsbMouseReport->x = -distance;
|
|
||||||
}
|
|
||||||
if (action->mouse.moveActions & MouseMove_Right) {
|
|
||||||
ActiveUsbMouseReport->x = distance;
|
|
||||||
}
|
|
||||||
if (action->mouse.moveActions & MouseMove_Up) {
|
|
||||||
ActiveUsbMouseReport->y = -distance;
|
|
||||||
}
|
|
||||||
if (action->mouse.moveActions & MouseMove_Down) {
|
|
||||||
ActiveUsbMouseReport->y = distance;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ActiveUsbMouseReport->buttons |= action->mouse.buttonActions;
|
if (isMoveAction) {
|
||||||
|
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
||||||
|
kineticState->currentSpeed += acceleration * elapsedTime / 1000;
|
||||||
|
if (kineticState->currentSpeed > kineticState->targetSpeed) {
|
||||||
|
kineticState->currentSpeed = kineticState->targetSpeed;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
kineticState->currentSpeed -= acceleration * elapsedTime / 1000;
|
||||||
|
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
||||||
|
kineticState->currentSpeed = kineticState->targetSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wasPreviousMouseActionWheelAction = isWheelAction;
|
float distance = kineticState->currentSpeed * elapsedTime / 1000;
|
||||||
|
|
||||||
|
if (kineticState->isScroll && !kineticState->wasMoveAction) {
|
||||||
|
kineticState->xSum = 0;
|
||||||
|
kineticState->ySum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeMouseStates[kineticState->leftState]) {
|
||||||
|
kineticState->xSum -= distance;
|
||||||
|
} else if (activeMouseStates[kineticState->rightState]) {
|
||||||
|
kineticState->xSum += distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
float xSumInt;
|
||||||
|
float xSumFrac = modff(kineticState->xSum, &xSumInt);
|
||||||
|
kineticState->xSum = xSumFrac;
|
||||||
|
kineticState->xOut = xSumInt;
|
||||||
|
|
||||||
|
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0) {
|
||||||
|
kineticState->xOut = kineticState->xSum > 0 ? 1 : -1;
|
||||||
|
kineticState->xSum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeMouseStates[kineticState->upState]) {
|
||||||
|
kineticState->ySum -= distance;
|
||||||
|
} else if (activeMouseStates[kineticState->downState]) {
|
||||||
|
kineticState->ySum += distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
float ySumInt;
|
||||||
|
float ySumFrac = modff(kineticState->ySum, &ySumInt);
|
||||||
|
kineticState->ySum = ySumFrac;
|
||||||
|
kineticState->yOut = ySumInt;
|
||||||
|
|
||||||
|
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0) {
|
||||||
|
kineticState->yOut = kineticState->ySum > 0 ? 1 : -1;
|
||||||
|
kineticState->ySum = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
kineticState->currentSpeed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
kineticState->prevMouseSpeed = mouseSpeed;
|
||||||
|
kineticState->wasMoveAction = isMoveAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void processMouseActions()
|
||||||
|
{
|
||||||
|
processMouseKineticState(&MouseMoveState);
|
||||||
|
ActiveUsbMouseReport->x = MouseMoveState.xOut;
|
||||||
|
ActiveUsbMouseReport->y = MouseMoveState.yOut;
|
||||||
|
MouseMoveState.xOut = 0;
|
||||||
|
MouseMoveState.yOut = 0;
|
||||||
|
|
||||||
|
processMouseKineticState(&MouseScrollState);
|
||||||
|
ActiveUsbMouseReport->wheelX = MouseScrollState.xOut;
|
||||||
|
ActiveUsbMouseReport->wheelY = MouseScrollState.yOut;
|
||||||
|
MouseScrollState.xOut = 0;
|
||||||
|
MouseScrollState.yOut = 0;
|
||||||
|
|
||||||
|
// The following line makes the firmware crash for some reason:
|
||||||
|
// SetDebugBufferFloat(60, mouseScrollState.currentSpeed);
|
||||||
|
// TODO: Figure out why.
|
||||||
|
// Oddly, the following line (which is the inlined version of the above) works:
|
||||||
|
// *(float*)(DebugBuffer + 60) = mouseScrollState.currentSpeed;
|
||||||
|
// The value parameter of SetDebugBufferFloat() seems to be the culprit because
|
||||||
|
// if it's not used within the function it doesn't crash anymore.
|
||||||
|
|
||||||
|
if (activeMouseStates[SerializedMouseAction_LeftClick]) {
|
||||||
|
ActiveUsbMouseReport->buttons |= MouseButton_Left;
|
||||||
|
}
|
||||||
|
if (activeMouseStates[SerializedMouseAction_MiddleClick]) {
|
||||||
|
ActiveUsbMouseReport->buttons |= MouseButton_Middle;
|
||||||
|
}
|
||||||
|
if (activeMouseStates[SerializedMouseAction_RightClick]) {
|
||||||
|
ActiveUsbMouseReport->buttons |= MouseButton_Right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static layer_id_t previousLayer = LayerId_Base;
|
||||||
static uint8_t basicScancodeIndex = 0;
|
static uint8_t basicScancodeIndex = 0;
|
||||||
static uint8_t mediaScancodeIndex = 0;
|
static uint8_t mediaScancodeIndex = 0;
|
||||||
static uint8_t systemScancodeIndex = 0;
|
static uint8_t systemScancodeIndex = 0;
|
||||||
|
key_state_t *doubleTapSwitchLayerKey;
|
||||||
|
uint32_t doubleTapSwitchLayerStartTime;
|
||||||
|
|
||||||
void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
||||||
{
|
{
|
||||||
@@ -90,6 +189,10 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (doubleTapSwitchLayerKey && doubleTapSwitchLayerKey != keyState && !keyState->previous) {
|
||||||
|
doubleTapSwitchLayerKey = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
switch (action->type) {
|
switch (action->type) {
|
||||||
case KeyActionType_Keystroke:
|
case KeyActionType_Keystroke:
|
||||||
ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers;
|
ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers;
|
||||||
@@ -116,26 +219,42 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KeyActionType_Mouse:
|
case KeyActionType_Mouse:
|
||||||
processMouseAction(action);
|
activeMouseStates[action->mouseAction] = true;
|
||||||
|
break;
|
||||||
|
case KeyActionType_SwitchLayer:
|
||||||
|
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
|
||||||
|
if (doubleTapSwitchLayerKey) {
|
||||||
|
if (Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
||||||
|
ToggledLayer = action->switchLayer.layer;
|
||||||
|
}
|
||||||
|
doubleTapSwitchLayerKey = NULL;
|
||||||
|
} else {
|
||||||
|
doubleTapSwitchLayerKey = keyState;
|
||||||
|
doubleTapSwitchLayerStartTime = CurrentTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case KeyActionType_SwitchKeymap:
|
case KeyActionType_SwitchKeymap:
|
||||||
if (!keyState->previous && keyState->current) {
|
if (!keyState->previous) {
|
||||||
SwitchKeymap(action->switchKeymap.keymapId);
|
SwitchKeymap(action->switchKeymap.keymapId);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static layer_id_t previousLayer = LayerId_Base;
|
|
||||||
static uint8_t secondaryRoleState = SecondaryRoleState_Released;
|
static uint8_t secondaryRoleState = SecondaryRoleState_Released;
|
||||||
static uint8_t secondaryRoleSlotId;
|
static uint8_t secondaryRoleSlotId;
|
||||||
static uint8_t secondaryRoleKeyId;
|
static uint8_t secondaryRoleKeyId;
|
||||||
static secondary_role_t secondaryRole;
|
static secondary_role_t secondaryRole;
|
||||||
|
|
||||||
void UpdateActiveUsbReports(void)
|
#define pos 35
|
||||||
|
void updateActiveUsbReports(void)
|
||||||
{
|
{
|
||||||
|
SetDebugBufferUint32(pos, 1);
|
||||||
|
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;
|
||||||
@@ -163,6 +282,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++) {
|
||||||
@@ -216,6 +336,10 @@ void UpdateActiveUsbReports(void)
|
|||||||
keyState->previous = keyState->current;
|
keyState->previous = keyState->current;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SetDebugBufferUint32(pos, 4);
|
||||||
|
|
||||||
|
processMouseActions();
|
||||||
|
SetDebugBufferUint32(pos, 5);
|
||||||
|
|
||||||
// When a layer switcher key gets pressed along with another key that produces some modifiers
|
// 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
|
||||||
@@ -230,4 +354,74 @@ void UpdateActiveUsbReports(void)
|
|||||||
|
|
||||||
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
|
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
|
||||||
previousLayer = activeLayer;
|
previousLayer = activeLayer;
|
||||||
|
SetDebugBufferUint32(pos, 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UsbBasicKeyboardReportEverSent = false;
|
||||||
|
bool UsbMediaKeyboardReportEverSent = false;
|
||||||
|
bool UsbSystemKeyboardReportEverSent = false;
|
||||||
|
bool UsbMouseReportEverSentEverSent = false;
|
||||||
|
|
||||||
|
uint32_t UsbReportUpdateCounter;
|
||||||
|
static uint32_t lastUsbUpdateTime;
|
||||||
|
|
||||||
|
void UpdateUsbReports(void)
|
||||||
|
{
|
||||||
|
UsbReportUpdateCounter++;
|
||||||
|
|
||||||
|
if (Timer_GetElapsedTime(&lastUsbUpdateTime) > 100) {
|
||||||
|
UsbBasicKeyboardReportEverSent = false;
|
||||||
|
UsbMediaKeyboardReportEverSent = false;
|
||||||
|
UsbSystemKeyboardReportEverSent = false;
|
||||||
|
UsbMouseReportEverSentEverSent = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
Timer_SetCurrentTime(&lastUsbUpdateTime);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
#ifndef __USB_REPORT_UPDATER_H__
|
#ifndef __USB_REPORT_UPDATER_H__
|
||||||
#define __USB_REPORT_UPDATER_H__
|
#define __USB_REPORT_UPDATER_H__
|
||||||
|
|
||||||
|
// Includes:
|
||||||
|
|
||||||
|
#include "config_parser/parse_keymap.h"
|
||||||
|
|
||||||
// Macros:
|
// Macros:
|
||||||
|
|
||||||
|
#define ACTIVE_MOUSE_STATES_COUNT (SerializedMouseAction_Last + 1)
|
||||||
|
|
||||||
#define IS_SECONDARY_ROLE_MODIFIER(secondaryRole) (SecondaryRole_LeftCtrl <= (secondaryRole) && (secondaryRole) <= SecondaryRole_RightSuper)
|
#define IS_SECONDARY_ROLE_MODIFIER(secondaryRole) (SecondaryRole_LeftCtrl <= (secondaryRole) && (secondaryRole) <= SecondaryRole_RightSuper)
|
||||||
#define IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole) (SecondaryRole_Mod <= (secondaryRole) && (secondaryRole) <= SecondaryRole_Mouse)
|
#define IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole) (SecondaryRole_Mod <= (secondaryRole) && (secondaryRole) <= SecondaryRole_Mouse)
|
||||||
#define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1))
|
#define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1))
|
||||||
@@ -30,4 +36,43 @@
|
|||||||
SecondaryRole_Mouse
|
SecondaryRole_Mouse
|
||||||
} secondary_role_t;
|
} secondary_role_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MouseSpeed_Normal,
|
||||||
|
MouseSpeed_Accelerated,
|
||||||
|
MouseSpeed_Decelerated,
|
||||||
|
} mouse_speed_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool isScroll;
|
||||||
|
bool wasMoveAction;
|
||||||
|
serialized_mouse_action_t upState;
|
||||||
|
serialized_mouse_action_t downState;
|
||||||
|
serialized_mouse_action_t leftState;
|
||||||
|
serialized_mouse_action_t rightState;
|
||||||
|
mouse_speed_t prevMouseSpeed;
|
||||||
|
float intMultiplier;
|
||||||
|
float currentSpeed;
|
||||||
|
float targetSpeed;
|
||||||
|
uint8_t initialSpeed;
|
||||||
|
uint8_t acceleration;
|
||||||
|
uint8_t deceleratedSpeed;
|
||||||
|
uint8_t baseSpeed;
|
||||||
|
uint8_t acceleratedSpeed;
|
||||||
|
float xSum;
|
||||||
|
float ySum;
|
||||||
|
int16_t xOut;
|
||||||
|
int16_t yOut;
|
||||||
|
} mouse_kinetic_state_t;
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern uint16_t DoubleTapSwitchLayerTimeout;
|
||||||
|
extern mouse_kinetic_state_t MouseMoveState;
|
||||||
|
extern mouse_kinetic_state_t MouseScrollState;
|
||||||
|
extern uint32_t UsbReportUpdateCounter;
|
||||||
|
|
||||||
|
// Functions:
|
||||||
|
|
||||||
|
void UpdateUsbReports(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,10 +15,10 @@
|
|||||||
"commander": "^2.11.0",
|
"commander": "^2.11.0",
|
||||||
"shelljs": "^0.7.8"
|
"shelljs": "^0.7.8"
|
||||||
},
|
},
|
||||||
"version": "3.0.0",
|
"version": "5.0.1",
|
||||||
"dataModelVersion": "1.0.0",
|
"dataModelVersion": "4.0.0",
|
||||||
"usbProtocolVersion": "1.2.0",
|
"usbProtocolVersion": "2.0.0",
|
||||||
"slaveProtocolVersion": "2.1.0",
|
"slaveProtocolVersion": "3.0.0",
|
||||||
"devices": [
|
"devices": [
|
||||||
{
|
{
|
||||||
"deviceId": 1,
|
"deviceId": 1,
|
||||||
|
|||||||
@@ -45,6 +45,21 @@ void SetBufferUint32(uint8_t *buffer, uint32_t offset, uint32_t value)
|
|||||||
*(uint32_t*)(buffer + offset) = value;
|
*(uint32_t*)(buffer + offset) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetBufferInt8(uint8_t *buffer, uint32_t offset, int8_t value)
|
||||||
|
{
|
||||||
|
*(int8_t*)(buffer + offset) = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetBufferInt16(uint8_t *buffer, uint32_t offset, int16_t value)
|
||||||
|
{
|
||||||
|
*(int16_t*)(buffer + offset) = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetBufferInt32(uint8_t *buffer, uint32_t offset, int32_t value)
|
||||||
|
{
|
||||||
|
*(int32_t*)(buffer + offset) = value;
|
||||||
|
}
|
||||||
|
|
||||||
void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value)
|
void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value)
|
||||||
{
|
{
|
||||||
buffer[offset] = value;
|
buffer[offset] = value;
|
||||||
@@ -63,3 +78,8 @@ void SetBufferUint32Be(uint8_t *buffer, uint32_t offset, uint32_t value)
|
|||||||
buffer[offset+2] = (value >> 8) & 0xff;
|
buffer[offset+2] = (value >> 8) & 0xff;
|
||||||
buffer[offset+3] = (value >> 0) & 0xff;
|
buffer[offset+3] = (value >> 0) & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetBufferFloat(uint8_t *buffer, uint32_t offset, float value)
|
||||||
|
{
|
||||||
|
*(float*)(buffer + offset) = value;
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,8 +19,14 @@
|
|||||||
void SetBufferUint16(uint8_t *buffer, uint32_t offset, uint16_t value);
|
void SetBufferUint16(uint8_t *buffer, uint32_t offset, uint16_t value);
|
||||||
void SetBufferUint32(uint8_t *buffer, uint32_t offset, uint32_t value);
|
void SetBufferUint32(uint8_t *buffer, uint32_t offset, uint32_t value);
|
||||||
|
|
||||||
|
void SetBufferInt8(uint8_t *buffer, uint32_t offset, int8_t value);
|
||||||
|
void SetBufferInt16(uint8_t *buffer, uint32_t offset, int16_t value);
|
||||||
|
void SetBufferInt32(uint8_t *buffer, uint32_t offset, int32_t value);
|
||||||
|
|
||||||
void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value);
|
void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value);
|
||||||
void SetBufferUint16Be(uint8_t *buffer, uint32_t offset, uint16_t value);
|
void SetBufferUint16Be(uint8_t *buffer, uint32_t offset, uint16_t value);
|
||||||
void SetBufferUint32Be(uint8_t *buffer, uint32_t offset, uint32_t value);
|
void SetBufferUint32Be(uint8_t *buffer, uint32_t offset, uint32_t value);
|
||||||
|
|
||||||
|
void SetBufferFloat(uint8_t *buffer, uint32_t offset, float value);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user