You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

527 lines
21 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd.. 2019-2022. All rights reserved.
* Description: Support hwdisplay hal adaptation interface
* Author: Hisilicon
* Created: 2022-12-28
*/
#ifndef DISPLAY_IMPL_H
#define DISPLAY_IMPL_H
#include "td_type.h"
#include "uapi_svr_dispmng.h"
#include "uapi_pdm.h"
#include "uapi_win.h"
#include "uapi_hdmitx.h"
#include "securec.h"
#include <binder/Parcel.h>
#include <utils/Mutex.h>
namespace android {
using LocalAtomicPfn = td_s32 (*)(const android::Parcel &request, android::Parcel &reply);
using DispmngEventCallback = void (*)(uapi_svr_dispmng_event event, void *msg, unsigned int msglen, void *privdata);
const td_s32 UI_MAX = 100;
const td_s32 UI_MIN = 0;
enum class DispHdcpMode {
MW_DISP_HDCP_MODE_AUTO, /* HDCP auto mode */
MW_DISP_HDCP_MODE_14, /* force to HDCP1.4 */
MW_DISP_HDCP_MODE_2X, /* force to HDCP2.x */
MW_DISP_HDCP_MODE_MAX
};
using DispHdcpCapability = struct {
td_bool support14; /* sink support HDCP1.4 */
td_bool support2x; /* sink support HDCP2.x */
};
using DispHdcpStatus = struct {
td_bool authStart; /* HDCP authentication start. */
td_bool authSuccess; /* HDCP authentication success. */
td_u32 reauthTimes; /* HDCP current re-authen times. */
td_u32 mode; /* HDCP authentication mode. */
td_u32 errCode; /* HDCP error code. */
};
using DispOutputStatus = struct {
td_u32 actualOutHdrType; /* output hdr type */
td_u32 actualOutColorpace; /* output colorspace */
td_u32 refreshRate; /* output real-time refresh rate */
};
using DispHdmitxStatus = struct {
td_u32 hdmitxId;
td_u32 connStatus; /* the hdmi sink connect status */
td_u32 rsenStatus; /* HDMITX TMDS link rsen status */
td_bool enabled; /* HDMITX signal output enable status */
};
using DispCvbsStatus = struct {
td_u8 dac;
td_bool connected; /* TV connected */
td_bool cgms; /* CGMS enable */
td_u32 macrovision; /* Macrovision enable */
};
using DispPanelStatus = struct {
td_u32 panelId;
td_bool powerOn;
td_bool dynamicBacklightEnabled;
td_u32 backlightLevel;
td_bool abnormal;
};
enum class DispIntfType {
DISPMNG_INTERFACE_HDMITX = 0,
DISPMNG_INTERFACE_CVBS = 0x0A,
DISPMNG_INTERFACE_PANEL = 0x16,
DISPMNG_INTERFACE_MAX
};
using DispInterfaceStatus = struct {
DispIntfType intfType; /* interface type */
union {
DispCvbsStatus cvbs;
DispHdmitxStatus hdmi;
DispPanelStatus panel;
} intf;
};
const td_u32 DISP_INTERFACE_NUM = 8;
using DisplayStatus = struct {
td_u32 number;
DispInterfaceStatus intf[DISP_INTERFACE_NUM];
};
const td_u32 MANUFACTURERS_NAME_LENGTH = 4;
using DispSinkInfo = struct {
td_u8 mfrsName[MANUFACTURERS_NAME_LENGTH]; /* Manufacture name */ /* CNcomment: 制造商名 */
td_u32 productCode; /* Product code */ /* CNcomment: 产品编码 */
td_u32 serialNumber; /* Serial number of manufacture */ /* CNcomment: 序列号 */
td_u32 week; /* the week of manufacture */ /* CNcomment: 生产年 */
td_u32 year; /* the year of manufacture */ /* CNcomment: 生产周 */
};
const td_u32 DISP_COLORIMETRY_MAX = 9;
using DispColorimetryCapability = struct {
td_bool colorimetry[DISP_COLORIMETRY_MAX];
};
using DispDolbyCapsV0 = struct {
td_bool yuv42212bit; /* support(TD_TRUE) or not support(TD_FALSE) a YUV422-12Bit dolby singal */
td_bool support2160p60; /* capable of processing a max timming 3840X2160p60(TD_TRUE)/3840X2160p30(TD_FALSE) */
td_bool globalDimming; /* support(TD_TRUE) or not support(TD_FALSE) global dimming. */
td_u16 whiteX; /* white point chromaticity coordinate x, bit[11:0] valid. */
td_u16 whiteY; /* white point chromaticity coordinate y, bit[11:0] valid. */
td_u8 dmMajorVersion; /* the major version of display management implemented. */
td_u8 dmMinorVersion; /* the minor version of display management implemented. */
td_u16 minPq; /* Perceptual quantization(PQ)-encoded value of minimum display luminance */
td_u16 maxPq; /* PQ-encoded value of maximum display luminance */
td_u16 redX; /* red primary chromaticity coordinate x, bit[11:0]valid. */
td_u16 redY; /* red primary chromaticity coordinate y, bit[11:0]valid. */
td_u16 greenX; /* green primary chromaticity coordinate x, bit[11:0]valid. */
td_u16 greenY; /* green primary chromaticity coordinate y, bit[11:0]valid. */
td_u16 blueX; /* blue primary chromaticity coordinate x, bit[11:0]valid. */
td_u16 blueY; /* blue primary chromaticity coordinate y, bit[11:0]valid. */
};
using DispDolbyCapsV1 = struct {
td_bool yuv42212bit; /* support or not YUV422-12Bit dolby singal; For low-latency this flag is ingnored */
td_bool support2160p60; /* capable of processing a max timming 3840X2160p60/3840X2160p30 */
td_bool globalDimming; /* support(TD_TRUE) or not support(TD_FALSE) global dimming. */
td_bool colorimetry; /* this bit is valid only u8VSVDBVersion = 1.
0: Dolby Vision HDMI sink's colorimetry is close to Rec.709,
1: EDR HDMI sink's colorimetry is close to P3,
if Byte[9] to Byte[14] are present, ignores this bit. */
td_u8 dmVersion; /* 0:based on display management v2.x;
1:based on the video and blending pipeline v3.x;
2-7: reserved. only support when u8VSVDBVersion = 1. */
td_u8 lowLatency; /* 0: Supports only standard DolbyVison;
1: Supports low latency with 12-bit YUV 4:2:2 interface;
2-3:reserved */
td_u16 minLuminance; /* minimum display luminance = (100+50*CV)cd/m2, where CV is the value */
td_u16 maxLuminance; /* maximum display luminance = (CV/127)^2cd/m2, where CV is the value */
td_u16 redX; /* red primary chromaticity coordinate x, bit[11:0]valid. */
td_u16 redY; /* red primary chromaticity coordinate y, bit[11:0]valid. */
td_u16 greenX; /* green primary chromaticity coordinate x, bit[11:0]valid. */
td_u16 greenY; /* green primary chromaticity coordinate y, bit[11:0]valid. */
td_u16 blueX; /* blue primary chromaticity coordinate x, bit[11:0]valid. */
td_u16 blueY; /* blue primary chromaticity coordinate y, bit[11:0]valid. */
};
using DispDolbyCapsV2 = struct {
td_bool yuv42212bit; /* support(TD_TRUE) or not support(TD_FALSE) a YUV422-12Bit dolby singal */
td_bool backLightContol; /* supports Backlight Control */
td_bool globalDimming; /* support(TD_TRUE) or not support(TD_FALSE) global dimming. */
td_u8 dmVersion; /* 0:based on display management v2.x;
1:based on the video and blending pipeline v3.x;
2-7: reserved. only support when u8VSVDBVersion = 1. */
td_u8 backltMinLuma; /* minimum luminance level 0:25cd/m2 1:50cd/m2 2:75cd/m2 3:100cd/m2 */
td_u8 interface; /* 0:support only "low latency with YUV422"
1:support both "low latency with YUV422" and YUV444/RGB_10/12bit*
2:support both "standard DolbyVision" and "low latency with YUV422"
3:support "standard DolbyVision" "low latency YUV422 YUV444/RGB_10/12bit" */
td_u8 yuv444Rgb44410b12b; /* 0:not support 1:Support YUV444/RGB444_10bit 2:YUV444/RGB444_12bit 3:reserved */
td_u16 minPqV2; /* maximum display luminance */
td_u16 maxPqV2; /* minimum display luminance, in the PQ-encoded value= 2055+u16TargetMaxPQv2*65. */
td_u16 redX; /* red primary chromaticity coordinate x ,bit[11:0]valid. */
td_u16 redY; /* red primary chromaticity coordinate y ,bit[11:0]valid. */
td_u16 greenX; /* green primary chromaticity coordinate x ,bit[11:0]valid. */
td_u16 greenY; /* green primary chromaticity coordinate y ,bit[11:0]valid. */
td_u16 blueX; /* blue primary chromaticity coordinate x ,bit[11:0]valid. */
td_u16 blueY; /* blue primary chromaticity coordinate y ,bit[11:0]valid. */
};
using DispDolbyCapability = struct {
td_bool supportV0; /* V0 support */ /* CNcomment: V0支持 */
td_bool supportV1; /* V1 support */ /* CNcomment: V1支持 */
td_bool supportV2; /* V2 support */ /* CNcomment: V2支持 */
DispDolbyCapsV0 v0; /* V0 detail */ /* CNcomment: V0详细能力 */
DispDolbyCapsV1 v1; /* V1 detail */ /* CNcomment: V1详细能力 */
DispDolbyCapsV2 v2; /* V2 detail */ /* CNcomment: V2详细能力 */
};
using DispEotfCapabiliey = struct {
td_bool eotfSdr; /* CNcomment: 传统伽玛-SDR亮度范围 */
td_bool eotfHdr; /* CNcomment: 传统伽玛-HDR亮度范围 */
td_bool eotfSmpteSt2084; /* CNcomment: HDMT HDR的HDR10模式 */
td_bool eotfHlg; /* CNcomment: HDMT HDR的HLG模式(混合对数伽玛) */
};
using DispDynamicMetadataCapability = struct {
td_bool dynamicType1Support; /* CNcomment: type1动态元数据支持 */
td_u8 dynamicType1Version; /* CNcomment: type1动态元数据版本 */
td_bool dynamicType2Support; /* CNcomment: type2动态元数据支持 */
td_u8 dynamicType2Version; /* CNcomment: type2动态元数据版本 */
td_bool dynamicType3Support; /* CNcomment: type3动态元数据支持 */
td_bool dynamicType4Support; /* CNcomment: type4动态元数据支持 */
td_u8 dynamicType4Version; /* CNcomment: type4动态元数据版本 */
};
using DispStaticMetadataCapability = struct {
td_bool staticType1; /* Static Metadata Type 1 support */
td_u8 maxLumCv; /* Desired Content Max Luminance Data. Real value(in 1cd/m^2) = 50.2^(CV/32) */
td_u8 averLumCv; /* Desired Content Max Frame-average Luminance. Real value(in 1cd/m^2) = 50.2^(CV/32) */
td_u8 minLumCv; /* Desired Content Min Luminance Data. Real value(in 1cd/m^2) = MaxLuminance_CV *
* (MinLuminance_CV/255)^2 / 100 */
};
using DispHdrCapability = struct {
DispEotfCapabiliey eotf; /* CNcomment:电光转换函数 */
DispStaticMetadataCapability staticMetadata; /* HDR Static Metadata Type */
DispDynamicMetadataCapability dynamicMetadata; /* HDR Dynamic Metadata Type */
};
using DispLatency = struct {
td_bool latencyPresent; /* Latency info is valid. */
td_u32 pvideoLatency; /* video latency for progressive video formats.in milliseconds */
td_u32 paudioLatency; /* audio latency for progressive video formats.in milliseconds */
td_u32 ivideoLatency; /* video latency for interlaced video formats.in milliseconds */
td_u32 iaudioLatency; /* audio latency for interlaced video formats.in milliseconds */
};
using DispVrrCapability = struct {
td_bool support;
td_bool fva; /* FVA */
td_bool cnmVrr; /* CNMVRR */
td_bool cinemaVrr; /* CinemaVRR */
td_bool mDelta; /* MDelta */
td_bool fapaStartLocat; /* fapaStartLocation */
td_bool allm; /* ALLM */
td_u16 vrrMin; /* VRRMin */
td_u16 vrrMax; /* VRRMax */
};
using DispCuvaInfo = struct {
td_u8 systemStartCode; /* support version code. */
td_u8 versionCode; /* support HDMI version code. */
td_u32 displayMaxLum; /* display maximum luminance. max display is displayMaxLum/10000. */
td_u32 displayMinLum; /* display minimum luminance. min display is displayMinLum/10000. */
td_bool monitorModeSupport; /* monitor mode support. */
td_bool rxModeSupport; /* rx mode support. */
};
using DisplayCapability = struct {
DispColorimetryCapability colorimetry; /* Sink colorimety capability infomation struct */
DispDolbyCapability dolbyVision; /* EDID dolby vision capability */
DispHdrCapability hdr; /* Sink HDR capability struct */
DispLatency latency; /* EDID latency capability */
DispVrrCapability vrr; /* Sink VRR capability */
td_u8 reserved;
DispCuvaInfo cuva; /* Sink CUVA capability */
};
const td_u32 MAX_DISPLAY_MODE_NAME_LENGTH = 32;
using DisplayMode = struct {
td_u32 vic; /* 0----auto detect, 0xFFFF --- Advance option */
td_u32 format; /* Display format, refer to UAPI_ENC_FMT_E in uapi_svr_video.h.
when vic==0xFFFF, the display manager use this field to set
the display out mode */
td_u32 pixelFormat; /* Pixel format, such as RGB,YCbCr422,YCbCr444,YCbCr420 */
td_u32 bitDepth; /* Pixel bit depth, 8bits/10bits/12bits */
td_u8 name[MAX_DISPLAY_MODE_NAME_LENGTH]; /* Display mode name, such as "1080P60Hz", "1080I50Hz" */
td_u32 width; /* width, 8K-----7680 */
td_u32 height; /* height, 8K-----4320 */
td_bool progressive; /* progressive or not */
td_u32 fieldRate; /* field/frame rate, Hz */
};
const td_u32 MAX_DISPLAY_MODE_NUM = 70;
using DisplayAvailableMode = struct {
DisplayMode nativeMode;
DisplayMode maxMode;
td_u32 number;
DisplayMode mode[MAX_DISPLAY_MODE_NUM];
};
using VideoAspectInfo = struct {
td_u32 ratio;
td_u32 width;
td_u32 height;
};
using DispHdcpKey = struct {
td_u32 keyVersion; /* KEY version */
td_u8 *data; /* Pointer of key data */
td_s32 length; /* Length of key data, in bytes */
};
using DispHdcpSrm = struct {
td_u8 *data; /* Pointer of SRM data */
td_s32 length; /* Length of SRM data, in bytes */
};
using HdmiConfigInfo = struct {
td_u32 hdcpEnable; /* CNcomment:HDCP功能是否使能 */
td_u32 hdcpMode; /* CNcoment:选择模式 0为AUTO, 1为HDCP 1.4, 2为HDCP 2.x */
td_u32 cecEnable; /* CNcomment:是否使能CEC功能 */
td_u32 cecMode; /* CNcomment:cec模式选择 */
};
using DisplayConfig = struct {
td_u32 index; /* display index, 0 is master disp */
td_bool enable; /* Enable or not */
td_bool attach; /* Attached to another display or not */
td_u32 srcDisp; /* display id which attached to */
td_u32 rType; /* Rotation type */
td_u32 rAngle; /* Rotation angle */
td_bool hFlip; /* Horizontal flip */
td_bool vFlip; /* Vertical flip */
td_u32 touchId; /* Touchpad ID */
td_u32 panelIndex; /* Panel index */
};
struct CROP_RECT_S {
td_u32 u32LeftOffset;
td_u32 u32TopOffset;
td_u32 u32RightOffset;
td_u32 u32BottomOffset;
};
/* 3D 视点、景深 调整范围 */
struct DISPLAY_RANGE_S {
td_u32 min; /* 下限 */
td_u32 max; /* 上限 */
};
#define UAPI_EVENT_TYPE(MOD, EVTTYPE) ((((td_s32)(MOD)) << 16) | (td_s32)(EVTTYPE))
const td_s32 DISPLAY_ENUM = 0x09;
enum class TV_EVENT_E {
TV_EVT_DISP_MODE_ALL = UAPI_EVENT_TYPE(DISPLAY_ENUM, 1),
TV_EVT_DISP_HDCP_SUCCESS,
TV_EVT_DISP_HDCP_FAIL,
TV_EVT_DISP_MODE_CHANGED,
TV_EVT_DISP_MODE_PLUG_IN,
TV_EVT_DISP_MODE_PLUG_OUT,
};
class DisplayImpl {
public:
static DisplayImpl *Instance();
static td_void DeInstance();
td_s32 GetDispmngCount(td_s32 &count) const;
td_s32 GetDispmngDispid(td_s32 index, td_s32 &dispid) const;
td_s32 DispmngAttachDispid(td_s32 dstid, td_s32 srcid) const;
td_s32 DispmngDetachDispid(td_s32 dstid, td_s32 srcid) const;
td_s32 SetBrightness(td_s32 dispid, td_u32 brightness) const;
td_s32 GetBrightness(td_s32 dispid, td_u32 &brightness) const;
td_s32 GetContrast(td_s32 dispid, td_u32 &contrast) const;
td_s32 SetContrast(td_s32 dispid, td_u32 contrast) const;
td_s32 GetHue(td_s32 dispid, td_u32 &hue) const;
td_s32 SetHue(td_s32 dispid, td_u32 hue) const;
td_s32 GetSaturation(td_s32 dispid, td_u32 &saturation) const;
td_s32 SetSaturation(td_s32 dispid, td_u32 saturation) const;
td_s32 GetBacklight(td_s32 dispid, td_u32 &backlight) const;
td_s32 SetBacklight(td_s32 dispid, td_u32 backlight) const;
td_s32 GetScreenOffset(td_s32 dispid, CROP_RECT_S& offset) const;
td_s32 SetScreenOffset(td_s32 dispid, CROP_RECT_S offset) const;
td_s32 SetEnableHdcp(td_s32 dispid, DispHdcpMode mode) const;
td_s32 SetDisableHdcp(td_s32 dispid) const;
td_s32 GetHdcpCapability(td_s32 dispid, DispHdcpCapability &cap) const;
td_s32 GetHdcpStatus(td_s32 dispid, DispHdcpStatus &status) const;
td_s32 GetHdrType(td_s32 dispid, td_s32 &hdrType) const;
td_s32 SetHdrType(td_s32 dispid, td_s32 hdrType) const;
td_s32 GetVirtualScreenhw(td_s32 dispid, td_u32 &width, td_u32 &height) const;
td_s32 SetVirtualScreenhw(td_s32 dispid, td_u32 width, td_u32 height) const;
td_s32 GetQmsEnable(td_s32 dispid, td_bool& enable) const;
td_s32 SetQmsEnable(td_s32 dispid, td_bool enable) const;
td_s32 GetQmsAttr(td_s32 dispid, td_u32& qmsRate) const;
td_s32 SetQmsAttr(td_s32 dispid, td_u32 qmsRate) const;
td_s32 GetVrrEnable(td_s32 dispid, td_bool &enable) const;
td_s32 SetVrrEnable(td_s32 dispid, td_bool enable) const;
td_s32 GetAllmAttr(td_s32 dispid, td_u32 &allmMode) const;
td_s32 SetAllmAttr(td_s32 dispid, td_u32 allmMode) const;
td_s32 GetOutputStatus(td_s32 dispid, DispOutputStatus &status) const;
td_s32 GetDisplayStatus(td_s32 dispid, DisplayStatus &status) const;
td_s32 GetDisplayInfo(td_s32 dispid, DispSinkInfo &info) const;
td_s32 GetDisplayCapabilities(td_s32 dispid, DisplayCapability &cap) const;
td_s32 GetDisplaySupportedModeList(td_s32 dispid, DisplayAvailableMode &mode) const;
td_s32 GetDisplayAllModeList(td_s32 dispid, DisplayAvailableMode &mode) const;
td_s32 GetDisplayMode(td_s32 dispid, DisplayMode &mode) const;
td_s32 SetDisplayMode(td_s32 dispid, DisplayMode mode) const;
td_s32 GetSceneMode(td_s32 dispid, td_s32 &sceneMode) const;
td_s32 SetSceneMode(td_s32 dispid, td_s32 mode) const;
td_s32 GetAspectRatio(td_s32 dispid, VideoAspectInfo &aspectInfo) const;
td_s32 SetAspectRatio(td_s32 dispid, VideoAspectInfo aspectInfo) const;
td_s32 GetHdrMatchContent(td_s32 dispid, td_bool &match) const;
td_s32 SetHdrMatchContent(td_s32 dispid, td_bool match) const;
td_s32 LoadHDCPKey(td_s32 dispid, DispHdcpKey key) const;
td_s32 LoadHDCPSrm(td_s32 dispid, DispHdcpSrm srm) const;
td_s32 GetHdmiConfigInfo(td_s32 hdmitx, HdmiConfigInfo &info) const;
td_s32 SetHdmiConfigInfo(td_s32 hdmitx, HdmiConfigInfo info) const;
td_s32 GetHdmitxidByDispid(td_s32 dispid, td_u32 &hdmitx) const;
td_s32 GetDisplayConfig(td_s32 dispid, DisplayConfig &info) const;
td_s32 SetDisplayConfig(td_s32 dispid, DisplayConfig info) const;
td_s32 SetHdmiConfig() const;
td_s32 GetVrrAttr(td_s32 dispid, DISPLAY_RANGE_S &range) const;
td_s32 SetVrrAttr(td_s32 dispid, DISPLAY_RANGE_S range) const;
td_s32 SetPQBypass(td_s32 enable) const;
td_s32 GetPQBypass(td_u32 &enable) const;
td_s32 SetAspectCvrs(int cvrs) const;
td_s32 GetAspectCvrs() const;
td_s32 SetHdmiStart(td_s32 dispid) const;
td_s32 SetHdmiStop(td_s32 dispid) const;
td_s32 SetEnable3D(td_s32 dispid, td_bool enable) const;
td_s32 GetEnable3D(td_s32 dispid, td_bool &enable) const;
td_s32 AttachIntf(int dispid) const;
td_s32 DetachIntf(int dispid) const;
td_s32 GetDisplayWindowNumber(int dispid, uapi_win_handle_info *handleInfo) const;
td_s32 GetFmtFromVic(int vic) const;
td_s32 GetVicFromFmt(int fmt) const;
td_s32 SetOutputEnable(int dispid, int port, td_bool enable) const;
td_s32 GetOutputEnable(int dispid, int port) const;
td_s32 GetDisplayLuminance(int dispid, uapi_svr_dispmng_display_luminance& luminance) const;
td_s32 SetDisplayLuminance(int dispid, uapi_svr_dispmng_display_luminance& luminance) const;
td_s32 SetDisplayCount() const;
td_s32 SetCuvaConfig() const;
DisplayImpl();
virtual ~DisplayImpl();
private:
static DisplayImpl *mDisplayImpl;
static android::Mutex mLockInstance;
};
inline DisplayImpl *DisplayImpl::Instance()
{
android::Mutex::Autolock lock(mLockInstance);
if (mDisplayImpl == nullptr) {
mDisplayImpl = new DisplayImpl();
}
return mDisplayImpl;
}
inline td_void DisplayImpl::DeInstance()
{
if (mDisplayImpl != nullptr) {
delete mDisplayImpl;
mDisplayImpl = nullptr;
}
}
inline DisplayImpl::DisplayImpl() {}
inline DisplayImpl::~DisplayImpl() {}
}
#endif // _DISPLAY_IMPL_H__