diff --git a/left/build/kds/.project b/left/build/kds/.project index 9b30aed..b625fe7 100644 --- a/left/build/kds/.project +++ b/left/build/kds/.project @@ -96,6 +96,16 @@ 1 PARENT-3-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_smc.h + + drivers/fsl_tpm.c + 1 + PARENT-3-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.c + + + drivers/fsl_tpm.h + 1 + PARENT-3-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.h + startup/startup_MKL03Z4.S 1 diff --git a/left/src/bridge_protocol_handler.c b/left/src/bridge_protocol_handler.c index 549733d..41248fa 100644 --- a/left/src/bridge_protocol_handler.c +++ b/left/src/bridge_protocol_handler.c @@ -3,6 +3,7 @@ #include "main.h" #include "i2c_addresses.h" #include "i2c.h" +#include "led_pwm.h" void SetError(uint8_t error); void SetGenericError(); @@ -31,10 +32,16 @@ void BridgeProtocolHandler() BridgeTxSize = KEYBOARD_MATRIX_COLS_NUM*KEYBOARD_MATRIX_ROWS_NUM; memcpy(BridgeTxBuffer, keyMatrix.keyStates, BridgeTxSize); break; - case BRIDGE_COMMAND_SET_LED: + case BRIDGE_COMMAND_SET_TEST_LED: TEST_LED_OFF(); BridgeTxSize = 0; TEST_LED_SET(BridgeRxBuffer[1]); break; + case BRIDGE_COMMAND_SET_LED_PWM: + BridgeTxSize = 0; + uint8_t brightnessPercent = BridgeRxBuffer[1]; + LedPwm_SetBrightness(brightnessPercent); + TEST_LED_SET(brightnessPercent == 0); + break; } } diff --git a/left/src/bridge_protocol_handler.h b/left/src/bridge_protocol_handler.h index dbee2a3..539019c 100644 --- a/left/src/bridge_protocol_handler.h +++ b/left/src/bridge_protocol_handler.h @@ -14,7 +14,8 @@ #define PROTOCOL_RESPONSE_GENERIC_ERROR 1 #define BRIDGE_COMMAND_GET_KEY_STATES 0 - #define BRIDGE_COMMAND_SET_LED 1 + #define BRIDGE_COMMAND_SET_TEST_LED 1 + #define BRIDGE_COMMAND_SET_LED_PWM 2 // Variables: diff --git a/left/src/init_peripherials.c b/left/src/init_peripherials.c index 9981a32..ed286f1 100644 --- a/left/src/init_peripherials.c +++ b/left/src/init_peripherials.c @@ -6,6 +6,7 @@ #include "fsl_i2c.h" #include "fsl_clock.h" #include "i2c.h" +#include "led_pwm.h" void InitI2c() { port_pin_config_t pinConfig = { @@ -41,5 +42,6 @@ void InitPeripherials(void) { InitLedDriver(); InitTestLed(); + LedPwm_Init(); InitI2c(); } diff --git a/left/src/led_pwm.c b/left/src/led_pwm.c new file mode 100644 index 0000000..2121be2 --- /dev/null +++ b/left/src/led_pwm.c @@ -0,0 +1,31 @@ +#include "led_pwm.h" +#include "fsl_port.h" + +void LedPwm_Init() { + tpm_config_t tpmInfo; + tpm_chnl_pwm_signal_param_t tpmParam[1];/* = {{ + .chnlNumber = LED_PWM_TPM_CHANNEL, + .level = kTPM_LowTrue, + .dutyCyclePercent = 00, + }};*/ + + CLOCK_EnableClock(LED_PWM_CLOCK); + PORT_SetPinMux(LED_PWM_PORT, LED_PWM_PIN, kPORT_MuxAlt2); + + tpmParam[0].chnlNumber = LED_PWM_TPM_CHANNEL; + tpmParam[0].level = kTPM_LowTrue; + tpmParam[0].dutyCyclePercent = 100 - INITIAL_DUTY_CYCLE_PERCENT; + TPM_GetDefaultConfig(&tpmInfo); + + TPM_Init(LED_PWM_TPM_BASEADDR, &tpmInfo); + TPM_SetupPwm(LED_PWM_TPM_BASEADDR, tpmParam, sizeof(tpmParam), + kTPM_EdgeAlignedPwm, TPM_PWM_FREQUENCY, TPM_SOURCE_CLOCK); + TPM_StartTimer(LED_PWM_TPM_BASEADDR, kTPM_SystemClock); +// LedPwm_SetBrightness(INITIAL_DUTY_CYCLE_PERCENT); +} + +void LedPwm_SetBrightness(uint8_t brightnessPercent) +{ + TPM_UpdatePwmDutycycle(LED_PWM_TPM_BASEADDR, LED_PWM_TPM_CHANNEL, + kTPM_EdgeAlignedPwm, 100-brightnessPercent); +} diff --git a/left/src/led_pwm.h b/left/src/led_pwm.h new file mode 100644 index 0000000..456b5b2 --- /dev/null +++ b/left/src/led_pwm.h @@ -0,0 +1,27 @@ +#ifndef __LED_PWM_H__ +#define __LED_PWM_H__ + +// Includes: + + #include "fsl_tpm.h" + +// Macros: + + #define LED_PWM_PORT PORTB + #define LED_PWM_CLOCK kCLOCK_PortB + #define LED_PWM_PIN 5 + + #define LED_PWM_TPM_BASEADDR TPM1 + #define LED_PWM_TPM_CHANNEL kTPM_Chnl_1 + + #define TPM_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_BusClk) + #define TPM_PWM_FREQUENCY 24000U + + #define INITIAL_DUTY_CYCLE_PERCENT 100U + +// Functions: + + extern void LedPwm_Init(); + void LedPwm_SetBrightness(uint8_t brightnessPercent); + +#endif diff --git a/right/src/led_pwm.c b/right/src/led_pwm.c index d2d4c2e..eec11b3 100644 --- a/right/src/led_pwm.c +++ b/right/src/led_pwm.c @@ -15,7 +15,7 @@ void LedPwm_Init() { ftmParam[0].chnlNumber = (ftm_chnl_t)LED_PWM_FTM_CHANNEL; ftmParam[0].level = kFTM_LowTrue; - ftmParam[0].dutyCyclePercent = INITIAL_DUTY_CYCLE_PERCENT - 100; + ftmParam[0].dutyCyclePercent = 100 - INITIAL_DUTY_CYCLE_PERCENT; ftmParam[0].firstEdgeDelayPercent = 0; FTM_GetDefaultConfig(&ftmInfo); @@ -28,6 +28,6 @@ void LedPwm_Init() { void LedPwm_SetBrightness(uint8_t brightnessPercent) { - FTM_UpdatePwmDutycycle(LED_PWM_FTM_BASEADDR, LED_PWM_FTM_CHANNEL, kFTM_EdgeAlignedPwm, brightnessPercent-100); + FTM_UpdatePwmDutycycle(LED_PWM_FTM_BASEADDR, LED_PWM_FTM_CHANNEL, kFTM_EdgeAlignedPwm, 100 - brightnessPercent); FTM_SetSoftwareTrigger(LED_PWM_FTM_BASEADDR, true); // Triggers register update. } diff --git a/right/src/main.c b/right/src/main.c index b2229f9..8eac0a6 100644 --- a/right/src/main.c +++ b/right/src/main.c @@ -59,7 +59,7 @@ static const uint8_t testData[] = 0x0a, 0x02, 0x2d, 0x02, 0x1d, 0x02, 0x1b, 0x02, 0x06, 0x02, 0x19, 0x02, 0x05, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x02, 0x00 }; -void updateUsbReports() +void UpdateUsbReports() { ResetActiveUsbKeyboardReport(); @@ -82,13 +82,13 @@ void main() { InitClock(); LedDriver_InitAllLeds(1); KeyMatrix_Init(&KeyMatrix); - updateUsbReports(); + UpdateUsbReports(); InitUsb(); // deserialize_Layer(testData, 0); while (1) { - updateUsbReports(); + UpdateUsbReports(); asm("wfi"); } } diff --git a/right/src/main.h b/right/src/main.h index 45a99a2..fb78482 100644 --- a/right/src/main.h +++ b/right/src/main.h @@ -19,5 +19,6 @@ 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(); #endif diff --git a/right/src/usb_protocol_handler.c b/right/src/usb_protocol_handler.c index 374ffba..4dfd254 100644 --- a/right/src/usb_protocol_handler.c +++ b/right/src/usb_protocol_handler.c @@ -207,8 +207,10 @@ void applyConfig() void setLedPwm() { - uint8_t brightnessPercent = GenericHidInBuffer[1]; #if UHK_PCB_MAJOR_VERSION == 7 + uint8_t brightnessPercent = GenericHidInBuffer[1]; LedPwm_SetBrightness(brightnessPercent); + uint8_t data[] = {2, brightnessPercent}; + I2cWrite(I2C_MAIN_BUS_BASEADDR, I2C_ADDRESS_LEFT_KEYBOARD_HALF, data, sizeof(data)); #endif }