Files

1913 lines
93 KiB
C

#include <string.h>
#include <common.h>
#include <bootretry.h>
#include <cli.h>
#include <command.h>
#include <console.h>
#include <dm.h>
#include <edid.h>
#include <errno.h>
#include <i2c.h>
#include <malloc.h>
#include <asm/byteorder.h>
#include <linux/compiler.h>
#include <u-boot/crc.h>
#include "hal_vo.h"
#include "drv_vo.h"
#define VO_DEV_MAX_FRMRATE 240
#define VO_VTTH_WATERLINE 240
#define VO_VTTH_WATERLINE2 2
#define VO_CSC_DEFAULT_VAL 50
#define VO_CSC_MAX_LUMA 100
#define VO_CSC_MIN_LUMA 0
#define VO_CSC_MAX_CONT 100
#define VO_CSC_MIN_CONT 0
#define VO_CSC_MAX_HUE 100
#define VO_CSC_MIN_HUE 0
#define VO_CSC_MAX_SAT 100
#define VO_CSC_MIN_SAT 0
#define RGB(r, g, b) ((((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff))
#define RGB_R(c) (((c) & 0xff0000) >> 16)
#define RGB_G(c) (((c) & 0xff00) >> 8)
#define RGB_B(c) ((c) & 0xff)
#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 YUV_8BIT(y, u, v) ((((y) & 0xff) << 16) | (((u) & 0xff) << 8) | ((v) & 0xff))
#define YUV_8BIT_Y(c) (((c) & 0xff0000) >> 16)
#define YUV_8BIT_U(c) (((c) & 0xff00) >> 8)
#define YUV_8BIT_V(c) ((c) & 0xff)
typedef enum {
VO_DEV_VTT_MODE_VTT0 = 0,
VO_DEV_VTT_MODE_VTT1,
VO_DEV_VTT_MODE_VTT2,
VO_DEV_VTT_MODE_VTT3,
VO_DEV_VTT_MODE_MAX
} vo_dev_vtt_mode;
typedef enum {
MICROTECH_MTF050_LCD_800X480 = 0,
SATOZ_SAT935_MIPI_800X1280_RGB8888_24BIT,
SIL9024_BT1120_1920X1080P60,
MICROTECH_MTF101_FT01_LVDS_800X1280_RGB666_18BIT,
MICROTECH_MTF101_FS16_LVDS_1280X800_RGB888_24BIT,
C3200B_EVB_BT656_1280X720_UYVY422,
DEMO_LVDS_1920X720_RGB888_24BIT,
MIPI_TO_HDMI_1920X1080_RGB888_24BIT,
MTF024QV33B_SLCD_240X320_18BIT,
VIRTUAL_SCREEN_MIPI_3840X2160P30,
MIPI_TO_HDMI_3840X2160_RGB888_24BIT = 10,
HX_M090P24349A_LVDS_VESA_1920X384_RGB888_24BIT,
MCU_KD026_320X240P6_4LINE_RGB565,
MCU_KD035_320X480P6_3LINE_RGB666_OPTION1,
MCU_KD026_320X240P60_18BIT_18BPP_RGB666_8080I,
SIL9024_BT1120_1920X1080P30,
SIL9024_BT1120_1280X720P60,
SIL9024_BT656_1280X720P30_UYVY422,
SAMPLE_COMM_SCREEN_TYPE_INVALID,
} sample_comm_screen_type;
typedef struct {
xmedia_vo_intf_sync sync_index;
xmedia_char *name;
xmedia_u32 width;
xmedia_u32 height;
xmedia_u32 frame_rate;
} vo_dev_sync_basic_info;
typedef struct{
xmedia_vo_dev_config dev_config;
xmedia_vo_dev_csc dev_csc;
}sample_vo_config;
typedef struct {
xmedia_video_color_space color_space_in;
xmedia_video_color_gamut color_gamut_in;
xmedia_video_color_quantify_range quantify_range_in;
xmedia_video_color_space color_space_out;
xmedia_video_color_gamut color_gamut_out;
xmedia_video_color_quantify_range quantify_range_out;
vo_csc_type csc_type;
} vo_csc_info;
typedef struct {
xmedia_vo_dev_config dev_config;
xmedia_vo_dev_csc csc_info;
} vo_dev_user_info;
typedef struct {
xmedia_u32 max_width;
xmedia_u32 max_height;
xmedia_u32 full_frame_rate;
xmedia_u32 vtotal;
xmedia_u16 vtt0_line_num;
xmedia_u16 vtt3_line_num;
xmedia_vo_layer bind_layer;
xmedia_u32 clk_hz;
xmedia_bool phy_enable_state;
} vo_dev_info;
typedef struct {
xmedia_u8 config;
xmedia_u8 enable;
vo_dev_user_info user_info;
vo_dev_info dev_info;
} vo_dev_context;
typedef struct {
xmedia_bool video_csc_en;
xmedia_bool mix_csc_en;
vo_csc_type video_csc_type;
vo_csc_type mix_csc_type;
} vo_layer_csc_info;
typedef struct {
xmedia_bool layer_enable;
xmedia_bool multi_region_enable;
xmedia_video_pixel_format frame_pix_format;
vo_layer_csc_info csc_info;
union {
vo_layer_single_cfg single_cfg;
vo_layer_multi_cfg multi_cfg;
};
xmedia_bool gamma_enable;
} vo_layer_config_info;
vo_dts_lcd_config g_vo_dts_lcd_config[VO_DTS_LCD_TYPE_MAX];
vo_dev_context g_vo_dev[XMEDIA_VO_DEV_VIRT_0];
#ifdef CONFIG_MIPI_LCD_SUPPORT
static xmedia_u8 g_vo_mipi_lcd_array[] = {
6,0xff, 0x77, 0x01, 0x00, 0x00, 0x13,
2, 0xef, 0x08,
6, 0xff, 0x77, 0x01, 0x00, 0x00, 0x10,
0, 5,
3, 0xc0, 0x4f, 0x00,
0, 5,
3, 0xc1, 0x07, 0x08,
0, 5,
3, 0xc2, 0x01, 0x07,
0, 5,
2, 0xcc, 0x10,
17, 0xB0, 0x0F, 0x0A, 0x11, 0x0C, 0x10, 0x05, 0x00, 0x08, 0x03, 0x19, 0x04, 0x0F, 0x0D, 0xA6, 0x30, 0x18,
0, 5,
17, 0xB1, 0x0F, 0x0B, 0x11, 0x0D, 0x0F, 0x05, 0x02, 0x07, 0x0B, 0x26, 0x08, 0x19, 0x16, 0xAC, 0x30, 0x18,
0, 5,
6, 0xFF, 0x77, 0x01, 0x00, 0x00, 0x11,
0, 5,
2, 0xB0, 0x53,
0, 5,
2, 0xB1, 0x80,
0, 5,
2, 0xB2, 0x87,
0, 5,
2, 0xB3, 0x80,
0, 5,
2, 0xB5, 0x4A,
0, 5,
2, 0xB7, 0x85,
0, 5,
2, 0xB8, 0x30,
3, 0xb9, 0x10, 0x13,
2, 0xBB, 0x33,
2, 0xBC, 0x3E,
2, 0xC0, 0x0C,
0, 5,
2, 0xC1, 0x06,
0, 5,
2, 0xC2, 0x06,
0, 100,
2, 0xD0, 0x88,
4, 0xE0, 0x00, 0x00, 0x02,
0, 5,
12, 0xE1, 0x02, 0xA0, 0x00, 0x00, 0x01, 0xA0, 0x00, 0x00, 0x00, 0x44, 0x44,
0, 5,
14, 0xE2, 0x22, 0x22, 0x44, 0x44, 0x87, 0xA0, 0x00, 0x00, 0x86, 0xA0, 0x00, 0x00, 0x00,
0, 5,
5, 0xE, 0x00, 0x00, 0x22, 0x22,
0, 5,
3, 0xE4, 0x44, 0x44,
0, 5,
17, 0xE5, 0x04, 0x84, 0xA0, 0xA0, 0x06, 0x86, 0xA0, 0xA0, 0x08, 0x88, 0xA0, 0xA0, 0x0A, 0x8A, 0xA0, 0xA0,
0, 5,
5, 0xE6, 0x00, 0x00, 0x22, 0x22,
0, 5,
3, 0xE7, 0x44, 0x44,
0, 5,
17, 0xE8, 0x03, 0x83, 0xA0, 0xA0, 0x05, 0x85, 0xA0, 0xA0, 0x07, 0x87, 0xA0, 0xA0, 0x09, 0x89, 0xA0, 0xA0,
0, 5,
8, 0xEB, 0x00, 0x00, 0xE4, 0xE4, 0x88, 0x00, 0x40,
0, 5,
3, 0xEC, 0x3C, 0x01,
0, 5,
17, 0xED, 0xAB, 0x89, 0x76, 0x54, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x45, 0x67, 0x98, 0xBA,
7, 0xEF, 0x08, 0x08, 0x08, 0x40, 0x3F, 0x54,
6, 0xff, 0x77, 0x01, 0x00, 0x00, 0x13,
3, 0xe6, 0x16, 0x7c,
3, 0xe8, 0x00, 0x0E,
6, 0xff, 0x77, 0x01, 0x00, 0x00, 0x00,
2, 0x11, 0x00,
0, 120,
6, 0xff, 0x77, 0x01, 0x00, 0x00, 0x13,
3, 0xe8, 0x00, 0x0C,
0, 10,
3, 0xe8, 0x00, 0x00,
6, 0xff, 0x77, 0x01, 0x00, 0x00, 0x00,
2, 0x36, 0x00,
2, 0x29, 0x00,
0, 20,
};
#endif
#ifdef CONFIG_MCU_LCD_SUPPORT
static xmedia_u8 g_vo_mcu_lcd_array[] = {
5, 0xc8, 0x03, 0xff, 0x93, 0x42,
3, 0x36, 0x01, 0x08,
3, 0x3a, 0x01, 0x55,
4, 0xc0, 0x02, 0x0c, 0x06,
3, 0xc1, 0x01, 0x20,
3, 0xc5, 0x01, 0xe7,
4, 0xb1, 0x02, 0x00, 0x1b,
3, 0xb4, 0x01, 0x02,
4, 0xb6, 0x02, 0x0a, 0xe0,
17, 0xe0, 0x0f, 0x00, 0x04, 0x09, 0x05, 0x13, 0x09, 0x35, 0x69, 0x46, 0x04, 0x0c, 0x09, 0x15, 0x16, 0x0f,
17, 0xe1, 0x0f, 0x00, 0x1f, 0x20, 0x03, 0x0f, 0x05, 0x38, 0x55, 0x4c, 0x04, 0x0e, 0x0b, 0x37, 0x37, 0x0f,
6, 0x2a, 0x04, 0x00, 0x00, 0x01, 0x3f,
6, 0x2b, 0x04, 0x00, 0x00, 0x00, 0xef,
1, 0x11,
0, 200,
1, 0x29,
};
#endif
const vo_dev_sync_basic_info g_vo_sync_basic_info[XMEDIA_VO_INTF_SYNC_MAX] = {
{ XMEDIA_VO_INTF_SYNC_PAL, "PAL", 720, 576, 25 },
{ XMEDIA_VO_INTF_SYNC_NTSC, "NTSC", 720, 480, 30 },
{ XMEDIA_VO_INTF_SYNC_1080P24, "1080P@24", 1920, 1080, 24 },
{ XMEDIA_VO_INTF_SYNC_1080P25, "1080P@25", 1920, 1080, 25 },
{ XMEDIA_VO_INTF_SYNC_1080P30, "1080P@30", 1920, 1080, 30 },
{ XMEDIA_VO_INTF_SYNC_720P50, "720P@50", 1280, 720, 50 },
{ XMEDIA_VO_INTF_SYNC_720P60, "720P@60", 1280, 720, 60 },
{ XMEDIA_VO_INTF_SYNC_1080I50, "1080I50", 1920, 1080, 25 },
{ XMEDIA_VO_INTF_SYNC_1080I60, "1080I60", 1920, 1080, 30 },
{ XMEDIA_VO_INTF_SYNC_1080P50, "1080P@50", 1920, 1080, 50 },
{ XMEDIA_VO_INTF_SYNC_1080P60, "1080P@60", 1920, 1080, 60 },
{ XMEDIA_VO_INTF_SYNC_576P50, "576p@50", 720, 576, 50 },
{ XMEDIA_VO_INTF_SYNC_480P60, "480p@60", 720, 480, 60 },
{ XMEDIA_VO_INTF_SYNC_800x600_60, "800x600@60", 800, 600, 60 },
{ XMEDIA_VO_INTF_SYNC_1024x768_60, "1024x768@60", 1024, 768, 60 },
{ XMEDIA_VO_INTF_SYNC_1280x1024_60, "1280x1024@60", 1280, 1024, 60 },
{ XMEDIA_VO_INTF_SYNC_1366x768_60, "1366x768@60", 1366, 768, 60 },
{ XMEDIA_VO_INTF_SYNC_1440x900_60, "1440x900@60", 1440, 900, 60 },
{ XMEDIA_VO_INTF_SYNC_1280x800_60, "1280x800@60", 1280, 800, 60 },
{ XMEDIA_VO_INTF_SYNC_1600x1200_60, "1600x1200@60", 1600, 1200, 60 },
{ XMEDIA_VO_INTF_SYNC_1680x1050_60, "1680x1050@60", 1680, 1050, 60 },
{ XMEDIA_VO_INTF_SYNC_1920x1200_60, "1920x1200@60", 1920, 1200, 60 },
{ XMEDIA_VO_INTF_SYNC_640x480_60, "640x480@60", 640, 480, 60 },
{ XMEDIA_VO_INTF_SYNC_960H_PAL, "960H_PAL", 960, 576, 25 },
{ XMEDIA_VO_INTF_SYNC_960H_NTSC, "960H_NTSC", 960, 480, 30 },
{ XMEDIA_VO_INTF_SYNC_1920x2160_30, "1920x2160@30", 1920, 2160, 30 },
{ XMEDIA_VO_INTF_SYNC_2560x1440_30, "2560x1440@30", 2560, 1440, 30 },
{ XMEDIA_VO_INTF_SYNC_2560x1440_60, "2560x1440@60", 2560, 1440, 60 },
{ XMEDIA_VO_INTF_SYNC_2560x1600_60, "2560x1600@60", 2560, 1600, 60 },
{ XMEDIA_VO_INTF_SYNC_3840x2160_24, "3840x2160@24", 3840, 2160, 24 },
{ XMEDIA_VO_INTF_SYNC_3840x2160_25, "3840x2160@25", 3840, 2160, 25 },
{ XMEDIA_VO_INTF_SYNC_3840x2160_30, "3840x2160@30", 3840, 2160, 30 },
{ XMEDIA_VO_INTF_SYNC_3840x2160_50, "3840x2160@50", 3840, 2160, 50 },
{ XMEDIA_VO_INTF_SYNC_3840x2160_60, "3840x2160@60", 3840, 2160, 60 },
{ XMEDIA_VO_INTF_SYNC_4096x2160_24, "4096x2160@24", 4096, 2160, 24 },
{ XMEDIA_VO_INTF_SYNC_4096x2160_25, "4096x2160@25", 4096, 2160, 25 },
{ XMEDIA_VO_INTF_SYNC_4096x2160_30, "4096x2160@30", 4096, 2160, 30 },
{ XMEDIA_VO_INTF_SYNC_4096x2160_50, "4096x2160@50", 4096, 2160, 50 },
{ XMEDIA_VO_INTF_SYNC_4096x2160_60, "4096x2160@60", 4096, 2160, 60 },
{ XMEDIA_VO_INTF_SYNC_320x240_60, "320x240@60", 320, 240, 60 },
{ XMEDIA_VO_INTF_SYNC_320x240_50, "320x240@50", 320, 240, 50 },
{ XMEDIA_VO_INTF_SYNC_240x320_50, "240x320@50", 240, 320, 50 },
{ XMEDIA_VO_INTF_SYNC_240x320_60, "240x320@60", 240, 320, 60 },
{ XMEDIA_VO_INTF_SYNC_800x600_50, "800x600@50", 800, 600, 50 },
{ XMEDIA_VO_INTF_SYNC_800x480_50, "800x480@50", 800, 480, 50 },
{ XMEDIA_VO_INTF_SYNC_720x1280_60, "720x1280@60", 720, 1280, 60 },
{ XMEDIA_VO_INTF_SYNC_1080x1920_60, "1080x1920@60", 1080, 1920, 60 },
{ XMEDIA_VO_INTF_SYNC_7680x4320_30, "7680x4320@30", 7680, 4320, 30 },
{ XMEDIA_VO_INTF_SYNC_USER, "USER", 0, 0, 0 },
};
//固定时序可以用一下timing配置,用户自定义时序使用user_sync_config中保存的timing配置
xmedia_vo_user_sync_timing g_sync_timing[XMEDIA_VO_INTF_SYNC_MAX] = {
/* |--INTFACE---||-----TOP-----||----HORIZON------||--BOTTOM---||-PULSE-||-INVERSE-| */
/* Vact, Vbb, Vfb, Hact, Hbb, Hfb, Hmid,Bvact,Bvbb, Bvfb, Hpw, Vpw,Idv, Ihs, Ivs, Synm, Iop, Itf, */
{288, 22, 2, 720, 132, 12, 1, 288, 23, 2, 126, 3, 0, 0, 0 , 0, 0, 0}, /* 576I(PAL) */
{240, 18, 4, 720, 119, 19, 1, 240, 19, 4, 124, 3, 0, 0, 0 , 0, 0, 0}, /* 480I(NTSC) */
{1080, 41, 4, 1920, 192, 638, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1}, /* 1080P@24Hz */
{1080, 41, 4, 1920, 192, 528, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1}, /* 1080P@25Hz */
{1080, 41, 4, 1920, 192, 88, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1}, /* 1080P@30Hz */
{720, 25, 5, 1280, 260, 440, 1, 1, 1, 1, 40, 5, 0, 0, 0, 0, 1, 1}, /* 720P@50Hz */
{720, 25, 5, 1280, 260, 110, 1, 1, 1, 1, 40, 5, 0, 0, 0, 0, 1, 1}, /* 720P@60Hz */
{540, 20, 2, 1920, 192, 528, 1128, 540, 21, 2, 44, 5, 0, 0, 0, 0, 0, 1}, /* 1080I@50Hz */
{540, 20, 2, 1920, 192, 88, 908, 540, 21, 2, 44, 5, 0, 0, 0, 0, 0, 1}, /* 1080I@60Hz */
{1080, 41, 4, 1920, 192, 528, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1}, /* 1080P@50Hz */
{1080, 41, 4, 1920, 192, 88, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1}, /* 1080P@60Hz */
{576, 44, 5, 720, 132, 12, 1, 1, 1, 1, 64, 5, 0, 0, 0, 1, 1, 1}, /* 576P@50Hz */
{480, 36, 9, 720, 122, 16, 1, 1, 1, 1, 62, 6, 0, 0, 0, 1, 1, 1}, /* 480P@60Hz */
{600, 27, 1, 800, 216, 40, 1, 1, 1, 1, 128, 4, 0, 0, 0, 1, 1, 2}, /* 800*600@60Hz VGA@60Hz */
{768, 35, 3, 1024, 296, 24, 1, 1, 1, 1, 136, 6, 0, 1, 1, 1, 1, 2}, /* 1024x768@60Hz */
{1024, 41, 1, 1280, 360, 48, 1, 1, 1, 1, 112, 3, 0, 0, 0, 1, 1, 2}, /* 1280x1024@60Hz */
{768, 27, 3, 1366, 356, 70, 1, 1, 1, 1, 143, 3, 0, 0, 0, 1, 1, 2}, /* 1366x768@60Hz */
{900, 31, 3, 1440, 384, 80, 1, 1, 1, 1, 152, 6, 0, 1, 0, 1, 1, 2}, /* 1440x900@60Hz */
{800, 28, 3, 1280, 328, 72, 1, 1, 1, 1, 128, 6, 0, 1, 0, 1, 1, 2}, /* 1280*800@60Hz VGA@60Hz */
{1200, 49, 1, 1600, 496, 64, 1, 1, 1, 1, 192, 3, 0, 0, 0, 1, 1, 2}, /* 1600*1200@60Hz */
{1050, 36, 3, 1680, 456, 104, 1, 1, 1, 1, 176, 6, 0, 1, 0, 1, 1, 2}, /* 1680*1050@60Hz */
{1200, 32, 3, 1920, 112, 48, 1, 1, 1, 1, 32, 6, 0, 0, 1, 1, 1, 2}, /* 1920*1200@60Hz CVT (Reduced Blanking) */
{480, 35, 10, 640, 144, 16, 1, 1, 1, 1, 96, 2, 0, 1, 1, 1, 1, 2}, /* 640*480@60Hz CVT */
{288, 22, 2, 960, 176, 16, 1, 288, 23, 2, 168, 3, 0, 0, 0, 0, 0, 0}, /* 960H(PAL) */
{240, 18, 4, 960, 163, 21, 1, 240, 19, 4, 168, 3, 0, 0, 0, 0, 0, 0}, /* 960H(NTSC) */
{2160, 72, 8, 1920, 192, 88, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1}, /* 1920*2160@30Hz */
{1440, 39, 2, 2560, 112, 48, 1, 1, 1, 1, 32, 5, 0, 0, 0, 1, 1, 2}, /* 2560*1440@30Hz */
{1440, 39, 2, 2560, 112, 48, 1, 1, 1, 1, 32, 5, 0, 0, 0, 1, 1, 2}, /* 2560*1440@60Hz */
{1600, 43, 3, 2560, 112, 48, 1, 1, 1, 1, 32, 6, 0, 0, 1, 0, 1, 2}, /* 2560*1600@60Hz CVT (Reduced Blanking) */
{2160, 82, 8, 3840, 384, 1276, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 3840*2160@24Hz */
{2160, 82, 8, 3840, 384, 1056, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 3840*2160@25Hz */
{2160, 82, 8, 3840, 384, 176, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 3840*2160@30Hz */
{2160, 82, 8, 3840, 384, 1056, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 3840*2160@50Hz */
{2160, 82, 8, 3840, 384, 176, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 3840*2160@60Hz */
{2160, 82, 8, 4096, 384, 1020, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 4096x2160@24 */
{2160, 82, 8, 4096, 216, 968, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 4096x2160@25 */
{2160, 82, 8, 4096, 216, 88, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 4096x2160@30 */
{2160, 82, 8, 4096, 216, 968, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 4096x2160@50 */
{2160, 82, 8, 4096, 216, 88, 1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1}, /* 4096x2160@60 */
{240, 15, 9, 320, 65, 7, 1, 240, 14, 9, 1, 1, 0, 0, 0, 0, 1, 1}, /* 320X240@60 8bit LCD */
{240, 2, 2, 320, 5, 10, 1, 1, 1, 1, 10, 1, 0, 0, 0, 0, 1, 1}, /* 320X240@50 6bit LCD */
{320, 10, 4, 240, 30, 10, 1, 1, 1, 1, 10, 2, 0, 0, 0, 0, 1, 1}, /* 240X320@50 6bit LCD */
{320, 2, 2, 240, 20, 10, 1, 1, 1, 1, 2, 1, 0, 0, 0, 0, 1, 1}, /* 240X320@60 16bit LCD */
{600, 23, 12, 800, 210, 46, 1, 1, 1, 1, 2, 1, 0, 0, 0, 0, 1, 1}, /* 800X600@60 24bit LCD */
{480, 23, 12, 800, 210, 46, 1, 1, 1, 1, 2, 1, 0, 0, 0, 0, 1, 1}, /* 800X480@60 24bit LCD */
{1280, 24, 8, 720, 123, 99, 1, 1, 1, 1, 24, 4, 0, 0, 0, 0, 1, 1}, /* For MIPI DSI Tx 720 x1280 at 60 Hz */
{1920, 36, 16, 1080, 28, 130, 1, 1, 1, 1, 8, 10, 0, 0, 0, 0, 1, 1}, /* For MIPI DSI Tx 1080 x1920 at 60 Hz */
{4320, 64, 16, 7680, 768, 552, 1, 1, 1, 1, 176, 20, 0, 0, 0, 0, 1, 1}, /* 7680x4320@30 */
{} /* User */
};
xmedia_vo_user_sync_timing sample_screen_user_sync_timing[SAMPLE_COMM_SCREEN_TYPE_INVALID] = {
{480, 23, 12, 800, 210, 46, 1, 1, 1, 1, 2, 1, 0, 0, 0, 0, 1, 1},
{1280, 24, 20, 800, 40, 40, 1, 1, 1, 1, 20, 4, 0, 0, 0, 0, 1, 1},
{1080, 41, 4, 1920, 192, 88, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1},
{1280, 25, 16, 800, 88, 72, 1, 1, 1, 1, 24, 4, 0, 0, 0, 0, 1, 1},
{800, 23, 15, 1280, 88, 72, 1, 1, 1, 1, 24, 2, 0, 0, 0, 0, 1, 1},
{720, 25, 5, 1280, 260, 110,1, 1, 1, 1, 40, 5, 0, 0, 0, 0, 1, 1},
{720, 45, 22, 1920, 136, 40, 1, 1, 1, 1, 20, 20, 0, 0, 0, 0, 1, 1},
{1080, 41, 4, 1920, 192, 88, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1},
{320, 8, 8, 240, 14, 15, 1, 1, 1, 1, 4, 2, 0, 0, 0, 0, 1, 1},
{2160, 0, 0, 3840, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2160, 82, 8, 3840, 384, 176,1, 1, 1, 1, 88, 10, 0, 0, 0, 0, 1, 1},
{384, 8, 8, 1920, 27, 27, 1, 1, 1, 1, 13, 4, 1, 1, 1, 0, 1, 1},
{240, 8, 8, 320, 130, 38, 1, 1, 1, 1, 2, 1, 0, 0, 0, 0, 1, 1},
{480, 4, 8, 320, 8, 38, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1},
{240, 8, 8, 320, 293, 38, 1, 1, 1, 1, 2, 1, 0, 0, 0, 0, 1, 1},
{1080, 41, 4, 1920, 192, 88, 1, 1, 1, 1, 44, 5, 0, 0, 0, 0, 1, 1},
{720, 25, 5, 1280, 260, 110,1, 1, 1, 1, 40, 5, 0, 0, 0, 0, 1, 1},
{720, 25, 5, 1280, 260, 110,1, 1, 1, 1, 40, 5, 0, 0, 0, 0, 1, 1},
};
#ifdef xmorca
static vo_csc_info g_color_to_csc_type[VO_CSC_MAX] = {
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_709_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_709_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_709_FULL2LIMIT },
};
#endif
#ifdef xmfalcon
static vo_csc_info g_color_to_csc_type[VO_CSC_MAX] = {
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_2020_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_709_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_2020_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2RGB_2020_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2RGB_2020_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2YUV_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2YUV_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2YUV_2020_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2YUV_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2YUV_709_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2YUV_2020_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2YUV_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2YUV_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2YUV_2020_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2YUV_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2YUV_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2YUV_2020_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_2020_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_2020_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_2020_601_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_2020_709_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_2020_2020_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_2020_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_2020_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_2020_601_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_2020_709_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_2020_2020_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_601_2020_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_709_2020_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_2020_601_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_2020_709_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_YUV2YUV_2020_2020_LIMIT2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_709_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_601_2020_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_709_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_709_2020_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_2020_601_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT709, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_2020_709_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_YUV, XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_YUV,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_YUV2YUV_2020_2020_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2RGB_LIMIT2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2RGB_FULL2FULL },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, VO_CSC_RGB2RGB_FULL2LIMIT },
{ XMEDIA_VIDEO_COLOR_SPACE_RGB, XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_LIMITED_RANGE, XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_GAMUT_BT601, XMEDIA_VIDEO_COLOR_FULL_RANGE, VO_CSC_RGB2RGB_LIMIT2FULL }
};
#endif
vo_dev_context *drv_vo_get_dev_context(xmedia_vo_dev dev)
{
return &(g_vo_dev[dev]);
}
static xmedia_s32 vo_check_intf_mux(xmedia_vo_dev dev, xmedia_vo_dev_config *config)
{
xmedia_vo_dev i;
vo_dev_context *dev_ctx;
/*
* 同一intf_type不能被两个dev使用通过以下循环保证
* 只有一个intf_type成员,而且dev enbale时不能set dev config,所以可以保证同一dev不会设置使能两个intf_type
*/
for(i = 0; i < XMEDIA_VO_DEV_VIRT_0; i++) {
//如果此intf_type已经被其他dev绑定,且这个dev已经被config则报错
dev_ctx = drv_vo_get_dev_context(i);
if ((i != dev) &&
(dev_ctx->config == XMEDIA_TRUE) &&
(dev_ctx->user_info.dev_config.intf_config.intf_type == config->intf_config.intf_type)) {
VO_TRACE(MODULE_DBG_ERR," intf_type:%d has been used by dev:%d!\n", config->intf_config.intf_type, i);
return XMEDIA_FAILURE;
}
}
return XMEDIA_SUCCESS;
}
static xmedia_s32 vo_check_dev_config(xmedia_vo_dev dev, xmedia_vo_dev_config *dev_config)
{
xmedia_s32 ret;
xmedia_video_size dev_size;
if (dev_config->bg_color > 0xFFFFFF) {
printf("dev %d check device's bgcolor %d illegal!\n", dev, dev_config->bg_color);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if ((dev_config->intf_sync >= XMEDIA_VO_INTF_SYNC_PAL) && (dev_config->intf_sync < XMEDIA_VO_INTF_SYNC_USER)) {
if (g_vo_sync_basic_info[dev_config->intf_sync].sync_index == dev_config->intf_sync) {
dev_size.width = g_vo_sync_basic_info[dev_config->intf_sync].width;
dev_size.height = g_vo_sync_basic_info[dev_config->intf_sync].height;
} else {
return XMEDIA_ERRCODE_INVALID_PARAM;
}
} else if (dev_config->intf_sync == XMEDIA_VO_INTF_SYNC_USER) {
dev_size.width = dev_config->user_sync_config.timing_info.hact;
dev_size.height = (dev_config->user_sync_config.timing_info.iop) ?
dev_config->user_sync_config.timing_info.vact : dev_config->user_sync_config.timing_info.vact * 2;
} else {
return XMEDIA_ERRCODE_INVALID_PARAM;
}
ret = hal_vo_check_dev_intf(dev, dev_config, &dev_size);
if (ret != XMEDIA_SUCCESS) {
return ret;
}
//检测当前接口状态是否可以被设置,一个设备只能绑定一个接口,一个接口只能被一个设备绑定
if (vo_check_intf_mux(dev, dev_config) != XMEDIA_SUCCESS) {
return XMEDIA_ERRCODE_NOT_SUPPORT;
}
return XMEDIA_SUCCESS;
}
static xmedia_s32 vo_check_dev_user_sync(xmedia_vo_dev dev, xmedia_u32 frame_rate,
xmedia_vo_user_sync_timing *sync_timing)
{
if (frame_rate <= 0 || frame_rate > VO_DEV_MAX_FRMRATE) {
VO_TRACE(MODULE_DBG_ERR,"dev %d frame_rate should be (0, 240] which is %u!\n", dev, frame_rate);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
//虚拟设备只需要校验vact hact
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
if ((sync_timing->hact == 0) || (sync_timing->vact < 100)) {
VO_TRACE(MODULE_DBG_ERR,"error\n");
return XMEDIA_ERRCODE_INVALID_PARAM;
} else {
return XMEDIA_SUCCESS;
}
}
if ((sync_timing->hact == 0) || (sync_timing->hbb == 0) || (sync_timing->hfb == 0)) {
VO_TRACE(MODULE_DBG_ERR,"Usr SyncTime Hact(%u) Hbb(%u) Hfb(%u) can't be 0!\n", sync_timing->hact,
sync_timing->hbb, sync_timing->hfb);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if ((sync_timing->vact < 100) || (sync_timing->vbb == 0) || (sync_timing->vfb == 0)) {
VO_TRACE(MODULE_DBG_ERR,"Usr SyncTime Vact(%u) can't be smaller than 100 and Vbb(%u) Vfb(%u) can't be 0!\n",
sync_timing->vact, sync_timing->vbb, sync_timing->vfb);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if ((sync_timing->hpw == 0) || (sync_timing->vpw == 0)) {
VO_TRACE(MODULE_DBG_ERR,"Usr SyncTime Hpw(%u) Vpw(%u) can't be 0!\n", sync_timing->hpw, sync_timing->vpw);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if ((sync_timing->iop == 0) &&
((sync_timing->bvact == 0) || (sync_timing->bvbb == 0) || (sync_timing->bvfb == 0))) {
VO_TRACE(MODULE_DBG_ERR,"Usr SyncTime bvact(%u) bvbb(%u) bvfb(%u) can't be 0 when interlaced timing !\n",
sync_timing->bvact, sync_timing->bvbb, sync_timing->bvfb);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
return XMEDIA_SUCCESS;
}
static xmedia_void vo_set_dev_max_size(xmedia_vo_dev dev, xmedia_vo_intf_sync sync_mode,
xmedia_vo_user_sync_timing *sync_timing)
{
xmedia_u32 max_width;
xmedia_u32 max_height;
vo_dev_context *dev_ctx = XMEDIA_NULL;
vo_dev_cap *dev_cap = XMEDIA_NULL;
dev_ctx = drv_vo_get_dev_context(dev);
dev_cap = hal_get_dev_chip_capacity(dev);
if (sync_mode >= XMEDIA_VO_INTF_SYNC_PAL && sync_mode < XMEDIA_VO_INTF_SYNC_USER) {
if (g_vo_sync_basic_info[sync_mode].sync_index == sync_mode) {
max_width = g_vo_sync_basic_info[sync_mode].width;
max_height = g_vo_sync_basic_info[sync_mode].height;
} else {
max_width = dev_cap->max_size.width;
max_height = dev_cap->max_size.height;
}
} else if (sync_mode == XMEDIA_VO_INTF_SYNC_USER) {
max_width = sync_timing->hact;
max_height = (sync_timing->iop) ? sync_timing->vact : sync_timing->vact * 2;
} else {
max_width = dev_cap->max_size.width;
max_height = dev_cap->max_size.height;
}
dev_ctx->dev_info.max_width = max_width;
dev_ctx->dev_info.max_height = max_height;
return;
}
static xmedia_s32 vo_get_fix_clock(xmedia_vo_intf_sync intf_sync, xmedia_u64 *vo_clk)
{
switch(intf_sync) {
case XMEDIA_VO_INTF_SYNC_576P50:
case XMEDIA_VO_INTF_SYNC_480P60:
case XMEDIA_VO_INTF_SYNC_PAL:
case XMEDIA_VO_INTF_SYNC_NTSC:
// 27MHz
*vo_clk = 27000000;
break;
case XMEDIA_VO_INTF_SYNC_1080P24:
case XMEDIA_VO_INTF_SYNC_1080P25:
case XMEDIA_VO_INTF_SYNC_1080P30:
case XMEDIA_VO_INTF_SYNC_720P50:
case XMEDIA_VO_INTF_SYNC_720P60:
case XMEDIA_VO_INTF_SYNC_1080I50:
case XMEDIA_VO_INTF_SYNC_1080I60:
case XMEDIA_VO_INTF_SYNC_720x1280_60:
// 74.25MHz
*vo_clk = 74250000;
break;
case XMEDIA_VO_INTF_SYNC_1080P50:
case XMEDIA_VO_INTF_SYNC_1080P60:
case XMEDIA_VO_INTF_SYNC_1920x2160_30:
case XMEDIA_VO_INTF_SYNC_1080x1920_60:
//148.5MHz
*vo_clk = 148500000;
break;
case XMEDIA_VO_INTF_SYNC_3840x2160_30:
case XMEDIA_VO_INTF_SYNC_3840x2160_25:
case XMEDIA_VO_INTF_SYNC_3840x2160_24:
// 297MHz
*vo_clk = 297000000;
break;
default:
VO_TRACE(MODULE_DBG_DEBUG, "not match normal Hz! Use LCD or PLL Hz!\n");
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
static xmedia_u64 vo_calculate_hz(xmedia_vo_user_sync_timing sync_timing, xmedia_u32 frame_rate)
{
return (sync_timing.hact + sync_timing.hbb + sync_timing.hfb) *
(sync_timing.vact + sync_timing.vbb + sync_timing.vfb) * frame_rate;
}
static xmedia_s32 vo_set_dev_clk(xmedia_vo_dev dev, vo_dev_context *dev_ctx)
{
xmedia_u64 vo_clk;
xmedia_s32 ret;
xmedia_u32 cyc_pre_pixel;
//虚拟设备不需要设置时钟
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
return XMEDIA_SUCCESS;
}
cyc_pre_pixel = hal_vo_get_cyc_pre_pixel(&dev_ctx->user_info.dev_config.intf_config);
ret = vo_get_fix_clock(dev_ctx->user_info.dev_config.intf_sync, &vo_clk);
if (ret != XMEDIA_SUCCESS) {
if (dev_ctx->user_info.dev_config.intf_sync == XMEDIA_VO_INTF_SYNC_USER) {
vo_clk = vo_calculate_hz(dev_ctx->user_info.dev_config.user_sync_config.timing_info,
dev_ctx->user_info.dev_config.user_sync_config.frame_rate);
} else {
vo_clk = vo_calculate_hz(g_sync_timing[dev_ctx->user_info.dev_config.intf_sync],
g_vo_sync_basic_info[dev_ctx->user_info.dev_config.intf_sync].frame_rate);
}
}
vo_clk = vo_clk * cyc_pre_pixel;
if (hal_vo_check_clk(dev, &(dev_ctx->user_info.dev_config), vo_clk) != XMEDIA_SUCCESS) {
return XMEDIA_ERRCODE_NOT_SUPPORT;
}
dev_ctx->dev_info.clk_hz = vo_clk;
return XMEDIA_SUCCESS;
}
static xmedia_s32 vo_check_dev_csc(xmedia_s32 dev, const xmedia_vo_dev_csc *dev_csc)
{
if (dev_csc->mode >= XMEDIA_VO_DEV_MODE_MAX) {
VO_TRACE(MODULE_DBG_ERR,"Vo dev(%d) mode:%d!\n", dev, dev_csc->mode);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if ((dev_csc->color_info.color_space >= XMEDIA_VIDEO_COLOR_SPACE_MAX) ||
(dev_csc->color_info.color_gamut >= XMEDIA_VIDEO_COLOR_GAMUT_MAX) ||
(dev_csc->color_info.quantify_range >= XMEDIA_VIDEO_COLOR_RANGE_MAX)) {
VO_TRACE(MODULE_DBG_ERR,"Vo dev(%d) color_space:%d, color_gamut:%d, quantify_range:%d!\n", dev,
dev_csc->color_info.color_space, dev_csc->color_info.color_gamut, dev_csc->color_info.quantify_range );
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if (dev_csc->luma > VO_CSC_MAX_LUMA) {
VO_TRACE(MODULE_DBG_ERR,"Vo dev(%d) CSC contrast value %d out of range!\n", dev, dev_csc->luma);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if (dev_csc->contrast > VO_CSC_MAX_CONT) {
VO_TRACE(MODULE_DBG_ERR,"Vo dev(%d) CSC hue value %d out of range!\n", dev, dev_csc->contrast);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if (dev_csc->hue > VO_CSC_MAX_HUE) {
VO_TRACE(MODULE_DBG_ERR,"Vo dev(%d) CSC luma value %d out of range!\n", dev, dev_csc->hue);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if (dev_csc->saturation > VO_CSC_MAX_SAT) {
VO_TRACE(MODULE_DBG_ERR,"Vo dev(%d) CSC satuature value %d out of range!\n", dev, dev_csc->saturation);
return XMEDIA_ERRCODE_INVALID_PARAM;
}
return XMEDIA_SUCCESS;
}
static xmedia_u8 vo_get_dev_enable_status(xmedia_vo_dev dev)
{
xmedia_vo_dev dev_index;
xmedia_u8 status = XMEDIA_FALSE;
vo_dev_context *dev_ctx = XMEDIA_NULL;
if (dev == XMEDIA_VO_DEV_MAX) {
for(dev_index = XMEDIA_VO_DEV_0; dev_index < XMEDIA_VO_DEV_MAX; dev_index++) {
dev_ctx = drv_vo_get_dev_context(dev_index);
status |= dev_ctx->enable;
}
} else {
if ((dev < XMEDIA_VO_DEV_0) || (dev > XMEDIA_VO_DEV_MAX)) {
status = XMEDIA_FALSE;
} else {
dev_ctx = drv_vo_get_dev_context(dev);
status = dev_ctx->enable;
}
}
return status;
}
static xmedia_void vo_set_crg_clock_enable(xmedia_vo_dev dev, xmedia_bool clk_en)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
return;
}
dev_ctx = drv_vo_get_dev_context(dev);
hal_vo_set_crg_clock_enable(dev, dev_ctx->user_info.dev_config.intf_config.intf_type, clk_en);
return;
}
static xmedia_s32 set_crg_clock_reset(xmedia_void)
{
xmedia_u32 delay_num = 0;
xmedia_vo_dev dev_index;
vo_dev_context *dev_ctx = XMEDIA_NULL;
//接口时钟通道清除
for(dev_index = XMEDIA_VO_DEV_0; dev_index < XMEDIA_VO_DEV_VIRT_0; dev_index++) {
dev_ctx = drv_vo_get_dev_context(dev_index);
hal_vo_set_crg_intf_detach_dev(dev_index, dev_ctx->user_info.dev_config.intf_config.intf_type);
}
udelay(5);
hal_vo_set_crg_clock_reset(XMEDIA_TRUE);
while(1) {
udelay(1);
delay_num++;
//获取复位状态
if (hal_vo_get_crg_clock_reset_state() == XMEDIA_TRUE) {
break;
}
//获取复位状态失败,最多尝试100次
if (delay_num == 100) {
VO_TRACE(MODULE_DBG_ERR,"clock reset err!\n");
hal_vo_set_crg_clock_reset(XMEDIA_FALSE);
return XMEDIA_ERRCODE_NOT_READY;
}
}
//撤销复位
hal_vo_set_crg_clock_reset(XMEDIA_FALSE);
if (hal_vo_get_crg_clock_reset_state() == XMEDIA_FALSE) {
//撤销复位成功
return XMEDIA_SUCCESS;
}else {
//撤销复位失败
VO_TRACE(MODULE_DBG_ERR,"clock backout reset err!\n");
return XMEDIA_ERRCODE_NOT_READY;
}
}
static xmedia_s32 vo_dev_clock_en(xmedia_vo_dev dev)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
xmedia_s32 ret = XMEDIA_SUCCESS;
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
return XMEDIA_SUCCESS;
}
dev_ctx = drv_vo_get_dev_context(dev);
ret = hal_vo_set_crg_clock(dev, dev_ctx->dev_info.clk_hz,
dev_ctx->user_info.dev_config.user_sync_config.clk_reverse_en,
dev_ctx->user_info.dev_config.intf_config.intf_type);
if (ret != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR,"dev %d hal_vo_set_crg_clock error! \n", dev);
return ret;
}
vo_set_crg_clock_enable(dev, XMEDIA_TRUE);
//判定所有dev都为false状态才去复位时钟
if (vo_get_dev_enable_status(XMEDIA_VO_DEV_MAX) == XMEDIA_FALSE) {
if (set_crg_clock_reset() == XMEDIA_FAILURE) {
VO_TRACE(MODULE_DBG_ERR,"dev %d clock reset err!\n",dev);
return XMEDIA_ERRCODE_NOT_READY;
}
}
return XMEDIA_SUCCESS;
}
xmedia_s32 vo_dev_enable_intf_phy(xmedia_vo_dev dev)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
xmedia_s32 ret;
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
return XMEDIA_SUCCESS;
}
dev_ctx = drv_vo_get_dev_context(dev);
if (dev_ctx->dev_info.phy_enable_state == XMEDIA_TRUE) {
VO_TRACE(MODULE_DBG_ERR,"dev phy is already enable!\n");
return XMEDIA_SUCCESS;
}
if(dev_ctx->user_info.dev_config.intf_sync == XMEDIA_VO_INTF_SYNC_USER) {
ret =hal_vo_enable_dev_phy_cfg(dev, dev_ctx->dev_info.clk_hz,
dev_ctx->user_info.dev_config.user_sync_config.frame_rate,
&(dev_ctx->user_info.dev_config.user_sync_config.timing_info),
dev_ctx->user_info.dev_config.intf_config.intf_type);
} else {
ret = hal_vo_enable_dev_phy_cfg(dev, dev_ctx->dev_info.clk_hz,
g_vo_sync_basic_info[dev_ctx->user_info.dev_config.intf_sync].frame_rate,
&g_sync_timing[dev_ctx->user_info.dev_config.intf_sync],
dev_ctx->user_info.dev_config.intf_config.intf_type);
}
if (ret != XMEDIA_SUCCESS) {
return ret;
}
dev_ctx->dev_info.phy_enable_state = XMEDIA_TRUE;
return ret;
}
xmedia_void vo_dev_disable_intf_phy(xmedia_vo_dev dev)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
return;
}
dev_ctx = drv_vo_get_dev_context(dev);
if (dev_ctx->dev_info.phy_enable_state == XMEDIA_FALSE) {
VO_TRACE(MODULE_DBG_ERR,"dev phy is already disable!\n");
return;
}
hal_vo_disable_dev_phy_cfg(dev_ctx->user_info.dev_config.intf_config.intf_type);
dev_ctx->dev_info.phy_enable_state = XMEDIA_FALSE;
return;
}
static xmedia_void rgb_to_yc_8bit(xmedia_u8 r, xmedia_u8 g, xmedia_u8 b, xmedia_u8 *py, xmedia_u8 *pcb, xmedia_u8 *pcr)
{
*py = (xmedia_u8)(((r * 66 + g * 129 + b * 25) >> 8) + 16);
*pcb = (xmedia_u8)((((b * 112 - r * 38) - g * 74) >> 8) + 128);
*pcr = (xmedia_u8)((((r * 112 - g * 94) - b * 18) >> 8) + 128);
}
static xmedia_u32 rgb_to_yuv_8bit(xmedia_u32 rgb)
{
xmedia_u8 y,u,v;
rgb_to_yc_8bit(RGB_R(rgb), RGB_G(rgb), RGB_B(rgb), &y, &u, &v);
return YUV_8BIT(y,u,v);
}
static void vo_enable_dev_csc(xmedia_vo_dev dev, xmedia_video_color_space color_space)
{
vo_pic_info pic_info;
if (color_space == XMEDIA_VIDEO_COLOR_SPACE_YUV) {
pic_info.csc_type = VO_CSC_YUV2YUV_709_709_FULL2FULL;
} else if (color_space == XMEDIA_VIDEO_COLOR_SPACE_RGB) {
pic_info.csc_type = VO_CSC_YUV2RGB_709_FULL2FULL;
} else {
VO_TRACE(MODULE_DBG_ERR, "vo_set_default_csc error !\n");
return ;
}
pic_info.luma = VO_CSC_DEFAULT_VAL;
pic_info.contrast = VO_CSC_DEFAULT_VAL;
pic_info.hue = VO_CSC_DEFAULT_VAL;
pic_info.saturation = VO_CSC_DEFAULT_VAL;
if (hal_vo_set_dev_csc_coef(dev, &pic_info) == XMEDIA_SUCCESS) {
hal_vo_set_dev_csc_en(dev, XMEDIA_TRUE);
} else {
VO_TRACE(MODULE_DBG_ERR, "vo_set_default_csc error !\n");
return ;
}
return ;
}
static xmedia_void vo_set_dev_interrupt_enable(xmedia_vo_dev dev, xmedia_bool enable)
{
vo_isr_interrupt_type int_type = VO_ISR_INTERRUPT_TYPE;
if (dev == XMEDIA_VO_DEV_0 ) {
int_type = VO_ISR_INTERRUPT_TYPE_DHD0_VTT0 | VO_ISR_INTERRUPT_TYPE_DHD0_VTT3;
} else if (dev == XMEDIA_VO_DEV_1) {
int_type = VO_ISR_INTERRUPT_TYPE_DHD1_VTT0 | VO_ISR_INTERRUPT_TYPE_DHD1_VTT3;
} else {
int_type = VO_ISR_INTERRUPT_TYPE;
}
hal_vo_set_interrupt_enable(int_type, enable);
return;
}
static xmedia_void vo_dev_config(xmedia_vo_dev dev, xmedia_bool resume_en)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
vo_intf_timing timing_info;
xmedia_u32 bg_color;
dev_ctx = drv_vo_get_dev_context(dev);
#ifdef xmfalcon
//7605 cbm背景色 只会因layer csc改变,目前图形视频cbm约定是yuv域,所以不需要随intf csc属性而改变
bg_color = rgb_to_yuv_8bit(dev_ctx->user_info.dev_config.bg_color);
#endif
#ifdef xmorca
//7206 cbm背景色 色彩空间 需要根据端子变化
if (dev_ctx->user_info.csc_info.color_info.color_space == XMEDIA_VIDEO_COLOR_SPACE_YUV) {
bg_color = rgb_to_yuv_8bit(dev_ctx->user_info.dev_config.bg_color);
} else {
bg_color = dev_ctx->user_info.dev_config.bg_color;
}
#endif
hal_vo_set_dev_bgcolor(dev, bg_color);
//由于有可能存在单独图形层显示或者视频层已使能但没送帧的情况,所以需要设置dev csc,否则在rgb端子上显示会有问题
vo_enable_dev_csc(dev, dev_ctx->user_info.csc_info.color_info.color_space);
//sync_timing
timing_info.intf_sync = dev_ctx->user_info.dev_config.intf_sync;
if (dev_ctx->user_info.dev_config.intf_sync != XMEDIA_VO_INTF_SYNC_USER) {
timing_info.sync_timing = g_sync_timing[timing_info.intf_sync];
} else {
timing_info.sync_timing = dev_ctx->user_info.dev_config.user_sync_config.timing_info;
}
hal_vo_set_dev_intf_timing(dev, dev_ctx->dev_info.full_frame_rate,
&(dev_ctx->user_info.dev_config.intf_config), &timing_info.sync_timing);
//设置中断模式为帧中断,有效区计数
hal_vo_set_int_mode(dev, VO_DEV_VTT_MODE_VTT0, VO_ISR_FIELD_FLAG_FRAME);
hal_vo_set_int_mode(dev, VO_DEV_VTT_MODE_VTT3, VO_ISR_FIELD_FLAG_FRAME);
dev_ctx->dev_info.vtt0_line_num = timing_info.sync_timing.vact / 2;
hal_vo_set_dev_thd(dev, VO_DEV_VTT_MODE_VTT0, dev_ctx->dev_info.vtt0_line_num);
dev_ctx->dev_info.vtt3_line_num = timing_info.sync_timing.vact;
hal_vo_set_dev_thd(dev, VO_DEV_VTT_MODE_VTT3, dev_ctx->dev_info.vtt3_line_num);
//打开中断
hal_vo_clean_interrupt_state(VO_INT_STATE_TYPE_MASK, VO_ISR_INTERRUPT_TYPE_ALL);
vo_set_dev_interrupt_enable(dev, XMEDIA_TRUE);
//视频图形zorder
hal_vo_set_dev_mixer_prio(dev, VO_MIX_PRIO_GFX);
//动态时钟门控使能
hal_vo_set_clock_gate_enable(XMEDIA_TRUE);
hal_vo_set_layer_regup_enable(dev_ctx->dev_info.bind_layer, XMEDIA_TRUE);
hal_vo_set_top_regup_enable(XMEDIA_TRUE);
hal_vo_set_dev_intf_enable(dev, XMEDIA_TRUE);
hal_vo_set_dev_intf_regup_enable(dev, XMEDIA_TRUE);
return;
}
static xmedia_void vo_dev_clear_config(xmedia_vo_dev dev)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
vo_isr_interrupt_type int_type = VO_ISR_INTERRUPT_TYPE;
dev_ctx = drv_vo_get_dev_context(dev);
hal_vo_set_dev_intf_enable(dev, XMEDIA_FALSE);
//清除中断的状态
if (dev == XMEDIA_VO_DEV_0) {
int_type = VO_ISR_INTERRUPT_TYPE_DHD0_VTT0 | VO_ISR_INTERRUPT_TYPE_DHD0_VTT3;
} else if (dev == XMEDIA_VO_DEV_1) {
int_type = VO_ISR_INTERRUPT_TYPE_DHD1_VTT0 | VO_ISR_INTERRUPT_TYPE_DHD1_VTT3;
}
hal_vo_clean_interrupt_state(VO_INT_STATE_TYPE_MASK, int_type);
hal_vo_set_dev_thd(dev, VO_DEV_VTT_MODE_VTT0, VO_VTTH_WATERLINE);
hal_vo_set_dev_thd(dev, VO_DEV_VTT_MODE_VTT3, VO_VTTH_WATERLINE2);
vo_set_dev_interrupt_enable(dev, XMEDIA_FALSE);
hal_vo_set_top_regup_enable(XMEDIA_TRUE);
hal_vo_set_layer_regup_enable(dev_ctx->dev_info.bind_layer, XMEDIA_TRUE);
hal_vo_set_dev_intf_regup_enable(dev, XMEDIA_TRUE);
return;
}
static xmedia_void vo_dev_wait_intf_regup(xmedia_vo_dev dev)
{
xmedia_s32 i = 0;
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
return ;
}
/*
* 等设备关闭往后执行,否则会因为时钟直接关闭,会有残留和闪烁现象
* 超时定为50ms,一般输出时序都会大于20f/s
*/
while (hal_vo_get_dev_intf_regup_state(dev) != 0){
udelay(1000);
i++;
if (1 >= 50) {
VO_TRACE(MODULE_DBG_ERR,"dev %d wait intf regup time beyond 50ms\n", dev);
break;
}
}
return;
}
static xmedia_void vo_isr_set_single_cfg(xmedia_vo_layer layer, vo_layer_config_info *config_info)
{
hal_vo_set_layer_pixel_format(layer, config_info->frame_pix_format);
hal_vo_set_layer_multi_enable(layer, XMEDIA_FALSE);
hal_vo_set_layer_single_region_cfg(layer, &(config_info->single_cfg));
return;
}
xmedia_s32 drv_vo_get_dev_csc(xmedia_vo_dev dev, xmedia_vo_dev_csc *dev_csc)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
CHECK_VO_DEV_ID_RETURN(dev);
CHECK_VO_PTR_RETURN(dev_csc);
dev_ctx = drv_vo_get_dev_context(dev);
memcpy(dev_csc, &dev_ctx->user_info.csc_info, sizeof(xmedia_vo_dev_csc));
return XMEDIA_SUCCESS;
}
static xmedia_void vo_isr_set_csc(xmedia_vo_dev dev, vo_layer_config_info *config_info)
{
xmedia_vo_dev_csc dev_csc;
vo_pic_info pic_info = {0};
xmedia_vo_layer layer;
layer = (xmedia_vo_layer)dev;
pic_info.luma = VO_CSC_DEFAULT_VAL;
pic_info.contrast = VO_CSC_DEFAULT_VAL;
pic_info.hue = VO_CSC_DEFAULT_VAL;
pic_info.saturation = VO_CSC_DEFAULT_VAL;
drv_vo_get_dev_csc(dev, &dev_csc);
#ifdef xmorca
//7206 需要在video csc调整效果
pic_info.contrast = dev_csc.contrast;
pic_info.hue = dev_csc.hue;
pic_info.luma = dev_csc.luma;
pic_info.saturation = dev_csc.saturation;
#endif
//video csc 亮度色度饱和度对比度使用50
pic_info.csc_type = config_info->csc_info.video_csc_type;
if (hal_vo_set_layer_csc_coef(dev, &pic_info) == XMEDIA_SUCCESS) {
hal_vo_set_layer_csc_en(layer, config_info->csc_info.video_csc_en);
} else {
hal_vo_set_layer_csc_en(layer, XMEDIA_FALSE);
}
//mix csc 才使用用户下发的参数
#ifdef xmfalcon
pic_info.contrast = dev_csc.contrast;
pic_info.hue = dev_csc.hue;
pic_info.luma = dev_csc.luma;
pic_info.saturation = dev_csc.saturation;
pic_info.csc_type = config_info->csc_info.mix_csc_type;
if (hal_vo_set_dev_csc_coef(dev, &pic_info) == XMEDIA_SUCCESS) {
hal_vo_set_dev_csc_en(dev, config_info->csc_info.mix_csc_en);
} else {
hal_vo_set_dev_csc_en(dev, XMEDIA_FALSE);
}
#endif
return;
}
static vo_csc_type vo_get_csc_type(xmedia_video_color_descript *in, xmedia_video_color_descript *out)
{
vo_csc_type i = 0;
for (i = 0; i < VO_CSC_MAX; i++) {
if ((in->color_space == g_color_to_csc_type[i].color_space_in) &&
(in->quantify_range == g_color_to_csc_type[i].quantify_range_in) &&
(out->color_space == g_color_to_csc_type[i].color_space_out) &&
(out->quantify_range == g_color_to_csc_type[i].quantify_range_out)) {
//如果in out是RGB域,则不需要匹配gamut, 只有yuv域才需要匹配gamut
if ((in->color_space == XMEDIA_VIDEO_COLOR_SPACE_RGB) && (out->color_space == XMEDIA_VIDEO_COLOR_SPACE_RGB)) {
return i;
} else if ((in->color_space == XMEDIA_VIDEO_COLOR_SPACE_RGB) && (out->color_space == XMEDIA_VIDEO_COLOR_SPACE_YUV)) {
if (out->color_gamut == g_color_to_csc_type[i].color_gamut_out) {
return i;
}
} else if ((in->color_space == XMEDIA_VIDEO_COLOR_SPACE_YUV) && (out->color_space == XMEDIA_VIDEO_COLOR_SPACE_RGB)) {
if (in->color_gamut == g_color_to_csc_type[i].color_gamut_in) {
return i;
}
} else {
if ((in->color_gamut == g_color_to_csc_type[i].color_gamut_in) &&
(out->color_gamut == g_color_to_csc_type[i].color_gamut_out)) {
return i;
}
}
}
}
return VO_CSC_MAX;
}
static xmedia_void vo_cal_csc_info(xmedia_vo_layer layer, xmedia_video_color_descript *frame_color_info,
vo_layer_csc_info *csc_info)
{
xmedia_vo_dev_csc dev_csc;
xmedia_vo_dev dev = layer;
vo_csc_type video_csc_type = VO_CSC_MAX;
vo_csc_type mix_csc_type = VO_CSC_MAX;
#ifdef xmfalcon
xmedia_video_color_descript temp_color_info;
#endif
drv_vo_get_dev_csc(dev, &dev_csc);
#ifdef xmfalcon
//7605 统一在yuv域叠加
temp_color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_YUV;
temp_color_info.color_gamut = XMEDIA_VIDEO_COLOR_GAMUT_BT709;
temp_color_info.quantify_range = XMEDIA_VIDEO_COLOR_FULL_RANGE;
video_csc_type = vo_get_csc_type(frame_color_info, &temp_color_info);
mix_csc_type = vo_get_csc_type(&temp_color_info, &dev_csc.color_info);
#endif
#ifdef xmorca
video_csc_type = vo_get_csc_type(frame_color_info, &dev_csc.color_info);
mix_csc_type = VO_CSC_MAX;
#endif
if (video_csc_type == VO_CSC_MAX) {
VO_TRACE(MODULE_DBG_ERR,"layer %d can not find the video csc_type,color_space : %d color_gamut %d quantify_range %d!\n",
layer, frame_color_info->color_space, frame_color_info->color_gamut, frame_color_info->quantify_range);
csc_info->video_csc_en = XMEDIA_FALSE;
} else {
csc_info->video_csc_en = XMEDIA_TRUE;
csc_info->video_csc_type = video_csc_type;
}
if (mix_csc_type == VO_CSC_MAX) {
VO_TRACE(MODULE_DBG_DEBUG,"layer %d can not find the mix csc_type,color_space : %d color_gamut %d quantify_range %d!\n",
layer, dev_csc.color_info.color_space, dev_csc.color_info.color_gamut, dev_csc.color_info.quantify_range);
csc_info->mix_csc_en = XMEDIA_FALSE;
} else {
csc_info->mix_csc_en = XMEDIA_TRUE;
csc_info->mix_csc_type = mix_csc_type;
}
VO_TRACE(MODULE_DBG_DEBUG,"layer:%d csc_en:[%d-%d-%d] video mod : %d mix mode: %d color_space %d \n",
layer, csc_info->mix_csc_en,csc_info->video_csc_en,
dev_csc.mode, csc_info->video_csc_type, csc_info->mix_csc_type,
dev_csc.color_info.color_space);
return;
}
static xmedia_void vo_set_layer_config_info(vo_layer_config_info *config_info, unsigned int layer, unsigned long addr,
unsigned int strd, xmedia_video_rect layer_rect)
{
xmedia_video_color_descript color_info;
color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_YUV;
color_info.color_gamut = XMEDIA_VIDEO_COLOR_GAMUT_BT709;
color_info.quantify_range = XMEDIA_VIDEO_COLOR_LIMITED_RANGE;
config_info->multi_region_enable = XMEDIA_FALSE;
config_info->layer_enable = XMEDIA_TRUE;
config_info->frame_pix_format = XMEDIA_VIDEO_PIXEL_FMT_YUV_SEMIPLANAR_420;
config_info->single_cfg.frame_rect.width = layer_rect.width;
config_info->single_cfg.frame_rect.height = layer_rect.height;
config_info->single_cfg.frame_addr.lum_addr = addr;
config_info->single_cfg.frame_addr.chm_addr = addr + layer_rect.height * strd;
config_info->single_cfg.frame_addr.lum_stride = strd;
config_info->single_cfg.frame_addr.chm_stride = strd;
config_info->single_cfg.video_rect.x = layer_rect.x;
config_info->single_cfg.video_rect.y = layer_rect.y;
config_info->single_cfg.video_rect.width = layer_rect.width;
config_info->single_cfg.video_rect.height = layer_rect.height;
config_info->single_cfg.lba_rect.x = layer_rect.x;
config_info->single_cfg.lba_rect.y = layer_rect.y;
config_info->single_cfg.lba_rect.width = layer_rect.width;
config_info->single_cfg.lba_rect.height = layer_rect.height;
config_info->single_cfg.lba_color = 0x0;
config_info->single_cfg.mute_en = XMEDIA_FALSE;
vo_cal_csc_info(layer, &(color_info), &(config_info->csc_info));
}
int check_vo_support(unsigned int dev, xmedia_s32 screen_type)
{
if ((dev < XMEDIA_VO_DEV_0) || (dev > XMEDIA_VO_DEV_1 )) {
return XMEDIA_FAILURE;
}
if (screen_type < MICROTECH_MTF050_LCD_800X480 && screen_type >= SAMPLE_COMM_SCREEN_TYPE_INVALID) {
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
static int vo_get_dts_cfg(vo_dts_lcd_type lcd_type)
{
int i;
int ret = 0;
unsigned char *lcd_param;
unsigned int lcd_param_size;
if (lcd_type == VO_DTS_LCD_TYPE_MCU) {
#ifdef CONFIG_MCU_LCD_SUPPORT
lcd_param_size = sizeof(g_vo_mcu_lcd_array) / sizeof(xmedia_u8);
lcd_param = g_vo_mcu_lcd_array;
#else
lcd_param_size = 0;
#endif
} else if (lcd_type == VO_DTS_LCD_TYPE_MIPI){
#ifdef CONFIG_MIPI_LCD_SUPPORT
lcd_param_size = sizeof(g_vo_mipi_lcd_array) / sizeof(xmedia_u8);
lcd_param = g_vo_mipi_lcd_array;
#else
lcd_param_size = 0;
#endif
} else {
lcd_param_size = 0;
VO_TRACE(MODULE_DBG_ERR, "lcd_type error %d\n", lcd_type);
}
g_vo_dts_lcd_config[lcd_type].size = lcd_param_size;
if (g_vo_dts_lcd_config[lcd_type].size <= 0) {
goto out;
}
g_vo_dts_lcd_config[lcd_type].array = (unsigned char *)vmalloc(sizeof(unsigned char) *
g_vo_dts_lcd_config[lcd_type].size);
if (!g_vo_dts_lcd_config[lcd_type].array) {
VO_TRACE(MODULE_DBG_ERR,"osal_vmalloc failded\n");
ret = -1;
goto out;
}
for (i = 0; i < g_vo_dts_lcd_config[lcd_type].size; i++) {
g_vo_dts_lcd_config[lcd_type].array[i] = lcd_param[i];
VO_TRACE(MODULE_DBG_DEBUG, "g_vo_dts_lcd_config[%d] is 0x%x\n", i,
g_vo_dts_lcd_config[lcd_type].array[i]);
}
out:
return ret;
}
static int vo_dts_init(void)
{
int i;
for(i = VO_DTS_LCD_TYPE_MIPI; i < VO_DTS_LCD_TYPE_MAX; i++) {
if(vo_get_dts_cfg(i) != 0) {
VO_TRACE(MODULE_DBG_ERR, "vo_get_dts_cfg error i %d\n", i);
goto ERROR;
}
}
return XMEDIA_SUCCESS;
ERROR:
for(i = VO_DTS_LCD_TYPE_MIPI; i < VO_DTS_LCD_TYPE_MAX; i++) {
if (g_vo_dts_lcd_config[i].array != NULL) {
osal_vfree(g_vo_dts_lcd_config[i].array);
g_vo_dts_lcd_config[i].array = NULL;
}
}
return XMEDIA_FAILURE;
}
static void vo_dts_deinit(void)
{
int i;
for(i = VO_DTS_LCD_TYPE_MIPI; i < VO_DTS_LCD_TYPE_MAX; i++) {
if (g_vo_dts_lcd_config[i].array != NULL) {
osal_vfree(g_vo_dts_lcd_config[i].array);
g_vo_dts_lcd_config[i].array = NULL;
}
}
}
xmedia_s32 drv_vo_set_dev_config(xmedia_vo_dev dev, xmedia_vo_dev_config *dev_config)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_u32 frame_rate;
vo_dev_cap *dev_cap = XMEDIA_NULL;
CHECK_VO_DEV_ID_RETURN(dev);
CHECK_VO_PTR_RETURN(dev_config);
dev_ctx = drv_vo_get_dev_context(dev);
ret = vo_check_dev_config(dev, dev_config);
if (ret != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR,"vo_check_dev_config error dev %d\n", dev);
return ret;
}
frame_rate = dev_config->user_sync_config.frame_rate;
if (dev_config->intf_sync == XMEDIA_VO_INTF_SYNC_USER) {
ret = vo_check_dev_user_sync(dev, frame_rate, &(dev_config->user_sync_config.timing_info));
if (ret != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR,"error\n");
return ret;
}
}
if (dev_config->intf_sync >= XMEDIA_VO_INTF_SYNC_PAL && dev_config->intf_sync < XMEDIA_VO_INTF_SYNC_USER) {
if (g_vo_sync_basic_info[dev_config->intf_sync].sync_index == dev_config->intf_sync) {
dev_ctx->dev_info.full_frame_rate = g_vo_sync_basic_info[dev_config->intf_sync].frame_rate;
} else {
dev_ctx->dev_info.full_frame_rate = dev_cap->max_frame_rate;
}
dev_ctx->dev_info.vtotal = g_sync_timing[dev_config->intf_sync].vact +
g_sync_timing[dev_config->intf_sync].vbb +
g_sync_timing[dev_config->intf_sync].vfb;
} else if (dev_config->intf_sync == XMEDIA_VO_INTF_SYNC_USER) {
dev_ctx->dev_info.full_frame_rate = frame_rate;
dev_ctx->dev_info.vtotal = dev_config->user_sync_config.timing_info.vact +
dev_config->user_sync_config.timing_info.vbb +
dev_config->user_sync_config.timing_info.vfb;
} else {
}
vo_set_dev_max_size(dev, dev_config->intf_sync, &(dev_config->user_sync_config.timing_info));
memcpy(&(dev_ctx->user_info.dev_config), dev_config, sizeof(xmedia_vo_dev_config));
if(vo_set_dev_clk(dev, dev_ctx) != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR,"dev %d vo_set_dev_clk err\n", dev);
return XMEDIA_ERRCODE_NOT_PERMITTED;
}
if (VO_CHECK_VIRT_DEV(dev) != XMEDIA_TRUE) {
if (vo_calc_dev_phy_clk_cfg(dev, dev_ctx->dev_info.clk_hz, &dev_ctx->user_info.dev_config.intf_config) !=
XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR,"error\n");
return XMEDIA_ERRCODE_NOT_SUPPORT;
}
}
dev_ctx->config = XMEDIA_TRUE;
return XMEDIA_SUCCESS;
}
xmedia_s32 drv_vo_set_dev_csc(xmedia_vo_dev dev, xmedia_vo_dev_csc *dev_csc)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
xmedia_s32 ret;
CHECK_VO_DEV_ID_RETURN(dev);
CHECK_VO_PTR_RETURN(dev_csc);
dev_ctx = drv_vo_get_dev_context(dev);
if (VO_CHECK_VIRT_DEV(dev) == XMEDIA_TRUE) {
return XMEDIA_SUCCESS;
}
ret = vo_check_dev_csc(dev, dev_csc);
if (ret != XMEDIA_SUCCESS) {
return ret;
}
ret = hal_vo_check_dev_csc_cap(dev, &(dev_ctx->user_info.dev_config.intf_config), dev_csc);
if (ret != XMEDIA_SUCCESS) {
return ret;
}
memcpy(&dev_ctx->user_info.csc_info, dev_csc,sizeof(xmedia_vo_dev_csc));
return XMEDIA_SUCCESS;
}
xmedia_s32 drv_vo_disable_dev(xmedia_vo_dev dev)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
CHECK_VO_DEV_ID_RETURN(dev);
dev_ctx = drv_vo_get_dev_context(dev);
if (dev_ctx->enable == XMEDIA_FALSE) {
//仍然清config标识,只要调用disable dev,就需要重配dev config
dev_ctx->config = XMEDIA_FALSE;
return XMEDIA_SUCCESS;
}
vo_dev_clear_config(dev);
dev_ctx->config = XMEDIA_FALSE;
dev_ctx->enable = XMEDIA_FALSE;
vo_dev_wait_intf_regup(dev);
vo_dev_disable_intf_phy(dev);
//判定所有dev都为false状态才去复位时钟,并且当前dev为非虚拟设备
if ((vo_get_dev_enable_status(XMEDIA_VO_DEV_MAX) == XMEDIA_FALSE) && (VO_CHECK_VIRT_DEV(dev) != XMEDIA_TRUE)) {
if (set_crg_clock_reset() == XMEDIA_FAILURE) {
VO_TRACE(MODULE_DBG_ERR,"dev %d clock reset err!\n",dev);
return XMEDIA_ERRCODE_NOT_READY;
}
}
//时钟关闭只关 对应通道&接口&分频器相关的时钟
vo_set_crg_clock_enable(dev, XMEDIA_FALSE);
return XMEDIA_SUCCESS;
}
xmedia_s32 drv_vo_enable_dev(xmedia_vo_dev dev)
{
vo_dev_context *dev_ctx = XMEDIA_NULL;
xmedia_s32 ret = XMEDIA_SUCCESS;
CHECK_VO_DEV_ID_RETURN(dev);
dev_ctx = drv_vo_get_dev_context(dev);
if (dev_ctx->config != XMEDIA_TRUE) {
VO_TRACE(MODULE_DBG_ERR,"dev %d doesn't configured!\n", dev);
return XMEDIA_ERRCODE_NOT_READY;
}
if (dev_ctx->enable == XMEDIA_TRUE) {
VO_TRACE(MODULE_DBG_ERR,"dev %d has enabled! not permitted to enable again\n", dev);
return XMEDIA_ERRCODE_NOT_PERMITTED;
}
ret = vo_dev_clock_en(dev);
if (ret != XMEDIA_SUCCESS) {
return ret;
}
ret = vo_dev_enable_intf_phy(dev);
if (ret != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR,"dev %d vo dev enable phy fail!\n",dev);
return ret;
}
vo_dev_config(dev, XMEDIA_FALSE);
dev_ctx->enable = XMEDIA_TRUE;
return XMEDIA_SUCCESS;
}
xmedia_s32 sample_vo_get_dev_config(xmedia_s32 screen_type, sample_vo_config *vo_config)
{
vo_config->dev_config.bg_color = 0x0;
switch(screen_type) {
case MICROTECH_MTF050_LCD_800X480:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_LCD;
vo_config->dev_config.intf_config.lcd_attr.data_mode = XMEDIA_VO_LCD_DATA_MODE_PARA;
vo_config->dev_config.intf_config.lcd_attr.data_seq = XMEDIA_INTF_LCD_DATA_SEQ_RGB;
vo_config->dev_config.intf_config.lcd_attr.data_type = XMEDIA_INTF_LCD_DATA_TYPE_RGB888_24BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case SATOZ_SAT935_MIPI_800X1280_RGB8888_24BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_MIPI_DSI;
vo_config->dev_config.intf_config.mipi_attr.data_type = XMEDIA_INTF_MIPI_DSI_DATA_TYPE_RGB888_24BIT;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[0] = XMEDIA_VO_MIPI_LANE_DATA0;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[1] = XMEDIA_VO_MIPI_LANE_DATA1;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[2] = XMEDIA_VO_MIPI_LANE_CLK;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[3] = XMEDIA_VO_MIPI_LANE_DATA2;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[4] = XMEDIA_VO_MIPI_LANE_DATA3;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[0] = 0;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[1] = 0;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[2] = 0;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[3] = 0;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[4] = 0;
vo_config->dev_config.intf_config.mipi_attr.mipi_htotal_adjust = 0;
vo_config->dev_config.intf_config.mipi_attr.mipi_vsync_adjust = 0;
vo_config->dev_config.intf_config.mipi_attr.mipi_lane_num = XMEDIA_VO_MIPI_LANE_NUM4;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case SIL9024_BT1120_1920X1080P60:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_BT1120;
vo_config->dev_config.intf_config.bt1120_attr.data_seq = XMEDIA_INTF_BT1120_DATA_SEQ_UVUV;
vo_config->dev_config.intf_config.bt1120_attr.data_type = XMEDIA_INTF_BT_DATA_TYPE_YUV422_8BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_YUV;
vo_config->dev_config.user_sync_config.clk_reverse_en = 1;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MICROTECH_MTF101_FT01_LVDS_800X1280_RGB666_18BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_LVDS;
vo_config->dev_config.intf_config.lvds_attr.format = XMEDIA_INTF_LVDS_FORMAT_VESA;
vo_config->dev_config.intf_config.lvds_attr.data_type = XMEDIA_INTF_LVDS_DATA_TYPE_RGB666_18BIT;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[0] = XMEDIA_VO_LVDS_LANE_DATA0;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[1] = XMEDIA_VO_LVDS_LANE_DATA1;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[2] = XMEDIA_VO_LVDS_LANE_DATA2;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[3] = XMEDIA_VO_LVDS_LANE_CLK;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[4] = XMEDIA_VO_LVDS_LANE_DATA3;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[0] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[1] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[2] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[3] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[4] = 0;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MICROTECH_MTF101_FS16_LVDS_1280X800_RGB888_24BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_LVDS;
vo_config->dev_config.intf_config.lvds_attr.format = XMEDIA_INTF_LVDS_FORMAT_VESA;
vo_config->dev_config.intf_config.lvds_attr.data_type = XMEDIA_INTF_LVDS_DATA_TYPE_RGB888_24BIT;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[0] = XMEDIA_VO_LVDS_LANE_DATA0;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[1] = XMEDIA_VO_LVDS_LANE_DATA1;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[2] = XMEDIA_VO_LVDS_LANE_DATA2;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[3] = XMEDIA_VO_LVDS_LANE_CLK;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[4] = XMEDIA_VO_LVDS_LANE_DATA3;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[0] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[1] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[2] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[3] = 0;
vo_config->dev_config.intf_config.lvds_attr.lane_pn_swap[4] = 0;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case C3200B_EVB_BT656_1280X720_UYVY422:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_BT656;
vo_config->dev_config.intf_config.bt656_attr.data_seq = XMEDIA_INTF_BT601_BT656_DATA_SEQ_UYVY;
vo_config->dev_config.intf_config.bt656_attr.data_type = XMEDIA_INTF_BT_DATA_TYPE_YUV422_8BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_YUV;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case DEMO_LVDS_1920X720_RGB888_24BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_LVDS;
vo_config->dev_config.intf_config.lvds_attr.format = XMEDIA_INTF_LVDS_FORMAT_VESA;
vo_config->dev_config.intf_config.lvds_attr.data_type = XMEDIA_INTF_LVDS_DATA_TYPE_RGB888_24BIT;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[0] = XMEDIA_VO_LVDS_LANE_DATA0;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[1] = XMEDIA_VO_LVDS_LANE_DATA1;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[2] = XMEDIA_VO_LVDS_LANE_DATA2;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[3] = XMEDIA_VO_LVDS_LANE_DATA3;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[4] = XMEDIA_VO_LVDS_LANE_CLK;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MIPI_TO_HDMI_1920X1080_RGB888_24BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_MIPI_DSI;
vo_config->dev_config.intf_config.mipi_attr.data_type = XMEDIA_INTF_MIPI_DSI_DATA_TYPE_RGB888_24BIT;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[0] = XMEDIA_VO_MIPI_LANE_DATA3;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[1] = XMEDIA_VO_MIPI_LANE_DATA2;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[2] = XMEDIA_VO_MIPI_LANE_CLK;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[3] = XMEDIA_VO_MIPI_LANE_DATA1;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[4] = XMEDIA_VO_MIPI_LANE_DATA0;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[0] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[1] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[2] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[3] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[4] = 1;
vo_config->dev_config.intf_config.mipi_attr.mipi_htotal_adjust = 0;
vo_config->dev_config.intf_config.mipi_attr.mipi_vsync_adjust = 0;
vo_config->dev_config.intf_config.mipi_attr.mipi_lane_num = XMEDIA_VO_MIPI_LANE_NUM4;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MTF024QV33B_SLCD_240X320_18BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_LCD;
vo_config->dev_config.intf_config.lcd_attr.data_mode = XMEDIA_VO_LCD_DATA_MODE_SERIAL;
vo_config->dev_config.intf_config.lcd_attr.data_seq = XMEDIA_INTF_LCD_DATA_SEQ_RGB;
vo_config->dev_config.intf_config.lcd_attr.data_type = XMEDIA_INTF_LCD_DATA_TYPE_RGB666_18BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 1;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case VIRTUAL_SCREEN_MIPI_3840X2160P30:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_MIPI_DSI;
vo_config->dev_config.intf_config.mipi_attr.data_type = XMEDIA_INTF_MIPI_DSI_DATA_TYPE_RGB888_24BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 30;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MIPI_TO_HDMI_3840X2160_RGB888_24BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_MIPI_DSI;
vo_config->dev_config.intf_config.mipi_attr.data_type = XMEDIA_INTF_MIPI_DSI_DATA_TYPE_RGB888_24BIT;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[0] = XMEDIA_VO_MIPI_LANE_DATA3;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[1] = XMEDIA_VO_MIPI_LANE_DATA2;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[2] = XMEDIA_VO_MIPI_LANE_CLK;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[3] = XMEDIA_VO_MIPI_LANE_DATA1;
vo_config->dev_config.intf_config.mipi_attr.lane_sel[4] = XMEDIA_VO_MIPI_LANE_DATA0;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[0] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[1] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[2] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[3] = 1;
vo_config->dev_config.intf_config.mipi_attr.lane_pn_swap[4] = 1;
vo_config->dev_config.intf_config.mipi_attr.mipi_htotal_adjust = 0;
vo_config->dev_config.intf_config.mipi_attr.mipi_vsync_adjust = 0;
vo_config->dev_config.intf_config.mipi_attr.mipi_lane_num = XMEDIA_VO_MIPI_LANE_NUM4;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 0;
vo_config->dev_config.user_sync_config.frame_rate = 30;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case HX_M090P24349A_LVDS_VESA_1920X384_RGB888_24BIT:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_LVDS;
vo_config->dev_config.intf_config.lvds_attr.format = XMEDIA_INTF_LVDS_FORMAT_VESA;
vo_config->dev_config.intf_config.lvds_attr.data_type = XMEDIA_INTF_LVDS_DATA_TYPE_RGB888_24BIT;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[0] = XMEDIA_VO_LVDS_LANE_DATA0;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[1] = XMEDIA_VO_LVDS_LANE_DATA1;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[2] = XMEDIA_VO_LVDS_LANE_DATA2;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[3] = XMEDIA_VO_LVDS_LANE_DATA3;
vo_config->dev_config.intf_config.lvds_attr.lane_sel[4] = XMEDIA_VO_LVDS_LANE_CLK;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.clk_reverse_en = 1;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MCU_KD026_320X240P6_4LINE_RGB565:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_MCU;
vo_config->dev_config.intf_config.mcu_attr.te_mode_en = XMEDIA_FALSE;
vo_config->dev_config.intf_config.mcu_attr.data_type = XMEDIA_VO_MCU_DATA_TYPE_4LINE_RGB565;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.frame_rate = 10;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MCU_KD035_320X480P6_3LINE_RGB666_OPTION1:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_MCU;
vo_config->dev_config.intf_config.mcu_attr.te_mode_en = XMEDIA_FALSE;
vo_config->dev_config.intf_config.mcu_attr.data_type = XMEDIA_VO_MCU_DATA_TYPE_3LINE_RGB666_OPTION1;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.frame_rate = 6;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case MCU_KD026_320X240P60_18BIT_18BPP_RGB666_8080I:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_MCU;
vo_config->dev_config.intf_config.mcu_attr.te_mode_en = XMEDIA_FALSE;
vo_config->dev_config.intf_config.mcu_attr.data_type = XMEDIA_VO_MCU_DATA_TYPE_18BIT_18BPP_RGB666_8080I;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_RGB;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case SIL9024_BT1120_1920X1080P30:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_BT1120;
vo_config->dev_config.intf_config.bt1120_attr.data_seq = XMEDIA_INTF_BT1120_DATA_SEQ_UVUV;
vo_config->dev_config.intf_config.bt1120_attr.data_type = XMEDIA_INTF_BT_DATA_TYPE_YUV422_8BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_YUV;
vo_config->dev_config.user_sync_config.clk_reverse_en = 1;
vo_config->dev_config.user_sync_config.frame_rate = 30;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case SIL9024_BT1120_1280X720P60:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_BT1120;
vo_config->dev_config.intf_config.bt1120_attr.data_seq = XMEDIA_INTF_BT1120_DATA_SEQ_UVUV;
vo_config->dev_config.intf_config.bt1120_attr.data_type = XMEDIA_INTF_BT_DATA_TYPE_YUV422_8BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_YUV;
vo_config->dev_config.user_sync_config.clk_reverse_en = 1;
vo_config->dev_config.user_sync_config.frame_rate = 60;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
case SIL9024_BT656_1280X720P30_UYVY422:
vo_config->dev_config.intf_config.intf_type = XMEDIA_INTF_TYPE_BT656;
vo_config->dev_config.intf_config.bt656_attr.data_seq = XMEDIA_INTF_BT601_BT656_DATA_SEQ_UYVY;
vo_config->dev_config.intf_config.bt656_attr.data_type = XMEDIA_INTF_BT_DATA_TYPE_YUV422_8BIT;
vo_config->dev_csc.color_info.color_space = XMEDIA_VIDEO_COLOR_SPACE_YUV;
vo_config->dev_config.user_sync_config.clk_reverse_en = 1;
vo_config->dev_config.user_sync_config.frame_rate = 30;
vo_config->dev_config.intf_sync = XMEDIA_VO_INTF_SYNC_USER;
break;
default:
printf("screen_type err !\n");
return XMEDIA_FAILURE;
}
//csc info
vo_config->dev_csc.color_info.color_gamut = XMEDIA_VIDEO_COLOR_GAMUT_BT709;
vo_config->dev_csc.color_info.quantify_range = XMEDIA_VIDEO_COLOR_FULL_RANGE;
vo_config->dev_csc.mode = XMEDIA_VO_DEV_MODE_VIDEO_GRAPHIC;
vo_config->dev_csc.hue = 50;
vo_config->dev_csc.luma = 50;
vo_config->dev_csc.saturation = 50;
vo_config->dev_csc.contrast = 50;
memcpy(&vo_config->dev_config.user_sync_config.timing_info, &sample_screen_user_sync_timing[screen_type],
sizeof(xmedia_vo_user_sync_timing));
return XMEDIA_SUCCESS;
}
int init_vo(xmedia_void)
{
vo_dts_init();
hal_vo_init();
return XMEDIA_SUCCESS;
}
int deinit_vo(xmedia_void)
{
hal_vo_deinit();
vo_dts_deinit();
return XMEDIA_SUCCESS;
}
int start_vo(unsigned int dev, xmedia_s32 screen_type)
{
sample_vo_config vo_config;
vo_dev_context *dev_ctx = XMEDIA_NULL;
memset(&vo_config, 0 ,sizeof(sample_vo_config));
if (sample_vo_get_dev_config(screen_type, &vo_config) != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR, "sample_vo_get_dev_config error!\n");
return XMEDIA_FAILURE;
}
dev_ctx = drv_vo_get_dev_context(dev);
memset(dev_ctx, 0 ,sizeof(vo_dev_context));
if (drv_vo_set_dev_config(dev, &vo_config.dev_config) != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR, "drv_vo_set_dev_config error!\n");
return XMEDIA_FAILURE;
}
if (drv_vo_set_dev_csc(dev, &vo_config.dev_csc) != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR, "drv_vo_set_dev_csc error!\n");
return XMEDIA_FAILURE;
}
if (drv_vo_enable_dev(dev) != XMEDIA_SUCCESS) {
VO_TRACE(MODULE_DBG_ERR, "drv_vo_set_dev_config error!\n");
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
int stop_vo(unsigned int dev)
{
drv_vo_disable_dev(dev);
return 0;
}
int start_videolayer(unsigned int layer, unsigned long addr, unsigned int strd, xmedia_video_rect layer_rect)
{
vo_layer_config_info config_info;
xmedia_vo_dev dev = layer;
memset(&config_info, 0 , sizeof(vo_layer_config_info));
vo_set_layer_config_info(&config_info, layer, addr, strd, layer_rect);
vo_isr_set_single_cfg(layer, &config_info);
vo_isr_set_csc(layer, &config_info);
hal_vo_set_layer_enable(layer, config_info.layer_enable);
hal_vo_set_layer_regup_enable(layer, XMEDIA_TRUE);
hal_vo_set_dev_intf_regup_enable(dev, XMEDIA_TRUE);
return 0;
}
int stop_videolayer(unsigned int layer)
{
xmedia_vo_dev dev = layer;
hal_vo_set_layer_enable(layer, XMEDIA_FALSE);
hal_vo_set_layer_regup_enable(layer, XMEDIA_TRUE);
hal_vo_set_dev_intf_regup_enable(dev, XMEDIA_TRUE);
return 0;
}
int start_gx(unsigned int layer, unsigned long addr, unsigned int strd, xmedia_video_rect gx_rect)
{
return 0;
}
int stop_gx(unsigned int layer)
{
return 0;
}