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

677 lines
15 KiB
C
Executable File

/*
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
*/
#ifndef __VOU_DRV_H__
#define __VOU_DRV_H__
#include "type.h"
#include "gk7205v200_vo.h"
#include "vou_def.h"
#include "vou_coef.h"
#ifdef __cplusplus
extern "C" {
#endif /* end of #ifdef __cplusplus */
/*
* yuv(y,u,v) assemble the y,u,v to 24bit color
* yuv_y(c) get Y from 24bit color
* yuv_u(c) get U from 24bit color
* yuv_v(c) get V from 24bit color
*/
#define yuv(y, u, v) ((((y) & 0x03ff) << 20) | (((u) & 0x03ff) << 10) | ((v) & 0x03ff))
#define yuv_y(c) (((c) & 0x3ff00000) >> 20)
#define yuv_u(c) (((c) & 0x000ffc00) >> 10)
#define yuv_v(c) ((c) & 0x000003ff)
#define GFX_CSC_SCALE 0x8
#define GFX_CSC_CLIP_MIN 0x0
#define GFX_CSC_CLIP_MAX 0x3ff
typedef gk_s32 vo_hal_dev;
typedef gk_s32 vo_hal_layer;
typedef gk_s32 vo_hal_chn;
typedef gk_s32 vo_hal_wbc;
typedef gk_s32 graphic_hal_layer;
typedef gk_u32 vo_intf_type;
typedef enum {
VO_INT_MODE_FRAME = 0x0,
VO_INT_MODE_FIELD = 0x1,
VO_INT_MODE_BUTT
} vo_int_mode;
/* vou mixer prio id */
typedef enum {
VO_MIX_PRIO0 = 0,
VO_MIX_PRIO1,
VO_MIX_PRIO2,
VO_MIX_PRIO3,
VO_MIX_PRIO4,
VO_MIX_PRIO5,
VO_MIX_PRIO_CLR,
VO_MIX_BUTT
} vo_mix_prio;
typedef enum {
/* for video surface interface */
VO_LAYER_PIXERL_FORMAT_SP_Y_CB_CR_400 = 0x1,
VO_LAYER_PIXERL_FORMAT_SP_Y_CB_CR_420 = 0x2,
VO_LAYER_PIXERL_FORMAT_SP_Y_CB_CR_422 = 0x3,
VO_LAYER_PIXERL_FORMAT_BUTT
} vo_layer_pixerl_format;
typedef enum {
/* for device interface */
VO_INTF_PIXERL_FORMAT_YCBCR422 = 0x0,
VO_INTF_PIXERL_FORMAT_YCBCR444 = 0xC,
VO_INTF_PIXERL_FORMAT_RGB888 = 0xC,
VO_INTF_PIXERL_FORMAT_BUTT
} vo_intf_pixerl_format;
typedef enum {
VO_CSC_DEF_VAL = 50,
VO_CSC_LUMA_MAX = 100,
VO_CSC_LUMA_MIN = 0,
VO_CSC_CONT_MAX = 100,
VO_CSC_CONT_MIN = 0,
VO_CSC_HUE_MAX = 100,
VO_CSC_HUE_MIN = 0,
VO_CSC_SAT_MAX = 100,
VO_CSC_SAT_MIN = 0,
} vo_csc_range;
typedef struct {
gk_u32 acm_blk_en;
gk_u8 u_index;
gk_u8 v_index;
gk_s8 u_offset_a;
gk_s8 u_offset_b;
gk_s8 u_offset_c;
gk_s8 u_offset_d;
gk_s8 v_offset_a;
gk_s8 v_offset_b;
gk_s8 v_offset_c;
gk_s8 v_offset_d;
} vou_acm_blkinfo;
/* vou zoom mode */
typedef enum {
VO_DISP_ZMEMODE_HORL = 0,
VO_DISP_ZMEMODE_HORC,
VO_DISP_ZMEMODE_VERL,
VO_DISP_ZMEMODE_VERC,
VO_DISP_ZMEMODE_HOR,
VO_DISP_ZMEMODE_VER,
VO_DISP_ZMEMODE_ALPHA,
VO_DISP_ZMEMODE_ALPHAV,
VO_DISP_ZMEMODE_VERT,
VO_DISP_ZMEMODE_VERB,
VO_DISP_ZMEMODE_ALL,
VO_DISP_ZMEMODE_NONL,
VO_DISP_ZMEMODE_BUTT
} vo_disp_zmemode;
typedef struct {
vou_acm_blkinfo acm_blk[4]; /* 4 acm blk num */
} vou_acm;
typedef enum {
VOU_HD_HW_DEV = 0,
VOU_SD_HW_DEV,
VOU_CAS_DEV,
VOU_VIRT_DEV,
VOU_DEV_TYPE_BUTT,
} vou_dev_type;
typedef struct {
vou_dev_type vo_dev_type;
gk_bool hd_vpss_rciv;
gk_bool sd_tde_disp;
gk_bool support_wbc;
gk_bool spt_get_screen_frm;
} vou_dev_capability;
typedef enum {
VOU_SW_LAYER_VHD0 = 0,
VOU_SW_LAYER_VHD1 = 1,
VOU_SW_LAYER_VP = 2,
VOU_SW_LAYER_VSD0 = 3,
VOU_SW_LAYER_VIRT0 = 4,
VOU_SW_LAYER_VIRT1 = 5,
VOU_SW_LAYER_VIRT2 = 6,
VOU_SW_LAYER_VIRT3 = 7,
VOU_SW_LAYER_BUTT
} vou_sw_layer;
typedef struct {
gk_bool synm; /* sync mode(0:timing,as BT.656; 1:signal,as LCD) */
gk_bool iop; /* interlaced or progressive display(0:i; 1:p) */
gk_u8 intfb; /* interlace bit width while output */
gk_u16 vact; /* vertical active area */
gk_u16 vbb; /* vertical back blank porch */
gk_u16 vfb; /* vertical front blank porch */
gk_u16 hact; /* herizontal active area */
gk_u16 hbb; /* herizontal back blank porch */
gk_u16 hfb; /* herizontal front blank porch */
gk_u16 hmid; /* bottom herizontal active area */
gk_u16 bvact; /* bottom vertical active area */
gk_u16 bvbb; /* bottom vertical back blank porch */
gk_u16 bvfb; /* bottom vertical front blank porch */
gk_u16 hpw; /* horizontal pulse width */
gk_u16 vpw; /* vertical pulse width */
gk_bool idv; /* inverse data valid of output */
gk_bool ihs; /* inverse horizontal synch signal */
gk_bool ivs; /* inverse vertical synch signal */
} vo_sync_info;
typedef enum {
VOU_LAYER_DDR0 = 0,
VOU_LAYER_DDR1 = 1,
VOU_LAYER_DDR_BUTT
} vou_layer_ddr;
typedef struct {
vo_csc_matrix csc_matrix;
gk_u32 luma; /* luminance: 0 ~ 100 default: 50 */
gk_u32 contrast; /* contrast : 0 ~ 100 default: 50 */
gk_u32 hue; /* hue : 0 ~ 100 default: 50 */
gk_u32 satuature; /* satuature: 0 ~ 100 default: 50 */
} vo_csc;
typedef struct {
vo_csc csc;
gk_u32 gain; /* current gain of VGA signals. [0, 64). default:0x30 */
} vo_vga_param;
typedef struct {
gk_u32 width;
gk_u32 height;
} size;
typedef struct {
gk_u32 bg_color; /* background color of a device, in RGB format. */
vo_intf_type intf_type; /* type of a VO interface */
vo_intf_sync intf_sync; /* type of a VO interface timing */
vo_sync_info sync_info; /* information about VO interface timings */
} vo_pub_attr;
typedef struct {
gk_u32 vhdr_en;
gk_u32 vhdr_ck_gt_en;
gk_u32 vhdr_degmm_en;
gk_u32 vhdr_gamut_en;
gk_u32 vhdr_tmap_en;
gk_u32 vhdr_gmm_en;
gk_u32 vhdr_dither_en;
gk_u32 vhdr_r2y_en;
gk_u32 vhdr_cadj_en;
gk_u32 vhdr_gamut_bind;
gk_u32 vhdr_dither_round_unlim;
gk_u32 vhdr_dither_round;
gk_u32 vhdr_dither_domain_mode;
gk_u32 vhdr_dither_tap_mode;
} vo_hdr_v_cfg;
typedef struct {
gk_u32 hdr_y2r_en;
gk_u32 hdr_y2r_ck_gt_en;
gk_u32 hdr_v0_y2r_en;
gk_u32 hdr_v1_y2r_en;
gk_u32 hdr_v0_vhdr_en;
gk_u32 hdr_v1_vhdr_en;
gk_u32 hdr_v0_cl_en;
gk_u32 hdr_v1_cl_en;
gk_u32 hdr_v_demo_en;
gk_u32 hdr_v_demo_mode;
gk_u32 hdr_v_demo_pos;
} vo_csc_v0_cfg;
typedef struct {
gk_u32 ck_gt_en;
gk_u32 hfir_order;
gk_u32 lhfir_en;
gk_u32 chfir_en;
gk_u32 lhmid_en;
gk_u32 chmid_en;
gk_u32 non_lnr_en;
gk_u32 lhfir_mode;
gk_u32 chfir_mode;
gk_u32 hl_shootctrl_en;
gk_u32 hl_shootctrl_mode;
gk_u32 hc_shootctrl_en;
gk_u32 hc_shootctrl_mode;
gk_u32 in_pro;
gk_u32 out_pro;
gk_u32 out_fmt;
gk_u64 in_height;
gk_u64 out_height;
gk_u64 in_width;
gk_u64 out_width;
gk_u32 graphdet_en;
gk_u32 lvfir_en;
gk_u32 cvfir_en;
gk_u32 lvmid_en;
gk_u32 cvmid_en;
gk_u32 vfir_1tap_en;
gk_u32 lvfir_mode;
gk_u32 cvfir_mode;
gk_u32 vl_shootctrl_en;
gk_u32 vl_shootctrl_mode;
gk_u32 vc_shootctrl_en;
gk_u32 vc_shootctrl_mode;
} vo_v0_zme_cfg;
typedef struct {
gk_u32 vluma_offset;
gk_u32 vchroma_offset;
gk_u32 vbluma_offset;
gk_u32 vbchroma_offset;
gk_u32 lhfir_offset;
gk_u32 chfir_offset;
gk_u32 vl_flatdect_mode;
gk_u32 vl_coringadj_en;
gk_u32 vl_gain;
gk_u32 vl_coring;
gk_u32 vc_flatdect_mode;
gk_u32 vc_coringadj_en;
gk_u32 vc_gain;
gk_u32 vc_coring;
gk_u32 hl_flatdect_mode;
gk_u32 hl_coringadj_en;
gk_u32 hl_gain;
gk_u32 hl_coring;
gk_u32 hc_flatdect_mode;
gk_u32 hc_coringadj_en;
gk_u32 hc_gain;
gk_u32 hc_coring;
} vo_zme_comm_pq_cfg;
typedef struct {
gk_u32 zme_vprec;
gk_u32 zme_hprec;
} vo_zme_ds_info;
typedef enum {
VO_ZME_TYP = 0,
VO_ZME_TYP1,
VO_ZME_RAND,
VO_ZME_MAX,
VO_ZME_MIN,
VO_ZME_ZERO,
VO_ZME_BUTT
} vo_zme_mode;
typedef enum {
VDP_V0_HFIR_TYP = 0,
VDP_V0_HFIR_TYP1,
VDP_V0_HFIR_RAND,
VDP_V0_HFIR_MAX,
VDP_V0_HFIR_MIN,
VDP_V0_HFIR_ZERO,
VDP_V0_HFIR_BUTT
} vo_v0_hfir_mode;
typedef enum {
XDP_V0_HFIR_BYPASS = 0,
XDP_V0_HFIR_COPY,
XDP_V0_HFIR_BILT,
XDP_V0_HFIR_FILT,
XDP_V0_HFIR_BUTT
} xdp_v0_hfir_mode;
typedef struct {
gk_u32 ck_gt_en;
gk_u32 mid_en;
xdp_v0_hfir_mode hfir_mode;
} vo_v0_hfir_cfg;
typedef struct {
gk_u32 vid_iw;
gk_u32 vid_ih;
gk_u32 vid_ow;
gk_u32 vid_oh;
gk_u32 zme_en;
gk_u32 hfir_en;
gk_u32 csc_en;
gk_u32 hdr_en;
vo_v0_zme_cfg zme_cfg;
vo_v0_hfir_cfg hfir_cfg;
vo_csc_v0_cfg yuv2_rgb_cfg;
vo_hdr_v_cfg v_hdr_cfg;
} vdp_vid_ip_cfg;
typedef struct {
gk_u32 ck_gt_en;
gk_u32 out_pro;
gk_u32 out_fmt;
gk_u64 in_height;
gk_u64 out_height;
gk_u64 in_width;
gk_u64 out_width;
gk_u32 cvfir_en;
gk_u32 cvmid_en;
gk_u32 cvfir_mode;
gk_u32 hfir_order;
gk_u32 lhfir_en;
gk_u32 chfir_en;
gk_u32 lhmid_en;
gk_u32 chmid_en;
gk_u32 non_lnr_en;
gk_u32 lhfir_mode;
gk_u32 chfir_mode;
gk_u32 hl_shootctrl_en;
gk_u32 hl_shootctrl_mode;
gk_u32 hc_shootctrl_en;
gk_u32 hc_shootctrl_mode;
gk_u32 in_pro;
gk_u32 graphdet_en;
gk_u32 lvfir_en;
gk_u32 lvmid_en;
gk_u32 vfir_1tap_en;
gk_u32 lvfir_mode;
gk_u32 vl_shootctrl_en;
gk_u32 vl_shootctrl_mode;
gk_u32 vc_shootctrl_en;
gk_u32 vc_shootctrl_mode;
} vdp_v1_cvfir_cfg;
typedef enum {
VDP_V1_HFIR_TYP = 0,
VDP_V1_HFIR_TYP1,
VDP_V1_HFIR_RAND,
VDP_V1_HFIR_MAX,
VDP_V1_HFIR_MIN,
VDP_V1_HFIR_ZERO,
VDP_V1_HFIR_BUTT
} vdp_v1_hfir_mode;
typedef enum {
XDP_HFIR_BYPASS = 0,
XDP_HFIR_COPY,
XDP_HFIR_BILT,
XDP_HFIR_FILT,
XDP_HFIR_BUTT
} xdp_hfir_mode;
typedef struct {
gk_u32 ck_gt_en;
gk_u32 mid_en;
xdp_hfir_mode hfir_mode;
} vdp_v1_hfir_cfg;
typedef struct {
gk_u32 csc_en;
gk_u32 csc_ck_gt_en;
} vdp_csc_v1_cfg;
typedef enum {
VDP_RMODE_INTERFACE = 0,
VDP_RMODE_INTERLACE = 0,
VDP_RMODE_PROGRESSIVE = 1,
VDP_RMODE_TOP = 2,
VDP_RMODE_BOTTOM = 3,
VDP_RMODE_PRO_TOP = 4,
VDP_RMODE_PRO_BOTTOM = 5,
VDP_RMODE_BUTT
} vdp_data_rmode;
typedef enum {
VDP_G0_ZME_TYP = 0,
VDP_G0_ZME_TYP1,
VDP_G0_ZME_RAND,
VDP_G0_ZME_MAX,
VDP_G0_ZME_MIN,
VDP_G0_ZME_ZERO,
VDP_G0_ZME_BUTT
} gf_g0_zme_mode;
typedef enum {
VDP_G0_ZME_FIR_COPY = 0,
VDP_G0_ZME_FIR_FILT = 1
} gf_g0_zme_fir_mode;
typedef struct {
gk_u32 ck_gt_en;
gk_u32 in_width;
gk_u32 out_width;
gk_u32 out_pro;
gk_u32 hfir_en;
gk_u32 lhmid_en;
gk_u32 ahmid_en;
gk_u32 lhfir_mode;
gk_u32 ahfir_mode;
gk_u32 in_height;
gk_u32 out_height;
gk_u32 vfir_en;
gk_u32 lvmid_en;
gk_u32 avmid_en;
gk_u32 lvfir_mode;
gk_u32 avfir_mode;
} gf_g0_zme_cfg;
typedef enum {
GF_RM_COEF_MODE_TYP = 0x0,
GF_RM_COEF_MODE_RAN = 0x1,
GF_RM_COEF_MODE_MIN = 0x2,
GF_RM_COEF_MODE_MAX = 0x3,
GF_RM_COEF_MODE_ZRO = 0x4,
GF_RM_COEF_MODE_CUS = 0x5,
GF_RM_COEF_MODE_UP = 0x6,
GF_RM_COEF_MODE_BUTT
} gf_rm_coef_mode;
typedef enum {
GFX_DCMP_SRC_MODE_ARGB8888 = 0,
GFX_DCMP_SRC_MODE_ARGB6888,
GFX_DCMP_SRC_MODE_ARGB1555,
GFX_DCMP_SRC_MODE_ARGB4444,
GFX_DCMP_SRC_MODE_BUTT
} gfx_dcmp_src_mode;
typedef enum {
VDP_DITHER_MODE_TYP = 0,
VDP_DITHER_MODE_TYP1,
VDP_DITHER_MODE_RAND,
VDP_DITHER_MODE_MAX,
VDP_DITHER_MODE_MIN,
VDP_DITHER_MODE_ZERO,
VDP_DITHER_MODE_BUTT
} vdp_dither_mode;
typedef enum {
DITHER_MODE_10BIT = 0,
DITHER_MODE_8BIT = 1,
DITHER_MODE_BUTT
} dither_mode;
typedef enum {
DITHER_OWIDTH_MODE_5BIT = 0,
DITHER_OWIDTH_MODE_6BIT = 1,
DITHER_OWIDTH_MODE_7BIT = 2,
DITHER_OWIDTH_MODE_8BIT = 3,
DITHER_OWIDTH_MODE_9BIT = 4,
DITHER_OWIDTH_MODE_10BIT = 5,
DITHER_OWIDTH_MODE_BUTT
} dither_owidth_mode;
typedef enum {
DITHER_IWIDTH_MODE_8BIT = 0,
DITHER_IWIDTH_MODE_9BIT = 1,
DITHER_IWIDTH_MODE_10BIT = 2,
DITHER_IWIDTH_MODE_11BIT = 3,
DITHER_IWIDTH_MODE_12BIT = 4,
DITHER_IWIDTH_MODE_BUTT
} dither_iwidth_mode;
typedef enum {
DITHER_DOMAIN_MODE_SPACE = 0,
DITHER_DOMAIN_MODE_TIME = 1,
DITHER_DOMAIN_MODE_BUTT
} dither_domain_mode;
typedef enum {
DITHER_TAP_MODE_7 = 0,
DITHER_TAP_MODE_15 = 1,
DITHER_TAP_MODE_23 = 2,
DITHER_TAP_MODE_31 = 3,
DITHER_TAP_MODE_BUTT
} dither_tap_mode;
typedef struct {
gk_u32 dither_in_bit_width;
gk_u32 dither_out_bit_width;
} vo_dither_info;
typedef enum {
DITHER_IO_MODE_12_10 = 1,
DITHER_IO_MODE_12_8 = 2,
DITHER_IO_MODE_10_8 = 3,
DITHER_IO_MODE_10_6 = 4,
DITHER_IO_MODE_9_6 = 5,
DITHER_IO_MODE_8_6 = 6,
DITHER_IO_MODE_10_9_6 = 5,
DITHER_IO_MODE_10_8_6 = 6,
DITHER_IO_MODE_BUTT
} vo_dither_io_mode;
typedef struct {
gk_u32 dither_en;
gk_u32 dither_mode;
gk_u32 dither_round;
gk_u32 dither_round_unlim;
gk_u32 i_data_width_dither;
gk_u32 o_data_width_dither;
gk_u32 dither_domain_mode;
gk_u32 dither_tap_mode;
gk_u32 dither_sed_y0;
gk_u32 dither_sed_u0;
gk_u32 dither_sed_v0;
gk_u32 dither_sed_w0;
gk_u32 dither_sed_y1;
gk_u32 dither_sed_u1;
gk_u32 dither_sed_v1;
gk_u32 dither_sed_w1;
gk_u32 dither_sed_y2;
gk_u32 dither_sed_u2;
gk_u32 dither_sed_v2;
gk_u32 dither_sed_w2;
gk_u32 dither_sed_y3;
gk_u32 dither_sed_u3;
gk_u32 dither_sed_v3;
gk_u32 dither_sed_w3;
gk_u32 dither_thr_max;
gk_u32 dither_thr_min;
vo_dither_io_mode dither_io_mode;
} vdp_dither_cfg;
typedef struct {
gk_u16 bi_size;
gk_u32 bi_width;
gk_s32 bi_height;
gk_u16 bi_planes;
gk_u16 bi_bit_count;
gk_u32 bi_compression;
gk_u32 bi_size_image;
gk_u32 bi_x_pels_per_meter;
gk_u32 bi_y_pels_per_meter;
gk_u32 bi_clr_used;
gk_u32 bi_clr_important;
} osd_bitmap_info_header;
typedef struct {
gk_u8 rgb_blue;
gk_u8 rgb_green;
gk_u8 rgb_red;
gk_u8 rgb_reserved;
} osd_rgb_quad;
typedef struct {
gk_u32 bf_size;
gk_u16 bf_reserved1;
gk_u16 bf_reserved2;
gk_u32 bf_off_bits;
} osd_bitmap_file_header;
typedef struct {
osd_bitmap_info_header bmi_header;
osd_rgb_quad bmi_colors[1];
} osd_bitmap_info;
typedef struct {
gk_u32 width; /* out */
gk_u32 height; /* out */
gk_u32 stride; /* in */
gk_phys_addr_t rgb_buffer; /* in */
} osd_logo_t;
typedef enum {
OSD_BI_BIT_COUNT_1BPP = 1,
OSD_BI_BIT_COUNT_4BPP = 4,
OSD_BI_BIT_COUNT_8BPP = 8,
OSD_BI_BIT_COUNT_16BPP = 16,
OSD_BI_BIT_COUNT_24BPP = 24,
OSD_BI_BIT_COUNT_32BPP = 32,
} osd_bi_bit_count;
gk_void vo_drv_board_init(gk_void);
gk_void vo_drv_int_reg_up_mode(vo_hal_layer vo_layer, vo_int_mode int_mode);
gk_void vo_drv_set_dev_intf_type(vo_hal_dev vo_dev, vo_intf_type intf_type);
gk_void vo_drv_set_dev_bk_grd(vo_hal_dev vo_dev, gk_u32 bg_color);
gk_void vo_drv_set_dev_out_sync(vo_hal_dev vo_dev, vo_intf_sync vo_out_mode);
gk_void vo_drv_dev_int_enable(vo_hal_dev vo_dev, gk_bool enable);
gk_void vo_drv_int_set_mode(vo_hal_dev vo_dev, vo_int_mode int_mode);
gk_void vo_drv_layer_enable(vo_hal_layer vo_layer, gk_bool enable);
gk_void vo_drv_set_all_crg_clk(gk_bool clk_en);
gk_u32 vo_drv_get_dev_intf_type(vo_hal_dev vo_dev);
gk_void vo_drv_open(vo_hal_dev vo_dev);
gk_void vo_drv_close(vo_hal_dev vo_dev);
gk_void vo_drv_default_setting(gk_void);
gk_void vo_drv_set_dev_clk(vo_hal_dev vo_dev);
gk_void vo_vid_set_zme_enable(gk_u32 layer, const vdp_vid_ip_cfg *vid_cfg);
gk_s32 graphic_drv_set_csc_coef(hal_disp_layer gfx_layer, const vo_csc *gfx_csc, const csc_coef_param *coef_param);
gk_s32 vo_drv_video_set_csc_coef(vo_hal_layer vo_layer, vo_csc_matrix csc_matrix);
gk_s32 load_bmp(gk_phys_addr_t bmp_addr, osd_logo_t *video_logo);
gk_void vo_drv_def_layer_bind_dev(gk_void);
#ifdef __cplusplus
}
#endif /* end of #ifdef __cplusplus */
#endif /* end of __VOU_DRV_H__ */