gk7205v200-uboot/product/osd/vo/gk7205v200/vou_hal.c
2025-08-07 17:13:54 +08:00

2140 lines
75 KiB
C
Executable File

/*
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
*/
#include "vou_hal.h"
#include <asm/io.h>
#include "gk7205v200_vo.h"
#define IO_ADDRESS(x) (x)
#define GK_INVALID_LAYER (-1)
#define CRG_REGS_ADDR 0x12010000
#define CRG_REGS_SIZE 0X10000
#define CRG_PERCTL2_ADDR (0x0008 + CRG_REGS_ADDR)
#define CRG_PERCTL3_ADDR (0x000C + CRG_REGS_ADDR)
#define CRG_PERCTL4_ADDR (0x0010 + CRG_REGS_ADDR)
#define CRG_PERCTL5_ADDR (0x0014 + CRG_REGS_ADDR)
#define CRG_PERCTL6_ADDR (0x0018 + CRG_REGS_ADDR)
#define CRG_PERCTL7_ADDR (0x001c + CRG_REGS_ADDR)
#define CRG_PERCTL10_ADDR (0x0028 + CRG_REGS_ADDR)
#define CRG_PERCTL11_ADDR (0x002c + CRG_REGS_ADDR)
#define CRG_PERCTL18_ADDR (0x0048 + CRG_REGS_ADDR)
#define CRG_PERCTL19_ADDR (0x004c + CRG_REGS_ADDR)
#define CRG_PERCTL59_ADDR (0x00ec + CRG_REGS_ADDR)
#define CRG_PERCTL65_ADDR (0x0104 + CRG_REGS_ADDR) /* LCD CRG */
#define CRG_PERCTL66_ADDR (0x0108 + CRG_REGS_ADDR) /* VDP low power CRG */
#define CRG_PERCTL72_ADDR (0x0120 + CRG_REGS_ADDR)
#define CRG_PERCTL73_ADDR (0x0124 + CRG_REGS_ADDR) /* VDP CRG */
#define CRG_PERCTL15_ADDR (0x003C + CRG_REGS_ADDR)
#define LCD_CRG_PERCTL_ADDR CRG_PERCTL65_ADDR
#define VOU_CRG_PERCTL_ADDR CRG_PERCTL66_ADDR
#define MISC_REGS_ADDR 0x12028000
#define MISC_REGS_SIZE 0x8000
#define FDR_VID_OFFSET (0x200 / 4)
#define MISC_CTL18_ADDR (0x18 + MISC_REGS_ADDR)
volatile S_VDP_REGS_TYPE *g_vo_reg = GK_NULL;
gk_void hal_vo_init(gk_void)
{
g_vo_reg = (volatile S_VDP_REGS_TYPE *)IO_ADDRESS(VO_BASE_ADDR);
}
gk_void hal_vo_exit(gk_void)
{
}
static inline void gk_reg_set_bit(unsigned long value, unsigned long offset,
unsigned long addr)
{
unsigned long t, mask;
mask = 1 << offset;
t = readl(addr);
t &= ~mask;
t |= (value << offset) & mask;
writel(t, addr);
}
static inline void gk_reg_write32(unsigned long value, unsigned long mask,
unsigned long addr)
{
unsigned long t;
t = readl(addr);
t &= ~mask;
t |= value & mask;
writel(t, addr);
}
gk_void hal_write_reg(gk_u32 *address, gk_u32 value)
{
*(volatile gk_u32 *)address = value;
return;
}
gk_u32 hal_read_reg(const gk_u32 *address)
{
return *(volatile gk_u32 *)(address);
}
gk_bool hal_intf_bt_set_dfir_en(gk_u32 dfir_en)
{
U_INTF_BT_CTRL INTF_BT_CTRL;
INTF_BT_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->INTF_BT_CTRL.u32));
INTF_BT_CTRL.bits.dfir_en = dfir_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)&(g_vo_reg->INTF_BT_CTRL.u32), INTF_BT_CTRL.u32);
return GK_TRUE;
}
gk_ulong vo_get_abs_addr(hal_disp_layer layer, gk_ulong reg)
{
gk_ulong reg_abs_addr;
switch (layer) {
case HAL_DISP_LAYER_VHD0:
case HAL_DISP_LAYER_VHD1: {
reg_abs_addr = (reg) + (layer - HAL_DISP_LAYER_VHD0) * VHD_REGS_LEN;
break;
}
case HAL_DISP_LAYER_GFX0:
case HAL_DISP_LAYER_GFX1: {
reg_abs_addr = (reg) + (layer - HAL_DISP_LAYER_GFX0) * GFX_REGS_LEN;
break;
}
default: {
return 0;
}
}
return reg_abs_addr;
}
gk_ulong vo_get_chn_abs_addr(hal_disp_outputchannel chan, gk_ulong reg)
{
volatile gk_ulong reg_abs_addr;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
reg_abs_addr = reg + (chan - HAL_DISP_CHANNEL_DHD0) * DHD_REGS_LEN;
break;
}
default: {
printf("error channel id found in %s: L%d\n", __FUNCTION__, __LINE__);
return 0;
}
}
return reg_abs_addr;
}
gk_s32 sys_hal_vo_bus_reset_sel(gk_bool reset)
{
gk_u32 tmp = (reset == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 0, IO_ADDRESS(VOU_CRG_PERCTL_ADDR));
return 0;
}
gk_s32 sys_hal_vo_apb_clk_en(gk_bool clk_en)
{
gk_u32 tmp = (clk_en == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 1, IO_ADDRESS(VOU_CRG_PERCTL_ADDR));
return 0;
}
gk_s32 sys_hal_vo_bus_clk_en(gk_bool clk_en)
{
gk_u32 tmp = (clk_en == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 2, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 2bit */
return 0;
}
gk_s32 sys_hal_vo_cfg_clk_en(gk_bool clk_en)
{
gk_u32 tmp = (clk_en == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 3, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 3bit */
return 0;
}
/* VO HD PPC clock gating enable */
gk_s32 sys_hal_vo_core_clk_en(gk_s32 dev, gk_bool clk_en)
{
gk_u32 tmp = (clk_en == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 5, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 5bit */
return 0;
}
gk_s32 sys_hal_vo_dev_clk_en(gk_s32 vo_dev, gk_bool clk_en)
{
gk_u32 tmp = (clk_en == GK_TRUE) ? 1 : 0;
if (vo_dev == 0) {
gk_reg_set_bit(tmp, 5, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 5bit */
gk_reg_set_bit(tmp, 6, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 6bit */
} else {
return -1;
}
return 0;
}
gk_s32 sys_hal_vo_bt_clk_en(gk_bool bt_clk_en)
{
gk_u32 tmp = (bt_clk_en == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 8, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 8bit */
gk_reg_set_bit(tmp, 9, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 9bit */
return 0;
}
gk_s32 sys_hal_vo_hd0_div_mode(gk_u32 hd0_div_mod)
{
gk_reg_write32(hd0_div_mod << 12, 0x3 << 12, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 12bit to set 0x3 */
return 0;
}
gk_s32 sys_hal_vo_hd_out_pctrl(gk_bool clk_reverse)
{
gk_u32 tmp = (clk_reverse == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 20, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 20bit */
return 0;
}
gk_s32 sys_hal_vo_out_clk_sel(gk_u32 clk_sel)
{
gk_reg_write32(clk_sel << 21, 0xf << 21, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 21bit */
return 0;
}
gk_s32 sys_hal_vo_lcd_clk_en(gk_bool clk_en)
{
gk_u32 tmp = (clk_en == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 27, IO_ADDRESS(LCD_CRG_PERCTL_ADDR)); /* 27bit */
return 0;
}
gk_s32 sys_hal_lcd_mclk_div(gk_u32 mclk_div)
{
gk_reg_write32(mclk_div, 0x7ffffff, IO_ADDRESS(LCD_CRG_PERCTL_ADDR));
return 0;
}
gk_s32 sys_hal_vo_out_clk_en(gk_s32 dev, gk_bool clk_en)
{
gk_u32 tmp = (clk_en == GK_TRUE) ? 1 : 0;
gk_reg_set_bit(tmp, 8, IO_ADDRESS(VOU_CRG_PERCTL_ADDR)); /* 8bit */
return 0;
}
gk_s32 sys_hal_lcd_data_mode(gk_u32 data_mode)
{
gk_reg_write32(data_mode << 8, 0x7 << 8, IO_ADDRESS(MISC_CTL18_ADDR)); /* 8bit to set 0x7 */
return 0;
}
gk_void hal_sys_control(gk_void)
{
volatile U_VOCTRL VOCTRL;
/* outstand */
VOCTRL.u32 = g_vo_reg->VOCTRL.u32;
VOCTRL.u32 = 0x80000000; /* 0x80000000 vo contrl */
g_vo_reg->VOCTRL.u32 = VOCTRL.u32;
}
gk_ulong vo_get_intf_abs_addr(hal_disp_intf intf, gk_ulong reg)
{
volatile gk_ulong reg_abs_addr;
switch (intf) {
case HAL_DISP_INTF_BT656:
case HAL_DISP_INTF_BT1120: {
reg_abs_addr = reg + 1 * INTF_REGS_LEN;
break;
}
case HAL_DISP_INTF_LCD:
case HAL_DISP_INTF_LCD_6BIT:
case HAL_DISP_INTF_LCD_8BIT:
case HAL_DISP_INTF_LCD_16BIT:
case HAL_DISP_INTF_LCD_24BIT: {
reg_abs_addr = reg + 2 * INTF_REGS_LEN; /* 2 to get addr */
break;
}
default: {
printf("error intf id found in %s: L%d\n", __FUNCTION__, __LINE__);
return 0;
}
}
return reg_abs_addr;
}
gk_ulong vo_get_vid_abs_addr(hal_disp_layer layer, gk_ulong reg)
{
volatile gk_ulong reg_abs_addr;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
reg_abs_addr = reg + (layer - HAL_DISP_LAYER_VHD0) * VID_REGS_LEN;
break;
}
default: {
return 0;
}
}
return reg_abs_addr;
}
gk_ulong vo_get_gfx_abs_addr(hal_disp_layer layer, gk_ulong reg)
{
volatile gk_ulong reg_abs_addr;
switch (layer) {
case HAL_DISP_LAYER_GFX0: {
reg_abs_addr = reg + (layer - HAL_DISP_LAYER_GFX0) * GRF_REGS_LEN;
break;
}
default: {
return 0;
}
}
return reg_abs_addr;
}
gk_bool hal_disp_set_intf_enable(hal_disp_outputchannel chan, gk_bool intf)
{
volatile U_DHD0_CTRL DHD0_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_CTRL.u32));
DHD0_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_CTRL.bits.intf_en = intf;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_lcd_serial_perd(gk_u32 serial_perd)
{
U_INTF_LCD_CTRL INTF_LCD_CTRL;
volatile gk_ulong addr_reg;
addr_reg = vo_get_intf_abs_addr(HAL_DISP_INTF_LCD_8BIT, (gk_uintptr_t)&(g_vo_reg->INTF_HDMI_CTRL.u32));
INTF_LCD_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF_LCD_CTRL.bits.lcd_serial_perd = serial_perd;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, INTF_LCD_CTRL.u32);
return GK_TRUE;
}
gk_bool hal_disp_set_intf_ctrl(hal_disp_intf intf, const gk_u32 *ctrl_info)
{
U_INTF_BT_CTRL INTF_BT_CTRL;
U_INTF_LCD_CTRL INTF_LCD_CTRL;
volatile gk_ulong addr_reg;
U_INTF_BT_CTRL *bt_ctrl = GK_NULL;
U_INTF_LCD_CTRL *lcd_ctrl = GK_NULL;
if ((intf == VO_INTF_BT1120) || (intf == VO_INTF_BT656)) {
bt_ctrl = (U_INTF_BT_CTRL *)ctrl_info;
addr_reg = vo_get_intf_abs_addr(intf, (gk_uintptr_t)&(g_vo_reg->INTF_HDMI_CTRL.u32));
INTF_BT_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF_BT_CTRL.bits.hdmi_mode = bt_ctrl->bits.hdmi_mode;
INTF_BT_CTRL.bits.lcd_serial_mode = bt_ctrl->bits.lcd_serial_mode;
INTF_BT_CTRL.bits.lcd_parallel_order = bt_ctrl->bits.lcd_parallel_order;
INTF_BT_CTRL.bits.lcd_data_inv = bt_ctrl->bits.lcd_data_inv;
INTF_BT_CTRL.bits.lcd_parallel_mode = bt_ctrl->bits.lcd_parallel_mode;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, INTF_BT_CTRL.u32);
} else if ((intf == VO_INTF_LCD) || (intf == VO_INTF_LCD_6BIT) ||
(intf == VO_INTF_LCD_8BIT) || (intf == VO_INTF_LCD_16BIT)) {
lcd_ctrl = (U_INTF_LCD_CTRL *)ctrl_info;
addr_reg = vo_get_intf_abs_addr(intf, (gk_uintptr_t)&(g_vo_reg->INTF_HDMI_CTRL.u32));
INTF_LCD_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF_LCD_CTRL.bits.hdmi_mode = lcd_ctrl->bits.hdmi_mode;
INTF_LCD_CTRL.bits.lcd_serial_mode = lcd_ctrl->bits.lcd_serial_mode;
INTF_LCD_CTRL.bits.lcd_parallel_order = lcd_ctrl->bits.lcd_parallel_order;
INTF_LCD_CTRL.bits.lcd_data_inv = lcd_ctrl->bits.lcd_data_inv;
INTF_LCD_CTRL.bits.lcd_parallel_mode = lcd_ctrl->bits.lcd_parallel_mode;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, INTF_LCD_CTRL.u32);
} else {
return GK_FALSE;
}
return GK_TRUE;
}
static gk_void hal_disp_set_intf_vertical_sync(hal_disp_outputchannel chan,
const hal_disp_syncinfo *sync_info)
{
volatile U_DHD0_VSYNC1 DHD0_VSYNC1;
volatile U_DHD0_VSYNC2 DHD0_VSYNC2;
volatile U_DHD0_VPLUS1 DHD0_VPLUS1;
volatile U_DHD0_VPLUS2 DHD0_VPLUS2;
volatile gk_ulong addr_reg;
/* register is the value -1 */
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_VSYNC1.u32));
DHD0_VSYNC1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_VSYNC1.bits.vact = sync_info->vact - 1;
DHD0_VSYNC1.bits.vbb = sync_info->vbb - 1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_VSYNC1.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_VSYNC2.u32));
DHD0_VSYNC2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_VSYNC2.bits.vfb = sync_info->vfb - 1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_VSYNC2.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_VPLUS1.u32));
DHD0_VPLUS1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_VPLUS1.bits.bvact = sync_info->bvact - 1;
DHD0_VPLUS1.bits.bvbb = sync_info->bvbb - 1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_VPLUS1.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_VPLUS2.u32));
DHD0_VPLUS2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_VPLUS2.bits.bvfb = sync_info->bvfb - 1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_VPLUS2.u32);
return;
}
gk_bool hal_disp_set_intf_sync(hal_disp_outputchannel chan,
const hal_disp_syncinfo *sync_info, const hal_disp_syncinv *inv)
{
volatile U_DHD0_CTRL DHD0_CTRL;
volatile U_DHD0_HSYNC1 DHD0_HSYNC1;
volatile U_DHD0_HSYNC2 DHD0_HSYNC2;
volatile U_DHD0_PWR DHD0_PWR;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_CTRL.u32));
DHD0_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_CTRL.bits.iop = sync_info->iop;
DHD0_CTRL.bits.intf_ihs = inv->hs_inv;
DHD0_CTRL.bits.intf_ivs = inv->vs_inv;
DHD0_CTRL.bits.intf_idv = inv->dv_inv;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_CTRL.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_HSYNC1.u32));
DHD0_HSYNC1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_HSYNC1.bits.hact = sync_info->hact - 1;
DHD0_HSYNC1.bits.hbb = (sync_info->hbb) - 1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_HSYNC1.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_HSYNC2.u32));
DHD0_HSYNC2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_HSYNC2.bits.hmid = (sync_info->hmid == 0) ? 0 : sync_info->hmid - 1;
DHD0_HSYNC2.bits.hfb = (sync_info->hfb) - 1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_HSYNC2.u32);
hal_disp_set_intf_vertical_sync(chan, sync_info);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_PWR.u32));
DHD0_PWR.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_PWR.bits.hpw = sync_info->hpw - 1;
DHD0_PWR.bits.vpw = sync_info->vpw - 1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_PWR.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dev_multi_chn_en(hal_disp_outputchannel chn, hal_multi_chn multi_chn_en)
{
volatile U_DHD0_PWR DHD0_PWR;
volatile gk_ulong addr_reg;
addr_reg = vo_get_chn_abs_addr(chn, (gk_uintptr_t)&(g_vo_reg->DHD0_PWR.u32));
DHD0_PWR.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_PWR.bits.multichn_en = multi_chn_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_PWR.u32);
return GK_TRUE;
}
gk_bool hal_disp_set_intf_mux_sel(hal_disp_outputchannel chan, hal_disp_intf intf)
{
volatile U_VO_MUX VO_MUX;
volatile gk_ulong addr_reg;
addr_reg = (gk_uintptr_t)&(g_vo_reg->VO_MUX.u32);
VO_MUX.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
/* the numbers below are register config, not magic number. */
switch (intf) {
case HAL_DISP_INTF_BT1120: {
VO_MUX.bits.digital_sel = 0;
VO_MUX.bits.bt_sel = 0;
break;
}
case HAL_DISP_INTF_BT656: {
VO_MUX.bits.digital_sel = 1;
VO_MUX.bits.bt_sel = 0;
break;
}
case HAL_DISP_INTF_LCD:
case HAL_DISP_INTF_LCD_6BIT:
case HAL_DISP_INTF_LCD_8BIT:
case HAL_DISP_INTF_LCD_16BIT: {
VO_MUX.bits.digital_sel = 2; /* 2 register config */
VO_MUX.bits.lcd_sel = 0;
break;
}
default: {
VO_MUX.bits.digital_sel = 15; /* 15 register config */
}
}
hal_write_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->VO_MUX.u32), VO_MUX.u32);
return GK_TRUE;
}
gk_bool hal_disp_set_intf_clip(hal_disp_intf intf,
gk_bool clip,
const hal_disp_clip *clip_data)
{
volatile U_BT_CLIP0_L BT_CLIP0_L;
volatile U_BT_CLIP0_H BT_CLIP0_H;
volatile gk_ulong addr_reg;
addr_reg = (gk_uintptr_t)&(g_vo_reg->BT_CLIP0_L.u32);
BT_CLIP0_L.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
BT_CLIP0_L.bits.clip_en = clip;
BT_CLIP0_L.bits.clip_cl2 = clip_data->clip_low_y;
BT_CLIP0_L.bits.clip_cl1 = clip_data->clip_low_cb;
BT_CLIP0_L.bits.clip_cl0 = clip_data->clip_low_cr;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, BT_CLIP0_L.u32);
addr_reg = (gk_uintptr_t)&(g_vo_reg->BT_CLIP0_H.u32);
BT_CLIP0_H.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
BT_CLIP0_H.bits.clip_ch2 = clip_data->clip_high_y;
BT_CLIP0_H.bits.clip_ch1 = clip_data->clip_high_cb;
BT_CLIP0_H.bits.clip_ch0 = clip_data->clip_high_cr;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, BT_CLIP0_H.u32);
return GK_TRUE;
}
gk_bool hal_disp_set_vt_thd_mode(hal_disp_outputchannel chan, gk_u32 field_mode)
{
volatile U_DHD0_VTTHD DHD0_VTTHD;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_VTTHD.u32));
DHD0_VTTHD.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_VTTHD.bits.thd1_mode = field_mode;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_VTTHD.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_vt_thd(hal_disp_outputchannel chan, gk_u32 vtthd)
{
volatile U_DHD0_VTTHD DHD0_VTTHD;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_VTTHD.u32));
DHD0_VTTHD.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_VTTHD.bits.vtmgthd1 = vtthd;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_VTTHD.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_int_mask(gk_u32 mask_en)
{
volatile U_VOINTMSK VOINTMSK;
/* dispaly interrupt mask enable */
VOINTMSK.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->VOINTMSK.u32));
VOINTMSK.u32 = VOINTMSK.u32 | mask_en;
hal_write_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->VOINTMSK.u32), VOINTMSK.u32);
return GK_TRUE;
}
gk_bool hal_disp_clr_int_mask(gk_u32 mask_en)
{
volatile U_VOINTMSK VOINTMSK;
/* dispaly interrupt mask enable */
VOINTMSK.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->VOINTMSK.u32));
VOINTMSK.u32 = VOINTMSK.u32 & (~mask_en);
hal_write_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->VOINTMSK.u32), VOINTMSK.u32);
return GK_TRUE;
}
gk_void hal_disp_set_reg_up(hal_disp_outputchannel chan)
{
volatile U_DHD0_CTRL DHD0_CTRL;
volatile gk_ulong addr_reg;
if (chan >= HAL_DISP_CHANNEL_DHD1) {
printf("error,hal_disp_set_reg_up select wrong CHANNEL ID\n");
return;
}
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->DHD0_CTRL.u32));
DHD0_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
DHD0_CTRL.bits.regup = 0x1; /* 0x1 reg up */
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, DHD0_CTRL.u32);
return;
}
gk_bool hal_video_set_layer_up_mode(hal_disp_layer layer, gk_u32 up_mode)
{
U_V0_CTRL V0_CTRL;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CTRL.u32));
V0_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CTRL.bits.rgup_mode = up_mode;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_void hal_video_hfir_set_ck_gt_en(hal_disp_layer layer, gk_u32 ck_gt_en)
{
U_V0_HFIR_CTRL V0_HFIR_CTRL;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_HFIR_CTRL.u32));
V0_HFIR_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_HFIR_CTRL.bits.ck_gt_en = ck_gt_en;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_HFIR_CTRL.u32);
}
return;
}
gk_void hal_video_cvfir_set_out_height(hal_disp_layer layer, gk_u32 out_height)
{
U_V0_CVFIR_VINFO V0_CVFIR_VINFO;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VINFO.u32));
V0_CVFIR_VINFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VINFO.bits.out_height = out_height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VINFO.u32);
}
return;
}
gk_void hal_video_cvfir_set_out_fmt(hal_disp_layer layer, gk_u32 out_fmt)
{
U_V0_CVFIR_VINFO V0_CVFIR_VINFO;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VINFO.u32));
V0_CVFIR_VINFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VINFO.bits.out_fmt = out_fmt;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VINFO.u32);
}
return;
}
gk_void hal_video_cvfir_set_out_pro(hal_disp_layer layer, gk_u32 out_pro)
{
U_V0_CVFIR_VINFO V0_CVFIR_VINFO;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VINFO.u32));
V0_CVFIR_VINFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VINFO.bits.out_pro = out_pro;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VINFO.u32);
}
return;
}
gk_void hal_video_cvfir_set_vzme_ck_gt_en(hal_disp_layer layer, gk_bool vzme_ck_gt_en)
{
U_V0_CVFIR_VINFO V0_CVFIR_VINFO;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VINFO.u32));
V0_CVFIR_VINFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VINFO.bits.vzme_ck_gt_en = vzme_ck_gt_en;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VINFO.u32);
}
return;
}
gk_void hal_video_cvfir_set_cvfir_en(hal_disp_layer layer, gk_u32 cvfir_en)
{
U_V0_CVFIR_VSP V0_CVFIR_VSP;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VSP.u32));
V0_CVFIR_VSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VSP.bits.cvfir_en = cvfir_en;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VSP.u32);
}
return;
}
gk_void hal_video_cvfir_set_cvmid_en(hal_disp_layer layer, gk_u32 cvmid_en)
{
U_V0_CVFIR_VSP V0_CVFIR_VSP;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VSP.u32));
V0_CVFIR_VSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VSP.bits.cvmid_en = cvmid_en;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VSP.u32);
}
return;
}
gk_void hal_video_cvfir_set_cvfir_mode(hal_disp_layer layer, gk_u32 cvfir_mode)
{
U_V0_CVFIR_VSP V0_CVFIR_VSP;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VSP.u32));
V0_CVFIR_VSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VSP.bits.cvfir_mode = cvfir_mode;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VSP.u32);
}
return;
}
gk_void hal_video_cvfir_set_vratio(hal_disp_layer layer, gk_u32 vratio)
{
U_V0_CVFIR_VSP V0_CVFIR_VSP;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VSP.u32));
V0_CVFIR_VSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VSP.bits.vratio = vratio;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VSP.u32);
}
return;
}
gk_void hal_video_cvfir_set_v_chroma_offset(hal_disp_layer layer, gk_u32 vchroma_offset)
{
U_V0_CVFIR_VOFFSET V0_CVFIR_VOFFSET;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VOFFSET.u32));
V0_CVFIR_VOFFSET.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VOFFSET.bits.vchroma_offset = vchroma_offset;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VOFFSET.u32);
}
return;
}
gk_void hal_video_cvfir_set_vb_chroma_offset(hal_disp_layer layer, gk_u32 vbchroma_offset)
{
U_V1_CVFIR_VBOFFSET V0_CVFIR_VBOFFSET;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CVFIR_VBOFFSET.u32));
V0_CVFIR_VBOFFSET.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CVFIR_VBOFFSET.bits.vbchroma_offset = vbchroma_offset;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CVFIR_VBOFFSET.u32);
}
return;
}
gk_void hal_video_hfir_set_mid_en(hal_disp_layer layer, gk_u32 mid_en)
{
U_V0_HFIR_CTRL V0_HFIR_CTRL;
volatile gk_ulong addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_HFIR_CTRL.u32));
V0_HFIR_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_HFIR_CTRL.bits.mid_en = mid_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_HFIR_CTRL.u32);
}
return;
}
gk_void vdp_fdr_vid_set_chm_copy_en(gk_u32 layer, gk_u32 chm_copy_en)
{
U_VID_READ_CTRL VID_READ_CTRL;
VID_READ_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)(&(g_vo_reg->VID_READ_CTRL.u32) + layer * FDR_VID_OFFSET));
VID_READ_CTRL.bits.chm_copy_en = chm_copy_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)(&(g_vo_reg->VID_READ_CTRL.u32) + layer * FDR_VID_OFFSET),
VID_READ_CTRL.u32);
return;
}
gk_bool hal_video_set_hfir_mode(hal_disp_layer layer, hal_hfirmode mode)
{
volatile U_V0_HFIR_CTRL V0_HFIR_CTRL;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_HFIR_CTRL.u32));
V0_HFIR_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_HFIR_CTRL.bits.hfir_mode = mode;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_HFIR_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_video_hfir_set_coef(hal_disp_layer layer, const hfir_coef *coef)
{
volatile U_V0_HFIRCOEF01 V0_HFIRCOEF01;
volatile U_V0_HFIRCOEF23 V0_HFIRCOEF23;
volatile U_V0_HFIRCOEF45 V0_HFIRCOEF45;
volatile U_V0_HFIRCOEF67 V0_HFIRCOEF67;
volatile gk_ulong addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_HFIRCOEF01.u32));
V0_HFIRCOEF01.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_HFIRCOEF01.bits.coef0 = coef->coef0;
V0_HFIRCOEF01.bits.coef1 = coef->coef1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_HFIRCOEF01.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_HFIRCOEF23.u32));
V0_HFIRCOEF23.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_HFIRCOEF23.bits.coef2 = coef->coef2;
V0_HFIRCOEF23.bits.coef3 = coef->coef3;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_HFIRCOEF23.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_HFIRCOEF45.u32));
V0_HFIRCOEF45.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_HFIRCOEF45.bits.coef4 = coef->coef4;
V0_HFIRCOEF45.bits.coef5 = coef->coef5;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_HFIRCOEF45.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_HFIRCOEF67.u32));
V0_HFIRCOEF67.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_HFIRCOEF67.bits.coef6 = coef->coef6;
V0_HFIRCOEF67.bits.coef7 = coef->coef7;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_HFIRCOEF67.u32);
}
return GK_TRUE;
}
gk_bool hal_video_set_layer_disp_rect(hal_disp_layer layer, const gk_rect *rect)
{
volatile U_V0_DFPOS V0_DFPOS;
volatile U_V0_DLPOS V0_DLPOS;
volatile U_G0_DFPOS G0_DFPOS;
volatile U_G0_DLPOS G0_DLPOS;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_DFPOS.u32));
V0_DFPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_DFPOS.bits.disp_xfpos = rect->x;
V0_DFPOS.bits.disp_yfpos = rect->y;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_DFPOS.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_DLPOS.u32));
V0_DLPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_DLPOS.bits.disp_xlpos = rect->x + rect->width - 1;
V0_DLPOS.bits.disp_ylpos = rect->y + rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_DLPOS.u32);
break;
}
case HAL_DISP_LAYER_GFX0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_DFPOS));
G0_DFPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
G0_DFPOS.bits.disp_xfpos = rect->x;
G0_DFPOS.bits.disp_yfpos = rect->y;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, G0_DFPOS.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_DLPOS));
G0_DLPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
G0_DLPOS.bits.disp_xlpos = rect->x + rect->width - 1;
G0_DLPOS.bits.disp_ylpos = rect->y + rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, G0_DLPOS.u32);
break;
}
default: {
printf("error layer id found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_video_set_layer_video_rect(hal_disp_layer layer, const gk_rect *rect)
{
volatile U_V0_VFPOS V0_VFPOS;
volatile U_V0_VLPOS V0_VLPOS;
volatile U_G0_VFPOS G0_VFPOS;
volatile U_G0_VLPOS G0_VLPOS;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VFPOS.u32));
V0_VFPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VFPOS.bits.video_xfpos = rect->x;
V0_VFPOS.bits.video_yfpos = rect->y;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_VFPOS.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VLPOS.u32));
V0_VLPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VLPOS.bits.video_xlpos = rect->x + rect->width - 1;
V0_VLPOS.bits.video_ylpos = rect->y + rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_VLPOS.u32);
break;
}
case HAL_DISP_LAYER_GFX0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_VFPOS));
G0_VFPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
G0_VFPOS.bits.video_xfpos = rect->x;
G0_VFPOS.bits.video_yfpos = rect->y;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, G0_VFPOS.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_VLPOS));
G0_VLPOS.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
G0_VLPOS.bits.video_xlpos = rect->x + rect->width - 1;
G0_VLPOS.bits.video_ylpos = rect->y + rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, G0_VLPOS.u32);
break;
}
default: {
printf("error layer id %d# found in %s,%s: L%d\n", layer, __FILE__, __FUNCTION__, __LINE__);
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_video_set_multi_area_l_addr(hal_disp_layer layer, gk_u32 area_num, gk_ulong l_addr, gk_u16 stride)
{
gk_ulong pxaddr_addr;
gk_ulong pxstride_addr;
U_VID_STRIDE VID_STRIDE;
if (layer == HAL_DISP_LAYER_VHD0) {
pxaddr_addr = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_ADDR_L));
hal_write_reg((gk_u32*)(gk_uintptr_t)pxaddr_addr, get_low_addr(l_addr));
pxaddr_addr = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_ADDR_H));
hal_write_reg((gk_u32*)(gk_uintptr_t)pxaddr_addr, get_high_addr(l_addr));
pxstride_addr = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_STRIDE.u32));
VID_STRIDE.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)pxstride_addr);
VID_STRIDE.bits.lm_stride = stride;
hal_write_reg((gk_u32*)(gk_uintptr_t)pxstride_addr, VID_STRIDE.u32);
} else {
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_video_set_multi_area_c_addr(hal_disp_layer layer, gk_u32 area_num, gk_ulong c_addr, gk_u16 stride)
{
gk_ulong pxaddr_addr;
gk_ulong pxstride_addr;
U_VID_STRIDE VID_STRIDE;
if (layer == HAL_DISP_LAYER_VHD0) {
pxaddr_addr = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_CADDR_L));
hal_write_reg((gk_u32*)(gk_uintptr_t)pxaddr_addr, get_low_addr(c_addr));
pxaddr_addr = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_CADDR_H));
hal_write_reg((gk_u32*)(gk_uintptr_t)pxaddr_addr, get_high_addr(c_addr));
pxstride_addr = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_STRIDE.u32));
VID_STRIDE.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)pxstride_addr);
VID_STRIDE.bits.chm_stride = stride;
hal_write_reg((gk_u32*)(gk_uintptr_t)pxstride_addr, VID_STRIDE.u32);
} else {
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_layer_enable_layer(hal_disp_layer layer, gk_u32 enable)
{
volatile U_V0_CTRL V0_CTRL;
volatile U_G0_CTRL G0_CTRL;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CTRL.u32));
V0_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CTRL.bits.surface_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CTRL.u32);
break;
}
case HAL_DISP_LAYER_GFX0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_CTRL));
G0_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
G0_CTRL.bits.surface_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, G0_CTRL.u32);
break;
}
default: {
printf("error layer:%d id found in %s: L%d\n", layer, __FUNCTION__, __LINE__);
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_layer_set_layer_data_fmt(hal_disp_layer layer,
hal_disp_pixel_format data_fmt)
{
volatile U_VID_SRC_INFO VID_SRC_INFO;
volatile U_GFX_SRC_INFO GFX_SRC_INFO;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_VHD0) {
addr_reg = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_SRC_INFO.u32));
VID_SRC_INFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
VID_SRC_INFO.bits.data_type = data_fmt;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, VID_SRC_INFO.u32);
} else if (layer == HAL_DISP_LAYER_GFX0) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_SRC_INFO.u32));
GFX_SRC_INFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_SRC_INFO.bits.ifmt = data_fmt;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_SRC_INFO.u32);
} else {
printf("error layer id%d found in %s: L%d\n", layer, __FUNCTION__, __LINE__);
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_layer_set_layer_in_rect(hal_disp_layer layer, const gk_rect *rect)
{
U_VID_IN_RESO VID_IN_RESO;
U_GFX_IRESO GFX_IRESO;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_VHD0) {
addr_reg = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_IN_RESO.u32));
VID_IN_RESO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
VID_IN_RESO.bits.ireso_w = rect->width - 1;
VID_IN_RESO.bits.ireso_h = rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, VID_IN_RESO.u32);
} else if (layer == HAL_DISP_LAYER_GFX0) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_IRESO.u32));
GFX_IRESO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_IRESO.bits.ireso_w = rect->width - 1;
GFX_IRESO.bits.ireso_h = rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_IRESO.u32);
} else {
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_layer_set_layer_galpha(hal_disp_layer layer,
gk_u8 alpha0)
{
volatile U_V0_CTRL V0_CTRL;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_CTRL.u32));
V0_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_CTRL.bits.galpha = alpha0;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_layer_set_zme_info(hal_disp_layer layer, gk_u32 width, gk_u32 height,
hal_disp_zme_outfmt zme_out_fmt)
{
volatile U_V0_ZME_HINFO V0_ZME_HINFO;
volatile U_V0_ZME_VINFO V0_ZME_VINFO;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_VHD0) {
addr_reg = (gk_uintptr_t)&(g_vo_reg->V0_ZME_HINFO.u32);
V0_ZME_HINFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_ZME_HINFO.bits.out_width = width - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_ZME_HINFO.u32);
addr_reg = (gk_uintptr_t)&(g_vo_reg->V0_ZME_VINFO.u32);
V0_ZME_VINFO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_ZME_VINFO.bits.out_pro = 1;
V0_ZME_VINFO.bits.out_height = height - 1;
V0_ZME_VINFO.bits.out_fmt = zme_out_fmt;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_ZME_VINFO.u32);
} else {
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_layer_set_src_resolution(hal_disp_layer layer,
const gk_rect *rect)
{
U_VID_SRC_RESO VID_SRC_RESO;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_VHD0) {
addr_reg = vo_get_vid_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->VID_SRC_RESO.u32));
VID_SRC_RESO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
VID_SRC_RESO.bits.src_w = rect->width - 1;
VID_SRC_RESO.bits.src_h = rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, VID_SRC_RESO.u32);
}
return GK_TRUE;
}
/* vou zoom enable */
gk_bool hal_layer_set_zme_enable(hal_disp_layer layer,
hal_disp_zmemode mode,
gk_u32 enable)
{
volatile U_V0_ZME_HSP V0_ZME_HSP;
volatile U_V0_ZME_VSP V0_ZME_VSP;
volatile U_V1_CVFIR_VSP V1_CVFIR_VSP;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_VHD0) {
if ((mode == HAL_DISP_ZMEMODE_HORL) || (mode == HAL_DISP_ZMEMODE_HOR) || (mode == HAL_DISP_ZMEMODE_ALL)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_ZME_HSP.u32));
V0_ZME_HSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_ZME_HSP.bits.lhfir_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_ZME_HSP.u32);
}
if ((mode == HAL_DISP_ZMEMODE_HORC) || (mode == HAL_DISP_ZMEMODE_HOR) || (mode == HAL_DISP_ZMEMODE_ALL)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_ZME_HSP.u32));
V0_ZME_HSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_ZME_HSP.bits.chfir_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_ZME_HSP.u32);
}
if ((mode == HAL_DISP_ZMEMODE_VERL) || (mode == HAL_DISP_ZMEMODE_VER) || (mode == HAL_DISP_ZMEMODE_ALL)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_ZME_VSP.u32));
V0_ZME_VSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_ZME_VSP.bits.lvfir_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_ZME_VSP.u32);
}
if ((mode == HAL_DISP_ZMEMODE_VERC) || (mode == HAL_DISP_ZMEMODE_VER) || (mode == HAL_DISP_ZMEMODE_ALL)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_ZME_VSP.u32));
V0_ZME_VSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_ZME_VSP.bits.cvfir_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_ZME_VSP.u32);
}
} else if (layer == HAL_DISP_LAYER_VHD1) {
if ((mode == HAL_DISP_ZMEMODE_VERL) || (mode == HAL_DISP_ZMEMODE_VER) || (mode == HAL_DISP_ZMEMODE_ALL)) {
addr_reg = (gk_uintptr_t)&(g_vo_reg->V1_CVFIR_VSP.u32);
V1_CVFIR_VSP.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V1_CVFIR_VSP.bits.cvfir_en = enable;
V1_CVFIR_VSP.bits.cvmid_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V1_CVFIR_VSP.u32);
}
} else {
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_round_unlim(hal_disp_outputchannel chan, gk_u32 dither_round_unlim)
{
volatile U_INTF0_DITHER_CTRL INTF0_DITHER_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_CTRL.u32));
INTF0_DITHER_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_CTRL.bits.dither_round_unlim = dither_round_unlim;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_data_in_out(hal_disp_outputchannel chan, gk_u32 i_data_width_dither,
gk_u32 o_data_width_dither)
{
volatile U_INTF0_DITHER_CTRL INTF0_DITHER_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_CTRL.u32));
INTF0_DITHER_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_CTRL.bits.i_data_width_dither = i_data_width_dither;
INTF0_DITHER_CTRL.bits.o_data_width_dither = o_data_width_dither;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_en(hal_disp_outputchannel chan, gk_u32 dither_en)
{
volatile U_INTF0_DITHER_CTRL INTF0_DITHER_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_CTRL.u32));
INTF0_DITHER_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_CTRL.bits.dither_en = dither_en;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_mode(hal_disp_outputchannel chan, gk_u32 dither_mode)
{
volatile U_INTF0_DITHER_CTRL INTF0_DITHER_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_CTRL.u32));
INTF0_DITHER_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_CTRL.bits.dither_mode = dither_mode;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_round(hal_disp_outputchannel chan, gk_u32 dither_round)
{
volatile U_INTF0_DITHER_CTRL INTF0_DITHER_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_CTRL.u32));
INTF0_DITHER_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_CTRL.bits.dither_round = dither_round;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_domain_mode(hal_disp_outputchannel chan, gk_u32 dither_domain_mode)
{
volatile U_INTF0_DITHER_CTRL INTF0_DITHER_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_CTRL.u32));
INTF0_DITHER_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_CTRL.bits.dither_domain_mode = dither_domain_mode;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_tap_mode(hal_disp_outputchannel chan, gk_u32 dither_tap_mode)
{
volatile U_INTF0_DITHER_CTRL INTF0_DITHER_CTRL;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_CTRL.u32));
INTF0_DITHER_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_CTRL.bits.dither_tap_mode = dither_tap_mode;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_CTRL.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
static gk_void hal_disp_set_dither_sed0(hal_disp_outputchannel chan, const hal_disp_dihter_sed *dither_sed)
{
volatile U_INTF0_DITHER_SED_Y0 INTF0_DITHER_SED_Y0;
volatile U_INTF0_DITHER_SED_U0 INTF0_DITHER_SED_U0;
volatile U_INTF0_DITHER_SED_V0 INTF0_DITHER_SED_V0;
volatile U_INTF0_DITHER_SED_W0 INTF0_DITHER_SED_W0;
volatile gk_ulong addr_reg;
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_Y0.u32));
INTF0_DITHER_SED_Y0.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_Y0.bits.dither_sed_y0 = dither_sed->dither_sed_y0;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_Y0.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_U0.u32));
INTF0_DITHER_SED_U0.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_U0.bits.dither_sed_u0 = dither_sed->dither_sed_u0;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_U0.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_V0.u32));
INTF0_DITHER_SED_V0.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_V0.bits.dither_sed_v0 = dither_sed->dither_sed_v0;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_V0.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_W0.u32));
INTF0_DITHER_SED_W0.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_W0.bits.dither_sed_w0 = dither_sed->dither_sed_w0;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_W0.u32);
return;
}
static gk_void hal_disp_set_dither_sed1(hal_disp_outputchannel chan, const hal_disp_dihter_sed *dither_sed)
{
volatile U_INTF0_DITHER_SED_Y1 INTF0_DITHER_SED_Y1;
volatile U_INTF0_DITHER_SED_U1 INTF0_DITHER_SED_U1;
volatile U_INTF0_DITHER_SED_V1 INTF0_DITHER_SED_V1;
volatile U_INTF0_DITHER_SED_W1 INTF0_DITHER_SED_W1;
volatile gk_ulong addr_reg;
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_Y1.u32));
INTF0_DITHER_SED_Y1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_Y1.bits.dither_sed_y1 = dither_sed->dither_sed_y1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_Y1.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_U1.u32));
INTF0_DITHER_SED_U1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_U1.bits.dither_sed_u1 = dither_sed->dither_sed_u1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_U1.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_V1.u32));
INTF0_DITHER_SED_V1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_V1.bits.dither_sed_v1 = dither_sed->dither_sed_v1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_V1.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_W1.u32));
INTF0_DITHER_SED_W1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_W1.bits.dither_sed_w1 = dither_sed->dither_sed_w1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_W1.u32);
return ;
}
static gk_void hal_disp_set_dither_sed2(hal_disp_outputchannel chan, const hal_disp_dihter_sed *dither_sed)
{
volatile U_INTF0_DITHER_SED_Y2 INTF0_DITHER_SED_Y2;
volatile U_INTF0_DITHER_SED_U2 INTF0_DITHER_SED_U2;
volatile U_INTF0_DITHER_SED_V2 INTF0_DITHER_SED_V2;
volatile U_INTF0_DITHER_SED_W2 INTF0_DITHER_SED_W2;
volatile gk_ulong addr_reg;
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_Y2.u32));
INTF0_DITHER_SED_Y2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_Y2.bits.dither_sed_y2 = dither_sed->dither_sed_y2;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_Y2.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_U2.u32));
INTF0_DITHER_SED_U2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_U2.bits.dither_sed_u2 = dither_sed->dither_sed_u2;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_U2.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_V2.u32));
INTF0_DITHER_SED_V2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_V2.bits.dither_sed_v2 = dither_sed->dither_sed_v2;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_V2.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_W2.u32));
INTF0_DITHER_SED_W2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_W2.bits.dither_sed_w2 = dither_sed->dither_sed_w2;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_W2.u32);
return;
}
static gk_void hal_disp_set_dither_sed3(hal_disp_outputchannel chan, const hal_disp_dihter_sed *dither_sed)
{
volatile U_INTF0_DITHER_SED_Y3 INTF0_DITHER_SED_Y3;
volatile U_INTF0_DITHER_SED_U3 INTF0_DITHER_SED_U3;
volatile U_INTF0_DITHER_SED_V3 INTF0_DITHER_SED_V3;
volatile U_INTF0_DITHER_SED_W3 INTF0_DITHER_SED_W3;
volatile gk_ulong addr_reg;
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_Y3.u32));
INTF0_DITHER_SED_Y3.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_Y3.bits.dither_sed_y3 = dither_sed->dither_sed_y3;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_Y3.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_U3.u32));
INTF0_DITHER_SED_U3.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_U3.bits.dither_sed_u3 = dither_sed->dither_sed_u3;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_U3.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_V3.u32));
INTF0_DITHER_SED_V3.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_V3.bits.dither_sed_v3 = dither_sed->dither_sed_v3;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_V3.u32);
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_SED_W3.u32));
INTF0_DITHER_SED_W3.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_SED_W3.bits.dither_sed_w3 = dither_sed->dither_sed_w3;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_SED_W3.u32);
return;
}
gk_bool hal_disp_set_dither_sed(hal_disp_outputchannel chan, const hal_disp_dihter_sed *dither_sed)
{
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
/* set sed_y0,sed_u0,sed_v0,sed_w0 */
hal_disp_set_dither_sed0(chan, dither_sed);
/* set sed_y1,sed_u1,sed_v1,sed_w1 */
hal_disp_set_dither_sed1(chan, dither_sed);
/* set sed_y2,sed_u2,sed_v2,sed_w2 */
hal_disp_set_dither_sed2(chan, dither_sed);
/* set sed_y3,sed_u3,sed_v3,sed_w3 */
hal_disp_set_dither_sed3(chan, dither_sed);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_disp_set_dither_thr_min_max(hal_disp_outputchannel chan, gk_u32 thr_min, gk_u32 thr_max)
{
volatile U_INTF0_DITHER_THR INTF0_DITHER_THR;
volatile gk_ulong addr_reg;
switch (chan) {
case HAL_DISP_CHANNEL_DHD0: {
addr_reg = vo_get_chn_abs_addr(chan, (gk_uintptr_t)&(g_vo_reg->INTF0_DITHER_THR.u32));
INTF0_DITHER_THR.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
INTF0_DITHER_THR.bits.dither_thr_min = thr_min;
INTF0_DITHER_THR.bits.dither_thr_max = thr_max;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, INTF0_DITHER_THR.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_layer_set_reg_up(hal_disp_layer layer)
{
U_V0_UPD V0_UPD;
U_G0_UPD G0_UPD;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_UPD.u32));
V0_UPD.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
/* video layer register update */
V0_UPD.bits.regup = 0x1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, V0_UPD.u32);
break;
}
case HAL_DISP_LAYER_GFX0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_UPD));
G0_UPD.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
/* graphic layer register update */
G0_UPD.bits.regup = 0x1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, G0_UPD.u32);
break;
}
default: {
printf("error layer id found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_video_set_layer_alpha(hal_disp_layer layer, gk_u32 arange)
{
volatile U_V0_ALPHA V0_ALPHA;
volatile gk_ulong addr_reg;
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_ALPHA.u32));
V0_ALPHA.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_ALPHA.bits.vbk_alpha = arange;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_ALPHA.u32);
break;
}
default: {
return GK_FALSE;
}
}
return GK_TRUE;
}
gk_bool hal_cbm_set_cbm_bkg(gk_u32 mixer_id, const hal_disp_bkcolor *bkg)
{
U_CBM_BKG1 CBM_BKG1;
if (mixer_id == HAL_CBMMIX1) {
CBM_BKG1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->CBM_BKG1.u32));
CBM_BKG1.bits.cbm_bkgy1 = (bkg->bkg_y);
CBM_BKG1.bits.cbm_bkgcb1 = (bkg->bkg_cb);
CBM_BKG1.bits.cbm_bkgcr1 = (bkg->bkg_cr);
hal_write_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->CBM_BKG1.u32), CBM_BKG1.u32);
} else {
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_cbm_set_cbm_mixer_prio(hal_disp_layer layer, gk_u8 prio, gk_u8 mixer_id)
{
U_CBM_MIX1 CBM_MIX1;
gk_u8 layer_id = 0;
if (mixer_id == HAL_CBMMIX1) {
switch (layer) {
case HAL_DISP_LAYER_VHD0: {
layer_id = 0x1; /* 0x1 register config */
break;
}
case HAL_DISP_LAYER_GFX0: {
layer_id = 0x2; /* 0x2 register config */
break;
}
default: {
return GK_FALSE;
}
}
CBM_MIX1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->CBM_MIX1.u32));
switch (prio) {
case 0: { /* prio 0 */
CBM_MIX1.bits.mixer_prio0 = layer_id;
break;
}
case 1: { /* prio 1 */
CBM_MIX1.bits.mixer_prio1 = layer_id;
break;
}
case 2: { /* prio 2 */
CBM_MIX1.bits.mixer_prio2 = layer_id;
break;
}
default: {
return GK_FALSE;
}
}
hal_write_reg((gk_u32*)(gk_uintptr_t)&(g_vo_reg->CBM_MIX1.u32), CBM_MIX1.u32);
} else {
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_graphic_set_gfx_ext(hal_disp_layer layer,
hal_gfx_bitextend mode)
{
U_GFX_OUT_CTRL GFX_OUT_CTRL;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_GFX0) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_OUT_CTRL.u32));
GFX_OUT_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_OUT_CTRL.bits.bitext = mode;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, GFX_OUT_CTRL.u32);
} else {
printf("error layer id found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_graphic_set_gfx_palpha(hal_disp_layer layer,
gk_u32 alpha_en, gk_u32 arange,
gk_u8 alpha0, gk_u8 alpha1)
{
U_GFX_OUT_CTRL GFX_OUT_CTRL;
U_GFX_1555_ALPHA GFX_1555_ALPHA;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_GFX0) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_OUT_CTRL.u32));
GFX_OUT_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_OUT_CTRL.bits.palpha_en = alpha_en;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_OUT_CTRL.u32);
if (alpha_en == GK_TRUE) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_1555_ALPHA.u32));
GFX_1555_ALPHA.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_1555_ALPHA.bits.alpha_1 = alpha1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_1555_ALPHA.u32);
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_1555_ALPHA.u32));
GFX_1555_ALPHA.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_1555_ALPHA.bits.alpha_0 = alpha0;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_1555_ALPHA.u32);
} else {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_1555_ALPHA.u32));
GFX_1555_ALPHA.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_1555_ALPHA.bits.alpha_1 = 0xff; /* 0xff max alpha */
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, GFX_1555_ALPHA.u32);
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_1555_ALPHA.u32));
GFX_1555_ALPHA.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_1555_ALPHA.bits.alpha_0 = 0xff; /* 0xff max alpha */
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, GFX_1555_ALPHA.u32);
}
} else {
printf("error layer id found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_graphic_set_gfx_pre_mult(hal_disp_layer layer, gk_u32 enable)
{
U_GFX_OUT_CTRL GFX_OUT_CTRL;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_GFX0) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_OUT_CTRL.u32));
GFX_OUT_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_OUT_CTRL.bits.premulti_en = enable;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_OUT_CTRL.u32);
} else {
printf("error layer id found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_graphic_set_gfx_addr(hal_disp_layer layer, gk_u64 l_addr)
{
volatile gk_ulong gfx_addr_h;
volatile gk_ulong gfx_addr_l;
if (layer == HAL_DISP_LAYER_GFX0) {
gfx_addr_l = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_ADDR_L));
hal_write_reg((gk_u32*)(gk_uintptr_t)gfx_addr_l, get_low_addr(l_addr));
gfx_addr_h = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_ADDR_H));
hal_write_reg((gk_u32*)(gk_uintptr_t)gfx_addr_h, get_high_addr(l_addr));
} else {
printf("error layer id found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_graphic_set_gfx_stride(hal_disp_layer layer, gk_u16 pitch)
{
volatile U_GFX_STRIDE GFX_STRIDE;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_GFX0) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_STRIDE.u32));
GFX_STRIDE.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_STRIDE.bits.surface_stride = pitch;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_STRIDE.u32);
} else {
printf("error layer id found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
return GK_TRUE;
}
gk_bool hal_gfx_set_src_resolution(hal_disp_layer layer, const gk_rect *rect)
{
U_GFX_SRC_RESO GFX_SRC_RESO;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_GFX0) {
addr_reg = vo_get_gfx_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->GFX_SRC_RESO.u32));
GFX_SRC_RESO.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
GFX_SRC_RESO.bits.src_w = rect->width - 1;
GFX_SRC_RESO.bits.src_h = rect->height - 1;
hal_write_reg((gk_u32*)(gk_uintptr_t)addr_reg, GFX_SRC_RESO.u32);
} else {
printf("error:layer id not found in %s: L%d\n", __FUNCTION__, __LINE__);
return GK_FALSE;
}
return GK_TRUE;
}
gk_void hal_layer_csc_set_dc_coef(hal_disp_layer layer, const vdp_csc_dc_coef *csc_dc_coef)
{
U_V0_VOPP_CSC_IDC0 V0_VOPP_CSC_IDC0;
U_V0_VOPP_CSC_IDC1 V0_VOPP_CSC_IDC1;
U_V0_VOPP_CSC_IDC2 V0_VOPP_CSC_IDC2;
U_V0_VOPP_CSC_ODC0 V0_VOPP_CSC_ODC0;
U_V0_VOPP_CSC_ODC1 V0_VOPP_CSC_ODC1;
U_V0_VOPP_CSC_ODC2 V0_VOPP_CSC_ODC2;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_IDC0.u32));
V0_VOPP_CSC_IDC0.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_IDC0.bits.vopp_csc_idc0 = csc_dc_coef->csc_in_dc0;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_IDC0.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_IDC1.u32));
V0_VOPP_CSC_IDC1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_IDC1.bits.vopp_csc_idc1 = csc_dc_coef->csc_in_dc1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_IDC1.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_IDC2.u32));
V0_VOPP_CSC_IDC2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_IDC2.bits.vopp_csc_idc2 = csc_dc_coef->csc_in_dc2;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_IDC2.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_ODC0.u32));
V0_VOPP_CSC_ODC0.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_ODC0.bits.vopp_csc_odc0 = csc_dc_coef->csc_out_dc0;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_ODC0.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_ODC1.u32));
V0_VOPP_CSC_ODC1.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_ODC1.bits.vopp_csc_odc1 = csc_dc_coef->csc_out_dc1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_ODC1.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_ODC2.u32));
V0_VOPP_CSC_ODC2.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_ODC2.bits.vopp_csc_odc2 = csc_dc_coef->csc_out_dc2;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_ODC2.u32);
}
}
gk_void hal_layer_csc_set_csc_mode(hal_disp_layer layer, gk_s32 csc_mode)
{
U_V0_VOPP_CSC_CTRL V0_VOPP_CSC_CTRL;
volatile gk_ulong addr_reg;
if (layer == HAL_DISP_LAYER_GFX0) {
switch (csc_mode) {
case HAL_CSC_MODE_RGB_TO_BT601_PC: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_VOPP_CSC_CTRL.u32));
V0_VOPP_CSC_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_CTRL.bits.vopp_csc_mode = 0x0;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_CTRL.u32);
break;
}
case HAL_CSC_MODE_RGB_TO_BT709_PC: {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_VOPP_CSC_CTRL.u32));
V0_VOPP_CSC_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_CTRL.bits.vopp_csc_mode = 0x1;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_CTRL.u32);
break;
}
default: {
break;
}
}
}
return;
}
gk_void hal_layer_csc_set_param(hal_disp_layer layer, const csc_coef_param *coef_param)
{
U_V0_VOPP_CSC_SCALE V0_VOPP_CSC_SCALE;
U_V0_VOPP_CSC_MIN_Y V0_VOPP_CSC_MIN_Y;
U_V0_VOPP_CSC_MIN_C V0_VOPP_CSC_MIN_C;
U_V0_VOPP_CSC_MAX_Y V0_VOPP_CSC_MAX_Y;
U_V0_VOPP_CSC_MAX_C V0_VOPP_CSC_MAX_C;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_SCALE.u32));
V0_VOPP_CSC_SCALE.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_SCALE.bits.vopp_csc_scale = coef_param->csc_scale2p;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_SCALE.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_MIN_Y.u32));
V0_VOPP_CSC_MIN_Y.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_MIN_Y.bits.vopp_csc_min_y = coef_param->csc_clip_min;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_MIN_Y.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_MIN_C.u32));
V0_VOPP_CSC_MIN_C.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_MIN_C.bits.vopp_csc_min_c = coef_param->csc_clip_min;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_MIN_C.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_MAX_Y.u32));
V0_VOPP_CSC_MAX_Y.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_MAX_Y.bits.vopp_csc_max_y = coef_param->csc_clip_max;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_MAX_Y.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_MAX_C.u32));
V0_VOPP_CSC_MAX_C.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_MAX_C.bits.vopp_csc_max_c = coef_param->csc_clip_max;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_MAX_C.u32);
}
}
static gk_void hal_layer_csc_set_video_coef0x(hal_disp_layer layer, const vdp_csc_coef *csc_coef)
{
U_V0_VOPP_CSC_COEF00 V0_VOPP_CSC_COEF00;
U_V0_VOPP_CSC_COEF01 V0_VOPP_CSC_COEF01;
U_V0_VOPP_CSC_COEF02 V0_VOPP_CSC_COEF02;
volatile gk_u32 addr_reg;
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF00.u32));
V0_VOPP_CSC_COEF00.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF00.bits.vopp_csc_coef00 = csc_coef->csc_coef00;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF00.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF01.u32));
V0_VOPP_CSC_COEF01.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF01.bits.vopp_csc_coef01 = csc_coef->csc_coef01;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF01.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF02.u32));
V0_VOPP_CSC_COEF02.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF02.bits.vopp_csc_coef02 = csc_coef->csc_coef02;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF02.u32);
return;
}
static gk_void hal_layer_csc_set_video_coef1x(hal_disp_layer layer, const vdp_csc_coef *csc_coef)
{
U_V0_VOPP_CSC_COEF10 V0_VOPP_CSC_COEF10;
U_V0_VOPP_CSC_COEF11 V0_VOPP_CSC_COEF11;
U_V0_VOPP_CSC_COEF12 V0_VOPP_CSC_COEF12;
volatile gk_u32 addr_reg;
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF10.u32));
V0_VOPP_CSC_COEF10.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF10.bits.vopp_csc_coef10 = csc_coef->csc_coef10;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF10.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF11.u32));
V0_VOPP_CSC_COEF11.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF11.bits.vopp_csc_coef11 = csc_coef->csc_coef11;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF11.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF12.u32));
V0_VOPP_CSC_COEF12.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF12.bits.vopp_csc_coef12 = csc_coef->csc_coef12;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF12.u32);
return;
}
static gk_void hal_layer_csc_set_video_coef2x(hal_disp_layer layer, const vdp_csc_coef *csc_coef)
{
U_V0_VOPP_CSC_COEF20 V0_VOPP_CSC_COEF20;
U_V0_VOPP_CSC_COEF21 V0_VOPP_CSC_COEF21;
U_V0_VOPP_CSC_COEF22 V0_VOPP_CSC_COEF22;
volatile gk_u32 addr_reg;
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF20.u32));
V0_VOPP_CSC_COEF20.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF20.bits.vopp_csc_coef20 = csc_coef->csc_coef20;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF20.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF21.u32));
V0_VOPP_CSC_COEF21.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF21.bits.vopp_csc_coef21 = csc_coef->csc_coef21;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF21.u32);
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_COEF22.u32));
V0_VOPP_CSC_COEF22.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_COEF22.bits.vopp_csc_coef22 = csc_coef->csc_coef22;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_COEF22.u32);
return;
}
gk_void hal_layer_csc_set_coef(hal_disp_layer layer, const vdp_csc_coef *csc_coef)
{
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
hal_layer_csc_set_video_coef0x(layer, csc_coef);
hal_layer_csc_set_video_coef1x(layer, csc_coef);
hal_layer_csc_set_video_coef2x(layer, csc_coef);
}
return;
}
gk_bool hal_layer_set_csc_coef(hal_disp_layer layer, const vo_csc_coef *csc_coef)
{
hal_layer_csc_set_dc_coef(layer, (vdp_csc_dc_coef *)(&csc_coef->csc_in_dc0));
hal_layer_csc_set_coef(layer, (vdp_csc_coef *)(&csc_coef->csc_coef00));
hal_layer_csc_set_param(layer, (csc_coef_param *)(&csc_coef->new_csc_scale2p));
return GK_TRUE;
}
gk_void hal_layer_csc_set_ck_gt_en(hal_disp_layer layer, gk_bool ck_gt_en)
{
U_V0_VOPP_CSC_CTRL V0_VOPP_CSC_CTRL;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_CTRL.u32));
V0_VOPP_CSC_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_CTRL.bits.vopp_csc_ck_gt_en = ck_gt_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_CTRL.u32);
} else if ((layer >= LAYER_GFX_START) && (layer <= LAYER_GFX_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_VOPP_CSC_CTRL.u32));
V0_VOPP_CSC_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_CTRL.bits.vopp_csc_ck_gt_en = ck_gt_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_CTRL.u32);
}
}
gk_void hal_layer_csc_set_enable(hal_disp_layer layer, gk_bool csc_en)
{
U_V0_VOPP_CSC_CTRL V0_VOPP_CSC_CTRL;
volatile gk_u32 addr_reg;
if ((layer >= LAYER_VHD_START) && (layer <= LAYER_VHD_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->V0_VOPP_CSC_CTRL.u32));
V0_VOPP_CSC_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_CTRL.bits.vopp_csc_en = csc_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_CTRL.u32);
} else if ((layer >= LAYER_GFX_START) && (layer <= LAYER_GFX_END)) {
addr_reg = vo_get_abs_addr(layer, (gk_uintptr_t)&(g_vo_reg->G0_VOPP_CSC_CTRL.u32));
V0_VOPP_CSC_CTRL.u32 = hal_read_reg((gk_u32*)(gk_uintptr_t)addr_reg);
V0_VOPP_CSC_CTRL.bits.vopp_csc_en = csc_en;
hal_write_reg ((gk_u32*)(gk_uintptr_t)addr_reg, V0_VOPP_CSC_CTRL.u32);
}
}
gk_bool hal_layer_set_csc_en(hal_disp_layer layer, gk_bool csc_en)
{
if ((layer != HAL_DISP_LAYER_VHD0) && (layer != HAL_DISP_LAYER_GFX0)) {
printf("error, wrong layer ID!%d\n", __LINE__);
return GK_FALSE;
}
hal_layer_csc_set_ck_gt_en(layer, csc_en);
hal_layer_csc_set_enable(layer, csc_en);
return GK_TRUE;
}