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.
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.
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]
23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SYS_VISUAL_IO_H
28 #define _SYS_VISUAL_IO_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
36 #define VIOC ('V' << 8)
37 #define VIOCF ('F' << 8)
41 * Device Identification
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:
47 * <companysymbol><devicetype>
49 * for example: SUNWcg6
52 #define VIS_MAXNAMELEN 128
54 struct vis_identifier
{
55 char name
[VIS_MAXNAMELEN
]; /* <companysymbol><devicename> */
58 #define VIS_GETIDENTIFIER (VIOC | 0)
63 * Hardware Cursor Control
65 * Devices with hardware cursors may implement these ioctls in their
66 * kernel device drivers.
70 struct vis_cursorpos
{
71 short x
; /* cursor x coordinate */
72 short y
; /* cursor y coordinate */
75 struct vis_cursorcmap
{
76 int version
; /* version */
78 unsigned char *red
; /* red color map elements */
79 unsigned char *green
; /* green color map elements */
80 unsigned char *blue
; /* blue color map elements */
85 * These ioctls fetch and set various cursor attributes, using the
89 #define VIS_SETCURSOR (VIOCF|24)
90 #define VIS_GETCURSOR (VIOCF|25)
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 */
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 */
109 #define VIS_CURSOR_SETALL (VIS_CURSOR_SETCURSOR | \
110 VIS_CURSOR_SETPOSITION | \
111 VIS_CURSOR_SETHOTSPOT | \
112 VIS_CURSOR_SETCOLORMAP | \
117 * These ioctls fetch and move the current cursor position, using the
118 * vis_cursorposition struct.
121 #define VIS_MOVECURSOR (VIOCF|26)
122 #define VIS_GETCURSORPOS (VIOCF|27)
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.
132 #define VIS_GETCMAP (VIOC|9)
133 #define VIS_PUTCMAP (VIOC|10)
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 */
145 * The following ioctls are used for communication between the layered
146 * device and the framebuffer. The layered driver calls the framebuffer
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.
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.
160 typedef short screen_pos_t
;
161 typedef short screen_size_t
;
164 * Union of pixel depths
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 */
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.
179 * ioctl(fd, VIS_DEVINIT, struct vis_devinit *)
181 #define VIS_DEVINIT (VIOC|1)
182 #define VIS_CONS_REV 3 /* Console IO interface version */
184 #define VIS_TEXT 0 /* Use text mode when displaying data */
185 #define VIS_PIXEL 1 /* Use pixel mode when displaying data */
189 * Tells the framebuffer that it is no longer being used as a console.
191 * ioctl(fd, VIS_DEVFINI, unused)
193 #define VIS_DEVFINI (VIOC|2)
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.
201 * ioctl(fd, VIS_CONSCURSOR, struct vis_conscursor *)
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
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.
216 * ioctl(fd, VIS_CONSDISPLAY, struct vis_consdisplay *)
219 #define VIS_CONSDISPLAY (VIOC|5)
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.
228 * ioctl(fd, VIS_CONSCOPY, struct vis_conscopy *)
230 #define VIS_CONSCOPY (VIOC|7)
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 */
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 */
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 */
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 *".
267 struct vis_polledio_arg
;
268 struct vis_modechg_arg
;
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
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
*);
282 struct vis_devinit
; /* forward decl. for typedef */
284 typedef void (*vis_modechg_cb_t
)(struct vis_modechg_arg
*,
285 struct vis_devinit
*);
289 * This set of fields are used as parameters passed from the
290 * layered framebuffer driver to the terminal emulator.
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 */
301 * The following fields are used as parameters passed from the
302 * terminal emulator to the underlying framebuffer driver.
304 vis_modechg_cb_t modechg_cb
; /* Video mode change callback */
305 struct vis_modechg_arg
*modechg_arg
; /* Mode change cb arg */
314 #endif /* !_SYS_VISUAL_IO_H */