kopia lustrzana https://gitlab.com/sane-project/backends
* backend/fujitsu.[ch], backend/fujitsu-scsi.h: backend v81
- increase USB timeouts - enable get_pixelsize() to update scan params after set_window() - remove even_scan_line hackmerge-requests/1/head
rodzic
399a23cb9f
commit
df25acfd38
14
ChangeLog
14
ChangeLog
|
@ -1,9 +1,15 @@
|
|||
2008-10-20 m. allan noah <kitno455 a t gmail d o t com>
|
||||
* backend/fujitsu.[ch], backend/fujitsu-scsi.h: backend v81
|
||||
- increase USB timeouts
|
||||
- enable get_pixelsize() to update scan params after set_window()
|
||||
- remove even_scan_line hack
|
||||
|
||||
2008-10-19 Nicolas Martin <nicols-guest at users.alioth.debian.org>
|
||||
* configure.in, configure,
|
||||
backend/pixma_bjnp.c, backend/pixma_bjnp.h, backend/pixma_bjnp_private.h,
|
||||
* configure.in, configure, backend/pixma_bjnp.c,
|
||||
backend/pixma_bjnp.h, backend/pixma_bjnp_private.h,
|
||||
pixma.h, doc/descriptions/pixma.desc:
|
||||
From Louis Lagendijk for bjnp protocol on pixma backend, add a header check
|
||||
for ifaddrs.h (necessary on different platforms BeOS, OS/2, ...)
|
||||
From Louis Lagendijk for bjnp protocol on pixma backend, add a header
|
||||
check for ifaddrs.h (necessary on different platforms BeOS, OS/2, ...)
|
||||
Increment pixma backend version number.
|
||||
|
||||
2008-10-15 Stéphane Voltz <stef.dev@free.fr>
|
||||
|
|
|
@ -12,12 +12,12 @@
|
|||
#define USB_COMMAND_CODE 0x43
|
||||
#define USB_COMMAND_LEN 0x1F
|
||||
#define USB_COMMAND_OFFSET 0x13
|
||||
#define USB_COMMAND_TIME 10000
|
||||
#define USB_DATA_TIME 10000
|
||||
#define USB_COMMAND_TIME 30000
|
||||
#define USB_DATA_TIME 30000
|
||||
#define USB_STATUS_CODE 0x53
|
||||
#define USB_STATUS_LEN 0x0D
|
||||
#define USB_STATUS_OFFSET 0x09
|
||||
#define USB_STATUS_TIME 10000
|
||||
#define USB_STATUS_TIME 30000
|
||||
|
||||
/*static inline void */
|
||||
static void
|
||||
|
@ -466,6 +466,7 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
|
|||
#define set_R_window_id(sb, val) sb[0x05] = val
|
||||
#define set_R_xfer_length(sb, val) putnbyte(sb + 0x06, val, 3)
|
||||
|
||||
#define R_PSIZE_len 0x18
|
||||
#define get_PSIZE_num_x(in) getnbyte(in + 0x00, 4)
|
||||
#define get_PSIZE_num_y(in) getnbyte(in + 0x04, 4)
|
||||
#define get_PSIZE_paper_w(in) getnbyte(in + 0x08, 4)
|
||||
|
|
|
@ -390,6 +390,10 @@
|
|||
- add quirks for fi-6x70
|
||||
v80 2008-10-08, MAN
|
||||
- front-side endorser uses data ID 0x80
|
||||
v81 2008-10-20, MAN
|
||||
- increase USB timeouts
|
||||
- enable get_pixelsize() to update scan params after set_window()
|
||||
- remove even_scan_line hack
|
||||
|
||||
SANE FLOW DIAGRAM
|
||||
|
||||
|
@ -450,7 +454,7 @@
|
|||
#include "fujitsu.h"
|
||||
|
||||
#define DEBUG 1
|
||||
#define BUILD 80
|
||||
#define BUILD 81
|
||||
|
||||
/* values for SANE_DEBUG_FUJITSU env var:
|
||||
- errors 5
|
||||
|
@ -1913,19 +1917,10 @@ init_model (struct fujitsu *s)
|
|||
|| strstr (s->model_name, "fi-4990") ) {
|
||||
|
||||
/* weirdness */
|
||||
s->even_scan_line = 1;
|
||||
s->duplex_interlace = DUPLEX_INTERLACE_NONE;
|
||||
s->color_interlace = COLOR_INTERLACE_RRGGBB;
|
||||
}
|
||||
|
||||
/* some firmware versions use capital f? */
|
||||
else if (strstr (s->model_name, "Fi-5900")
|
||||
|| strstr (s->model_name, "fi-5900") ) {
|
||||
|
||||
/* weirdness */
|
||||
s->even_scan_line = 1;
|
||||
}
|
||||
|
||||
else if (strstr (s->model_name,"fi-6230")
|
||||
|| strstr (s->model_name,"fi-6240")){
|
||||
|
||||
|
@ -1934,13 +1929,6 @@ init_model (struct fujitsu *s)
|
|||
s->max_y_fb = 14173;
|
||||
}
|
||||
|
||||
else if (strstr (s->model_name, "fi-6670")
|
||||
|| strstr (s->model_name, "fi-6770") ) {
|
||||
|
||||
/* weirdness */
|
||||
s->even_scan_line = 1;
|
||||
}
|
||||
|
||||
DBG (10, "init_model: finish\n");
|
||||
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -5691,34 +5679,23 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
|
|||
}
|
||||
|
||||
/* not started? get param data from user settings */
|
||||
else{
|
||||
int dir = 1;
|
||||
int pw = get_page_width(s);
|
||||
int ph = get_page_height(s);
|
||||
|
||||
else {
|
||||
DBG (15, "sane_get_parameters: not started, updating\n");
|
||||
|
||||
DBG(15,"sane_get_parameters: x: max=%d, page=%d, curr=%d, res=%d\n",
|
||||
s->max_x, s->page_width, pw, s->resolution_x);
|
||||
|
||||
DBG(15,"sane_get_parameters: y: max=%d, page=%d, curr=%d, res=%d\n",
|
||||
s->max_y, s->page_height, ph, s->resolution_y);
|
||||
|
||||
DBG(15,"sane_get_parameters: usr: tlx=%d, brx=%d, pixx=%d\n",
|
||||
s->tl_x, s->br_x, (s->resolution_x * (s->br_x - s->tl_x) / 1200));
|
||||
|
||||
DBG(15,"sane_get_parameters: usr: tly=%d, bry=%d, pixy=%d\n",
|
||||
s->tl_y, s->br_y, (s->resolution_y * (s->br_y - s->tl_y) / 1200));
|
||||
|
||||
/* this backend only sends single frame images */
|
||||
params->last_frame = 1;
|
||||
|
||||
params->pixels_per_line = s->resolution_x * (s->br_x - s->tl_x) / 1200;
|
||||
|
||||
params->lines = s->resolution_y * (s->br_y - s->tl_y) / 1200;
|
||||
|
||||
if (s->mode == MODE_COLOR) {
|
||||
params->format = SANE_FRAME_RGB;
|
||||
params->depth = 8;
|
||||
if(s->compress == COMP_JPEG){
|
||||
params->format = SANE_FRAME_JPEG;
|
||||
}
|
||||
params->bytes_per_line = params->pixels_per_line * 3;
|
||||
}
|
||||
else if (s->mode == MODE_GRAYSCALE) {
|
||||
params->format = SANE_FRAME_GRAY;
|
||||
|
@ -5726,85 +5703,29 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
|
|||
if(s->compress == COMP_JPEG){
|
||||
params->format = SANE_FRAME_JPEG;
|
||||
}
|
||||
params->bytes_per_line = params->pixels_per_line;
|
||||
}
|
||||
else {
|
||||
params->format = SANE_FRAME_GRAY;
|
||||
params->depth = 1;
|
||||
params->bytes_per_line = (params->pixels_per_line+7) / 8;
|
||||
}
|
||||
|
||||
/* adjust x data in a loop */
|
||||
while(1){
|
||||
|
||||
params->pixels_per_line =
|
||||
s->resolution_x * (s->br_x - s->tl_x) / 1200;
|
||||
|
||||
/* bytes per line differs by mode */
|
||||
if (s->mode == MODE_COLOR) {
|
||||
params->bytes_per_line = params->pixels_per_line * 3;
|
||||
}
|
||||
else if (s->mode == MODE_GRAYSCALE) {
|
||||
params->bytes_per_line = params->pixels_per_line;
|
||||
}
|
||||
else {
|
||||
params->bytes_per_line = params->pixels_per_line / 8;
|
||||
}
|
||||
|
||||
/* binary and jpeg must have width in multiple of 8 pixels */
|
||||
/* plus, some larger scanners require even bytes per line */
|
||||
/* so change the user's scan width and try again */
|
||||
/* FIXME: should change a 'hidden' copy instead? */
|
||||
if(
|
||||
((params->depth == 1 || params->format == SANE_FRAME_JPEG)
|
||||
&& params->pixels_per_line % 8)
|
||||
|| (s->even_scan_line && params->bytes_per_line % 8)
|
||||
){
|
||||
|
||||
/* dont round up larger than current max width */
|
||||
if(s->br_x >= pw){
|
||||
dir = -1;
|
||||
}
|
||||
s->br_x += dir;
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBG(15,"sane_get_parameters: adj: tlx=%d, brx=%d, pixx=%d\n",
|
||||
s->tl_x, s->br_x, (s->resolution_x * (s->br_x - s->tl_x) / 1200));
|
||||
|
||||
dir = 1;
|
||||
|
||||
/* adjust y data in a loop */
|
||||
while(1){
|
||||
|
||||
params->lines =
|
||||
s->resolution_y * (s->br_y - s->tl_y) / 1200;
|
||||
|
||||
/* jpeg must have length in multiple of 8 pixels */
|
||||
/* so change the user's scan length and try again */
|
||||
if( params->format == SANE_FRAME_JPEG && params->lines % 8 ){
|
||||
|
||||
/* dont round up larger than current max length */
|
||||
if(s->br_y >= ph){
|
||||
dir = -1;
|
||||
}
|
||||
s->br_y += dir;
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBG(15,"sane_get_parameters: adj: tly=%d, bry=%d, pixy=%d\n",
|
||||
s->tl_y, s->br_y, (s->resolution_y * (s->br_y - s->tl_y) / 1200));
|
||||
}
|
||||
|
||||
DBG (15, "sane_get_parameters: scan_x=%d, Bpl=%d, depth=%d\n",
|
||||
params->pixels_per_line, params->bytes_per_line, params->depth );
|
||||
|
||||
DBG (15, "sane_get_parameters: scan_y=%d, frame=%d, last=%d\n",
|
||||
params->lines, params->format, params->last_frame );
|
||||
|
||||
DBG(15,"sane_get_parameters: x: max=%d, page=%d, gpw=%d, res=%d\n",
|
||||
s->max_x, s->page_width, get_page_width(s), s->resolution_x);
|
||||
|
||||
DBG(15,"sane_get_parameters: y: max=%d, page=%d, gph=%d, res=%d\n",
|
||||
s->max_y, s->page_height, get_page_height(s), s->resolution_y);
|
||||
|
||||
DBG(15,"sane_get_parameters: area: tlx=%d, brx=%d, tly=%d, bry=%d\n",
|
||||
s->tl_x, s->br_x, s->tl_y, s->br_y);
|
||||
|
||||
DBG (15, "sane_get_parameters: params: ppl=%d, Bpl=%d, lines=%d\n",
|
||||
params->pixels_per_line, params->bytes_per_line, params->lines);
|
||||
|
||||
DBG (15, "sane_get_parameters: params: format=%d, depth=%d, last=%d\n",
|
||||
params->format, params->depth, params->last_frame);
|
||||
|
||||
DBG (10, "sane_get_parameters: finish\n");
|
||||
|
||||
|
@ -5882,6 +5803,13 @@ sane_start (SANE_Handle handle)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* try to read actual scan size from scanner */
|
||||
ret = get_pixelsize(s);
|
||||
if (ret != SANE_STATUS_GOOD) {
|
||||
DBG (5, "sane_start: ERROR: cannot get pixelsize\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* start/stop endorser */
|
||||
ret = endorser(s);
|
||||
if (ret != SANE_STATUS_GOOD) {
|
||||
|
@ -6396,37 +6324,112 @@ set_window (struct fujitsu *s)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* update our private copy of params with actual data size scanner reports */
|
||||
static SANE_Status
|
||||
get_pixelsize(struct fujitsu *s)
|
||||
{
|
||||
SANE_Status ret;
|
||||
unsigned char buf[0x18];
|
||||
size_t inLen = sizeof(buf);
|
||||
|
||||
unsigned char cmd[READ_len];
|
||||
size_t cmdLen = READ_len;
|
||||
|
||||
unsigned char in[R_PSIZE_len];
|
||||
size_t inLen = R_PSIZE_len;
|
||||
|
||||
DBG (10, "get_pixelsize: start\n");
|
||||
|
||||
set_R_datatype_code (readB.cmd, R_datatype_pixelsize);
|
||||
set_R_window_id (readB.cmd, WD_wid_front);
|
||||
if(/*s->source == SOURCE_ADF_DUPLEX ||*/ s->source == SOURCE_ADF_BACK){
|
||||
set_R_window_id (readB.cmd, WD_wid_back);
|
||||
}
|
||||
set_R_xfer_length (readB.cmd, inLen);
|
||||
|
||||
memset(cmd,0,cmdLen);
|
||||
set_SCSI_opcode(cmd, READ_code);
|
||||
set_R_datatype_code (cmd, R_datatype_pixelsize);
|
||||
set_R_window_id (cmd, WD_wid_front);
|
||||
set_R_xfer_length (cmd, inLen);
|
||||
|
||||
ret = do_cmd (
|
||||
s, 1, 0,
|
||||
readB.cmd, readB.size,
|
||||
cmd, cmdLen,
|
||||
NULL, 0,
|
||||
buf, &inLen
|
||||
in, &inLen
|
||||
);
|
||||
if (ret == SANE_STATUS_GOOD){
|
||||
|
||||
hexdump(5, "get_pixelsize:", buf, inLen);
|
||||
s->params.pixels_per_line = get_PSIZE_num_x(in);
|
||||
s->params.lines = get_PSIZE_num_y(in);
|
||||
|
||||
/* bytes per line differs by mode */
|
||||
if (s->mode == MODE_COLOR) {
|
||||
s->params.bytes_per_line = s->params.pixels_per_line * 3;
|
||||
}
|
||||
else if (s->mode == MODE_GRAYSCALE) {
|
||||
s->params.bytes_per_line = s->params.pixels_per_line;
|
||||
}
|
||||
else {
|
||||
s->params.bytes_per_line = s->params.pixels_per_line / 8;
|
||||
}
|
||||
|
||||
DBG (15, "get_pixelsize: scan_x=%d, Bpl=%d, scan_y=%d\n",
|
||||
s->params.pixels_per_line, s->params.bytes_per_line, s->params.lines );
|
||||
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* if READ pixelsize fails, we attempt to guess */
|
||||
else {
|
||||
int dir = 1;
|
||||
|
||||
/* adjust x data in a loop */
|
||||
while(1){
|
||||
|
||||
/* binary and jpeg must have width in multiple of 8 pixels */
|
||||
/* plus, some larger scanners require even bytes per line */
|
||||
/* so change the scan width and try again */
|
||||
if(
|
||||
((params->depth == 1 || params->format == SANE_FRAME_JPEG)
|
||||
&& params->pixels_per_line % 8)
|
||||
|| (s->even_scan_line && params->bytes_per_line % 8)
|
||||
){
|
||||
/* dont round up larger than current max width */
|
||||
if(s->br_x >= pw){
|
||||
dir = -1;
|
||||
}
|
||||
s->br_x += dir;
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBG(15,"sane_get_parameters: adj: tlx=%d, brx=%d, pixx=%d\n",
|
||||
s->tl_x, s->br_x, (s->resolution_x * (s->br_x - s->tl_x) / 1200));
|
||||
|
||||
dir = 1;
|
||||
|
||||
/* adjust y data in a loop */
|
||||
while(1){
|
||||
|
||||
/* jpeg must have length in multiple of 8 pixels */
|
||||
/* so change the user's scan length and try again */
|
||||
if( params->format == SANE_FRAME_JPEG && params->lines % 8 ){
|
||||
|
||||
/* dont round up larger than current max length */
|
||||
if(s->br_y >= ph){
|
||||
dir = -1;
|
||||
}
|
||||
s->br_y += dir;
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBG(15,"sane_get_parameters: adj: tly=%d, bry=%d, pixy=%d\n",
|
||||
s->tl_y, s->br_y, (s->resolution_y * (s->br_y - s->tl_y) / 1200));
|
||||
}
|
||||
#endif
|
||||
|
||||
DBG (10, "get_pixelsize: finish\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Issues the SCSI OBJECT POSITION command if an ADF is in use.
|
||||
|
@ -7794,10 +7797,10 @@ do_usb_cmd(struct fujitsu *s, int runRS, int shortTime,
|
|||
DBG (10, "do_usb_cmd: start\n");
|
||||
|
||||
if(shortTime){
|
||||
cmdTime = USB_COMMAND_TIME/20;
|
||||
outTime = USB_DATA_TIME/20;
|
||||
inTime = USB_DATA_TIME/20;
|
||||
statTime = USB_STATUS_TIME/20;
|
||||
cmdTime = USB_COMMAND_TIME/60;
|
||||
outTime = USB_DATA_TIME/60;
|
||||
inTime = USB_DATA_TIME/60;
|
||||
statTime = USB_STATUS_TIME/60;
|
||||
}
|
||||
|
||||
/* build a USB packet around the SCSI command */
|
||||
|
|
|
@ -310,7 +310,6 @@ struct fujitsu
|
|||
int duplex_interlace; /* different models interlace sides differently */
|
||||
int jpeg_interlace; /* different models interlace jpeg sides differently */
|
||||
int cropping_mode; /* lower-end scanners dont crop from paper size */
|
||||
int even_scan_line; /* need even number of bytes in a scanline (fi-5900) */
|
||||
int ghs_in_rs;
|
||||
int window_gamma;
|
||||
int endorser_string_len;
|
||||
|
@ -746,10 +745,6 @@ static SANE_Status mode_select_overscan (struct fujitsu *s);
|
|||
|
||||
static SANE_Status set_sleep_mode(struct fujitsu *s);
|
||||
|
||||
#if 0
|
||||
static SANE_Status get_pixelsize(struct fujitsu *s);
|
||||
#endif
|
||||
|
||||
int get_page_width (struct fujitsu *s);
|
||||
int get_page_height (struct fujitsu *s);
|
||||
|
||||
|
@ -757,6 +752,7 @@ static SANE_Status send_lut (struct fujitsu *s);
|
|||
static SANE_Status send_endorser (struct fujitsu *s);
|
||||
static SANE_Status endorser (struct fujitsu *s);
|
||||
static SANE_Status set_window (struct fujitsu *s);
|
||||
static SANE_Status get_pixelsize(struct fujitsu *s);
|
||||
|
||||
static SANE_Status start_scan (struct fujitsu *s);
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue