You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
6.6 KiB
220 lines
6.6 KiB
/*
|
|
* Copyright (C) 2023 Fuzhou Rockchip 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.
|
|
*/
|
|
|
|
#include <cutils/properties.h>
|
|
#include "rk_hwc_proxy_client.h"
|
|
|
|
namespace aidl::rockchip::hwc::proxy::aidl {
|
|
|
|
RkHwcProxyClient::RkHwcProxyClient() {
|
|
};
|
|
|
|
RkHwcProxyClient::~RkHwcProxyClient() {
|
|
};
|
|
|
|
int RkHwcProxyClient::setup() {
|
|
const std::string instance = std::string() + IRkHwcProxyAidl::descriptor + "/default";
|
|
client = IRkHwcProxyAidl::fromBinder(SpAIBinder(AServiceManager_waitForService(instance.c_str())));
|
|
if (client == nullptr) {
|
|
ALOGE("Failed to get rkhwcproxy aidl service");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void RkHwcProxyClient::run(const RkHwcProxyAidlRequest& req, RkHwcProxyAidlResponse* resp) {
|
|
client->run(req, resp);
|
|
}
|
|
|
|
int RkHwcProxyClient::getResolutionInfo(int dpy, char* resolution) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_GET_RESOLUTION;
|
|
std::vector<uint8_t> data(1);//dpy
|
|
data[0] = dpy;
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
for (int i = 0; i < 256; i++) {
|
|
resolution[i] = response->value[i];
|
|
ALOGD("getResolutionInfo: %s", resolution);
|
|
}
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::setGamma(int dpy, uint32_t size, uint16_t* r, uint16_t* g, uint16_t* b) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_SET_GAMMA;
|
|
drm_gamma gamma;
|
|
gamma.dpy = dpy;
|
|
gamma.size = size;
|
|
for (int i = 0; i < size; i++) {
|
|
gamma.red[i] = r[i];
|
|
gamma.green[i] = g[i];
|
|
gamma.blue[i] = b[i];
|
|
}
|
|
request.req_len = sizeof(gamma);
|
|
std::vector<uint8_t> data((uint8_t*)&gamma, (uint8_t*)&gamma + sizeof(gamma));
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ALOGD("setGamma ret %d", response->value[0]);
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::set3DLut(int dpy, uint32_t size, uint16_t* r, uint16_t* g, uint16_t* b) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_SET_3DLUT;
|
|
drm_cubic cubic;
|
|
cubic.dpy = dpy;
|
|
cubic.size = size;
|
|
for (int i = 0; i < size; i++) {
|
|
cubic.red[i] = r[i];
|
|
cubic.green[i] = g[i];
|
|
cubic.blue[i] = b[i];
|
|
}
|
|
request.req_len = sizeof(cubic);
|
|
std::vector<uint8_t> data((uint8_t*)&cubic, (uint8_t*)&cubic + sizeof(cubic));
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ALOGD("set3DLut ret %d", response->value[0]);
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::set_hdcp_enable(int dpy, bool enable) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_SET_HDCP_ENABLE;
|
|
std::vector<uint8_t> data(2);//dpy
|
|
data[0] = dpy;
|
|
data[1] = enable;
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::get_hdcp_enable_status(int dpy) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_GET_HDCP_ENABLE_STATUS;
|
|
std::vector<uint8_t> data(1);//dpy
|
|
data[0] = dpy;
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::set_hdcp_type(int dpy, int type) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_SET_HDCP_TYPE;
|
|
std::vector<uint8_t> data(2);//dpy
|
|
data[0] = dpy;
|
|
data[1] = type;
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::get_hdcp_encrypted_status(int dpy) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_GET_HDCP_ENABLE_STATUS;
|
|
std::vector<uint8_t> data(1);//dpy
|
|
data[0] = dpy;
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::set_dvi_status(int dpy, int value) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_SET_DVI_STATUS;
|
|
std::vector<uint8_t> data(2);//dpy
|
|
data[0] = dpy;
|
|
data[1] = value;
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int RkHwcProxyClient::get_dvi_status(int dpy) {
|
|
int ret = 0;
|
|
RkHwcProxyAidlRequest request;
|
|
RkHwcProxyAidlResponse *response = new RkHwcProxyAidlResponse();
|
|
request.id = CMD_GET_DVI_STATUS;
|
|
std::vector<uint8_t> data(1);//dpy
|
|
data[0] = dpy;
|
|
request.data = data;
|
|
run(request, response);
|
|
if (response != nullptr && !response->value.empty() && response->id == request.id) {
|
|
ret = response->value[0];
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
}
|