1 /*        $NetBSD: ss_mustek.h,v 1.9 2005/12/11 12:23:51 christos 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 
69 struct 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 
76 struct 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 
84 struct 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 
103 struct 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 
110 struct 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 
117 struct 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 
125 struct 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  */
145 struct 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 
159 struct 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