diff options
Diffstat (limited to 'backend/hp4200.h')
-rw-r--r-- | backend/hp4200.h | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/backend/hp4200.h b/backend/hp4200.h new file mode 100644 index 0000000..13c0d7f --- /dev/null +++ b/backend/hp4200.h @@ -0,0 +1,266 @@ +/* + Copyright (C) 2000 by Adrian Perez Jorge + + 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. + */ + +#ifndef _HP4200_H +#define _HP4200_H + +#include <sys/types.h> + +#define MCLKDIV_SCALING 2 +#define NUM_REGISTERS 0x80 + +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#define max(a, b) (((a) > (b)) ? (a) : (b)) + + +/*--------------------------------------------------------------------------*/ + +#define DBG_error0 0 +#define DBG_error 1 +#define DBG_sense 2 +#define DBG_warning 3 +#define DBG_inquiry 4 +#define DBG_info 5 +#define DBG_info2 6 +#define DBG_proc 7 +#define DBG_read 8 +#define DBG_sane_init 10 +#define DBG_sane_proc 11 +#define DBG_sane_info 12 +#define DBG_sane_option 13 + +/*--------------------------------------------------------------------------*/ + +enum HP4200_Option +{ + OPT_NUM_OPTS = 0, + + OPT_RES, + + OPT_TL_X, /* top-left x */ + OPT_TL_Y, /* top-left y */ + OPT_BR_X, /* bottom-right x */ + OPT_BR_Y, /* bottom-right y */ + + OPT_BACKTRACK, + + OPT_GAMMA_VECTOR_R, + OPT_GAMMA_VECTOR_G, + OPT_GAMMA_VECTOR_B, + + OPT_PREVIEW, + + NUM_OPTIONS /* must come last */ +}; + +/* already declared in the sane includes... +typedef union +{ + SANE_Word w; + SANE_Bool b; + SANE_Fixed f; + SANE_Word *wa; +} +Option_Value; +*/ + +enum ScannerModels +{ + HP4200 +}; + +typedef struct HP4200_Device +{ + struct HP4200_Device *next; + SANE_Device dev; + SANE_Handle handle; +} +HP4200_Device; + +struct _scanner_buffer_t +{ + unsigned char *buffer; /* buffer memory space */ + int size; /* size of the buffer */ + int num_bytes; /* number of bytes left (to read) */ + unsigned char *data_ptr; /* cursor in buffer */ +}; + +typedef struct _scanner_buffer_t scanner_buffer_t; + +struct _ciclic_buffer_t +{ + int good_bytes; /* number of valid bytes of the image */ + int num_lines; /* number of lines of the ciclic buffer */ + int size; /* size in bytes of the buffer space */ + unsigned char *buffer; /* pointer to the buffer space */ + unsigned char **buffer_ptrs; /* pointers to the beginning of each + line in the buffer space */ + int can_consume; /* num of bytes the ciclic buf can consume */ + int current_line; /* current scanned line */ + int first_good_line; /* number of lines to fill the ``pipeline'' */ + unsigned char *buffer_position; /* pointer to the first byte that + can be copied */ + int pixel_position; /* pixel position in current line */ + + /* color indexes for the proper line in the ciclic buffer */ + int red_idx; + int green_idx; + int blue_idx; +}; + +typedef struct _ciclic_buffer_t ciclic_buffer_t; + +struct _hardware_parameters_t +{ + unsigned int SRAM_size; + unsigned char SRAM_bandwidth; + unsigned long crystal_frequency; + unsigned int min_pixel_data_buffer_limit; + unsigned int motor_full_steps_per_inch; + float motor_max_speed; + unsigned int scan_bar_max_speed; + unsigned int start_of_scanning_area; + unsigned int calibration_strip_height; + unsigned int scan_area_width; + double scan_area_length; /* in inches */ + unsigned int sensor_num_pixels; + unsigned int sensor_pixel_start; + unsigned int sensor_pixel_end; + int sensor_cds_state; /* 0 == off, 1 == on */ + int sensor_signal_polarity; /* 0 == ??, 1 == ?? */ + int sensor_max_integration_time; + int sensor_line_separation; + int sensor_type; + unsigned int sensor_resolution; + int sensor_control_signals_polarity; + int sensor_control_signals_state; + int sensor_control_pixel_rate_timing; + int sensor_control_line_rate_timing; + unsigned int sensor_black_clamp_timing; /* ??? */ + unsigned int sensor_CIS_timing; + int sensor_toshiba_timing; + int sensor_color_modes; /* bitmask telling color modes supported */ + int illumination_mode; + int motor_control_mode; + int motor_paper_sense_mode; + int motor_pause_reverse_mode; + int misc_io_mode; + int num_tr_pulses; + int guard_band_duration; + int pulse_duration; + int fsteps_25_speed; + int fsteps_50_speed; + int steps_to_reverse; + struct + { + int red; + int green; + int blue; + } + target_value; + unsigned short home_sensor; +}; + +typedef struct _hardware_parameters_t hardware_parameters_t; + +struct _user_parameters_t +{ + unsigned int image_width; + unsigned int lines_to_scan; + unsigned int horizontal_resolution; + unsigned int vertical_resolution; + int hres_reduction_method; /* interpolation/??? */ + int vres_reduction_method; + SANE_Bool color; /* color/grayscale */ + int bpp; + int scan_mode; /* preview/full scan */ + SANE_Bool no_reverse; + SANE_Word gamma[3][1024]; /* gamma table for rgb */ +}; + +typedef struct _user_parameters_t user_parameters_t; + +struct _measured_parameters_t +{ + unsigned int datalink_bandwidth; + struct + { + int red; + int green; + int blue; + } + coarse_calibration_data; + struct + { + int *pRedOffset; + int *pGreenOffset; + int *pBlueOffset; + int *pRedGain; + int *pGreenGain; + int *pBlueGain; + } + fine_calibration_data; + int max_integration_time; + int color_mode; +}; + +typedef struct _measured_parameters_t measured_parameters_t; + +struct _runtime_parameters_t +{ + long num_bytes_left_to_scan; + int status_bytes; /* number of status bytes per line */ + int image_line_size; /* line size in bytes without status bytes */ + int scanner_line_size; /* line size in bytes including the + status bytes */ + int first_pixel; /* first pixel in the line to be scanned */ + int steps_to_skip; +}; + +typedef struct _runtime_parameters_t runtime_parameters_t; + +struct _HP4200_Scanner +{ + struct _HP4200_Scanner *next; + + SANE_Option_Descriptor opt[NUM_OPTIONS]; + Option_Value val[NUM_OPTIONS]; + + SANE_Bool scanning; + SANE_Bool aborted_by_user; + + SANE_Parameters params; + + HP4200_Device *dev; + hardware_parameters_t hw_parms; + user_parameters_t user_parms; + measured_parameters_t msrd_parms; + unsigned int regs[NUM_REGISTERS]; + int mclk; + float mclk_div; + + int fd; + + ciclic_buffer_t ciclic_buffer; + scanner_buffer_t scanner_buffer; + runtime_parameters_t runtime_parms; +}; + +typedef struct _HP4200_Scanner HP4200_Scanner; + +#endif /* !_HP4200_H */ |