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 + -
显示快捷键?