diff options
Diffstat (limited to 'backend/kvs1025_low.h')
-rw-r--r-- | backend/kvs1025_low.h | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/backend/kvs1025_low.h b/backend/kvs1025_low.h new file mode 100644 index 0000000..9c92832 --- /dev/null +++ b/backend/kvs1025_low.h @@ -0,0 +1,290 @@ +/* + Copyright (C) 2008, Panasonic Russia Ltd. +*/ +/* sane - Scanner Access Now Easy. + Panasonic KV-S1020C / KV-S1025C USB scanners. +*/ + +#ifndef __KVS1025_LOW_H +#define __KVS1025_LOW_H + +#include "kvs1025_cmds.h" + +#define VENDOR_ID 0x04DA + +typedef enum +{ + KV_S1020C = 0x1007, + KV_S1025C = 0x1006, + KV_S1045C = 0x1010 +} KV_MODEL_TYPE; + +/* Store an integer in 2, 3 or 4 byte in a big-endian array. */ +#define Ito16(val, buf) { \ + ((unsigned char *)buf)[0] = ((val) >> 8) & 0xff; \ + ((unsigned char *)buf)[1] = ((val) >> 0) & 0xff; \ +} + +#define Ito24(val, buf) { \ + ((unsigned char *)buf)[0] = ((val) >> 16) & 0xff; \ + ((unsigned char *)buf)[1] = ((val) >> 8) & 0xff; \ + ((unsigned char *)buf)[2] = ((val) >> 0) & 0xff; \ +} + +#define Ito32(val, buf) { \ + ((unsigned char *)buf)[0] = ((val) >> 24) & 0xff; \ + ((unsigned char *)buf)[1] = ((val) >> 16) & 0xff; \ + ((unsigned char *)buf)[2] = ((val) >> 8) & 0xff; \ + ((unsigned char *)buf)[3] = ((val) >> 0) & 0xff; \ +} + +/* 32 bits from an array to an integer (eg ntohl). */ +#define B32TOI(buf) \ + ((((unsigned char *)buf)[0] << 24) | \ + (((unsigned char *)buf)[1] << 16) | \ + (((unsigned char *)buf)[2] << 8) | \ + (((unsigned char *)buf)[3] << 0)) + +/* 24 bits from an array to an integer. */ +#define B24TOI(buf) \ + (((unsigned char *)buf)[0] << 16) | \ + (((unsigned char *)buf)[1] << 8) | \ + (((unsigned char *)buf)[2] << 0)) + +#define SCSI_FD int +#define SCSI_BUFFER_SIZE (0x40000-12) + +typedef enum +{ + KV_SCSI_BUS = 0x01, + KV_USB_BUS = 0x02 +} KV_BUS_MODE; + +typedef enum +{ + SM_BINARY = 0x00, + SM_DITHER = 0x01, + SM_GRAYSCALE = 0x02, + SM_COLOR = 0x05 +} KV_SCAN_MODE; + +typedef struct +{ + unsigned char data[16]; + int len; +} CDB; + +typedef struct +{ + int width; + int height; +} KV_PAPER_SIZE; + +/* remarked -- KV-S1020C / KV-S1025C supports ADF only +typedef enum +{ + TRUPER_ADF = 0, + TRUPER_FLATBED = 1 +} KV_SCAN_SOURCE; +*/ + +/* options */ +typedef enum +{ + OPT_NUM_OPTS = 0, + + /* General options */ + OPT_MODE_GROUP, + OPT_MODE, /* scanner modes */ + OPT_RESOLUTION, /* X and Y resolution */ + OPT_DUPLEX, /* Duplex mode */ + OPT_SCAN_SOURCE, /* Scan source, fixed to ADF */ + OPT_FEEDER_MODE, /* Feeder mode, fixed to Continous */ + OPT_LONGPAPER, /* Long paper mode */ + OPT_LENGTHCTL, /* Length control mode */ + OPT_MANUALFEED, /* Manual feed mode */ + OPT_FEED_TIMEOUT, /* Feed timeout */ + OPT_DBLFEED, /* Double feed detection mode */ + OPT_FIT_TO_PAGE, /* Scanner shrinks image to fit scanned page */ + + /* Geometry group */ + OPT_GEOMETRY_GROUP, + OPT_PAPER_SIZE, /* Paper size */ + OPT_LANDSCAPE, /* true if landscape; new for Truper 3200/3600 */ + OPT_TL_X, /* upper left X */ + OPT_TL_Y, /* upper left Y */ + OPT_BR_X, /* bottom right X */ + OPT_BR_Y, /* bottom right Y */ + + OPT_ENHANCEMENT_GROUP, + OPT_BRIGHTNESS, /* Brightness */ + OPT_CONTRAST, /* Contrast */ + OPT_AUTOMATIC_THRESHOLD, /* Binary threshold */ + OPT_HALFTONE_PATTERN, /* Halftone pattern */ + OPT_AUTOMATIC_SEPARATION, /* Automatic separation */ + OPT_WHITE_LEVEL, /* White level */ + OPT_NOISE_REDUCTION, /* Noise reduction */ + OPT_IMAGE_EMPHASIS, /* Image emphasis */ + OPT_GAMMA, /* Gamma */ + OPT_LAMP, /* Lamp -- color drop out */ + OPT_INVERSE, /* Inverse image */ + OPT_MIRROR, /* Mirror image */ + OPT_JPEG, /* JPEG Compression */ + OPT_ROTATE, /* Rotate image */ + + OPT_SWDESKEW, /* Software deskew */ + OPT_SWDESPECK, /* Software despeckle */ + OPT_SWDEROTATE, /* Software detect/correct 90 deg. rotation */ + OPT_SWCROP, /* Software autocrop */ + OPT_SWSKIP, /* Software blank page skip */ + + /* must come last: */ + OPT_NUM_OPTIONS +} KV_OPTION; + +typedef struct +{ + int memory_size; /* in MB */ + int min_resolution; /* in DPI */ + int max_resolution; /* in DPI */ + int step_resolution; /* in DPI */ + int support_duplex; /* 1 if true */ + int support_lamp; /* 1 if true */ + int max_x_range; /* in mm */ + int max_y_range; /* in mm */ +} KV_SUPPORT_INFO; + +typedef struct kv_scanner_dev +{ + struct kv_scanner_dev *next; + + SANE_Device sane; + + /* Infos from inquiry. */ + char scsi_type; + char scsi_type_str[32]; + char scsi_vendor[12]; + char scsi_product[20]; + char scsi_version[8]; + + /* Bus info */ + KV_BUS_MODE bus_mode; + SANE_Int usb_fd; + char device_name[100]; + char *scsi_device_name; + SCSI_FD scsi_fd; + + KV_MODEL_TYPE model_type; + + SANE_Parameters params[2]; + + /* SCSI handling */ + SANE_Byte *buffer0; + SANE_Byte *buffer; /* buffer = buffer0 + 12 */ + /* for USB bulk transfer, a 12 bytes container + is required for each block */ + /* Scanning handling. */ + int scanning; /* TRUE if a scan is running. */ + int current_page; /* the current page number, 0 is page 1 */ + int current_side; /* the current side */ + int bytes_to_read[2]; /* bytes to read */ + + /* --------------------------------------------------------------------- */ + /* values used by the software enhancment code (deskew, crop, etc) */ + SANE_Status deskew_stat; + int deskew_vals[2]; + double deskew_slope; + + SANE_Status crop_stat; + int crop_vals[4]; + + /* Support info */ + KV_SUPPORT_INFO support_info; + + SANE_Range x_range, y_range; + + /* Options */ + SANE_Option_Descriptor opt[OPT_NUM_OPTIONS]; + Option_Value val[OPT_NUM_OPTIONS]; + SANE_Bool option_set; + + /* Image buffer */ + SANE_Byte *img_buffers[2]; + SANE_Byte *img_pt[2]; + int img_size[2]; +} KV_DEV, *PKV_DEV; + +#define GET_OPT_VAL_W(dev, idx) ((dev)->val[idx].w) +#define GET_OPT_VAL_L(dev, idx, token) get_optval_list(dev, idx, \ + go_##token##_list, go_##token##_val) + +#define IS_DUPLEX(dev) GET_OPT_VAL_W(dev, OPT_DUPLEX) + +/* Prototypes in kvs1025_opt.c */ + +int get_optval_list (const PKV_DEV dev, int idx, + const SANE_String_Const * str_list, const int *val_list); +KV_SCAN_MODE kv_get_mode (const PKV_DEV dev); +int kv_get_depth (KV_SCAN_MODE mode); + +void kv_calc_paper_size (const PKV_DEV dev, int *w, int *h); + +const SANE_Option_Descriptor *kv_get_option_descriptor (PKV_DEV dev, + SANE_Int option); +void kv_init_options (PKV_DEV dev); +SANE_Status kv_control_option (PKV_DEV dev, SANE_Int option, + SANE_Action action, void *val, + SANE_Int * info); +void hexdump (int level, const char *comment, unsigned char *p, int l); +void kv_set_window_data (PKV_DEV dev, + KV_SCAN_MODE scan_mode, + int side, unsigned char *windowdata); + +/* Prototypes in kvs1025_low.c */ + +SANE_Status kv_enum_devices (void); +void kv_get_devices_list (const SANE_Device *** devices_list); +void kv_exit (void); +SANE_Status kv_open (PKV_DEV dev); +SANE_Bool kv_already_open (PKV_DEV dev); +SANE_Status kv_open_by_name (SANE_String_Const devicename, + SANE_Handle * handle); +void kv_close (PKV_DEV dev); +SANE_Status kv_send_command (PKV_DEV dev, + PKV_CMD_HEADER header, + PKV_CMD_RESPONSE response); + +/* Commands */ + +SANE_Status CMD_test_unit_ready (PKV_DEV dev, SANE_Bool * ready); +SANE_Status CMD_read_support_info (PKV_DEV dev); +SANE_Status CMD_scan (PKV_DEV dev); +SANE_Status CMD_set_window (PKV_DEV dev, int side, PKV_CMD_RESPONSE rs); +SANE_Status CMD_reset_window (PKV_DEV dev); +SANE_Status CMD_get_buff_status (PKV_DEV dev, int *front_size, + int *back_size); +SANE_Status CMD_wait_buff_status (PKV_DEV dev, int *front_size, + int *back_size); +SANE_Status CMD_read_pic_elements (PKV_DEV dev, int page, int side, + int *width, int *height); +SANE_Status CMD_read_image (PKV_DEV dev, int page, int side, + unsigned char *buffer, int *psize, + KV_CMD_RESPONSE * rs); +SANE_Status CMD_wait_document_existanse (PKV_DEV dev); +SANE_Status CMD_get_document_existanse (PKV_DEV dev); +SANE_Status CMD_set_timeout (PKV_DEV dev, SANE_Word timeout); +SANE_Status CMD_request_sense (PKV_DEV dev); +/* Scan routines */ + +SANE_Status AllocateImageBuffer (PKV_DEV dev); +SANE_Status ReadImageDataSimplex (PKV_DEV dev, int page); +SANE_Status ReadImageDataDuplex (PKV_DEV dev, int page); +SANE_Status ReadImageData (PKV_DEV dev, int page); + +SANE_Status buffer_deskew (PKV_DEV dev, int side); +SANE_Status buffer_crop (PKV_DEV dev, int side); +SANE_Status buffer_despeck (PKV_DEV dev, int side); +int buffer_isblank (PKV_DEV dev, int side); +SANE_Status buffer_rotate(PKV_DEV dev, int side); + +#endif /* #ifndef __KVS1025_LOW_H */ |