2
Copyright (C) 2008, Panasonic Russia Ltd.
3
Copyright (C) 2010, m. allan noah
6
Panasonic KV-S20xx USB-SCSI scanners.
9
#include "../include/sane/config.h"
12
/*#include <unistd.h>*/
14
#define DEBUG_DECLARE_ONLY
15
#define BACKEND_NAME kvs20xx
17
#include "../include/sane/sanei_backend.h"
18
#include "../include/sane/sanei_scsi.h"
19
#include "../include/sane/sanei_usb.h"
22
#include "kvs20xx_cmd.h"
25
usb_send_command (struct scanner *s, struct cmd *c, struct response *r,
29
struct bulk_header *h = (struct bulk_header *) buf;
30
u8 resp[sizeof (*h) + STATUS_SIZE];
31
size_t sz = sizeof (*h) + MAX_CMD_SIZE;
33
h->length = cpu2be32 (sz);
34
h->type = cpu2be16 (COMMAND_BLOCK);
35
h->code = cpu2be16 (COMMAND_CODE);
36
memcpy (h + 1, c->cmd, c->cmd_size);
38
st = sanei_usb_write_bulk (s->file, (const SANE_Byte *) h, &sz);
41
if (sz != sizeof (*h) + MAX_CMD_SIZE)
42
return SANE_STATUS_IO_ERROR;
45
sz = sizeof (*h) + c->data_size;
46
st = sanei_usb_read_bulk (s->file, (SANE_Byte *) h, &sz);
48
c->data_size = sz - sizeof (*h);
50
if (st || sz < sizeof (*h))
52
st = sanei_usb_release_interface (s->file, 0);
55
st = sanei_usb_claim_interface (s->file, 0);
58
r->status = CHECK_CONDITION;
59
return SANE_STATUS_GOOD;
63
else if (c->dir == CMD_OUT)
65
sz = sizeof (*h) + c->data_size;
66
memset (h, 0, sizeof (*h));
67
h->length = cpu2be32 (sizeof (*h) + c->data_size);
68
h->type = cpu2be16 (DATA_BLOCK);
69
h->code = cpu2be16 (DATA_CODE);
70
memcpy (h + 1, c->data, c->data_size);
71
st = sanei_usb_write_bulk (s->file, (const SANE_Byte *) h, &sz);
76
st = sanei_usb_read_bulk (s->file, resp, &sz);
77
if (st || sz != sizeof (resp))
78
return SANE_STATUS_IO_ERROR;
79
r->status = be2cpu32 (*((u32 *) (resp + sizeof (*h))));
84
sense_handler (int __sane_unused__ fd,
85
u_char * sense_buffer, void __sane_unused__ * arg)
88
SANE_Status st = SANE_STATUS_GOOD;
89
for (i = 0; i < sizeof (s_errors) / sizeof (s_errors[0]); i++)
90
if ((sense_buffer[2] & 0xf) == s_errors[i].sense
91
&& sense_buffer[12] == s_errors[i].asc
92
&& sense_buffer[13] == s_errors[i].ascq)
97
if (st == SANE_STATUS_GOOD && sense_buffer[2] & END_OF_MEDIUM)
99
if (i == sizeof (s_errors) / sizeof (s_errors[0]))
100
st = SANE_STATUS_IO_ERROR;
102
"send_command: CHECK_CONDITION: sence:0x%x ASC:0x%x ASCQ:0x%x\n",
103
sense_buffer[2], sense_buffer[12], sense_buffer[13]);
109
send_command (struct scanner * s, struct cmd * c)
111
SANE_Status st = SANE_STATUS_GOOD;
115
memset (&r, 0, sizeof (r));
116
st = usb_send_command (s, c, &r, s->buffer);
121
u8 b[sizeof (struct bulk_header) + RESPONSE_SIZE];
129
c2.cmd[0] = REQUEST_SENSE;
130
c2.cmd[4] = RESPONSE_SIZE;
131
st = usb_send_command (s, &c2, &r, b);
134
st = sense_handler (0, b + sizeof (struct bulk_header), NULL);
139
if (c->dir == CMD_OUT)
141
memcpy (s->buffer, c->cmd, c->cmd_size);
142
memcpy (s->buffer + c->cmd_size, c->data, c->data_size);
143
st = sanei_scsi_cmd (s->file, s->buffer, c->cmd_size + c->data_size,
146
else if (c->dir == CMD_IN)
149
st = sanei_scsi_cmd (s->file, c->cmd, c->cmd_size,
150
c->data, (size_t *) & c->data_size);
154
st = sanei_scsi_cmd (s->file, c->cmd, c->cmd_size, NULL, NULL);
161
test_unit_ready (struct scanner * s)
170
c.cmd[0] = TEST_UNIT_READY;
171
if (send_command (s, &c))
172
return SANE_STATUS_DEVICE_BUSY;
174
return SANE_STATUS_GOOD;
178
set_timeout (struct scanner * s, int timeout)
180
u16 t = cpu2be16 ((u16) timeout);
188
c.cmd[0] = SET_TIMEOUT;
190
*((u16 *) (c.cmd + 7)) = cpu2be16 (sizeof (t));
193
c.data_size = sizeof (t);
196
sanei_usb_set_timeout (timeout * 1000);
198
return send_command (s, &c);
202
set_window (struct scanner * s, int wnd_id)
212
c.cmd[0] = SET_WINDOW;
213
*((u16 *) (c.cmd + 7)) = cpu2be16 (sizeof (wnd));
216
c.data_size = sizeof (wnd);
218
init_window (s, &wnd, wnd_id);
220
return send_command (s, &c);
224
reset_window (struct scanner * s)
233
c.cmd[0] = SET_WINDOW;
235
return send_command (s, &c);
239
scan (struct scanner * s)
249
return send_command (s, &c);
253
document_exist (struct scanner * s)
266
set24 (c.cmd + 6, c.data_size);
267
status = send_command (s, &c);
272
return SANE_STATUS_GOOD;
274
return SANE_STATUS_NO_DOCS;
278
read_picture_element (struct scanner * s, unsigned side, SANE_Parameters * p)
292
set24 (c.cmd + 6, c.data_size);
294
status = send_command (s, &c);
297
data = (u32 *) c.data;
298
p->pixels_per_line = be2cpu32 (data[0]);
299
p->lines = be2cpu32 (data[1]);
300
return SANE_STATUS_GOOD;
304
get_buffer_status (struct scanner * s, unsigned *data_avalible)
315
c.cmd[0] = GET_BUFFER_STATUS;
318
status = send_command (s, &c);
321
data = (u32 *) c.data;
322
*data_avalible = be2cpu32 (data[3]);
323
return SANE_STATUS_GOOD;
327
read_image_data (struct scanner * s, unsigned page,
328
unsigned side, void *buf, unsigned max_size, unsigned *size)
342
c.data_size = max_size < MAX_READ_DATA_SIZE ? max_size : MAX_READ_DATA_SIZE;
344
set24 (c.cmd + 6, c.data_size);
345
status = send_command (s, &c);
347
if (status && status != SANE_STATUS_EOF)
351
DBG (DBG_INFO, "read_image_data: read %d, status %d\n", *size, status);
352
memcpy (buf, c.data, *size);
357
get_adjust_data (struct scanner * s, unsigned *dummy_length)
369
c.cmd[0] = GET_ADJUST_DATA;
372
status = send_command (s, &c);
375
data = (u16 *) c.data;
376
*dummy_length = be2cpu16 (data[0]);
377
return SANE_STATUS_GOOD;