12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2013-2014, 2016, The Linux Foundation. All rights reserved. 32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without 52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* modification, are permitted provided that the following conditions are 62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* met: 72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions of source code must retain the above copyright 82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* notice, this list of conditions and the following disclaimer. 92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions in binary form must reproduce the above 102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* copyright notice, this list of conditions and the following 112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* disclaimer in the documentation and/or other materials provided 122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* with the distribution. 132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Neither the name of The Linux Foundation. nor the names of its 142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* contributors may be used to endorse or promote products derived 152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* from this software without specific prior written permission. 162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/ 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <fcntl.h> 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <stdio.h> 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <sys/types.h> 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <sys/stat.h> 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <unistd.h> 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <display_config.h> 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <QServiceUtils.h> 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <qd_utils.h> 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelusing namespace android; 402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelusing namespace qService; 412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace qdutils { 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel//============================================================================= 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// The functions below run in the client process and wherever necessary 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// do a binder call to HWC to get/set data. 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint isExternalConnected(void) { 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int ret; 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::CHECK_EXTERNAL_STATUS, 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel , &outParcel); 562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err) { 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err); 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ret = err; 602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ret = outParcel.readInt32(); 622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return ret; 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getDisplayAttributes(int dpy, DisplayAttributes_t& dpyattr) { 672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(dpy); 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::GET_DISPLAY_ATTRIBUTES, 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.vsync_period = outParcel.readInt32(); 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.xres = outParcel.readInt32(); 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.yres = outParcel.readInt32(); 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.xdpi = outParcel.readFloat(); 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.ydpi = outParcel.readFloat(); 819e9ad6589a3244caa2b310b0a7a115210c6ab235Thierry Strudel dpyattr.panel_type = outParcel.readInt32(); 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setHSIC(int dpy, const HSICData_t& hsic_data) { 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(dpy); 932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(hsic_data.hue); 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeFloat(hsic_data.saturation); 952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(hsic_data.intensity); 962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeFloat(hsic_data.contrast); 972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::SET_HSIC_DATA, &inParcel, &outParcel); 992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err) 1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err); 1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getDisplayVisibleRegion(int dpy, hwc_rect_t &rect) { 1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(dpy); 1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::GET_DISPLAY_VISIBLE_REGION, 1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect.left = outParcel.readInt32(); 1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect.top = outParcel.readInt32(); 1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect.right = outParcel.readInt32(); 1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect.bottom = outParcel.readInt32(); 1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s: Failed to getVisibleRegion for dpy =%d: err = %d", 1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel __FUNCTION__, dpy, err); 1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setViewFrame(int dpy, int l, int t, int r, int b) { 1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(dpy); 1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(l); 1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(t); 1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(r); 1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(b); 1352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::SET_VIEW_FRAME, 1382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err) 1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s: Failed to set view frame for dpy %d err=%d", 1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel __FUNCTION__, dpy, err); 1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 1452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setSecondaryDisplayStatus(int dpy, uint32_t status) { 1482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 1492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 1502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 1512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(dpy); 1522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(status); 1532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 1552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::SET_SECONDARY_DISPLAY_STATUS, 1562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 1572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err) 1592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s: Failed for dpy %d status = %d err=%d", __FUNCTION__, dpy, 1602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status, err); 1612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 1632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint configureDynRefreshRate(uint32_t op, uint32_t refreshRate) { 1662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 1672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 1682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 1692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(op); 1702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(refreshRate); 1712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 1732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::CONFIGURE_DYN_REFRESH_RATE, 1742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 1752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err) 1782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s: Failed setting op %d err=%d", __FUNCTION__, op, err); 1792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 1812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getConfigCount(int /*dpy*/) { 1842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int numConfigs = -1; 1852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 1862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 1872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 1882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(DISPLAY_PRIMARY); 1892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = binder->dispatch(IQService::GET_CONFIG_COUNT, 1902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 1912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 1922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel numConfigs = outParcel.readInt32(); 1932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGI("%s() Received num configs %d", __FUNCTION__, numConfigs); 1942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 1952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 1962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return numConfigs; 1992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getActiveConfig(int /*dpy*/) { 2022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int configIndex = -1; 2032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 2042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 2052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 2062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(DISPLAY_PRIMARY); 2072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = binder->dispatch(IQService::GET_ACTIVE_CONFIG, 2082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 2092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 2102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel configIndex = outParcel.readInt32(); 2112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGI("%s() Received active config index %d", __FUNCTION__, 2122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel configIndex); 2132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 2142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 2152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return configIndex; 2182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setActiveConfig(int configIndex, int /*dpy*/) { 2212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 2222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 2232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 2242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 2252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(configIndex); 2262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(DISPLAY_PRIMARY); 2272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::SET_ACTIVE_CONFIG, 2282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 2292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 2302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGI("%s() Successfully set active config index %d", __FUNCTION__, 2312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel configIndex); 2322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 2332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 2342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 2372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayAttributes getDisplayAttributes(int configIndex, int /*dpy*/) { 2409e9ad6589a3244caa2b310b0a7a115210c6ab235Thierry Strudel DisplayAttributes dpyattr = {}; 2412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 2422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 2432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 2442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(configIndex); 2452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(DISPLAY_PRIMARY); 2462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = binder->dispatch( 2472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel IQService::GET_DISPLAY_ATTRIBUTES_FOR_CONFIG, &inParcel, 2482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &outParcel); 2492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 2502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.vsync_period = outParcel.readInt32(); 2512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.xres = outParcel.readInt32(); 2522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.yres = outParcel.readInt32(); 2532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.xdpi = outParcel.readFloat(); 2542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.ydpi = outParcel.readFloat(); 2559e9ad6589a3244caa2b310b0a7a115210c6ab235Thierry Strudel dpyattr.panel_type = outParcel.readInt32(); 2562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dpyattr.is_yuv = outParcel.readInt32(); 2572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGI("%s() Received attrs for index %d: xres %d, yres %d", 2582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel __FUNCTION__, configIndex, dpyattr.xres, dpyattr.yres); 2592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 2602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 2612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return dpyattr; 2642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setPanelMode(int mode) { 2672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 2682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 2692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 2702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 2712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(mode); 2722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::SET_DISPLAY_MODE, 2732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 2742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 2752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGI("%s() Successfully set the display mode to %d", __FUNCTION__, 2762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel mode); 2772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 2782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 2792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 2822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setPanelBrightness(int level) { 2852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 2862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 2872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 2882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 2902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(level); 2912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = binder->dispatch(IQService::SET_PANEL_BRIGHTNESS, 2922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 2932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err) { 2942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 2952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 2982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getPanelBrightness() { 3012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int panel_brightness = -1; 3022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 3032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 3042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 3062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = binder->dispatch(IQService::GET_PANEL_BRIGHTNESS, 3072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 3082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(!err) { 3092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel panel_brightness = outParcel.readInt32(); 3102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGI("%s() Current panel brightness value %d", __FUNCTION__, 3112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel panel_brightness); 3122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 3132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 3142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return panel_brightness; 3172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}// namespace 3202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// ---------------------------------------------------------------------------- 3222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Functions for linking dynamically to libqdutils 3232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// ---------------------------------------------------------------------------- 3242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelextern "C" int minHdcpEncryptionLevelChanged(int dpy, int min_enc_level) { 3252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 3262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 3272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 3282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(dpy); 3292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(min_enc_level); 3302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 3322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED, 3332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &inParcel, &outParcel); 3342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err) { 3372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s: Failed for dpy %d err=%d", __FUNCTION__, dpy, err); 3382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 3392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = outParcel.readInt32(); 3402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 3432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelextern "C" int refreshScreen() { 3462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int ret = 0; 3472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ret = screenRefresh(); 3482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return ret; 3492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelextern "C" int controlPartialUpdate(int dpy, int mode) { 3522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t err = (status_t) FAILED_TRANSACTION; 3532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel sp<IQService> binder = getBinder(); 3542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(binder != NULL) { 3552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel inParcel, outParcel; 3562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(dpy); 3572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel.writeInt32(mode); 3582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel err = binder->dispatch(IQService::CONTROL_PARTIAL_UPDATE, &inParcel, &outParcel); 3592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(err != 0) { 3602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ALOGE("%s() failed with err %d", __FUNCTION__, err); 3612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 3622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return outParcel.readInt32(); 3632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return err; 3672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 369