summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/console/fb_vga.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/console/fb_vga.c')
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/fb_vga.c245
1 files changed, 245 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/fb_vga.c b/c/src/lib/libbsp/i386/pc386/console/fb_vga.c
new file mode 100644
index 0000000000..29b840f728
--- /dev/null
+++ b/c/src/lib/libbsp/i386/pc386/console/fb_vga.c
@@ -0,0 +1,245 @@
+/*
+/////////////////////////////////////////////////////////////////////////////
+// $Header$
+//
+// Copyright (c) 2000 - Rosimildo da Silva ( rdasilva@connecttel.com )
+//
+// MODULE DESCRIPTION:
+// This module implements the micro FB driver for "Bare VGA". It uses the
+// routines for "bare hardware" that comes with MicroWindows.
+//
+// MODIFICATION/HISTORY:
+//
+// $Log$
+//
+/////////////////////////////////////////////////////////////////////////////
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+
+#include <bsp.h>
+#include <irq.h>
+#include <rtems/libio.h>
+
+#include <rtems/mw_fb.h>
+
+/* these routines are defined in the microwindows code. This
+ driver is here more as an example of how to implement and
+ use the micro FB interface
+*/
+extern void ega_hwinit( void );
+extern void ega_hwterm( void );
+
+
+/* screen information for the VGA driver */
+static struct fb_screeninfo fb_info =
+{
+ 640, 480, /* screen size x, y */
+ 4, /* bits per pixel */
+ 80, /* chars per line */
+ (volatile char *)0xA0000, /* buffer pointer */
+ 0x10000, /* buffer size */
+ FB_TYPE_VGA_PLANES, /* type of dsplay */
+ FB_VISUAL_PSEUDOCOLOR /* color scheme used */
+};
+
+
+static __u16 red16[] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff
+};
+static __u16 green16[] = {
+ 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x5555, 0xaaaa,
+ 0x5555, 0x5555, 0xffff, 0xffff, 0x5555, 0x5555, 0xffff, 0xffff
+};
+static __u16 blue16[] = {
+ 0x0000, 0xaaaa, 0x0000, 0xaaaa, 0x0000, 0xaaaa, 0x0000, 0xaaaa,
+ 0x5555, 0xffff, 0x5555, 0xffff, 0x5555, 0xffff, 0x5555, 0xffff
+};
+
+/*
+ * fbvga device driver INITIALIZE entry point.
+ */
+rtems_device_driver
+fbvga_initialize( rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
+{
+ rtems_status_code status;
+
+ printk( "FBVGA -- driver initializing..\n" );
+ /*
+ * Register the device
+ */
+ status = rtems_io_register_name ("/dev/fb0", major, 0);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ printk("Error registering FBVGA device!\n");
+ rtems_fatal_error_occurred( status );
+ }
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/*
+ * fbvga device driver OPEN entry point
+ */
+rtems_device_driver
+fbvga_open( rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
+{
+/* rtems_status_code status; */
+ printk( "FBVGA open called.\n" );
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * fbvga device driver CLOSE entry point
+ */
+rtems_device_driver
+fbvga_close(rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
+{
+ printk( "FBVGA close called.\n" );
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/*
+ * fbvga device driver READ entry point.
+ * Read characters from the PS/2 mouse.
+ */
+rtems_device_driver
+fbvga_read( rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
+{
+ rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
+ printk( "FBVGA read called.\n" );
+ rw_args->bytes_moved = 0;
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/*
+ * fbvga device driver WRITE entry point.
+ * Write characters to the PS/2 mouse.
+ */
+rtems_device_driver
+fbvga_write( rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg)
+{
+ rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
+ printk( "FBVGA write called.\n" );
+ rw_args->bytes_moved = 0;
+ return RTEMS_SUCCESSFUL;
+}
+
+
+static int get_screen_info( struct fb_screeninfo *info )
+{
+ *info = fb_info;
+ return 0;
+}
+
+
+static int get_palette( struct fb_cmap *cmap )
+{
+ __u32 i;
+
+ if( cmap->start + cmap->len >= 16 )
+ return 1;
+
+ for( i = 0; i < cmap->len; i++ )
+ {
+ cmap->red[ cmap->start + i ] = red16[ cmap->start + i ];
+ cmap->green[ cmap->start + i ] = green16[ cmap->start + i ];
+ cmap->blue[ cmap->start + i ] = blue16[ cmap->start + i ];
+ }
+ return 0;
+}
+
+
+static int set_palette( struct fb_cmap *cmap )
+{
+ __u32 i;
+
+ if( cmap->start + cmap->len >= 16 )
+ return 1;
+
+ for( i = 0; i < cmap->len; i++ )
+ {
+ red16[ cmap->start + i ] = cmap->red[ cmap->start + i ];
+ green16[ cmap->start + i ] = cmap->green[ cmap->start + i ];
+ blue16[ cmap->start + i ] = cmap->blue[ cmap->start + i ];
+ }
+ return 0;
+}
+
+
+/*
+ * IOCTL entry point -- This method is called to carry
+ * all services of this interface.
+ */
+rtems_device_driver
+fbvga_control( rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_ioctl_args_t *args = arg;
+ printk( "FBVGA ioctl called, cmd=%x\n", args->command );
+ switch( args->command )
+ {
+ case FB_SCREENINFO:
+ args->ioctl_return = get_screen_info( args->buffer );
+ break;
+ case FB_GETPALETTE:
+ args->ioctl_return = get_palette( args->buffer );
+ break;
+ case FB_SETPALETTE:
+ args->ioctl_return = set_palette( args->buffer );
+ break;
+
+ /* this function would execute one of the routines of the
+ * interface based on the operation requested
+ */
+ case FB_EXEC_FUNCTION:
+ {
+ struct fb_exec_function *env = args->buffer;
+ switch( env->func_no )
+ {
+ case FB_FUNC_ENTER_GRAPHICS:
+ /* enter graphics mode*/
+ ega_hwinit();
+ break;
+
+ case FB_FUNC_EXIT_GRAPHICS:
+ /* leave graphics mode*/
+ ega_hwterm();
+ break;
+
+ case FB_FUNC_IS_DIRTY:
+ break;
+
+ case FB_FUNC_GET_MODE:
+ break;
+
+ default:
+ break;
+ }
+ }
+ /* no break on purpose */
+ default:
+ args->ioctl_return = 0;
+ break;
+
+ }
+ return RTEMS_SUCCESSFUL;
+}