54static const char*
s_tag =
"GLCDC";
62typedef enum : uint32_t {
66typedef enum : uint8_t {
79typedef enum : uint16_t {
83typedef enum : uint32_t {
171 volatile uint16_t*
const prcr = (
volatile uint16_t*)
k_addr_prcr;
172 volatile uint8_t*
const hococr = (
volatile uint8_t*)
k_addr_hococr;
200 volatile uint16_t*
const prcr = (
volatile uint16_t*)
k_addr_prcr;
201 volatile uint8_t*
const pdctrgd = (
volatile uint8_t*)
k_addr_pdctrgd;
206#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
209 if (ra8_fake_mmio_wait_eval(pdctrgd, i, pdpgsf_now)) {
221#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
222 if (ra8_fake_mmio_wait_eval(pdctrgd, i, ((*pdctrgd & (uint8_t)
k_pdctrgd_status) == 0U))) {
253 volatile uint16_t*
const prcr = (
volatile uint16_t*)
k_addr_prcr;
255 volatile uint8_t*
const lcdckcr = (
volatile uint8_t*)
k_addr_lcdckcr;
260#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
262 if (ra8_fake_mmio_wait_eval(lcdckcr, i, ((*lcdckcr & (uint8_t)
k_lcdck_srdy_mask) != 0U))) {
275#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
276 if (ra8_fake_mmio_wait_eval(lcdckcr, i, ((*lcdckcr & (uint8_t)
k_lcdck_srdy_mask) == 0U))) {
337typedef enum : uint32_t {
349typedef enum : uint32_t {
359typedef enum : uint32_t {
365typedef enum : uint32_t {
375typedef enum : uint32_t {
382typedef enum : uint32_t {
526 const uint32_t lnnum = (uint32_t)fb_h - 1U;
600 k_bright_mid = 512UL,
601 k_contrast_mid = 128UL,
610 (k_contrast_mid << 16) | (k_contrast_mid << 8) | k_contrast_mid;
644 .h_back = (uint32_t)tm->
h_back,
645 .h_sync = (uint32_t)tm->
h_sync,
649 .v_back = (uint32_t)tm->
v_back,
650 .v_sync = (uint32_t)tm->
v_sync,
688 k_panel_clk_clksel_lcdclk = 1U << 8,
689 k_panel_clk_clken = 1U << 6,
690 k_panel_clk_dcdr_div2 = 0x02U,
695 (uint32_t)k_panel_clk_clken |
696 (uint32_t)k_panel_clk_dcdr_div2;
714 k_bit_swrst = 1U << 16,
732 bg_en |= (uint32_t)k_bit_ven;
736 bg_en |= (uint32_t)k_bit_en;
853 const uint32_t mask = *reg;
static const char * s_tag
Logging / check tag.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_ISR_SAFE
The function is callable from interrupt context.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
ra8_err_t ra8_glcdc_set_brightness(uint8_t r, uint8_t g, uint8_t b)
Programme per-channel output brightness.
ra8_err_t ra8_glcdc_attach_handler(ra8_glcdc_event_fn_t fn, void *ctx)
Attach a GLCDC event callback.
ra8_err_t ra8_glcdc_init(const ra8_glcdc_config_t *cfg)
Initialise GLCDC with the EK-RA8D2 1024x600 timings and the supplied graphics layer 1 framebuffer.
ra8_err_t ra8_glcdc_enter_stop(void)
Put GLCDC into MSTP-gated stop.
static void internal_program_tcon(const ra8_glcdc_panel_timing_t *t)
Program TCON sync-signal registers for parallel-RGB output.
@ k_prcr_relock
Prcr relock.
@ k_prcr_unlock_cgc
Prcr unlock cgc.
@ k_prcr_unlock_lpm
Prcr unlock lpm.
ra8_err_t ra8_glcdc_start(bool enable)
Start or stop the panel output.
ra8_err_t ra8_glcdc_clear_status(uint32_t mask)
Clear GLCDC status flags.
ra8_err_t ra8_glcdc_set_contrast(uint8_t r, uint8_t g, uint8_t b)
Programme per-channel output contrast gain.
@ k_glcdc_sel_de
GLCDC sel de.
@ k_glcdc_sel_stva
GLCDC sel stva.
@ k_glcdc_sel_stha
GLCDC sel stha.
@ k_glcdc_sel_stvb
GLCDC sel stvb.
@ k_glcdc_shift_arcdef
GLCDC shift arcdef.
@ k_glcdc_shift_outset_fmt
GLCDC shift outset fmt.
@ k_glcdc_shift_high
GLCDC shift high.
@ k_glcdc_shift_pdtha_fmt
GLCDC shift pdtha fmt.
@ k_glcdc_axi_burst_bytes
GLCDC axi burst bytes.
@ k_glcdc_bpp_rgb565
GLCDC bpp rgb565.
@ k_glcdc_sync_pos_min
HUM 63 BG_SYNC.HP / VP min = 1.
@ k_glcdc_shift_flm6_fmt
GLCDC shift flm6 fmt.
@ k_glcdc_pdtha_rgb666
GLCDC pdtha rgb666.
@ k_glcdc_pdtha_rgb565
GLCDC pdtha rgb565.
@ k_glcdc_pdtha_rgb888
GLCDC pdtha rgb888.
static void internal_graphics_power_on(void)
Bring up the GLCDC graphics power domain and clock tree.
@ k_addr_lcdckcr
Address lcdckcr.
@ k_addr_lcdckdivcr
Address lcdckdivcr.
@ k_addr_prcr
Address prcr.
@ k_addr_hococr
Address hococr.
@ k_addr_pdctrgd
Address pdctrgd.
static void internal_hoco_enable(void)
Enable HOCO via PRC0-protected HOCOCR.
glcdc_clut_t
CLUT entry count (16-bit address space).
@ k_glcdc_clut_size
GLCDC CLUT size.
ra8_err_t ra8_glcdc_get_status(uint32_t *out_mask)
Read GLCDC status register (VSYNC/HSYNC/underflow).
void ra8_glcdc_dispatch(void)
Dispatch a GLCDC event – snapshot + fire callback.
static void internal_program_gr2(const ra8_glcdc_panel_timing_t *t)
Program graphics layer 2 (lower blend layer).
@ k_glcdc_out_set_rgb666
GLCDC out set rgb666.
@ k_glcdc_out_set_rgb565
GLCDC out set rgb565.
@ k_glcdc_out_set_rgb888
GLCDC out set rgb888.
static void * s_glcdc_ctx
@ k_ra8_glcdc_clut_entries
Entries per CLUT plane.
static ra8_glcdc_event_fn_t s_glcdc_fn
@ k_ra8_glcdc_word_shift
16-bit field shift.
@ k_ra8_glcdc_pdtha_shift
PDTHA.SEL bit shift.
@ k_ra8_glcdc_dispsel_above
AB1.DISPSEL = upper layer.
@ k_ra8_glcdc_clutsel_shift
CLUTINT.SEL bit position.
@ k_ra8_glcdc_layer_count
Number of graphics layers.
@ k_ra8_glcdc_arcdef_shift
AB7.ARCDEF bit shift.
@ k_ra8_glcdc_b_shift
Blue-channel byte shift.
@ k_ra8_glcdc_g_shift
Green-channel byte shift.
@ k_ra8_glcdc_dispsel_below
AB1.DISPSEL = lower layer.
@ k_ra8_glcdc_layer1
Layer index for GR[0].
ra8_err_t ra8_glcdc_set_dithering(ra8_glcdc_dither_mode_t mode)
Programme the output dithering mode (PDTHA.SEL).
@ k_glcdc_alpha_opaque
Fully opaque (constant alpha).
ra8_err_t ra8_glcdc_deinit(void)
Tear down GLCDC (stop + MSTP release).
static void internal_program_bg(const ra8_glcdc_panel_timing_t *t)
Program the GLCDC background-plane registers.
static void internal_lcdclk_switch_pll1r(void)
Switch LCDCLK source to PLL1R / 4 via the SREQ/SRDY handshake.
static void internal_panel_program(uintptr_t fb_addr, uint16_t fb_format, uint16_t fb_w, uint16_t fb_h, const ra8_glcdc_timing_t *tm)
Program every GLCDC register required to drive the panel.
@ k_ra8_glcdc_clutsel_mask
CLUTINT.SEL bit mask.
@ k_ra8_glcdc_arcon_mask
AB1.ARCON bit mask.
static void internal_program_out(void)
Program the OUT stage (output format, brightness, contrast).
@ k_glcdc_dispsel_non_transparent
GLCDC dispsel non transparent.
@ k_glcdc_dispsel_transparent
GLCDC dispsel transparent.
@ k_lcdck_sreq
Lcdck sreq.
@ k_lcdckdivcr_div4
LCDCLK = PLL1R / 4 = 100 MHz.
@ k_pdctrgd_pdcsf
bit 6: control-in-progress status.
@ k_pdctrgd_pdpgsf
bit 7: gated status.
@ k_pdctrgd_status
both status bits.
@ k_hococr_run
Hococr run.
@ k_pdctrgd_on
Pdctrgd on.
@ k_lcdck_sel_pll1r
HUM 9.2.58 LCDCKSEL[3:0] = 1000b.
@ k_lcdck_srdy_mask
Lcdck srdy mask.
ra8_err_t ra8_glcdc_exit_stop(void)
Exit MSTP-gated stop.
static void internal_program_gr1(const ra8_glcdc_panel_timing_t *t, uintptr_t fb_addr, uint16_t fb_format, uint16_t fb_w, uint16_t fb_h)
Program graphics layer 1 (top blend layer).
static void internal_graphics_domain_power_on(void)
Power on the Graphics power domain via PRC1-protected PDCTRGD.
Graphics LCD Controller driver (two-layer with alpha blending).
void(* ra8_glcdc_event_fn_t)(void *ctx, uint32_t status_mask)
GLCDC event callback (VSYNC / line detect / underflow).
ra8_glcdc_dither_mode_t
Output-stage dithering mode for 24bpp -> 18/16bpp panels.
@ k_ra8_dither_off
No dithering (PDTHA.SEL=0).
@ k_ra8_dither_truncate
Round/truncate (PDTHA.SEL=2).
@ k_ra8_dither_2x2
2x2 ordered dither (PDTHA.SEL=3).
Graphics LCD Controller (GLCDC) register layout for the RA8D2.
@ k_ra8_glcdc_off_tcon_stha1
TCON.STHA1.
@ k_ra8_glcdc_off_gr2_ab5
GR[1].AB5: alpha rect H size+pos.
@ k_ra8_glcdc_off_out_set
OUT.SET: output interface.
@ k_ra8_glcdc_off_gr2_ab2
GR[1].AB2: graphics V size + pos.
@ k_ra8_glcdc_off_panel_clk
SYSCNT.PANEL_CLK.
@ k_ra8_glcdc_off_gr1_ab1
GR[0].AB1: alpha blend ctrl 1.
@ k_ra8_glcdc_off_sys_stat
SYSCNT.STMON.
@ k_ra8_glcdc_off_bg_vsize
BG.VSIZE: vertical valid size.
@ k_ra8_glcdc_off_bg_en
BG.EN: module enable.
@ k_ra8_glcdc_off_out_contrast
OUT.CONTRAST.
@ k_ra8_glcdc_off_gr2_ab1
GR[1].AB1.
@ k_ra8_glcdc_off_bg_per
BG.PERI: free-running period.
@ k_ra8_glcdc_off_gr1_saddr
GR[0].FLM2.BASE: framebuffer addr.
@ k_ra8_glcdc_off_gr1_ab7
GR[0].AB7: chroma-key on, def alf.
@ k_ra8_glcdc_off_gr1_ab4
GR[0].AB4: alpha rect V size+pos.
@ k_ra8_glcdc_off_gr1_ab2
GR[0].AB2: graphics V size + pos.
@ k_ra8_glcdc_off_gr1_line
GR[0].FLM5: datanum + lnnum.
@ k_ra8_glcdc_off_gr1_en
GR[0].VEN: register update ctrl.
@ k_ra8_glcdc_off_gr1_ab5
GR[0].AB5: alpha rect H size+pos.
@ k_ra8_glcdc_off_tcon_de
TCON.DE.
@ k_ra8_glcdc_off_gr2_ab4
GR[1].AB4: alpha rect V size+pos.
@ k_ra8_glcdc_off_gr1_fmt
GR[0].FLM6.FORMAT: pixel format.
@ k_ra8_glcdc_off_tcon_tim
TCON.TIM: reference timing.
@ k_ra8_glcdc_off_bg_sync
BG.SYNC: sync position.
@ k_ra8_glcdc_off_gr2_flmrd
GR[1].FLMRD.
@ k_ra8_glcdc_off_out_vlatch
OUT.VLATCH.
@ k_ra8_glcdc_off_bg_hsize
BG.HSIZE: horizontal valid size.
@ k_ra8_glcdc_off_panel_dtha
OUT.PDTHA: panel dither.
@ k_ra8_glcdc_off_out_bright2
OUT.BRIGHT2.
@ k_ra8_glcdc_off_tcon_sthb2
TCON.STHB2.
@ k_ra8_glcdc_off_gr2_en
GR[1].VEN.
@ k_ra8_glcdc_off_tcon_stha2
TCON.STHA2.
@ k_ra8_glcdc_off_tcon_stvb2
TCON.STVB2.
@ k_ra8_glcdc_off_gr2_size
GR[1].AB3: graphics H size + pos.
@ k_ra8_glcdc_off_gr1_size
GR[0].AB3: graphics H size + pos.
@ k_ra8_glcdc_off_sys_cfg
SYSCNT.DTCTEN (state detection).
@ k_ra8_glcdc_off_tcon_stvb1
TCON.STVB1.
@ k_ra8_glcdc_off_out_bright1
OUT.BRIGHT1.
@ k_ra8_glcdc_off_tcon_stva2
TCON.STVA2.
@ k_ra8_glcdc_off_gr1_flmrd
GR[0].FLMRD: frame buffer read en.
@ k_ra8_glcdc_off_out_clkphase
OUT.CLKPHASE.
@ k_ra8_glcdc_off_bg_bgc
BG.BGC: background colour.
@ k_ra8_glcdc_off_tcon_stva1
TCON.STVA1.
@ k_ra8_glcdc_off_gr2_ab7
GR[1].AB7: chroma-key on, def alf.
@ k_ra8_glcdc_off_gr1_flm3
GR[0].FLM3: line offset bytes.
@ k_ra8_glcdc_off_tcon_sthb1
TCON.STHB1.
static volatile uint32_t * ra8_glcdc_reg32(ra8_glcdc_block_off_t offset)
Pointer to a 32-bit register inside the GLCDC block.
Bounded wait-flag primitives for RA8D2 HAL drivers.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_enable(ra8_mstp_t id)
Reference-counted "ungate this peripheral" request.
ra8_err_t ra8_mstp_disable(ra8_mstp_t id)
Reference-counted "gate this peripheral" request.
@ k_ra8_mstp_glcdc
MSTPC4 GLCDC.
Minimal GLCDC configuration for a single-layer panel.
ra8_glcdc_pixel_fmt_t format
Pixel format code.
uint32_t framebuffer_addr
SRAM or SDRAM address.
ra8_glcdc_timing_t timing
Panel timing (from BSP).
uint16_t width_px
Visible width.
uint16_t height_px
Visible height.
Panel timing parameters shared by the per-stage helpers.
uint32_t h_active
Active pixels per line.
uint32_t v_total
Frame period (lines).
uint32_t v_back
Vertical back porch (lines).
uint32_t h_total
Line period = active + back + sync + fp.
uint32_t h_sync
HSYNC pulse width (pixel clocks).
uint32_t h_back
Back-porch pixel count.
uint32_t v_sync
VSYNC pulse width (lines).
uint32_t v_active
Active lines per frame.
Panel RGB timing the driver programs (accessory parameters).
uint16_t v_sync
VSYNC pulse width (lines).
uint16_t v_front
Vertical front porch (lines).
uint16_t v_active
Active lines per frame.
uint16_t h_front
Horizontal front porch (px).
uint16_t h_sync
HSYNC pulse width (px clocks).
uint16_t h_active
Active pixels per line.
uint16_t h_back
Horizontal back porch (px).
uint16_t v_back
Vertical back porch (lines).