diff --git a/devices/Makefile.inc b/devices/Makefile.inc index 24f4678..4e19edb 100644 --- a/devices/Makefile.inc +++ b/devices/Makefile.inc @@ -1,4 +1,5 @@ DEVICES_PREFIX = devices -KOBJS += $(DEVICES_PREFIX)/pl110.o KOBJS += $(DEVICES_PREFIX)/pl011.o +KOBJS += $(DEVICES_PREFIX)/pl110.o +KOBJS += $(DEVICES_PREFIX)/pl111.o diff --git a/devices/pl111.c b/devices/pl111.c new file mode 100644 index 0000000..ec3cb10 --- /dev/null +++ b/devices/pl111.c @@ -0,0 +1,54 @@ +#include + +typedef unsigned int uint32; + +#define PL111_CR_EN 0x001 +#define PL111_CR_PWR 0x800 +#define PL111_IOBASE 0x10020000 +#define PL111_PALBASE (PL111_IOBASE + 0x200) +#define PL111_FB_BASE 0x200000; + +struct pl111_control { + uint32 volatile timing0; //0 + uint32 volatile timing1; //4 + uint32 volatile timing2; //8 + uint32 volatile timing3; //c + uint32 volatile upbase; //10 + uint32 volatile lpbase; //14 + uint32 volatile control; //18 +}; + +struct fbdev pl111_fb_device; + +int pl111_init(struct fb *f, unsigned int color_depth) { + struct pl111_control *plio = (struct pl111_control*)PL111_IOBASE; + + /* 640x480 pixels */ + plio->timing0 = 0x3f1f3f9c; + plio->timing1 = 0x080b61df; + plio->upbase = PL111_FB_BASE; + + if (color_depth == FB_COLOR_DEPTH_8) { + plio->control = 0x1827; + } else if (color_depth == FB_COLOR_DEPTH_16) { + plio->control = 0x1829; + } else if (color_depth == FB_COLOR_DEPTH_24) { + plio->control = 0x182B; + } else { + //assume 16 if nothing else fit + color_depth = 16; + plio->control = 0x1829; + } + + f->device = &pl111_fb_device; + f->device->fbaddr = (void*)PL111_FB_BASE; + f->width = 640; + f->device->pixelwidth = 640; + f->height = 480; + f->device->pixelheight = 480; + + f->color_depth = color_depth; + f->device->color_depth = color_depth; + + return 0; +} diff --git a/include/devices/pl111.h b/include/devices/pl111.h new file mode 100644 index 0000000..3aa030d --- /dev/null +++ b/include/devices/pl111.h @@ -0,0 +1,3 @@ +#include + +int pl111_init(struct fb *f, unsigned int color_depth); diff --git a/kernel/start_kernel.c b/kernel/start_kernel.c index 0a7e06a..ff09084 100644 --- a/kernel/start_kernel.c +++ b/kernel/start_kernel.c @@ -1,7 +1,7 @@ #include #include -#include +#include #include #include @@ -9,7 +9,7 @@ struct fb myfb; void video(void) { // unsigned int x, y; - pl110_init(&myfb, 24); + pl111_init(&myfb, 24); // x = 0, y = 0; // for (y=0; y<480; y++) // for (x=0; x<640; x++)