From af4f40ddf666b4724b76097bacd7e3f992bf87e5 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 30 Oct 2023 09:25:46 +0800 Subject: [PATCH] is32flcommon: Allow custom PWM frequency config Signed-off-by: Daniel Schaefer --- drivers/led/issi/is31fl3743.h | 4 ++++ drivers/led/issi/is31flcommon.c | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/drivers/led/issi/is31fl3743.h b/drivers/led/issi/is31fl3743.h index d8fcd79096..dc8718f4c6 100644 --- a/drivers/led/issi/is31fl3743.h +++ b/drivers/led/issi/is31fl3743.h @@ -114,6 +114,10 @@ #define ISSI_PWM_REG_1ST 0x01 #define ISSI_SCL_REG_1ST 0x01 +#define ISSI_REG_TEST 0xE0 +#define ISSI_REG_CUSTOM_PWM 0xE2 +#define ISSI_CUSTOM_PWM_32K 0xE0 + // Map CS SW locations to order in PWM / Scaling buffers // This matches the ORDER in the Datasheet Register not the POSITION // It will always count from 0x00 to (ISSI_MAX_LEDS - 1) diff --git a/drivers/led/issi/is31flcommon.c b/drivers/led/issi/is31flcommon.c index 4b78947ada..fbc33b4466 100644 --- a/drivers/led/issi/is31flcommon.c +++ b/drivers/led/issi/is31flcommon.c @@ -89,6 +89,21 @@ void IS31FL_unlock_register(uint8_t addr, uint8_t page) { IS31FL_write_single_register(addr, ISSI_COMMANDREGISTER, page); } +// Only known to work on IS31FL3743 +void IS31FL_common_set_pwm_frequency(uint8_t addr, uint8_t freq) { + // Unlock the command register & select Function Register + //IS31FL_unlock_register(addr, ISSI_PAGE_FUNCTION); + + // Enable test mode to unlock PWM freqency register + IS31FL_write_single_register(addr, ISSI_REG_TEST, 0x01); + + IS31FL_write_single_register(addr, ISSI_REG_CUSTOM_PWM, freq); + + // Disable test mode again + IS31FL_write_single_register(addr, ISSI_REG_TEST, 0x00); +} + + void IS31FL_common_init(uint8_t addr, uint8_t ssr) { // Setup phase, need to take out of software shutdown and configure // ISSI_SSR_x is passed to allow Master / Slave setting where applicable @@ -116,6 +131,11 @@ void IS31FL_common_init(uint8_t addr, uint8_t ssr) { IS31FL_write_single_register(addr, ISSI_REG_PWM_SET, ISSI_PWM_SET); #endif +#ifdef ISSI_CUSTOM_PWM_FREQ + // Instead of default 29kHz increase to 32.25kHz PWM Frequency + IS31FL_common_set_pwm_frequency(addr, ISSI_CUSTOM_PWM_32K); +#endif + // Wait 10ms to ensure the device has woken up. wait_ms(10); }