1141cc406Sopenharmony_ci/* sane - Scanner Access Now Easy.
2141cc406Sopenharmony_ci   Copyright (C) 1996, 1997 David Mosberger-Tang
3141cc406Sopenharmony_ci   Copyright (C) 1997 R.E.Wolff@BitWizard.nl
4141cc406Sopenharmony_ci
5141cc406Sopenharmony_ci   This file is part of the SANE package.
6141cc406Sopenharmony_ci
7141cc406Sopenharmony_ci   This program is free software; you can redistribute it and/or
8141cc406Sopenharmony_ci   modify it under the terms of the GNU General Public License as
9141cc406Sopenharmony_ci   published by the Free Software Foundation; either version 2 of the
10141cc406Sopenharmony_ci   License, or (at your option) any later version.
11141cc406Sopenharmony_ci
12141cc406Sopenharmony_ci   This program is distributed in the hope that it will be useful, but
13141cc406Sopenharmony_ci   WITHOUT ANY WARRANTY; without even the implied warranty of
14141cc406Sopenharmony_ci   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15141cc406Sopenharmony_ci   General Public License for more details.
16141cc406Sopenharmony_ci
17141cc406Sopenharmony_ci   You should have received a copy of the GNU General Public License
18141cc406Sopenharmony_ci   along with this program.  If not, see <https://www.gnu.org/licenses/>.
19141cc406Sopenharmony_ci
20141cc406Sopenharmony_ci   */
21141cc406Sopenharmony_ci
22141cc406Sopenharmony_ci#ifndef tamarack_h
23141cc406Sopenharmony_ci#define tamarack_h
24141cc406Sopenharmony_ci
25141cc406Sopenharmony_ci#include <sys/types.h>
26141cc406Sopenharmony_ci
27141cc406Sopenharmony_ci#define TAMARACK_FLAG_TA	(1 << 3)	/* transparency adapter */
28141cc406Sopenharmony_ci
29141cc406Sopenharmony_ci
30141cc406Sopenharmony_cienum Tamarack_Option
31141cc406Sopenharmony_ci  {
32141cc406Sopenharmony_ci    OPT_NUM_OPTS = 0,
33141cc406Sopenharmony_ci
34141cc406Sopenharmony_ci    OPT_MODE_GROUP,
35141cc406Sopenharmony_ci    OPT_MODE,
36141cc406Sopenharmony_ci#define OPT_MODE_DEFAULT 2
37141cc406Sopenharmony_ci    OPT_RESOLUTION,
38141cc406Sopenharmony_ci#define OPT_RESOLUTION_DEFAULT 100
39141cc406Sopenharmony_ci#if 0
40141cc406Sopenharmony_ci    OPT_SPEED,
41141cc406Sopenharmony_ci    OPT_SOURCE,
42141cc406Sopenharmony_ci    OPT_BACKTRACK,
43141cc406Sopenharmony_ci#endif
44141cc406Sopenharmony_ci    OPT_PREVIEW,
45141cc406Sopenharmony_ci    OPT_GRAY_PREVIEW,
46141cc406Sopenharmony_ci
47141cc406Sopenharmony_ci    OPT_GEOMETRY_GROUP,
48141cc406Sopenharmony_ci    OPT_TL_X,			/* top-left x */
49141cc406Sopenharmony_ci    OPT_TL_Y,			/* top-left y */
50141cc406Sopenharmony_ci    OPT_BR_X,			/* bottom-right x */
51141cc406Sopenharmony_ci    OPT_BR_Y,			/* bottom-right y */
52141cc406Sopenharmony_ci
53141cc406Sopenharmony_ci    OPT_ENHANCEMENT_GROUP,
54141cc406Sopenharmony_ci    OPT_TRANS,
55141cc406Sopenharmony_ci    OPT_BRIGHTNESS,
56141cc406Sopenharmony_ci    OPT_CONTRAST,
57141cc406Sopenharmony_ci    OPT_THRESHOLD,
58141cc406Sopenharmony_ci#if 0
59141cc406Sopenharmony_ci    OPT_CUSTOM_GAMMA,		/* use custom gamma tables? */
60141cc406Sopenharmony_ci    /* The gamma vectors MUST appear in the order gray, red, green,
61141cc406Sopenharmony_ci       blue.  */
62141cc406Sopenharmony_ci    OPT_GAMMA_VECTOR,
63141cc406Sopenharmony_ci    OPT_GAMMA_VECTOR_R,
64141cc406Sopenharmony_ci    OPT_GAMMA_VECTOR_G,
65141cc406Sopenharmony_ci    OPT_GAMMA_VECTOR_B,
66141cc406Sopenharmony_ci
67141cc406Sopenharmony_ci    OPT_HALFTONE_DIMENSION,
68141cc406Sopenharmony_ci    OPT_HALFTONE_PATTERN,
69141cc406Sopenharmony_ci#endif
70141cc406Sopenharmony_ci
71141cc406Sopenharmony_ci    /* must come last: */
72141cc406Sopenharmony_ci    NUM_OPTIONS
73141cc406Sopenharmony_ci  };
74141cc406Sopenharmony_ci
75141cc406Sopenharmony_ci
76141cc406Sopenharmony_ci
77141cc406Sopenharmony_citypedef struct Tamarack_Device
78141cc406Sopenharmony_ci  {
79141cc406Sopenharmony_ci    struct Tamarack_Device *next;
80141cc406Sopenharmony_ci    SANE_Device sane;
81141cc406Sopenharmony_ci    SANE_Range dpi_range;
82141cc406Sopenharmony_ci    SANE_Range x_range;
83141cc406Sopenharmony_ci    SANE_Range y_range;
84141cc406Sopenharmony_ci    unsigned flags;
85141cc406Sopenharmony_ci  }
86141cc406Sopenharmony_ci
87141cc406Sopenharmony_ciTamarack_Device;
88141cc406Sopenharmony_ci
89141cc406Sopenharmony_citypedef struct Tamarack_Scanner
90141cc406Sopenharmony_ci  {
91141cc406Sopenharmony_ci    /* all the state needed to define a scan request: */
92141cc406Sopenharmony_ci    struct Tamarack_Scanner *next;
93141cc406Sopenharmony_ci
94141cc406Sopenharmony_ci    SANE_Option_Descriptor opt[NUM_OPTIONS];
95141cc406Sopenharmony_ci    Option_Value val[NUM_OPTIONS];
96141cc406Sopenharmony_ci    SANE_Int gamma_table[4][256];
97141cc406Sopenharmony_ci#if 0
98141cc406Sopenharmony_ci    SANE_Int halftone_pattern[64];
99141cc406Sopenharmony_ci#endif
100141cc406Sopenharmony_ci
101141cc406Sopenharmony_ci    int scanning;
102141cc406Sopenharmony_ci    int pass;			/* pass number */
103141cc406Sopenharmony_ci    int line;			/* current line number */
104141cc406Sopenharmony_ci    SANE_Parameters params;
105141cc406Sopenharmony_ci
106141cc406Sopenharmony_ci    /* Parsed option values and variables that are valid only during
107141cc406Sopenharmony_ci       actual scanning: */
108141cc406Sopenharmony_ci    int mode;
109141cc406Sopenharmony_ci#if 0
110141cc406Sopenharmony_ci    int one_pass_color_scan;
111141cc406Sopenharmony_ci    int resolution_code;
112141cc406Sopenharmony_ci#endif
113141cc406Sopenharmony_ci    int fd;			/* SCSI filedescriptor */
114141cc406Sopenharmony_ci    SANE_Pid reader_pid;	/* process id of reader */
115141cc406Sopenharmony_ci    int pipe;			/* pipe to reader process */
116141cc406Sopenharmony_ci    int reader_pipe;		/* pipe from reader process */
117141cc406Sopenharmony_ci
118141cc406Sopenharmony_ci    /* scanner dependent/low-level state: */
119141cc406Sopenharmony_ci    Tamarack_Device *hw;
120141cc406Sopenharmony_ci
121141cc406Sopenharmony_ci#if 0
122141cc406Sopenharmony_ci    /* line-distance correction related state: */
123141cc406Sopenharmony_ci    struct
124141cc406Sopenharmony_ci      {
125141cc406Sopenharmony_ci	int max_value;
126141cc406Sopenharmony_ci	int peak_res;
127141cc406Sopenharmony_ci	struct
128141cc406Sopenharmony_ci	  {
129141cc406Sopenharmony_ci	    int dist;		/* line distance */
130141cc406Sopenharmony_ci	    int Qk;
131141cc406Sopenharmony_ci	  }
132141cc406Sopenharmony_ci	c[3];
133141cc406Sopenharmony_ci	/* these are used in the MLD_MFS mode only: */
134141cc406Sopenharmony_ci	char *red_buf;
135141cc406Sopenharmony_ci	char *green_buf;
136141cc406Sopenharmony_ci      }
137141cc406Sopenharmony_ci    ld;
138141cc406Sopenharmony_ci#endif
139141cc406Sopenharmony_ci  }
140141cc406Sopenharmony_ciTamarack_Scanner;
141141cc406Sopenharmony_ci
142141cc406Sopenharmony_ci
143141cc406Sopenharmony_ci
144141cc406Sopenharmony_ci#define TAM_ADF_ON    0x80
145141cc406Sopenharmony_ci#define TAM_DOUBLE_ON 0x40
146141cc406Sopenharmony_ci#define TAM_TRANS_ON  0x20
147141cc406Sopenharmony_ci
148141cc406Sopenharmony_ci#define TAM_INVERSE_ON 0x20
149141cc406Sopenharmony_ci
150141cc406Sopenharmony_ci
151141cc406Sopenharmony_ci
152141cc406Sopenharmony_ci
153141cc406Sopenharmony_ci#define THRESHOLDED 0
154141cc406Sopenharmony_ci#define DITHERED 1
155141cc406Sopenharmony_ci#define GREYSCALE 2
156141cc406Sopenharmony_ci#define TRUECOLOR 3
157141cc406Sopenharmony_ci
158141cc406Sopenharmony_ci
159141cc406Sopenharmony_ci
160141cc406Sopenharmony_ci/* Some Tamarack driver internal defines */
161141cc406Sopenharmony_ci#define WINID 0
162141cc406Sopenharmony_ci
163141cc406Sopenharmony_ci
164141cc406Sopenharmony_ci/* SCSI commands that the Tamarack scanners understand: */
165141cc406Sopenharmony_ci
166141cc406Sopenharmony_ci#define TAMARACK_SCSI_TEST_UNIT_READY		0x00
167141cc406Sopenharmony_ci#define TAMARACK_SCSI_INQUIRY			0x12
168141cc406Sopenharmony_ci#define TAMARACK_SCSI_MODE_SELECT		0x15
169141cc406Sopenharmony_ci#define TAMARACK_SCSI_START_STOP		0x1b
170141cc406Sopenharmony_ci#define TAMARACK_SCSI_AREA_AND_WINDOWS		0x24
171141cc406Sopenharmony_ci#define TAMARACK_SCSI_READ_SCANNED_DATA		0x28
172141cc406Sopenharmony_ci#define TAMARACK_SCSI_GET_DATA_STATUS		0x34
173141cc406Sopenharmony_ci
174141cc406Sopenharmony_ci
175141cc406Sopenharmony_ci/* The structures that you have to send to the tamarack to get it to
176141cc406Sopenharmony_ci   do various stuff... */
177141cc406Sopenharmony_ci
178141cc406Sopenharmony_cistruct win_desc_header {
179141cc406Sopenharmony_ci  unsigned char pad0[6];
180141cc406Sopenharmony_ci  unsigned char wpll[2];
181141cc406Sopenharmony_ci};
182141cc406Sopenharmony_ci
183141cc406Sopenharmony_ci
184141cc406Sopenharmony_cistruct win_desc_block {
185141cc406Sopenharmony_ci  unsigned char winid;
186141cc406Sopenharmony_ci  unsigned char pad0;
187141cc406Sopenharmony_ci  unsigned char xres[2];
188141cc406Sopenharmony_ci  unsigned char yres[2];
189141cc406Sopenharmony_ci  unsigned char ulx[4];
190141cc406Sopenharmony_ci  unsigned char uly[4];
191141cc406Sopenharmony_ci  unsigned char width[4];
192141cc406Sopenharmony_ci  unsigned char length[4];
193141cc406Sopenharmony_ci  unsigned char brightness;
194141cc406Sopenharmony_ci  unsigned char thresh;
195141cc406Sopenharmony_ci  unsigned char contrast;
196141cc406Sopenharmony_ci  unsigned char image_comp;
197141cc406Sopenharmony_ci  unsigned char bpp;
198141cc406Sopenharmony_ci  unsigned char halftone[2];
199141cc406Sopenharmony_ci  unsigned char pad_type;
200141cc406Sopenharmony_ci  unsigned char exposure;
201141cc406Sopenharmony_ci  unsigned char pad3;
202141cc406Sopenharmony_ci  unsigned char compr_type;
203141cc406Sopenharmony_ci  unsigned char pad4[5];
204141cc406Sopenharmony_ci};
205141cc406Sopenharmony_ci
206141cc406Sopenharmony_ci
207141cc406Sopenharmony_ci
208141cc406Sopenharmony_cistruct command_header {
209141cc406Sopenharmony_ci  unsigned char opc;
210141cc406Sopenharmony_ci  unsigned char pad0[3];
211141cc406Sopenharmony_ci  unsigned char len;
212141cc406Sopenharmony_ci  unsigned char pad1;
213141cc406Sopenharmony_ci};
214141cc406Sopenharmony_ci
215141cc406Sopenharmony_ci
216141cc406Sopenharmony_cistruct command_header_10 {
217141cc406Sopenharmony_ci  unsigned char opc;
218141cc406Sopenharmony_ci  unsigned char pad0[5];
219141cc406Sopenharmony_ci  unsigned char len[3];
220141cc406Sopenharmony_ci  unsigned char pad1;
221141cc406Sopenharmony_ci};
222141cc406Sopenharmony_ci
223141cc406Sopenharmony_ci
224141cc406Sopenharmony_ci
225141cc406Sopenharmony_ci
226141cc406Sopenharmony_cistruct def_win_par {
227141cc406Sopenharmony_ci  struct command_header_10 dwph;
228141cc406Sopenharmony_ci  struct win_desc_header wdh;
229141cc406Sopenharmony_ci  struct win_desc_block wdb;
230141cc406Sopenharmony_ci};
231141cc406Sopenharmony_ci
232141cc406Sopenharmony_ci
233141cc406Sopenharmony_cistruct page_header{
234141cc406Sopenharmony_ci  char pad0[4];
235141cc406Sopenharmony_ci  char code;
236141cc406Sopenharmony_ci  char length;
237141cc406Sopenharmony_ci};
238141cc406Sopenharmony_ci
239141cc406Sopenharmony_ci
240141cc406Sopenharmony_ci
241141cc406Sopenharmony_cistruct tamarack_page {
242141cc406Sopenharmony_ci  char gamma;
243141cc406Sopenharmony_ci  unsigned char thresh;
244141cc406Sopenharmony_ci  unsigned char masks;
245141cc406Sopenharmony_ci  char delay;
246141cc406Sopenharmony_ci  char features;
247141cc406Sopenharmony_ci  char pad0;
248141cc406Sopenharmony_ci};
249141cc406Sopenharmony_ci
250141cc406Sopenharmony_ci
251141cc406Sopenharmony_ci/* set SCSI highended variables. Declare them as an array of chars */
252141cc406Sopenharmony_ci/* endianness-safe, int-size safe... */
253141cc406Sopenharmony_ci#define set_double(var,val) var[0] = ((val) >> 8) & 0xff;  \
254141cc406Sopenharmony_ci                            var[1] = ((val)     ) & 0xff;
255141cc406Sopenharmony_ci
256141cc406Sopenharmony_ci#define set_triple(var,val) var[0] = ((val) >> 16) & 0xff; \
257141cc406Sopenharmony_ci                            var[1] = ((val) >> 8 ) & 0xff; \
258141cc406Sopenharmony_ci                            var[2] = ((val)      ) & 0xff;
259141cc406Sopenharmony_ci
260141cc406Sopenharmony_ci#define set_quad(var,val)   var[0] = ((val) >> 24) & 0xff; \
261141cc406Sopenharmony_ci                            var[1] = ((val) >> 16) & 0xff; \
262141cc406Sopenharmony_ci                            var[2] = ((val) >> 8 ) & 0xff; \
263141cc406Sopenharmony_ci                            var[3] = ((val)      ) & 0xff;
264141cc406Sopenharmony_ci
265141cc406Sopenharmony_ci#endif /* tamarack_h */
266