1*f0687c8aSRaman Tenneti #include <stdio.h>
2*f0687c8aSRaman Tenneti #include <stdlib.h>
3*f0687c8aSRaman Tenneti #include <string.h>
4*f0687c8aSRaman Tenneti #include <errno.h>
5*f0687c8aSRaman Tenneti #include <fcntl.h>
6*f0687c8aSRaman Tenneti #include <unistd.h>
7*f0687c8aSRaman Tenneti
8*f0687c8aSRaman Tenneti #include <sys/ioctl.h>
9*f0687c8aSRaman Tenneti #include <sys/stat.h>
10*f0687c8aSRaman Tenneti #include <sys/mman.h>
11*f0687c8aSRaman Tenneti
12*f0687c8aSRaman Tenneti #include <linux/fb.h>
13*f0687c8aSRaman Tenneti
14*f0687c8aSRaman Tenneti #include <kms++util/kms++util.h>
15*f0687c8aSRaman Tenneti
16*f0687c8aSRaman Tenneti using namespace kms;
17*f0687c8aSRaman Tenneti
main(int argc,char ** argv)18*f0687c8aSRaman Tenneti int main(int argc, char** argv)
19*f0687c8aSRaman Tenneti {
20*f0687c8aSRaman Tenneti const char* fbdev = "/dev/fb0";
21*f0687c8aSRaman Tenneti int r;
22*f0687c8aSRaman Tenneti
23*f0687c8aSRaman Tenneti int fd = open(fbdev, O_RDWR);
24*f0687c8aSRaman Tenneti FAIL_IF(fd < 0, "open %s failed\n", fbdev);
25*f0687c8aSRaman Tenneti
26*f0687c8aSRaman Tenneti struct fb_var_screeninfo var;
27*f0687c8aSRaman Tenneti
28*f0687c8aSRaman Tenneti r = ioctl(fd, FBIOGET_VSCREENINFO, &var);
29*f0687c8aSRaman Tenneti FAIL_IF(r, "FBIOGET_VSCREENINFO failed");
30*f0687c8aSRaman Tenneti
31*f0687c8aSRaman Tenneti struct fb_fix_screeninfo fix;
32*f0687c8aSRaman Tenneti
33*f0687c8aSRaman Tenneti r = ioctl(fd, FBIOGET_FSCREENINFO, &fix);
34*f0687c8aSRaman Tenneti FAIL_IF(r, "FBIOGET_FSCREENINFO failed");
35*f0687c8aSRaman Tenneti
36*f0687c8aSRaman Tenneti uint8_t* ptr = (uint8_t*)mmap(NULL,
37*f0687c8aSRaman Tenneti var.yres_virtual * fix.line_length,
38*f0687c8aSRaman Tenneti PROT_WRITE | PROT_READ,
39*f0687c8aSRaman Tenneti MAP_SHARED, fd, 0);
40*f0687c8aSRaman Tenneti
41*f0687c8aSRaman Tenneti FAIL_IF(ptr == MAP_FAILED, "mmap failed");
42*f0687c8aSRaman Tenneti
43*f0687c8aSRaman Tenneti ExtCPUFramebuffer buf(var.xres, var.yres, PixelFormat::XRGB8888,
44*f0687c8aSRaman Tenneti ptr, var.yres_virtual * fix.line_length, fix.line_length, 0);
45*f0687c8aSRaman Tenneti
46*f0687c8aSRaman Tenneti printf("%s: res %dx%d, virtual %dx%d, line_len %d\n",
47*f0687c8aSRaman Tenneti fbdev,
48*f0687c8aSRaman Tenneti var.xres, var.yres,
49*f0687c8aSRaman Tenneti var.xres_virtual, var.yres_virtual,
50*f0687c8aSRaman Tenneti fix.line_length);
51*f0687c8aSRaman Tenneti
52*f0687c8aSRaman Tenneti draw_test_pattern(buf);
53*f0687c8aSRaman Tenneti draw_text(buf, buf.width() / 2, 0, fbdev, RGB(255, 255, 255));
54*f0687c8aSRaman Tenneti
55*f0687c8aSRaman Tenneti close(fd);
56*f0687c8aSRaman Tenneti
57*f0687c8aSRaman Tenneti return 0;
58*f0687c8aSRaman Tenneti }
59