6
#include "video/screen.h"
8
void screen_debug_info(struct fb_var_screeninfo inf) {
9
printf("Width: %d\n", inf.width);
10
printf("Height: %d\n", inf.height);
11
printf("Sync: %X\n", inf.sync);
12
printf("Colorspace: %d\n", inf.colorspace);
13
printf("Grayscale: %d\n", inf.grayscale);
14
printf("BPP: %d\n", inf.bits_per_pixel);
15
printf("VMODE: %x\n", inf.vmode);
16
printf("R: %d\n", inf.red.offset);
17
printf("G: %d\n", inf.green.offset);
18
printf("B: %d\n", inf.blue.offset);
19
printf("Transp: %d\n", inf.transp.offset);
22
koraidon_screen_t init_screen(const char* path) {
23
koraidon_screen_t screen = {0};
25
struct fb_var_screeninfo* screen_info = &(screen.real_info);
26
int fd = open(path, O_RDWR);
31
printf("Could not open framebuffer: %s\n", path);
32
return invalid_screen;
35
ioctl(fd, FBIOGET_VSCREENINFO, &(screen.real_info));
37
size_t screen_size = screen_info->width * screen_info->height * (screen_info->bits_per_pixel >> 3);
39
printf("Screen size: %d\n", screen_size);
41
uint8_t* screendata = mmap(0, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
44
printf("mmap() failed\n");
46
return invalid_screen;
50
screen.buffer = screendata;
51
screen.screen_size = screen_size;
53
if(screen.real_info.red.offset == 16) {
54
screen.pixfmt = SCREEN_BGR;
56
screen.pixfmt = SCREEN_RGB;
59
printf("Pixfmt: %d\n", screen.pixfmt);
63
screen.real_info.sync = !screen.real_info.sync;
64
ioctl(fd, FBIOPUT_VSCREENINFO, &(screen.real_info));
66
screen.real_info.sync = !screen.real_info.sync;
67
ioctl(fd, FBIOPUT_VSCREENINFO, &(screen.real_info));
69
screen_debug_info(screen.real_info);
74
void deinit_screen(koraidon_screen_t screen) {
75
munmap(screen.buffer, screen.screen_size);