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