1/*	$NetBSD: ss_mustek.h,v 1.5.48.2 2005/03/04 16:50:36 skrll Exp $	*/
2
3/*
4 * Copyright (c) 1995 Joachim Koenig-Baltes.  All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 *    must display the following acknowledgement:
16 *	This product includes software developed by Joachim Koenig-Baltes.
17 * 4. The name of the author may not be used to endorse or promote products
18 *    derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 * support for MUSTEK flatbed SCSI scanners MFS-06000CX and MFS-12000CX
34 * (600 and 1200 dpi horizontally resp), not conforming to the SCSI2 spec.
35 */
36
37/*
38 * Configuration section: describes the mode in which scanner is driven
39 * MUSTEK_INCH_SPEC: frame/window sizes are given in inches instead of
40 *     pixels, note: unit is 1/8th of an inch
41 * MUSTEK_WINDOWS: number of windows in a frame, up to 4 allowed,
42 *     not used yet, so set to 0
43 */
44#define MUSTEK_INCH_SPEC		/* use inches to specify sizes */
45#define MUSTEK_WINDOWS		0	/* no window support yet */
46
47/* mustek scsi commands */
48#define MUSTEK_SET_WINDOW	0x04	/* set image area and windows */
49#define MUSTEK_READ		0x08	/* read command */
50#define MUSTEK_GET_STATUS	0x0f	/* image status */
51#define MUSTEK_MODE_SELECT	0x15	/* set resolution, paper length, .. */
52#define MUSTEK_ADF		0x10	/* ADF and backtracking selection */
53#define MUSTEK_START_STOP	0x1b	/* start/stop scan */
54#define MUSTEK_LUT		0x55	/* look up table download */
55
56/* the size spec is at the same bit position in different commands */
57#define	MUSTEK_UNIT_INCHES		0x00
58#define MUSTEK_UNIT_PIXELS		0x08
59#ifdef MUSTEK_INCH_SPEC
60#define MUSTEK_UNIT_SPEC	MUSTEK_UNIT_INCHES
61#else
62#define MUSTEK_UNIT_SPEC	MUSTEK_UNIT_PIXELS
63#endif
64
65/*
66 * SCSI command formats
67 */
68
69struct mustek_set_window_cmd {
70	u_int8_t opcode;		/* 0x04 */
71	u_int8_t reserved[3];
72	u_int8_t length;		/* in bytes */
73	u_int8_t control;
74};
75
76struct mustek_window {
77	u_int8_t header;		/* unit-defines also apply */
78	u_int8_t tl_x[2];		/* LSB */
79	u_int8_t tl_y[2];
80	u_int8_t br_x[2];
81	u_int8_t br_y[2];
82};
83
84struct mustek_set_window_data {
85#define MUSTEK_LINEART_BACKGROUND	0x00
86#define MUSTEK_HALFTONE_BACKGROUND	0x01
87	struct	mustek_window frame;
88#if MUSTEK_WINDOWS >= 1
89#define MUSTEK_WINDOW_MASK	0x80
90	struct	mustek_window window1;
91#endif
92#if MUSTEK_WINDOWS >= 2
93	struct	mustek_window window2;
94#endif
95#if MUSTEK_WINDOWS >= 3
96	struct	mustek_window window3;
97#endif
98#if MUSTEK_WINDOWS >= 4
99	struct	mustek_window window4;
100#endif
101};
102
103struct mustek_read_cmd {
104	u_int8_t opcode;		/* 0x08 */
105	u_int8_t reserved;
106	u_int8_t length[3];
107	u_int8_t control;
108};
109
110struct mustek_get_status_cmd {
111	u_int8_t opcode;		/* 0x0f */
112	u_int8_t reserved[3];
113	u_int8_t length;		/* 0x06 */
114	u_int8_t control;
115};
116
117struct mustek_get_status_data {
118#define MUSTEK_READY 0
119#define MUSTEK_BUSY  -1
120	u_int8_t ready_busy;		/* 0 = ready */
121	u_int8_t bytes_per_line[2];	/* LSB */
122	u_int8_t lines[3];		/* LSB */
123};
124
125struct mustek_mode_select_cmd {
126	u_int8_t opcode;		/* 0x15 */
127	u_int8_t reserved[2];
128	u_int8_t length[2];
129	u_int8_t control;
130};
131
132/*
133 * resolution settings:
134 *   MFS06000CX:
135 *   1% : 0x01 0x02 ... 0x64
136 *           3    6 ...  300 dpi
137 *   10%: 0x1e 0x3c 0x5a 0x14 0x32 0x50 0x0a 0x28 0x46 0x64
138 *         330  360  390  420  450  480  510  540  570  600 dpi
139 *   MFS12000CX:
140 *   1% : 0x01 0x02 ... 0x64
141 *           6   12 ...  600 dpi
142 *   10%: 0x1e 0x3c 0x5a 0x14 0x32 0x50 0x0a 0x28 0x46 0x64
143 *         660  720  780  840  900  960 1020 1080 1140 1200 dpi
144 */
145struct mustek_mode_select_data {
146#define MUSTEK_MODE_MASK		0x83
147#define MUSTEK_HT_PATTERN_BUILTIN	0x00
148#define MUSTEK_HT_PATTERN_DOWNLOADED	0x10
149	u_int8_t mode;
150	u_int8_t resolution;
151	u_int8_t brightness;
152	u_int8_t contrast;
153	u_int8_t grain;			/* 0 = 8x8, .....  5 = 2x2  */
154	u_int8_t velocity;		/* 0 = fast, ...., 4 = slow */
155	u_int8_t reserved[2];
156	u_int8_t paperlength[2];	/* LSB */
157};
158
159struct mustek_start_scan_cmd {
160	u_int8_t opcode;		/* 0x1b */
161	u_int8_t reserved[3];
162#define MUSTEK_SCAN_STOP	0x00
163#define MUSTEK_SCAN_START	0x01
164#define MUSTEK_GRAY_FILTER	0x00
165#define MUSTEK_RED_FILTER	0x08
166#define MUSTEK_GREEN_FILTER	0x10
167#define MUSTEK_BLUE_FILTER	0x18
168#define MUSTEK_GRAY_MODE	0x40
169#define MUSTEK_BIT_MODE		0x00
170#define MUSTEK_RES_STEP_1	0x00
171#define MUSTEK_RES_STEP_10	0x80
172	u_int8_t mode;
173	u_int8_t control;
174};
175