summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnnamalai Lakshmanan <annamalai.lakshmanan@linaro.org>2012-05-14 09:49:12 +0530
committerAnnamalai Lakshmanan <annamalai.lakshmanan@linaro.org>2012-05-14 10:08:58 +0530
commitaf9326138d5fcab2692c751ad5baac701d552b0f (patch)
treeb53231a14093aa9db7d07a77b68bd63716ca5db7
parent2ffb2d8ce6b2f651695fa44e1313746a0568ab79 (diff)
downloadbase-af9326138d5fcab2692c751ad5baac701d552b0f.tar.gz
origen: Added HDMI support
Added support for HDMI 1080p blitting. Change-Id: I832831b6840bccdc79faaa167eb0c1681ab2fdb7 Signed-off-by: Annamalai Lakshmanan <annamalai.lakshmanan@linaro.org>
-rw-r--r--services/surfaceflinger/Android.mk6
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp101
2 files changed, 105 insertions, 2 deletions
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk
index f1cb50e01d5f..621c6af9126f 100644
--- a/services/surfaceflinger/Android.mk
+++ b/services/surfaceflinger/Android.mk
@@ -37,6 +37,9 @@ endif
ifeq ($(BOARD_HAVE_CODEC_SUPPORT),SAMSUNG_CODEC_SUPPORT)
LOCAL_CFLAGS += -DSAMSUNG_CODEC_SUPPORT
endif
+ifeq ($(BOARD_HAVE_HDMI_SUPPORT),SAMSUNG_HDMI_SUPPORT)
+ LOCAL_CFLAGS += -DSAMSUNG_HDMI_SUPPORT
+endif
LOCAL_SHARED_LIBRARIES := \
libcutils \
@@ -48,6 +51,9 @@ LOCAL_SHARED_LIBRARIES := \
libui \
libgui
+ifeq ($(BOARD_HAVE_HDMI_SUPPORT),SAMSUNG_HDMI_SUPPORT)
+ LOCAL_SHARED_LIBRARIES += libfimc libhdmi
+endif
# this is only needed for DDMS debugging
LOCAL_SHARED_LIBRARIES += libdvm libandroid_runtime
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 0da75c4cacc6..d0fad417f8d9 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -57,6 +57,11 @@
#include "DisplayHardware/HWComposer.h"
#include <private/surfaceflinger/SharedBufferStack.h>
+#ifdef SAMSUNG_HDMI_SUPPORT
+#include "SecHdmi.h"
+// true : HDMI cable is pluged in, false: HDMI cable is plugged out
+bool mHdmiCableInserted;
+#endif
/* ideally AID_GRAPHICS would be in a semi-public header
* or there would be a way to map a user/group name to its id
@@ -70,6 +75,21 @@
#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");
@@ -131,6 +151,12 @@ void SurfaceFlinger::init()
SurfaceFlinger::~SurfaceFlinger()
{
glDeleteTextures(1, &mWormholeTexName);
+#ifdef SAMSUNG_HDMI_SUPPORT
+ if(SecHdmi_destroy() == false)
+ {
+ LOGE("%s::mSecHdmi.destroy() fail \n", __func__);
+ }
+#endif
}
sp<IMemoryHeap> SurfaceFlinger::getCblk() const
@@ -295,6 +321,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)
+ LOGE("%s::mSecHdmi.create() fail \n", __func__);
+ else
+ {
+ // for it to connect
+ setHdmiStatus(1);
+ }
+#endif
mReadyToRunBarrier.open();
/*
@@ -306,7 +342,6 @@ status_t SurfaceFlinger::readyToRun()
return NO_ERROR;
}
-
// ----------------------------------------------------------------------------
#if 0
#pragma mark -
@@ -398,7 +433,10 @@ status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
bool SurfaceFlinger::threadLoop()
{
waitForEvent();
-
+#ifdef SAMSUNG_HDMI_SUPPORT
+ //Check For HDMI Detection
+ setHdmiStatus(true);
+#endif
// check for transactions
if (UNLIKELY(mConsoleSignals)) {
handleConsoleEvents();
@@ -462,6 +500,10 @@ void SurfaceFlinger::postFramebuffer()
mLastSwapBufferTime = systemTime() - now;
mDebugInSwapBuffers = 0;
mSwapRegion.clear();
+#ifdef SAMSUNG_HDMI_SUPPORT
+ if(mHdmiCableInserted == true)
+ blit2Hdmi();
+#endif
}
void SurfaceFlinger::handleConsoleEvents()
@@ -1269,7 +1311,62 @@ int SurfaceFlinger::setOrientation(DisplayID dpy,
}
return orientation;
}
+#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(hdmiCableInserted == false)
+ {
+ if(SecHdmi_disconnect() == 0)
+ {
+ LOGE("%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)
+ {
+ LOGE("mHdmiCableInserted == false fail");
+ return false;
+ }
+ if(SecHdmi_flush() == false)
+ {
+ LOGE("%s::mSecHdmi.flush() fail\n", __func__);
+ }
+
+ return true;
+}
+#endif
sp<ISurface> SurfaceFlinger::createSurface(
ISurfaceComposerClient::surface_data_t* params,
const String8& name,