r61523: add r61523 backlight and display timing settings

This commit is contained in:
CalcLoverHK 2025-06-29 18:14:18 +08:00
parent bc5dd82441
commit 0d7ecbd8e2
2 changed files with 90 additions and 0 deletions

View file

@ -13,6 +13,20 @@ extern "C" {
#include <gint/defs/types.h> #include <gint/defs/types.h>
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) */ /* r61523_display(): Update the entire display (320x528) */
void r61523_display(uint16_t *vram); void r61523_display(uint16_t *vram);
@ -20,6 +34,23 @@ void r61523_display(uint16_t *vram);
void r61523_display_rect( void r61523_display_rect(
uint16_t *vram, int xmin, int xmax, int ymin, int ymax); 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 */ /* r61523_win_set(): Set the display window */
void r61523_win_set(int x1, int x2, int y1, int y2); void r61523_win_set(int x1, int x2, int y1, int y2);

View file

@ -16,6 +16,7 @@
#define REG_HRANGE 0x2a #define REG_HRANGE 0x2a
#define REG_VRANGE 0x2b #define REG_VRANGE 0x2b
#define REG_DATA 0x2c #define REG_DATA 0x2c
#define REG_BACKLIGHT_CONTROL 0xb9
#define REG_DEVICE_CODE_READ 0xbf #define REG_DEVICE_CODE_READ 0xbf
#define REG_DEVICE_CODE_VARIANT 0xda #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 // Window management
//--- //---