Koraidon

Форк
0
/
screen.c 
77 строк · 2.0 Кб
1
#include <fcntl.h>
2
#include <stdio.h>
3
#include <unistd.h>
4
#include <sys/mman.h>
5

6
#include "video/screen.h"
7

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);
20
}
21

22
koraidon_screen_t init_screen(const char* path) {
23
    koraidon_screen_t screen = {0};
24
    
25
    struct fb_var_screeninfo* screen_info = &(screen.real_info);
26
    int fd = open(path, O_RDWR);
27

28
    screen.fd = fd;
29

30
    if(fd < 0) {
31
        printf("Could not open framebuffer: %s\n", path);
32
        return invalid_screen;
33
    }
34

35
    ioctl(fd, FBIOGET_VSCREENINFO, &(screen.real_info));
36

37
    size_t screen_size = screen_info->width * screen_info->height * (screen_info->bits_per_pixel >> 3);
38

39
	printf("Screen size: %d\n", screen_size);
40

41
    uint8_t* screendata = mmap(0, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
42

43
    if(!screendata) {
44
        printf("mmap() failed\n");
45

46
        return invalid_screen;
47
    }
48

49
    screen.ok = 1;
50
    screen.buffer = screendata;
51
    screen.screen_size = screen_size;
52

53
    if(screen.real_info.red.offset == 16) {
54
        screen.pixfmt = SCREEN_BGR;
55
    } else {
56
        screen.pixfmt = SCREEN_RGB;
57
    }
58

59
	printf("Pixfmt: %d\n", screen.pixfmt);
60

61
    // Double-Flip our screen to fully initialize it.
62

63
    screen.real_info.sync = !screen.real_info.sync;
64
    ioctl(fd, FBIOPUT_VSCREENINFO, &(screen.real_info));
65

66
    screen.real_info.sync = !screen.real_info.sync;
67
    ioctl(fd, FBIOPUT_VSCREENINFO, &(screen.real_info));
68

69
    screen_debug_info(screen.real_info);
70

71
    return screen;
72
}
73

74
void deinit_screen(koraidon_screen_t screen) {
75
    munmap(screen.buffer, screen.screen_size);
76
    close(screen.fd);
77
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.