7 Commits

10 changed files with 110 additions and 63 deletions

View File

@@ -5,6 +5,19 @@ 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.
## [8.3.0] - 2018-06-03
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.**1.0** | Hardware Config: 1.0.0
- Make the config parser handle switch layer actions with hold on double tap disabled. `USERCONFIG:MINOR`
- Set key debounce timeout from 80ms to 100ms. This should further reduce key chattering.
## [8.2.5] - 2018-05-27
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
- Now really fix the bug that made the hardware and user configuration not load from the EEPROM on some hosts right after firmware update.
## [8.2.4] - 2018-05-21 ## [8.2.4] - 2018-05-21
Device Protocol: 4.3.**1** | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0 Device Protocol: 4.3.**1** | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0

View File

@@ -48,7 +48,7 @@ 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;
uint8_t mode = ReadBool(buffer) ? SwitchLayerMode_Toggle : SwitchLayerMode_HoldAndDoubleTapToggle; uint8_t mode = ReadUInt8(buffer);
KeyAction->type = KeyActionType_SwitchLayer; KeyAction->type = KeyActionType_SwitchLayer;
KeyAction->switchLayer.layer = layer; KeyAction->switchLayer.layer = layer;

View File

@@ -35,10 +35,12 @@
#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_GPIO GPIOC
#define I2C_EEPROM_BUS_SDA_PORT PORTC #define I2C_EEPROM_BUS_SDA_PORT PORTC
#define I2C_EEPROM_BUS_SDA_CLOCK kCLOCK_PortC #define I2C_EEPROM_BUS_SDA_CLOCK kCLOCK_PortC
#define I2C_EEPROM_BUS_SDA_PIN 11 #define I2C_EEPROM_BUS_SDA_PIN 11
#define I2C_EEPROM_BUS_SCL_GPIO GPIOC
#define I2C_EEPROM_BUS_SCL_PORT PORTC #define I2C_EEPROM_BUS_SCL_PORT PORTC
#define I2C_EEPROM_BUS_SCL_CLOCK kCLOCK_PortC #define I2C_EEPROM_BUS_SCL_CLOCK kCLOCK_PortC
#define I2C_EEPROM_BUS_SCL_PIN 10 #define I2C_EEPROM_BUS_SCL_PIN 10

View File

@@ -21,6 +21,38 @@ bool IsBusPalOn;
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE; volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
volatile uint32_t I2cMainBusActualBaudRateBps; volatile uint32_t I2cMainBusActualBaudRateBps;
static i2c_bus_t i2cMainBus = {
.baseAddr = I2C_MAIN_BUS_BASEADDR,
.clockSrc = I2C_MAIN_BUS_CLK_SRC,
.mux = I2C_MAIN_BUS_MUX,
.sdaClock = I2C_MAIN_BUS_SDA_CLOCK,
.sdaGpio = I2C_MAIN_BUS_SDA_GPIO,
.sdaPort = I2C_MAIN_BUS_SDA_PORT,
.sdaPin = I2C_MAIN_BUS_SDA_PIN,
.sclClock = I2C_MAIN_BUS_SCL_CLOCK,
.sclGpio = I2C_MAIN_BUS_SCL_GPIO,
.sclPort = I2C_MAIN_BUS_SCL_PORT,
.sclPin = I2C_MAIN_BUS_SCL_PIN,
};
static i2c_bus_t i2cEepromBus = {
.baseAddr = I2C_EEPROM_BUS_BASEADDR,
.clockSrc = I2C_EEPROM_BUS_CLK_SRC,
.mux = I2C_EEPROM_BUS_MUX,
.sdaClock = I2C_EEPROM_BUS_SDA_CLOCK,
.sdaGpio = I2C_EEPROM_BUS_SDA_GPIO,
.sdaPort = I2C_EEPROM_BUS_SDA_PORT,
.sdaPin = I2C_EEPROM_BUS_SDA_PIN,
.sclClock = I2C_EEPROM_BUS_SCL_CLOCK,
.sclGpio = I2C_EEPROM_BUS_SCL_GPIO,
.sclPort = I2C_EEPROM_BUS_SCL_PORT,
.sclPin = I2C_EEPROM_BUS_SCL_PIN,
};
static void initBusPalState(void) { static void initBusPalState(void) {
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal; IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
if (IsBusPalOn) { if (IsBusPalOn) {
@@ -32,12 +64,12 @@ static void initBusPalState(void) {
static void initInterruptPriorities(void) static void initInterruptPriorities(void)
{ {
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1); NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2); NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0);
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 2); NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3);
NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 3); NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 4);
NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 3); NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 4);
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 3); NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 4);
NVIC_SetPriority(USB_IRQ_ID, 3); NVIC_SetPriority(USB_IRQ_ID, 4);
} }
static void delay(void) static void delay(void)
@@ -45,91 +77,73 @@ static void delay(void)
for (volatile uint32_t i=0; i<62; i++); for (volatile uint32_t i=0; i<62; i++);
} }
static void recoverI2c(void) static void recoverI2cBus(i2c_bus_t *i2cBus)
{ {
PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio); PORT_SetPinMux(i2cBus->sdaPort, i2cBus->sdaPin, kPORT_MuxAsGpio);
PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio); PORT_SetPinMux(i2cBus->sclPort, i2cBus->sclPin, kPORT_MuxAsGpio);
GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); GPIO_PinInit(i2cBus->sclGpio, i2cBus->sclPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
bool isOn = true; bool isOn = true;
for (int i=0; i<20; i++) { for (int i=0; i<20; i++) {
GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalInput}); GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalInput});
bool isSdaHigh = GPIO_ReadPinInput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN); bool isSdaHigh = GPIO_ReadPinInput(i2cBus->sdaGpio, i2cBus->sdaPin);
GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
if (isSdaHigh) { if (isSdaHigh) {
return; return;
} }
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, isOn); GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, isOn);
delay(); delay();
isOn = !isOn; isOn = !isOn;
} }
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0); GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 0);
delay(); delay();
GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, 1);
delay(); delay();
GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1); GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 1);
delay(); delay();
} }
static void initI2cMainBus(void) static void initI2cBus(i2c_bus_t *i2cBus)
{ {
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK); CLOCK_EnableClock(i2cBus->sdaClock);
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK); CLOCK_EnableClock(i2cBus->sclClock);
recoverI2c(); recoverI2cBus(i2cBus);
port_pin_config_t pinConfig = { port_pin_config_t pinConfig = {
.pullSelect = kPORT_PullUp, .pullSelect = kPORT_PullUp,
.openDrainEnable = kPORT_OpenDrainEnable, .openDrainEnable = kPORT_OpenDrainEnable,
.mux = I2C_MAIN_BUS_MUX, .mux = i2cBus->mux,
}; };
PORT_SetPinConfig(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, &pinConfig); PORT_SetPinConfig(i2cBus->sdaPort, i2cBus->sdaPin, &pinConfig);
PORT_SetPinConfig(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, &pinConfig); PORT_SetPinConfig(i2cBus->sclPort, i2cBus->sclPin, &pinConfig);
i2c_master_config_t masterConfig; i2c_master_config_t masterConfig;
I2C_MasterGetDefaultConfig(&masterConfig); I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = I2cMainBusRequestedBaudRateBps; masterConfig.baudRate_Bps = i2cBus == &i2cMainBus ? I2cMainBusRequestedBaudRateBps : I2C_EEPROM_BUS_BAUD_RATE;
uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC); uint32_t sourceClock = CLOCK_GetFreq(i2cBus->clockSrc);
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock); I2C_MasterInit(i2cBus->baseAddr, &masterConfig, sourceClock);
if (i2cBus == &i2cMainBus) {
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate; I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
}
} }
void ReinitI2cMainBus(void) void ReinitI2cMainBus(void)
{ {
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR); I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
initI2cMainBus(); initI2cBus(&i2cMainBus);
InitSlaveScheduler(); InitSlaveScheduler();
} }
static void initI2cEepromBus(void)
{
port_pin_config_t pinConfig = {
.pullSelect = kPORT_PullUp,
.openDrainEnable = kPORT_OpenDrainEnable,
.mux = I2C_EEPROM_BUS_MUX,
};
CLOCK_EnableClock(I2C_EEPROM_BUS_SDA_CLOCK);
CLOCK_EnableClock(I2C_EEPROM_BUS_SCL_CLOCK);
PORT_SetPinConfig(I2C_EEPROM_BUS_SDA_PORT, I2C_EEPROM_BUS_SDA_PIN, &pinConfig);
PORT_SetPinConfig(I2C_EEPROM_BUS_SCL_PORT, I2C_EEPROM_BUS_SCL_PIN, &pinConfig);
i2c_master_config_t masterConfig;
I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = I2C_EEPROM_BUS_BAUD_RATE;
uint32_t sourceClock = CLOCK_GetFreq(I2C_EEPROM_BUS_CLK_SRC);
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
}
static void initI2c(void) static void initI2c(void)
{ {
initI2cMainBus(); initI2cBus(&i2cMainBus);
initI2cEepromBus(); initI2cBus(&i2cEepromBus);
} }
void InitPeripherals(void) void InitPeripherals(void)

View File

@@ -1,10 +1,28 @@
#ifndef __INIT_PERIPHERALS_H__ #ifndef __INIT_PERIPHERALS_H__
#define __INIT_PERIPHERALS_H__ #define __INIT_PERIPHERALS_H__
// Includes // Includes:
#include "fsl_common.h" #include "fsl_common.h"
// Typedefs:
typedef struct {
clock_name_t clockSrc;
I2C_Type *baseAddr;
uint16_t mux;
clock_ip_name_t sdaClock;
GPIO_Type *sdaGpio;
PORT_Type *sdaPort;
uint32_t sdaPin;
clock_ip_name_t sclClock;
GPIO_Type *sclGpio;
PORT_Type *sclPort;
uint32_t sclPin;
} i2c_bus_t;
// Variables: // Variables:
extern bool IsBusPalOn; extern bool IsBusPalOn;

View File

@@ -28,9 +28,9 @@
} keystroke_type_t; } keystroke_type_t;
typedef enum { typedef enum {
SwitchLayerMode_Hold,
SwitchLayerMode_HoldAndDoubleTapToggle, SwitchLayerMode_HoldAndDoubleTapToggle,
SwitchLayerMode_Toggle, SwitchLayerMode_Toggle,
SwitchLayerMode_Hold,
} switch_layer_mode_t; } switch_layer_mode_t;
typedef enum { typedef enum {

View File

@@ -9,7 +9,7 @@
// Macros: // Macros:
#define KEY_DEBOUNCER_INTERVAL_MSEC 1 #define KEY_DEBOUNCER_INTERVAL_MSEC 1
#define KEY_DEBOUNCER_TIMEOUT_MSEC 80 #define KEY_DEBOUNCER_TIMEOUT_MSEC 100
// Functions: // Functions:

View File

@@ -15,10 +15,10 @@
"commander": "^2.11.0", "commander": "^2.11.0",
"shelljs": "^0.7.8" "shelljs": "^0.7.8"
}, },
"firmwareVersion": "8.2.4", "firmwareVersion": "8.3.0",
"deviceProtocolVersion": "4.3.1", "deviceProtocolVersion": "4.3.1",
"moduleProtocolVersion": "4.0.0", "moduleProtocolVersion": "4.0.0",
"userConfigVersion": "4.0.1", "userConfigVersion": "4.1.0",
"hardwareConfigVersion": "1.0.0", "hardwareConfigVersion": "1.0.0",
"devices": [ "devices": [
{ {

View File

@@ -19,8 +19,8 @@
// Variables: // Variables:
#define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MAJOR_VERSION 8
#define FIRMWARE_MINOR_VERSION 2 #define FIRMWARE_MINOR_VERSION 3
#define FIRMWARE_PATCH_VERSION 4 #define FIRMWARE_PATCH_VERSION 0
#define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MAJOR_VERSION 4
#define DEVICE_PROTOCOL_MINOR_VERSION 3 #define DEVICE_PROTOCOL_MINOR_VERSION 3
@@ -31,8 +31,8 @@
#define MODULE_PROTOCOL_PATCH_VERSION 0 #define MODULE_PROTOCOL_PATCH_VERSION 0
#define USER_CONFIG_MAJOR_VERSION 4 #define USER_CONFIG_MAJOR_VERSION 4
#define USER_CONFIG_MINOR_VERSION 0 #define USER_CONFIG_MINOR_VERSION 1
#define USER_CONFIG_PATCH_VERSION 1 #define USER_CONFIG_PATCH_VERSION 0
#define HARDWARE_CONFIG_MAJOR_VERSION 1 #define HARDWARE_CONFIG_MAJOR_VERSION 1
#define HARDWARE_CONFIG_MINOR_VERSION 0 #define HARDWARE_CONFIG_MINOR_VERSION 0