1/*
2   Copyright (C) 2008, Panasonic Russia Ltd.
3*/
4/* sane - Scanner Access Now Easy.
5   Panasonic KV-S1020C / KV-S1025C USB scanners.
6*/
7
8#ifndef __KVS1025_LOW_H
9#define __KVS1025_LOW_H
10
11#include "kvs1025_cmds.h"
12
13#define VENDOR_ID       0x04DA
14
15typedef enum
16{
17  KV_S1020C = 0x1007,
18  KV_S1025C = 0x1006,
19  KV_S1045C = 0x1010
20} KV_MODEL_TYPE;
21
22/* Store an integer in 2, 3 or 4 byte in a big-endian array. */
23#define Ito16(val, buf) { \
24 ((unsigned char *)buf)[0] = ((val) >> 8) & 0xff; \
25 ((unsigned char *)buf)[1] = ((val) >> 0) & 0xff; \
26}
27
28#define Ito24(val, buf) { \
29 ((unsigned char *)buf)[0] = ((val) >> 16) & 0xff; \
30 ((unsigned char *)buf)[1] = ((val) >>  8) & 0xff; \
31 ((unsigned char *)buf)[2] = ((val) >>  0) & 0xff; \
32}
33
34#define Ito32(val, buf) { \
35 ((unsigned char *)buf)[0] = ((val) >> 24) & 0xff; \
36 ((unsigned char *)buf)[1] = ((val) >> 16) & 0xff; \
37 ((unsigned char *)buf)[2] = ((val) >>  8) & 0xff; \
38 ((unsigned char *)buf)[3] = ((val) >>  0) & 0xff; \
39}
40
41/* 32 bits from an array to an integer (eg ntohl). */
42#define B32TOI(buf) \
43    ((((unsigned char *)buf)[0] << 24) | \
44     (((unsigned char *)buf)[1] << 16) | \
45     (((unsigned char *)buf)[2] <<  8) |  \
46     (((unsigned char *)buf)[3] <<  0))
47
48/* 24 bits from an array to an integer. */
49#define B24TOI(buf) \
50     (((unsigned char *)buf)[0] << 16) | \
51     (((unsigned char *)buf)[1] <<  8) |  \
52     (((unsigned char *)buf)[2] <<  0))
53
54#define SCSI_FD                     int
55#define SCSI_BUFFER_SIZE            (0x40000-12)
56
57typedef enum
58{
59  KV_SCSI_BUS = 0x01,
60  KV_USB_BUS = 0x02
61} KV_BUS_MODE;
62
63typedef enum
64{
65  SM_BINARY = 0x00,
66  SM_DITHER = 0x01,
67  SM_GRAYSCALE = 0x02,
68  SM_COLOR = 0x05
69} KV_SCAN_MODE;
70
71typedef struct
72{
73  unsigned char data[16];
74  int len;
75} CDB;
76
77typedef struct
78{
79  int width;
80  int height;
81} KV_PAPER_SIZE;
82
83/* remarked -- KV-S1020C / KV-S1025C supports ADF only
84typedef enum
85{
86    TRUPER_ADF         = 0,
87    TRUPER_FLATBED     = 1
88} KV_SCAN_SOURCE;
89*/
90
91/* options */
92typedef enum
93{
94  OPT_NUM_OPTS = 0,
95
96  /* General options */
97  OPT_MODE_GROUP,
98  OPT_MODE,			/* scanner modes */
99  OPT_RESOLUTION,		/* X and Y resolution */
100  OPT_DUPLEX,			/* Duplex mode */
101  OPT_SCAN_SOURCE,		/* Scan source, fixed to ADF */
102  OPT_FEEDER_MODE,		/* Feeder mode, fixed to Continuous */
103  OPT_LONGPAPER,		/* Long paper mode */
104  OPT_LENGTHCTL,		/* Length control mode */
105  OPT_MANUALFEED,		/* Manual feed mode */
106  OPT_FEED_TIMEOUT,		/* Feed timeout */
107  OPT_DBLFEED,			/* Double feed detection mode */
108  OPT_FIT_TO_PAGE,		/* Scanner shrinks image to fit scanned page */
109
110  /* Geometry group */
111  OPT_GEOMETRY_GROUP,
112  OPT_PAPER_SIZE,		/* Paper size */
113  OPT_LANDSCAPE,		/* true if landscape; new for Truper 3200/3600 */
114  OPT_TL_X,			/* upper left X */
115  OPT_TL_Y,			/* upper left Y */
116  OPT_BR_X,			/* bottom right X */
117  OPT_BR_Y,			/* bottom right Y */
118
119  OPT_ENHANCEMENT_GROUP,
120  OPT_BRIGHTNESS,		/* Brightness */
121  OPT_CONTRAST,			/* Contrast */
122  OPT_AUTOMATIC_THRESHOLD,	/* Binary threshold */
123  OPT_HALFTONE_PATTERN,		/* Halftone pattern */
124  OPT_AUTOMATIC_SEPARATION,	/* Automatic separation */
125  OPT_WHITE_LEVEL,		/* White level */
126  OPT_NOISE_REDUCTION,		/* Noise reduction */
127  OPT_IMAGE_EMPHASIS,		/* Image emphasis */
128  OPT_GAMMA,			/* Gamma */
129  OPT_LAMP,			/* Lamp -- color drop out */
130  OPT_INVERSE,			/* Inverse image */
131  OPT_MIRROR,			/* Mirror image */
132  OPT_JPEG,			/* JPEG Compression */
133  OPT_ROTATE,			/* Rotate image */
134
135  OPT_SWDESKEW,                 /* Software deskew */
136  OPT_SWDESPECK,                /* Software despeckle */
137  OPT_SWDEROTATE,               /* Software detect/correct 90 deg. rotation */
138  OPT_SWCROP,                   /* Software autocrop */
139  OPT_SWSKIP,                   /* Software blank page skip */
140
141  /* must come last: */
142  OPT_NUM_OPTIONS
143} KV_OPTION;
144
145typedef struct
146{
147  int memory_size;		/* in MB */
148  int min_resolution;		/* in DPI */
149  int max_resolution;		/* in DPI */
150  int step_resolution;		/* in DPI */
151  int support_duplex;		/* 1 if true */
152  int support_lamp;		/* 1 if true */
153  int max_x_range;		/* in mm */
154  int max_y_range;		/* in mm */
155} KV_SUPPORT_INFO;
156
157typedef struct kv_scanner_dev
158{
159  struct kv_scanner_dev *next;
160
161  SANE_Device sane;
162
163  /* Infos from inquiry. */
164  char scsi_type;
165  char scsi_type_str[32];
166  char scsi_vendor[12];
167  char scsi_product[20];
168  char scsi_version[8];
169
170  /* Bus info */
171  KV_BUS_MODE bus_mode;
172  SANE_Int usb_fd;
173  char device_name[100];
174  char *scsi_device_name;
175  SCSI_FD scsi_fd;
176
177  KV_MODEL_TYPE model_type;
178
179  SANE_Parameters params[2];
180
181  /* SCSI handling */
182  SANE_Byte *buffer0;
183  SANE_Byte *buffer;		/* buffer = buffer0 + 12 */
184  /* for USB bulk transfer, a 12 bytes container
185     is required for each block */
186  /* Scanning handling. */
187  int scanning;			/* TRUE if a scan is running. */
188  int current_page;		/* the current page number, 0 is page 1 */
189  int current_side;		/* the current side */
190  int bytes_to_read[2];		/* bytes to read */
191
192  /* --------------------------------------------------------------------- */
193  /* values used by the software enhancement code (deskew, crop, etc)      */
194  SANE_Status deskew_stat;
195  int deskew_vals[2];
196  double deskew_slope;
197
198  SANE_Status crop_stat;
199  int crop_vals[4];
200
201  /* Support info */
202  KV_SUPPORT_INFO support_info;
203
204  SANE_Range x_range, y_range;
205
206  /* Options */
207  SANE_Option_Descriptor opt[OPT_NUM_OPTIONS];
208  Option_Value val[OPT_NUM_OPTIONS];
209  SANE_Bool option_set;
210
211  /* Image buffer */
212  SANE_Byte *img_buffers[2];
213  SANE_Byte *img_pt[2];
214  int img_size[2];
215} KV_DEV, *PKV_DEV;
216
217#define GET_OPT_VAL_W(dev, idx) ((dev)->val[idx].w)
218#define GET_OPT_VAL_L(dev, idx, token) get_optval_list(dev, idx, \
219        go_##token##_list, go_##token##_val)
220
221#define IS_DUPLEX(dev) GET_OPT_VAL_W(dev, OPT_DUPLEX)
222
223/* Prototypes in kvs1025_opt.c */
224
225int get_optval_list (const PKV_DEV dev, int idx,
226		     const SANE_String_Const * str_list, const int *val_list);
227KV_SCAN_MODE kv_get_mode (const PKV_DEV dev);
228int kv_get_depth (KV_SCAN_MODE mode);
229
230void kv_calc_paper_size (const PKV_DEV dev, int *w, int *h);
231
232const SANE_Option_Descriptor *kv_get_option_descriptor (PKV_DEV dev,
233							SANE_Int option);
234void kv_init_options (PKV_DEV dev);
235SANE_Status kv_control_option (PKV_DEV dev, SANE_Int option,
236			       SANE_Action action, void *val,
237			       SANE_Int * info);
238void hexdump (int level, const char *comment, unsigned char *p, int l);
239void kv_set_window_data (PKV_DEV dev,
240			 KV_SCAN_MODE scan_mode,
241			 int side, unsigned char *windowdata);
242
243/* Prototypes in kvs1025_low.c */
244
245SANE_Status kv_enum_devices (void);
246void kv_get_devices_list (const SANE_Device *** devices_list);
247void kv_exit (void);
248SANE_Status kv_open (PKV_DEV dev);
249SANE_Bool kv_already_open (PKV_DEV dev);
250SANE_Status kv_open_by_name (SANE_String_Const devicename,
251			     SANE_Handle * handle);
252void kv_close (PKV_DEV dev);
253SANE_Status kv_send_command (PKV_DEV dev,
254			     PKV_CMD_HEADER header,
255			     PKV_CMD_RESPONSE response);
256
257/* Commands */
258
259SANE_Status CMD_test_unit_ready (PKV_DEV dev, SANE_Bool * ready);
260SANE_Status CMD_read_support_info (PKV_DEV dev);
261SANE_Status CMD_scan (PKV_DEV dev);
262SANE_Status CMD_set_window (PKV_DEV dev, int side, PKV_CMD_RESPONSE rs);
263SANE_Status CMD_reset_window (PKV_DEV dev);
264SANE_Status CMD_get_buff_status (PKV_DEV dev, int *front_size,
265				 int *back_size);
266SANE_Status CMD_wait_buff_status (PKV_DEV dev, int *front_size,
267				  int *back_size);
268SANE_Status CMD_read_pic_elements (PKV_DEV dev, int page, int side,
269				   int *width, int *height);
270SANE_Status CMD_read_image (PKV_DEV dev, int page, int side,
271			    unsigned char *buffer, int *psize,
272			    KV_CMD_RESPONSE * rs);
273SANE_Status CMD_wait_document_existanse (PKV_DEV dev);
274SANE_Status CMD_get_document_existanse (PKV_DEV dev);
275SANE_Status CMD_set_timeout (PKV_DEV dev, SANE_Word timeout);
276SANE_Status CMD_request_sense (PKV_DEV dev);
277/* Scan routines */
278
279SANE_Status AllocateImageBuffer (PKV_DEV dev);
280SANE_Status ReadImageDataSimplex (PKV_DEV dev, int page);
281SANE_Status ReadImageDataDuplex (PKV_DEV dev, int page);
282SANE_Status ReadImageData (PKV_DEV dev, int page);
283
284SANE_Status buffer_deskew (PKV_DEV dev, int side);
285SANE_Status buffer_crop (PKV_DEV dev, int side);
286SANE_Status buffer_despeck (PKV_DEV dev, int side);
287int buffer_isblank (PKV_DEV dev, int side);
288SANE_Status buffer_rotate(PKV_DEV dev, int side);
289
290#endif /* #ifndef __KVS1025_LOW_H */
291