From 0d7ecbd8e2ffa109e8739da07bfe4593f98e61e5 Mon Sep 17 00:00:00 2001 From: CalcLoverHK <0v0katai@gmail.com> Date: Sun, 29 Jun 2025 18:14:18 +0800 Subject: [PATCH] r61523: add r61523 backlight and display timing settings --- include/gint/drivers/r61523.h | 31 ++++++++++++++++++ src/r61523/r61523.c | 59 +++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/include/gint/drivers/r61523.h b/include/gint/drivers/r61523.h index 372cb9f..1daa124 100644 --- a/include/gint/drivers/r61523.h +++ b/include/gint/drivers/r61523.h @@ -13,6 +13,20 @@ extern "C" { #include +enum { + /* Normal/Partial mode (2^16 color) */ + R61523_NORMAL, + /* Idle mode (2^3 color) */ + R61523_IDLE +}; + +enum { + /* Frame inversion waveform (battery saver) */ + R61523_FRAME, + /* Line inversion waveform (better display quality) */ + R61523_LINE +}; + /* r61523_display(): Update the entire display (320x528) */ void r61523_display(uint16_t *vram); @@ -20,6 +34,23 @@ void r61523_display(uint16_t *vram); void r61523_display_rect( uint16_t *vram, int xmin, int xmax, int ymin, int ymax); +/* r61523_get_backlight() and r61523_set_backlight(): Backlight settings + + @level Brightness level (0-255) + @PWM_div PWM frequency division + @dimming Toggle dimming function */ +void r61523_get_backlight(int *level, int *PWM_div, bool *dimming); +void r61523_set_backlight(int level, int PWM_div, bool dimming); + +/* r61523_get_display_timing() and r61523_set_display_timing(): Display timing settings + + @mode Normal/Partial or Idle mode + @waveform Frame or Line waveform inversion + @CPL Clocks per line (18-63) + @BP @FP Number of back/front porch lines (4-128) */ +void r61523_get_display_timing(bool mode, bool *waveform, int *CPL, int *BP, int *FP); +void r61523_set_display_timing(bool mode, bool waveform, int CPL, int BP, int FP); + /* r61523_win_set(): Set the display window */ void r61523_win_set(int x1, int x2, int y1, int y2); diff --git a/src/r61523/r61523.c b/src/r61523/r61523.c index 92cfa7e..644115a 100644 --- a/src/r61523/r61523.c +++ b/src/r61523/r61523.c @@ -16,6 +16,7 @@ #define REG_HRANGE 0x2a #define REG_VRANGE 0x2b #define REG_DATA 0x2c +#define REG_BACKLIGHT_CONTROL 0xb9 #define REG_DEVICE_CODE_READ 0xbf #define REG_DEVICE_CODE_VARIANT 0xda @@ -96,6 +97,64 @@ void r61523_identify( } } +//--- +// Display control +//--- + +void r61523_get_backlight(int *level, int *PWM_div, bool *dimming) +{ + uint16_t packets[5]; + select(REG_BACKLIGHT_CONTROL); + read_Nu16(packets, 5); + + *level = packets[2]; + *PWM_div = packets[3]; + *dimming = packets[4] & 1; +} + +void r61523_set_backlight(int level, int PWM_div, bool dimming) +{ + select(REG_BACKLIGHT_CONTROL); + + /* Default value of PWMON */ + write(0); + synco(); + + write(level); + synco(); + write(PWM_div); + synco(); + write(0b1000 | dimming); + synco(); +} + +void r61523_get_display_timing(bool mode, bool *waveform, int *CPL, int *BP, int *FP) +{ + uint16_t packets[6]; + select(mode ? 195 : 193); + read_Nu16(packets, 6); + + *waveform = packets[1]; + *CPL = packets[3]; + *BP = packets[4]; + *FP = packets[5]; +} + +void r61523_set_display_timing(bool mode, bool waveform, int CPL, int BP, int FP) +{ + select(mode ? 195 : 193); + + write(waveform); + synco(); + read(); + write(CPL); + synco(); + write(BP); + synco(); + write(FP); + synco(); +} + //--- // Window management //---