embox

Форк
0
122 строки · 2.3 Кб
1
/**
2
 * @file
3
 *
4
 * @date Jul 1, 2017
5
 * @author Anton Bondarev
6
 */
7

8
#include <errno.h>
9
#include <linux/fb.h>
10
#include <stddef.h>
11
#include <stdio.h>
12
#include <string.h>
13
#include <sys/types.h>
14
#include <sys/uio.h>
15

16
#include <drivers/char_dev.h>
17
#include <drivers/video/fb.h>
18
#include <framework/mod/options.h>
19
#include <mem/misc/pool.h>
20

21
#define DEV_POOL_SIZE OPTION_GET(NUMBER, dev_pool_size)
22

23
struct fb_dev {
24
	struct char_dev cdev;
25
	struct fb_info *info;
26
};
27

28
POOL_DEF(fb_dev_pool, struct fb_dev, DEV_POOL_SIZE);
29

30
static void *fb_direct_access(struct char_dev *cdev, off_t off, size_t len) {
31
	struct fb_info *info;
32

33
	info = ((struct fb_dev *)cdev)->info;
34

35
	assert(info);
36

37
	return info->screen_base;
38
}
39

40
static int fb_dev_ioctl(struct char_dev *cdev, int request, void *data) {
41
	struct fb_fix_screeninfo *finfo;
42
	struct fb_info *info;
43

44
	info = ((struct fb_dev *)cdev)->info;
45

46
	assert(info);
47
	assert(data);
48

49
	switch (request) {
50
	case FBIOGET_VSCREENINFO:
51
		memcpy(data, &info->var, sizeof(struct fb_var_screeninfo));
52
		break;
53
	case FBIOGET_FSCREENINFO:
54
		finfo = data;
55
		finfo->line_length = info->var.xres * (info->var.bits_per_pixel / 8);
56
		finfo->smem_start = (uintptr_t)info->screen_base;
57
		finfo->smem_len = info->screen_size;
58
		break;
59
	default:
60
		return -ENOSYS;
61
	}
62

63
	return ENOERR;
64
}
65

66
static ssize_t fb_read(struct char_dev *cdev, void *buf, size_t nbyte) {
67
	struct fb_info *info;
68

69
	info = ((struct fb_dev *)cdev)->info;
70

71
	assert(info);
72

73
	memcpy(buf, info->screen_base, nbyte);
74

75
	return nbyte;
76
}
77

78
static ssize_t fb_dev_write(struct char_dev *cdev, const void *buf,
79
    size_t nbyte) {
80
	struct fb_info *info;
81

82
	info = ((struct fb_dev *)cdev)->info;
83

84
	assert(info);
85

86
	memcpy(info->screen_base, buf, nbyte);
87

88
	return nbyte;
89
}
90

91
static const struct char_dev_ops fb_cdev_ops = {
92
    .read = fb_read,
93
    .write = fb_dev_write,
94
    .ioctl = fb_dev_ioctl,
95
    .direct_access = fb_direct_access,
96
};
97

98
/* TODO: fb_dev_destroy() */
99
int fb_devfs_create(struct fb_info *fbi, char *map_base, size_t map_size) {
100
	struct fb_dev *dev;
101
	int err;
102
	char name[NAME_MAX];
103

104
	assert(fbi);
105

106
	dev = pool_alloc(&fb_dev_pool);
107
	if (!dev) {
108
		return -ENOMEM;
109
	}
110

111
	dev->info = fbi;
112

113
	snprintf(name, sizeof(name), "fb%d", fbi->id);
114

115
	char_dev_init((struct char_dev *)dev, name, &fb_cdev_ops);
116

117
	if ((err = char_dev_register((struct char_dev *)dev))) {
118
		pool_free(&fb_dev_pool, dev);
119
	}
120

121
	return err;
122
}
123

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

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

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

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