kopia lustrzana https://gitlab.com/sane-project/backends
451 wiersze
12 KiB
C
451 wiersze
12 KiB
C
/* sane - Scanner Access Now Easy.
|
|
|
|
Copyright (C) 2000 Mustek.
|
|
Originally maintained by Tom Wang <tom.wang@mustek.com.tw>
|
|
|
|
Copyright (C) 2001, 2002 by Henning Meier-Geinitz.
|
|
|
|
This file is part of the SANE package.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
MA 02111-1307, USA.
|
|
|
|
As a special exception, the authors of SANE give permission for
|
|
additional uses of the libraries contained in this release of SANE.
|
|
|
|
The exception is that, if you link a SANE library with other files
|
|
to produce an executable, this does not by itself cause the
|
|
resulting executable to be covered by the GNU General Public
|
|
License. Your use of that executable is in no way restricted on
|
|
account of linking the SANE library code into it.
|
|
|
|
This exception does not, however, invalidate any other reasons why
|
|
the executable file might be covered by the GNU General Public
|
|
License.
|
|
|
|
If you submit changes to SANE to the maintainers to be included in
|
|
a subsequent release, you agree by submitting the changes that
|
|
those changes may be distributed with this exception intact.
|
|
|
|
If you write modifications of your own for SANE, it is your choice
|
|
whether to permit this exception to apply to your modifications.
|
|
If you do not wish that, delete this exception notice.
|
|
|
|
This file implements a SANE backend for Mustek 1200UB and similar
|
|
USB flatbed scanners. */
|
|
|
|
#ifndef mustek_usb_low_h
|
|
#define mustek_usb_low_h
|
|
|
|
#include "../include/sane/sane.h"
|
|
|
|
|
|
/* ---------------------------------- macros ------------------------------ */
|
|
|
|
|
|
/* calculate the minimum/maximum values */
|
|
#if defined(MIN)
|
|
#undef MIN
|
|
#endif
|
|
#if defined(MAX)
|
|
#undef MAX
|
|
#endif
|
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
/* return the lower/upper 8 bits of a 16 bit word */
|
|
#define HIBYTE(w) ((SANE_Byte)(((SANE_Word)(w) >> 8) & 0xFF))
|
|
#define LOBYTE(w) ((SANE_Byte)(w))
|
|
/* RIE: return if error */
|
|
#define RIE(function) do {status = function; if (status != SANE_STATUS_GOOD) \
|
|
return status;} while (SANE_FALSE)
|
|
|
|
|
|
/* ---------------------------------- types ------------------------------- */
|
|
|
|
|
|
typedef enum Mustek_Type
|
|
{
|
|
MT_UNKNOWN = 0,
|
|
MT_1200USB,
|
|
MT_1200UB,
|
|
MT_1200CU,
|
|
MT_1200CU_PLUS,
|
|
MT_600CU,
|
|
MT_600USB
|
|
}
|
|
Mustek_Type;
|
|
|
|
typedef enum Sensor_Type
|
|
{
|
|
ST_NONE = 0,
|
|
ST_INI = 1,
|
|
ST_INI_DARK = 2,
|
|
ST_CANON300 = 3,
|
|
ST_CANON600 = 4,
|
|
ST_TOSHIBA600 = 5,
|
|
ST_CANON300600 = 6,
|
|
ST_NEC600 = 7
|
|
}
|
|
Sensor_Type;
|
|
|
|
typedef enum Motor_Type
|
|
{
|
|
MT_NONE = 0,
|
|
MT_600 = 1,
|
|
MT_1200 = 2
|
|
}
|
|
Motor_Type;
|
|
|
|
struct ma1017;
|
|
|
|
typedef struct ma1017
|
|
{
|
|
int fd;
|
|
|
|
SANE_Bool is_opened;
|
|
SANE_Bool is_rowing;
|
|
|
|
/* A2 */
|
|
SANE_Byte append;
|
|
SANE_Byte test_sram;
|
|
SANE_Byte fix_pattern;
|
|
/* A4 */
|
|
SANE_Byte select;
|
|
SANE_Byte frontend;
|
|
/* A6 */
|
|
SANE_Byte rgb_sel_pin;
|
|
SANE_Byte asic_io_pins;
|
|
/* A7 */
|
|
SANE_Byte timing;
|
|
SANE_Byte sram_bank;
|
|
/* A8 */
|
|
SANE_Byte dummy_msb;
|
|
SANE_Byte ccd_width_msb;
|
|
SANE_Byte cmt_table_length;
|
|
/* A9 */
|
|
SANE_Byte cmt_second_pos;
|
|
/* A10 + A8ID5 */
|
|
SANE_Word ccd_width;
|
|
/* A11 + A8ID6 */
|
|
SANE_Word dummy;
|
|
/* A12 + A13 */
|
|
SANE_Word byte_width;
|
|
/* A14 + A30W */
|
|
SANE_Word loop_count;
|
|
/* A15 */
|
|
SANE_Byte motor_enable;
|
|
SANE_Byte motor_movement;
|
|
SANE_Byte motor_direction;
|
|
SANE_Byte motor_signal;
|
|
SANE_Byte motor_home;
|
|
/* A16 */
|
|
SANE_Byte pixel_depth;
|
|
SANE_Byte image_invert;
|
|
SANE_Byte optical_600;
|
|
SANE_Byte sample_way;
|
|
/* A17 + A18 + A19 */
|
|
SANE_Byte red_ref;
|
|
SANE_Byte green_ref;
|
|
SANE_Byte blue_ref;
|
|
/* A20 + A21 + A22 */
|
|
SANE_Byte red_pd;
|
|
SANE_Byte green_pd;
|
|
SANE_Byte blue_pd;
|
|
/* A23 */
|
|
SANE_Byte a23;
|
|
/* A24 */
|
|
SANE_Byte fy1_delay;
|
|
SANE_Byte special_ad;
|
|
/* A27 */
|
|
SANE_Byte sclk;
|
|
SANE_Byte sen;
|
|
SANE_Byte serial_length;
|
|
|
|
/* Use for Rowing */
|
|
SANE_Status (*get_row) (struct ma1017 * chip, SANE_Byte * row,
|
|
SANE_Word * lines_left);
|
|
|
|
SANE_Word cmt_table_length_word;
|
|
SANE_Word cmt_second_pos_word;
|
|
SANE_Word row_size;
|
|
SANE_Word soft_resample;
|
|
SANE_Word total_lines;
|
|
SANE_Word lines_left;
|
|
SANE_Bool is_transfer_table[32];
|
|
Sensor_Type sensor;
|
|
Motor_Type motor;
|
|
Mustek_Type scanner_type;
|
|
SANE_Word max_block_size;
|
|
|
|
SANE_Word total_read_urbs;
|
|
SANE_Word total_write_urbs;
|
|
}
|
|
ma1017;
|
|
|
|
typedef enum Channel
|
|
{
|
|
CH_NONE = 0,
|
|
CH_RED = 1,
|
|
CH_GREEN = 2,
|
|
CH_BLUE = 3
|
|
}
|
|
Channel;
|
|
|
|
typedef enum Banksize
|
|
{
|
|
BS_NONE = 0,
|
|
BS_4K = 1,
|
|
BS_8K = 2,
|
|
BS_16K = 3
|
|
}
|
|
Banksize;
|
|
|
|
typedef enum Pixeldepth
|
|
{
|
|
PD_NONE = 0,
|
|
PD_1BIT = 1,
|
|
PD_4BIT = 2,
|
|
PD_8BIT = 3,
|
|
PD_12BIT = 4
|
|
}
|
|
Pixeldepth;
|
|
|
|
typedef enum Sampleway
|
|
{
|
|
SW_NONE = 0,
|
|
SW_P1P6 = 1,
|
|
SW_P2P6 = 2,
|
|
SW_P3P6 = 3,
|
|
SW_P4P6 = 4,
|
|
SW_P5P6 = 5,
|
|
SW_P6P6 = 6
|
|
}
|
|
Sampleway;
|
|
|
|
/* ------------------------- function declarations ------------------------ */
|
|
|
|
static SANE_Status usb_low_init (ma1017 ** chip);
|
|
|
|
static SANE_Status usb_low_exit (ma1017 * chip);
|
|
|
|
/* Register read and write functions */
|
|
/* A0 ~ A1 */
|
|
static SANE_Status
|
|
usb_low_set_cmt_table (ma1017 * chip, SANE_Int index, Channel channel,
|
|
SANE_Bool is_move_motor, SANE_Bool is_transfer);
|
|
|
|
/* A2 */
|
|
static SANE_Status usb_low_get_a2 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_start_cmt_table (ma1017 * chip);
|
|
|
|
static SANE_Status usb_low_stop_cmt_table (ma1017 * chip);
|
|
|
|
static SANE_Status
|
|
usb_low_set_test_sram_mode (ma1017 * chip, SANE_Bool is_test);
|
|
|
|
static SANE_Status usb_low_set_fix_pattern (ma1017 * chip, SANE_Bool is_fix);
|
|
|
|
/* A3 */
|
|
static SANE_Status usb_low_adjust_timing (ma1017 * chip, SANE_Byte data);
|
|
|
|
/* A4 */
|
|
static SANE_Status usb_low_get_a4 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_select_timing (ma1017 * chip, SANE_Byte data);
|
|
|
|
static SANE_Status
|
|
usb_low_turn_frontend_mode (ma1017 * chip, SANE_Bool is_on);
|
|
|
|
/* A6 */
|
|
static SANE_Status usb_low_get_a6 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_asic_io_pins (ma1017 * chip, SANE_Byte data);
|
|
|
|
static SANE_Status usb_low_set_rgb_sel_pins (ma1017 * chip, SANE_Byte data);
|
|
|
|
/* A7 */
|
|
static SANE_Status usb_low_get_a7 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_timing (ma1017 * chip, SANE_Byte data);
|
|
|
|
static SANE_Status usb_low_set_sram_bank (ma1017 * chip, Banksize banksize);
|
|
|
|
/* A8 */
|
|
static SANE_Status usb_low_get_a8 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status
|
|
usb_low_set_cmt_table_length (ma1017 * chip, SANE_Byte table_length);
|
|
|
|
/* A9 */
|
|
static SANE_Status usb_low_get_a9 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status
|
|
usb_low_set_cmt_second_position (ma1017 * chip, SANE_Byte position);
|
|
|
|
/* A10 + A8ID5 */
|
|
static SANE_Status usb_low_get_a10 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_ccd_width (ma1017 * chip, SANE_Word ccd_width);
|
|
|
|
/* A11 + A8ID6 */
|
|
static SANE_Status usb_low_get_a11 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_dummy (ma1017 * chip, SANE_Word dummy);
|
|
|
|
/* A12 + A13 */
|
|
static SANE_Status usb_low_get_a12 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_get_a13 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status
|
|
usb_low_set_image_byte_width (ma1017 * chip, SANE_Word row_size);
|
|
|
|
static SANE_Status
|
|
usb_low_set_soft_resample (ma1017 * chip, SANE_Word soft_resample);
|
|
|
|
/* A14 + A30W */
|
|
static SANE_Status
|
|
usb_low_set_cmt_loop_count (ma1017 * chip, SANE_Word loop_count);
|
|
|
|
/* A15 */
|
|
static SANE_Status usb_low_get_a15 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_enable_motor (ma1017 * chip, SANE_Bool is_enable);
|
|
|
|
static SANE_Status
|
|
usb_low_set_motor_movement (ma1017 * chip, SANE_Bool is_full_step,
|
|
SANE_Bool is_double_phase, SANE_Bool is_two_step);
|
|
|
|
static SANE_Status usb_low_set_motor_signal (ma1017 * chip, SANE_Byte signal);
|
|
|
|
static SANE_Status
|
|
usb_low_set_motor_direction (ma1017 * chip, SANE_Bool is_backward);
|
|
|
|
static SANE_Status
|
|
usb_low_move_motor_home (ma1017 * chip, SANE_Bool is_home,
|
|
SANE_Bool is_backward);
|
|
|
|
/* A16 */
|
|
static SANE_Status usb_low_get_a16 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status
|
|
usb_low_set_image_dpi (ma1017 * chip, SANE_Bool is_optical600,
|
|
Sampleway sampleway);
|
|
|
|
static SANE_Status
|
|
usb_low_set_pixel_depth (ma1017 * chip, Pixeldepth pixeldepth);
|
|
|
|
static SANE_Status usb_low_invert_image (ma1017 * chip, SANE_Bool is_invert);
|
|
|
|
/* A17 + A18 + A19 */
|
|
static SANE_Status usb_low_get_a17 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_get_a18 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_get_a19 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_red_ref (ma1017 * chip, SANE_Byte red_ref);
|
|
|
|
static SANE_Status usb_low_set_green_ref (ma1017 * chip, SANE_Byte green_ref);
|
|
|
|
static SANE_Status usb_low_set_blue_ref (ma1017 * chip, SANE_Byte blue_ref);
|
|
|
|
/* A20 + A21 + A22 */
|
|
static SANE_Status usb_low_get_a20 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_get_a21 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_get_a22 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_red_pd (ma1017 * chip, SANE_Byte red_pd);
|
|
|
|
static SANE_Status usb_low_set_green_pd (ma1017 * chip, SANE_Byte green_pd);
|
|
|
|
static SANE_Status usb_low_set_blue_pd (ma1017 * chip, SANE_Byte blue_pd);
|
|
|
|
/* A23 */
|
|
static SANE_Status usb_low_get_a23 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status
|
|
usb_low_turn_peripheral_power (ma1017 * chip, SANE_Bool is_on);
|
|
|
|
static SANE_Status usb_low_turn_lamp_power (ma1017 * chip, SANE_Bool is_on);
|
|
|
|
static SANE_Status usb_low_set_io_3 (ma1017 * chip, SANE_Bool is_high);
|
|
|
|
static SANE_Status
|
|
usb_low_set_led_light_all (ma1017 * chip, SANE_Bool is_light_all);
|
|
|
|
/* A24 */
|
|
static SANE_Status usb_low_get_a24 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_ad_timing (ma1017 * chip, SANE_Byte pattern);
|
|
|
|
/* A25 + A26 */
|
|
static SANE_Status usb_low_set_serial_byte1 (ma1017 * chip, SANE_Byte data);
|
|
|
|
static SANE_Status usb_low_set_serial_byte2 (ma1017 * chip, SANE_Byte data);
|
|
|
|
/* A27 */
|
|
static SANE_Status usb_low_get_a27 (ma1017 * chip, SANE_Byte * value);
|
|
|
|
static SANE_Status usb_low_set_serial_format (ma1017 * chip, SANE_Byte data);
|
|
|
|
/* A31 */
|
|
static SANE_Status usb_low_get_home_sensor (ma1017 * chip);
|
|
|
|
/* Special Mode */
|
|
static SANE_Status usb_low_start_rowing (ma1017 * chip);
|
|
|
|
static SANE_Status usb_low_stop_rowing (ma1017 * chip);
|
|
|
|
static SANE_Status usb_low_wait_rowing_stop (ma1017 * chip);
|
|
|
|
/* Global functions */
|
|
static SANE_Status usb_low_read_all_registers (ma1017 * chip);
|
|
|
|
static SANE_Status
|
|
usb_low_get_row (ma1017 * chip, SANE_Byte * data, SANE_Word * lines_left);
|
|
|
|
static SANE_Status
|
|
usb_low_get_row_direct (ma1017 * chip, SANE_Byte * data,
|
|
SANE_Word * lines_left);
|
|
|
|
static SANE_Status
|
|
usb_low_get_row_resample (ma1017 * chip, SANE_Byte * data,
|
|
SANE_Word * lines_left);
|
|
|
|
/* Direct access */
|
|
static SANE_Status usb_low_wait_rowing (ma1017 * chip);
|
|
|
|
static SANE_Status
|
|
usb_low_read_rows (ma1017 * chip, SANE_Byte * data, SANE_Word byte_count);
|
|
|
|
static SANE_Status
|
|
usb_low_write_reg (ma1017 * chip, SANE_Byte reg_no, SANE_Byte data);
|
|
|
|
static SANE_Status
|
|
usb_low_read_reg (ma1017 * chip, SANE_Byte reg_no, SANE_Byte * data);
|
|
|
|
static SANE_Status
|
|
usb_low_identify_scanner (SANE_Int fd, Mustek_Type * scanner_type);
|
|
|
|
static SANE_Status usb_low_open (ma1017 * chip, const char *devname);
|
|
|
|
static SANE_Status usb_low_close (ma1017 * chip);
|
|
|
|
#endif /* defined mustek_usb_low_h */
|