554 lines
13 KiB
C
Executable File
554 lines
13 KiB
C
Executable File
#include "GxVideo.h"
|
|
#include "GxVideo_int.h"
|
|
#include "Dx.h"
|
|
#include "DxDisplay.h"
|
|
#include "DxApi.h"
|
|
#include "hdal.h"
|
|
#include "kwrap/error_no.h"
|
|
#include "vendor_videoout.h"
|
|
|
|
#ifndef LAYER_NUM
|
|
#define _DD(id) (((id)>>4)&0x0f)
|
|
#define _DL(id) ((id)&0x0f)
|
|
#define _LayerID(dev,lyr) ((((dev)&0x0f)<<4)|((lyr)&0x0f))
|
|
|
|
//DISPLAY layer id
|
|
#define LAYER_OSD1 0x00
|
|
#define LAYER_OSD2 0x01
|
|
#define LAYER_VDO1 0x02
|
|
#define LAYER_VDO2 0x03
|
|
#define LAYER_OUTPUT 0x04 //output = mix ( osd1, osd2, vdo1, vdo2 )
|
|
#define LAYER_FACE 0x05 //face tracing frame
|
|
#define LAYER_ALL 0x0F
|
|
|
|
#define LAYER_NUM 4 //total input layer
|
|
#define LAYER_MAX (LAYER_NUM+1)
|
|
#endif
|
|
|
|
#if defined(_BSP_NA51000_)
|
|
#define DEVICE_COUNT 2
|
|
#else
|
|
#define DEVICE_COUNT 1
|
|
#endif
|
|
|
|
static HD_PATH_ID video_out_ctrl[2] = {0};
|
|
static HD_PATH_ID video_out_path[2] = {0};
|
|
|
|
static BOOL bForceDetIns = 0;
|
|
static BOOL bForceDetDir = 0;
|
|
|
|
static UINT32 g_DispDev[2] = {0}; //0:Lock, Non-0:Unlcok
|
|
static BOOL g_DispRotate[2] = {FALSE, FALSE};
|
|
static BOOL g_DispState[2] = {DISPLAY_ACTIVE_STOP, DISPLAY_ACTIVE_STOP};
|
|
//static UINT32 g_DispMode[2] = {0xffffffff, 0xffffffff}; //mode
|
|
#if 0
|
|
static USIZE g_DispWinSize[2] = {0}; //current size
|
|
static ISIZE g_oldsize[2] = {0};
|
|
static ISIZE g_newsize[2] = {0};
|
|
#endif
|
|
|
|
GX_CALLBACK_PTR g_fpDispCB = 0;
|
|
|
|
void GxVideo_RegCB(GX_CALLBACK_PTR fpDispCB)
|
|
{
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
g_fpDispCB = fpDispCB;
|
|
}
|
|
|
|
|
|
//init
|
|
// ->default mode
|
|
// ->default window en
|
|
// ->default size?
|
|
// ->lock
|
|
void GxVideo_InitDevice(UINT32 DevID)
|
|
{
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
}
|
|
|
|
//exit
|
|
// assert(under lock)
|
|
// ->xxx
|
|
void GxVideo_ExitDevice(UINT32 DevID)
|
|
{
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
}
|
|
|
|
|
|
void GxVideo_DumpInfo(void)
|
|
{
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
}
|
|
|
|
/*
|
|
open
|
|
assert(under lock)
|
|
-> set device ENABLE = TRUE
|
|
---> open device by current mode
|
|
-> get new size, resize buffer/window
|
|
-> unlock
|
|
*/
|
|
INT32 GxVideo_OpenDevice(UINT32 DevID, UINT32 NewDevObj, UINT32 mode)
|
|
{
|
|
HD_RESULT ret = 0;
|
|
HD_VIDEOOUT_MODE videoout_mode ={0};
|
|
UINT32 cDevID = _DD(DevID);
|
|
|
|
#if (DEVICE_COUNT < 2)
|
|
if (cDevID >= 1) {
|
|
DBG_ERR("DevID%d no support\r\n", cDevID);
|
|
return HD_ERR_NOT_SUPPORT;
|
|
}
|
|
#endif
|
|
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
|
|
if (Dx_Open((DX_HANDLE)NewDevObj) != DX_OK) { //here will update current size to INFOBUF
|
|
DBG_ERR("Dx_Open fail\r\n");
|
|
return E_PAR;
|
|
}
|
|
|
|
if((ret = hd_videoout_init()) != HD_OK){
|
|
return ret;
|
|
}
|
|
if (DevID == 0) {
|
|
ret = hd_videoout_open(0, HD_VIDEOOUT_0_CTRL, &video_out_ctrl[cDevID]); //open this for device control
|
|
if(ret!=HD_OK)
|
|
return ret;
|
|
|
|
memset((void *)&videoout_mode,0,sizeof(HD_VIDEOOUT_MODE));
|
|
videoout_mode.output_type = HD_COMMON_VIDEO_OUT_LCD;
|
|
videoout_mode.input_dim = HD_VIDEOOUT_IN_AUTO;
|
|
videoout_mode.output_mode.lcd = HD_VIDEOOUT_LCD_0;
|
|
ret = hd_videoout_set(video_out_ctrl[cDevID], HD_VIDEOOUT_PARAM_MODE, &videoout_mode);
|
|
if(ret!=HD_OK){
|
|
return ret;
|
|
}
|
|
if((ret = hd_videoout_open(HD_VIDEOOUT_0_IN_0, HD_VIDEOOUT_0_OUT_0, &video_out_path[cDevID])) != HD_OK){
|
|
return ret;
|
|
}
|
|
|
|
} else {
|
|
DBG_ERR("not sup\r\n");
|
|
return E_NOSPT;
|
|
}
|
|
|
|
if(ret==0) {
|
|
g_DispDev[_DD(DevID)] = NewDevObj;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/*
|
|
close
|
|
assert(under unlock)
|
|
-> lock
|
|
-> get old size
|
|
-> set device ENABLE = FALSE
|
|
---> close device
|
|
*/
|
|
INT32 GxVideo_CloseDevice(UINT32 DevID)
|
|
{
|
|
HD_RESULT ret=0;
|
|
UINT32 cDevID = _DD(DevID);
|
|
|
|
#if (DEVICE_COUNT < 2)
|
|
if (cDevID >= 1) {
|
|
DBG_ERR("DevID%d no support\r\n", cDevID);
|
|
return HD_ERR_NOT_SUPPORT;
|
|
}
|
|
#endif
|
|
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
|
|
ret = hd_videoout_stop(video_out_path[cDevID]);
|
|
if(ret!=HD_OK){
|
|
return ret;
|
|
}
|
|
ret = hd_videoout_close(video_out_path[cDevID]);
|
|
if(ret!=HD_OK){
|
|
return ret;
|
|
}
|
|
ret = hd_videoout_uninit();
|
|
|
|
ret = Dx_Close((DX_HANDLE)g_DispDev[_DD(DevID)]);
|
|
if (DX_OK != ret && DX_NOT_OPEN != ret) {
|
|
DBG_ERR("Dx_Close fail, err: %d\r\n", ret);
|
|
}
|
|
|
|
if(ret == 0) {
|
|
g_DispDev[_DD(DevID)] = 0;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT32 GxVideo_GetDevice(UINT32 DevID)
|
|
{
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
return 0;
|
|
}
|
|
|
|
ISIZE GxVideo_GetDeviceSize(UINT32 DevID)
|
|
{
|
|
ISIZE sz ={0};
|
|
HD_RESULT ret = HD_OK;
|
|
HD_VIDEOOUT_SYSCAPS video_out_syscaps;
|
|
UINT32 cDevID = _DD(DevID);
|
|
|
|
#if (DEVICE_COUNT < 2)
|
|
if (cDevID >= 1) {
|
|
DBG_ERR("DevID%d no support\r\n", cDevID);
|
|
return sz;
|
|
}
|
|
#endif
|
|
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
|
|
ret = hd_videoout_get(video_out_ctrl[cDevID], HD_VIDEOOUT_PARAM_SYSCAPS, &video_out_syscaps);
|
|
if (ret != HD_OK) {
|
|
DBG_ERR("get vout cap fail\r\n");
|
|
return sz;
|
|
}
|
|
|
|
if(g_DispRotate[cDevID]) {
|
|
sz.w = video_out_syscaps.output_dim.h;
|
|
sz.h = video_out_syscaps.output_dim.w;
|
|
} else {
|
|
sz.w = video_out_syscaps.output_dim.w;
|
|
sz.h = video_out_syscaps.output_dim.h;
|
|
}
|
|
|
|
return sz;
|
|
}
|
|
|
|
USIZE GxVideo_GetDeviceAspect(UINT32 DevID)
|
|
{
|
|
USIZE sz = {0}, sz2 = {0};
|
|
UINT32 cDevID;
|
|
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
|
|
cDevID = _DD(DevID);
|
|
Dx_Getcaps((DX_HANDLE)g_DispDev[cDevID], DISPLAY_CAPS_ASPECT, (UINT32)&sz); //query aspect
|
|
if(g_DispRotate[cDevID]) {
|
|
sz2.w = sz.h;
|
|
sz2.h = sz.w;
|
|
} else {
|
|
sz2.w = sz.w;
|
|
sz2.h = sz.h;
|
|
}
|
|
DBG_IND("devasp=(%d,%d)\r\n",sz2.w,sz2.h);
|
|
return sz2;
|
|
|
|
}
|
|
|
|
UINT32 GxVideo_QueryDeviceLastMode(UINT32 NewDevObj)
|
|
{
|
|
UINT32 mode = 0; //fix for CID 44482
|
|
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
|
|
if (Dx_GetState((DX_HANDLE)NewDevObj, DRVDISP_STATE_LASTMODE, &mode) != DX_OK) { //query mode
|
|
DBG_ERR("- query fail!\r\n");
|
|
return mode;
|
|
}
|
|
return mode;
|
|
}
|
|
void GxVideo_ConfigDeviceFirstMode(UINT32 NewDevObj, UINT32 mode)
|
|
{
|
|
DBG_FUNC_BEGIN("\r\n");
|
|
|
|
Dx_Setconfig((DX_HANDLE)NewDevObj, DISPLAY_CFG_MODE, mode);
|
|
}
|
|
ISIZE GxVideo_QueryDeviceModeSize(UINT32 DevID, UINT32 NewDevObj, UINT32 mode)
|
|
{
|
|
return GxVideo_GetDeviceSize(DevID);
|
|
}
|
|
|
|
/*
|
|
wakeup
|
|
assert(under lock)
|
|
-> set DRVDISP_CTRL_SLEEP = 1 //device off
|
|
---> open ide
|
|
-> set DRVDISP_CTRL_SLEEP = 0
|
|
---> open device by current mode
|
|
-> unlock
|
|
sleep
|
|
assert(under unlock)
|
|
-> lock
|
|
-> set DRVDISP_CTRL_SLEEP = 1 //device off
|
|
---> close device
|
|
-> set DRVDISP_CTRL_SLEEP = 2 //device off & ide off
|
|
---> close ide
|
|
mode
|
|
-> close
|
|
-> set mode
|
|
-> open
|
|
*/
|
|
void GxVideo_SetDeviceCtrl(UINT32 DevID, UINT32 data, UINT32 value)
|
|
{
|
|
UINT32 cDevID;
|
|
UINT32 uiDxState = 0;
|
|
cDevID = _DD(DevID);
|
|
|
|
DBG_IND("DevID %x data %d value %d\r\n",DevID,data,value);
|
|
|
|
if (g_DispDev[cDevID] == 0) {
|
|
switch (data) {
|
|
case DISPLAY_DEVCTRL_SWAPXY:
|
|
g_DispRotate[cDevID] = value;
|
|
break;
|
|
default:
|
|
DBG_WRN("skipped! devctrl=0x%02X (locked)\r\n", data);
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
switch (data) {
|
|
case DISPLAY_DEVCTRL_SWAPXY:
|
|
g_DispRotate[cDevID] = value;
|
|
if(g_DispRotate[cDevID]) {
|
|
DBG_IND("GxVideo: DOUT%d enable rotate!\r\n", cDevID+1);
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_SLEEP: {
|
|
UINT32 sleep = value;
|
|
DBG_IND("GxVideo_SetDeviceCtrl SLEEP=%08x\r\n", sleep);
|
|
|
|
if (Dx_GetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_SLEEP, &uiDxState) != DX_OK) {
|
|
return;
|
|
}
|
|
if (uiDxState != sleep) {
|
|
Dx_Control((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_CTRL_SLEEP, sleep, 0); //set sleep
|
|
}
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_BACKLIGHT: {
|
|
UINT32 state = value;
|
|
if (Dx_Getcaps((DX_HANDLE)(g_DispDev[cDevID]), DISPLAY_CAPS_BASE, 0) & DISPLAY_BF_BACKLIGHT) {
|
|
DBG_IND("GxVideo_SetDeviceCtrl LIGHT=%08x\r\n", state);
|
|
|
|
if (Dx_GetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_BACKLIGHT, &uiDxState) != DX_OK) {
|
|
return;
|
|
}
|
|
if (uiDxState != state) {
|
|
Dx_SetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_BACKLIGHT, state);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_BRIGHTLVL: {
|
|
UINT32 bright = value;
|
|
if (Dx_Getcaps((DX_HANDLE)(g_DispDev[cDevID]), DISPLAY_CAPS_BASE, 0) & DISPLAY_BF_BACKLIGHT) {
|
|
DBG_IND("GxVideo_SetDeviceCtrl LEVEL=%08x\r\n", bright);
|
|
|
|
if (Dx_GetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_BRIGHTLVL, &uiDxState) != DX_OK) {
|
|
return;
|
|
}
|
|
if (uiDxState != bright) {
|
|
Dx_SetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_BRIGHTLVL, bright);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_DIRECT: {
|
|
UINT32 dir = value;
|
|
Dx_SetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_DIRECT, dir);
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_FORCEDETINS:
|
|
bForceDetIns = (value != 0);
|
|
break;
|
|
case DISPLAY_DEVCTRL_FORCEDETDIR:
|
|
bForceDetDir = (value != 0);
|
|
break;
|
|
case DISPLAY_DEVCTRL_ACTIVE:
|
|
DBG_IND("GxVideo_SetDeviceCtrl new ACTIVE=%08x\r\n", value);
|
|
DBG_IND("GxVideo_SetDeviceCtrl cur ACTIVE=%08x\r\n", g_DispState[cDevID]);
|
|
if (value == DISPLAY_ACTIVE_STOP) {
|
|
if (g_DispState[cDevID] == DISPLAY_ACTIVE_PLAY) {
|
|
g_DispState[cDevID] = value;
|
|
DBG_IND("new ACTIVE=%08x ok\r\n", value);
|
|
} else if (g_DispState[cDevID] == DISPLAY_ACTIVE_PAUSE) {
|
|
g_DispState[cDevID] = value;
|
|
DBG_IND("new ACTIVE=%08x ok\r\n", value);
|
|
} else {
|
|
DBG_IND("ignore\r\n");
|
|
}
|
|
}
|
|
if (value == DISPLAY_ACTIVE_PLAY) {
|
|
if (g_DispState[cDevID] == DISPLAY_ACTIVE_PAUSE) {
|
|
g_DispState[cDevID] = value;
|
|
DBG_IND("new ACTIVE=%08x ok\r\n", value);
|
|
} else {
|
|
DBG_IND("ignore\r\n");
|
|
}
|
|
}
|
|
if (value == DISPLAY_ACTIVE_PAUSE) {
|
|
if (g_DispState[cDevID] == DISPLAY_ACTIVE_PLAY) {
|
|
g_DispState[cDevID] = value;
|
|
DBG_IND("new ACTIVE=%08x ok\r\n", value);
|
|
} else {
|
|
DBG_IND("ignore\r\n");
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
DBG_ERR("devctrl=0x%02X not support!\r\n", data);
|
|
break;
|
|
}
|
|
}
|
|
|
|
UINT32 GxVideo_GetDeviceCtrl(UINT32 DevID, UINT32 data)
|
|
{
|
|
UINT32 getv = 0;
|
|
UINT32 cDevID;
|
|
|
|
DBG_IND("DevID %x data %d \r\n",DevID,data);
|
|
|
|
cDevID = _DD(DevID);
|
|
|
|
if (g_DispDev[cDevID] == 0) {
|
|
DBG_WRN("skipped! devctrl=0x%02X (locked)\r\n", data);
|
|
return 0;
|
|
}
|
|
|
|
switch (data) {
|
|
case DISPLAY_DEVCTRL_PATH:
|
|
getv = video_out_path[cDevID];
|
|
break;
|
|
case DISPLAY_DEVCTRL_CTRLPATH:
|
|
getv = video_out_ctrl[cDevID];
|
|
break;
|
|
case DISPLAY_DEVCTRL_SWAPXY:
|
|
getv = g_DispRotate[cDevID];
|
|
break;
|
|
case DISPLAY_DEVCTRL_MODE:
|
|
//fix for CID 42915 - begin
|
|
if (Dx_GetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_MODE, &getv) != DX_OK) {
|
|
return 0;
|
|
}
|
|
//fix for CID 42915 - end
|
|
break;
|
|
case DISPLAY_DEVCTRL_SLEEP:
|
|
if (Dx_GetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_SLEEP, &getv) != DX_OK) {
|
|
return 0;
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_BACKLIGHT:
|
|
if (Dx_Getcaps((DX_HANDLE)(g_DispDev[cDevID]), DISPLAY_CAPS_BASE, 0) & DISPLAY_BF_BACKLIGHT) {
|
|
if (Dx_GetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_BACKLIGHT, &getv) != DX_OK) {
|
|
return 0;
|
|
}
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_BRIGHTLVL:
|
|
if (Dx_Getcaps((DX_HANDLE)(g_DispDev[cDevID]), DISPLAY_CAPS_BASE, 0) & DISPLAY_BF_BACKLIGHT) {
|
|
if (Dx_GetState((DX_HANDLE)(g_DispDev[cDevID]), DRVDISP_STATE_BRIGHTLVL, &getv) != DX_OK) {
|
|
return 0;
|
|
}
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_DIRECT:
|
|
if (Dx_Getcaps((DX_HANDLE)g_DispDev[cDevID], DISPLAY_CAPS_BASE, 0) & DISPLAY_BF_DETDIR) {
|
|
getv = Dx_Getcaps((DX_HANDLE)g_DispDev[cDevID], DISPLAY_CAPS_DIRECT, 0); //detect current plug status
|
|
}
|
|
break;
|
|
case DISPLAY_DEVCTRL_FORCEDETINS:
|
|
getv = bForceDetIns;
|
|
break;
|
|
case DISPLAY_DEVCTRL_FORCEDETDIR:
|
|
getv = bForceDetDir;
|
|
break;
|
|
case DISPLAY_DEVCTRL_ACTIVE:
|
|
getv = g_DispState[cDevID];
|
|
break;
|
|
default:
|
|
DBG_ERR("devctrl=0x%02X not support!\r\n", data);
|
|
break;
|
|
}
|
|
return getv;
|
|
}
|
|
|
|
static BOOL bLastDet[3] = {FALSE, FALSE, FALSE};
|
|
static BOOL bLastPlug[3] = {FALSE, FALSE, FALSE};
|
|
|
|
/**
|
|
Detect video is plugging in or unplugged
|
|
|
|
Detect video is plugging in or unplugged.
|
|
|
|
@param void
|
|
@return void
|
|
*/
|
|
void GxVideo_DetInsert(UINT32 DevID, UINT32 context)
|
|
{
|
|
|
|
BOOL bCurDet, bCurPlug;
|
|
bCurDet = FALSE;
|
|
|
|
if (Dx_Getcaps((DX_HANDLE)DevID, DISPLAY_CAPS_BASE, 0) & DISPLAY_BF_DETPLUG) {
|
|
bCurDet = Dx_Getcaps((DX_HANDLE)DevID, DISPLAY_CAPS_PLUG, 0); //detect current plug status
|
|
}
|
|
|
|
bCurPlug = (BOOL)(bCurDet & bLastDet[context]); //if det is TRUE twice => plug is TRUE
|
|
|
|
if ((bCurPlug != bLastPlug[context]) || (bForceDetIns)) { //if plug is changed
|
|
if (bForceDetIns) {
|
|
DBG_IND("force detect ins\r\n");
|
|
}
|
|
// video is plugging in
|
|
if (bCurPlug == TRUE) {
|
|
DBG_IND("Video plug!\r\n");
|
|
if (g_fpDispCB) {
|
|
g_fpDispCB(DISPLAY_CB_PLUG, DevID, 0);
|
|
}
|
|
}
|
|
// video is unplugged
|
|
else {
|
|
DBG_IND("Video unplug!\r\n");
|
|
if (g_fpDispCB) {
|
|
g_fpDispCB(DISPLAY_CB_UNPLUG, DevID, 0);
|
|
}
|
|
}
|
|
bForceDetIns = 0;
|
|
}
|
|
|
|
bLastDet[context] = bCurDet; //save det
|
|
bLastPlug[context] = bCurPlug;//save plug
|
|
}
|
|
|
|
static UINT32 bLastDetDir = 0xffffffff;
|
|
/**
|
|
Detect video is plugging in or unplugged
|
|
|
|
Detect video is plugging in or unplugged.
|
|
|
|
@param void
|
|
@return void
|
|
*/
|
|
void GxVideo_DetDir(UINT32 DevID, UINT32 context)
|
|
{
|
|
UINT32 bCurDetDir;
|
|
bCurDetDir = 0x0;
|
|
|
|
if (Dx_Getcaps((DX_HANDLE)DevID, DISPLAY_CAPS_BASE, 0) & DISPLAY_BF_DETDIR) {
|
|
bCurDetDir = Dx_Getcaps((DX_HANDLE)DevID, DISPLAY_CAPS_DIRECT, 0); //detect current plug status
|
|
}
|
|
|
|
if ((bCurDetDir != bLastDetDir) || (bForceDetDir)) {
|
|
if (bForceDetDir) {
|
|
DBG_IND("force detect dir\r\n");
|
|
}
|
|
DBG_IND("device change dir!\r\n");
|
|
if (g_fpDispCB) {
|
|
g_fpDispCB(DISPLAY_CB_DIR, DevID, bCurDetDir);
|
|
}
|
|
bForceDetDir = 0;
|
|
}
|
|
bLastDetDir = bCurDetDir;
|
|
}
|
|
|