1 /* $NetBSD: ss_mustek.c,v 1.39 2009/10/21 21:12:06 rmind Exp $ */
4 * Copyright (c) 1995 Joachim Koenig-Baltes. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by Joachim Koenig-Baltes.
17 * 4. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 * special driver for MUSTEK flatbed scanners MFS 06000CX and MFS 12000CX
34 * these scanners come with their own scsi card, containing an NCR53C400
35 * SCSI controller chip. I'm in the progress of writing a driver for this
36 * card to work under NetBSD-current. I've hooked it up to a Seagate ST01
37 * hostadapter in the meantime, giving 350KB/sec for higher resolutions!
39 * I tried to connect it to my Adaptec 1542B, but with no success. It seems,
40 * it does not like synchronous negotiation between Hostadapter and other
41 * targets, but I could not turn this off for the 1542B.
43 * There is also an other reason why you would not like to connect it to your
44 * favourite SCSI host adapter: The Mustek DOES NOT DISCONNECT. It will block
45 * other traffic from the bus while a transfer is active.
48 #include <sys/cdefs.h>
49 __KERNEL_RCSID(0, "$NetBSD: ss_mustek.c,v 1.39 2009/10/21 21:12:06 rmind Exp $");
51 #include <sys/param.h>
52 #include <sys/kernel.h>
53 #include <sys/systm.h>
54 #include <sys/fcntl.h>
55 #include <sys/errno.h>
56 #include <sys/ioctl.h>
57 #include <sys/malloc.h>
61 #include <sys/device.h>
62 #include <sys/conf.h> /* for cdevsw */
63 #include <sys/scanio.h>
65 #include <dev/scsipi/scsipi_all.h>
66 #include <dev/scsipi/scsi_all.h>
67 #include <dev/scsipi/scsi_scanner.h>
68 #include <dev/scsipi/scsipiconf.h>
69 #include <dev/scsipi/scsipi_base.h>
70 #include <dev/scsipi/ssvar.h>
71 #include <dev/scsipi/ss_mustek.h>
73 #define MUSTEK_RETRIES 4
75 static int mustek_get_params(struct ss_softc
*);
76 static int mustek_set_params(struct ss_softc
*, struct scan_io
*);
77 static int mustek_trigger_scanner(struct ss_softc
*);
78 static void mustek_minphys(struct ss_softc
*, struct buf
*);
79 static int mustek_read(struct ss_softc
*, struct buf
*);
80 static int mustek_rewind_scanner(struct ss_softc
*);
82 /* only used internally */
83 static int mustek_get_status(struct ss_softc
*, int, int);
84 static void mustek_compute_sizes(struct ss_softc
*);
87 * structure for the special handlers
89 static struct ss_special mustek_special
= {
91 mustek_trigger_scanner
,
95 mustek_rewind_scanner
,
96 NULL
, /* no adf support right now */
97 NULL
/* no adf support right now */
101 * mustek_attach: attach special functions to ss
104 mustek_attach(struct ss_softc
*ss
, struct scsipibus_attach_args
*sa
)
107 struct scsipi_periph
*periph
= sa
->sa_periph
;
110 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_attach: start\n"));
111 ss
->sio
.scan_scanner_type
= 0;
113 printf("\n%s: ", device_xname(&ss
->sc_dev
));
115 /* first, check the model which determines resolutions */
116 if (!memcmp(sa
->sa_inqbuf
.product
, "MFS-06000CX", 11)) {
117 ss
->sio
.scan_scanner_type
= MUSTEK_06000CX
;
118 printf("Mustek 6000CX Flatbed 3-pass color scanner, 3 - 600 dpi\n");
120 if (!memcmp(sa
->sa_inqbuf
.product
, "MFS-12000CX", 11)) {
121 ss
->sio
.scan_scanner_type
= MUSTEK_12000CX
;
122 printf("Mustek 12000CX Flatbed 3-pass color scanner, 6 - 1200 dpi\n");
125 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_attach: scanner_type = %d\n",
126 ss
->sio
.scan_scanner_type
));
128 /* install special handlers */
129 ss
->special
= &mustek_special
;
132 * populate the scanio struct with legal values
133 * the default should come from user space
135 ss
->sio
.scan_width
= 1200;
136 ss
->sio
.scan_height
= 1200;
137 ss
->sio
.scan_x_resolution
= 99;
138 ss
->sio
.scan_y_resolution
= 99;
139 ss
->sio
.scan_x_origin
= 0;
140 ss
->sio
.scan_y_origin
= 0;
141 ss
->sio
.scan_brightness
= 100;
142 ss
->sio
.scan_contrast
= 100;
143 ss
->sio
.scan_quality
= 100;
144 ss
->sio
.scan_image_mode
= SIM_GRAYSCALE
;
146 mustek_compute_sizes(ss
);
150 mustek_get_params (struct ss_softc
*ss
)
157 * check the parameters if the mustek is capable of fulfilling it
158 * but don't send the command to the scanner in case the user wants
159 * to change parameters by more than one call
162 mustek_set_params(struct ss_softc
*ss
, struct scan_io
*sio
)
167 * if the scanner is triggered, then rewind it
169 if (ss
->flags
& SSF_TRIGGERED
) {
170 error
= mustek_rewind_scanner(ss
);
175 /* size constraints: 8.5" horizontally and 14" vertically */
176 #ifdef MUSTEK_INCH_SPEC
177 /* sizes must be a multiple of 1/8" */
178 sio
->scan_x_origin
-= sio
->scan_x_origin
% 150;
179 sio
->scan_y_origin
-= sio
->scan_y_origin
% 150;
180 sio
->scan_width
-= sio
->scan_width
% 150;
181 sio
->scan_height
-= sio
->scan_height
% 150;
183 if (sio
->scan_width
== 0 ||
184 sio
->scan_x_origin
+ sio
->scan_width
> 10200 ||
185 sio
->scan_height
== 0 ||
186 sio
->scan_y_origin
+ sio
->scan_height
> 16800)
190 * for now, only realize the values for the MUSTEK_06000CX
191 * in the future, values for the MUSTEK_12000CX will be implemented
195 * resolution (dpi) must be <= 300 and a multiple of 3 or
196 * between 300 and 600 and a multiple of 30
198 sio
->scan_x_resolution
-= sio
->scan_x_resolution
<= 300 ?
199 sio
->scan_x_resolution
% 3 : sio
->scan_x_resolution
% 30;
200 sio
->scan_y_resolution
-= sio
->scan_y_resolution
<= 300 ?
201 sio
->scan_y_resolution
% 3 : sio
->scan_y_resolution
% 30;
202 if (sio
->scan_x_resolution
< 3 || sio
->scan_x_resolution
> 600 ||
203 sio
->scan_x_resolution
!= sio
->scan_y_resolution
)
206 /* assume brightness values are between 64 and 136 in steps of 3 */
207 sio
->scan_brightness
-= (sio
->scan_brightness
- 64) % 3;
208 if (sio
->scan_brightness
< 64 || sio
->scan_brightness
> 136)
211 /* contrast values must be between 16 and 184 in steps of 7 */
212 sio
->scan_contrast
-= (sio
->scan_contrast
- 16) % 7;
213 if (sio
->scan_contrast
< 16 || sio
->scan_contrast
> 184)
217 * velocity: between 0 (fast) and 4 (slow) which will be mapped
218 * to 100% = 4, 80% = 3, 60% = 2, 40% = 1, 20% = 0
219 * must be a multiple of 20
221 sio
->scan_quality
-= sio
->scan_quality
% 20;
222 if (sio
->scan_quality
< 20 || sio
->scan_quality
> 100)
225 switch (sio
->scan_image_mode
) {
226 case SIM_BINARY_MONOCHROME
:
227 case SIM_DITHERED_MONOCHROME
:
237 /* change ss_softc to the new values, but save ro-variables */
238 sio
->scan_scanner_type
= ss
->sio
.scan_scanner_type
;
239 memcpy(&ss
->sio
, sio
, sizeof(struct scan_io
));
241 mustek_compute_sizes(ss
);
247 * trim the requested transfer to a multiple of the line size
248 * this is called only from ssread() which guarantees, scanner is triggered
249 * In the future, it will trim the transfer to not read to much at a time
250 * because the mustek cannot disconnect. It will be calculated by the
251 * resolution, the velocity and the number of bytes per line.
254 mustek_minphys(struct ss_softc
*ss
, struct buf
*bp
)
257 struct scsipi_periph
*periph
= ss
->sc_periph
;
260 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_minphys: before: %d\n",
262 bp
->b_bcount
-= bp
->b_bcount
%
263 ((ss
->sio
.scan_pixels_per_line
* ss
->sio
.scan_bits_per_pixel
) / 8);
264 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_minphys: after: %d\n",
269 * trigger the scanner to start a scan operation
270 * this includes sending the mode- and window-data, starting the scanner
271 * and getting the image size info
274 mustek_trigger_scanner(struct ss_softc
*ss
)
276 struct mustek_mode_select_cmd mode_cmd
;
277 struct mustek_mode_select_data mode_data
;
278 struct mustek_set_window_cmd window_cmd
;
279 struct mustek_set_window_data window_data
;
280 struct mustek_start_scan_cmd start_scan_cmd
;
281 struct scsipi_periph
*periph
= ss
->sc_periph
;
282 int pixel_tlx
, pixel_tly
, pixel_brx
, pixel_bry
, paperlength
;
285 mustek_compute_sizes(ss
);
287 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_trigger_scanner\n"));
290 * set the window params and send the scsi command
292 memset(&window_cmd
, 0, sizeof(window_cmd
));
293 window_cmd
.opcode
= MUSTEK_SET_WINDOW
;
294 window_cmd
.length
= sizeof(window_data
);
296 memset(&window_data
, 0, sizeof(window_data
));
297 window_data
.frame
.header
= MUSTEK_LINEART_BACKGROUND
| MUSTEK_UNIT_SPEC
;
298 #ifdef MUSTEK_INCH_SPEC
299 /* the positional values are all 1 byte because 256 / 8 = 32" */
300 pixel_tlx
= ss
->sio
.scan_x_origin
/ 150;
301 pixel_tly
= ss
->sio
.scan_y_origin
/ 150;
302 pixel_brx
= pixel_tlx
+ ss
->sio
.scan_width
/ 150;
303 pixel_bry
= pixel_tly
+ ss
->sio
.scan_height
/ 150;
305 pixel_tlx
= (ss
->sio
.scan_x_origin
* ss
->sio
.scan_x_resolution
) / 1200;
306 pixel_tly
= (ss
->sio
.scan_y_origin
* ss
->sio
.scan_y_resolution
) / 1200;
307 pixel_brx
= pixel_tlx
+
308 (ss
->sio
.scan_width
* ss
->sio
.scan_x_resolution
) / 1200;
309 pixel_bry
= pixel_tly
+
310 (ss
->sio
.scan_height
* ss
->sio
.scan_y_resolution
) / 1200;
312 _lto2l(pixel_tlx
, window_data
.frame
.tl_x
);
313 _lto2l(pixel_tly
, window_data
.frame
.tl_y
);
314 _lto2l(pixel_brx
, window_data
.frame
.br_x
);
315 _lto2l(pixel_bry
, window_data
.frame
.br_y
);
317 #if MUSTEK_WINDOWS >= 1
318 window_data
.window1
= window_data
.frame
;
319 window_data
.window1
.header
= MUSTEK_WINDOW_MASK
| MUSTEK_UNIT_SPEC
;
322 /* send the set window command to the scanner */
323 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_set_parms: set_window\n"));
324 error
= scsipi_command(periph
, (void *)&window_cmd
, sizeof(window_cmd
),
325 (void *)&window_data
, sizeof(window_data
),
326 MUSTEK_RETRIES
, 5000, NULL
, XS_CTL_DATA_OUT
);
331 * do what it takes to actualize the mode
333 memset(&mode_cmd
, 0, sizeof(mode_cmd
));
334 mode_cmd
.opcode
= MUSTEK_MODE_SELECT
;
335 _lto2b(sizeof(mode_data
), mode_cmd
.length
);
337 memset(&mode_data
, 0, sizeof(mode_data
));
339 MUSTEK_MODE_MASK
| MUSTEK_HT_PATTERN_BUILTIN
| MUSTEK_UNIT_SPEC
;
340 if (ss
->sio
.scan_x_resolution
<= 300) {
341 mode_data
.resolution
= ss
->sio
.scan_x_resolution
/ 3;
344 * the resolution values is computed by modulo 100, but not
345 * for 600dpi, where the value is 100 (a bit tricky, but ...)
347 mode_data
.resolution
=
348 ((ss
->sio
.scan_x_resolution
- 1) % 100) + 1;
350 mode_data
.brightness
= (ss
->sio
.scan_brightness
- 64) / 3;
351 mode_data
.contrast
= (ss
->sio
.scan_contrast
- 16) / 7;
353 mode_data
.velocity
= ss
->sio
.scan_quality
/ 20 - 1;
354 #ifdef MUSTEK_INCH_SPEC
355 paperlength
= 14 * 8; /* 14" */
357 paperlength
= 14 * ss
->sio
.scan_y_resolution
; /* 14" */
359 _lto2l(paperlength
, mode_data
.paperlength
);
361 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_trigger_scanner: mode_select\n"));
362 /* send the command to the scanner */
363 error
= scsipi_command(periph
, (void *)&mode_cmd
, sizeof(mode_cmd
),
364 (void *)&mode_data
, sizeof(mode_data
),
365 MUSTEK_RETRIES
, 5000, NULL
, XS_CTL_DATA_OUT
);
370 * now construct and send the start command
372 memset(&start_scan_cmd
, 0, sizeof(start_scan_cmd
));
373 start_scan_cmd
.opcode
= MUSTEK_START_STOP
;
374 start_scan_cmd
.mode
= MUSTEK_SCAN_START
;
375 if (ss
->sio
.scan_x_resolution
<= 300)
376 start_scan_cmd
.mode
|= MUSTEK_RES_STEP_1
;
378 start_scan_cmd
.mode
|= MUSTEK_RES_STEP_10
;
379 switch (ss
->sio
.scan_image_mode
) {
380 case SIM_BINARY_MONOCHROME
:
381 case SIM_DITHERED_MONOCHROME
:
382 start_scan_cmd
.mode
|= MUSTEK_BIT_MODE
| MUSTEK_GRAY_FILTER
;
385 start_scan_cmd
.mode
|= MUSTEK_GRAY_MODE
| MUSTEK_GRAY_FILTER
;
388 start_scan_cmd
.mode
|= MUSTEK_GRAY_MODE
| MUSTEK_RED_FILTER
;
391 start_scan_cmd
.mode
|= MUSTEK_GRAY_MODE
| MUSTEK_GREEN_FILTER
;
394 start_scan_cmd
.mode
|= MUSTEK_GRAY_MODE
| MUSTEK_BLUE_FILTER
;
398 /* send the command to the scanner */
399 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_trigger_scanner: start_scan\n"));
400 error
= scsipi_command(periph
,
401 (void *)&start_scan_cmd
, sizeof(start_scan_cmd
),
403 MUSTEK_RETRIES
, 5000, NULL
, 0);
408 * now check if scanner ready this time with update of size info
409 * we wait here so that if the user issues a read directly afterwards,
410 * the scanner will respond directly (otherwise we had to sleep with
411 * a buffer locked in memory)
413 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_trigger_scanner: get_status\n"));
414 error
= mustek_get_status(ss
, 60, 1);
422 * stop a scan operation in progress
425 mustek_rewind_scanner(struct ss_softc
*ss
)
427 struct mustek_start_scan_cmd cmd
;
428 struct scsipi_periph
*periph
= ss
->sc_periph
;
431 if (ss
->sio
.scan_window_size
!= 0) {
433 * only if not all data has been read, the scanner has to be
436 memset(&cmd
, 0, sizeof(cmd
));
437 cmd
.opcode
= MUSTEK_START_STOP
;
438 cmd
.mode
= MUSTEK_SCAN_STOP
;
440 /* send the command to the scanner */
441 SC_DEBUG(periph
, SCSIPI_DB1
,
442 ("mustek_rewind_scanner: stop_scan\n"));
443 error
= scsipi_command(periph
,
444 (void *)&cmd
, sizeof(cmd
),
446 MUSTEK_RETRIES
, 5000, NULL
, 0);
451 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_rewind_scanner: end\n"));
457 * read the requested number of bytes/lines from the scanner
460 mustek_read(struct ss_softc
*ss
, struct buf
*bp
)
462 struct mustek_read_cmd cmd
;
463 struct scsipi_xfer
*xs
;
464 struct scsipi_periph
*periph
= ss
->sc_periph
;
465 u_long lines_to_read
;
468 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_read: start\n"));
470 memset(&cmd
, 0, sizeof(cmd
));
471 cmd
.opcode
= MUSTEK_READ
;
473 /* instead of the bytes, the mustek wants the number of lines */
474 lines_to_read
= bp
->b_bcount
/
475 ((ss
->sio
.scan_pixels_per_line
* ss
->sio
.scan_bits_per_pixel
) / 8);
476 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_read: read %ld lines\n",
478 _lto3b(lines_to_read
, cmd
.length
);
481 * go ask the adapter to do all this for us
483 xs
= scsipi_make_xs(periph
,
484 (struct scsipi_generic
*) &cmd
, sizeof(cmd
),
485 (u_char
*) bp
->b_data
, bp
->b_bcount
,
486 MUSTEK_RETRIES
, 10000, bp
,
487 XS_CTL_NOSLEEP
| XS_CTL_ASYNC
| XS_CTL_DATA_IN
);
490 * out of memory. Keep this buffer in the queue, and
493 callout_reset(&ss
->sc_callout
, hz
/ 2, ssrestart
,
498 if (bufq_get(ss
->buf_queue
) != bp
)
499 panic("ssstart(): dequeued wrong buf");
501 bufq_get(ss
->buf_queue
);
503 error
= scsipi_execute_xs(xs
);
504 /* with a scsipi_xfer preallocated, scsipi_command can't fail */
506 ss
->sio
.scan_lines
-= lines_to_read
;
508 if (ss
->sio
.scan_lines
< 0)
509 ss
->sio
.scan_lines
= 0;
511 ss
->sio
.scan_window_size
-= bp
->b_bcount
;
513 if (ss
->sio
.scan_window_size
< 0)
514 ss
->sio
.scan_window_size
= 0;
520 * check if the scanner is ready to take commands
521 * wait timeout seconds and try only every second
522 * if update, then update picture size info
524 * returns EBUSY if scanner not ready
527 mustek_get_status(struct ss_softc
*ss
, int timeout
, int update
)
529 struct mustek_get_status_cmd cmd
;
530 struct mustek_get_status_data data
;
531 struct scsipi_periph
*periph
= ss
->sc_periph
;
532 int error
, lines
, bytes_per_line
;
534 memset(&cmd
, 0, sizeof(cmd
));
535 cmd
.opcode
= MUSTEK_GET_STATUS
;
536 cmd
.length
= sizeof(data
);
539 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_get_status: stat_cmd\n"));
540 error
= scsipi_command(periph
, (void *)&cmd
, sizeof(cmd
),
541 (void *)&data
, sizeof(data
),
542 MUSTEK_RETRIES
, 5000, NULL
, XS_CTL_DATA_IN
);
545 if ((data
.ready_busy
== MUSTEK_READY
) ||
548 /* please wait a second */
549 tsleep((void *)mustek_get_status
, PRIBIO
+ 1, "mtkrdy", hz
);
553 bytes_per_line
= _2ltol(data
.bytes_per_line
);
554 lines
= _3ltol(data
.lines
);
555 if (lines
!= ss
->sio
.scan_lines
) {
556 printf("mustek: lines actual(%d) != computed(%ld)\n",
557 lines
, ss
->sio
.scan_lines
);
560 if (bytes_per_line
* lines
!= ss
->sio
.scan_window_size
) {
561 printf("mustek: win-size actual(%d) != computed(%ld)\n",
562 bytes_per_line
* lines
, ss
->sio
.scan_window_size
);
566 SC_DEBUG(periph
, SCSIPI_DB1
,
567 ("mustek_get_size: bpl=%ld, lines=%ld\n",
568 (ss
->sio
.scan_pixels_per_line
* ss
->sio
.scan_bits_per_pixel
) / 8,
569 ss
->sio
.scan_lines
));
570 SC_DEBUG(periph
, SCSIPI_DB1
, ("window size = %ld\n",
571 ss
->sio
.scan_window_size
));
574 SC_DEBUG(periph
, SCSIPI_DB1
, ("mustek_get_status: end\n"));
575 if (data
.ready_busy
== MUSTEK_READY
)
582 * mustek_compute_sizes: compute window_size and lines for the picture
583 * this function is called from different places in the code
586 mustek_compute_sizes(struct ss_softc
*ss
)
589 switch (ss
->sio
.scan_image_mode
) {
590 case SIM_BINARY_MONOCHROME
:
591 case SIM_DITHERED_MONOCHROME
:
592 ss
->sio
.scan_bits_per_pixel
= 1;
598 ss
->sio
.scan_bits_per_pixel
= 8;
603 * horizontal number of bytes is always a multiple of 2,
604 * in 8-bit mode at least
606 ss
->sio
.scan_pixels_per_line
=
607 (ss
->sio
.scan_width
* ss
->sio
.scan_x_resolution
) / 1200;
608 if (ss
->sio
.scan_bits_per_pixel
== 1)
609 /* make it a multiple of 16, and thus of 2 bytes */
610 ss
->sio
.scan_pixels_per_line
=
611 (ss
->sio
.scan_pixels_per_line
+ 15) & 0xfffffff0;
613 ss
->sio
.scan_pixels_per_line
=
614 (ss
->sio
.scan_pixels_per_line
+ 1) & 0xfffffffe;
617 (ss
->sio
.scan_height
* ss
->sio
.scan_y_resolution
) / 1200;
618 ss
->sio
.scan_window_size
= ss
->sio
.scan_lines
*
619 ((ss
->sio
.scan_pixels_per_line
* ss
->sio
.scan_bits_per_pixel
) / 8);