/*
* Copyright (c) 2014, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <hwc_qdcm.h>
#include <hwc_utils.h>
#include <utils/String16.h>
#include <mdp_version.h>
#include "mode_manager.h"
#include "libmm-disp-apis.h"
#include "IQService.h"
using namespace android;
using namespace qService;
using namespace qhwc;
using namespace qmode;
namespace qQdcm {
//----------------------------------------------------------------------------
void qdcmInitContext(hwc_context_t *ctx)
{
loadQdcmLibrary(ctx);
}
void qdcmCloseContext(hwc_context_t *ctx)
{
if (ctx->mQdcmInfo.mQdcmMode) {
unloadQdcmLibrary(ctx);
}
}
void qdcmApplyDefaultAfterBootAnimationDone(hwc_context_t *ctx)
{
if (ctx->mQdcmInfo.mQdcmMode)
ctx->mQdcmInfo.mQdcmMode->applyDefaultMode(0);
}
static void qdcmSetActiveMode(hwc_context_t *ctx, const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
struct SET_MODE_PROP_IN params =
{ (disp_id_type)in->readInt32(), in->readInt32()};
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_SET_ACTIVE_MODE,
(void *)¶ms, (void *)NULL);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmSetDefaultMode(hwc_context_t *ctx, const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
struct SET_MODE_PROP_IN params =
{ (disp_id_type)in->readInt32(), in->readInt32()};
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_SET_DEFAULT_MODE,
(void *)¶ms, (void *)NULL);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmGetDefaultMode(hwc_context_t *ctx,
const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
int params = in->readInt32();
int modeid = 0;
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_GET_DEFAULT_MODE,
(const void *)¶ms, (void *)&modeid);
out->writeInt32(modeid);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmGetColorBalanceRange(hwc_context_t *ctx __unused,
const Parcel *in __unused, Parcel *out __unused)
{
}
static void qdcmGetColorBalance(hwc_context_t *ctx,
const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
int params = in->readInt32();
int warmness = 0;
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_GET_CB,
(const void *)¶ms, (void *)&warmness);
out->writeInt32(warmness);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmSetColorBalance(hwc_context_t *ctx,
const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
struct SET_CB_IN params =
{ (disp_id_type)in->readInt32(), in->readInt32() };
ALOGD_IF(QDCM_DEBUG, "%s dispID = %d, warmness = %d\n",
__FUNCTION__, params.id, params.warmness);
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_SET_CB,
(const void *)¶ms, NULL);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmSaveModeV2(hwc_context_t *ctx, const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
struct SAVE_DISPLAY_MODE_V2_IN params =
{ (disp_id_type)in->readInt32(),
in->readCString(),
(uint32_t)in->readInt32(),
in->readInt32()
};
int value = 0;
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_SAVE_MODE_V2,
(const void *)¶ms, (void *)&value);
out->writeInt32(value);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmSetPaConfig(hwc_context_t *ctx, const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
struct SET_PA_CONFIG_IN params;
params.id = (disp_id_type)in->readInt32();
params.pa.ops = in->readInt32();
params.pa.data.hue = in->readInt32();
params.pa.data.saturation = in->readInt32();
params.pa.data.value = in->readInt32();
params.pa.data.contrast = in->readInt32();
params.pa.data.sat_thresh = in->readInt32();
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_SET_PA_CONFIG,
(const void *)¶ms, NULL);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmGetPaConfig(hwc_context_t *ctx, const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
int params = in->readInt32();
struct disp_pa_config value;
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_GET_PA_CONFIG,
(const void *)¶ms, (void *)&value);
out->writeInt32(value.ops);
out->writeInt32(value.data.hue);
out->writeInt32(value.data.saturation);
out->writeInt32(value.data.value);
out->writeInt32(value.data.contrast);
out->writeInt32(value.data.sat_thresh);
out->writeInt32(ret); //return operation status via binder.
}
}
static void qdcmGetPaRange(hwc_context_t *ctx, const Parcel *in, Parcel *out)
{
int ret = 0;
if (ctx->mQdcmInfo.mQdcmMode && in && out) {
int params = in->readInt32();
struct disp_pa_range value;
ret = ctx->mQdcmInfo.mQdcmMode->requestRoute((int)CMD_GET_PA_RANGE,
(const void *)¶ms, (void *)&value);
out->writeInt32(value.max.hue);
out->writeInt32(value.max.saturation);
out->writeInt32(value.max.value);
out->writeInt32(value.max.contrast);
out->writeInt32(value.max.sat_thresh);
out->writeInt32(value.min.hue);
out->writeInt32(value.min.saturation);
out->writeInt32(value.min.value);
out->writeInt32(value.min.contrast);
out->writeInt32(value.min.sat_thresh);
out->writeInt32(ret); //return operation status via binder.
}
}
void qdcmCmdsHandler(hwc_context_t *ctx, const Parcel *in, Parcel *out)
{
int subcmd = in->readInt32();
ALOGD_IF(QDCM_DEBUG, "%s enter subcmd = %d\n", __FUNCTION__, subcmd);
switch (subcmd) {
case CMD_SET_ACTIVE_MODE:
qdcmSetActiveMode(ctx, in, out);
break;
case CMD_SET_DEFAULT_MODE:
qdcmSetDefaultMode(ctx, in, out);
break;
case CMD_GET_DEFAULT_MODE:
qdcmGetDefaultMode(ctx, in, out);
break;
case CMD_GET_CB_RANGE:
qdcmGetColorBalanceRange(ctx, in, out);
break;
case CMD_GET_CB:
qdcmGetColorBalance(ctx, in, out);
break;
case CMD_SET_CB:
qdcmSetColorBalance(ctx, in, out);
break;
case CMD_SAVE_MODE_V2:
qdcmSaveModeV2(ctx, in, out);
break;
case CMD_SET_PA_CONFIG:
qdcmSetPaConfig(ctx, in, out);
break;
case CMD_GET_PA_CONFIG:
qdcmGetPaConfig(ctx, in, out);
break;
case CMD_GET_PA_RANGE:
qdcmGetPaRange(ctx, in, out);
break;
}
}
} //namespace qQdcm