diff --git a/left/src/bridge_protocol_handler.c b/left/src/bridge_protocol_handler.c new file mode 100644 index 0000000..a0ac92a --- /dev/null +++ b/left/src/bridge_protocol_handler.c @@ -0,0 +1,40 @@ +#include "bridge_protocol_handler.h" +#include "test_led.h" +#include "main.h" +#include "i2c_addresses.h" +#include "i2c.h" + +void SetError(uint8_t error); +void SetGenericError(); +void SetResponseByte(uint8_t response); + +void SetError(uint8_t error) { + BridgeTxBuffer[0] = error; +} + +void SetGenericError() +{ + SetError(PROTOCOL_RESPONSE_GENERIC_ERROR); +} + +// Set a single byte as the response. +void SetResponseByte(uint8_t response) +{ + BridgeTxBuffer[1] = response; +} + +void BridgeProtocolHandler() +{ + uint8_t commandId = BridgeRxBuffer[0]; + switch (commandId) { + case BRIDGE_COMMAND_GET_KEY_STATES: + BridgeTxSize = KEYBOARD_MATRIX_COLS_NUM*KEYBOARD_MATRIX_ROWS_NUM; + memcpy(BridgeTxBuffer, keyMatrix.keyStates, BridgeTxSize); + break; + case BRIDGE_COMMAND_SET_LED: + TEST_LED_OFF(); + BridgeTxSize = 0; + TEST_LED_SET(BridgeRxBuffer[1]); + break; + } +} diff --git a/left/src/bridge_protocol_handler.h b/left/src/bridge_protocol_handler.h new file mode 100644 index 0000000..dbee2a3 --- /dev/null +++ b/left/src/bridge_protocol_handler.h @@ -0,0 +1,29 @@ +#ifndef __BRIDGE_PROTOCOL_HANDLER__ +#define __BRIDGE_PROTOCOL_HANDLER__ + +// Includes: + + #include "fsl_port.h" + +// Macros: + + #define BRIDGE_RX_BUFFER_SIZE 100 + #define BRIDGE_TX_BUFFER_SIZE 100 + + #define PROTOCOL_RESPONSE_SUCCESS 0 + #define PROTOCOL_RESPONSE_GENERIC_ERROR 1 + + #define BRIDGE_COMMAND_GET_KEY_STATES 0 + #define BRIDGE_COMMAND_SET_LED 1 + +// Variables: + + uint8_t BridgeRxBuffer[BRIDGE_RX_BUFFER_SIZE]; + uint8_t BridgeTxBuffer[BRIDGE_TX_BUFFER_SIZE]; + uint8_t BridgeTxSize; + +// Functions: + + extern void BridgeProtocolHandler(); + +#endif diff --git a/left/src/main.c b/left/src/main.c index 7fc95f1..fbefb07 100644 --- a/left/src/main.c +++ b/left/src/main.c @@ -2,14 +2,13 @@ #include "init_clock.h" #include "fsl_port.h" #include "fsl_i2c.h" +#include "main.h" #include "key_matrix.h" #include "test_led.h" #include "i2c_addresses.h" #include "i2c.h" #include "init_peripherials.h" - -#define KEYBOARD_MATRIX_COLS_NUM 7 -#define KEYBOARD_MATRIX_ROWS_NUM 5 +#include "bridge_protocol_handler.h" key_matrix_t keyMatrix = { .colNum = KEYBOARD_MATRIX_COLS_NUM, @@ -40,12 +39,18 @@ static void i2c_slave_callback(I2C_Type *base, i2c_slave_transfer_t *xfer, void switch (xfer->event) { case kI2C_SlaveTransmitEvent: - xfer->data = keyMatrix.keyStates; - xfer->dataSize = KEYBOARD_MATRIX_COLS_NUM*KEYBOARD_MATRIX_ROWS_NUM; + BridgeProtocolHandler(); + xfer->data = BridgeTxBuffer; + xfer->dataSize = BridgeTxSize; break; case kI2C_SlaveReceiveEvent: + BridgeProtocolHandler(); + xfer->data = BridgeRxBuffer; + xfer->dataSize = BRIDGE_RX_BUFFER_SIZE; break; case kI2C_SlaveCompletionEvent: + xfer->data = NULL; + xfer->dataSize = 0; break; case kI2C_SlaveTransmitAckEvent: break; @@ -64,6 +69,7 @@ int main(void) slaveConfig.addressingMode = kI2C_Address7bit/kI2C_RangeMatch; I2C_SlaveInit(I2C_BUS_BASEADDR, &slaveConfig); I2C_SlaveTransferCreateHandle(I2C_BUS_BASEADDR, &slaveHandle, i2c_slave_callback, NULL); + slaveHandle.eventMask |= kI2C_SlaveCompletionEvent; I2C_SlaveTransferNonBlocking(I2C_BUS_BASEADDR, &slaveHandle, kI2C_SlaveCompletionEvent); KeyMatrix_Init(&keyMatrix); diff --git a/left/src/main.h b/left/src/main.h new file mode 100644 index 0000000..7df0c8c --- /dev/null +++ b/left/src/main.h @@ -0,0 +1,17 @@ +#ifndef __MAIN_H__ +#define __MAIN_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/left/src/test_led.h b/left/src/test_led.h index 01e71cc..9775f25 100644 --- a/left/src/test_led.h +++ b/left/src/test_led.h @@ -10,13 +10,14 @@ #define LOGIC_LED_ON 0U #define LOGIC_LED_OFF 1U - #define TEST_LED_GPIO GPIOA - #define TEST_LED_PORT PORTA - #define TEST_LED_CLOCK kCLOCK_PortA - #define TEST_LED_PIN 12 + #define TEST_LED_GPIO GPIOA + #define TEST_LED_PORT PORTA + #define TEST_LED_CLOCK kCLOCK_PortA + #define TEST_LED_PIN 12 #define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN) #define TEST_LED_OFF() GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN) + #define TEST_LED_SET(state) GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_PIN, !(state)) #define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN) // Functions: diff --git a/right/src/usb_interface_keyboard.c b/right/src/usb_interface_keyboard.c index 799379d..673ecd5 100644 --- a/right/src/usb_interface_keyboard.c +++ b/right/src/usb_interface_keyboard.c @@ -81,15 +81,10 @@ static usb_status_t UsbKeyboardAction(void) UsbKeyboardReport.scancodes[scancodeIdx] = 0; } - i2c_master_transfer_t masterXfer; - masterXfer.slaveAddress = I2C_ADDRESS_LEFT_KEYBOARD_HALF; - masterXfer.direction = kI2C_Read; - masterXfer.subaddress = 0; - masterXfer.subaddressSize = 0; - masterXfer.data = leftKeyStates; - masterXfer.dataSize = KEY_STATE_COUNT; - masterXfer.flags = kI2C_TransferDefaultFlag; - I2C_MasterTransferBlocking(I2C_MAIN_BUS_BASEADDR, &masterXfer); + uint8_t data[] = {0}; + I2cWrite(I2C_MAIN_BUS_BASEADDR, I2C_ADDRESS_LEFT_KEYBOARD_HALF, data, sizeof(data)); + + I2cRead(I2C_MAIN_BUS_BASEADDR, I2C_ADDRESS_LEFT_KEYBOARD_HALF, leftKeyStates, KEY_STATE_COUNT); scancodeIdx = 0; for (uint8_t keyId=0; keyId