embox

Форк
0
97 строк · 2.6 Кб
1
/**
2
 * @file
3
 *
4
 * @date 24.01.13
5
 * @author Ilia Vaprol
6
 */
7

8
#include <errno.h>
9
#include <string.h>
10
#include <sys/mman.h>
11

12
#include <drivers/pci/pci.h>
13
#include <drivers/pci/pci_driver.h>
14

15
#include <drivers/video/fb.h>
16
#include <drivers/video/vbe.h>
17

18
#include <util/log.h>
19
#include <util/binalign.h>
20
#include <framework/mod/options.h>
21
#include <mem/page.h>
22

23
PCI_DRIVER("bochs", bochs_init, PCI_VENDOR_ID_BOCHS, PCI_DEV_ID_BOCHS_VGA);
24

25
static int bochs_set_var(struct fb_info *info, const struct fb_var_screeninfo *var) {
26
	if (var->xres > VBE_DISPI_MAX_XRES
27
			|| var->yres > VBE_DISPI_MAX_YRES
28
			|| var->bits_per_pixel > VBE_DISPI_MAX_BPP) {
29
		return -EINVAL;
30
	}
31

32
	vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);
33
	vbe_write(VBE_DISPI_INDEX_XRES, var->xres);
34
	vbe_write(VBE_DISPI_INDEX_YRES, var->yres);
35
	vbe_write(VBE_DISPI_INDEX_BPP, var->bits_per_pixel);
36
	vbe_write(VBE_DISPI_INDEX_VIRT_WIDTH, var->xres_virtual);
37
	vbe_write(VBE_DISPI_INDEX_VIRT_HEIGHT, var->yres_virtual);
38
	vbe_write(VBE_DISPI_INDEX_X_OFFSET, var->xoffset);
39
	vbe_write(VBE_DISPI_INDEX_Y_OFFSET, var->yoffset);
40
	vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED);
41

42
	return 0;
43
}
44

45
static int bochs_get_var(struct fb_info *info, struct fb_var_screeninfo *var) {
46

47
	memset(var, 0, sizeof(struct fb_var_screeninfo));
48

49
	var->xres           = vbe_read(VBE_DISPI_INDEX_XRES);
50
	var->yres           = vbe_read(VBE_DISPI_INDEX_YRES);
51
	var->bits_per_pixel = vbe_read(VBE_DISPI_INDEX_BPP);
52
	var->xres_virtual   = vbe_read(VBE_DISPI_INDEX_VIRT_WIDTH);
53
	var->yres_virtual   = vbe_read(VBE_DISPI_INDEX_VIRT_HEIGHT);
54
	var->xoffset        = vbe_read(VBE_DISPI_INDEX_X_OFFSET);
55
	var->yoffset        = vbe_read(VBE_DISPI_INDEX_Y_OFFSET);
56

57
	switch (var->bits_per_pixel) {
58
	case 16:
59
		var->fmt = BGR565;
60
		break;
61
	case 32:
62
		var->fmt = RGBA8888;
63
		break;
64
	default:
65
		log_error("Unsupported bpp = %d\n", var->bits_per_pixel);
66
		return -1;
67
	}
68

69
	return 0;
70
}
71

72
static const struct fb_ops bochs_ops = {
73
	.fb_set_var = bochs_set_var,
74
	.fb_get_var = bochs_get_var,
75
};
76

77
static int bochs_init(struct pci_slot_dev *pci_dev) {
78
	char *mmap_base = (char *)(pci_dev->bar[0] & ~0xf); /* FIXME */
79
	size_t mmap_len = binalign_bound(VBE_DISPI_MAX_XRES
80
			* VBE_DISPI_MAX_YRES
81
			* VBE_DISPI_MAX_BPP / 8, PAGE_SIZE());
82
	struct fb_info *info;
83

84
	if (MAP_FAILED == mmap_device_memory(mmap_base, mmap_len,
85
	        PROT_READ | PROT_WRITE | PROT_NOCACHE, MAP_FIXED,
86
	        (uintptr_t)mmap_base)) {
87
		return -EIO;
88
	}
89

90
	info = fb_create(&bochs_ops, mmap_base, mmap_len);
91
	if (info == NULL) {
92
		munmap(mmap_base, mmap_len);
93
		return -ENOMEM;
94
	}
95

96
	return 0;
97
}
98

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

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

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

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