21 Commits

Author SHA1 Message Date
László Monda
5093a0c0a6 Bump version to 8.1.4. Update changelog, package.json, and versions.h 2018-03-05 15:57:14 +01:00
László Monda
7e524d97b1 Don't read (the default 250ms) DoubleTapSwitchLayerTimeout from the user configuration but rather set it to 150ms which feels quite optimal. 2018-03-05 10:16:58 +01:00
László Monda
2e53331a0f Set KEY_DEBOUNCER_TIMEOUT_MSEC to 30. This looks like a safe bet to eliminate key chattering for every switch. 2018-02-27 23:01:39 +01:00
László Monda
c6d60780f4 Bump version to 8.1.3 and update package.json, versions.h and the changelog accordingly. 2018-02-18 00:46:17 +01:00
László Monda
8666a495d8 Set KEY_DEBOUNCER_TIMEOUT_MSEC from 15 to 20 ms. 2018-02-17 21:37:02 +01:00
Kristian Sloth Lauszus
33bbf44199 Fix system keyboard descriptor, so it is byte-aligned (#93)
I have verified that the descriptor shows up correctly on Windows 7 and macOS

The descriptor is based on the two following pages: https://github.com/Microsoft/Windows-driver-samples/tree/master/hid/hidusbfx2 and https://docs.microsoft.com/en-us/windows-hardware/drivers/gpiobtn/hid-button-report-descriptors

Fixes #76
2018-02-14 00:27:53 +01:00
László Monda
cc49118868 Bump version to 8.1.2. Update changelog, package.json, versions.h and reference the latest Agent repo. 2018-02-13 03:31:35 +01:00
László Monda
f8fd99f588 Set KEY_DEBOUNCER_TIMEOUT_MSEC from 10 to 15 msec. 2018-02-12 18:08:53 +01:00
Kristian Sloth Lauszus
fa8c9dc907 Logical maximum is wrongly assumed to be an unsigned integer, thus 0xFF is interpreted as -1 and not 255 (#92)
Simply setting the number of bits to 16 solves this
2018-02-12 04:51:59 +01:00
László Monda
0911e67bf6 Fix the coding style of usb_interface_basic_keyboard.c 2018-02-11 22:28:12 +01:00
László Monda
57a7cee62a Remove debug statements from updateActiveUsbReports() 2018-02-11 22:25:29 +01:00
Kristian Sloth Lauszus
1af28a79db Detect Caps Lock state and set the LED accordingly (#91)
Fixes #65
2018-02-11 12:45:46 +01:00
László Monda
6881f8e340 Update versions.h to 8.1.1 2018-02-11 04:23:31 +01:00
László Monda
00cd1f65e8 Bump version to 8.1.1. Update package.json and the changelog. 2018-02-11 04:21:49 +01:00
László Monda
2c9a6c0bd2 Add doubleTapSwitchLayerReleaseTimeout and set it to 100ms. Resolves #79. 2018-02-11 04:09:15 +01:00
László Monda
0c94cbb256 Make doubleTapSwitchLayerKey and doubleTapSwitchLayerStartTime static. 2018-02-11 03:29:15 +01:00
László Monda
275bfee860 Merge branch 'master' of github.com:UltimateHackingKeyboard/firmware 2018-02-10 23:55:48 +01:00
László Monda
8a655e3cfd Lock layers every time when double-tapping their layer switcher keys. Fixes #81. 2018-02-10 23:53:35 +01:00
László Monda
8521619783 Update README.md 2018-02-05 02:24:10 +01:00
László Monda
62184240df Update README.md 2018-02-05 02:03:56 +01:00
László Monda
0b210ac68e Update README.md 2018-02-01 18:39:20 +01:00
15 changed files with 99 additions and 39 deletions

View File

@@ -5,6 +5,34 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [8.1.4] - 2018-03-05
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Set key debounce timeout from 20ms to 30ms. This should eliminate key chattering.
- Set double tap lock layer timeout from 250ms to 150ms. This should minimize the chance of locking layers accidentally by double tapping their keys.
## [8.1.3] - 2018-02-18
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Fix system keyboard descriptor, so it is byte-aligned.
- Set key debounce timeout from 15ms to 20ms. This should at least reduce and hopefully eliminate key chattering.
## [8.1.2] - 2018-02-13
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Detect Caps Lock USB state and light up the Caps Lock icon of the LED display accordingly.
- Set key debounce timeout from 10ms to 15ms. This should at least reduce and hopefully eliminate key chattering.
## [8.1.1] - 2018-02-11
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Lock layers every time when double-tapping their layer switcher keys, regardless of how many times the layer switcher key was tapped before.
- Only lock layers via double-tapping if the second tap gets released within 100ms.
## [8.1.0] - 2018-01-15
Device Protocol: 4.**2**.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
@@ -68,7 +96,7 @@ Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **3.0.0** | Hardw
- Implement mouse movement and scrolling deceleration and acceleration.
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
- Make the parser read additional user configuration properties: USERCONFIGMajorVersion, USERCONFIGMinorVersion, USERCONFIGPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
- Make the parser read additional user configuration properties: userConfigMajorVersion, userConfigMinorVersion, userConfigPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
## [3.0.0] - 2017-11-15

View File

@@ -4,6 +4,10 @@
This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
## Updating to the latest firmware
Want to update your UHK to the latest firmware version? Simply download the [latest release of Agent](https://github.com/UltimateHackingKeyboard/agent/releases/latest) which includes the latest firmware version. You'll be easily able to update the firmware within Agent.
## Cloning the repository
Please make sure to clone this repo with:
@@ -18,9 +22,13 @@ Install [Kinetis Design Studio](http://www.nxp.com/products/software-and-tools/r
## Building and flashing the firmware
For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk-left release jlink*, and click on the *Debug* button.
For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk60-left_release_jlink*, and click on the *Debug* button.
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk-right release blhost*, and click on the *Debug* button. Please note that this update method only works on Linux out of the box. On other operating systems, you have to execute the relevant commands of the [blhost-unix.sh](right/build/kds/blhost-unix.sh) script.
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first.
At this point, you can flash the right firmware via USB from KDS. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) that is Git submodule of the this repo and located in the `lib/agent` directory. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk60-right_release_kboot*, and click on the *Run* button.
From this point on, you can upgrade the firmwares of both halves via USB by using the uhk60-left_release_kboot and uhk60-right_release_kboot run configurations. Alternatively, you can use your SEGGER J-Link probe.
## Contributing

View File

@@ -1,3 +1,4 @@
/.settings/
/uhk60-left_debug/
/uhk60-left_release/
/uhk60-left_release/

View File

@@ -136,7 +136,7 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
// If parsing succeeded then apply the parsed values.
if (!ParserRunDry) {
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
// DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
// Update LED brightnesses and reinitialize LED drivers

View File

@@ -9,7 +9,7 @@
// Macros:
#define KEY_DEBOUNCER_INTERVAL_MSEC 1
#define KEY_DEBOUNCER_TIMEOUT_MSEC 10
#define KEY_DEBOUNCER_TIMEOUT_MSEC 30
// Functions:

View File

@@ -36,7 +36,7 @@ uint8_t UsbBasicKeyboardReportDescriptor[USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LE
// Scancodes
HID_RI_LOGICAL_MINIMUM(8, 0x00),
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
HID_RI_LOGICAL_MAXIMUM(16, 0xFF),
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_KEY_CODES),
HID_RI_USAGE_MINIMUM(8, 0x00),
HID_RI_USAGE_MAXIMUM(8, 0xFF),

View File

@@ -3,7 +3,7 @@
// Macros:
#define USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH 63
#define USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH 64
#define USB_BASIC_KEYBOARD_MAX_KEYS 6
// Variables:

View File

@@ -10,7 +10,7 @@ uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH]
// Input flowing from device to host
HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_IN),
HID_RI_LOGICAL_MINIMUM(8, 0x00),
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
HID_RI_LOGICAL_MAXIMUM(16, 0xFF),
HID_RI_REPORT_SIZE(8, 0x08),
HID_RI_REPORT_COUNT(8, USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE),
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
@@ -18,7 +18,7 @@ uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH]
// Output flowing from host to device
HID_RI_USAGE(8, USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_DATA_OUT),
HID_RI_LOGICAL_MINIMUM(8, 0x00),
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
HID_RI_LOGICAL_MAXIMUM(16, 0xFF),
HID_RI_REPORT_SIZE(8, 0x08),
HID_RI_REPORT_COUNT(8, USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE),
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),

View File

@@ -3,7 +3,7 @@
// Macros:
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 31
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH 33
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_PAGE_INDEX 0x80
#define USB_GENERIC_HID_REPORT_DESCRIPTOR_VENDOR_USAGE_COLLECTION 0x81

View File

@@ -5,14 +5,16 @@ uint8_t UsbSystemKeyboardReportDescriptor[USB_SYSTEM_KEYBOARD_REPORT_DESCRIPTOR_
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_GENERIC_DESKTOP),
HID_RI_USAGE(8, HID_RI_USAGE_GENERIC_DESKTOP_SYSTEM_CONTROL),
HID_RI_COLLECTION(8, HID_RI_COLLECTION_APPLICATION),
// System key
HID_RI_REPORT_SIZE(8, 2),
HID_RI_REPORT_COUNT(8, USB_SYSTEM_KEYBOARD_MAX_KEYS),
HID_RI_LOGICAL_MINIMUM(8, 1),
HID_RI_LOGICAL_MAXIMUM(8, 3),
HID_RI_USAGE(8, 0x82),
HID_RI_USAGE(8, 0x81),
HID_RI_USAGE(8, 0x83),
HID_RI_INPUT(8, HID_IOF_NO_PREFERRED_STATE | HID_IOF_NULLSTATE),
// System keys
HID_RI_USAGE_MINIMUM(8, 0x81), // SYSTEM_POWER_DOWN, SYSTEM_SLEEP and SYSTEM_WAKE_UP
HID_RI_USAGE_MAXIMUM(8, 0x83),
HID_RI_REPORT_SIZE(8, 1),
HID_RI_REPORT_COUNT(8, 3),
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
// Padding
HID_RI_REPORT_SIZE(8, 1),
HID_RI_REPORT_COUNT(8, 5),
HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
HID_RI_END_COLLECTION(0),
};

View File

@@ -1,9 +1,11 @@
#include "led_display.h"
#include "usb_composite_device.h"
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
uint32_t UsbBasicKeyboardActionCounter;
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
bool IsUsbBasicKeyboardReportSent = false;
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
{
@@ -41,10 +43,28 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
}
break;
case kUSB_DeviceHidEventGetReport:
case kUSB_DeviceHidEventSetReport:
case kUSB_DeviceHidEventRequestReportBuffer:
error = kStatus_USB_InvalidRequest;
break;
case kUSB_DeviceHidEventSetReport: {
usb_device_hid_report_struct_t *report = (usb_device_hid_report_struct_t*)param;
if (report->reportType == USB_DEVICE_HID_REQUEST_GET_REPORT_TYPE_OUPUT && report->reportId == 0 && report->reportLength == 1) {
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, report->reportBuffer[0] & HID_KEYBOARD_LED_CAPSLOCK);
error = kStatus_USB_Success;
} else {
error = kStatus_USB_InvalidRequest;
}
break;
}
case kUSB_DeviceHidEventRequestReportBuffer: {
usb_device_hid_report_struct_t *report = (usb_device_hid_report_struct_t*)param;
if (report->reportLength <= USB_BASIC_KEYBOARD_REPORT_LENGTH) {
report->reportBuffer = usbBasicKeyboardInBuffer;
error = kStatus_USB_Success;
} else {
error = kStatus_USB_InvalidRequest;
}
break;
}
case kUSB_DeviceHidEventGetIdle:
case kUSB_DeviceHidEventGetProtocol:
case kUSB_DeviceHidEventSetIdle:

View File

@@ -20,7 +20,8 @@
uint32_t UsbReportUpdateTime = 0;
static uint32_t elapsedTime;
uint16_t DoubleTapSwitchLayerTimeout = 250;
uint16_t DoubleTapSwitchLayerTimeout = 150;
uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
@@ -191,11 +192,13 @@ static layer_id_t previousLayer = LayerId_Base;
static uint8_t basicScancodeIndex = 0;
static uint8_t mediaScancodeIndex = 0;
static uint8_t systemScancodeIndex = 0;
key_state_t *doubleTapSwitchLayerKey;
uint32_t doubleTapSwitchLayerStartTime;
void applyKeyAction(key_state_t *keyState, key_action_t *action)
{
static key_state_t *doubleTapSwitchLayerKey;
static uint32_t doubleTapSwitchLayerStartTime;
static uint32_t doubleTapSwitchLayerTriggerTime;
if (keyState->suppressed) {
return;
}
@@ -233,16 +236,20 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
activeMouseStates[action->mouseAction] = true;
break;
case KeyActionType_SwitchLayer:
if (keyState->previous && doubleTapSwitchLayerKey == keyState &&
Timer_GetElapsedTime(&doubleTapSwitchLayerTriggerTime) > DoubleTapSwitchLayerReleaseTimeout)
{
ToggledLayer = LayerId_Base;
}
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
if (doubleTapSwitchLayerKey) {
if (Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
ToggledLayer = action->switchLayer.layer;
}
doubleTapSwitchLayerKey = NULL;
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
ToggledLayer = action->switchLayer.layer;
doubleTapSwitchLayerTriggerTime = CurrentTime;
} else {
doubleTapSwitchLayerKey = keyState;
doubleTapSwitchLayerStartTime = CurrentTime;
}
doubleTapSwitchLayerStartTime = CurrentTime;
}
break;
case KeyActionType_SwitchKeymap:
@@ -258,10 +265,8 @@ static uint8_t secondaryRoleSlotId;
static uint8_t secondaryRoleKeyId;
static secondary_role_t secondaryRole;
#define pos 35
void updateActiveUsbReports(void)
{
SetDebugBufferUint32(pos, 1);
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
static uint8_t previousModifiers = 0;
@@ -293,7 +298,6 @@ void updateActiveUsbReports(void)
memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
return;
}
SetDebugBufferUint32(pos, 2);
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
@@ -347,10 +351,8 @@ void updateActiveUsbReports(void)
keyState->previous = keyState->current;
}
}
SetDebugBufferUint32(pos, 4);
processMouseActions();
SetDebugBufferUint32(pos, 5);
// When a layer switcher key gets pressed along with another key that produces some modifiers
// and the accomanying key gets released then keep the related modifiers active a long as the
@@ -365,7 +367,6 @@ void updateActiveUsbReports(void)
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
previousLayer = activeLayer;
SetDebugBufferUint32(pos, 7);
}
bool UsbBasicKeyboardReportEverSent = false;

View File

@@ -15,7 +15,7 @@
"commander": "^2.11.0",
"shelljs": "^0.7.8"
},
"firmwareVersion": "8.1.0",
"firmwareVersion": "8.1.4",
"deviceProtocolVersion": "4.2.0",
"moduleProtocolVersion": "4.0.0",
"userConfigVersion": "4.0.0",

View File

@@ -20,7 +20,7 @@
#define FIRMWARE_MAJOR_VERSION 8
#define FIRMWARE_MINOR_VERSION 1
#define FIRMWARE_PATCH_VERSION 0
#define FIRMWARE_PATCH_VERSION 4
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
#define DEVICE_PROTOCOL_MINOR_VERSION 2