stifb.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/drivers/video/stifb.c - Generic frame buffer driver for HP
  3.  * workstations with STI (standard text interface) video firmware.
  4.  *
  5.  * Based on:
  6.  * linux/drivers/video/artistfb.c -- Artist frame buffer driver
  7.  *
  8.  * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
  9.  *
  10.  *  based on skeletonfb, which was
  11.  * Created 28 Dec 1997 by Geert Uytterhoeven
  12.  *
  13.  * This file is subject to the terms and conditions of the GNU General Public
  14.  * License.  See the file COPYING in the main directory of this archive
  15.  * for more details.  */
  16. /*
  17.  * Notes:
  18.  *
  19.  * This driver assumes that the video has been set up in 1bpp mode by
  20.  * the firmware.  Since HP video tends to be planar rather than
  21.  * packed-pixel this will probably work anyway even if it isn't.
  22.  */
  23. #include <linux/module.h>
  24. #include <linux/kernel.h>
  25. #include <linux/errno.h>
  26. #include <linux/string.h>
  27. #include <linux/mm.h>
  28. #include <linux/tty.h>
  29. #include <linux/slab.h>
  30. #include <linux/delay.h>
  31. #include <linux/fb.h>
  32. #include <linux/init.h>
  33. #include <video/fbcon.h>
  34. #include "sti.h"
  35. static struct fb_ops stifb_ops;
  36. struct stifb_info {
  37. struct fb_info_gen gen;
  38. struct sti_struct *sti;
  39. };
  40. struct stifb_par {
  41. };
  42. static struct stifb_info fb_info;
  43. static struct display disp;
  44. int stifb_init(void);
  45. int stifb_setup(char*);
  46. extern struct display_switch fbcon_sti;
  47. /* ------------------- chipset specific functions -------------------------- */
  48. static int
  49. sti_encode_fix(struct fb_fix_screeninfo *fix,
  50.        const void *par, struct fb_info_gen *info)
  51. {
  52. /* XXX: what about smem_len? */
  53. fix->smem_start = PTR_STI(fb_info.sti->glob_cfg)->region_ptrs[1];
  54. fix->type = FB_TYPE_PLANES; /* well, sort of */
  55. return 0;
  56. }
  57. static int
  58. sti_decode_var(const struct fb_var_screeninfo *var,
  59. void *par, struct fb_info_gen *info)
  60. {
  61. return 0;
  62. }
  63. static int
  64. sti_encode_var(struct fb_var_screeninfo *var,
  65.        const void *par, struct fb_info_gen *info)
  66. {
  67. var->xres = PTR_STI(fb_info.sti->glob_cfg)->onscreen_x;
  68. var->yres = PTR_STI(fb_info.sti->glob_cfg)->onscreen_y;
  69. var->xres_virtual = PTR_STI(fb_info.sti->glob_cfg)->total_x;
  70. var->yres_virtual = PTR_STI(fb_info.sti->glob_cfg)->total_y;
  71. var->xoffset = var->yoffset = 0;
  72. var->bits_per_pixel = 1;
  73. var->grayscale = 0;
  74. return 0;
  75. }
  76. static void
  77. sti_get_par(void *par, struct fb_info_gen *info)
  78. {
  79. }
  80. static void
  81. sti_set_par(const void *par, struct fb_info_gen *info)
  82. {
  83. }
  84. static int
  85. sti_getcolreg(unsigned regno, unsigned *red, unsigned *green,
  86.       unsigned *blue, unsigned *transp, struct fb_info *info)
  87. {
  88. return 0;
  89. }
  90. static int
  91. sti_setcolreg(unsigned regno, unsigned red, unsigned green,
  92.       unsigned blue, unsigned transp, struct fb_info *info)
  93. {
  94. return 0;
  95. }
  96. static void
  97. sti_set_disp(const void *par, struct display *disp,
  98.      struct fb_info_gen *info)
  99. {
  100. disp->screen_base =
  101. (void *) PTR_STI(fb_info.sti->glob_cfg)->region_ptrs[1];
  102. disp->dispsw = &fbcon_sti;
  103. }
  104. static void
  105. sti_detect(void)
  106. {
  107. }
  108. static int
  109. sti_blank(int blank_mode, const struct fb_info *info)
  110. {
  111. return 0;
  112. }
  113. /* ------------ Interfaces to hardware functions ------------ */
  114. struct fbgen_hwswitch sti_switch = {
  115. detect: sti_detect,
  116. encode_fix: sti_encode_fix,
  117. decode_var: sti_decode_var,
  118. encode_var: sti_encode_var,
  119. get_par: sti_get_par,
  120. set_par: sti_set_par,
  121. getcolreg: sti_getcolreg,
  122. setcolreg: sti_setcolreg,
  123. pan_display: NULL,
  124. blank: sti_blank,
  125. set_disp: sti_set_disp
  126. };
  127. /* ------------ Hardware Independent Functions ------------ */
  128.     /*
  129.      *  Initialization
  130.      */
  131. int __init
  132. stifb_init(void)
  133. {
  134. printk("searching for word mode STI ROMsn");
  135. /* XXX: in the future this will return a list of ROMs */
  136. if ((fb_info.sti = sti_init_roms()) == NULL)
  137. return -ENXIO;
  138. fb_info.gen.info.node = -1;
  139. fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
  140. fb_info.gen.info.fbops = &stifb_ops;
  141. fb_info.gen.info.disp = &disp;
  142. fb_info.gen.info.changevar = NULL;
  143. fb_info.gen.info.switch_con = &fbgen_switch;
  144. fb_info.gen.info.updatevar = &fbgen_update_var;
  145. fb_info.gen.info.blank = &fbgen_blank;
  146. strcpy(fb_info.gen.info.modename, "STI Generic");
  147. fb_info.gen.fbhw = &sti_switch;
  148. fb_info.gen.fbhw->detect();
  149. /* This should give a reasonable default video mode */
  150. fbgen_get_var(&disp.var, -1, &fb_info.gen.info);
  151. fbgen_do_set_var(&disp.var, 1, &fb_info.gen);
  152. fbgen_set_disp(-1, &fb_info.gen);
  153. fbgen_install_cmap(0, &fb_info.gen);
  154. pdc_console_die();
  155. if (register_framebuffer(&fb_info.gen.info) < 0)
  156. return -EINVAL;
  157. printk(KERN_INFO "fb%d: %s frame buffer devicen",
  158. GET_FB_IDX(fb_info.gen.info.node), fb_info.gen.info.modename);
  159. return 0;
  160. }
  161.     /*
  162.      *  Cleanup
  163.      */
  164. void
  165. stifb_cleanup(struct fb_info *info)
  166. {
  167. printk("stifb_cleanup: you're on crackn");
  168. }
  169. int __init
  170. stifb_setup(char *options)
  171. {
  172. /* XXX: we should take the resolution, bpp as command line arguments. */
  173. return 0;
  174. }
  175. /* ------------------------------------------------------------------------- */
  176. static struct fb_ops stifb_ops = {
  177. owner: THIS_MODULE,
  178. fb_open: NULL,
  179. fb_release: NULL,
  180. fb_get_fix: fbgen_get_fix,
  181. fb_get_var: fbgen_get_var,
  182. fb_set_var: fbgen_set_var,
  183. fb_get_cmap: fbgen_get_cmap,
  184. fb_set_cmap: fbgen_set_cmap,
  185. fb_pan_display: fbgen_pan_display,
  186. fb_ioctl: NULL
  187. };