diff --git a/left/build/kds/.project b/left/build/kds/.project
index 7129608..9b30aed 100644
--- a/left/build/kds/.project
+++ b/left/build/kds/.project
@@ -71,6 +71,16 @@
1
PARENT-3-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_gpio.h
+
+ drivers/fsl_i2c.c
+ 1
+ PARENT-3-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_i2c.c
+
+
+ drivers/fsl_i2c.h
+ 1
+ PARENT-3-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_i2c.h
+
drivers/fsl_port.h
1
diff --git a/left/src/i2c.h b/left/src/i2c.h
new file mode 100644
index 0000000..4d34f7c
--- /dev/null
+++ b/left/src/i2c.h
@@ -0,0 +1,19 @@
+#ifndef __I2C_H__
+#define __I2C_H__
+
+// Macros:
+
+ #define I2C_BUS_BASEADDR I2C0
+ #define I2C_BUS_CLK_SRC I2C0_CLK_SRC
+ #define I2C_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable.
+ #define I2C_BUS_MUX kPORT_MuxAlt2
+
+ #define I2C_BUS_SDA_PORT PORTB
+ #define I2C_BUS_SDA_CLOCK kCLOCK_PortB
+ #define I2C_BUS_SDA_PIN 4
+
+ #define I2C_BUS_SCL_PORT PORTB
+ #define I2C_BUS_SCL_CLOCK kCLOCK_PortB
+ #define I2C_BUS_SCL_PIN 3
+
+#endif
diff --git a/left/src/init_peripherials.c b/left/src/init_peripherials.c
new file mode 100644
index 0000000..bcfaa6e
--- /dev/null
+++ b/left/src/init_peripherials.c
@@ -0,0 +1,36 @@
+#include "fsl_common.h"
+#include "fsl_port.h"
+#include "test_led.h"
+#include "i2c_addresses.h"
+#include "fsl_i2c.h"
+#include "fsl_clock.h"
+#include "i2c.h"
+
+void InitI2c() {
+ port_pin_config_t pinConfig = {
+ .pullSelect = kPORT_PullUp,
+ };
+
+ i2c_master_config_t masterConfig;
+ I2C_MasterGetDefaultConfig(&masterConfig);
+ uint32_t sourceClock;
+
+ // Initialize main bus
+
+ CLOCK_EnableClock(I2C_BUS_SDA_CLOCK);
+ CLOCK_EnableClock(I2C_BUS_SCL_CLOCK);
+
+ pinConfig.mux = I2C_BUS_MUX;
+ PORT_SetPinConfig(I2C_BUS_SDA_PORT, I2C_BUS_SDA_PIN, &pinConfig);
+ PORT_SetPinConfig(I2C_BUS_SCL_PORT, I2C_BUS_SCL_PIN, &pinConfig);
+
+ masterConfig.baudRate_Bps = I2C_BUS_BAUD_RATE;
+ sourceClock = CLOCK_GetFreq(I2C_BUS_CLK_SRC);
+ I2C_MasterInit(I2C_BUS_BASEADDR, &masterConfig, sourceClock);
+}
+
+void InitPeripherials(void)
+{
+ InitTestLed();
+ InitI2c();
+}
diff --git a/left/src/init_peripherials.h b/left/src/init_peripherials.h
new file mode 100644
index 0000000..bb75a64
--- /dev/null
+++ b/left/src/init_peripherials.h
@@ -0,0 +1,8 @@
+#ifndef __INIT_H__
+#define __INIT_H__
+
+// Functions:
+
+ void InitPeripherials();
+
+#endif
diff --git a/left/src/main.c b/left/src/main.c
index 6d31a7a..a6f489d 100644
--- a/left/src/main.c
+++ b/left/src/main.c
@@ -1,8 +1,12 @@
#include "fsl_gpio.h"
#include "init_clock.h"
#include "fsl_port.h"
+#include "fsl_i2c.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
@@ -28,13 +32,51 @@ key_matrix_t keyMatrix = {
}
};
+i2c_slave_config_t slaveConfig;
+i2c_slave_handle_t slaveHandle;
+volatile bool g_SlaveCompletionFlag = false;
+
+static void i2c_slave_callback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *userData)
+{
+ switch (xfer->event)
+ {
+ case kI2C_SlaveTransmitEvent:
+ xfer->data = keyMatrix.keyStates;
+ xfer->dataSize = KEYBOARD_MATRIX_COLS_NUM*KEYBOARD_MATRIX_ROWS_NUM;
+ break;
+ case kI2C_SlaveReceiveEvent:
+ break;
+ case kI2C_SlaveCompletionEvent:
+ g_SlaveCompletionFlag = true;
+ break;
+ case kI2C_SlaveTransmitAckEvent:
+ break;
+ default:
+ g_SlaveCompletionFlag = true;
+ break;
+ }
+}
+
int main(void)
{
- InitTestLed();
InitClock();
+ InitPeripherials();
+ I2C_SlaveGetDefaultConfig(&slaveConfig);
+ slaveConfig.slaveAddress = I2C_ADDRESS_LEFT_KEYBOARD_HALF;
+ slaveConfig.addressingMode = kI2C_Address7bit/kI2C_RangeMatch;
+ I2C_SlaveInit(I2C_BUS_BASEADDR, &slaveConfig);
+ I2C_SlaveTransferCreateHandle(I2C_BUS_BASEADDR, &slaveHandle, i2c_slave_callback, NULL);
+ I2C_SlaveTransferNonBlocking(I2C_BUS_BASEADDR, &slaveHandle, kI2C_SlaveCompletionEvent);
+
+// while (!g_SlaveCompletionFlag) {}
+// g_SlaveCompletionFlag = false;
+
+ TEST_LED_OFF();
KeyMatrix_Init(&keyMatrix);
- KeyMatrix_Scan(&keyMatrix);
+ while (1) {
+ KeyMatrix_Scan(&keyMatrix);
+ }
while (1)
{
@@ -48,48 +90,6 @@ int main(void)
}
/*
-#define I2C_DATA_LENGTH 2
-
-#include "board.h"
-#include "fsl_clock_manager.h"
-#include "fsl_i2c_slave_driver.h"
-#include "fsl_i2c_shared_function.h"
-#include "i2c_addresses.h"
-#include "main.h"
-
-uint8_t isSw2Pressed;
-uint8_t isSw3Pressed;
-uint8_t buffer[I2C_DATA_LENGTH];
-
-void I2C0_IRQHandler(void)
-{
- I2C_DRV_IRQHandler(I2C0_IDX);
-}
-
-static void i2c_slave_callback(uint8_t instance, i2c_slave_event_t i2cEvent, void *param)
-{
- i2c_slave_state_t *slaveState = I2C_DRV_SlaveGetHandler(instance);
-
- switch (i2cEvent) {
- case kI2CSlaveTxReq:
- slaveState->txSize = I2C_DATA_LENGTH;
- slaveState ->txBuff = buffer;
- slaveState ->isTxBusy = true;
- buffer[0] = isSw2Pressed;
- buffer[1] = isSw3Pressed;
- break;
-
- case kI2CSlaveTxEmpty:
- slaveState->isTxBusy = false;
- break;
-
- default:
- break;
- }
-}
-
-int main(void)
-{
// Initialize GPIO.
gpio_input_pin_user_config_t inputPin[] =
@@ -157,5 +157,4 @@ int main(void)
GPIO_DRV_WritePinOutput(kGpioLED1, isSw2Pressed);
GPIO_DRV_WritePinOutput(kGpioLED3, isSw3Pressed);
}
-}
*/
diff --git a/right/src/usb_interface_keyboard.c b/right/src/usb_interface_keyboard.c
index 13db19c..799379d 100644
--- a/right/src/usb_interface_keyboard.c
+++ b/right/src/usb_interface_keyboard.c
@@ -3,6 +3,9 @@
#include "usb_composite_device.h"
#include "test_led.h"
#include "key_matrix.h"
+#include "fsl_i2c.h"
+#include "i2c.h"
+#include "i2c_addresses.h"
static usb_device_endpoint_struct_t UsbKeyboardEndpoints[USB_KEYBOARD_ENDPOINT_COUNT] = {{
USB_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
@@ -62,6 +65,9 @@ key_matrix_t keyMatrix = {
}
};
+#define KEY_STATE_COUNT (5*7)
+uint8_t leftKeyStates[KEY_STATE_COUNT] = {0};
+
static usb_status_t UsbKeyboardAction(void)
{
UsbKeyboardReport.modifiers = 0;
@@ -75,6 +81,16 @@ 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);
+
scancodeIdx = 0;
for (uint8_t keyId=0; keyId