1 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <fcntl.h>
6 #include <linux/fb.h>
7 #include <stdint.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <sys/mman.h>
11 #include <sys/ioctl.h>
12 #include <unistd.h>
13 
main(int argc,char * argv[])14 int main(int argc, char *argv[])
15 {
16   const char* device_name = "/dev/fb0";
17   struct fb_var_screeninfo info;
18   uint32_t screen_size = 0;
19   void *ptr = NULL;
20   int fd = -1;
21   FILE *file = NULL;
22   int ret = -1;
23 
24   if (argc < 2) {
25     printf("Usage: getfb [filename]\n");
26     printf("Writes the active framebuffer to output file [filename].\n");
27     return 0;
28   }
29 
30   // Open the file for reading and writing
31   fd = open(device_name, O_RDONLY);
32   if (fd == -1) {
33     fprintf(stderr, "Cannot open framebuffer device %s\n", device_name);
34     goto exit;
35   }
36   printf("The framebuffer device was opened successfully.\n");
37 
38   // Get fixed screen information
39   if (ioctl(fd, FBIOGET_VSCREENINFO, &info) == -1) {
40     fprintf(stderr, "Error reading variable screen information.\n");
41     goto exit;
42   }
43 
44   printf("Framebuffer info: %dx%d, %dbpp\n", info.xres, info.yres,
45          info.bits_per_pixel);
46 
47   // Figure out the size of the screen in bytes
48   screen_size = info.xres * info.yres * info.bits_per_pixel / 8;
49 
50   // Map the device to memory
51   ptr = mmap(0, screen_size, PROT_READ, MAP_SHARED, fd, 0);
52   if (ptr == MAP_FAILED) {
53     fprintf(stderr, "Error: failed to map framebuffer device to memory.\n");
54     goto exit;
55   }
56   printf("The framebuffer device was mapped to memory successfully.\n");
57 
58   // Write it to output file.
59   file = fopen(argv[1], "w");
60   if (!file) {
61     fprintf(stderr, "Could not open file %s for writing.\n", argv[1]);
62     goto exit;
63   }
64 
65   if (fwrite(ptr, screen_size, 1, file) < 1) {
66     fprintf(stderr, "Error while writing framebuffer to file.\n");
67     goto exit;
68   }
69 
70   ret = 0;
71 
72 exit:
73   if (file)
74     fclose(file);
75 
76   if (ptr != MAP_FAILED && ptr)
77     munmap(ptr, screen_size);
78 
79   if (fd >= 0)
80     close(fd);
81 
82   return ret;
83 }
84