1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_VISUAL_IO_H 28 #define _SYS_VISUAL_IO_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 #define VIOC ('V' << 8) 37 #define VIOCF ('F' << 8) 38 39 40 /* 41 * Device Identification 42 * 43 * VIS_GETIDENTIFIER returns an identifier string to uniquely identify 44 * a device type used in the Solaris VISUAL environment. The identifier 45 * must be unique. We suggest the convention: 46 * 47 * <companysymbol><devicetype> 48 * 49 * for example: SUNWcg6 50 */ 51 52 #define VIS_MAXNAMELEN 128 53 54 struct vis_identifier { 55 char name[VIS_MAXNAMELEN]; /* <companysymbol><devicename> */ 56 }; 57 58 #define VIS_GETIDENTIFIER (VIOC | 0) 59 60 61 62 /* 63 * Hardware Cursor Control 64 * 65 * Devices with hardware cursors may implement these ioctls in their 66 * kernel device drivers. 67 */ 68 69 70 struct vis_cursorpos { 71 short x; /* cursor x coordinate */ 72 short y; /* cursor y coordinate */ 73 }; 74 75 struct vis_cursorcmap { 76 int version; /* version */ 77 int reserved; 78 unsigned char *red; /* red color map elements */ 79 unsigned char *green; /* green color map elements */ 80 unsigned char *blue; /* blue color map elements */ 81 }; 82 83 84 /* 85 * These ioctls fetch and set various cursor attributes, using the 86 * vis_cursor struct. 87 */ 88 89 #define VIS_SETCURSOR (VIOCF|24) 90 #define VIS_GETCURSOR (VIOCF|25) 91 92 struct vis_cursor { 93 short set; /* what to set */ 94 short enable; /* cursor on/off */ 95 struct vis_cursorpos pos; /* cursor position */ 96 struct vis_cursorpos hot; /* cursor hot spot */ 97 struct vis_cursorcmap cmap; /* color map info */ 98 struct vis_cursorpos size; /* cursor bit map size */ 99 char *image; /* cursor image bits */ 100 char *mask; /* cursor mask bits */ 101 }; 102 103 #define VIS_CURSOR_SETCURSOR 0x01 /* set cursor */ 104 #define VIS_CURSOR_SETPOSITION 0x02 /* set cursor position */ 105 #define VIS_CURSOR_SETHOTSPOT 0x04 /* set cursor hot spot */ 106 #define VIS_CURSOR_SETCOLORMAP 0x08 /* set cursor colormap */ 107 #define VIS_CURSOR_SETSHAPE 0x10 /* set cursor shape */ 108 109 #define VIS_CURSOR_SETALL (VIS_CURSOR_SETCURSOR | \ 110 VIS_CURSOR_SETPOSITION | \ 111 VIS_CURSOR_SETHOTSPOT | \ 112 VIS_CURSOR_SETCOLORMAP | \ 113 VIS_CURSOR_SETSHAPE) 114 115 116 /* 117 * These ioctls fetch and move the current cursor position, using the 118 * vis_cursorposition struct. 119 */ 120 121 #define VIS_MOVECURSOR (VIOCF|26) 122 #define VIS_GETCURSORPOS (VIOCF|27) 123 124 /* 125 * VIS_SETCMAP: 126 * VIS_GETCMAP: 127 * Set/Get the indicated color map entries. The index states the first 128 * color to be update and count specifies the number of entries to be 129 * updated from index. red, green, and blue are arrays of color 130 * values. The length of the arrays is count. 131 */ 132 #define VIS_GETCMAP (VIOC|9) 133 #define VIS_PUTCMAP (VIOC|10) 134 struct vis_cmap { 135 int index; /* Index into colormap to start updating */ 136 int count; /* Number of entries to update */ 137 unsigned char *red; /* List of red values */ 138 unsigned char *green; /* List of green values */ 139 unsigned char *blue; /* List of blue values */ 140 }; 141 142 143 #ifdef _KERNEL 144 /* 145 * The following ioctls are used for communication between the layered 146 * device and the framebuffer. The layered driver calls the framebuffer 147 * with these ioctls. 148 * 149 * On machines that don't have a prom, kmdb uses the kernel to display 150 * characters. The kernel in turn will use the routines returned by 151 * VIS_DEVINIT to ask the framebuffer driver to display the data. The 152 * framebuffer driver CANNOT use any DDI services to display this data. It 153 * must just dump the data to the framebuffer. In particular, the mutex and 154 * copy routines do not work. 155 * 156 * On machines without a prom, the framebuffer driver must implement all 157 * of these ioctls to be a console. On machines with a prom, the 158 * framebuffer driver can set vis_devinit.polledio to NULL. 159 */ 160 typedef short screen_pos_t; 161 typedef short screen_size_t; 162 163 /* 164 * Union of pixel depths 165 */ 166 typedef union { 167 unsigned char mono; /* one-bit */ 168 unsigned char four; /* four bit */ 169 unsigned char eight; /* eight bit */ 170 unsigned char twentyfour[3]; /* 24 bit */ 171 } color_t; 172 173 /* 174 * VIS_DEVINIT: 175 * Initialize the framebuffer as a console device. The terminal emulator 176 * will provide the following structure to the device driver to be filled in. 177 * The driver is expected to fill it in. 178 * 179 * ioctl(fd, VIS_DEVINIT, struct vis_devinit *) 180 */ 181 #define VIS_DEVINIT (VIOC|1) 182 #define VIS_CONS_REV 3 /* Console IO interface version */ 183 /* Modes */ 184 #define VIS_TEXT 0 /* Use text mode when displaying data */ 185 #define VIS_PIXEL 1 /* Use pixel mode when displaying data */ 186 187 /* 188 * VIS_DEVFINI: 189 * Tells the framebuffer that it is no longer being used as a console. 190 * 191 * ioctl(fd, VIS_DEVFINI, unused) 192 */ 193 #define VIS_DEVFINI (VIOC|2) 194 195 /* 196 * VIS_CONSCURSOR: 197 * Display/Hide cursor on the screen. The layered driver uses this ioctl to 198 * display, hide, and move the cursor on the console. The framebuffer driver 199 * is expected to draw a cursor at position (col,row) of size width x height. 200 * 201 * ioctl(fd, VIS_CONSCURSOR, struct vis_conscursor *) 202 */ 203 #define VIS_CONSCURSOR (VIOC|3) 204 /* Cursor action - Either display or hide cursor */ 205 #define VIS_HIDE_CURSOR 0 206 #define VIS_DISPLAY_CURSOR 1 207 #define VIS_GET_CURSOR 2 208 209 /* 210 * VIS_CONSDISPLAY: 211 * Display data on the framebuffer. The data will be in the form specified 212 * by the driver during console initialization (see VIS_CONSDEVINIT above). 213 * The driver is expected to display the data at location (row,col). Width 214 * and height specify the size of the data. 215 * 216 * ioctl(fd, VIS_CONSDISPLAY, struct vis_consdisplay *) 217 */ 218 219 #define VIS_CONSDISPLAY (VIOC|5) 220 221 /* 222 * VIS_CONSCOPY: 223 * Move data on the framebuffer. Used to scroll the screen by the terminal 224 * emulator or to move data by applications. The driver must copy the data 225 * specified by the rectangle (s_col,s_row),(e_col,e_row) to the location 226 * which starts at (t_col,t_row), handling overlapping copies correctly. 227 * 228 * ioctl(fd, VIS_CONSCOPY, struct vis_conscopy *) 229 */ 230 #define VIS_CONSCOPY (VIOC|7) 231 232 struct vis_consdisplay { 233 screen_pos_t row; /* Row to display data at */ 234 screen_pos_t col; /* Col to display data at */ 235 screen_size_t width; /* Width of data */ 236 screen_size_t height; /* Height of data */ 237 unsigned char *data; /* Data to display */ 238 unsigned char fg_color; /* Foreground color */ 239 unsigned char bg_color; /* Background color */ 240 }; 241 242 struct vis_conscopy { 243 screen_pos_t s_row; /* Starting row */ 244 screen_pos_t s_col; /* Starting col */ 245 screen_pos_t e_row; /* Ending row */ 246 screen_pos_t e_col; /* Ending col */ 247 screen_pos_t t_row; /* Row to move to */ 248 screen_pos_t t_col; /* Col to move to */ 249 }; 250 251 struct vis_conscursor { 252 screen_pos_t row; /* Row to display cursor at */ 253 screen_pos_t col; /* Col to display cursor at */ 254 screen_size_t width; /* Width of cursor */ 255 screen_size_t height; /* Height of cursor */ 256 color_t fg_color; /* Foreground color */ 257 color_t bg_color; /* Background color */ 258 short action; /* Hide or show cursor */ 259 }; 260 261 /* 262 * Each software-console-capable frame buffer driver defines its own 263 * instance of this (with its own name!) and casts to/from this at the 264 * interface with the terminal emulator. These yield somewhat better 265 * type checking than "void *". 266 */ 267 struct vis_polledio_arg; 268 struct vis_modechg_arg; 269 270 /* 271 * Each software-console-capable frame buffer driver supplies these routines 272 * for I/O from "polled" contexts - kmdb, OBP, etc. No system services are 273 * available. 274 */ 275 struct vis_polledio { 276 struct vis_polledio_arg *arg; 277 void (*display)(struct vis_polledio_arg *, struct vis_consdisplay *); 278 void (*copy)(struct vis_polledio_arg *, struct vis_conscopy *); 279 void (*cursor)(struct vis_polledio_arg *, struct vis_conscursor *); 280 }; 281 282 struct vis_devinit; /* forward decl. for typedef */ 283 284 typedef void (*vis_modechg_cb_t)(struct vis_modechg_arg *, 285 struct vis_devinit *); 286 287 struct vis_devinit { 288 /* 289 * This set of fields are used as parameters passed from the 290 * layered framebuffer driver to the terminal emulator. 291 */ 292 int version; /* Console IO interface version */ 293 screen_size_t width; /* Width of the device */ 294 screen_size_t height; /* Height of the device */ 295 screen_size_t linebytes; /* Bytes per scan line */ 296 int depth; /* Device depth */ 297 short mode; /* Mode to use when displaying data */ 298 struct vis_polledio *polledio; /* Polled output routines */ 299 300 /* 301 * The following fields are used as parameters passed from the 302 * terminal emulator to the underlying framebuffer driver. 303 */ 304 vis_modechg_cb_t modechg_cb; /* Video mode change callback */ 305 struct vis_modechg_arg *modechg_arg; /* Mode change cb arg */ 306 }; 307 308 #endif /* _KERNEL */ 309 310 #ifdef __cplusplus 311 } 312 #endif 313 314 #endif /* !_SYS_VISUAL_IO_H */ 315