diff options
-rw-r--r-- | services/surfaceflinger/Android.mk | 10 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 101 |
2 files changed, 111 insertions, 0 deletions
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk index 6f7a7e1ffd..8a428df8e7 100644 --- a/services/surfaceflinger/Android.mk +++ b/services/surfaceflinger/Android.mk @@ -36,6 +36,10 @@ ifeq ($(TARGET_DISABLE_TRIPLE_BUFFERING), true) LOCAL_CFLAGS += -DTARGET_DISABLE_TRIPLE_BUFFERING endif +ifeq ($(BOARD_HAVE_HDMI_SUPPORT),SAMSUNG_HDMI_SUPPORT) + LOCAL_CFLAGS += -DSAMSUNG_HDMI_SUPPORT +endif + LOCAL_SHARED_LIBRARIES := \ libcutils \ libhardware \ @@ -46,6 +50,12 @@ LOCAL_SHARED_LIBRARIES := \ libui \ libgui +ifeq ($(BOARD_HAVE_HDMI_SUPPORT),SAMSUNG_HDMI_SUPPORT) + LOCAL_C_INCLUDES += vendor/samsung/origen/proprietary/include + LOCAL_LDFLAGS += vendor/samsung/origen/proprietary/system/lib/libfimc.so + LOCAL_LDFLAGS += vendor/samsung/origen/proprietary/system/lib/libhdmi.so +endif + # this is only needed for DDMS debugging ifneq ($(TARGET_BUILD_PDK), true) LOCAL_SHARED_LIBRARIES += libdvm libandroid_runtime diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 51fcce43e6..dc396573d3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -64,11 +64,33 @@ #include <private/gui/SharedBufferStack.h> #include <gui/BitTube.h> +// true : HDMI cable is pluged in, false: HDMI cable is plugged out +bool mHdmiCableInserted; + +#ifdef SAMSUNG_HDMI_SUPPORT +#include "SecHdmi.h" +#endif + #define EGL_VERSION_HW_ANDROID 0x3143 #define DISPLAY_COUNT 1 namespace android { + +#ifdef SAMSUNG_HDMI_SUPPORT +extern "C" { + +extern bool blit2Hdmi(); +extern int SecHdmi_flush(); +extern int SecHdmi_connect(void); +extern int SecHdmi_disconnect(void); +extern int SecHdmi_destroy(void); +extern void SecHdmi(); +extern int SecHdmi_create(void); +extern void setHdmiStatus(uint32_t status); +} +#endif + // --------------------------------------------------------------------------- const String16 sHardwareTest("android.permission.HARDWARE_TEST"); @@ -295,6 +317,16 @@ status_t SurfaceFlinger::readyToRun() // put the origin in the left-bottom corner glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h +#ifdef SAMSUNG_HDMI_SUPPORT + SecHdmi(); + if(SecHdmi_create() == 0) + ALOGE("%s::mSecHdmi.create() fail \n", __func__); + else + { + // for it to connect + setHdmiStatus(1); + } +#endif // start the EventThread mEventThread = new EventThread(this); @@ -477,6 +509,14 @@ void SurfaceFlinger::postFramebuffer() mLastSwapBufferTime = systemTime() - now; mDebugInSwapBuffers = 0; mSwapRegion.clear(); + +#ifdef SAMSUNG_HDMI_SUPPORT + if(mHdmiCableInserted == true) + { + blit2Hdmi(); + } +#endif + } void SurfaceFlinger::handleTransaction(uint32_t transactionFlags) @@ -1166,6 +1206,67 @@ void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& state, } } +#ifdef SAMSUNG_HDMI_SUPPORT +void setHdmiStatus(uint32_t status) +{ + + bool hdmiCableInserted = (bool)status; + + if(mHdmiCableInserted == hdmiCableInserted) + return; + + if(hdmiCableInserted == true) + { + if(SecHdmi_connect() == 0) + { + hdmiCableInserted = false; + } + } + else + { + if(SecHdmi_disconnect() == 0) + { + ALOGE("%s::mSecHdmi.disconnect() fail\n", __func__); + } + } + + mHdmiCableInserted = hdmiCableInserted; + + if(mHdmiCableInserted == true) + { + blit2Hdmi(); + } +} + +void setHdmiMode(uint32_t mode) +{ +} + +void setHdmiResolution(uint32_t resolution) +{ +} + +void setHdmiHdcp(uint32_t hdcp_en) +{ +} + +bool blit2Hdmi(void) +{ + if(mHdmiCableInserted == false) + { + ALOGE("mHdmiCableInserted == false fail"); + return false; + } + + if(SecHdmi_flush() == false) + { + ALOGE("%s::mSecHdmi.flush() fail\n", __func__); + } + + return true; +} + +#endif sp<ISurface> SurfaceFlinger::createSurface( ISurfaceComposerClient::surface_data_t* params, const String8& name, |