1/* sane - Scanner Access Now Easy. 2 3 This file is part of the SANE package, and implements a SANE backend 4 for various Corex Cardscan scanners. 5 6 Copyright (C) 2007-2015 m. allan noah 7 8 -------------------------------------------------------------------------- 9 10 This program is free software; you can redistribute it and/or 11 modify it under the terms of the GNU General Public License as 12 published by the Free Software Foundation; either version 2 of the 13 License, or (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, but 16 WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program. If not, see <https://www.gnu.org/licenses/>. 22 23 As a special exception, the authors of SANE give permission for 24 additional uses of the libraries contained in this release of SANE. 25 26 The exception is that, if you link a SANE library with other files 27 to produce an executable, this does not by itself cause the 28 resulting executable to be covered by the GNU General Public 29 License. Your use of that executable is in no way restricted on 30 account of linking the SANE library code into it. 31 32 This exception does not, however, invalidate any other reasons why 33 the executable file might be covered by the GNU General Public 34 License. 35 36 If you submit changes to SANE to the maintainers to be included in 37 a subsequent release, you agree by submitting the changes that 38 those changes may be distributed with this exception intact. 39 40 If you write modifications of your own for SANE, it is your choice 41 whether to permit this exception to apply to your modifications. 42 If you do not wish that, delete this exception notice. 43 44 -------------------------------------------------------------------------- 45 46 The source code is divided in sections which you can easily find by 47 searching for the tag "@@". 48 49 Section 1 - Init & static stuff 50 Section 2 - sane_init, _get_devices, _open & friends 51 Section 3 - sane_*_option functions 52 Section 4 - sane_start, _get_param, _read & friends 53 Section 5 - sane_close functions 54 Section 6 - misc functions 55 56 Changes: 57 v0, 2007-05-09, MAN (SANE v1.0.19) 58 - initial release 59 v1, 2008-02-14, MAN 60 - sanei_config_read has already cleaned string (#310597) 61 v2, 2010-02-10, MAN 62 - add lines_per_block config option 63 - add has_cal_buffer config option 64 - basic support for 600c 65 - clean #include lines 66 v3, 2015-11-04, MAN 67 - add USB IDs for newer model 800c 68 69################################################## 70 DATA FROM TRACE OF WINDOWS DRIVER: 71 72cmd packet format: 73cmdcode cmdlenlow cmdlenhigh cmdpayloadbytes 74 75resp packet format: 76respcode paperfound resplenlow resplenhigh respayloadbytes 77 78############ status read loop? ################## 79>> 01 01 00 00 80<< 81 00 07 00 00 09 0c 61 c2 7a 0a 81>> 34 00 00 82<< b4 00 00 00 83>> 01 01 00 00 84<< 81 00 07 00 00 09 0c 61 c2 7a 0a 85>> 34 00 00 86<< b4 00 00 00 87>> 01 01 00 00 88<< 81 00 07 00 00 09 0c 61 c2 7a 0a 89 90############# scanner settings read? (0x04b8 is scan width) ############# 91>> 48 00 00 92<< c8 00 0c 00 b8 04 60 00 00 80 00 00 00 58 ca 7d 93 94############## color and gray calibration data read ############ 95>> 45 00 00 96<< 0x2600 bytes, bbbBBBgggGGGrrrRRRxxxXXX 97 98############ 34/b4 and 01/81 status loop til paper inserted ############## 99 100>> 35 01 00 00 101<< b5 01 01 00 00 102 103always together? { 104>> 14 05 00 80 1b 28 00 0f 105<< 94 01 05 00 80 1b 28 00 0f 106>> 22 01 00 00 107<< a2 01 01 00 00 108} 109 110>> 1a 01 00 66 111<< 9a 01 01 00 66 112 113>> 19 03 00 51 62 49 114<< 99 01 03 00 51 62 49 115 116############# heat up lamp? ################# 117===========color=================== 118three times { 119>> 18 07 00 00 01 60 00 61 00 07 120<< 0x40 read and 0x03 read 121the 3 byte drops from f4 f4 f4 to 17 10 08 etc. 122} 123===========gray=================== 124three times { 125>> 12 06 00 00 01 60 00 61 00 126<< 0x40 read and 0x01 read 127} 128the 1 byte drops from f4 to 02 129================================== 130 131>> 35 01 00 00 132<< b5 01 01 00 00 133 134>> 13 01 00 28 135<< 93 01 01 00 28 136 137===========color=================== 138three times { 139>> 18 07 00 01 10 60 00 18 05 07 140<< 0xe2c0 read 141} 142 14314/94 and 22/a2 144 145many times { 146>> 18 07 00 01 10 60 00 18 05 07 147<< 0xe2c0 read 148} 149===========gray=================== 150two times { 151>> 12 06 00 01 10 60 00 18 05 152<< 0x4bc0 read 153} 154 15514/94 and 22/a2 156 157many times { 158>> 12 06 00 01 10 60 00 18 05 159<< 0x4bc0 read 160} 161================================== 162 163>> 35 01 00 ff 164<< b5 00 01 00 ff 165 16614/94 and 22/a2 167 168########### discharge capacitor? ########### 169four times { 170>> 21 02 00 0a 00 171<< a1 00 02 00 0a 00 172} 173 174>> 01 01 00 00 175<< 81 00 07 00 00 09 0c 61 c2 7a 0a 176 177>> 35 01 00 ff 178<< b5 00 01 00 ff 179 180>> 34 00 00 181<< b4 00 00 00 182############################################# 183 184 SANE FLOW DIAGRAM 185 186 - sane_init() : initialize backend 187 . - sane_get_devices() : query list of scanner devices 188 . - sane_open() : open a particular scanner device 189 . . - sane_set_io_mode : set blocking mode 190 . . - sane_get_select_fd : get scanner fd 191 . . 192 . . - sane_get_option_descriptor() : get option information 193 . . - sane_control_option() : change option values 194 . . - sane_get_parameters() : returns estimated scan parameters 195 . . - (repeat previous 3 functions) 196 . . 197 . . - sane_start() : start image acquisition 198 . . - sane_get_parameters() : returns actual scan parameters 199 . . - sane_read() : read image data (from pipe) 200 . . (sane_read called multiple times; after sane_read returns EOF, 201 . . loop may continue with sane_start which may return a 2nd page 202 . . when doing duplex scans, or load the next page from the ADF) 203 . . 204 . . - sane_cancel() : cancel operation 205 . - sane_close() : close opened scanner device 206 - sane_exit() : terminate use of backend 207 208*/ 209 210/* 211 * @@ Section 1 - Init 212 */ 213 214#include "../include/sane/config.h" 215 216#include <string.h> /*memcpy...*/ 217#include <ctype.h> /*isspace*/ 218 219#include "../include/sane/sanei_backend.h" 220#include "../include/sane/sanei_usb.h" 221#include "../include/sane/saneopts.h" 222#include "../include/sane/sanei_config.h" 223 224#include "cardscan.h" 225 226#define DEBUG 1 227#define BUILD 3 228 229/* values for SANE_DEBUG_CARDSCAN env var: 230 - errors 5 231 - function trace 10 232 - function detail 15 233 - get/setopt cmds 20 234 - usb cmd trace 25 235 - usb cmd detail 30 236 - useless noise 35 237*/ 238 239int global_has_cal_buffer = 1; 240int global_lines_per_block = 16; 241 242/* ------------------------------------------------------------------------- */ 243#define STRING_GRAYSCALE SANE_VALUE_SCAN_MODE_GRAY 244#define STRING_COLOR SANE_VALUE_SCAN_MODE_COLOR 245 246/* 247 * used by attach* and sane_get_devices 248 * a ptr to a null term array of ptrs to SANE_Device structs 249 * a ptr to a single-linked list of scanner structs 250 */ 251static const SANE_Device **sane_devArray = NULL; 252static struct scanner *scanner_devList = NULL; 253 254/* 255 * @@ Section 2 - SANE & scanner init code 256 */ 257 258/* 259 * Called by SANE initially. 260 * 261 * From the SANE spec: 262 * This function must be called before any other SANE function can be 263 * called. The behavior of a SANE backend is undefined if this 264 * function is not called first. The version code of the backend is 265 * returned in the value pointed to by version_code. If that pointer 266 * is NULL, no version code is returned. Argument authorize is either 267 * a pointer to a function that is invoked when the backend requires 268 * authentication for a specific resource or NULL if the frontend does 269 * not support authentication. 270 */ 271SANE_Status 272sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) 273{ 274 (void) authorize; /* get rid of compiler warning */ 275 276 DBG_INIT (); 277 DBG (10, "sane_init: start\n"); 278 279 sanei_usb_init(); 280 281 if (version_code) 282 *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); 283 284 DBG (5, "sane_init: cardscan backend %d.%d.%d, from %s\n", 285 SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); 286 287 DBG (10, "sane_init: finish\n"); 288 289 return SANE_STATUS_GOOD; 290} 291 292/* 293 * Called by SANE to find out about supported devices. 294 * 295 * From the SANE spec: 296 * This function can be used to query the list of devices that are 297 * available. If the function executes successfully, it stores a 298 * pointer to a NULL terminated array of pointers to SANE_Device 299 * structures in *device_list. The returned list is guaranteed to 300 * remain unchanged and valid until (a) another call to this function 301 * is performed or (b) a call to sane_exit() is performed. This 302 * function can be called repeatedly to detect when new devices become 303 * available. If argument local_only is true, only local devices are 304 * returned (devices directly attached to the machine that SANE is 305 * running on). If it is false, the device list includes all remote 306 * devices that are accessible to the SANE library. 307 * 308 * SANE does not require that this function is called before a 309 * sane_open() call is performed. A device name may be specified 310 * explicitly by a user which would make it unnecessary and 311 * undesirable to call this function first. 312 * 313 * Read the config file, find scanners with help from sanei_* 314 * store in global device structs 315 */ 316SANE_Status 317sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) 318{ 319 struct scanner *dev; 320 char line[PATH_MAX]; 321 const char *lp; 322 FILE *fp; 323 int num_devices=0; 324 int i=0; 325 326 (void) local_only; /* get rid of compiler warning */ 327 328 DBG (10, "sane_get_devices: start\n"); 329 330 global_has_cal_buffer = 1; 331 global_lines_per_block = 16; 332 333 fp = sanei_config_open (CONFIG_FILE); 334 335 if (fp) { 336 337 DBG (15, "sane_get_devices: reading config file %s\n", CONFIG_FILE); 338 339 while (sanei_config_read (line, PATH_MAX, fp)) { 340 341 lp = line; 342 343 /* ignore comments */ 344 if (*lp == '#') 345 continue; 346 347 /* skip empty lines */ 348 if (*lp == 0) 349 continue; 350 351 if ((strncmp ("usb", lp, 3) == 0) && isspace (lp[3])) { 352 DBG (15, "sane_get_devices: looking for '%s'\n", lp); 353 sanei_usb_attach_matching_devices(lp, attach_one); 354 } 355 356 else if (!strncmp(lp, "has_cal_buffer", 14) && isspace (lp[14])) { 357 358 int buf; 359 lp += 14; 360 lp = sanei_config_skip_whitespace (lp); 361 buf = atoi (lp); 362 363 if(buf){ 364 global_has_cal_buffer = 1; 365 } 366 else{ 367 global_has_cal_buffer = 0; 368 } 369 370 DBG (15, "sane_get_devices: setting \"has_cal_buffer\" to %d\n", 371 global_has_cal_buffer); 372 } 373 374 else if (!strncmp(lp, "lines_per_block", 15) && isspace (lp[15])) { 375 376 int buf; 377 lp += 15; 378 lp = sanei_config_skip_whitespace (lp); 379 buf = atoi (lp); 380 381 if(buf < 1 || buf > 32){ 382 DBG (15, 383 "sane_get_devices: \"lines_per_block\"=%d\n out of range", 384 buf 385 ); 386 continue; 387 } 388 389 DBG (15, "sane_get_devices: \"lines_per_block\" is %d\n", buf); 390 global_lines_per_block = buf; 391 } 392 393 else{ 394 DBG (5, "sane_get_devices: config line \"%s\" ignored.\n", lp); 395 } 396 } 397 fclose (fp); 398 } 399 400 else { 401 DBG (5, "sane_get_devices: no config file '%s', using defaults\n", 402 CONFIG_FILE); 403 404 DBG (15, "sane_get_devices: looking for 'usb 0x08F0 0x0005'\n"); 405 sanei_usb_attach_matching_devices("usb 0x08F0 0x0005", attach_one); 406 } 407 408 for (dev = scanner_devList; dev; dev=dev->next) { 409 DBG (15, "sane_get_devices: found scanner %s\n",dev->device_name); 410 num_devices++; 411 } 412 413 DBG (15, "sane_get_devices: found %d scanner(s)\n",num_devices); 414 415 sane_devArray = calloc (num_devices + 1, sizeof (SANE_Device*)); 416 if (!sane_devArray) 417 return SANE_STATUS_NO_MEM; 418 419 for (dev = scanner_devList; dev; dev=dev->next) { 420 sane_devArray[i++] = (SANE_Device *)&dev->sane; 421 } 422 423 sane_devArray[i] = 0; 424 425 *device_list = sane_devArray; 426 427 DBG (10, "sane_get_devices: finish\n"); 428 429 return SANE_STATUS_GOOD; 430} 431 432/* callback used by sane_get_devices 433 * build the scanner struct and link to global list 434 * unless struct is already loaded, then pretend 435 */ 436static SANE_Status 437attach_one (const char *device_name) 438{ 439 struct scanner *s; 440 int ret, i; 441 SANE_Word vid, pid; 442 443 DBG (10, "attach_one: start '%s'\n", device_name); 444 445 for (s = scanner_devList; s; s = s->next) { 446 if (strcmp (s->sane.name, device_name) == 0) { 447 DBG (10, "attach_one: already attached!\n"); 448 return SANE_STATUS_GOOD; 449 } 450 } 451 452 /* build a scanner struct to hold it */ 453 DBG (15, "attach_one: init struct\n"); 454 455 if ((s = calloc (sizeof (*s), 1)) == NULL) 456 return SANE_STATUS_NO_MEM; 457 458 /* copy the device name */ 459 s->device_name = strdup (device_name); 460 if (!s->device_name){ 461 free (s); 462 return SANE_STATUS_NO_MEM; 463 } 464 465 /* connect the fd */ 466 DBG (15, "attach_one: connect fd\n"); 467 468 s->fd = -1; 469 ret = connect_fd(s); 470 if(ret != SANE_STATUS_GOOD){ 471 free (s->device_name); 472 free (s); 473 return ret; 474 } 475 476 /* clean up the scanner struct based on model */ 477 /* this is the only piece of model specific code */ 478 sanei_usb_get_vendor_product(s->fd,&vid,&pid); 479 480 if(vid == 0x08f0){ 481 s->vendor_name = "CardScan"; 482 if(pid == 0x0005){ 483 s->product_name = "800c"; 484 } 485 else if(pid == 0x0002){ 486 s->product_name = "600c"; 487 } 488 else{ 489 DBG (5, "Unknown product, using default settings\n"); 490 s->product_name = "Unknown"; 491 } 492 } 493 else if(vid == 0x0451){ 494 s->vendor_name = "Sanford"; 495 if(pid == 0x6250){ 496 s->product_name = "800c"; 497 } 498 else{ 499 DBG (5, "Unknown product, using default settings\n"); 500 s->product_name = "Unknown"; 501 } 502 } 503 else{ 504 DBG (5, "Unknown vendor/product, using default settings\n"); 505 s->vendor_name = "Unknown"; 506 s->product_name = "Unknown"; 507 } 508 509 DBG (15, "attach_one: Found %s scanner %s at %s\n", 510 s->vendor_name, s->product_name, s->device_name); 511 512 /*copy config file settings*/ 513 s->has_cal_buffer = global_has_cal_buffer; 514 s->lines_per_block = global_lines_per_block; 515 s->color_block_size = s->lines_per_block * PIXELS_PER_LINE * 3; 516 s->gray_block_size = s->lines_per_block * PIXELS_PER_LINE; 517 518 /* try to get calibration */ 519 if(s->has_cal_buffer){ 520 DBG (15, "attach_one: scanner calibration\n"); 521 522 ret = load_calibration(s); 523 if (ret != SANE_STATUS_GOOD) { 524 DBG (5, "sane_start: ERROR: cannot calibrate, incompatible?\n"); 525 free (s->device_name); 526 free (s); 527 return ret; 528 } 529 } 530 else{ 531 DBG (15, "attach_one: skipping calibration\n"); 532 } 533 534 /* set SANE option 'values' to good defaults */ 535 DBG (15, "attach_one: init options\n"); 536 537 /* go ahead and setup the first opt, because 538 * frontend may call control_option on it 539 * before calling get_option_descriptor 540 */ 541 memset (s->opt, 0, sizeof (s->opt)); 542 for (i = 0; i < NUM_OPTIONS; ++i) { 543 s->opt[i].name = "filler"; 544 s->opt[i].size = sizeof (SANE_Word); 545 s->opt[i].cap = SANE_CAP_INACTIVE; 546 } 547 548 s->opt[OPT_NUM_OPTS].name = SANE_NAME_NUM_OPTIONS; 549 s->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS; 550 s->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS; 551 s->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT; 552 s->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT; 553 554 DBG (15, "attach_one: init settings\n"); 555 556 /* we close the connection, so that another backend can talk to scanner */ 557 disconnect_fd(s); 558 559 /* load info into sane_device struct */ 560 s->sane.name = s->device_name; 561 s->sane.vendor = s->vendor_name; 562 s->sane.model = s->product_name; 563 s->sane.type = "scanner"; 564 565 s->next = scanner_devList; 566 scanner_devList = s; 567 568 DBG (10, "attach_one: finish\n"); 569 570 return SANE_STATUS_GOOD; 571} 572 573/* 574 * connect the fd in the scanner struct 575 */ 576static SANE_Status 577connect_fd (struct scanner *s) 578{ 579 SANE_Status ret; 580 581 DBG (10, "connect_fd: start\n"); 582 583 if(s->fd > -1){ 584 DBG (5, "connect_fd: already open\n"); 585 ret = SANE_STATUS_GOOD; 586 } 587 else { 588 DBG (15, "connect_fd: opening USB device\n"); 589 ret = sanei_usb_open (s->device_name, &(s->fd)); 590 } 591 592 if(ret != SANE_STATUS_GOOD){ 593 DBG (5, "connect_fd: could not open device: %d\n", ret); 594 } 595 596 DBG (10, "connect_fd: finish\n"); 597 598 return ret; 599} 600 601static SANE_Status 602load_calibration(struct scanner *s) 603{ 604 SANE_Status ret=SANE_STATUS_GOOD; 605 unsigned char cmd[] = {0x45, 0x00, 0x00}; 606 unsigned char * buf; 607 size_t bytes = HEADER_SIZE + CAL_COLOR_SIZE*2 + CAL_GRAY_SIZE*2; 608 int j; 609 610 DBG (10, "load_calibration: start\n"); 611 612 buf = malloc(bytes); 613 if(!buf){ 614 DBG(5, "load_calibration: not enough mem for buffer: %ld\n",(long)bytes); 615 return SANE_STATUS_NO_MEM; 616 } 617 618 ret = do_cmd( 619 s, 0, 620 cmd, sizeof(cmd), 621 NULL, 0, 622 buf, &bytes 623 ); 624 625 if (ret == SANE_STATUS_GOOD) { 626 DBG(15, "load_calibration: got GOOD\n"); 627 628 /* 629 * color cal data comes from scaner like: 630 * bbbbbbbBBBBBBBgggggggGGGGGGGrrrrrrrRRRRRRR 631 * where b=darkblue, B=lightblue, etc 632 * reorder the data into two buffers 633 * bbbbbbbgggggggrrrrrrr and BBBBBBBGGGGGGGRRRRRRR 634 */ 635 636 /*dark/light blue*/ 637 memcpy(s->cal_color_b, buf+HEADER_SIZE, PIXELS_PER_LINE); 638 memcpy(s->cal_color_w, 639 buf+HEADER_SIZE+PIXELS_PER_LINE, PIXELS_PER_LINE); 640 641 /*dark/light green*/ 642 memcpy(s->cal_color_b+PIXELS_PER_LINE, 643 buf+HEADER_SIZE+(PIXELS_PER_LINE*2), PIXELS_PER_LINE); 644 memcpy(s->cal_color_w+PIXELS_PER_LINE, 645 buf+HEADER_SIZE+(PIXELS_PER_LINE*3), PIXELS_PER_LINE); 646 647 /*dark/light red*/ 648 memcpy(s->cal_color_b+(PIXELS_PER_LINE*2), 649 buf+HEADER_SIZE+(PIXELS_PER_LINE*4), PIXELS_PER_LINE); 650 memcpy(s->cal_color_w+(PIXELS_PER_LINE*2), 651 buf+HEADER_SIZE+(PIXELS_PER_LINE*5), PIXELS_PER_LINE); 652 653 /* then slide the light data down using the dark offset */ 654 for(j=0;j<CAL_COLOR_SIZE;j++){ 655 s->cal_color_w[j] -= s->cal_color_b[j]; 656 } 657 658 /*dark/light gray*/ 659 memcpy(s->cal_gray_b, 660 buf+HEADER_SIZE+(CAL_COLOR_SIZE*2), PIXELS_PER_LINE); 661 memcpy(s->cal_gray_w, 662 buf+HEADER_SIZE+(CAL_COLOR_SIZE*2)+PIXELS_PER_LINE, PIXELS_PER_LINE); 663 664 /* then slide the light data down using the dark offset */ 665 for(j=0;j<CAL_GRAY_SIZE;j++){ 666 s->cal_gray_w[j] -= s->cal_gray_b[j]; 667 } 668 669 hexdump(35, "cal_color_b:", s->cal_color_b, CAL_COLOR_SIZE); 670 hexdump(35, "cal_color_w:", s->cal_color_w, CAL_COLOR_SIZE); 671 hexdump(35, "cal_gray_b:", s->cal_gray_b, CAL_GRAY_SIZE); 672 hexdump(35, "cal_gray_w:", s->cal_gray_w, CAL_GRAY_SIZE); 673 } 674 else { 675 DBG(5, "load_calibration: error reading data block status = %d\n", ret); 676 } 677 678 DBG (10, "load_calibration: finish\n"); 679 680 return ret; 681} 682 683/* 684 * From the SANE spec: 685 * This function is used to establish a connection to a particular 686 * device. The name of the device to be opened is passed in argument 687 * name. If the call completes successfully, a handle for the device 688 * is returned in *h. As a special case, specifying a zero-length 689 * string as the device requests opening the first available device 690 * (if there is such a device). 691 */ 692SANE_Status 693sane_open (SANE_String_Const name, SANE_Handle * handle) 694{ 695 struct scanner *dev = NULL; 696 struct scanner *s = NULL; 697 SANE_Status ret; 698 699 DBG (10, "sane_open: start\n"); 700 701 if(name[0] == 0){ 702 if(scanner_devList){ 703 DBG (15, "sane_open: no device requested, using first\n"); 704 s = scanner_devList; 705 } 706 else{ 707 DBG (15, "sane_open: no device requested, none found\n"); 708 } 709 } 710 else{ 711 DBG (15, "sane_open: device %s requested, attaching\n", name); 712 713 ret = attach_one(name); 714 if(ret){ 715 DBG (5, "sane_open: attach error %d\n",ret); 716 return ret; 717 } 718 719 for (dev = scanner_devList; dev; dev = dev->next) { 720 if (strcmp (dev->sane.name, name) == 0) { 721 s = dev; 722 break; 723 } 724 } 725 } 726 727 if (!s) { 728 DBG (5, "sane_open: no device found\n"); 729 return SANE_STATUS_INVAL; 730 } 731 732 DBG (15, "sane_open: device %s found\n", s->sane.name); 733 734 *handle = s; 735 736 /* connect the fd so we can talk to scanner */ 737 ret = connect_fd(s); 738 if(ret != SANE_STATUS_GOOD){ 739 return ret; 740 } 741 742 DBG (10, "sane_open: finish\n"); 743 744 return SANE_STATUS_GOOD; 745} 746 747/* 748 * @@ Section 3 - SANE Options functions 749 */ 750 751/* 752 * Returns the options we know. 753 * 754 * From the SANE spec: 755 * This function is used to access option descriptors. The function 756 * returns the option descriptor for option number n of the device 757 * represented by handle h. Option number 0 is guaranteed to be a 758 * valid option. Its value is an integer that specifies the number of 759 * options that are available for device handle h (the count includes 760 * option 0). If n is not a valid option index, the function returns 761 * NULL. The returned option descriptor is guaranteed to remain valid 762 * (and at the returned address) until the device is closed. 763 */ 764const SANE_Option_Descriptor * 765sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) 766{ 767 struct scanner *s = handle; 768 int i; 769 SANE_Option_Descriptor *opt = &s->opt[option]; 770 771 DBG (20, "sane_get_option_descriptor: %d\n", option); 772 773 if ((unsigned) option >= NUM_OPTIONS) 774 return NULL; 775 776 /* "Mode" group -------------------------------------------------------- */ 777 if(option==OPT_MODE_GROUP){ 778 opt->title = "Scan Mode"; 779 opt->desc = ""; 780 opt->type = SANE_TYPE_GROUP; 781 opt->constraint_type = SANE_CONSTRAINT_NONE; 782 } 783 784 /* scan mode */ 785 else if(option==OPT_MODE){ 786 i=0; 787 s->mode_list[i++]=STRING_GRAYSCALE; 788 s->mode_list[i++]=STRING_COLOR; 789 s->mode_list[i]=NULL; 790 791 opt->name = SANE_NAME_SCAN_MODE; 792 opt->title = SANE_TITLE_SCAN_MODE; 793 opt->desc = SANE_DESC_SCAN_MODE; 794 opt->type = SANE_TYPE_STRING; 795 opt->constraint_type = SANE_CONSTRAINT_STRING_LIST; 796 opt->constraint.string_list = s->mode_list; 797 opt->size = maxStringSize (opt->constraint.string_list); 798 opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 799 } 800 801 return opt; 802} 803 804/** 805 * Gets or sets an option value. 806 * 807 * From the SANE spec: 808 * This function is used to set or inquire the current value of option 809 * number n of the device represented by handle h. The manner in which 810 * the option is controlled is specified by parameter action. The 811 * possible values of this parameter are described in more detail 812 * below. The value of the option is passed through argument val. It 813 * is a pointer to the memory that holds the option value. The memory 814 * area pointed to by v must be big enough to hold the entire option 815 * value (determined by member size in the corresponding option 816 * descriptor). 817 * 818 * The only exception to this rule is that when setting the value of a 819 * string option, the string pointed to by argument v may be shorter 820 * since the backend will stop reading the option value upon 821 * encountering the first NUL terminator in the string. If argument i 822 * is not NULL, the value of *i will be set to provide details on how 823 * well the request has been met. 824 */ 825SANE_Status 826sane_control_option (SANE_Handle handle, SANE_Int option, 827 SANE_Action action, void *val, SANE_Int * info) 828{ 829 struct scanner *s = (struct scanner *) handle; 830 SANE_Int dummy = 0; 831 832 /* Make sure that all those statements involving *info cannot break (better 833 * than having to do "if (info) ..." everywhere!) 834 */ 835 if (info == 0) 836 info = &dummy; 837 838 if (option >= NUM_OPTIONS) { 839 DBG (5, "sane_control_option: %d too big\n", option); 840 return SANE_STATUS_INVAL; 841 } 842 843 if (!SANE_OPTION_IS_ACTIVE (s->opt[option].cap)) { 844 DBG (5, "sane_control_option: %d inactive\n", option); 845 return SANE_STATUS_INVAL; 846 } 847 848 /* 849 * SANE_ACTION_GET_VALUE: We have to find out the current setting and 850 * return it in a human-readable form (often, text). 851 */ 852 if (action == SANE_ACTION_GET_VALUE) { 853 SANE_Word * val_p = (SANE_Word *) val; 854 855 DBG (20, "sane_control_option: get value for '%s' (%d)\n", s->opt[option].name,option); 856 857 switch (option) { 858 859 case OPT_NUM_OPTS: 860 *val_p = NUM_OPTIONS; 861 return SANE_STATUS_GOOD; 862 863 case OPT_MODE: 864 if(s->mode == MODE_GRAYSCALE){ 865 strcpy (val, STRING_GRAYSCALE); 866 } 867 else if(s->mode == MODE_COLOR){ 868 strcpy (val, STRING_COLOR); 869 } 870 return SANE_STATUS_GOOD; 871 } 872 } 873 else if (action == SANE_ACTION_SET_VALUE) { 874 int tmp; 875 SANE_Status status; 876 877 DBG (20, "sane_control_option: set value for '%s' (%d)\n", s->opt[option].name,option); 878 879 if ( s->started ) { 880 DBG (5, "sane_control_option: can't set, device busy\n"); 881 return SANE_STATUS_DEVICE_BUSY; 882 } 883 884 if (!SANE_OPTION_IS_SETTABLE (s->opt[option].cap)) { 885 DBG (5, "sane_control_option: not settable\n"); 886 return SANE_STATUS_INVAL; 887 } 888 889 status = sanei_constrain_value (s->opt + option, val, info); 890 if (status != SANE_STATUS_GOOD) { 891 DBG (5, "sane_control_option: bad value\n"); 892 return status; 893 } 894 895 /* 896 * Note - for those options which can assume one of a list of 897 * valid values, we can safely assume that they will have 898 * exactly one of those values because that's what 899 * sanei_constrain_value does. Hence no "else: invalid" branches 900 * below. 901 */ 902 switch (option) { 903 904 /* Mode Group */ 905 case OPT_MODE: 906 if (!strcmp (val, STRING_GRAYSCALE)) { 907 tmp = MODE_GRAYSCALE; 908 } 909 else{ 910 tmp = MODE_COLOR; 911 } 912 913 if (tmp == s->mode) 914 return SANE_STATUS_GOOD; 915 916 s->mode = tmp; 917 *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; 918 return SANE_STATUS_GOOD; 919 920 } /* switch */ 921 } /* else */ 922 923 return SANE_STATUS_INVAL; 924} 925 926/* 927 * @@ Section 4 - SANE scanning functions 928 */ 929/* 930 * Called by SANE to retrieve information about the type of data 931 * that the current scan will return. 932 * 933 * From the SANE spec: 934 * This function is used to obtain the current scan parameters. The 935 * returned parameters are guaranteed to be accurate between the time 936 * a scan has been started (sane_start() has been called) and the 937 * completion of that request. Outside of that window, the returned 938 * values are best-effort estimates of what the parameters will be 939 * when sane_start() gets invoked. 940 * 941 * Calling this function before a scan has actually started allows, 942 * for example, to get an estimate of how big the scanned image will 943 * be. The parameters passed to this function are the handle h of the 944 * device for which the parameters should be obtained and a pointer p 945 * to a parameter structure. 946 */ 947SANE_Status 948sane_get_parameters (SANE_Handle handle, SANE_Parameters * params) 949{ 950 struct scanner *s = (struct scanner *) handle; 951 952 DBG (10, "sane_get_parameters: start\n"); 953 954 params->pixels_per_line = PIXELS_PER_LINE; 955 params->lines = -1; 956 params->last_frame = 1; 957 958 if (s->mode == MODE_COLOR) { 959 params->format = SANE_FRAME_RGB; 960 params->depth = 8; 961 params->bytes_per_line = params->pixels_per_line * 3; 962 } 963 else if (s->mode == MODE_GRAYSCALE) { 964 params->format = SANE_FRAME_GRAY; 965 params->depth = 8; 966 params->bytes_per_line = params->pixels_per_line; 967 } 968 969 DBG (15, "\tdepth %d\n", params->depth); 970 DBG (15, "\tlines %d\n", params->lines); 971 DBG (15, "\tpixels_per_line %d\n", params->pixels_per_line); 972 DBG (15, "\tbytes_per_line %d\n", params->bytes_per_line); 973 974 DBG (10, "sane_get_parameters: finish\n"); 975 976 return SANE_STATUS_GOOD; 977} 978 979/* 980 * Called by SANE when a page acquisition operation is to be started. 981 */ 982SANE_Status 983sane_start (SANE_Handle handle) 984{ 985 struct scanner *s = handle; 986 SANE_Status ret; 987 988 DBG (10, "sane_start: start\n"); 989 990 /* first page of batch */ 991 if(s->started){ 992 DBG(5,"sane_start: previous transfer not finished?"); 993 sane_cancel((SANE_Handle)s); 994 return SANE_STATUS_CANCELLED; 995 } 996 997 /* set clean defaults */ 998 s->started=1; 999 s->bytes_rx=0; 1000 s->bytes_tx=0; 1001 s->paperless_lines=0; 1002 1003 /* heat up the lamp */ 1004 if(s->mode == MODE_COLOR){ 1005 ret = heat_lamp_color(s); 1006 } 1007 else{ 1008 ret = heat_lamp_gray(s); 1009 } 1010 1011 if (ret != SANE_STATUS_GOOD) { 1012 DBG (5, "sane_start: ERROR: failed to heat lamp\n"); 1013 sane_cancel((SANE_Handle)s); 1014 return ret; 1015 } 1016 1017 DBG (10, "sane_start: finish\n"); 1018 1019 return SANE_STATUS_GOOD; 1020} 1021 1022static SANE_Status 1023heat_lamp_gray(struct scanner *s) 1024{ 1025 SANE_Status ret = SANE_STATUS_GOOD; 1026 SANE_Status ret2 = SANE_STATUS_GOOD; 1027 unsigned char cmd[] = 1028 {0x12, 0x06, 0x00, 0x00, 0x01, 0x60, 0x00, 0x61, 0x00}; 1029 size_t bytes = HEADER_SIZE + 1; 1030 unsigned char * buf; 1031 int i; 1032 1033 DBG (10, "heat_lamp_gray: start\n"); 1034 1035 buf = malloc(bytes); 1036 if(!buf){ 1037 DBG(5, "heat_lamp_gray: not enough mem for buffer: %lu\n", 1038 (long unsigned)bytes); 1039 return SANE_STATUS_NO_MEM; 1040 } 1041 1042 for(i=0;i<10;i++){ 1043 1044 ret2 = do_cmd( 1045 s, 0, 1046 cmd, sizeof(cmd), 1047 NULL, 0, 1048 buf, &bytes 1049 ); 1050 1051 if (ret2 != SANE_STATUS_GOOD) { 1052 DBG(5, "heat_lamp_gray: %d error\n",i); 1053 ret = ret2; 1054 break; 1055 } 1056 1057 if(!buf[1]){ 1058 DBG(5, "heat_lamp_gray: %d got no docs\n",i); 1059 ret = SANE_STATUS_NO_DOCS; 1060 break; 1061 } 1062 1063 DBG(15, "heat_lamp_gray: %d got: %d %d\n",i, 1064 buf[HEADER_SIZE],s->cal_gray_b[0]); 1065 1066 if(buf[HEADER_SIZE] < 0x20){ 1067 DBG(15, "heat_lamp_gray: hot\n"); 1068 ret = SANE_STATUS_GOOD; 1069 break; 1070 } 1071 else{ 1072 DBG(15, "heat_lamp_gray: cold\n"); 1073 ret = SANE_STATUS_DEVICE_BUSY; 1074 } 1075 } 1076 1077 free(buf); 1078 1079 DBG (10, "heat_lamp_gray: finish %d\n",ret); 1080 1081 return ret; 1082} 1083 1084static SANE_Status 1085heat_lamp_color(struct scanner *s) 1086{ 1087 SANE_Status ret = SANE_STATUS_GOOD; 1088 SANE_Status ret2 = SANE_STATUS_GOOD; 1089 unsigned char cmd[] = 1090 {0x18, 0x07, 0x00, 0x00, 0x01, 0x60, 0x00, 0x61, 0x00, 0x07}; 1091 size_t bytes = HEADER_SIZE + 3; 1092 unsigned char * buf; 1093 int i; 1094 1095 DBG (10, "heat_lamp_color: start\n"); 1096 1097 buf = malloc(bytes); 1098 if(!buf){ 1099 DBG(5, "heat_lamp_color: not enough mem for buffer: %lu\n", 1100 (long unsigned)bytes); 1101 return SANE_STATUS_NO_MEM; 1102 } 1103 1104 for(i=0;i<10;i++){ 1105 1106 ret2 = do_cmd( 1107 s, 0, 1108 cmd, sizeof(cmd), 1109 NULL, 0, 1110 buf, &bytes 1111 ); 1112 1113 if (ret2 != SANE_STATUS_GOOD) { 1114 DBG(5, "heat_lamp_color: %d error\n",i); 1115 ret = ret2; 1116 break; 1117 } 1118 1119 if(!buf[1]){ 1120 DBG(5, "heat_lamp_color: %d got no docs\n",i); 1121 ret = SANE_STATUS_NO_DOCS; 1122 break; 1123 } 1124 1125 DBG(15, "heat_lamp_color: %d got: %d,%d,%d %d,%d,%d\n",i, 1126 buf[HEADER_SIZE],buf[HEADER_SIZE+1],buf[HEADER_SIZE+2], 1127 s->cal_color_b[0],s->cal_color_b[1],s->cal_color_b[2]); 1128 1129 if(buf[HEADER_SIZE] < 0x20 1130 && buf[HEADER_SIZE+1] < 0x20 1131 && buf[HEADER_SIZE+2] < 0x20){ 1132 DBG(15, "heat_lamp_color: hot\n"); 1133 ret = SANE_STATUS_GOOD; 1134 break; 1135 } 1136 else{ 1137 DBG(15, "heat_lamp_color: cold\n"); 1138 ret = SANE_STATUS_DEVICE_BUSY; 1139 } 1140 } 1141 1142 free(buf); 1143 1144 DBG (10, "heat_lamp_color: finish %d\n",ret); 1145 1146 return ret; 1147} 1148 1149/* 1150 * Called by SANE to read data. 1151 * 1152 * From the SANE spec: 1153 * This function is used to read image data from the device 1154 * represented by handle h. Argument buf is a pointer to a memory 1155 * area that is at least maxlen bytes long. The number of bytes 1156 * returned is stored in *len. A backend must set this to zero when 1157 * the call fails (i.e., when a status other than SANE_STATUS_GOOD is 1158 * returned). 1159 * 1160 * When the call succeeds, the number of bytes returned can be 1161 * anywhere in the range from 0 to maxlen bytes. 1162 */ 1163SANE_Status 1164sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len) 1165{ 1166 struct scanner *s = (struct scanner *) handle; 1167 SANE_Status ret=SANE_STATUS_GOOD; 1168 1169 DBG (10, "sane_read: start\n"); 1170 1171 *len = 0; 1172 1173 /* cancelled? */ 1174 if(!s->started){ 1175 DBG (5, "sane_read: call sane_start first\n"); 1176 return SANE_STATUS_CANCELLED; 1177 } 1178 1179 /* have sent all of current buffer */ 1180 if(s->bytes_tx == s->bytes_rx){ 1181 1182 /* at end of data, stop */ 1183 if(s->paperless_lines >= MAX_PAPERLESS_LINES){ 1184 DBG (15, "sane_read: returning eof\n"); 1185 power_down(s); 1186 return SANE_STATUS_EOF; 1187 } 1188 1189 /* more to get, reset and go */ 1190 s->bytes_tx = 0; 1191 s->bytes_rx = 0; 1192 1193 if(s->mode == MODE_COLOR){ 1194 ret = read_from_scanner_color(s); 1195 } 1196 else{ 1197 ret = read_from_scanner_gray(s); 1198 } 1199 1200 if(ret){ 1201 DBG(5,"sane_read: returning %d\n",ret); 1202 return ret; 1203 } 1204 } 1205 1206 /* data in current buffer, send some of it */ 1207 *len = s->bytes_rx - s->bytes_tx; 1208 if(*len > max_len){ 1209 *len = max_len; 1210 } 1211 1212 memcpy(buf,s->buffer+s->bytes_tx,*len); 1213 s->bytes_tx += *len; 1214 1215 DBG (10, "sane_read: %d,%d,%d finish\n", *len,s->bytes_rx,s->bytes_tx); 1216 1217 return ret; 1218} 1219 1220static SANE_Status 1221read_from_scanner_gray(struct scanner *s) 1222{ 1223 SANE_Status ret=SANE_STATUS_GOOD; 1224 /*cmd len-le16 move lines ??? ??? ??? ???*/ 1225 unsigned char cmd[] = 1226 {0x12, 0x06, 0x00, 0x01, 0x01, 0x60, 0x00, 0x18, 0x05}; 1227 size_t bytes = HEADER_SIZE + s->gray_block_size; 1228 unsigned char * buf; 1229 int i,j; 1230 1231 DBG (10, "read_from_scanner_gray: start\n"); 1232 1233 cmd[4] = s->lines_per_block; 1234 1235 buf = malloc(bytes); 1236 if(!buf){ 1237 DBG(5, "read_from_scanner_gray: not enough mem for buffer: %lu\n", 1238 (long unsigned)bytes); 1239 return SANE_STATUS_NO_MEM; 1240 } 1241 1242 ret = do_cmd( 1243 s, 0, 1244 cmd, sizeof(cmd), 1245 NULL, 0, 1246 buf, &bytes 1247 ); 1248 1249 if (ret == SANE_STATUS_GOOD) { 1250 1251 DBG(15, "read_from_scanner_gray: got GOOD\n"); 1252 1253 if(!buf[1]){ 1254 s->paperless_lines += s->lines_per_block; 1255 } 1256 1257 s->bytes_rx = s->gray_block_size; 1258 1259 /*memcpy(s->buffer,buf+HEADER_SIZE,s->gray_block_size);*/ 1260 1261 /* reorder the gray data into the struct's buffer */ 1262 for(i=0;i<s->gray_block_size;i+=PIXELS_PER_LINE){ 1263 for(j=0;j<PIXELS_PER_LINE;j++){ 1264 1265 unsigned char byte = buf[ HEADER_SIZE + i + j ]; 1266 unsigned char bcal = s->cal_gray_b[j]; 1267 unsigned char wcal = s->cal_gray_w[j]; 1268 1269 byte = (byte <= bcal)?0:(byte-bcal); 1270 byte = (byte >= wcal)?255:(byte*255/wcal); 1271 s->buffer[i+j] = byte; 1272 } 1273 } 1274 } 1275 else { 1276 DBG(5, "read_from_scanner_gray: error reading status = %d\n", ret); 1277 } 1278 1279 free(buf); 1280 1281 DBG (10, "read_from_scanner_gray: finish\n"); 1282 1283 return ret; 1284} 1285 1286static SANE_Status 1287read_from_scanner_color(struct scanner *s) 1288{ 1289 SANE_Status ret=SANE_STATUS_GOOD; 1290 unsigned char cmd[] = 1291 {0x18, 0x07, 0x00, 0x01, 0x01, 0x60, 0x00, 0x18, 0x05, 0x07}; 1292 size_t bytes = HEADER_SIZE + s->color_block_size; 1293 unsigned char * buf; 1294 int i,j,k; 1295 1296 DBG (10, "read_from_scanner_color: start\n"); 1297 1298 cmd[4] = s->lines_per_block; 1299 1300 buf = malloc(bytes); 1301 if(!buf){ 1302 DBG(5, "read_from_scanner_color: not enough mem for buffer: %lu\n", 1303 (long unsigned)bytes); 1304 return SANE_STATUS_NO_MEM; 1305 } 1306 1307 ret = do_cmd( 1308 s, 0, 1309 cmd, sizeof(cmd), 1310 NULL, 0, 1311 buf, &bytes 1312 ); 1313 1314 if (ret == SANE_STATUS_GOOD) { 1315 1316 DBG(15, "read_from_scanner_color: got GOOD\n"); 1317 1318 if(!buf[1]){ 1319 s->paperless_lines += s->lines_per_block; 1320 } 1321 1322 s->bytes_rx = s->color_block_size; 1323 1324 /*memcpy(s->buffer,buf+HEADER_SIZE,s->color_block_size);*/ 1325 1326 /* reorder the color data into the struct's buffer */ 1327 for(i=0;i<s->color_block_size;i+=PIXELS_PER_LINE*3){ 1328 for(j=0;j<PIXELS_PER_LINE;j++){ 1329 for(k=0;k<3;k++){ 1330 1331 int offset = PIXELS_PER_LINE*(2-k) + j; 1332 unsigned char byte = buf[ HEADER_SIZE + i + offset ]; 1333 unsigned char bcal = s->cal_color_b[offset]; 1334 unsigned char wcal = s->cal_color_w[offset]; 1335 1336 byte = (byte <= bcal)?0:(byte-bcal); 1337 byte = (byte >= wcal)?255:(byte*255/wcal); 1338 s->buffer[i+j*3+k] = byte; 1339 } 1340 } 1341 } 1342 } 1343 else { 1344 DBG(5, "read_from_scanner_color: error reading status = %d\n", ret); 1345 } 1346 1347 free(buf); 1348 1349 DBG (10, "read_from_scanner_color: finish\n"); 1350 1351 return ret; 1352} 1353 1354/* 1355 * @@ Section 4 - SANE cleanup functions 1356 */ 1357/* 1358 * Cancels a scan. 1359 * 1360 * From the SANE spec: 1361 * This function is used to immediately or as quickly as possible 1362 * cancel the currently pending operation of the device represented by 1363 * handle h. This function can be called at any time (as long as 1364 * handle h is a valid handle) but usually affects long-running 1365 * operations only (such as image is acquisition). It is safe to call 1366 * this function asynchronously (e.g., from within a signal handler). 1367 * It is important to note that completion of this operation does not 1368 * imply that the currently pending operation has been cancelled. It 1369 * only guarantees that cancellation has been initiated. Cancellation 1370 * completes only when the cancelled call returns (typically with a 1371 * status value of SANE_STATUS_CANCELLED). Since the SANE API does 1372 * not require any other operations to be re-entrant, this implies 1373 * that a frontend must not call any other operation until the 1374 * cancelled operation has returned. 1375 */ 1376void 1377sane_cancel (SANE_Handle handle) 1378{ 1379 struct scanner * s = (struct scanner *) handle; 1380 DBG (10, "sane_cancel: start\n"); 1381 s->started = 0; 1382 DBG (10, "sane_cancel: finish\n"); 1383} 1384 1385static SANE_Status 1386power_down(struct scanner *s) 1387{ 1388 SANE_Status ret = SANE_STATUS_GOOD; 1389 1390 unsigned char cmd[] = {0x21, 0x02, 0x00, 0x0a, 0x00}; 1391 unsigned char buf[6]; 1392 size_t bytes = sizeof(buf); 1393 int i; 1394 1395 DBG (10, "power_down: start\n"); 1396 1397 for(i=0;i<5;i++){ 1398 ret = do_cmd( 1399 s, 0, 1400 cmd, sizeof(cmd), 1401 NULL, 0, 1402 buf, &bytes 1403 ); 1404 1405 if(ret != SANE_STATUS_GOOD){ 1406 break; 1407 } 1408 } 1409 1410#if 0 1411 unsigned char cmd[] = {0x35, 0x01, 0x00, 0xff}; 1412 unsigned char buf[5]; 1413 size_t bytes = sizeof(buf); 1414 1415 DBG (10, "power_down: start\n"); 1416 1417 ret = do_cmd( 1418 s, 0, 1419 cmd, sizeof(cmd), 1420 NULL, 0, 1421 buf, &bytes 1422 ); 1423#endif 1424 1425 DBG (10, "power_down: finish %d\n",ret); 1426 1427 return ret; 1428} 1429 1430/* 1431 * Ends use of the scanner. 1432 * 1433 * From the SANE spec: 1434 * This function terminates the association between the device handle 1435 * passed in argument h and the device it represents. If the device is 1436 * presently active, a call to sane_cancel() is performed first. After 1437 * this function returns, handle h must not be used anymore. 1438 */ 1439void 1440sane_close (SANE_Handle handle) 1441{ 1442 DBG (10, "sane_close: start\n"); 1443 1444 sane_cancel(handle); 1445 disconnect_fd((struct scanner *) handle); 1446 1447 DBG (10, "sane_close: finish\n"); 1448} 1449 1450static SANE_Status 1451disconnect_fd (struct scanner *s) 1452{ 1453 DBG (10, "disconnect_fd: start\n"); 1454 1455 if(s->fd > -1){ 1456 DBG (15, "disconnecting usb device\n"); 1457 sanei_usb_close (s->fd); 1458 s->fd = -1; 1459 } 1460 1461 DBG (10, "disconnect_fd: finish\n"); 1462 1463 return SANE_STATUS_GOOD; 1464} 1465 1466/* 1467 * Terminates the backend. 1468 * 1469 * From the SANE spec: 1470 * This function must be called to terminate use of a backend. The 1471 * function will first close all device handles that still might be 1472 * open (it is recommended to close device handles explicitly through 1473 * a call to sane_close(), but backends are required to release all 1474 * resources upon a call to this function). After this function 1475 * returns, no function other than sane_init() may be called 1476 * (regardless of the status value returned by sane_exit(). Neglecting 1477 * to call this function may result in some resources not being 1478 * released properly. 1479 */ 1480void 1481sane_exit (void) 1482{ 1483 struct scanner *dev, *next; 1484 1485 DBG (10, "sane_exit: start\n"); 1486 1487 for (dev = scanner_devList; dev; dev = next) { 1488 disconnect_fd(dev); 1489 next = dev->next; 1490 free (dev->device_name); 1491 free (dev); 1492 } 1493 1494 if (sane_devArray) 1495 free (sane_devArray); 1496 1497 scanner_devList = NULL; 1498 sane_devArray = NULL; 1499 1500 DBG (10, "sane_exit: finish\n"); 1501} 1502 1503 1504/* 1505 * @@ Section 5 - misc helper functions 1506 */ 1507/* 1508 * take a bunch of pointers, send commands to scanner 1509 */ 1510static SANE_Status 1511do_cmd(struct scanner *s, int shortTime, 1512 unsigned char * cmdBuff, size_t cmdLen, 1513 unsigned char * outBuff, size_t outLen, 1514 unsigned char * inBuff, size_t * inLen 1515) 1516{ 1517 /* sanei_usb overwrites the transfer size, so make some local copies */ 1518 size_t loc_cmdLen = cmdLen; 1519 size_t loc_outLen = outLen; 1520 size_t loc_inLen = *inLen; 1521 1522 int cmdTime = USB_COMMAND_TIME; 1523 int outTime = USB_DATA_TIME; 1524 int inTime = USB_DATA_TIME; 1525 1526 int ret = 0; 1527 1528 DBG (10, "do_cmd: start\n"); 1529 1530 if(shortTime){ 1531 cmdTime /= 20; 1532 outTime /= 20; 1533 inTime /= 20; 1534 } 1535 1536 /* change timeout */ 1537 sanei_usb_set_timeout(cmdTime); 1538 1539 /* write the command out */ 1540 DBG(25, "cmd: writing %ld bytes, timeout %d\n", (long)cmdLen, cmdTime); 1541 hexdump(30, "cmd: >>", cmdBuff, cmdLen); 1542 ret = sanei_usb_write_bulk(s->fd, cmdBuff, &cmdLen); 1543 DBG(25, "cmd: wrote %ld bytes, retVal %d\n", (long)cmdLen, ret); 1544 1545 if(ret == SANE_STATUS_EOF){ 1546 DBG(5,"cmd: got EOF, returning IO_ERROR\n"); 1547 return SANE_STATUS_IO_ERROR; 1548 } 1549 if(ret != SANE_STATUS_GOOD){ 1550 DBG(5,"cmd: return error '%s'\n",sane_strstatus(ret)); 1551 return ret; 1552 } 1553 if(loc_cmdLen != cmdLen){ 1554 DBG(5,"cmd: wrong size %ld/%ld\n", (long)loc_cmdLen, (long)cmdLen); 1555 return SANE_STATUS_IO_ERROR; 1556 } 1557 1558 /* this command has a write component, and a place to get it */ 1559 if(outBuff && outLen && outTime){ 1560 1561 /* change timeout */ 1562 sanei_usb_set_timeout(outTime); 1563 1564 DBG(25, "out: writing %ld bytes, timeout %d\n", (long)outLen, outTime); 1565 hexdump(30, "out: >>", outBuff, outLen); 1566 ret = sanei_usb_write_bulk(s->fd, outBuff, &outLen); 1567 DBG(25, "out: wrote %ld bytes, retVal %d\n", (long)outLen, ret); 1568 1569 if(ret == SANE_STATUS_EOF){ 1570 DBG(5,"out: got EOF, returning IO_ERROR\n"); 1571 return SANE_STATUS_IO_ERROR; 1572 } 1573 if(ret != SANE_STATUS_GOOD){ 1574 DBG(5,"out: return error '%s'\n",sane_strstatus(ret)); 1575 return ret; 1576 } 1577 if(loc_outLen != outLen){ 1578 DBG(5,"out: wrong size %ld/%ld\n", (long)loc_outLen, (long)outLen); 1579 return SANE_STATUS_IO_ERROR; 1580 } 1581 } 1582 1583 /* this command has a read component, and a place to put it */ 1584 if(inBuff && inLen && inTime){ 1585 1586 memset(inBuff,0,*inLen); 1587 1588 /* change timeout */ 1589 sanei_usb_set_timeout(inTime); 1590 1591 DBG(25, "in: reading %ld bytes, timeout %d\n", (long)*inLen, inTime); 1592 ret = sanei_usb_read_bulk(s->fd, inBuff, inLen); 1593 DBG(25, "in: retVal %d\n", ret); 1594 1595 if(ret == SANE_STATUS_EOF){ 1596 DBG(5,"in: got EOF, continuing\n"); 1597 } 1598 else if(ret != SANE_STATUS_GOOD){ 1599 DBG(5,"in: return error '%s'\n",sane_strstatus(ret)); 1600 return ret; 1601 } 1602 1603 DBG(25, "in: read %ld bytes\n", (long)*inLen); 1604 if(*inLen){ 1605 hexdump(30, "in: <<", inBuff, *inLen); 1606 } 1607 1608 if(loc_inLen != *inLen){ 1609 ret = SANE_STATUS_EOF; 1610 DBG(5,"in: short read %ld/%ld\n", (long)loc_inLen, (long)*inLen); 1611 } 1612 } 1613 1614 DBG (10, "do_cmd: finish\n"); 1615 1616 return ret; 1617} 1618 1619/** 1620 * Convenience method to determine longest string size in a list. 1621 */ 1622static size_t 1623maxStringSize (const SANE_String_Const strings[]) 1624{ 1625 size_t size, max_size = 0; 1626 int i; 1627 1628 for (i = 0; strings[i]; ++i) { 1629 size = strlen (strings[i]) + 1; 1630 if (size > max_size) 1631 max_size = size; 1632 } 1633 1634 return max_size; 1635} 1636 1637/** 1638 * Prints a hex dump of the given buffer onto the debug output stream. 1639 */ 1640static void 1641hexdump (int level, char *comment, unsigned char *p, int l) 1642{ 1643 int i; 1644 char line[128]; 1645 char *ptr; 1646 1647 if(DBG_LEVEL < level) 1648 return; 1649 1650 DBG (level, "%s\n", comment); 1651 ptr = line; 1652 for (i = 0; i < l; i++, p++) 1653 { 1654 if ((i % 16) == 0) 1655 { 1656 if (ptr != line) 1657 { 1658 *ptr = '\0'; 1659 DBG (level, "%s\n", line); 1660 ptr = line; 1661 } 1662 sprintf (ptr, "%3.3x:", i); 1663 ptr += 4; 1664 } 1665 sprintf (ptr, " %2.2x", *p); 1666 ptr += 3; 1667 } 1668 *ptr = '\0'; 1669 DBG (level, "%s\n", line); 1670} 1671 1672/** 1673 * An advanced method we don't support but have to define. 1674 */ 1675SANE_Status 1676sane_set_io_mode (SANE_Handle h, SANE_Bool non_blocking) 1677{ 1678 DBG (10, "sane_set_io_mode\n"); 1679 DBG (15, "%d %p\n", non_blocking, h); 1680 return SANE_STATUS_UNSUPPORTED; 1681} 1682 1683/** 1684 * An advanced method we don't support but have to define. 1685 */ 1686SANE_Status 1687sane_get_select_fd (SANE_Handle h, SANE_Int *fdp) 1688{ 1689 DBG (10, "sane_get_select_fd\n"); 1690 DBG (15, "%p %d\n", h, *fdp); 1691 return SANE_STATUS_UNSUPPORTED; 1692} 1693