⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fb_vga.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/*/////////////////////////////////////////////////////////////////////////////// $Header: /usr1/CVS/rtems/c/src/lib/libbsp/i386/pc386/console/fb_vga.c,v 1.1 2000/08/30 08:15:30 joel Exp $//// 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: fb_vga.c,v $// Revision 1.1  2000/08/30 08:15:30  joel// 2000-08-26  Rosimildo da Silva  <rdasilva@connecttel.com>//// 	* Major rework of the "/dev/console" driver.// 	* Added termios support for stdin ( keyboard ).// 	* Added ioctls() to support modes similar to Linux( XLATE,// 	RAW, MEDIUMRAW ).// 	* Added Keyboard mapping and handling of the keyboard's leds.// 	* Added Micro FrameBuffer driver ( "/dev/fb0" ) for bare VGA// 	controller ( 16 colors ).// 	* Added PS/2 and Serial mouse support for PC386 BSP.// 	* console/defkeymap.c: New file.// 	* console/fb_vga.c: New file.// 	* console/fb_vga.h: New file.// 	* console/i386kbd.h: New file.// 	* console/kd.h: New file.// 	* console/keyboard.c: New file.// 	* console/keyboard.h: New file.// 	* console/mouse_parser.c: New file.// 	* console/mouse_parser.h: New file.// 	* console/pc_keyb.c: New file.// 	* console/ps2_drv.h: New file.// 	* console/ps2_mouse.c: New file.// 	* console/ps2_mouse.h: New file.// 	* console/serial_mouse.c: New file.// 	* console/serial_mouse.h: New file.// 	* console/vgainit.c: New file.// 	* console/vt.c: New file.// 	* console/Makefile.am: Reflect new files.// 	* console/console.c, console/inch.c, console/outch.c: Console// 	functionality modifications.// 	* startup/Makefile.am: Pick up tty_drv.c and gdb_glue.c/////////////////////////////////////////////////////////////////////////////////*/#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_driverfbvga_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_driverfbvga_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_driverfbvga_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_driverfbvga_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_driverfbvga_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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -