blob: 08bee204edcdef153b6cb679bb3426d38fc90db9 [file] [log] [blame]
/*
* Copyright@ Samsung Electronics Co. LTD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**
** @author Sangwoo, Park(sw5771.park@samsung.com)
** @date 2010-09-10
**
*/
#ifndef __SEC_HDMI_H__
#define __SEC_HDMI_H__
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <ctype.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#ifdef BOARD_USE_V4L2
#include "s5p_tvout_v4l2.h"
#else
#include "s5p_tvout.h"
#endif
#if defined(BOARD_USES_FIMGAPI)
#include "sec_g2d.h"
#endif
#include "s3c_lcd.h"
#include "SecBuffer.h"
#include "SecFimc.h"
#include "../libhdmi/libsForhdmi/libedid/libedid.h"
#include "../libhdmi/libsForhdmi/libcec/libcec.h"
#include "../libhdmi/SecHdmi/SecHdmiCommon.h"
#include "../libhdmi/SecHdmi/SecHdmiV4L2Utils.h"
#if defined(BOARD_USES_FIMGAPI)
#include "FimgApi.h"
#endif
#include <linux/fb.h>
#include <hardware/hardware.h>
#include <utils/threads.h>
namespace android {
class SecHdmi: virtual public RefBase
{
public :
enum HDMI_LAYER {
HDMI_LAYER_BASE = 0,
HDMI_LAYER_VIDEO,
HDMI_LAYER_GRAPHIC_0,
HDMI_LAYER_GRAPHIC_1,
HDMI_LAYER_MAX,
};
private :
class CECThread: public Thread
{
public:
bool mFlagRunning;
private:
sp<SecHdmi> mSecHdmi;
Mutex mThreadLoopLock;
Mutex mThreadControlLock;
virtual bool threadLoop();
enum CECDeviceType mDevtype;
int mLaddr;
int mPaddr;
public:
CECThread(sp<SecHdmi> secHdmi)
:Thread(false),
mFlagRunning(false),
mSecHdmi(secHdmi),
mDevtype(CEC_DEVICE_PLAYER),
mLaddr(0),
mPaddr(0){
};
virtual ~CECThread();
bool start();
bool stop();
};
Mutex mLock;
sp<CECThread> mCECThread;
bool mFlagCreate;
bool mFlagConnected;
bool mFlagLayerEnable[HDMI_LAYER_MAX];
bool mFlagHdmiStart[HDMI_LAYER_MAX];
int mSrcWidth[HDMI_LAYER_MAX];
int mSrcHeight[HDMI_LAYER_MAX];
int mSrcColorFormat[HDMI_LAYER_MAX];
int mHdmiResolutionWidth[HDMI_LAYER_MAX];
int mHdmiResolutionHeight[HDMI_LAYER_MAX];
int mHdmiDstWidth;
int mHdmiDstHeight;
unsigned int mHdmiSrcYAddr;
unsigned int mHdmiSrcCbCrAddr;
int mHdmiOutputMode;
unsigned int mHdmiResolutionValue;
unsigned int mHdmiPresetId;
v4l2_std_id mHdmiStdId;
unsigned int mCompositeStd;
bool mHdcpMode;
int mAudioMode;
unsigned int mUIRotVal;
unsigned int mG2DUIRotVal;
int mCurrentHdmiOutputMode;
unsigned int mCurrentHdmiResolutionValue;
bool mCurrentHdcpMode;
int mCurrentAudioMode;
bool mHdmiInfoChange;
int mFimcDstColorFormat;
SecBuffer mFimcReservedMem[HDMI_FIMC_OUTPUT_BUF_NUM];
unsigned int mFimcCurrentOutBufIndex;
SecFimc mSecFimc;
unsigned int mHdmiResolutionValueList[14];
int mHdmiSizeOfResolutionValueList;
SecBuffer mMixerBuffer[HDMI_LAYER_MAX][MAX_BUFFERS_MIXER];
void *mFBaddr;
unsigned int mFBsize;
int mFBionfd;
unsigned int mFBIndex;
int mHdmiFd[HDMI_LAYER_MAX];
int mDstWidth[HDMI_LAYER_MAX];
int mDstHeight[HDMI_LAYER_MAX];
int mPrevDstWidth[HDMI_LAYER_MAX];
int mPrevDstHeight[HDMI_LAYER_MAX];
int mDefaultFBFd;
int mDisplayWidth;
int mDisplayHeight;
struct v4l2_rect mDstRect;
public :
SecHdmi();
virtual ~SecHdmi();
bool create(int width, int height);
bool destroy(void);
inline bool flagCreate(void) { return mFlagCreate; }
bool connect(void);
bool disconnect(void);
bool flagConnected(void);
bool flush(int srcW, int srcH, int srcColorFormat,
unsigned int srcYAddr, unsigned int srcCbAddr, unsigned int srcCrAddr,
int dstX, int dstY,
int hdmiLayer,
int num_of_hwc_layer);
bool clear(int hdmiLayer);
bool setHdmiOutputMode(int hdmiOutputMode, bool forceRun = false);
bool setHdmiResolution(unsigned int hdmiResolutionValue, bool forceRun = false);
bool setHdcpMode(bool hdcpMode, bool forceRun = false);
bool setUIRotation(unsigned int rotVal, unsigned int hwcLayer);
bool setDisplaySize(int width, int height);
private:
bool m_reset(int w, int h, int colorFormat, int hdmiLayer, int hwcLayer);
bool m_startHdmi(int hdmiLayer, unsigned int num_of_plane);
bool m_startHdmi(int hdmiLayer);
bool m_stopHdmi(int hdmiLayer);
bool m_setHdmiOutputMode(int hdmiOutputMode);
bool m_setHdmiResolution(unsigned int hdmiResolutionValue);
bool m_setCompositeResolution(unsigned int compositeStdId);
bool m_setHdcpMode(bool hdcpMode);
bool m_setAudioMode(int audioMode);
int m_resolutionValueIndex(unsigned int ResolutionValue);
bool m_flagHWConnected(void);
};
}; // namespace android
#endif //__SEC_HDMI_H__