16
#include <drivers/char_dev.h>
17
#include <drivers/video/fb.h>
18
#include <framework/mod/options.h>
19
#include <mem/misc/pool.h>
21
#define DEV_POOL_SIZE OPTION_GET(NUMBER, dev_pool_size)
28
POOL_DEF(fb_dev_pool, struct fb_dev, DEV_POOL_SIZE);
30
static void *fb_direct_access(struct char_dev *cdev, off_t off, size_t len) {
33
info = ((struct fb_dev *)cdev)->info;
37
return info->screen_base;
40
static int fb_dev_ioctl(struct char_dev *cdev, int request, void *data) {
41
struct fb_fix_screeninfo *finfo;
44
info = ((struct fb_dev *)cdev)->info;
50
case FBIOGET_VSCREENINFO:
51
memcpy(data, &info->var, sizeof(struct fb_var_screeninfo));
53
case FBIOGET_FSCREENINFO:
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;
66
static ssize_t fb_read(struct char_dev *cdev, void *buf, size_t nbyte) {
69
info = ((struct fb_dev *)cdev)->info;
73
memcpy(buf, info->screen_base, nbyte);
78
static ssize_t fb_dev_write(struct char_dev *cdev, const void *buf,
82
info = ((struct fb_dev *)cdev)->info;
86
memcpy(info->screen_base, buf, nbyte);
91
static const struct char_dev_ops fb_cdev_ops = {
93
.write = fb_dev_write,
94
.ioctl = fb_dev_ioctl,
95
.direct_access = fb_direct_access,
99
int fb_devfs_create(struct fb_info *fbi, char *map_base, size_t map_size) {
106
dev = pool_alloc(&fb_dev_pool);
113
snprintf(name, sizeof(name), "fb%d", fbi->id);
115
char_dev_init((struct char_dev *)dev, name, &fb_cdev_ops);
117
if ((err = char_dev_register((struct char_dev *)dev))) {
118
pool_free(&fb_dev_pool, dev);