1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
|
/*
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, see <https://www.gnu.org/licenses/>.
*/
#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))
#ifndef PATH_MAX
#define PATH_MAX 1024
#endif
/*--------------------------------------------------------------------------*/
#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 */
|