| // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fcntl.h> |
| #include <linux/fb.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <sys/mman.h> |
| #include <sys/ioctl.h> |
| #include <unistd.h> |
| |
| int main(int argc, char *argv[]) |
| { |
| const char* device_name = "/dev/fb0"; |
| struct fb_var_screeninfo info; |
| uint32_t screen_size = 0; |
| void *ptr = NULL; |
| int fd = -1; |
| FILE *file = NULL; |
| int ret = -1; |
| |
| if (argc < 2) { |
| printf("Usage: getfb [filename]\n"); |
| printf("Writes the active framebuffer to output file [filename].\n"); |
| return 0; |
| } |
| |
| // Open the file for reading and writing |
| fd = open(device_name, O_RDONLY); |
| if (fd == -1) { |
| fprintf(stderr, "Cannot open framebuffer device %s\n", device_name); |
| goto exit; |
| } |
| printf("The framebuffer device was opened successfully.\n"); |
| |
| // Get fixed screen information |
| if (ioctl(fd, FBIOGET_VSCREENINFO, &info) == -1) { |
| fprintf(stderr, "Error reading variable screen information.\n"); |
| goto exit; |
| } |
| |
| printf("Framebuffer info: %dx%d, %dbpp\n", info.xres, info.yres, |
| info.bits_per_pixel); |
| |
| // Figure out the size of the screen in bytes |
| screen_size = info.xres * info.yres * info.bits_per_pixel / 8; |
| |
| // Map the device to memory |
| ptr = mmap(0, screen_size, PROT_READ, MAP_SHARED, fd, 0); |
| if (ptr == MAP_FAILED) { |
| fprintf(stderr, "Error: failed to map framebuffer device to memory.\n"); |
| goto exit; |
| } |
| printf("The framebuffer device was mapped to memory successfully.\n"); |
| |
| // Write it to output file. |
| file = fopen(argv[1], "w"); |
| if (!file) { |
| fprintf(stderr, "Could not open file %s for writing.\n", argv[1]); |
| goto exit; |
| } |
| |
| if (fwrite(ptr, screen_size, 1, file) < 1) { |
| fprintf(stderr, "Error while writing framebuffer to file.\n"); |
| goto exit; |
| } |
| |
| ret = 0; |
| |
| exit: |
| if (file) |
| fclose(file); |
| |
| if (ptr != MAP_FAILED && ptr) |
| munmap(ptr, screen_size); |
| |
| if (fd >= 0) |
| close(fd); |
| |
| return ret; |
| } |