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