diff --git a/right/build/uhk60-right_debug_kboot.launch b/right/build/uhk60-right_debug_kboot.launch
index 2f99728..980193d 100644
--- a/right/build/uhk60-right_debug_kboot.launch
+++ b/right/build/uhk60-right_debug_kboot.launch
@@ -19,7 +19,7 @@
-
+
diff --git a/right/build/uhk60-right_release_kboot.launch b/right/build/uhk60-right_release_kboot.launch
index 73feaae..9728e16 100644
--- a/right/build/uhk60-right_release_kboot.launch
+++ b/right/build/uhk60-right_release_kboot.launch
@@ -19,7 +19,7 @@
-
+
diff --git a/right/src/config.h b/right/src/config.h
index f5d3291..75e32d6 100644
--- a/right/src/config.h
+++ b/right/src/config.h
@@ -4,6 +4,7 @@
// Macros:
#define I2C_WATCHDOG
+// #define INTERRUPT_KEY_SCANNER
// #define LED_DRIVER_STRESS_TEST
#endif
diff --git a/right/src/init_peripherals.c b/right/src/init_peripherals.c
index 2fbdeb5..bad396e 100644
--- a/right/src/init_peripherals.c
+++ b/right/src/init_peripherals.c
@@ -19,6 +19,7 @@ void InitInterruptPriorities(void)
NVIC_SetPriority(I2C0_IRQn, 1);
NVIC_SetPriority(I2C1_IRQn, 1);
NVIC_SetPriority(USB0_IRQn, 1);
+ NVIC_SetPriority(PIT1_IRQn, 6);
}
void delay(void)
diff --git a/right/src/key_matrix_instance.c b/right/src/key_matrix_instance.c
new file mode 100644
index 0000000..41badb8
--- /dev/null
+++ b/right/src/key_matrix_instance.c
@@ -0,0 +1,22 @@
+#include "key_matrix_instance.h"
+
+key_matrix_t KeyMatrix = {
+ .colNum = KEYBOARD_MATRIX_COLS_NUM,
+ .rowNum = KEYBOARD_MATRIX_ROWS_NUM,
+ .cols = (key_matrix_pin_t[]){
+ {PORTA, GPIOA, kCLOCK_PortA, 5},
+ {PORTB, GPIOB, kCLOCK_PortB, 16},
+ {PORTB, GPIOB, kCLOCK_PortB, 17},
+ {PORTB, GPIOB, kCLOCK_PortB, 18},
+ {PORTB, GPIOB, kCLOCK_PortB, 19},
+ {PORTA, GPIOA, kCLOCK_PortA, 1},
+ {PORTB, GPIOB, kCLOCK_PortB, 1}
+ },
+ .rows = (key_matrix_pin_t[]){
+ {PORTA, GPIOA, kCLOCK_PortA, 12},
+ {PORTA, GPIOA, kCLOCK_PortA, 13},
+ {PORTC, GPIOC, kCLOCK_PortC, 1},
+ {PORTC, GPIOC, kCLOCK_PortC, 0},
+ {PORTD, GPIOD, kCLOCK_PortD, 5}
+ }
+};
diff --git a/right/src/key_matrix_instance.h b/right/src/key_matrix_instance.h
new file mode 100644
index 0000000..1541809
--- /dev/null
+++ b/right/src/key_matrix_instance.h
@@ -0,0 +1,17 @@
+#ifndef __KEY_MATRIX_INSTANCE_H__
+#define __KEY_MATRIX_INSTANCE_H__
+
+// Includes:
+
+ #include "key_matrix.h"
+
+// Macros:
+
+ #define KEYBOARD_MATRIX_COLS_NUM 7
+ #define KEYBOARD_MATRIX_ROWS_NUM 5
+
+// Variables:
+
+ extern key_matrix_t KeyMatrix;
+
+#endif
diff --git a/right/src/key_scanner.c b/right/src/key_scanner.c
new file mode 100644
index 0000000..23da4c8
--- /dev/null
+++ b/right/src/key_scanner.c
@@ -0,0 +1,23 @@
+#include "fsl_pit.h"
+#include "key_scanner.h"
+#include "usb_protocol_handler.h"
+
+uint32_t counter = 0;
+
+void PIT_KEY_SCANNER_HANDLER(void)
+{
+ *((uint32_t*)(UsbDebugInfo+20)) = counter++;
+ KeyMatrix_ScanRow(&KeyMatrix);
+ PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK);
+}
+
+void InitKeyScanner(void)
+{
+ pit_config_t pitConfig;
+ PIT_GetDefaultConfig(&pitConfig);
+ PIT_Init(PIT, &pitConfig);
+ PIT_SetTimerPeriod(PIT, PIT_KEY_SCANNER_CHANNEL, USEC_TO_COUNT(KEY_SCANNER_INTERVAL_USEC, PIT_SOURCE_CLOCK));
+ PIT_EnableInterrupts(PIT, PIT_KEY_SCANNER_CHANNEL, kPIT_TimerInterruptEnable);
+ EnableIRQ(PIT_KEY_SCANNER_IRQ_ID);
+ PIT_StartTimer(PIT, PIT_KEY_SCANNER_CHANNEL);
+}
diff --git a/right/src/key_scanner.h b/right/src/key_scanner.h
new file mode 100644
index 0000000..15da5b9
--- /dev/null
+++ b/right/src/key_scanner.h
@@ -0,0 +1,21 @@
+#ifndef __KEY_SCANNER_H__
+#define __KEY_SCANNER_H__
+
+// Includes:
+
+ #include "key_matrix_instance.h"
+
+// Macros:
+
+ #define KEY_SCANNER_INTERVAL_USEC (1000 / KEYBOARD_MATRIX_ROWS_NUM)
+
+ #define PIT_KEY_SCANNER_HANDLER PIT1_IRQHandler
+ #define PIT_KEY_SCANNER_IRQ_ID PIT1_IRQn
+ #define PIT_KEY_SCANNER_CHANNEL kPIT_Chnl_1
+ #define PIT_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_BusClk)
+
+// Functions:
+
+ void InitKeyScanner(void);
+
+#endif
diff --git a/right/src/main.c b/right/src/main.c
index cdc2ab5..f5db893 100644
--- a/right/src/main.c
+++ b/right/src/main.c
@@ -14,27 +14,8 @@
#include "command.h"
#include "bootloader/wormhole.h"
#include "eeprom.h"
-
-key_matrix_t KeyMatrix = {
- .colNum = KEYBOARD_MATRIX_COLS_NUM,
- .rowNum = KEYBOARD_MATRIX_ROWS_NUM,
- .cols = (key_matrix_pin_t[]){
- {PORTA, GPIOA, kCLOCK_PortA, 5},
- {PORTB, GPIOB, kCLOCK_PortB, 16},
- {PORTB, GPIOB, kCLOCK_PortB, 17},
- {PORTB, GPIOB, kCLOCK_PortB, 18},
- {PORTB, GPIOB, kCLOCK_PortB, 19},
- {PORTA, GPIOA, kCLOCK_PortA, 1},
- {PORTB, GPIOB, kCLOCK_PortB, 1}
- },
- .rows = (key_matrix_pin_t[]){
- {PORTA, GPIOA, kCLOCK_PortA, 12},
- {PORTA, GPIOA, kCLOCK_PortA, 13},
- {PORTC, GPIOC, kCLOCK_PortC, 1},
- {PORTC, GPIOC, kCLOCK_PortC, 0},
- {PORTD, GPIOD, kCLOCK_PortD, 5}
- }
-};
+#include "key_matrix_instance.h"
+#include "key_scanner.h"
uint8_t CurrentKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
@@ -44,19 +25,23 @@ void UpdateUsbReports(void)
return;
}
+#ifndef INTERRUPT_KEY_SCANNER
KeyMatrix_Scan(&KeyMatrix);
+#endif
memcpy(CurrentKeyStates[SlotId_RightKeyboardHalf], KeyMatrix.keyStates, MAX_KEY_COUNT_PER_MODULE);
ResetActiveUsbBasicKeyboardReport();
ResetActiveUsbMediaKeyboardReport();
ResetActiveUsbSystemKeyboardReport();
+ ResetActiveUsbMouseReport();
UpdateActiveUsbReports();
SwitchActiveUsbBasicKeyboardReport();
SwitchActiveUsbMediaKeyboardReport();
SwitchActiveUsbSystemKeyboardReport();
+ SwitchActiveUsbMouseReport();
IsUsbBasicKeyboardReportSent = false;
}
@@ -87,6 +72,9 @@ void main(void)
} else {
InitSlaveScheduler();
KeyMatrix_Init(&KeyMatrix);
+#ifdef INTERRUPT_KEY_SCANNER
+ InitKeyScanner();
+#endif
UpdateUsbReports();
InitUsb();
diff --git a/right/src/main.h b/right/src/main.h
index c70db75..0f4b2fd 100644
--- a/right/src/main.h
+++ b/right/src/main.h
@@ -7,14 +7,8 @@
#include "slot.h"
#include "module.h"
-// Macros:
-
- #define KEYBOARD_MATRIX_COLS_NUM 7
- #define KEYBOARD_MATRIX_ROWS_NUM 5
-
// Variables:
- extern key_matrix_t KeyMatrix;
extern uint8_t PreviousKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
extern uint8_t CurrentKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
extern void UpdateUsbReports(void);
diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c
index b593a2b..068d034 100644
--- a/right/src/usb_interfaces/usb_interface_mouse.c
+++ b/right/src/usb_interfaces/usb_interface_mouse.c
@@ -4,6 +4,7 @@
#include "i2c.h"
#include "peripherals/reset_button.h"
#include "key_action.h"
+#include "usb_protocol_handler.h"
static usb_device_endpoint_struct_t UsbMouseEndpoints[USB_MOUSE_ENDPOINT_COUNT] = {{
USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
@@ -37,12 +38,33 @@ usb_device_class_struct_t UsbMouseClass = {
USB_DEVICE_CONFIGURATION_COUNT,
};
-usb_mouse_report_t UsbMouseReport;
+usb_mouse_report_t usbMouseReports[2];
+usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
+bool IsUsbMouseReportSent = false;
+
+usb_mouse_report_t* getInactiveUsbMouseReport(void)
+{
+ return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
+}
+
+void SwitchActiveUsbMouseReport(void)
+{
+ ActiveUsbMouseReport = getInactiveUsbMouseReport();
+}
+
+void ResetActiveUsbMouseReport(void)
+{
+ bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
+}
static volatile usb_status_t usbMouseAction(void)
{
+ usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport();
+ *((uint16_t*)(UsbDebugInfo+16)) = mouseReport->x;
+ *((uint16_t*)(UsbDebugInfo+18)) = mouseReport->y;
+ IsUsbMouseReportSent = true;
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
- (uint8_t*)&UsbMouseReport, USB_MOUSE_REPORT_LENGTH);
+ (uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH);
}
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
diff --git a/right/src/usb_interfaces/usb_interface_mouse.h b/right/src/usb_interfaces/usb_interface_mouse.h
index 4f8b05c..bcfcfd8 100644
--- a/right/src/usb_interfaces/usb_interface_mouse.h
+++ b/right/src/usb_interfaces/usb_interface_mouse.h
@@ -31,8 +31,9 @@
// Variables:
+ extern bool IsUsbMouseReportSent;
extern usb_device_class_struct_t UsbMouseClass;
- extern usb_mouse_report_t UsbMouseReport;
+ extern usb_mouse_report_t* ActiveUsbMouseReport;
// Functions:
@@ -40,4 +41,7 @@
usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration);
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
+ void ResetActiveUsbMouseReport(void);
+ void SwitchActiveUsbMouseReport(void);
+
#endif
diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c
index e198cc6..2f4078f 100644
--- a/right/src/usb_report_updater.c
+++ b/right/src/usb_report_updater.c
@@ -27,10 +27,10 @@ void processMouseAction(key_action_t action)
if (mouseWheelDivisorCounter == MOUSE_WHEEL_DIVISOR) {
mouseWheelDivisorCounter = 0;
if (action.mouse.scrollActions & MouseScroll_Up) {
- UsbMouseReport.wheelX = 1;
+ ActiveUsbMouseReport->wheelX = 1;
}
if (action.mouse.scrollActions & MouseScroll_Down) {
- UsbMouseReport.wheelX = -1;
+ ActiveUsbMouseReport->wheelX = -1;
}
}
}
@@ -54,20 +54,20 @@ void processMouseAction(key_action_t action)
}
} else if (action.mouse.moveActions) {
if (action.mouse.moveActions & MouseMove_Left) {
- UsbMouseReport.x = -mouseSpeed;
+ ActiveUsbMouseReport->x = -mouseSpeed;
}
if (action.mouse.moveActions & MouseMove_Right) {
- UsbMouseReport.x = mouseSpeed;
+ ActiveUsbMouseReport->x = mouseSpeed;
}
if (action.mouse.moveActions & MouseMove_Up) {
- UsbMouseReport.y = -mouseSpeed;
+ ActiveUsbMouseReport->y = -mouseSpeed;
}
if (action.mouse.moveActions & MouseMove_Down) {
- UsbMouseReport.y = mouseSpeed;
+ ActiveUsbMouseReport->y = mouseSpeed;
}
}
- UsbMouseReport.buttons |= action.mouse.buttonActions;
+ ActiveUsbMouseReport->buttons |= action.mouse.buttonActions;
wasPreviousMouseActionWheelAction = isWheelAction;
}
@@ -90,8 +90,6 @@ uint8_t getActiveLayer(void)
void UpdateActiveUsbReports(void)
{
- bzero(&UsbMouseReport, sizeof(usb_mouse_report_t));
-
uint8_t basicScancodeIndex = 0;
uint8_t mediaScancodeIndex = 0;
uint8_t systemScancodeIndex = 0;
@@ -101,7 +99,7 @@ void UpdateActiveUsbReports(void)
if (MacroPlaying) {
Macros_ContinueMacro();
- memcpy(&UsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
+ memcpy(&ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
memcpy(&ActiveUsbBasicKeyboardReport, &MacroBasicKeyboardReport, sizeof MacroBasicKeyboardReport);
memcpy(&ActiveUsbMediaKeyboardReport, &MacroMediaKeyboardReport, sizeof MacroMediaKeyboardReport);
memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
diff --git a/shared/key_matrix.c b/shared/key_matrix.c
index 75c0b67..1d770df 100644
--- a/shared/key_matrix.c
+++ b/shared/key_matrix.c
@@ -34,6 +34,27 @@ void KeyMatrix_Scan(key_matrix_t *keyMatrix)
}
GPIO_WritePinOutput(rowGpio, rowPin, 0);
- for (volatile uint32_t i=0; i<100; i++); // Wait for the new port state to settle. This avoid bogus key state detection.
+ for (volatile uint32_t i=0; i<100; i++); // Wait for the new port state to settle. This avoids bogus key state detection.
+ }
+}
+
+void KeyMatrix_ScanRow(key_matrix_t *keyMatrix)
+{
+ uint8_t *keyState = keyMatrix->keyStates + keyMatrix->currentRowNum * keyMatrix->colNum;
+ key_matrix_pin_t *row = keyMatrix->rows + keyMatrix->currentRowNum;
+ GPIO_Type *rowGpio = row->gpio;
+ uint32_t rowPin = row->pin;
+
+ GPIO_WritePinOutput(rowGpio, rowPin, 1);
+
+ key_matrix_pin_t *colEnd = keyMatrix->cols + keyMatrix->colNum;
+ for (key_matrix_pin_t *col = keyMatrix->cols; colgpio, col->pin);
+ }
+
+ GPIO_WritePinOutput(rowGpio, rowPin, 0);
+
+ if (++keyMatrix->currentRowNum >= keyMatrix->rowNum) {
+ keyMatrix->currentRowNum = 0;
}
}
diff --git a/shared/key_matrix.h b/shared/key_matrix.h
index 6b2b753..d7486b4 100644
--- a/shared/key_matrix.h
+++ b/shared/key_matrix.h
@@ -22,6 +22,7 @@
typedef struct {
uint8_t colNum;
uint8_t rowNum;
+ uint8_t currentRowNum;
key_matrix_pin_t *cols;
key_matrix_pin_t *rows;
uint8_t keyStates[MAX_KEYS_IN_MATRIX];
@@ -31,5 +32,6 @@
void KeyMatrix_Init(key_matrix_t *keyMatrix);
void KeyMatrix_Scan(key_matrix_t *keyMatrix);
+ void KeyMatrix_ScanRow(key_matrix_t *keyMatrix);
#endif