From fc434c7857ee2c42c80473b129c47efee4ff37ad Mon Sep 17 00:00:00 2001 From: Robert Csordas Date: Sun, 13 Nov 2016 15:50:49 +0100 Subject: [PATCH] Remove keyboard scanning from USB interrupt. Fix initial blink of LEDs when initializing. Coding style fixes. --- right/src/keyboard_layout.h | 20 +++-- right/src/led_driver.c | 8 +- right/src/led_driver.h | 2 +- right/src/main.c | 4 +- right/src/usb_interface_keyboard.c | 114 ++++++++++++++++++----------- right/src/usb_interface_keyboard.h | 1 + shared/i2c_adddresses.c | 8 +- shared/i2c_addresses.h | 4 +- 8 files changed, 99 insertions(+), 62 deletions(-) diff --git a/right/src/keyboard_layout.h b/right/src/keyboard_layout.h index 1df1e6e..881ac0e 100644 --- a/right/src/keyboard_layout.h +++ b/right/src/keyboard_layout.h @@ -38,18 +38,26 @@ static inline __attribute__((always_inline)) uint8_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t keyId, uint8_t modifierState) { - if (keyId=USB_KEYBOARD_MAX_KEYS) { + break; + } + + if (keyMatrix.keyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, keyId, modifierState); + if (code) { + UsbKeyboardReport[newLayout].scancodes[scancodeIdx++] = code; + } + } + } + + for (uint8_t keyId=0; keyId=USB_KEYBOARD_MAX_KEYS) { + break; + } + + if (leftKeyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, LAYOUT_LEFT_OFFSET+keyId, modifierState); + if (code) { + UsbKeyboardReport[newLayout].scancodes[scancodeIdx++] = code; + } + } + } + + //Change to the new layout in atomic operation (int copy). Even if + //the copy is not atomic itself, only single bit changes. So it can + //never be a problem + activeLayout = newLayout; +} static usb_status_t UsbKeyboardAction(void) { - uint8_t leftKeyStates[KEY_STATE_COUNT] = {0}; - - UsbKeyboardReport.modifiers = 0; - UsbKeyboardReport.reserved = 0; - - KeyMatrix_Init(&keyMatrix); - KeyMatrix_Scan(&keyMatrix); - - uint8_t scancodeIdx; - for (uint8_t scancodeIdx=0; scancodeIdx=USB_KEYBOARD_MAX_KEYS) - break; - - if (keyMatrix.keyStates[keyId]) { - uint8_t code=getKeycode(defaultKeyboardLayout, keyId, modifierState); - if (code) - UsbKeyboardReport.scancodes[scancodeIdx++] = code; - } - } - - for (uint8_t keyId=0; keyId=USB_KEYBOARD_MAX_KEYS) - break; - - if (leftKeyStates[keyId]) { - uint8_t code=getKeycode(defaultKeyboardLayout, LAYOUT_LEFT_OFFSET+keyId, modifierState); - if (code) - UsbKeyboardReport.scancodes[scancodeIdx++] = code; - } - } - return USB_DeviceHidSend(UsbCompositeDevice.keyboardHandle, USB_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)&UsbKeyboardReport, USB_KEYBOARD_REPORT_LENGTH); + (uint8_t*)&UsbKeyboardReport[activeLayout], USB_KEYBOARD_REPORT_LENGTH); } usb_status_t UsbKeyboardCallback(class_handle_t handle, uint32_t event, void *param) diff --git a/right/src/usb_interface_keyboard.h b/right/src/usb_interface_keyboard.h index b858751..c3fc84a 100644 --- a/right/src/usb_interface_keyboard.h +++ b/right/src/usb_interface_keyboard.h @@ -36,4 +36,5 @@ extern usb_status_t UsbKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration); extern usb_status_t UsbKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting); + extern void usbKeyboadTask(); #endif diff --git a/shared/i2c_adddresses.c b/shared/i2c_adddresses.c index 948d22b..3f3a650 100644 --- a/shared/i2c_adddresses.c +++ b/shared/i2c_adddresses.c @@ -1,7 +1,7 @@ #include "fsl_i2c.h" #include "i2c_addresses.h" -void I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) +status_t I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) { i2c_master_transfer_t masterXfer; masterXfer.slaveAddress = i2cAddress; @@ -11,10 +11,10 @@ void I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t s masterXfer.data = data; masterXfer.dataSize = size; masterXfer.flags = kI2C_TransferDefaultFlag; - I2C_MasterTransferBlocking(baseAddress, &masterXfer); + return I2C_MasterTransferBlocking(baseAddress, &masterXfer); } -void I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) +status_t I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) { i2c_master_transfer_t masterXfer; masterXfer.slaveAddress = i2cAddress; @@ -24,5 +24,5 @@ void I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t masterXfer.data = data; masterXfer.dataSize = size; masterXfer.flags = kI2C_TransferDefaultFlag; - I2C_MasterTransferBlocking(baseAddress, &masterXfer); + return I2C_MasterTransferBlocking(baseAddress, &masterXfer); } diff --git a/shared/i2c_addresses.h b/shared/i2c_addresses.h index 687db97..5678d77 100644 --- a/shared/i2c_addresses.h +++ b/shared/i2c_addresses.h @@ -29,7 +29,7 @@ // Functions: - void I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); - void I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); + status_t I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); + status_t I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); #endif