• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
15 typedef 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 
57 typedef enum
58 {
59   KV_SCSI_BUS = 0x01,
60   KV_USB_BUS = 0x02
61 } KV_BUS_MODE;
62 
63 typedef enum
64 {
65   SM_BINARY = 0x00,
66   SM_DITHER = 0x01,
67   SM_GRAYSCALE = 0x02,
68   SM_COLOR = 0x05
69 } KV_SCAN_MODE;
70 
71 typedef struct
72 {
73   unsigned char data[16];
74   int len;
75 } CDB;
76 
77 typedef struct
78 {
79   int width;
80   int height;
81 } KV_PAPER_SIZE;
82 
83 /* remarked -- KV-S1020C / KV-S1025C supports ADF only
84 typedef enum
85 {
86     TRUPER_ADF         = 0,
87     TRUPER_FLATBED     = 1
88 } KV_SCAN_SOURCE;
89 */
90 
91 /* options */
92 typedef 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 
145 typedef 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 
157 typedef 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 
225 int get_optval_list (const PKV_DEV dev, int idx,
226 		     const SANE_String_Const * str_list, const int *val_list);
227 KV_SCAN_MODE kv_get_mode (const PKV_DEV dev);
228 int kv_get_depth (KV_SCAN_MODE mode);
229 
230 void kv_calc_paper_size (const PKV_DEV dev, int *w, int *h);
231 
232 const SANE_Option_Descriptor *kv_get_option_descriptor (PKV_DEV dev,
233 							SANE_Int option);
234 void kv_init_options (PKV_DEV dev);
235 SANE_Status kv_control_option (PKV_DEV dev, SANE_Int option,
236 			       SANE_Action action, void *val,
237 			       SANE_Int * info);
238 void hexdump (int level, const char *comment, unsigned char *p, int l);
239 void 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 
245 SANE_Status kv_enum_devices (void);
246 void kv_get_devices_list (const SANE_Device *** devices_list);
247 void kv_exit (void);
248 SANE_Status kv_open (PKV_DEV dev);
249 SANE_Bool kv_already_open (PKV_DEV dev);
250 SANE_Status kv_open_by_name (SANE_String_Const devicename,
251 			     SANE_Handle * handle);
252 void kv_close (PKV_DEV dev);
253 SANE_Status kv_send_command (PKV_DEV dev,
254 			     PKV_CMD_HEADER header,
255 			     PKV_CMD_RESPONSE response);
256 
257 /* Commands */
258 
259 SANE_Status CMD_test_unit_ready (PKV_DEV dev, SANE_Bool * ready);
260 SANE_Status CMD_read_support_info (PKV_DEV dev);
261 SANE_Status CMD_scan (PKV_DEV dev);
262 SANE_Status CMD_set_window (PKV_DEV dev, int side, PKV_CMD_RESPONSE rs);
263 SANE_Status CMD_reset_window (PKV_DEV dev);
264 SANE_Status CMD_get_buff_status (PKV_DEV dev, int *front_size,
265 				 int *back_size);
266 SANE_Status CMD_wait_buff_status (PKV_DEV dev, int *front_size,
267 				  int *back_size);
268 SANE_Status CMD_read_pic_elements (PKV_DEV dev, int page, int side,
269 				   int *width, int *height);
270 SANE_Status CMD_read_image (PKV_DEV dev, int page, int side,
271 			    unsigned char *buffer, int *psize,
272 			    KV_CMD_RESPONSE * rs);
273 SANE_Status CMD_wait_document_existanse (PKV_DEV dev);
274 SANE_Status CMD_get_document_existanse (PKV_DEV dev);
275 SANE_Status CMD_set_timeout (PKV_DEV dev, SANE_Word timeout);
276 SANE_Status CMD_request_sense (PKV_DEV dev);
277 /* Scan routines */
278 
279 SANE_Status AllocateImageBuffer (PKV_DEV dev);
280 SANE_Status ReadImageDataSimplex (PKV_DEV dev, int page);
281 SANE_Status ReadImageDataDuplex (PKV_DEV dev, int page);
282 SANE_Status ReadImageData (PKV_DEV dev, int page);
283 
284 SANE_Status buffer_deskew (PKV_DEV dev, int side);
285 SANE_Status buffer_crop (PKV_DEV dev, int side);
286 SANE_Status buffer_despeck (PKV_DEV dev, int side);
287 int buffer_isblank (PKV_DEV dev, int side);
288 SANE_Status buffer_rotate(PKV_DEV dev, int side);
289 
290 #endif /* #ifndef __KVS1025_LOW_H */
291