diff options
Diffstat (limited to 'backend/kvs20xx.h')
-rw-r--r-- | backend/kvs20xx.h | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/backend/kvs20xx.h b/backend/kvs20xx.h new file mode 100644 index 0000000..9bc833d --- /dev/null +++ b/backend/kvs20xx.h @@ -0,0 +1,211 @@ +#ifndef __KVS20XX_H +#define __KVS20XX_H + +/* + Copyright (C) 2008, Panasonic Russia Ltd. + Copyright (C) 2010, m. allan noah +*/ +/* + Panasonic KV-S20xx USB-SCSI scanners. +*/ + +#include <sys/param.h> + +#undef BACKEND_NAME +#define BACKEND_NAME kvs20xx + +#define DBG_ERR 1 +#define DBG_WARN 2 +#define DBG_MSG 3 +#define DBG_INFO 4 +#define DBG_DBG 5 + +#define PANASONIC_ID 0x04da +#define KV_S2025C 0xdeadbeef +#define KV_S2045C 0xdeadbeee +#define KV_S2026C 0x1000 +#define KV_S2046C 0x1001 +#define KV_S2048C 0x1009 +#define KV_S2028C 0x100a +#define USB 1 +#define SCSI 2 +#define MAX_READ_DATA_SIZE 0x10000 +#define BULK_HEADER_SIZE 12 + +typedef unsigned char u8; +typedef unsigned u32; +typedef unsigned short u16; + +#define SIDE_FRONT 0x00 +#define SIDE_BACK 0x80 + +/* options */ +typedef enum +{ + NUM_OPTS = 0, + + /* General options */ + MODE_GROUP, + MODE, /* scanner modes */ + RESOLUTION, /* X and Y resolution */ + + DUPLEX, /* Duplex mode */ + FEEDER_MODE, /* Feeder mode, fixed to Continous */ + LENGTHCTL, /* Length control mode */ + MANUALFEED, /* Manual feed mode */ + FEED_TIMEOUT, /* Feed timeout */ + DBLFEED, /* Double feed detection mode */ + FIT_TO_PAGE, /* Scanner shrinks image to fit scanned page */ + + /* Geometry group */ + GEOMETRY_GROUP, + PAPER_SIZE, /* Paper size */ + LANDSCAPE, /* true if landscape */ + TL_X, /* upper left X */ + TL_Y, /* upper left Y */ + BR_X, /* bottom right X */ + BR_Y, /* bottom right Y */ + + ADVANCED_GROUP, + BRIGHTNESS, /* Brightness */ + CONTRAST, /* Contrast */ + THRESHOLD, /* Binary threshold */ + IMAGE_EMPHASIS, /* Image emphasis */ + GAMMA_CORRECTION, /* Gamma correction */ + LAMP, /* Lamp -- color drop out */ + /* must come last: */ + NUM_OPTIONS +} KV_OPTION; + +#ifndef SANE_OPTION +typedef union +{ + SANE_Bool b; /**< bool */ + SANE_Word w; /**< word */ + SANE_Word *wa; /**< word array */ + SANE_String s; /**< string */ +} +Option_Value; +#define SANE_OPTION 1 +#endif + +struct scanner +{ + unsigned id; + int scanning; + int page; + int side; + int bus; + SANE_Int file; + SANE_Option_Descriptor opt[NUM_OPTIONS]; + Option_Value val[NUM_OPTIONS]; + SANE_Parameters params; + u8 *buffer; + u8 *data; + unsigned side_size; + unsigned read; + unsigned dummy_size; + unsigned saved_dummy_size; +}; + +struct window +{ + u8 reserved[6]; + u16 window_descriptor_block_length; + + u8 window_identifier; + u8 reserved2; + u16 x_resolution; + u16 y_resolution; + u32 upper_left_x; + u32 upper_left_y; + u32 width; + u32 length; + u8 brightness; + u8 threshold; + u8 contrast; + u8 image_composition; + u8 bit_per_pixel; + u16 halftone_pattern; + u8 reserved3; + u16 bit_ordering; + u8 compression_type; + u8 compression_argument; + u8 reserved4[6]; + + u8 vendor_unique_identifier; + u8 nobuf_fstspeed_dfstop; + u8 mirror_image; + u8 image_emphasis; + u8 gamma_correction; + u8 mcd_lamp_dfeed_sens; + u8 reserved5; + u8 document_size; + u32 document_width; + u32 document_length; + u8 ahead_deskew_dfeed_scan_area_fspeed_rshad; + u8 continuous_scanning_pages; + u8 automatic_threshold_mode; + u8 automatic_separation_mode; + u8 standard_white_level_mode; + u8 b_wnr_noise_reduction; + u8 mfeed_toppos_btmpos_dsepa_hsepa_dcont_rstkr; + u8 stop_mode; +} __attribute__((__packed__)); + +void kvs20xx_init_options (struct scanner *); +void kvs20xx_init_window (struct scanner *s, struct window *wnd, int wnd_id); + +static inline u16 +swap_bytes16 (u16 x) +{ + return x << 8 | x >> 8; +} +static inline u32 +swap_bytes32 (u32 x) +{ + return x << 24 | x >> 24 | + (x & (u32) 0x0000ff00UL) << 8 | (x & (u32) 0x00ff0000UL) >> 8; +} + +#if __BYTE_ORDER == __BIG_ENDIAN +static inline void +set24 (u8 * p, u32 x) +{ + p[2] = x >> 16; + p[1] = x >> 8; + p[0] = x >> 0; +} + +#define cpu2be16(x) (x) +#define cpu2be32(x) (x) +#define cpu2le16(x) swap_bytes16(x) +#define cpu2le32(x) swap_bytes32(x) +#define le2cpu16(x) swap_bytes16(x) +#define le2cpu32(x) swap_bytes32(x) +#define be2cpu16(x) (x) +#define be2cpu32(x) (x) +#define BIT_ORDERING 0 +#elif __BYTE_ORDER == __LITTLE_ENDIAN +static inline void +set24 (u8 * p, u32 x) +{ + p[0] = x >> 16; + p[1] = x >> 8; + p[2] = x >> 0; +} + +#define cpu2le16(x) (x) +#define cpu2le32(x) (x) +#define cpu2be16(x) swap_bytes16(x) +#define cpu2be32(x) swap_bytes32(x) +#define le2cpu16(x) (x) +#define le2cpu32(x) (x) +#define be2cpu16(x) swap_bytes16(x) +#define be2cpu32(x) swap_bytes32(x) +#define BIT_ORDERING 1 +#else +#error __BYTE_ORDER not defined +#endif + +#endif /*__KVS20XX_H*/ |