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 ; /* 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 | |