#include #include #include #include #include #include #include #include #include #include #include #include #include #include #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; }