copybit.cpp revision 8cfaf3511ae89c7dee6c64ec888a63b385e9d0c9
17510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/* 27510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 37510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * 47510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * you may not use this file except in compliance with the License. 67510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * You may obtain a copy of the License at 77510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * 87510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * 107510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * See the License for the specific language governing permissions and 147510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * limitations under the License. 157510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project */ 167510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 177510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 187510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#define LOG_TAG "copybit" 197510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 207510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <cutils/log.h> 217510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 227510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <linux/msm_mdp.h> 237510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <linux/fb.h> 247510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 257510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <stdint.h> 267510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <string.h> 277510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <unistd.h> 287510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <errno.h> 297510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <fcntl.h> 307510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 317510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <sys/ioctl.h> 327510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <sys/types.h> 337510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <sys/mman.h> 347510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 357510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project#include <hardware/copybit.h> 367510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 377510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/******************************************************************************/ 387510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 397510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** State information for each device instance */ 407510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstruct copybit_context_t { 417510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_device_t device; 427510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int mFD; 437510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project uint8_t mAlpha; 447510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project uint8_t mFlags; 457510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project}; 467510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 477510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** 487510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * Common hardware methods 497510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project */ 507510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 517510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int open_copybit(const struct hw_module_t* module, const char* name, 527510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct hw_device_t** device); 537510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 547510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic struct hw_module_methods_t copybit_module_methods = { 557510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .open = open_copybit 567510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project}; 577510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 587510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/* 597510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project * The COPYBIT Module 607510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project */ 617510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectconst struct copybit_module_t HAL_MODULE_INFO_SYM = { 627510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .common = { 637510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .tag = HARDWARE_MODULE_TAG, 647510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .version_major = 1, 657510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .version_minor = 0, 667510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .id = COPYBIT_HARDWARE_MODULE_ID, 677510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .name = "QCT MSM7K COPYBIT Module", 687510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .author = "Google, Inc.", 697510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project .methods = ©bit_module_methods, 707510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 717510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project}; 727510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 737510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/******************************************************************************/ 747510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 757510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** min of int a, b */ 767510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic inline int min(int a, int b) { 777510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return (a<b) ? a : b; 787510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 797510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 807510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** max of int a, b */ 817510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic inline int max(int a, int b) { 827510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return (a>b) ? a : b; 837510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 847510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 857510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** scale each parameter by mul/div. Assume div isn't 0 */ 867510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic inline void MULDIV(uint32_t *a, uint32_t *b, int mul, int div) { 877510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (mul != div) { 887510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project *a = (mul * *a) / div; 897510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project *b = (mul * *b) / div; 907510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 917510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 927510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 937510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** Determine the intersection of lhs & rhs store in out */ 947510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic void intersect(struct copybit_rect_t *out, 957510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const struct copybit_rect_t *lhs, 967510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const struct copybit_rect_t *rhs) { 977510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project out->l = max(lhs->l, rhs->l); 987510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project out->t = max(lhs->t, rhs->t); 997510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project out->r = min(lhs->r, rhs->r); 1007510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project out->b = min(lhs->b, rhs->b); 1017510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 1027510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1037510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** convert COPYBIT_FORMAT to MDP format */ 1047510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int get_format(int format) { 1057510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project switch (format) { 1067510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_RGBA_8888: return MDP_RGBA_8888; 1077510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_BGRA_8888: return MDP_BGRA_8888; 1087510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_RGB_565: return MDP_RGB_565; 1097510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_YCbCr_422_SP: return MDP_Y_CBCR_H2V1; 1107510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_YCbCr_420_SP: return MDP_Y_CBCR_H2V2; 1117510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 1127510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return -1; 1137510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 1147510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1157510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** convert from copybit image to mdp image structure */ 1167510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic void set_image(struct mdp_img *img, 1177510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const struct copybit_image_t *rhs) { 1187510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project img->width = rhs->w; 1197510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project img->height = rhs->h; 1207510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project img->format = get_format(rhs->format); 1217510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project img->offset = rhs->offset; 1227510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project img->memory_id = rhs->fd; 1237510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 1247510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1257510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** setup rectangles */ 1267510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic void set_rects(struct copybit_context_t *dev, 1277510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct mdp_blit_req *e, 1287510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const struct copybit_rect_t *dst, 1297510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const struct copybit_rect_t *src, 1307510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const struct copybit_rect_t *scissor) { 1317510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_rect_t clip; 1327510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project intersect(&clip, scissor, dst); 1337510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1347510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->dst_rect.x = clip.l; 1357510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->dst_rect.y = clip.t; 1367510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->dst_rect.w = clip.r - clip.l; 1377510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->dst_rect.h = clip.b - clip.t; 1387510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1397510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project uint32_t W, H; 1407510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 1417510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.x = (clip.t - dst->t) + src->t; 1427510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.y = (dst->r - clip.r) + src->l; 1437510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.w = (clip.b - clip.t); 1447510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.h = (clip.r - clip.l); 1457510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project W = dst->b - dst->t; 1467510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project H = dst->r - dst->l; 1477510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 1487510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.x = (clip.l - dst->l) + src->l; 1497510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.y = (clip.t - dst->t) + src->t; 1507510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.w = (clip.r - clip.l); 1517510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.h = (clip.b - clip.t); 1527510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project W = dst->r - dst->l; 1537510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project H = dst->b - dst->t; 1547510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 1557510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project MULDIV(&e->src_rect.x, &e->src_rect.w, src->r - src->l, W); 1567510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project MULDIV(&e->src_rect.y, &e->src_rect.h, src->b - src->t, H); 1577510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_V) { 1587510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.y = e->src.height - (e->src_rect.y + e->src_rect.h); 1597510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 1607510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_H) { 1617510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project e->src_rect.x = e->src.width - (e->src_rect.x + e->src_rect.w); 1627510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 1637510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 1647510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1657510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** setup mdp request */ 1667510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic void set_infos(struct copybit_context_t *dev, struct mdp_blit_req *req) { 1677510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project req->alpha = dev->mAlpha; 1687510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project req->transp_mask = MDP_TRANSP_NOP; 1697510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project req->flags = dev->mFlags; 1707510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 1717510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1727510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** copy the bits */ 1737510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int msm_copybit(struct copybit_context_t *dev, void const *list) 1747510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project{ 1757510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int err = ioctl(dev->mFD, MSMFB_BLIT, 1767510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project (struct mdp_blit_req_list const*)list); 1777510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project LOGE_IF(err<0, "copyBits failed (%s)", strerror(errno)); 1787510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (err == 0) 1797510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return 0; 1807510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project else 1817510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return -errno; 1827510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 1837510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1847510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/*****************************************************************************/ 1857510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 1867510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** Set a parameter to value */ 1877510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int set_parameter_copybit( 1887510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_device_t *dev, 1897510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int name, 1907510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int value) 1917510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project{ 1927510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 1937510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int status = 0; 1947510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (ctx) { 1957510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project switch(name) { 1967510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_ROTATION_DEG: 1977510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project switch (value) { 1987510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case 0: 1997510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags &= ~0x7; 2007510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2017510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case 90: 2027510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags &= ~0x7; 2037510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags |= MDP_ROT_90; 2047510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2057510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case 180: 2067510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags &= ~0x7; 2077510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags |= MDP_ROT_180; 2087510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2097510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case 270: 2107510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags &= ~0x7; 2117510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags |= MDP_ROT_270; 2127510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2137510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project default: 2147510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project LOGE("Invalid value for COPYBIT_ROTATION_DEG"); 2157510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = -EINVAL; 2167510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2177510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 2187510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2197510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_PLANE_ALPHA: 2207510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (value < 0) value = 0; 2217510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (value >= 256) value = 255; 2227510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mAlpha = value; 2237510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2247510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_DITHER: 2257510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (value == COPYBIT_ENABLE) { 2267510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags |= MDP_DITHER; 2277510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else if (value == COPYBIT_DISABLE) { 2287510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags &= ~MDP_DITHER; 2297510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 2307510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2318cfaf3511ae89c7dee6c64ec888a63b385e9d0c9Mathias Agopian case COPYBIT_BLUR: 2328cfaf3511ae89c7dee6c64ec888a63b385e9d0c9Mathias Agopian if (value == COPYBIT_ENABLE) { 2338cfaf3511ae89c7dee6c64ec888a63b385e9d0c9Mathias Agopian ctx->mFlags |= MDP_BLUR; 2348cfaf3511ae89c7dee6c64ec888a63b385e9d0c9Mathias Agopian } else if (value == COPYBIT_DISABLE) { 2358cfaf3511ae89c7dee6c64ec888a63b385e9d0c9Mathias Agopian ctx->mFlags &= ~MDP_BLUR; 2368cfaf3511ae89c7dee6c64ec888a63b385e9d0c9Mathias Agopian } 2378cfaf3511ae89c7dee6c64ec888a63b385e9d0c9Mathias Agopian break; 2387510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_TRANSFORM: 2397510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags &= ~0x7; 2407510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags |= value & 0x7; 2417510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2427510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project default: 2437510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = -EINVAL; 2447510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2457510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 2467510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 2477510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = -EINVAL; 2487510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 2497510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return status; 2507510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 2517510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 2527510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** Get a static info value */ 2537510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int get(struct copybit_device_t *dev, int name) 2547510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project{ 2557510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 2567510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int value; 2577510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (ctx) { 2587510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project switch(name) { 2597510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_MINIFICATION_LIMIT: 2607510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project value = 4; 2617510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2627510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_MAGNIFICATION_LIMIT: 2637510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project value = 4; 2647510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2657510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_SCALING_FRAC_BITS: 2667510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project value = 32; 2677510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2687510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_ROTATION_STEP_DEG: 2697510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project value = 90; 2707510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project break; 2717510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project default: 2727510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project value = -EINVAL; 2737510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 2747510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 2757510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project value = -EINVAL; 2767510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 2777510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return value; 2787510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 2797510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 2807510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** do a stretch blit type operation */ 2817510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int stretch_copybit( 2827510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_device_t *dev, 2837510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_image_t const *dst, 2847510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_image_t const *src, 2857510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_rect_t const *dst_rect, 2867510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_rect_t const *src_rect, 2877510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_region_t const *region) 2887510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project{ 2897510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 2907510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int status = 0; 2917510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (ctx) { 2927510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct { 2937510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project uint32_t count; 2947510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct mdp_blit_req req[12]; 2957510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } list; 2967510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 2977510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (ctx->mAlpha < 255) { 2987510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project switch (src->format) { 2997510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project // we don't support plane alpha with RGBA formats 3007510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_RGBA_8888: 3017510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_BGRA_8888: 3027510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_RGBA_5551: 3037510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project case COPYBIT_FORMAT_RGBA_4444: 3047510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return -EINVAL; 3057510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3067510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3077510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3087510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const uint32_t maxCount = sizeof(list.req)/sizeof(list.req[0]); 3097510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project const struct copybit_rect_t bounds = { 0, 0, dst->w, dst->h }; 3107510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_rect_t clip; 3117510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project list.count = 0; 3127510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = 0; 3137510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project while ((status == 0) && region->next(region, &clip)) { 3147510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project intersect(&clip, &bounds, &clip); 3157510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project set_infos(ctx, &list.req[list.count]); 3167510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project set_image(&list.req[list.count].dst, dst); 3177510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project set_image(&list.req[list.count].src, src); 3187510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project set_rects(ctx, &list.req[list.count], dst_rect, src_rect, &clip); 3197510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (++list.count == maxCount) { 3207510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = msm_copybit(ctx, &list); 3217510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project list.count = 0; 3227510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3237510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3247510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if ((status == 0) && list.count) { 3257510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = msm_copybit(ctx, &list); 3267510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3277510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 3287510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = -EINVAL; 3297510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3307510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return status; 3317510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 3327510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3337510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** Perform a blit type operation */ 3347510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int blit_copybit( 3357510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_device_t *dev, 3367510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_image_t const *dst, 3377510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_image_t const *src, 3387510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_region_t const *region) 3397510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project{ 3407510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_rect_t dr = { 0, 0, dst->w, dst->h }; 3417510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_rect_t sr = { 0, 0, src->w, src->h }; 3427510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return stretch_copybit(dev, dst, src, &dr, &sr, region); 3437510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 3447510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3457510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/*****************************************************************************/ 3467510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3477510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** Close the copybit device */ 3487510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int close_copybit(struct hw_device_t *dev) 3497510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project{ 3507510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 3517510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (ctx) { 3527510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project close(ctx->mFD); 3537510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project free(ctx); 3547510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3557510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return 0; 3567510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 3577510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3587510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project/** Open a new instance of a copybit device using name */ 3597510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Projectstatic int open_copybit(const struct hw_module_t* module, const char* name, 3607510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct hw_device_t** device) 3617510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project{ 3627510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project int status = -EINVAL; 3637510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct copybit_context_t *ctx = malloc(sizeof(struct copybit_context_t)); 3647510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project memset(ctx, 0, sizeof(*ctx)); 3657510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3667510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.common.tag = HARDWARE_DEVICE_TAG; 3677510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.common.version = 0; 3687510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.common.module = module; 3697510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.common.close = close_copybit; 3707510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.set_parameter = set_parameter_copybit; 3717510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.get = get; 3727510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.blit = blit_copybit; 3737510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->device.stretch = stretch_copybit; 3747510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mAlpha = MDP_ALPHA_NOP; 3757510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFlags = 0; 3767510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project ctx->mFD = open("/dev/graphics/fb0", O_RDWR, 0); 3777510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3787510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (ctx->mFD < 0) { 3797510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = errno; 3807510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project LOGE("Error opening frame buffer errno=%d (%s)", 3817510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status, strerror(status)); 3827510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = -status; 3837510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 3847510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project struct fb_fix_screeninfo finfo; 3857510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (ioctl(ctx->mFD, FBIOGET_FSCREENINFO, &finfo) == 0) { 3867510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (strcmp(finfo.id, "msmfb") == 0) { 3877510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project /* Success */ 3887510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = 0; 3897510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 3907510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project LOGE("Error not msm frame buffer"); 3917510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = -EINVAL; 3927510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3937510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 3947510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project LOGE("Error executing ioctl for screen info"); 3957510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project status = -errno; 3967510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3977510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 3987510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project 3997510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project if (status == 0) { 4007510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project *device = &ctx->device.common; 4017510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } else { 4027510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project close_copybit(&ctx->device.common); 4037510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project } 4047510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project return status; 4057510aaf4b3a3c545d943b09e0fb9f56ea2fc5e24The Android Open Source Project} 406