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