xref: /aosp_15_r20/external/libkmsxx/utils/fbtest.cpp (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
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