framebuffer_service.c

来自「Android 一些工具」· C语言 代码 · 共 70 行

C
70
字号
/* * Copyright (C) 2007 The Android Open Source Project * * 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 <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <cutils/fdevent.h>#include "adb.h"#include <linux/fb.h>#include <sys/mman.h>/* TODO:** - grab the current buffer, not the first buffer** - sync with vsync to avoid tearing*/void framebuffer_service(int fd, void *cookie){    struct fb_var_screeninfo vinfo;    int fb;    void *ptr = MAP_FAILED;    char x;        unsigned fbinfo[4];        fb = open("/dev/graphics/fb0", O_RDONLY);    if(fb < 0) goto done;    if(ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) < 0) goto done;    fcntl(fb, F_SETFD, FD_CLOEXEC);    fbinfo[0] = 16;    fbinfo[1] = vinfo.xres * vinfo.yres * 2;    fbinfo[2] = vinfo.xres;    fbinfo[3] = vinfo.yres;    ptr = mmap(0, fbinfo[1], PROT_READ, MAP_SHARED, fb, 0);    if(ptr == MAP_FAILED) goto done;        if(writex(fd, fbinfo, sizeof(unsigned) * 4)) goto done;    for(;;) {        if(readx(fd, &x, 1)) goto done;        if(writex(fd, ptr, fbinfo[1])) goto done;    }    done:    if(ptr != MAP_FAILED) munmap(ptr, fbinfo[1]);    if(fb >= 0) close(fb);    close(fd);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?