1141cc406Sopenharmony_ci/* sane - Scanner Access Now Easy. 2141cc406Sopenharmony_ci Copyright (C) 2007 Jeremy Johnson 3141cc406Sopenharmony_ci This file is part of a SANE backend for Ricoh IS450 4141cc406Sopenharmony_ci and IS420 family of HS2P Scanners using the SCSI controller. 5141cc406Sopenharmony_ci 6141cc406Sopenharmony_ci This file is part of the SANE package. 7141cc406Sopenharmony_ci 8141cc406Sopenharmony_ci This program is free software; you can redistribute it and/or 9141cc406Sopenharmony_ci modify it under the terms of the GNU General Public License as 10141cc406Sopenharmony_ci published by the Free Software Foundation; either version 2 of the 11141cc406Sopenharmony_ci License, or (at your option) any later version. 12141cc406Sopenharmony_ci 13141cc406Sopenharmony_ci This program is distributed in the hope that it will be useful, but 14141cc406Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 15141cc406Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16141cc406Sopenharmony_ci General Public License for more details. 17141cc406Sopenharmony_ci 18141cc406Sopenharmony_ci You should have received a copy of the GNU General Public License 19141cc406Sopenharmony_ci along with this program. If not, see <https://www.gnu.org/licenses/>. 20141cc406Sopenharmony_ci 21141cc406Sopenharmony_ci As a special exception, the authors of SANE give permission for 22141cc406Sopenharmony_ci additional uses of the libraries contained in this release of SANE. 23141cc406Sopenharmony_ci 24141cc406Sopenharmony_ci The exception is that, if you link a SANE library with other files 25141cc406Sopenharmony_ci to produce an executable, this does not by itself cause the 26141cc406Sopenharmony_ci resulting executable to be covered by the GNU General Public 27141cc406Sopenharmony_ci License. Your use of that executable is in no way restricted on 28141cc406Sopenharmony_ci account of linking the SANE library code into it. 29141cc406Sopenharmony_ci 30141cc406Sopenharmony_ci This exception does not, however, invalidate any other reasons why 31141cc406Sopenharmony_ci the executable file might be covered by the GNU General Public 32141cc406Sopenharmony_ci License. 33141cc406Sopenharmony_ci 34141cc406Sopenharmony_ci If you submit changes to SANE to the maintainers to be included in 35141cc406Sopenharmony_ci a subsequent release, you agree by submitting the changes that 36141cc406Sopenharmony_ci those changes may be distributed with this exception intact. 37141cc406Sopenharmony_ci 38141cc406Sopenharmony_ci If you write modifications of your own for SANE, it is your choice 39141cc406Sopenharmony_ci whether to permit this exception to apply to your modifications. 40141cc406Sopenharmony_ci If you do not wish that, delete this exception notice. */ 41141cc406Sopenharmony_ci 42141cc406Sopenharmony_ci#include <time.h> 43141cc406Sopenharmony_ci#include "hs2p.h" 44141cc406Sopenharmony_ci 45141cc406Sopenharmony_ci 46141cc406Sopenharmony_cistatic SANE_String_Const 47141cc406Sopenharmony_ciprint_devtype (SANE_Byte devtype) 48141cc406Sopenharmony_ci{ 49141cc406Sopenharmony_ci int i = devtype; 50141cc406Sopenharmony_ci static SANE_String devtypes[] = { 51141cc406Sopenharmony_ci "disk", 52141cc406Sopenharmony_ci "tape", 53141cc406Sopenharmony_ci "printer", 54141cc406Sopenharmony_ci "processor", 55141cc406Sopenharmony_ci "CD-writer", 56141cc406Sopenharmony_ci "CD-drive", 57141cc406Sopenharmony_ci "scanner", 58141cc406Sopenharmony_ci "optical-drive", 59141cc406Sopenharmony_ci "jukebox", 60141cc406Sopenharmony_ci "communicator" 61141cc406Sopenharmony_ci }; 62141cc406Sopenharmony_ci 63141cc406Sopenharmony_ci return (i >= 0 && i < NELEMS (devtypes)) ? devtypes[i] : "unknown-device"; 64141cc406Sopenharmony_ci} 65141cc406Sopenharmony_cistatic void 66141cc406Sopenharmony_ciprint_bytes (const void *buf, size_t bufsize) 67141cc406Sopenharmony_ci{ 68141cc406Sopenharmony_ci const SANE_Byte *bp; 69141cc406Sopenharmony_ci unsigned i; 70141cc406Sopenharmony_ci 71141cc406Sopenharmony_ci for (i = 0, bp = buf; i < bufsize; i++, bp++) 72141cc406Sopenharmony_ci DBG (DBG_error, "%3d: 0x%02x %d\n", i, *bp, *bp); 73141cc406Sopenharmony_ci} 74141cc406Sopenharmony_ci 75141cc406Sopenharmony_cistatic void 76141cc406Sopenharmony_ciScannerDump (HS2P_Scanner * s) 77141cc406Sopenharmony_ci{ 78141cc406Sopenharmony_ci int i; 79141cc406Sopenharmony_ci HS2P_Info *info; 80141cc406Sopenharmony_ci SANE_Device *sdev; 81141cc406Sopenharmony_ci 82141cc406Sopenharmony_ci info = &s->hw->info; 83141cc406Sopenharmony_ci sdev = &s->hw->sane; 84141cc406Sopenharmony_ci 85141cc406Sopenharmony_ci DBG (DBG_info, "\n\n"); 86141cc406Sopenharmony_ci DBG (DBG_info, ">> ScannerDump:\n"); 87141cc406Sopenharmony_ci DBG (DBG_info, "SANE Device: '%s' Vendor: '%s' Model: '%s' Type: '%s'\n", 88141cc406Sopenharmony_ci sdev->name, sdev->vendor, sdev->model, sdev->type); 89141cc406Sopenharmony_ci 90141cc406Sopenharmony_ci DBG (DBG_info, "Type: '%s' Vendor: '%s' Product: '%s' Revision: '%s'\n", 91141cc406Sopenharmony_ci print_devtype (info->devtype), info->vendor, info->product, 92141cc406Sopenharmony_ci info->revision); 93141cc406Sopenharmony_ci 94141cc406Sopenharmony_ci DBG (DBG_info, "Automatic Document Feeder: %s%s%s%s\n", 95141cc406Sopenharmony_ci info->hasADF ? "Installed " : "Not Installed ", 96141cc406Sopenharmony_ci info->hasSimplex ? "simplex" : "", 97141cc406Sopenharmony_ci info->hasDuplex ? "duplex" : "", 98141cc406Sopenharmony_ci info->hasARDF ? "reverse double-sided" : ""); 99141cc406Sopenharmony_ci DBG (DBG_info, "Endorser :%s\n", 100141cc406Sopenharmony_ci info->hasEndorser ? " <Installed>" : " <Not Installed>"); 101141cc406Sopenharmony_ci DBG (DBG_info, "Image Processing Unit:%s\n", 102141cc406Sopenharmony_ci info->hasIPU ? " <Installed>" : " <Not Installed>"); 103141cc406Sopenharmony_ci DBG (DBG_info, "Extended Board :%s\n", 104141cc406Sopenharmony_ci info->hasXBD ? " <Installed>" : " <Not Installed>"); 105141cc406Sopenharmony_ci 106141cc406Sopenharmony_ci DBG (DBG_info, "\n"); 107141cc406Sopenharmony_ci DBG (DBG_info, "Image Composition Support\n"); 108141cc406Sopenharmony_ci DBG (DBG_info, "Line Art (B/W) Support : %s\n", 109141cc406Sopenharmony_ci info->supports_lineart ? "Yes" : "No"); 110141cc406Sopenharmony_ci DBG (DBG_info, "Dithering (Halftone) Support: %s\n", 111141cc406Sopenharmony_ci info->supports_dithering ? "Yes" : "No"); 112141cc406Sopenharmony_ci DBG (DBG_info, "Error Diffusion Support : %s\n", 113141cc406Sopenharmony_ci info->supports_errordiffusion ? "Yes" : "No"); 114141cc406Sopenharmony_ci DBG (DBG_info, "Color Support : %s\n", 115141cc406Sopenharmony_ci info->supports_color ? "Yes" : "No"); 116141cc406Sopenharmony_ci DBG (DBG_info, "4 Bit Gray Support : %s\n", 117141cc406Sopenharmony_ci info->supports_4bitgray ? "Yes" : "No"); 118141cc406Sopenharmony_ci DBG (DBG_info, "5-8 Bit Gray Support : %s\n", 119141cc406Sopenharmony_ci info->supports_8bitgray ? "Yes" : "No"); 120141cc406Sopenharmony_ci 121141cc406Sopenharmony_ci DBG (DBG_info, "Image Data processing:%s%s%s%s%s%s\n", 122141cc406Sopenharmony_ci info->supports_whiteframing ? " <White Frame>" : "", 123141cc406Sopenharmony_ci info->supports_blackframing ? " <Black Frame>" : "", 124141cc406Sopenharmony_ci info->supports_edgeextraction ? " <Edge Extraction>" : "", 125141cc406Sopenharmony_ci info->supports_noiseremoval ? " <Noise Filter>" : "", 126141cc406Sopenharmony_ci info->supports_smoothing ? " <Smooth>" : "", 127141cc406Sopenharmony_ci info->supports_linebolding ? " <Line Bolding>" : ""); 128141cc406Sopenharmony_ci 129141cc406Sopenharmony_ci DBG (DBG_info, "Image Compression:%s%s%s%s\n", 130141cc406Sopenharmony_ci info->supports_MH ? " <MH support>" : "", 131141cc406Sopenharmony_ci info->supports_MR ? " <MR support>" : "", 132141cc406Sopenharmony_ci info->supports_MMR ? " <MMR support>" : "", 133141cc406Sopenharmony_ci info->supports_MHB ? " <MH byte boundary support>" : ""); 134141cc406Sopenharmony_ci DBG (DBG_info, "Marker Recognition: %s\n", 135141cc406Sopenharmony_ci info->supports_markerrecognition ? "<supported>" : "<not supported>"); 136141cc406Sopenharmony_ci DBG (DBG_info, "Size Recognition : %s\n", 137141cc406Sopenharmony_ci info->supports_sizerecognition ? "<supported>" : "<not supported>"); 138141cc406Sopenharmony_ci DBG (DBG_info, "X Maximum Output Pixels = %d\n", info->xmaxoutputpixels); 139141cc406Sopenharmony_ci 140141cc406Sopenharmony_ci /* 141141cc406Sopenharmony_ci DBG (DBG_info, "Optional Features:%s%s%s%s\n", 142141cc406Sopenharmony_ci info->canBorderRecog ? " <Border Recognition>" : "", 143141cc406Sopenharmony_ci info->canBarCode ? " <BarCode Decoding>" : "", 144141cc406Sopenharmony_ci info->canIcon ? " <Icon Generation>" : "", 145141cc406Sopenharmony_ci info->canSection ? " <Section Support>" : ""); 146141cc406Sopenharmony_ci */ 147141cc406Sopenharmony_ci 148141cc406Sopenharmony_ci DBG (DBG_info, "Max bytes per scan-line: %d (%d pixels)\n", 149141cc406Sopenharmony_ci info->xmaxoutputpixels / 8, info->xmaxoutputpixels); 150141cc406Sopenharmony_ci 151141cc406Sopenharmony_ci DBG (DBG_info, "Basic resolution (X/Y) : %d/%d\n", info->resBasicX, 152141cc406Sopenharmony_ci info->resBasicY); 153141cc406Sopenharmony_ci DBG (DBG_info, "Maximum resolution (X/Y) : %d/%d\n", info->resMaxX, 154141cc406Sopenharmony_ci info->resMaxY); 155141cc406Sopenharmony_ci DBG (DBG_info, "Minimum resolution (X/Y) : %d/%d\n", info->resMinX, 156141cc406Sopenharmony_ci info->resMinY); 157141cc406Sopenharmony_ci DBG (DBG_info, "Standard Resolutions:\n"); 158141cc406Sopenharmony_ci for (i = 1; i <= info->resStdList[0]; i++) 159141cc406Sopenharmony_ci DBG (DBG_info, " %d\n", info->resStdList[i]); 160141cc406Sopenharmony_ci 161141cc406Sopenharmony_ci DBG (DBG_info, 162141cc406Sopenharmony_ci "Window Width/Height (in basic res) %d/%d (%.2f/%.2f inches)\n", 163141cc406Sopenharmony_ci info->winWidth, info->winHeight, 164141cc406Sopenharmony_ci (info->resBasicX != 165141cc406Sopenharmony_ci 0) ? ((float) info->winWidth) / info->resBasicX : 0.0, 166141cc406Sopenharmony_ci (info->resBasicY) ? ((float) info->winHeight) / info->resBasicY : 0.0); 167141cc406Sopenharmony_ci 168141cc406Sopenharmony_ci /* 169141cc406Sopenharmony_ci DBG (DBG_info, "Summary:%s%s%s\n", 170141cc406Sopenharmony_ci info->canDuplex ? "Duplex Scanner" : "Simplex Scanner", 171141cc406Sopenharmony_ci info->canACE ? " (ACE capable)" : "", 172141cc406Sopenharmony_ci info->canCheckADF ? " (ADF Paper Sensor capable)" : ""); 173141cc406Sopenharmony_ci */ 174141cc406Sopenharmony_ci 175141cc406Sopenharmony_ci DBG (DBG_info, "Buffer Full Ratio = %#02x\n", 176141cc406Sopenharmony_ci info->cxn.buffer_full_ratio); 177141cc406Sopenharmony_ci DBG (DBG_info, "Buffer Empty Ratio = %#02x\n", 178141cc406Sopenharmony_ci info->cxn.buffer_empty_ratio); 179141cc406Sopenharmony_ci DBG (DBG_info, "Bus Inactive Limit = %#02x\n", 180141cc406Sopenharmony_ci info->cxn.bus_inactive_limit[0] << 8 | info->cxn. 181141cc406Sopenharmony_ci bus_inactive_limit[1]); 182141cc406Sopenharmony_ci DBG (DBG_info, "Disconnect Time Limit = %#04x\n", 183141cc406Sopenharmony_ci info->cxn.disconnect_time_limit[0] << 8 | info->cxn. 184141cc406Sopenharmony_ci disconnect_time_limit[1]); 185141cc406Sopenharmony_ci DBG (DBG_info, "Connect Time Limit = %#02x\n", 186141cc406Sopenharmony_ci info->cxn.connect_time_limit[0] << 8 | info->cxn. 187141cc406Sopenharmony_ci connect_time_limit[1]); 188141cc406Sopenharmony_ci DBG (DBG_info, "Maximum Burst Size = %#04x\n", 189141cc406Sopenharmony_ci info->cxn.maximum_burst_size[0] << 8 | info->cxn. 190141cc406Sopenharmony_ci maximum_burst_size[1]); 191141cc406Sopenharmony_ci DBG (DBG_info, "DTDC = %#02x\n", info->cxn.dtdc & 0x03); 192141cc406Sopenharmony_ci 193141cc406Sopenharmony_ci DBG (DBG_info, "White Balance is %s\n", 194141cc406Sopenharmony_ci info->white_balance == 1 ? "Absolute" : "Relative"); 195141cc406Sopenharmony_ci DBG (DBG_info, "Medium Wait Timer is <not supported>\n"); /* get_medium_wait_timer(fd) */ 196141cc406Sopenharmony_ci DBG (DBG_info, "Scan Wait Mode is %s\n", 197141cc406Sopenharmony_ci info->scan_wait_mode == 0 ? "OFF" : "ON"); 198141cc406Sopenharmony_ci DBG (DBG_info, "Service Mode is in Select %s Mode\n", 199141cc406Sopenharmony_ci info->service_mode == 0 ? "Self-Diagnostics" : "Optical Adjustment"); 200141cc406Sopenharmony_ci 201141cc406Sopenharmony_ci sprintf (info->inquiry_data, "Vendor: %s Product: %s Rev: %s %s%s\n", 202141cc406Sopenharmony_ci info->vendor, info->product, info->revision, 203141cc406Sopenharmony_ci info->hasADF && info->hasDuplex ? "Duplex Scanner" : "", 204141cc406Sopenharmony_ci info->hasADF && info->hasSimplex ? "Simplex Scanner" : ""); 205141cc406Sopenharmony_ci 206141cc406Sopenharmony_ci DBG (DBG_info, "duplex_default=%d\n", info->default_duplex); 207141cc406Sopenharmony_ci /* 208141cc406Sopenharmony_ci DBG (DBG_info, "autoborder_default=%d\n", info->autoborder_default); 209141cc406Sopenharmony_ci DBG (DBG_info, "batch_default=%d\n", info->batch_default); 210141cc406Sopenharmony_ci DBG (DBG_info, "deskew_default=%d\n", info->deskew_default); 211141cc406Sopenharmony_ci DBG (DBG_info, "check_adf_default=%d\n", info->check_adf_default); 212141cc406Sopenharmony_ci DBG (DBG_info, "timeout_adf_default=%d\n", info->timeout_adf_default); 213141cc406Sopenharmony_ci DBG (DBG_info, "timeout_manual_default=%d\n", info->timeout_manual_default); 214141cc406Sopenharmony_ci DBG (DBG_info, "control_panel_default=%d\n", info->control_panel_default); 215141cc406Sopenharmony_ci */ 216141cc406Sopenharmony_ci 217141cc406Sopenharmony_ci DBG (DBG_info, "bmu = %d\n", info->bmu); 218141cc406Sopenharmony_ci DBG (DBG_info, "mud = %d\n", info->mud); 219141cc406Sopenharmony_ci DBG (DBG_info, "white balance = %#0x\n", info->white_balance); 220141cc406Sopenharmony_ci DBG (DBG_info, "adf control = %#0x\n", info->adf_control); 221141cc406Sopenharmony_ci DBG (DBG_info, "adf mode control = %#0x\n", info->adf_mode_control); 222141cc406Sopenharmony_ci DBG (DBG_info, "endorser control = %#0x\n", info->endorser_control); 223141cc406Sopenharmony_ci DBG (DBG_info, "endorser string = %s\n", info->endorser_string); 224141cc406Sopenharmony_ci DBG (DBG_info, "scan wait mode = %#0x\n", info->scan_wait_mode); 225141cc406Sopenharmony_ci DBG (DBG_info, "service mode = %#0x\n", info->service_mode); 226141cc406Sopenharmony_ci 227141cc406Sopenharmony_ci DBG (DBG_info, "BasicXRes = %d\n", info->resBasicX); 228141cc406Sopenharmony_ci DBG (DBG_info, "BasicYRes = %d\n", info->resBasicY); 229141cc406Sopenharmony_ci 230141cc406Sopenharmony_ci DBG (DBG_info, "XResStep = %d\n", info->resXstep); 231141cc406Sopenharmony_ci DBG (DBG_info, "YResStep = %d\n", info->resYstep); 232141cc406Sopenharmony_ci 233141cc406Sopenharmony_ci DBG (DBG_info, "MaxXres = %d\n", info->resMaxX); 234141cc406Sopenharmony_ci DBG (DBG_info, "MaxYres = %d\n", info->resMaxY); 235141cc406Sopenharmony_ci 236141cc406Sopenharmony_ci DBG (DBG_info, "MinXres = %d\n", info->resMinX); 237141cc406Sopenharmony_ci DBG (DBG_info, "MinYres = %d\n", info->resMinY); 238141cc406Sopenharmony_ci 239141cc406Sopenharmony_ci DBG (DBG_info, "Width = %d\n", info->winWidth); 240141cc406Sopenharmony_ci DBG (DBG_info, "Height = %d\n", info->winHeight); 241141cc406Sopenharmony_ci 242141cc406Sopenharmony_ci DBG (DBG_info, "<< ScannerDump\n"); 243141cc406Sopenharmony_ci} 244141cc406Sopenharmony_cistatic void 245141cc406Sopenharmony_ciprint_vpd_info (struct inquiry_vpd_data *vbuf) 246141cc406Sopenharmony_ci{ 247141cc406Sopenharmony_ci DBG (DBG_info, "VPD IDENTIFIER C0H\n"); 248141cc406Sopenharmony_ci DBG (DBG_info, "[00] Peripheral %#02x\n", vbuf->devtype); 249141cc406Sopenharmony_ci DBG (DBG_info, "[01] Page Code %#02x\n", vbuf->pagecode); 250141cc406Sopenharmony_ci DBG (DBG_info, "[02] reserved %#02x\n", vbuf->byte2); 251141cc406Sopenharmony_ci DBG (DBG_info, "[03] Page Length %#02x\n", vbuf->pagelength); 252141cc406Sopenharmony_ci DBG (DBG_info, "[04] ADF ID %#02x\n", vbuf->adf_id); 253141cc406Sopenharmony_ci DBG (DBG_info, "[05] Endorser ID %#02x\n", vbuf->end_id); 254141cc406Sopenharmony_ci DBG (DBG_info, "[06] Image Processing Unit %#02x\n", vbuf->ipu_id); 255141cc406Sopenharmony_ci DBG (DBG_info, "[07] Image Composition %#02x\n", 256141cc406Sopenharmony_ci vbuf->imagecomposition); 257141cc406Sopenharmony_ci DBG (DBG_info, "[08] Image Data Processing %lu\n", 258141cc406Sopenharmony_ci _2btol (&vbuf->imagedataprocessing[0])); 259141cc406Sopenharmony_ci DBG (DBG_info, "[10] Compression %#02x\n", vbuf->compression); 260141cc406Sopenharmony_ci DBG (DBG_info, "[11] Marker Recognition %#02x\n", 261141cc406Sopenharmony_ci vbuf->markerrecognition); 262141cc406Sopenharmony_ci DBG (DBG_info, "[12] Size Recognition %#02x\n", 263141cc406Sopenharmony_ci vbuf->sizerecognition); 264141cc406Sopenharmony_ci DBG (DBG_info, "[13] reserved %#02x\n", vbuf->byte13); 265141cc406Sopenharmony_ci DBG (DBG_info, "[14] X Maximum Output Pixel %lu\n", 266141cc406Sopenharmony_ci _2btol (&vbuf->xmaxoutputpixels[0])); 267141cc406Sopenharmony_ci} 268141cc406Sopenharmony_cistatic void 269141cc406Sopenharmony_ciprint_jis_info (struct inquiry_jis_data *jbuf) 270141cc406Sopenharmony_ci{ 271141cc406Sopenharmony_ci DBG (DBG_info, "JIS IDENTIFIER F0H\n"); 272141cc406Sopenharmony_ci DBG (DBG_info, "[00] devtype %#02x\n", jbuf->devtype); 273141cc406Sopenharmony_ci DBG (DBG_info, "[01] Page Code %#02x\n", jbuf->pagecode); 274141cc406Sopenharmony_ci DBG (DBG_info, "[02] JIS Ver %#02x\n", jbuf->jisversion); 275141cc406Sopenharmony_ci DBG (DBG_info, "[03] reserved1 %#02x\n", jbuf->reserved1); 276141cc406Sopenharmony_ci DBG (DBG_info, "[04] Page Len %#02x\n", jbuf->alloclen); 277141cc406Sopenharmony_ci DBG (DBG_info, "[05] BasicXRes %lu\n", _2btol (&jbuf->BasicRes.x[0])); 278141cc406Sopenharmony_ci DBG (DBG_info, "[07] BasicYRes %lu\n", _2btol (&jbuf->BasicRes.y[0])); 279141cc406Sopenharmony_ci DBG (DBG_info, "[09] Resolution step %#02x\n", jbuf->resolutionstep); 280141cc406Sopenharmony_ci DBG (DBG_info, "[10] MaxXRes %lu\n", _2btol (&jbuf->MaxRes.x[0])); 281141cc406Sopenharmony_ci DBG (DBG_info, "[12] MaxYRes %lu\n", _2btol (&jbuf->MaxRes.y[0])); 282141cc406Sopenharmony_ci DBG (DBG_info, "[14] MinXRes %lu\n", _2btol (&jbuf->MinRes.x[0])); 283141cc406Sopenharmony_ci DBG (DBG_info, "[16] MinYRes %lu\n", _2btol (&jbuf->MinRes.y[0])); 284141cc406Sopenharmony_ci DBG (DBG_info, "[18] Std Res %#0x\n", 285141cc406Sopenharmony_ci (jbuf->standardres[0] << 8) | jbuf->standardres[1]); 286141cc406Sopenharmony_ci DBG (DBG_info, "[20] Win Width %lu\n", _4btol (&jbuf->Window.width[0])); /* Manual says 4787/12B3H pixels @400dpi = 12in */ 287141cc406Sopenharmony_ci DBG (DBG_info, "[24] Win Len %lu\n", _4btol (&jbuf->Window.length[0])); /* Manual says 6803/1A93H pixels @400dpi = 17in) */ 288141cc406Sopenharmony_ci DBG (DBG_info, "[28] function %#02x\n", jbuf->functions); 289141cc406Sopenharmony_ci DBG (DBG_info, "[29] reserved %#02x\n", jbuf->reserved2); 290141cc406Sopenharmony_ci} 291141cc406Sopenharmony_ci 292141cc406Sopenharmony_ci/* 1-3-1 TEST UNIT READY 293141cc406Sopenharmony_ci Byte0: | 0x00 | 294141cc406Sopenharmony_ci Byte1: | 7-5 Logical Unit Number | Reserved | 295141cc406Sopenharmony_ci Byte2: | Reserved | 296141cc406Sopenharmony_ci Byte3: | Reserved | 297141cc406Sopenharmony_ci Byte4: | Reserved | 298141cc406Sopenharmony_ci Byte5: | 7-6 Vendor Unique | 5-2 Reserved | 1 Flag | 0 Link | 299141cc406Sopenharmony_ci*/ 300141cc406Sopenharmony_cistatic SANE_Status 301141cc406Sopenharmony_citest_unit_ready (int fd) 302141cc406Sopenharmony_ci{ 303141cc406Sopenharmony_ci static SANE_Byte cmd[6]; 304141cc406Sopenharmony_ci SANE_Status status; 305141cc406Sopenharmony_ci DBG (DBG_proc, ">> test_unit_ready\n"); 306141cc406Sopenharmony_ci 307141cc406Sopenharmony_ci memset (cmd, 0, sizeof (cmd)); 308141cc406Sopenharmony_ci cmd[0] = HS2P_SCSI_TEST_UNIT_READY; 309141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), 0, 0); 310141cc406Sopenharmony_ci 311141cc406Sopenharmony_ci DBG (DBG_proc, "<< test_unit_ready\n"); 312141cc406Sopenharmony_ci return (status); 313141cc406Sopenharmony_ci} 314141cc406Sopenharmony_ci 315141cc406Sopenharmony_ci/* 1-3-2 REQUEST SENSE 316141cc406Sopenharmony_ci Byte0: | 0x00 | 317141cc406Sopenharmony_ci Byte1: | 7-5 Logical Unit Number | Reserved | 318141cc406Sopenharmony_ci Byte2: | Reserved | 319141cc406Sopenharmony_ci Byte3: | Reserved | 320141cc406Sopenharmony_ci Byte4: | Allocation Length | 321141cc406Sopenharmony_ci Byte5: | 7-6 Vendor Unique | 5-2 Reserved | 1 Flag | 0 Link | 322141cc406Sopenharmony_ci*/ 323141cc406Sopenharmony_ci 324141cc406Sopenharmony_ci#if 0 325141cc406Sopenharmony_cistatic SANE_Status 326141cc406Sopenharmony_ciget_sense_data (int fd, SENSE_DATA * sense_data) 327141cc406Sopenharmony_ci{ 328141cc406Sopenharmony_ci SANE_Status status; 329141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">> get_sense_data\n"); 330141cc406Sopenharmony_ci 331141cc406Sopenharmony_ci static SANE_Byte cmd[6]; 332141cc406Sopenharmony_ci size_t len; 333141cc406Sopenharmony_ci 334141cc406Sopenharmony_ci len = sizeof (*sense_data); 335141cc406Sopenharmony_ci memset (sense_data, 0, len); 336141cc406Sopenharmony_ci memset (cmd, 0, sizeof (cmd)); 337141cc406Sopenharmony_ci 338141cc406Sopenharmony_ci cmd[0] = HS2P_SCSI_REQUEST_SENSE; 339141cc406Sopenharmony_ci cmd[4] = len; 340141cc406Sopenharmony_ci 341141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), sense_data, &len); 342141cc406Sopenharmony_ci 343141cc406Sopenharmony_ci DBG (DBG_proc, "<< get_sense_data\n"); 344141cc406Sopenharmony_ci return (status); 345141cc406Sopenharmony_ci} 346141cc406Sopenharmony_ci#endif 347141cc406Sopenharmony_ci 348141cc406Sopenharmony_cistatic SANE_Status 349141cc406Sopenharmony_ciprint_sense_data (int dbg_level, SENSE_DATA * data) 350141cc406Sopenharmony_ci{ 351141cc406Sopenharmony_ci SANE_Status status = SANE_STATUS_GOOD; 352141cc406Sopenharmony_ci SANE_Byte *bp, *end; 353141cc406Sopenharmony_ci SANE_Int i; 354141cc406Sopenharmony_ci 355141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">> print_sense_data\n"); 356141cc406Sopenharmony_ci 357141cc406Sopenharmony_ci bp = (SANE_Byte *) data; 358141cc406Sopenharmony_ci end = bp + (SANE_Byte) sizeof (SENSE_DATA); 359141cc406Sopenharmony_ci for (i = 0; bp < end; bp++, i++) 360141cc406Sopenharmony_ci { 361141cc406Sopenharmony_ci DBG (dbg_level, "Byte #%2d is %3d, 0x%02x\n", i, *bp, *bp); 362141cc406Sopenharmony_ci } 363141cc406Sopenharmony_ci 364141cc406Sopenharmony_ci DBG (dbg_level, "Valid=%1d, ErrorCode=%#x\n", 365141cc406Sopenharmony_ci (data->error_code & 0x80) >> 7, data->error_code & 0x7F); 366141cc406Sopenharmony_ci DBG (dbg_level, "Segment number = %d\n", data->segment_number); 367141cc406Sopenharmony_ci DBG (dbg_level, 368141cc406Sopenharmony_ci "F-mark=%1d, EOM=%1d, ILI=%1d, Reserved=%1d, SenseKey=%#x\n", 369141cc406Sopenharmony_ci (data->sense_key & 0x80) >> 7, (data->sense_key & 0x40) >> 6, 370141cc406Sopenharmony_ci (data->sense_key & 0x20) >> 5, (data->sense_key & 0x10) >> 4, 371141cc406Sopenharmony_ci (data->sense_key & 0x0F)); 372141cc406Sopenharmony_ci DBG (dbg_level, "Information Byte = %lu\n", _4btol (data->information)); 373141cc406Sopenharmony_ci DBG (dbg_level, "Additional Sense Length = %d\n", data->sense_length); 374141cc406Sopenharmony_ci DBG (dbg_level, "Command Specific Information = %lu\n", 375141cc406Sopenharmony_ci _4btol (data->command_specific_information)); 376141cc406Sopenharmony_ci DBG (dbg_level, "Additional Sense Code = %#x\n", data->sense_code); 377141cc406Sopenharmony_ci DBG (dbg_level, "Additional Sense Code Qualifier = %#x\n", 378141cc406Sopenharmony_ci data->sense_code_qualifier); 379141cc406Sopenharmony_ci 380141cc406Sopenharmony_ci DBG (DBG_proc, "<< print_sense_data\n"); 381141cc406Sopenharmony_ci return (status); 382141cc406Sopenharmony_ci} 383141cc406Sopenharmony_ci 384141cc406Sopenharmony_cistatic struct sense_key * 385141cc406Sopenharmony_cilookup_sensekey_errmsg (int code) 386141cc406Sopenharmony_ci{ 387141cc406Sopenharmony_ci int i; 388141cc406Sopenharmony_ci struct sense_key *k = &sensekey_errmsg[0]; 389141cc406Sopenharmony_ci 390141cc406Sopenharmony_ci for (i = 0; i < 16; i++, k++) 391141cc406Sopenharmony_ci if (k->key == code) 392141cc406Sopenharmony_ci return k; 393141cc406Sopenharmony_ci return NULL; 394141cc406Sopenharmony_ci} 395141cc406Sopenharmony_cistatic struct ASCQ * 396141cc406Sopenharmony_cilookup_ascq_errmsg (unsigned int code) 397141cc406Sopenharmony_ci{ 398141cc406Sopenharmony_ci unsigned int i; 399141cc406Sopenharmony_ci struct ASCQ *k = &ascq_errmsg[0]; 400141cc406Sopenharmony_ci 401141cc406Sopenharmony_ci for (i = 0; i < 74; i++, k++) 402141cc406Sopenharmony_ci if (k->codequalifier == code) 403141cc406Sopenharmony_ci return k; 404141cc406Sopenharmony_ci return NULL; 405141cc406Sopenharmony_ci} 406141cc406Sopenharmony_ci 407141cc406Sopenharmony_ci/* a sensible sense handler 408141cc406Sopenharmony_ci arg is a pointer to the associated HS2P_Scanner structure 409141cc406Sopenharmony_ci 410141cc406Sopenharmony_ci SENSE DATA FORMAT: 14 bytes bits[7-0] 411141cc406Sopenharmony_ci Byte 0: [7]:valid [6-0]:Error Code 412141cc406Sopenharmony_ci Byte 1: Segment Number 413141cc406Sopenharmony_ci Byte 2: [7]: F-mark; [6]:EOM; [5]:ILI; [4]:reserved; [3-0]:Sense Key 414141cc406Sopenharmony_ci Byte 3: Information Byte 415141cc406Sopenharmony_ci Byte 4: Information Byte 416141cc406Sopenharmony_ci Byte 5: Information Byte 417141cc406Sopenharmony_ci Byte 6: Information Byte 418141cc406Sopenharmony_ci Byte 7: Additional Sense Length (n-7) 419141cc406Sopenharmony_ci Byte 8: Command Specific Information 420141cc406Sopenharmony_ci Byte 9: Command Specific Information 421141cc406Sopenharmony_ci Byte 10: Command Specific Information 422141cc406Sopenharmony_ci Byte 11: Command Specific Information 423141cc406Sopenharmony_ci Byte 12: Additional Sense Code 424141cc406Sopenharmony_ci Byte 13: Additional Sense Code Qualifier 425141cc406Sopenharmony_ci*/ 426141cc406Sopenharmony_cistatic SANE_Status 427141cc406Sopenharmony_cisense_handler (int __sane_unused__ scsi_fd, u_char * sense_buffer, void *sd) 428141cc406Sopenharmony_ci{ 429141cc406Sopenharmony_ci u_char sense, asc, ascq, EOM, ILI, ErrorCode, ValidData; 430141cc406Sopenharmony_ci u_long MissingBytes; 431141cc406Sopenharmony_ci char *sense_str = ""; 432141cc406Sopenharmony_ci 433141cc406Sopenharmony_ci struct sense_key *skey; 434141cc406Sopenharmony_ci struct ASCQ *ascq_key; 435141cc406Sopenharmony_ci SENSE_DATA *sdp = (SENSE_DATA *) sd; 436141cc406Sopenharmony_ci SANE_Int i; 437141cc406Sopenharmony_ci SANE_Status status = SANE_STATUS_INVAL; 438141cc406Sopenharmony_ci SANE_Char print_sense[(16 * 3) + 1]; 439141cc406Sopenharmony_ci 440141cc406Sopenharmony_ci DBG (DBG_proc, ">> sense_handler\n"); 441141cc406Sopenharmony_ci if (DBG_LEVEL >= DBG_info) 442141cc406Sopenharmony_ci print_sense_data (DBG_LEVEL, (SENSE_DATA *) sense_buffer); 443141cc406Sopenharmony_ci 444141cc406Sopenharmony_ci /* store sense_buffer */ 445141cc406Sopenharmony_ci DBG (DBG_info, ">> copying %lu bytes from sense_buffer[] to sense_data\n", 446141cc406Sopenharmony_ci (u_long) sizeof (SENSE_DATA)); 447141cc406Sopenharmony_ci memcpy (sdp, sense_buffer, sizeof (SENSE_DATA)); 448141cc406Sopenharmony_ci if (DBG_LEVEL >= DBG_info) 449141cc406Sopenharmony_ci print_sense_data (DBG_LEVEL, sdp); 450141cc406Sopenharmony_ci 451141cc406Sopenharmony_ci ErrorCode = sense_buffer[0] & 0x7F; 452141cc406Sopenharmony_ci ValidData = (sense_buffer[0] & 0x80) != 0; 453141cc406Sopenharmony_ci sense = sense_buffer[2] & 0x0f; /* Sense Key */ 454141cc406Sopenharmony_ci asc = sense_buffer[12]; /* Additional Sense Code */ 455141cc406Sopenharmony_ci ascq = sense_buffer[13]; /* Additional Sense Code Qualifier */ 456141cc406Sopenharmony_ci EOM = (sense_buffer[2] & 0x40) != 0; /* End Of Media */ 457141cc406Sopenharmony_ci ILI = (sense_buffer[2] & 0x20) != 0; /* Invalid Length Indicator */ 458141cc406Sopenharmony_ci MissingBytes = ValidData ? _4btol (&sense_buffer[3]) : 0; 459141cc406Sopenharmony_ci 460141cc406Sopenharmony_ci DBG (DBG_sense, 461141cc406Sopenharmony_ci "sense_handler: sense_buffer=%#x, sense=%#x, asc=%#x, ascq=%#x\n", 462141cc406Sopenharmony_ci sense_buffer[0], sense, asc, ascq); 463141cc406Sopenharmony_ci DBG (DBG_sense, 464141cc406Sopenharmony_ci "sense_handler: ErrorCode %02x ValidData: %d " 465141cc406Sopenharmony_ci "EOM: %d ILI: %d MissingBytes: %lu\n", ErrorCode, ValidData, EOM, 466141cc406Sopenharmony_ci ILI, MissingBytes); 467141cc406Sopenharmony_ci 468141cc406Sopenharmony_ci memset (print_sense, '\0', sizeof (print_sense)); 469141cc406Sopenharmony_ci for (i = 0; i < 16; i++) 470141cc406Sopenharmony_ci sprintf (print_sense + strlen (print_sense), "%02x ", sense_buffer[i]); 471141cc406Sopenharmony_ci DBG (DBG_sense, "sense_handler: sense=%s\n", print_sense); 472141cc406Sopenharmony_ci 473141cc406Sopenharmony_ci if (ErrorCode != 0x70 && ErrorCode != 0x71) 474141cc406Sopenharmony_ci { 475141cc406Sopenharmony_ci DBG (DBG_error, "sense_handler: error code is invalid.\n"); 476141cc406Sopenharmony_ci return SANE_STATUS_IO_ERROR; /* error code is invalid */ 477141cc406Sopenharmony_ci } 478141cc406Sopenharmony_ci 479141cc406Sopenharmony_ci skey = lookup_sensekey_errmsg (sense); /* simple sequential search */ 480141cc406Sopenharmony_ci DBG (DBG_sense, "sense_handler: sense_key=%#x '%s - %s'\n", skey->key, 481141cc406Sopenharmony_ci skey->meaning, skey->description); 482141cc406Sopenharmony_ci 483141cc406Sopenharmony_ci DBG (DBG_sense, "Looking up ascq=(%#x,%#x)=%#x\n", asc, ascq, 484141cc406Sopenharmony_ci (asc << 8) | ascq); 485141cc406Sopenharmony_ci ascq_key = lookup_ascq_errmsg ((asc << 8) | ascq); /* simple sequential search */ 486141cc406Sopenharmony_ci DBG (DBG_sense, "sense_handler: ascq=(%#x,%#x): %#x '%s'\n", asc, ascq, 487141cc406Sopenharmony_ci ascq_key->codequalifier, ascq_key->description); 488141cc406Sopenharmony_ci 489141cc406Sopenharmony_ci /* handle each sense key: Translate from HS2P message to SANE_STATUS_ message 490141cc406Sopenharmony_ci * SANE_STATUS_GOOD, _ACCESS_DEINIED, _NO_MEM, _INVAL, _IO_ERROR, _DEVICE_BUSY, 491141cc406Sopenharmony_ci * _EOF, _UNSUPPORTED, _CANCELLED, _JAMMED, _NO_DOCS, _COVER_OPEN 492141cc406Sopenharmony_ci */ 493141cc406Sopenharmony_ci switch (sense) 494141cc406Sopenharmony_ci { 495141cc406Sopenharmony_ci case 0x00: /* no sense */ 496141cc406Sopenharmony_ci status = SANE_STATUS_GOOD; 497141cc406Sopenharmony_ci break; 498141cc406Sopenharmony_ci case 0x01: /* recovered error */ 499141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 500141cc406Sopenharmony_ci break; 501141cc406Sopenharmony_ci case 0x02: /* not ready */ 502141cc406Sopenharmony_ci status = SANE_STATUS_DEVICE_BUSY; 503141cc406Sopenharmony_ci break; 504141cc406Sopenharmony_ci case 0x03: /* medium error */ 505141cc406Sopenharmony_ci status = SANE_STATUS_JAMMED; 506141cc406Sopenharmony_ci break; 507141cc406Sopenharmony_ci case 0x04: /* hardware error */ 508141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 509141cc406Sopenharmony_ci break; 510141cc406Sopenharmony_ci case 0x05: /* illegal request */ 511141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 512141cc406Sopenharmony_ci break; 513141cc406Sopenharmony_ci case 0x06: /* unit attention */ 514141cc406Sopenharmony_ci status = SANE_STATUS_GOOD; 515141cc406Sopenharmony_ci break; 516141cc406Sopenharmony_ci case 0x07: /* data protect */ 517141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 518141cc406Sopenharmony_ci break; 519141cc406Sopenharmony_ci case 0x08: /* blank check */ 520141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 521141cc406Sopenharmony_ci break; 522141cc406Sopenharmony_ci case 0x09: /* vendor specific */ 523141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 524141cc406Sopenharmony_ci break; 525141cc406Sopenharmony_ci case 0x0A: /* copy aborted */ 526141cc406Sopenharmony_ci status = SANE_STATUS_CANCELLED; 527141cc406Sopenharmony_ci break; 528141cc406Sopenharmony_ci case 0x0B: /* aborted command */ 529141cc406Sopenharmony_ci status = SANE_STATUS_CANCELLED; 530141cc406Sopenharmony_ci break; 531141cc406Sopenharmony_ci case 0x0C: /* equal */ 532141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 533141cc406Sopenharmony_ci break; 534141cc406Sopenharmony_ci case 0x0D: /* volume overflow */ 535141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 536141cc406Sopenharmony_ci break; 537141cc406Sopenharmony_ci case 0x0E: /* miscompare */ 538141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 539141cc406Sopenharmony_ci break; 540141cc406Sopenharmony_ci case 0x0F: /* reserved */ 541141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 542141cc406Sopenharmony_ci break; 543141cc406Sopenharmony_ci } 544141cc406Sopenharmony_ci if (ErrorCode == 0x70) /* Additional Sense Codes available */ 545141cc406Sopenharmony_ci switch ((asc << 8) | ascq) 546141cc406Sopenharmony_ci { 547141cc406Sopenharmony_ci case 0x0000: /* No additional Information */ 548141cc406Sopenharmony_ci status = SANE_STATUS_GOOD; 549141cc406Sopenharmony_ci break; 550141cc406Sopenharmony_ci case 0x0002: /* End of Medium */ 551141cc406Sopenharmony_ci status = SANE_STATUS_NO_DOCS; 552141cc406Sopenharmony_ci break; 553141cc406Sopenharmony_ci case 0x0005: /* End of Data */ 554141cc406Sopenharmony_ci status = SANE_STATUS_EOF; 555141cc406Sopenharmony_ci break; 556141cc406Sopenharmony_ci case 0x0400: /* LUN not ready */ 557141cc406Sopenharmony_ci status = SANE_STATUS_DEVICE_BUSY; 558141cc406Sopenharmony_ci break; 559141cc406Sopenharmony_ci case 0x0401: /* LUN becoming ready */ 560141cc406Sopenharmony_ci status = SANE_STATUS_DEVICE_BUSY; 561141cc406Sopenharmony_ci break; 562141cc406Sopenharmony_ci case 0x0403: /* LUN not ready. Manual intervention needed */ 563141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 564141cc406Sopenharmony_ci break; 565141cc406Sopenharmony_ci case 0x0500: /* LUN doesn't respond to selection */ 566141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 567141cc406Sopenharmony_ci break; 568141cc406Sopenharmony_ci case 0x0700: /* Multiple peripheral devices selected */ 569141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 570141cc406Sopenharmony_ci break; 571141cc406Sopenharmony_ci case 0x1100: /* Unrecovered read error */ 572141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 573141cc406Sopenharmony_ci break; 574141cc406Sopenharmony_ci case 0x1101: /* Read retries exhausted */ 575141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 576141cc406Sopenharmony_ci break; 577141cc406Sopenharmony_ci case 0x1501: /* Mechanical positioning error */ 578141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 579141cc406Sopenharmony_ci break; 580141cc406Sopenharmony_ci case 0x1A00: /* Parameter list length error */ 581141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 582141cc406Sopenharmony_ci break; 583141cc406Sopenharmony_ci case 0x2000: /* Invalid command operation code */ 584141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 585141cc406Sopenharmony_ci break; 586141cc406Sopenharmony_ci case 0x2400: /* Invalid field in CDB (check field pointer) */ 587141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 588141cc406Sopenharmony_ci break; 589141cc406Sopenharmony_ci case 0x2500: /* LUN not supported */ 590141cc406Sopenharmony_ci status = SANE_STATUS_UNSUPPORTED; 591141cc406Sopenharmony_ci break; 592141cc406Sopenharmony_ci case 0x2600: /* Invalid field in parameter list (check field pointer) */ 593141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 594141cc406Sopenharmony_ci break; 595141cc406Sopenharmony_ci case 0x2900: /* Power on, reset, or BUS DEVICE RESET occurred */ 596141cc406Sopenharmony_ci status = SANE_STATUS_GOOD; 597141cc406Sopenharmony_ci break; 598141cc406Sopenharmony_ci case 0x2A01: /* (MODE parameter changed) */ 599141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 600141cc406Sopenharmony_ci break; 601141cc406Sopenharmony_ci case 0x2C00: /* Command sequence error */ 602141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 603141cc406Sopenharmony_ci break; 604141cc406Sopenharmony_ci case 0x2C01: /* Too many windows specified */ 605141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 606141cc406Sopenharmony_ci break; 607141cc406Sopenharmony_ci case 0x2C02: /* Invalid combination of windows specified */ 608141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 609141cc406Sopenharmony_ci break; 610141cc406Sopenharmony_ci case 0x3700: /* (Rounded parameter) */ 611141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 612141cc406Sopenharmony_ci break; 613141cc406Sopenharmony_ci case 0x3900: /* (Saving parameters not supported) */ 614141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 615141cc406Sopenharmony_ci break; 616141cc406Sopenharmony_ci case 0x3A00: /* Medium not present */ 617141cc406Sopenharmony_ci status = SANE_STATUS_NO_DOCS; 618141cc406Sopenharmony_ci break; 619141cc406Sopenharmony_ci case 0x3B09: /* Read past end of medium */ 620141cc406Sopenharmony_ci status = SANE_STATUS_EOF; 621141cc406Sopenharmony_ci break; 622141cc406Sopenharmony_ci case 0x3B0B: /* Position past end of medium */ 623141cc406Sopenharmony_ci status = SANE_STATUS_EOF; 624141cc406Sopenharmony_ci break; 625141cc406Sopenharmony_ci case 0x3D00: /* Invalid bits in IDENTIFY message */ 626141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 627141cc406Sopenharmony_ci break; 628141cc406Sopenharmony_ci case 0x4300: /* Message error */ 629141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 630141cc406Sopenharmony_ci break; 631141cc406Sopenharmony_ci case 0x4500: /* Select/Reselect failure */ 632141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 633141cc406Sopenharmony_ci break; 634141cc406Sopenharmony_ci case 0x4700: /* (SCSI parity error) */ 635141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 636141cc406Sopenharmony_ci break; 637141cc406Sopenharmony_ci case 0x4800: /* Initiator detected error message received */ 638141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 639141cc406Sopenharmony_ci break; 640141cc406Sopenharmony_ci case 0x4900: /* Invalid message error */ 641141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 642141cc406Sopenharmony_ci break; 643141cc406Sopenharmony_ci case 0x4B00: /* Data phase error */ 644141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 645141cc406Sopenharmony_ci break; 646141cc406Sopenharmony_ci case 0x5300: /* (Media Load/Eject failed) */ 647141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 648141cc406Sopenharmony_ci break; 649141cc406Sopenharmony_ci case 0x6000: /* Lamp failure */ 650141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 651141cc406Sopenharmony_ci break; 652141cc406Sopenharmony_ci case 0x6001: /* Shading error */ 653141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 654141cc406Sopenharmony_ci break; 655141cc406Sopenharmony_ci case 0x6002: /* White adjustment error */ 656141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 657141cc406Sopenharmony_ci break; 658141cc406Sopenharmony_ci case 0x6010: /* Reverse Side Lamp Failure */ 659141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 660141cc406Sopenharmony_ci break; 661141cc406Sopenharmony_ci case 0x6200: /* Scan head positioning error */ 662141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 663141cc406Sopenharmony_ci break; 664141cc406Sopenharmony_ci case 0x6300: /* Document Waiting Cancel */ 665141cc406Sopenharmony_ci status = SANE_STATUS_CANCELLED; 666141cc406Sopenharmony_ci break; 667141cc406Sopenharmony_ci case 0x8000: /* (PSU over heate) */ 668141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 669141cc406Sopenharmony_ci break; 670141cc406Sopenharmony_ci case 0x8001: /* (PSU 24V fuse down) */ 671141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 672141cc406Sopenharmony_ci break; 673141cc406Sopenharmony_ci case 0x8002: /* (ADF 24V fuse down) */ 674141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 675141cc406Sopenharmony_ci break; 676141cc406Sopenharmony_ci case 0x8003: /* (5V fuse down) */ 677141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 678141cc406Sopenharmony_ci break; 679141cc406Sopenharmony_ci case 0x8004: /* (-12V fuse down) */ 680141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 681141cc406Sopenharmony_ci break; 682141cc406Sopenharmony_ci case 0x8100: /* (ADF 24V power off) */ 683141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 684141cc406Sopenharmony_ci break; 685141cc406Sopenharmony_ci case 0x8102: /* (Base 12V power off) */ 686141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 687141cc406Sopenharmony_ci break; 688141cc406Sopenharmony_ci case 0x8103: /* Lamp cover open (Lamp 24V power off) */ 689141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 690141cc406Sopenharmony_ci break; 691141cc406Sopenharmony_ci case 0x8104: /* (-12V power off) */ 692141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 693141cc406Sopenharmony_ci break; 694141cc406Sopenharmony_ci case 0x8105: /* (Endorser 6V power off) */ 695141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 696141cc406Sopenharmony_ci break; 697141cc406Sopenharmony_ci case 0x8106: /* SCU 3.3V power down error */ 698141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 699141cc406Sopenharmony_ci break; 700141cc406Sopenharmony_ci case 0x8107: /* RCU 3.3V power down error */ 701141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 702141cc406Sopenharmony_ci break; 703141cc406Sopenharmony_ci case 0x8108: /* OIPU 3.3V power down error */ 704141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 705141cc406Sopenharmony_ci break; 706141cc406Sopenharmony_ci case 0x8200: /* Memory Error (Bus error) */ 707141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 708141cc406Sopenharmony_ci break; 709141cc406Sopenharmony_ci case 0x8210: /* Reverse-side memory error (Bus error) */ 710141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 711141cc406Sopenharmony_ci break; 712141cc406Sopenharmony_ci case 0x8300: /* (Image data processing LSI error) */ 713141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 714141cc406Sopenharmony_ci break; 715141cc406Sopenharmony_ci case 0x8301: /* (Interface LSI error) */ 716141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 717141cc406Sopenharmony_ci break; 718141cc406Sopenharmony_ci case 0x8302: /* (SCSI controller error) */ 719141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 720141cc406Sopenharmony_ci break; 721141cc406Sopenharmony_ci case 0x8303: /* (Compression unit error) */ 722141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 723141cc406Sopenharmony_ci break; 724141cc406Sopenharmony_ci case 0x8304: /* (Marker detect unit error) */ 725141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 726141cc406Sopenharmony_ci break; 727141cc406Sopenharmony_ci case 0x8400: /* Endorser error */ 728141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 729141cc406Sopenharmony_ci break; 730141cc406Sopenharmony_ci case 0x8500: /* (Origin Positioning error) */ 731141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 732141cc406Sopenharmony_ci break; 733141cc406Sopenharmony_ci case 0x8600: /* Mechanical Time Out error (Pick Up Roller error) */ 734141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 735141cc406Sopenharmony_ci break; 736141cc406Sopenharmony_ci case 0x8700: /* (Heater error) */ 737141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 738141cc406Sopenharmony_ci break; 739141cc406Sopenharmony_ci case 0x8800: /* (Thermistor error) */ 740141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 741141cc406Sopenharmony_ci break; 742141cc406Sopenharmony_ci case 0x8900: /* ADF cover open */ 743141cc406Sopenharmony_ci status = SANE_STATUS_COVER_OPEN; 744141cc406Sopenharmony_ci break; 745141cc406Sopenharmony_ci case 0x8901: /* (ADF lift up) */ 746141cc406Sopenharmony_ci status = SANE_STATUS_COVER_OPEN; 747141cc406Sopenharmony_ci break; 748141cc406Sopenharmony_ci case 0x8902: /* Document jam error for ADF */ 749141cc406Sopenharmony_ci status = SANE_STATUS_JAMMED; 750141cc406Sopenharmony_ci break; 751141cc406Sopenharmony_ci case 0x8903: /* Document misfeed for ADF */ 752141cc406Sopenharmony_ci status = SANE_STATUS_JAMMED; 753141cc406Sopenharmony_ci break; 754141cc406Sopenharmony_ci case 0x8A00: /* (Interlock open) */ 755141cc406Sopenharmony_ci status = SANE_STATUS_COVER_OPEN; 756141cc406Sopenharmony_ci break; 757141cc406Sopenharmony_ci case 0x8B00: /* (Not enough memory) */ 758141cc406Sopenharmony_ci status = SANE_STATUS_NO_MEM; 759141cc406Sopenharmony_ci break; 760141cc406Sopenharmony_ci case 0x8C00: /* Size Detection failed */ 761141cc406Sopenharmony_ci status = SANE_STATUS_IO_ERROR; 762141cc406Sopenharmony_ci break; 763141cc406Sopenharmony_ci default: /* Should never get here */ 764141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 765141cc406Sopenharmony_ci DBG (DBG_sense, 766141cc406Sopenharmony_ci "sense_handler: 'Undocumented code': ascq=(%#x,%#x)\n", 767141cc406Sopenharmony_ci asc & 0xFF00, ascq & 0x00FF); 768141cc406Sopenharmony_ci break; 769141cc406Sopenharmony_ci } 770141cc406Sopenharmony_ci 771141cc406Sopenharmony_ci 772141cc406Sopenharmony_ci DBG (DBG_proc, "sense_handler %s: '%s'-'%s' '%s' return:%d\n", sense_str, 773141cc406Sopenharmony_ci skey->meaning, skey->description, ascq_key->description, status); 774141cc406Sopenharmony_ci return status; 775141cc406Sopenharmony_ci} 776141cc406Sopenharmony_ci 777141cc406Sopenharmony_ci/* VPD IDENTIFIER Page Code 0x00 778141cc406Sopenharmony_ci * A list of all Page Codes supported by scanner is returned as data 779141cc406Sopenharmony_ci * Byte0 => bit7-5: Peripheral Qualifier, bits4-0: Peripheral Device Type 780141cc406Sopenharmony_ci * Byte1 => Page Code of CDB is set as Page Code 0 781141cc406Sopenharmony_ci * Byte2 => Reserved 782141cc406Sopenharmony_ci * Byte3 => Page Length is 2 because scanner supports just two page codes: C0H and F0H 783141cc406Sopenharmony_ci * Byte4 => First Support Page Code 784141cc406Sopenharmony_ci * Byte5 => Second Support Page Code 785141cc406Sopenharmony_ci*/ 786141cc406Sopenharmony_ci#if 0 787141cc406Sopenharmony_cistatic SANE_Status 788141cc406Sopenharmony_civpd_indentifier_00H (int fd) 789141cc406Sopenharmony_ci{ 790141cc406Sopenharmony_ci static SANE_Byte cmd[6]; 791141cc406Sopenharmony_ci SANE_Status status; 792141cc406Sopenharmony_ci DBG (DBG_proc, ">> vpd_identifier_00H\n"); 793141cc406Sopenharmony_ci 794141cc406Sopenharmony_ci cmd[0] = HS2P_SCSI_REQUEST_SENSE; 795141cc406Sopenharmony_ci memset (cmd, 0, sizeof (cmd)); 796141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), 0, 0); 797141cc406Sopenharmony_ci 798141cc406Sopenharmony_ci DBG (DBG_proc, "<< vpd_identifier_00H\n"); 799141cc406Sopenharmony_ci return (status); 800141cc406Sopenharmony_ci} 801141cc406Sopenharmony_ci#endif 802141cc406Sopenharmony_ci 803141cc406Sopenharmony_ci#if 0 804141cc406Sopenharmony_cistatic SANE_Status 805141cc406Sopenharmony_civpd_identifier_C0H (int fd) 806141cc406Sopenharmony_ci{ 807141cc406Sopenharmony_ci static SANE_Byte cmd[6]; 808141cc406Sopenharmony_ci SANE_Status status; 809141cc406Sopenharmony_ci DBG (DBG_proc, ">> vpd_identifier_C0H\n"); 810141cc406Sopenharmony_ci 811141cc406Sopenharmony_ci cmd[0] = HS2P_SCSI_REQUEST_SENSE; 812141cc406Sopenharmony_ci memset (cmd, 0, sizeof (cmd)); 813141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), 0, 0); 814141cc406Sopenharmony_ci 815141cc406Sopenharmony_ci DBG (DBG_proc, "<< vpd_identifier_C0H\n"); 816141cc406Sopenharmony_ci return (status); 817141cc406Sopenharmony_ci} 818141cc406Sopenharmony_ci#endif 819141cc406Sopenharmony_ci 820141cc406Sopenharmony_ci/* 1-3-3 INQUIRY : 6 bytes: 821141cc406Sopenharmony_ci * Byte0 => 0x12 822141cc406Sopenharmony_ci * Byte1 => bits7-5: Logical Unit number 823141cc406Sopenharmony_ci * bits4-1: Reserved 824141cc406Sopenharmony_ci * bit0: EVPD 825141cc406Sopenharmony_ci * Byte2 => Page Code 826141cc406Sopenharmony_ci * Byte3 => Reserved 827141cc406Sopenharmony_ci * Byte4 => Allocation Length 828141cc406Sopenharmony_ci * Byte5 => bits7-6: Vendor Unique 829141cc406Sopenharmony_ci * bits5-2: Reserved 830141cc406Sopenharmony_ci * bit1: Flag 831141cc406Sopenharmony_ci * bit0: Link 832141cc406Sopenharmony_ci*/ 833141cc406Sopenharmony_cistatic SANE_Status 834141cc406Sopenharmony_ciinquiry (int fd, void *buf, size_t * buf_size, SANE_Byte evpd, 835141cc406Sopenharmony_ci SANE_Byte page_code) 836141cc406Sopenharmony_ci{ 837141cc406Sopenharmony_ci static SANE_Byte cmd[6]; 838141cc406Sopenharmony_ci SANE_Status status; 839141cc406Sopenharmony_ci DBG (DBG_proc, ">> inquiry\n"); 840141cc406Sopenharmony_ci 841141cc406Sopenharmony_ci memset (cmd, 0, sizeof (cmd)); 842141cc406Sopenharmony_ci cmd[0] = HS2P_SCSI_INQUIRY; 843141cc406Sopenharmony_ci cmd[1] = evpd; 844141cc406Sopenharmony_ci cmd[2] = page_code; 845141cc406Sopenharmony_ci/*cmd[3] Reserved */ 846141cc406Sopenharmony_ci cmd[4] = *buf_size; 847141cc406Sopenharmony_ci/*cmd[5] vendorunique+reserved+flag+link */ 848141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), buf, buf_size); 849141cc406Sopenharmony_ci 850141cc406Sopenharmony_ci DBG (DBG_proc, "<< inquiry\n"); 851141cc406Sopenharmony_ci return (status); 852141cc406Sopenharmony_ci} 853141cc406Sopenharmony_ci 854141cc406Sopenharmony_ci/* 1-3-6 MODE SELECT -- sets various operation mode parameters for scanner */ 855141cc406Sopenharmony_cistatic SANE_Status 856141cc406Sopenharmony_cimode_select (int fd, MP * settings) 857141cc406Sopenharmony_ci{ 858141cc406Sopenharmony_ci static struct 859141cc406Sopenharmony_ci { 860141cc406Sopenharmony_ci SELECT cmd; /* Mode page Select command */ 861141cc406Sopenharmony_ci MP mp; /* Hdr + Parameters */ 862141cc406Sopenharmony_ci } msc; /* Mode Select Command */ 863141cc406Sopenharmony_ci SANE_Status status; 864141cc406Sopenharmony_ci size_t npages; 865141cc406Sopenharmony_ci 866141cc406Sopenharmony_ci DBG (DBG_proc, ">> mode_select\n"); 867141cc406Sopenharmony_ci 868141cc406Sopenharmony_ci memset (&msc, 0, sizeof (msc)); /* Fill struct with zeros */ 869141cc406Sopenharmony_ci msc.cmd.opcode = HS2P_SCSI_MODE_SELECT; /* choose Mode Select Command */ 870141cc406Sopenharmony_ci msc.cmd.byte1 &= ~SMS_SP; /* unset bit0 SavePage to 0 */ 871141cc406Sopenharmony_ci msc.cmd.byte1 |= SMS_PF; /* set bit4 PageFormat to 1 */ 872141cc406Sopenharmony_ci npages = (settings->page.code == 2) ? 16 : 8; 873141cc406Sopenharmony_ci msc.cmd.len = sizeof (msc.mp.hdr) + npages; /* either 4+8 or 4+20 */ 874141cc406Sopenharmony_ci 875141cc406Sopenharmony_ci memcpy (&msc.mp, settings, msc.cmd.len); /* Copy hdr+pages from Settings to msc.mp */ 876141cc406Sopenharmony_ci memset (&msc.mp.hdr, 0, sizeof (msc.mp.hdr)); /* make sure the hdr is all zeros */ 877141cc406Sopenharmony_ci /* 878141cc406Sopenharmony_ci msc.hdr.data_len = 0x00; 879141cc406Sopenharmony_ci msc.hdr.medium_type = 0x00; 880141cc406Sopenharmony_ci msc.hdr.dev_spec = 0x00; 881141cc406Sopenharmony_ci msc.hdr.blk_desc_len = 0x00; 882141cc406Sopenharmony_ci */ 883141cc406Sopenharmony_ci 884141cc406Sopenharmony_ci /* Now execute the whole command */ 885141cc406Sopenharmony_ci if ((status = 886141cc406Sopenharmony_ci sanei_scsi_cmd (fd, &msc, sizeof (msc.cmd) + msc.cmd.len, 0, 887141cc406Sopenharmony_ci 0)) != SANE_STATUS_GOOD) 888141cc406Sopenharmony_ci { 889141cc406Sopenharmony_ci DBG (DBG_error, "ERROR: mode_select: %s\n", sane_strstatus (status)); 890141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING CMD BLOCK:\n"); 891141cc406Sopenharmony_ci print_bytes (&msc.cmd, sizeof (msc.cmd)); 892141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING MP HEADER:\n"); 893141cc406Sopenharmony_ci print_bytes (&msc.mp.hdr, sizeof (msc.mp.hdr)); 894141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING MP PAGES:\n"); 895141cc406Sopenharmony_ci print_bytes (&msc.mp.page, msc.cmd.len); 896141cc406Sopenharmony_ci } 897141cc406Sopenharmony_ci 898141cc406Sopenharmony_ci DBG (DBG_proc, "<< mode_select\n"); 899141cc406Sopenharmony_ci return (status); 900141cc406Sopenharmony_ci} 901141cc406Sopenharmony_ci 902141cc406Sopenharmony_ci/* 1-3-7 MODE SENSE -- gets various operation mode parameters from scanner */ 903141cc406Sopenharmony_cistatic SANE_Status 904141cc406Sopenharmony_cimode_sense (int fd, MP * buf, SANE_Byte page_code) 905141cc406Sopenharmony_ci{ 906141cc406Sopenharmony_ci SANE_Status status; 907141cc406Sopenharmony_ci SENSE cmd; /* 6byte cmd */ 908141cc406Sopenharmony_ci MP msp; /* Mode Sense Page 909141cc406Sopenharmony_ci * 4byte hdr + {2bytes +14 bytes} 910141cc406Sopenharmony_ci * buffer to hold mode sense data gotten from scanner */ 911141cc406Sopenharmony_ci 912141cc406Sopenharmony_ci size_t nbytes; 913141cc406Sopenharmony_ci 914141cc406Sopenharmony_ci DBG (DBG_proc, ">>>>> mode_sense: fd=%d, page_code=%#02x\n", fd, page_code); 915141cc406Sopenharmony_ci nbytes = sizeof (msp); 916141cc406Sopenharmony_ci 917141cc406Sopenharmony_ci DBG (DBG_info, 918141cc406Sopenharmony_ci ">>>>> mode_sense: Zero'ing ModeSenseCommand msc and msp structures\n"); 919141cc406Sopenharmony_ci 920141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); /* Fill cmd struct with zeros */ 921141cc406Sopenharmony_ci memset (&msp, 0, sizeof (msp)); /* Fill msp struct with zeros */ 922141cc406Sopenharmony_ci 923141cc406Sopenharmony_ci /* set up Mode Sense Command */ 924141cc406Sopenharmony_ci DBG (DBG_info, ">>>>> mode_sense: Initializing Mode Sense cmd\n"); 925141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_MODE_SENSE; 926141cc406Sopenharmony_ci cmd.dbd &= ~(1 << 3); /* Disable Block Description (bit3) is set to 0 */ 927141cc406Sopenharmony_ci cmd.pc = (page_code & 0x3F); /* bits 5-0 */ 928141cc406Sopenharmony_ci cmd.pc &= ~(0x03 << 6); /* unset PC Field (bits7-6) 929141cc406Sopenharmony_ci * 00 Current Value is the only effective value 930141cc406Sopenharmony_ci * 01 Changeable Value 931141cc406Sopenharmony_ci * 10 Default Value 932141cc406Sopenharmony_ci * 11 Saved Value */ 933141cc406Sopenharmony_ci /* cmd.len = ??? Allocation Length */ 934141cc406Sopenharmony_ci 935141cc406Sopenharmony_ci /* Now execute the whole command and store results in msc */ 936141cc406Sopenharmony_ci DBG (DBG_info, ">>>>> mode_sense: sanei_scsi_cmd\n"); 937141cc406Sopenharmony_ci DBG (DBG_info, ">>>>> cmd.opcode=%#0x cmd.dbd=%#02x, cmd.pc=%#02x\n", 938141cc406Sopenharmony_ci cmd.opcode, cmd.dbd, cmd.pc); 939141cc406Sopenharmony_ci 940141cc406Sopenharmony_ci nbytes = (page_code == 2) ? 20 : 12; 941141cc406Sopenharmony_ci DBG (DBG_info, 942141cc406Sopenharmony_ci ">>>>> sizeof(cmd)=%lu sizeof(msp)=%lu sizeof(hdr)=%lu sizeof(page)=%lu requesting %lu bytes\n", 943141cc406Sopenharmony_ci (u_long) sizeof (cmd), (u_long) sizeof (msp), 944141cc406Sopenharmony_ci (u_long) sizeof (msp.hdr), (u_long) sizeof (msp.page), 945141cc406Sopenharmony_ci (u_long) nbytes); 946141cc406Sopenharmony_ci 947141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), &msp, &nbytes); 948141cc406Sopenharmony_ci 949141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 950141cc406Sopenharmony_ci { 951141cc406Sopenharmony_ci DBG (DBG_error, "ERROR mode_sense: sanei_scsi_cmd error \"%s\"\n", 952141cc406Sopenharmony_ci sane_strstatus (status)); 953141cc406Sopenharmony_ci DBG (DBG_error, 954141cc406Sopenharmony_ci ">>>>> mode sense: number of bytes received from scanner: %lu\n", 955141cc406Sopenharmony_ci (u_long) nbytes); 956141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING CMD BLOCK:\n"); 957141cc406Sopenharmony_ci print_bytes (&cmd, sizeof (cmd)); 958141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING MP HEADER:\n"); 959141cc406Sopenharmony_ci print_bytes (&msp.hdr, sizeof (msp.hdr)); 960141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING MP PAGES:\n"); 961141cc406Sopenharmony_ci print_bytes (&msp.page, sizeof (msp.page)); 962141cc406Sopenharmony_ci } 963141cc406Sopenharmony_ci else 964141cc406Sopenharmony_ci { 965141cc406Sopenharmony_ci /* nbytes = (page_code==2)? 14 : 6; */ 966141cc406Sopenharmony_ci DBG (DBG_info, ">> >> got %lu bytes from scanner\n", (u_long) nbytes); 967141cc406Sopenharmony_ci nbytes -= 4; /* we won't copy 4 byte hdr */ 968141cc406Sopenharmony_ci DBG (DBG_info, ">>>>> copying from msp to calling function's buf\n" 969141cc406Sopenharmony_ci ">>>>> msp.page_size=%lu bytes=%lu buf_size=%lu\n", 970141cc406Sopenharmony_ci (u_long) sizeof (msp.page), (u_long) nbytes, 971141cc406Sopenharmony_ci (u_long) sizeof (*buf)); 972141cc406Sopenharmony_ci memcpy (buf, &(msp.page), nbytes); 973141cc406Sopenharmony_ci } 974141cc406Sopenharmony_ci 975141cc406Sopenharmony_ci DBG (DBG_proc, "<<<<< mode_sense\n"); 976141cc406Sopenharmony_ci return (status); 977141cc406Sopenharmony_ci} 978141cc406Sopenharmony_ci 979141cc406Sopenharmony_cistatic SANE_Status 980141cc406Sopenharmony_ciset_window (int fd, SWD * swd) 981141cc406Sopenharmony_ci{ 982141cc406Sopenharmony_ci static struct 983141cc406Sopenharmony_ci { 984141cc406Sopenharmony_ci struct set_window_cmd cmd; 985141cc406Sopenharmony_ci struct set_window_data swd; 986141cc406Sopenharmony_ci } win; 987141cc406Sopenharmony_ci SANE_Status status; 988141cc406Sopenharmony_ci static size_t wdl, tl; /*window descriptor length, transfer length */ 989141cc406Sopenharmony_ci DBG (DBG_proc, ">> set_window\n"); 990141cc406Sopenharmony_ci 991141cc406Sopenharmony_ci /* initialize our struct with zeros */ 992141cc406Sopenharmony_ci memset (&win, 0, sizeof (win)); 993141cc406Sopenharmony_ci 994141cc406Sopenharmony_ci /* fill in struct with opcode */ 995141cc406Sopenharmony_ci win.cmd.opcode = HS2P_SCSI_SET_WINDOW; 996141cc406Sopenharmony_ci 997141cc406Sopenharmony_ci /* bytes 1-5 are reserved */ 998141cc406Sopenharmony_ci 999141cc406Sopenharmony_ci /* Transfer length is header + window data */ 1000141cc406Sopenharmony_ci tl = sizeof (*swd); 1001141cc406Sopenharmony_ci _lto3b (tl, &win.cmd.len[0]); /* 8 + (2*320) = 648 */ 1002141cc406Sopenharmony_ci DBG (DBG_info, 1003141cc406Sopenharmony_ci "set_window: SET WINDOW COMMAND Transfer Length = %lu (should be 648)\n", 1004141cc406Sopenharmony_ci (unsigned long) tl); 1005141cc406Sopenharmony_ci 1006141cc406Sopenharmony_ci /* Copy data from swd (including 8-byte header) to win.swd */ 1007141cc406Sopenharmony_ci DBG (DBG_info, 1008141cc406Sopenharmony_ci "set_window: COPYING %lu bytes from settings to Set Window Command (%lu)\n", 1009141cc406Sopenharmony_ci (u_long) sizeof (*swd), (u_long) sizeof (win.swd)); 1010141cc406Sopenharmony_ci if (!memcpy (&(win.swd), swd, sizeof (*swd))) 1011141cc406Sopenharmony_ci { 1012141cc406Sopenharmony_ci DBG (DBG_error, "set_window: error with memcpy\n"); 1013141cc406Sopenharmony_ci } 1014141cc406Sopenharmony_ci 1015141cc406Sopenharmony_ci /* Set Window Data Header: 0-5:reserved; 6-7:Window Descriptor Length=640 */ 1016141cc406Sopenharmony_ci wdl = sizeof (win.swd) - sizeof (win.swd.hdr); 1017141cc406Sopenharmony_ci _lto2b (wdl, &win.swd.hdr.len[0]); 1018141cc406Sopenharmony_ci DBG (DBG_info, 1019141cc406Sopenharmony_ci "set_window: SET WINDOW COMMAND Window Descriptor Length = %lu (should be 640)\n", 1020141cc406Sopenharmony_ci (unsigned long) wdl); 1021141cc406Sopenharmony_ci 1022141cc406Sopenharmony_ci /* Now execute command */ 1023141cc406Sopenharmony_ci DBG (DBG_info, 1024141cc406Sopenharmony_ci "set_window: calling sanei_scsi_cmd(%d,&win,%lu, NULL, NULL)\n", fd, 1025141cc406Sopenharmony_ci (u_long) sizeof (win)); 1026141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &win, sizeof (win), NULL, NULL); 1027141cc406Sopenharmony_ci /* 1028141cc406Sopenharmony_ci status = sanei_scsi_cmd2 (fd, &win.cmd, sizeof(win.cmd), &win.swd, sizeof(win.swd), NULL, NULL); 1029141cc406Sopenharmony_ci */ 1030141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1031141cc406Sopenharmony_ci { 1032141cc406Sopenharmony_ci DBG (DBG_error, "*********************\n"); 1033141cc406Sopenharmony_ci DBG (DBG_error, "ERROR: set_window: %s\n", sane_strstatus (status)); 1034141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING SWD CMD BLK:\n"); 1035141cc406Sopenharmony_ci print_bytes (&win.cmd, sizeof (win.cmd)); 1036141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING SWD HEADER:\n"); 1037141cc406Sopenharmony_ci print_bytes (&win.swd.hdr, sizeof (win.swd.hdr)); 1038141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING SWD DATA[0]:\n"); 1039141cc406Sopenharmony_ci print_bytes (&win.swd.data[0], sizeof (win.swd.data[0])); 1040141cc406Sopenharmony_ci DBG (DBG_error, "PRINTING SWD DATA[1]:\n"); 1041141cc406Sopenharmony_ci print_bytes (&win.swd.data[1], sizeof (win.swd.data[1])); 1042141cc406Sopenharmony_ci DBG (DBG_error, "*********************\n"); 1043141cc406Sopenharmony_ci } 1044141cc406Sopenharmony_ci 1045141cc406Sopenharmony_ci DBG (DBG_proc, "<< set_window\n"); 1046141cc406Sopenharmony_ci return (status); 1047141cc406Sopenharmony_ci} 1048141cc406Sopenharmony_ci 1049141cc406Sopenharmony_cistatic SANE_Status 1050141cc406Sopenharmony_ciget_window (int fd, GWD * gwd) 1051141cc406Sopenharmony_ci{ 1052141cc406Sopenharmony_ci struct get_window_cmd cmd; 1053141cc406Sopenharmony_ci SANE_Status status; 1054141cc406Sopenharmony_ci static size_t gwd_size; 1055141cc406Sopenharmony_ci 1056141cc406Sopenharmony_ci DBG (DBG_proc, ">> get_window\n"); 1057141cc406Sopenharmony_ci 1058141cc406Sopenharmony_ci gwd_size = sizeof (*gwd); 1059141cc406Sopenharmony_ci DBG (DBG_info, ">> get_window datalen = %lu\n", (unsigned long) gwd_size); 1060141cc406Sopenharmony_ci 1061141cc406Sopenharmony_ci /* fill in get_window_cmd */ 1062141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); /* CLEAR cmd */ 1063141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_GET_WINDOW; 1064141cc406Sopenharmony_ci cmd.byte1 &= ~0x01; /* unset single bit 0 */ 1065141cc406Sopenharmony_ci cmd.win_id = 0x00; /* either 0 or 1 */ 1066141cc406Sopenharmony_ci _lto3b (gwd_size, cmd.len); /* Transfer Length is byte length of DATA to be returned */ 1067141cc406Sopenharmony_ci 1068141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), gwd, &gwd_size); 1069141cc406Sopenharmony_ci 1070141cc406Sopenharmony_ci DBG (DBG_proc, "<< get_window, datalen = %lu\n", (unsigned long) gwd_size); 1071141cc406Sopenharmony_ci return (status); 1072141cc406Sopenharmony_ci} 1073141cc406Sopenharmony_cistatic void 1074141cc406Sopenharmony_ciprint_window_data (SWD * buf) 1075141cc406Sopenharmony_ci{ 1076141cc406Sopenharmony_ci int i, j, k; 1077141cc406Sopenharmony_ci struct hs2p_window_data *data; 1078141cc406Sopenharmony_ci struct window_section *ws; 1079141cc406Sopenharmony_ci 1080141cc406Sopenharmony_ci DBG (DBG_proc, ">> print_window_data\n"); 1081141cc406Sopenharmony_ci DBG (DBG_info, "HEADER\n"); 1082141cc406Sopenharmony_ci for (i = 0; i < 6; i++) 1083141cc406Sopenharmony_ci DBG (DBG_info, "%#02x\n", buf->hdr.reserved[i]); 1084141cc406Sopenharmony_ci DBG (DBG_info, "Window Descriptor Length=%lu\n\n", _2btol (buf->hdr.len)); 1085141cc406Sopenharmony_ci 1086141cc406Sopenharmony_ci for (i = 0; i < 2; i++) 1087141cc406Sopenharmony_ci { 1088141cc406Sopenharmony_ci data = &buf->data[i]; 1089141cc406Sopenharmony_ci DBG (DBG_info, "Window Identifier = %d\n", data->window_id); 1090141cc406Sopenharmony_ci DBG (DBG_info, "AutoBit = %#x\n", data->auto_bit); 1091141cc406Sopenharmony_ci DBG (DBG_info, "X-Axis Resolution = %lu\n", _2btol (data->xres)); 1092141cc406Sopenharmony_ci DBG (DBG_info, "Y-Axis Resolution = %lu\n", _2btol (data->yres)); 1093141cc406Sopenharmony_ci DBG (DBG_info, "X-Axis Upper Left = %lu\n", _4btol (data->ulx)); 1094141cc406Sopenharmony_ci DBG (DBG_info, "Y-Axis Upper Left = %lu\n", _4btol (data->uly)); 1095141cc406Sopenharmony_ci DBG (DBG_info, "Window Width = %lu\n", _4btol (data->width)); 1096141cc406Sopenharmony_ci DBG (DBG_info, "Window Length = %lu\n", _4btol (data->length)); 1097141cc406Sopenharmony_ci DBG (DBG_info, "Brightness = %d\n", data->brightness); 1098141cc406Sopenharmony_ci DBG (DBG_info, "Threshold = %d\n", data->threshold); 1099141cc406Sopenharmony_ci DBG (DBG_info, "Contrast = %d\n", data->contrast); 1100141cc406Sopenharmony_ci DBG (DBG_info, "Image Composition = %#0x\n", data->image_composition); 1101141cc406Sopenharmony_ci DBG (DBG_info, "Bits per Pixel = %d\n", data->bpp); 1102141cc406Sopenharmony_ci DBG (DBG_info, "Halftone Code = %#0x\n", data->halftone_code); 1103141cc406Sopenharmony_ci DBG (DBG_info, "Halftone Id = %#0x\n", data->halftone_id); 1104141cc406Sopenharmony_ci DBG (DBG_info, "Byte29 = %#0x RIF=%d PaddingType=%d\n", data->byte29, 1105141cc406Sopenharmony_ci data->byte29 & 0x80, data->byte29 & 0x7); 1106141cc406Sopenharmony_ci DBG (DBG_info, "Bit Ordering = %lu\n", _2btol (data->bit_ordering)); 1107141cc406Sopenharmony_ci DBG (DBG_info, "Compression Type = %#x\n", data->compression_type); 1108141cc406Sopenharmony_ci DBG (DBG_info, "Compression Arg = %#x\n", data->compression_arg); 1109141cc406Sopenharmony_ci for (j = 0; j < 6; j++) 1110141cc406Sopenharmony_ci DBG (DBG_info, "Reserved=%#x\n", data->reserved2[j]); 1111141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored1); 1112141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored2); 1113141cc406Sopenharmony_ci DBG (DBG_info, "Byte42 = %#x MRIF=%d Filtering=%d GammaID=%d\n", 1114141cc406Sopenharmony_ci data->byte42, data->byte42 & 0x80, data->byte42 & 0x70, 1115141cc406Sopenharmony_ci data->byte42 & 0x0F); 1116141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored3); 1117141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored4); 1118141cc406Sopenharmony_ci DBG (DBG_info, "Binary Filtering = %#x\n", data->binary_filtering); 1119141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored5); 1120141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored6); 1121141cc406Sopenharmony_ci DBG (DBG_info, "Automatic Separation = %#x\n", 1122141cc406Sopenharmony_ci data->automatic_separation); 1123141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored7); 1124141cc406Sopenharmony_ci DBG (DBG_info, "Automatic Binarization = %#x\n", 1125141cc406Sopenharmony_ci data->automatic_binarization); 1126141cc406Sopenharmony_ci for (j = 0; j < 13; j++) 1127141cc406Sopenharmony_ci DBG (DBG_info, "Ignored = %#x\n", data->ignored8[j]); 1128141cc406Sopenharmony_ci 1129141cc406Sopenharmony_ci for (k = 0; k < 8; k++) 1130141cc406Sopenharmony_ci { 1131141cc406Sopenharmony_ci ws = &data->sec[k]; 1132141cc406Sopenharmony_ci DBG (DBG_info, "\n\n"); 1133141cc406Sopenharmony_ci DBG (DBG_info, "SECTION %d\n", k); 1134141cc406Sopenharmony_ci DBG (DBG_info, "Section Enable Flat (sef bit) = %#x\n", ws->sef); 1135141cc406Sopenharmony_ci DBG (DBG_info, "ignored = %d\n", ws->ignored0); 1136141cc406Sopenharmony_ci DBG (DBG_info, "Upper Left X = %lu\n", _4btol (ws->ulx)); 1137141cc406Sopenharmony_ci DBG (DBG_info, "Upper Left Y = %lu\n", _4btol (ws->uly)); 1138141cc406Sopenharmony_ci DBG (DBG_info, "Width = %lu\n", _4btol (ws->width)); 1139141cc406Sopenharmony_ci DBG (DBG_info, "Length = %lu\n", _4btol (ws->length)); 1140141cc406Sopenharmony_ci DBG (DBG_info, "Binary Filtering = %#x\n", ws->binary_filtering); 1141141cc406Sopenharmony_ci DBG (DBG_info, "ignored = %d\n", ws->ignored1); 1142141cc406Sopenharmony_ci DBG (DBG_info, "Threshold = %#x\n", ws->threshold); 1143141cc406Sopenharmony_ci DBG (DBG_info, "ignored = %d\n", ws->ignored2); 1144141cc406Sopenharmony_ci DBG (DBG_info, "Image Composition = %#x\n", ws->image_composition); 1145141cc406Sopenharmony_ci DBG (DBG_info, "Halftone Id = %#x\n", ws->halftone_id); 1146141cc406Sopenharmony_ci DBG (DBG_info, "Halftone Code = %#x\n", ws->halftone_code); 1147141cc406Sopenharmony_ci for (j = 0; j < 7; j++) 1148141cc406Sopenharmony_ci DBG (DBG_info, "ignored = %d\n", ws->ignored3[j]); 1149141cc406Sopenharmony_ci } 1150141cc406Sopenharmony_ci } 1151141cc406Sopenharmony_ci DBG (DBG_proc, "<< print_window_data\n"); 1152141cc406Sopenharmony_ci} 1153141cc406Sopenharmony_ci 1154141cc406Sopenharmony_cistatic SANE_Status 1155141cc406Sopenharmony_ciread_data (int fd, void *buf, size_t * buf_size, SANE_Byte dtc, u_long dtq) 1156141cc406Sopenharmony_ci{ 1157141cc406Sopenharmony_ci static struct scsi_rs_scanner_cmd cmd; 1158141cc406Sopenharmony_ci SANE_Status status; 1159141cc406Sopenharmony_ci DBG (DBG_proc, ">> read_data buf_size=%lu dtc=0x%2.2x dtq=%lu\n", 1160141cc406Sopenharmony_ci (unsigned long) *buf_size, (int) dtc, dtq); 1161141cc406Sopenharmony_ci if (fd < 0) 1162141cc406Sopenharmony_ci { 1163141cc406Sopenharmony_ci DBG (DBG_error, "read_data: scanner is closed!\n"); 1164141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1165141cc406Sopenharmony_ci } 1166141cc406Sopenharmony_ci 1167141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); /* CLEAR */ 1168141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_READ_DATA; 1169141cc406Sopenharmony_ci cmd.dtc = dtc; 1170141cc406Sopenharmony_ci _lto2b (dtq, cmd.dtq); 1171141cc406Sopenharmony_ci _lto3b (*buf_size, cmd.len); 1172141cc406Sopenharmony_ci 1173141cc406Sopenharmony_ci DBG (DBG_info, "read_data ready to send scsi cmd\n"); 1174141cc406Sopenharmony_ci DBG (DBG_info, "opcode=0x%2.2x, dtc=0x%2.2x, dtq=%lu, transfer len =%d\n", 1175141cc406Sopenharmony_ci cmd.opcode, cmd.dtc, _2btol (cmd.dtq), _3btol (cmd.len)); 1176141cc406Sopenharmony_ci 1177141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), buf, buf_size); 1178141cc406Sopenharmony_ci 1179141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1180141cc406Sopenharmony_ci DBG (DBG_error, "read_data: %s\n", sane_strstatus (status)); 1181141cc406Sopenharmony_ci DBG (DBG_proc, "<< read_data %lu\n", (unsigned long) *buf_size); 1182141cc406Sopenharmony_ci return (status); 1183141cc406Sopenharmony_ci} 1184141cc406Sopenharmony_ci 1185141cc406Sopenharmony_ci#if 0 1186141cc406Sopenharmony_cistatic SANE_Status 1187141cc406Sopenharmony_cisend_data (int fd, void *buf, size_t * buf_size) 1188141cc406Sopenharmony_ci{ 1189141cc406Sopenharmony_ci static struct scsi_rs_scanner_cmd cmd; 1190141cc406Sopenharmony_ci SANE_Status status; 1191141cc406Sopenharmony_ci DBG (DBG_proc, ">> send_data %lu\n", (unsigned long) *buf_size); 1192141cc406Sopenharmony_ci 1193141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); /* CLEAR */ 1194141cc406Sopenharmony_ci memcpy (&cmd, buf, sizeof (*buf)); /* Fill in our struct with set values */ 1195141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_SEND_DATA; 1196141cc406Sopenharmony_ci _lto3b (*buf_size, cmd.len); 1197141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), buf, buf_size); 1198141cc406Sopenharmony_ci 1199141cc406Sopenharmony_ci DBG (DBG_proc, "<< send_data %lu\n", (unsigned long) *buf_size); 1200141cc406Sopenharmony_ci return (status); 1201141cc406Sopenharmony_ci} 1202141cc406Sopenharmony_ci#endif 1203141cc406Sopenharmony_ci 1204141cc406Sopenharmony_cistatic SANE_Bool 1205141cc406Sopenharmony_ciis_valid_endorser_character (char c) 1206141cc406Sopenharmony_ci{ 1207141cc406Sopenharmony_ci int i = (int) c; 1208141cc406Sopenharmony_ci /* 44 characters can be printed by endorser */ 1209141cc406Sopenharmony_ci 1210141cc406Sopenharmony_ci if (i >= 0x30 && i <= 0x3A) 1211141cc406Sopenharmony_ci return SANE_TRUE; /* 0123456789: */ 1212141cc406Sopenharmony_ci if (i == 0x23) 1213141cc406Sopenharmony_ci return SANE_TRUE; /* # */ 1214141cc406Sopenharmony_ci if (i == 0x27) 1215141cc406Sopenharmony_ci return SANE_TRUE; /* ` */ 1216141cc406Sopenharmony_ci if (i >= 0x2C && i <= 0x2F) 1217141cc406Sopenharmony_ci return SANE_TRUE; /* '-./ */ 1218141cc406Sopenharmony_ci if (i == 0x20) 1219141cc406Sopenharmony_ci return SANE_TRUE; /* space */ 1220141cc406Sopenharmony_ci if (i >= 0x41 && i <= 0x5A) 1221141cc406Sopenharmony_ci return SANE_TRUE; /* ABCDEFGHIJKLMNOPQRSTUVWXYZ <spaces> */ 1222141cc406Sopenharmony_ci if (i >= 0x61 && i <= 0x7A) 1223141cc406Sopenharmony_ci return SANE_TRUE; /* abcdefghijklmnopqrstuvwxyz <spaces> */ 1224141cc406Sopenharmony_ci 1225141cc406Sopenharmony_ci return SANE_FALSE; 1226141cc406Sopenharmony_ci} 1227141cc406Sopenharmony_ci 1228141cc406Sopenharmony_cistatic SANE_Status 1229141cc406Sopenharmony_ciset_endorser_string (int fd, SANE_String s) 1230141cc406Sopenharmony_ci{ 1231141cc406Sopenharmony_ci struct 1232141cc406Sopenharmony_ci { 1233141cc406Sopenharmony_ci struct scsi_rs_scanner_cmd cmd; 1234141cc406Sopenharmony_ci SANE_Byte endorser[19]; 1235141cc406Sopenharmony_ci } out; 1236141cc406Sopenharmony_ci char *t; 1237141cc406Sopenharmony_ci int i, len; 1238141cc406Sopenharmony_ci 1239141cc406Sopenharmony_ci SANE_Status status; 1240141cc406Sopenharmony_ci DBG (DBG_proc, ">> set_endorser_string %s\n", s); 1241141cc406Sopenharmony_ci 1242141cc406Sopenharmony_ci for (i = 0, t = s; *t != '\0' && i < 19; i++) 1243141cc406Sopenharmony_ci { 1244141cc406Sopenharmony_ci DBG (DBG_info, "CHAR=%c\n", *t); 1245141cc406Sopenharmony_ci if (!is_valid_endorser_character (*t++)) 1246141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1247141cc406Sopenharmony_ci } 1248141cc406Sopenharmony_ci len = strlen (s); 1249141cc406Sopenharmony_ci 1250141cc406Sopenharmony_ci memset (&out, 0, sizeof (out)); /* CLEAR */ 1251141cc406Sopenharmony_ci out.cmd.opcode = HS2P_SCSI_SEND_DATA; /* 2AH */ 1252141cc406Sopenharmony_ci out.cmd.dtc = 0x80; /* Endorser Data */ 1253141cc406Sopenharmony_ci _lto3b (len, &out.cmd.len[0]); /* 19 bytes max */ 1254141cc406Sopenharmony_ci memset (&out.endorser[0], ' ', 19); /* fill with spaces */ 1255141cc406Sopenharmony_ci memcpy (&out.endorser[0], s, len); 1256141cc406Sopenharmony_ci 1257141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &out, sizeof (out), NULL, NULL); 1258141cc406Sopenharmony_ci 1259141cc406Sopenharmony_ci 1260141cc406Sopenharmony_ci DBG (DBG_proc, "<< set_endorser_string s=\"%s\" len=%d\n", s, len); 1261141cc406Sopenharmony_ci return (status); 1262141cc406Sopenharmony_ci} 1263141cc406Sopenharmony_ci 1264141cc406Sopenharmony_cistatic SANE_Status 1265141cc406Sopenharmony_cihs2p_send_gamma (HS2P_Scanner * s) 1266141cc406Sopenharmony_ci{ 1267141cc406Sopenharmony_ci SANE_Status status; 1268141cc406Sopenharmony_ci struct 1269141cc406Sopenharmony_ci { 1270141cc406Sopenharmony_ci struct scsi_rs_scanner_cmd cmd; 1271141cc406Sopenharmony_ci SANE_Byte gamma[2 + GAMMA_LENGTH]; 1272141cc406Sopenharmony_ci } out; 1273141cc406Sopenharmony_ci int i; 1274141cc406Sopenharmony_ci size_t len = sizeof (out.gamma); 1275141cc406Sopenharmony_ci 1276141cc406Sopenharmony_ci DBG (DBG_proc, ">> teco_send_gamma\n"); 1277141cc406Sopenharmony_ci 1278141cc406Sopenharmony_ci memset (&out, 0, sizeof (out)); /* CLEAR */ 1279141cc406Sopenharmony_ci out.cmd.opcode = HS2P_SCSI_SEND_DATA; /* 2AH */ 1280141cc406Sopenharmony_ci out.cmd.dtc = 0x03; /* Gamma Function Data */ 1281141cc406Sopenharmony_ci _lto3b (len, &out.cmd.len[0]); /* 19 bytes max */ 1282141cc406Sopenharmony_ci out.gamma[0] = 0x08; /* Gamma ID for Download table */ 1283141cc406Sopenharmony_ci out.gamma[1] = 0x08; /* The Number of gray scale (M) = 8 */ 1284141cc406Sopenharmony_ci for (i = 0; i < GAMMA_LENGTH; i++) 1285141cc406Sopenharmony_ci { 1286141cc406Sopenharmony_ci out.gamma[i + 2] = s->gamma_table[i]; 1287141cc406Sopenharmony_ci } 1288141cc406Sopenharmony_ci status = sanei_scsi_cmd (s->fd, &out, sizeof (out), NULL, NULL); 1289141cc406Sopenharmony_ci 1290141cc406Sopenharmony_ci DBG (DBG_proc, "<< teco_send_gamma\n"); 1291141cc406Sopenharmony_ci return (status); 1292141cc406Sopenharmony_ci} 1293141cc406Sopenharmony_ci 1294141cc406Sopenharmony_ci#if 0 1295141cc406Sopenharmony_cistatic SANE_Status 1296141cc406Sopenharmony_ciclear_maintenance_data (int fd, int code, char XorY, int number) 1297141cc406Sopenharmony_ci{ 1298141cc406Sopenharmony_ci struct 1299141cc406Sopenharmony_ci { 1300141cc406Sopenharmony_ci struct scsi_rs_scanner_cmd cmd; 1301141cc406Sopenharmony_ci char string[20]; 1302141cc406Sopenharmony_ci } out; 1303141cc406Sopenharmony_ci 1304141cc406Sopenharmony_ci SANE_Status status; 1305141cc406Sopenharmony_ci DBG (DBG_proc, ">> set_maintenance data\n"); 1306141cc406Sopenharmony_ci 1307141cc406Sopenharmony_ci memset (&out, 0, sizeof (out)); /* CLEAR */ 1308141cc406Sopenharmony_ci out.cmd.opcode = HS2P_SCSI_SEND_DATA; /* 2AH */ 1309141cc406Sopenharmony_ci out.cmd.dtc = 0x85; /* Maintenance Data */ 1310141cc406Sopenharmony_ci _lto3b (20, out.cmd.len); /* 20 bytes */ 1311141cc406Sopenharmony_ci switch (code) 1312141cc406Sopenharmony_ci { 1313141cc406Sopenharmony_ci case 1: 1314141cc406Sopenharmony_ci strcpy (out.string, "EEPROM ALL ALL RESET"); 1315141cc406Sopenharmony_ci break; 1316141cc406Sopenharmony_ci case 2: 1317141cc406Sopenharmony_ci strcpy (out.string, "EEPROM ALL RESET"); 1318141cc406Sopenharmony_ci break; 1319141cc406Sopenharmony_ci case 3: 1320141cc406Sopenharmony_ci strcpy (out.string, "ADF RESET"); 1321141cc406Sopenharmony_ci break; 1322141cc406Sopenharmony_ci case 4: 1323141cc406Sopenharmony_ci strcpy (out.string, "FLATBED RESET"); 1324141cc406Sopenharmony_ci break; 1325141cc406Sopenharmony_ci case 5: 1326141cc406Sopenharmony_ci strcpy (out.string, "LAMP RESET"); 1327141cc406Sopenharmony_ci break; 1328141cc406Sopenharmony_ci case 6: 1329141cc406Sopenharmony_ci sprintf (out.string, "EEPROM ADF %c %+4.1d", XorY, number); 1330141cc406Sopenharmony_ci break; 1331141cc406Sopenharmony_ci case 7: 1332141cc406Sopenharmony_ci sprintf (out.string, "EEPROM BOOK %c %4.1d", XorY, number); 1333141cc406Sopenharmony_ci break; 1334141cc406Sopenharmony_ci case 8: 1335141cc406Sopenharmony_ci sprintf (out.string, "WHITE ADJUST DATA %3d", number); 1336141cc406Sopenharmony_ci break; 1337141cc406Sopenharmony_ci case 9: 1338141cc406Sopenharmony_ci strcpy (out.string, "EEPROM FIRST WHITE ODD"); 1339141cc406Sopenharmony_ci break; 1340141cc406Sopenharmony_ci case 10: 1341141cc406Sopenharmony_ci strcpy (out.string, "EEPROM FIRST WHITE EVEN"); 1342141cc406Sopenharmony_ci break; 1343141cc406Sopenharmony_ci case 11: 1344141cc406Sopenharmony_ci strcpy (out.string, "R ADF RESET"); 1345141cc406Sopenharmony_ci break; 1346141cc406Sopenharmony_ci case 12: 1347141cc406Sopenharmony_ci strcpy (out.string, "R LAMP RESET"); 1348141cc406Sopenharmony_ci break; 1349141cc406Sopenharmony_ci case 13: 1350141cc406Sopenharmony_ci sprintf (out.string, "EEPROM R ADF %c %4.1d", XorY, number); 1351141cc406Sopenharmony_ci break; 1352141cc406Sopenharmony_ci case 14: 1353141cc406Sopenharmony_ci strcpy (out.string, "ENDORSER RESET"); 1354141cc406Sopenharmony_ci break; 1355141cc406Sopenharmony_ci } 1356141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &out, sizeof (out), NULL, NULL); 1357141cc406Sopenharmony_ci 1358141cc406Sopenharmony_ci DBG (DBG_proc, "<< set_maintenance data\n"); 1359141cc406Sopenharmony_ci return (status); 1360141cc406Sopenharmony_ci} 1361141cc406Sopenharmony_ci#endif 1362141cc406Sopenharmony_ci 1363141cc406Sopenharmony_ci#if 0 1364141cc406Sopenharmony_cistatic SANE_Status 1365141cc406Sopenharmony_ciread_halftone_mask (int fd, SANE_Byte halftone_id, void *buf, 1366141cc406Sopenharmony_ci size_t * buf_size) 1367141cc406Sopenharmony_ci{ 1368141cc406Sopenharmony_ci static struct scsi_rs_scanner_cmd cmd; 1369141cc406Sopenharmony_ci SANE_Status status; 1370141cc406Sopenharmony_ci SANE_Int len; 1371141cc406Sopenharmony_ci DBG (DBG_proc, ">> read_halftone_mask\n"); 1372141cc406Sopenharmony_ci 1373141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); /* CLEAR */ 1374141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_READ_DATA; 1375141cc406Sopenharmony_ci cmd.dtc = DATA_TYPE_HALFTONE; 1376141cc406Sopenharmony_ci _lto2b (halftone_id, cmd.dtq); 1377141cc406Sopenharmony_ci 1378141cc406Sopenharmony_ci /* Each cell of an NxM dither pattern is 1 byte from the set {2,3,4,6,8,16} */ 1379141cc406Sopenharmony_ci switch (halftone_id) 1380141cc406Sopenharmony_ci { 1381141cc406Sopenharmony_ci case 0x01: 1382141cc406Sopenharmony_ci len = 32; 1383141cc406Sopenharmony_ci break; /* 8x4, 45 degree */ 1384141cc406Sopenharmony_ci case 0x02: 1385141cc406Sopenharmony_ci len = 36; 1386141cc406Sopenharmony_ci break; /* 6x6, spiral */ 1387141cc406Sopenharmony_ci case 0x03: 1388141cc406Sopenharmony_ci len = 16; 1389141cc406Sopenharmony_ci break; /* 4x4, spiral */ 1390141cc406Sopenharmony_ci case 0x04: 1391141cc406Sopenharmony_ci len = 64; 1392141cc406Sopenharmony_ci break; /* 8x8, 90 degree */ 1393141cc406Sopenharmony_ci case 0x05: 1394141cc406Sopenharmony_ci len = 70; 1395141cc406Sopenharmony_ci break; /* 70 lines */ 1396141cc406Sopenharmony_ci case 0x06: 1397141cc406Sopenharmony_ci len = 95; 1398141cc406Sopenharmony_ci break; /* 95 lines */ 1399141cc406Sopenharmony_ci case 0x07: 1400141cc406Sopenharmony_ci len = 180; 1401141cc406Sopenharmony_ci break; /* 180 lines */ 1402141cc406Sopenharmony_ci case 0x08: 1403141cc406Sopenharmony_ci len = 128; 1404141cc406Sopenharmony_ci break; /* 16x8, 45 degree */ 1405141cc406Sopenharmony_ci case 0x09: 1406141cc406Sopenharmony_ci len = 256; 1407141cc406Sopenharmony_ci break; /* 16x16, 90 degree */ 1408141cc406Sopenharmony_ci case 0x0A: 1409141cc406Sopenharmony_ci len = 64; 1410141cc406Sopenharmony_ci break; /* 8x8, Bayer */ 1411141cc406Sopenharmony_ci default: 1412141cc406Sopenharmony_ci return SANE_STATUS_INVAL; /* Reserved */ 1413141cc406Sopenharmony_ci } 1414141cc406Sopenharmony_ci 1415141cc406Sopenharmony_ci _lto3b (len, cmd.len); 1416141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), buf, buf_size); 1417141cc406Sopenharmony_ci 1418141cc406Sopenharmony_ci DBG (DBG_proc, "<< read_halftone_mask\n"); 1419141cc406Sopenharmony_ci return (status); 1420141cc406Sopenharmony_ci} 1421141cc406Sopenharmony_ci#endif 1422141cc406Sopenharmony_ci 1423141cc406Sopenharmony_ci#if 0 1424141cc406Sopenharmony_cistatic SANE_Status 1425141cc406Sopenharmony_ciset_halftone_mask (int fd, SANE_Byte halftone_id, void *buf, 1426141cc406Sopenharmony_ci size_t * buf_size) 1427141cc406Sopenharmony_ci{ 1428141cc406Sopenharmony_ci static struct scsi_rs_scanner_cmd cmd; 1429141cc406Sopenharmony_ci SANE_Status status; 1430141cc406Sopenharmony_ci DBG (DBG_proc, ">> set_halftone_mask\n"); 1431141cc406Sopenharmony_ci 1432141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); /* CLEAR */ 1433141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_READ_DATA; 1434141cc406Sopenharmony_ci cmd.dtc = DATA_TYPE_HALFTONE; 1435141cc406Sopenharmony_ci _lto2b (halftone_id, cmd.dtq); 1436141cc406Sopenharmony_ci 1437141cc406Sopenharmony_ci /* Each cell of an NxM dither pattern is 1 byte from the set {2,3,4,6,8,16} 1438141cc406Sopenharmony_ci * 0x80, 0x81 are User definable custom dither patterns 1439141cc406Sopenharmony_ci */ 1440141cc406Sopenharmony_ci if (halftone_id != 0x80 && halftone_id != 0x81) 1441141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1442141cc406Sopenharmony_ci 1443141cc406Sopenharmony_ci _lto3b (*buf_size, cmd.len); 1444141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), buf, buf_size); 1445141cc406Sopenharmony_ci 1446141cc406Sopenharmony_ci DBG (DBG_proc, "<< set_halftone_mask\n"); 1447141cc406Sopenharmony_ci return (status); 1448141cc406Sopenharmony_ci} 1449141cc406Sopenharmony_ci#endif 1450141cc406Sopenharmony_ci 1451141cc406Sopenharmony_ci#if 0 1452141cc406Sopenharmony_cistatic SANE_Status 1453141cc406Sopenharmony_ciread_gamma_function (int fd) 1454141cc406Sopenharmony_ci{ 1455141cc406Sopenharmony_ci SANE_Status status = SANE_STATUS_GOOD; 1456141cc406Sopenharmony_ci return (status); 1457141cc406Sopenharmony_ci} 1458141cc406Sopenharmony_ci 1459141cc406Sopenharmony_cistatic SANE_Status 1460141cc406Sopenharmony_ciread_endorser_data (int fd) 1461141cc406Sopenharmony_ci{ 1462141cc406Sopenharmony_ci SANE_Status status = SANE_STATUS_GOOD; 1463141cc406Sopenharmony_ci return (status); 1464141cc406Sopenharmony_ci} 1465141cc406Sopenharmony_ci 1466141cc406Sopenharmony_cistatic SANE_Status 1467141cc406Sopenharmony_ciread_size_data (int fd) 1468141cc406Sopenharmony_ci{ 1469141cc406Sopenharmony_ci SANE_Status status = SANE_STATUS_GOOD; 1470141cc406Sopenharmony_ci return (status); 1471141cc406Sopenharmony_ci} 1472141cc406Sopenharmony_ci#endif 1473141cc406Sopenharmony_ci 1474141cc406Sopenharmony_ci#if 0 1475141cc406Sopenharmony_cistatic SANE_Status 1476141cc406Sopenharmony_ciread_maintenance_data (int fd) 1477141cc406Sopenharmony_ci{ 1478141cc406Sopenharmony_ci SANE_Status status = SANE_STATUS_GOOD; 1479141cc406Sopenharmony_ci return (status); 1480141cc406Sopenharmony_ci} 1481141cc406Sopenharmony_ci#endif 1482141cc406Sopenharmony_ci 1483141cc406Sopenharmony_ci/* Bit0: is 0 if document on ADF; else 1 1484141cc406Sopenharmony_ci * Bit1: is 0 if ADF cover is closed; else 1 1485141cc406Sopenharmony_ci * Bit2: reserved 1486141cc406Sopenharmony_ci * Bits7-3: reserved 1487141cc406Sopenharmony_ci*/ 1488141cc406Sopenharmony_ci 1489141cc406Sopenharmony_ci 1490141cc406Sopenharmony_ci#if 0 1491141cc406Sopenharmony_cistatic SANE_Status 1492141cc406Sopenharmony_ciread_adf_status (int fd, SANE_Byte * adf_status_byte) 1493141cc406Sopenharmony_ci{ 1494141cc406Sopenharmony_ci SANE_Status status = SANE_STATUS_GOOD; 1495141cc406Sopenharmony_ci struct scsi_rs_scanner_cmd cmd; 1496141cc406Sopenharmony_ci static size_t len = 1; 1497141cc406Sopenharmony_ci 1498141cc406Sopenharmony_ci DBG (DBG_proc, ">> read_adf_status\n"); 1499141cc406Sopenharmony_ci 1500141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); 1501141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_READ_DATA; 1502141cc406Sopenharmony_ci cmd.dtc = DATA_TYPE_ADF_STATUS; 1503141cc406Sopenharmony_ci _lto3b (0x01, cmd.len); /* convert 0x01 into 3-byte Transfer Length */ 1504141cc406Sopenharmony_ci if ((status = 1505141cc406Sopenharmony_ci sanei_scsi_cmd (fd, &cmd, sizeof (cmd), adf_status_byte, 1506141cc406Sopenharmony_ci &len)) != SANE_STATUS_GOOD) 1507141cc406Sopenharmony_ci { 1508141cc406Sopenharmony_ci DBG (DBG_error, "read_adf_status ERROR: %s\n", sane_strstatus (status)); 1509141cc406Sopenharmony_ci } 1510141cc406Sopenharmony_ci DBG (DBG_proc, "<< read_adf_status\n"); 1511141cc406Sopenharmony_ci return (status); 1512141cc406Sopenharmony_ci} 1513141cc406Sopenharmony_ci#endif 1514141cc406Sopenharmony_ci 1515141cc406Sopenharmony_ci/* 1516141cc406Sopenharmony_ci * read_ipu_photoletter_parameters 1517141cc406Sopenharmony_ci * read_ipu_threshold_parameters 1518141cc406Sopenharmony_ci * read_sensor_data (WHAT DATA TYPE CODE?) 1519141cc406Sopenharmony_ci*/ 1520141cc406Sopenharmony_ci/* SEND CMD */ 1521141cc406Sopenharmony_ci/* 1522141cc406Sopenharmony_ci * send_halftone_mask 1523141cc406Sopenharmony_ci * send_gamma_function 1524141cc406Sopenharmony_ci * send_endorser_data 1525141cc406Sopenharmony_ci * send_maintenance_data 1526141cc406Sopenharmony_ci * EPROM All Clear 1527141cc406Sopenharmony_ci * EPROM Counter Clear 1528141cc406Sopenharmony_ci * ADF Counter Clear 1529141cc406Sopenharmony_ci * Flatbed Counter Clear 1530141cc406Sopenharmony_ci * Lamp Counter Clear 1531141cc406Sopenharmony_ci * ADF Register Data 1532141cc406Sopenharmony_ci * Flatbed Register Data 1533141cc406Sopenharmony_ci * White Adjustment Data 1534141cc406Sopenharmony_ci * White level first Data (ODD) 1535141cc406Sopenharmony_ci * White level first Data (EVEN) 1536141cc406Sopenharmony_ci * Reverse side ADF Counter Clear 1537141cc406Sopenharmony_ci * Reverse side Lamp Counter Clear 1538141cc406Sopenharmony_ci * Reverse side ADF Register Data 1539141cc406Sopenharmony_ci * Endorser Character Counter Clear 1540141cc406Sopenharmony_ci * send_ipu_parameters 1541141cc406Sopenharmony_ci*/ 1542141cc406Sopenharmony_ci 1543141cc406Sopenharmony_ci/* OBJECT POSITION */ 1544141cc406Sopenharmony_ci/* GET DATA BUFFER STATUS */ 1545141cc406Sopenharmony_ci 1546141cc406Sopenharmony_ci/* 1-3-4 MODE SELECT */ 1547141cc406Sopenharmony_ci 1548141cc406Sopenharmony_ci/* 1-3-5 Reserve Unit: 0x16 1549141cc406Sopenharmony_ci * 1-3-6 Release Unit: 0x17 1550141cc406Sopenharmony_ci*/ 1551141cc406Sopenharmony_cistatic SANE_Status 1552141cc406Sopenharmony_ciunit_cmd (int fd, SANE_Byte opcode) 1553141cc406Sopenharmony_ci{ 1554141cc406Sopenharmony_ci static struct 1555141cc406Sopenharmony_ci { 1556141cc406Sopenharmony_ci SANE_Byte opcode; /* 16H: Reserve Unit 17H: Release Unit */ 1557141cc406Sopenharmony_ci SANE_Byte byte1; /* 7-5: LUN; 4: 3rd Party; 3-1: 3rd Party Device; 0: Reserved */ 1558141cc406Sopenharmony_ci SANE_Byte reserved[3]; 1559141cc406Sopenharmony_ci SANE_Byte control; /* 7-6: Vendor Unique; 5-2: Reserved; 1: Flag; 0: Link */ 1560141cc406Sopenharmony_ci } cmd; 1561141cc406Sopenharmony_ci 1562141cc406Sopenharmony_ci SANE_Byte LUN = (0x00 & 0x07) << 5; 1563141cc406Sopenharmony_ci SANE_Status status; 1564141cc406Sopenharmony_ci DBG (DBG_proc, ">> unit_cmd\n"); 1565141cc406Sopenharmony_ci 1566141cc406Sopenharmony_ci cmd.opcode = opcode; 1567141cc406Sopenharmony_ci cmd.byte1 = LUN & 0xE1; /* Mask=11100001 3rd Party and 3rd Party Device must be 0 */ 1568141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); 1569141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), 0, 0); 1570141cc406Sopenharmony_ci 1571141cc406Sopenharmony_ci DBG (DBG_proc, "<< unit_cmd\n"); 1572141cc406Sopenharmony_ci return (status); 1573141cc406Sopenharmony_ci 1574141cc406Sopenharmony_ci} 1575141cc406Sopenharmony_ci 1576141cc406Sopenharmony_ci/* The OBJECT POSITION command is used for carriage control or 1577141cc406Sopenharmony_ci * document feed and eject with ADF 1578141cc406Sopenharmony_ci * 1579141cc406Sopenharmony_ci * Position Function: Byte1 bits2-0 1580141cc406Sopenharmony_ci * 000 Unload instructs document eject 1581141cc406Sopenharmony_ci * 001 Load instructs document feed to scan start position 1582141cc406Sopenharmony_ci * 010 Absolute Positioning - instructs carriage to move to carriage lock position 1583141cc406Sopenharmony_ci * The carriage moves in the Y-axis direction as the amount set in Count when 1584141cc406Sopenharmony_ci * count>0 1585141cc406Sopenharmony_ci * (Not supported in IS420) 1586141cc406Sopenharmony_ci * 1587141cc406Sopenharmony_ci*/ 1588141cc406Sopenharmony_cistatic SANE_Status 1589141cc406Sopenharmony_ciobject_position (int fd, int load) 1590141cc406Sopenharmony_ci{ 1591141cc406Sopenharmony_ci static struct scsi_object_position_cmd cmd; 1592141cc406Sopenharmony_ci SANE_Status status; 1593141cc406Sopenharmony_ci DBG (DBG_proc, ">> object_position\n"); 1594141cc406Sopenharmony_ci 1595141cc406Sopenharmony_ci /* byte 0 opcode 1596141cc406Sopenharmony_ci * byte 1 position function 1597141cc406Sopenharmony_ci * bytes 2-4 reserved 1598141cc406Sopenharmony_ci * bytes 5-8 reserved 1599141cc406Sopenharmony_ci * byte 9 control 1600141cc406Sopenharmony_ci */ 1601141cc406Sopenharmony_ci 1602141cc406Sopenharmony_ci 1603141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); 1604141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_OBJECT_POSITION; 1605141cc406Sopenharmony_ci if (load) 1606141cc406Sopenharmony_ci cmd.position_func = OBJECT_POSITION_LOAD; 1607141cc406Sopenharmony_ci else 1608141cc406Sopenharmony_ci cmd.position_func = OBJECT_POSITION_UNLOAD; 1609141cc406Sopenharmony_ci 1610141cc406Sopenharmony_ci 1611141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), 0, 0); 1612141cc406Sopenharmony_ci 1613141cc406Sopenharmony_ci DBG (DBG_proc, "<< object_position\n"); 1614141cc406Sopenharmony_ci return (status); 1615141cc406Sopenharmony_ci} 1616141cc406Sopenharmony_ci 1617141cc406Sopenharmony_cistatic SANE_Status 1618141cc406Sopenharmony_ciget_data_status (int fd, STATUS_DATA * dbs) 1619141cc406Sopenharmony_ci{ 1620141cc406Sopenharmony_ci static GET_DBS_CMD cmd; 1621141cc406Sopenharmony_ci static STATUS_BUFFER buf; /* hdr + data */ 1622141cc406Sopenharmony_ci size_t bufsize = sizeof (buf); 1623141cc406Sopenharmony_ci SANE_Status status; 1624141cc406Sopenharmony_ci DBG (DBG_proc, ">> get_data_status %lu\n", (unsigned long) bufsize); 1625141cc406Sopenharmony_ci 1626141cc406Sopenharmony_ci /* Set up GET DATA BUFFER STATUS cmd */ 1627141cc406Sopenharmony_ci memset (&cmd, 0, sizeof (cmd)); /* CLEAR cmd */ 1628141cc406Sopenharmony_ci cmd.opcode = HS2P_SCSI_GET_BUFFER_STATUS; 1629141cc406Sopenharmony_ci cmd.wait &= ~0x01; /* unset Wait bit0 */ 1630141cc406Sopenharmony_ci _lto2b (bufsize, cmd.len); 1631141cc406Sopenharmony_ci 1632141cc406Sopenharmony_ci /* Now execute cmd, and put returned results in buf */ 1633141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), &buf, &bufsize); 1634141cc406Sopenharmony_ci 1635141cc406Sopenharmony_ci /* Now copy from buf.data to dbs */ 1636141cc406Sopenharmony_ci memcpy (dbs, &buf.data, sizeof (*dbs)); 1637141cc406Sopenharmony_ci 1638141cc406Sopenharmony_ci if (status == SANE_STATUS_GOOD && 1639141cc406Sopenharmony_ci ((unsigned int) _3btol (buf.hdr.len) <= sizeof (*dbs) 1640141cc406Sopenharmony_ci || _3btol (buf.data.filled) == 0)) 1641141cc406Sopenharmony_ci { 1642141cc406Sopenharmony_ci DBG (DBG_info, "get_data_status: busy\n"); 1643141cc406Sopenharmony_ci status = SANE_STATUS_DEVICE_BUSY; 1644141cc406Sopenharmony_ci } 1645141cc406Sopenharmony_ci DBG (DBG_proc, "<< get_data_status %lu\n", (unsigned long) bufsize); 1646141cc406Sopenharmony_ci return (status); 1647141cc406Sopenharmony_ci} 1648141cc406Sopenharmony_ci 1649141cc406Sopenharmony_ci/* 1-3-7 MODE SENSE */ 1650141cc406Sopenharmony_ci/* 1-3-8 SCAN */ 1651141cc406Sopenharmony_ci 1652141cc406Sopenharmony_ci/* 1-3-9 Receive Diagnostic 1653141cc406Sopenharmony_ci * Byte0: 1CH 1654141cc406Sopenharmony_ci * Byte1: 7-5 LUN; 4-0: reserved 1655141cc406Sopenharmony_ci * Byte2: Reserved 1656141cc406Sopenharmony_ci * Byte3-4: Allocation Length 1657141cc406Sopenharmony_ci * Byte5: 7-6: Vendor Unique; 5-2: Reserved; 1: Flag; 0: Link 1658141cc406Sopenharmony_ci * 1659141cc406Sopenharmony_ci * This command is treated as a dummy command 1660141cc406Sopenharmony_ci * Return GOOD unless there is an error in command in which case it returns CHECK 1661141cc406Sopenharmony_ci*/ 1662141cc406Sopenharmony_ci 1663141cc406Sopenharmony_ci/* 1664141cc406Sopenharmony_ci* The IS450 performs 7 self-diagnostics tests 1665141cc406Sopenharmony_ci* 1) Home position error check 1666141cc406Sopenharmony_ci* 2) Exposure lamp error check 1667141cc406Sopenharmony_ci* 3) White level error check 1668141cc406Sopenharmony_ci* 4) Document table error check 1669141cc406Sopenharmony_ci* 5) SCU error check 1670141cc406Sopenharmony_ci* 6) RCU error check 1671141cc406Sopenharmony_ci* 7) Memory error check 1672141cc406Sopenharmony_ci* 1673141cc406Sopenharmony_ci* and uses the lights on the scanner to indicate the result 1674141cc406Sopenharmony_ci* 1675141cc406Sopenharmony_ci* PowerOn MachineBusy DocumentInPlace Error 1676141cc406Sopenharmony_ci* (green) (green) (green) (red) 1677141cc406Sopenharmony_ci* 1678141cc406Sopenharmony_ci* SCU error check Blinking Blinking 1679141cc406Sopenharmony_ci* RCU error check Blinking On Blinking 1680141cc406Sopenharmony_ci* Home position error check Blinking Blinking Blinking On 1681141cc406Sopenharmony_ci* Exposure lamp error check Blinking Blinking On On 1682141cc406Sopenharmony_ci* White level error check Blinking Blinking 1683141cc406Sopenharmony_ci* Memory Error (Simplex) Blinking 1684141cc406Sopenharmony_ci* Memory Error (Duplex) Blinking 1685141cc406Sopenharmony_ci* 1686141cc406Sopenharmony_ci*/ 1687141cc406Sopenharmony_ci#if 0 1688141cc406Sopenharmony_cistatic SANE_Status 1689141cc406Sopenharmony_cireceive_diagnostic (int fd) 1690141cc406Sopenharmony_ci{ 1691141cc406Sopenharmony_ci static SANE_Byte cmd[6]; 1692141cc406Sopenharmony_ci SANE_Status status; 1693141cc406Sopenharmony_ci DBG (DBG_proc, ">> receive_diagnostic\n"); 1694141cc406Sopenharmony_ci 1695141cc406Sopenharmony_ci cmd[0] = HS2P_SCSI_RECEIVE_DIAGNOSTICS; 1696141cc406Sopenharmony_ci memset (cmd, 0, sizeof (cmd)); 1697141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), 0, 0); 1698141cc406Sopenharmony_ci 1699141cc406Sopenharmony_ci DBG (DBG_proc, "<< receive_diagnostic\n"); 1700141cc406Sopenharmony_ci return (status); 1701141cc406Sopenharmony_ci} 1702141cc406Sopenharmony_ci#endif 1703141cc406Sopenharmony_ci 1704141cc406Sopenharmony_ci/* 1-3-10 Send Diagnostic 1705141cc406Sopenharmony_ci * Byte0: 1DH 1706141cc406Sopenharmony_ci * Byte1: 7-5 LUN; 4: PF; 3: Reserved; 2: S-Test; 1: DevOfl; 0: U-Ofl 1707141cc406Sopenharmony_ci * Byte2: Reserved 1708141cc406Sopenharmony_ci * Byte3-4: Parameter List Length 1709141cc406Sopenharmony_ci * Byte5: 7-6: Vendor Unique; 5-2: Reserved; 1: Flag; 0: Link 1710141cc406Sopenharmony_ci * This command executes self-diagnostic and optical-adjustment 1711141cc406Sopenharmony_ci * PF, DevOfl, and Parameter List Length must be 0 or CHECK condition is returned. 1712141cc406Sopenharmony_ci*/ 1713141cc406Sopenharmony_ci#if 0 1714141cc406Sopenharmony_cistatic SANE_Status 1715141cc406Sopenharmony_cisend_diagnostic (int fd) 1716141cc406Sopenharmony_ci{ 1717141cc406Sopenharmony_ci static SANE_Byte cmd[6]; 1718141cc406Sopenharmony_ci SANE_Status status; 1719141cc406Sopenharmony_ci DBG (DBG_proc, ">> send_diagnostic\n"); 1720141cc406Sopenharmony_ci 1721141cc406Sopenharmony_ci cmd[0] = HS2P_SCSI_SEND_DIAGNOSTICS; 1722141cc406Sopenharmony_ci cmd[1] = 0x00 & (1 << 2) & 0xED; /* Set Self-Test bit and clear PF, DevOfl bits */ 1723141cc406Sopenharmony_ci cmd[3] = 0x00; 1724141cc406Sopenharmony_ci cmd[4] = 0x00; /* Parameter list (bytes3-4) must be 0x00 */ 1725141cc406Sopenharmony_ci memset (cmd, 0, sizeof (cmd)); 1726141cc406Sopenharmony_ci status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), 0, 0); 1727141cc406Sopenharmony_ci 1728141cc406Sopenharmony_ci DBG (DBG_proc, "<< send_diagnostic\n"); 1729141cc406Sopenharmony_ci return (status); 1730141cc406Sopenharmony_ci} 1731141cc406Sopenharmony_ci#endif 1732141cc406Sopenharmony_ci 1733141cc406Sopenharmony_ci 1734141cc406Sopenharmony_ci/* 1-3-8 SCAN command is used to instruct scanner to start scanning */ 1735141cc406Sopenharmony_cistatic SANE_Status 1736141cc406Sopenharmony_citrigger_scan (HS2P_Scanner * s) 1737141cc406Sopenharmony_ci{ 1738141cc406Sopenharmony_ci static struct 1739141cc406Sopenharmony_ci { 1740141cc406Sopenharmony_ci START_SCAN cmd; 1741141cc406Sopenharmony_ci SANE_Byte wid[2]; /* scanner supports up to 2 windows */ 1742141cc406Sopenharmony_ci } scan; 1743141cc406Sopenharmony_ci SANE_Status status; 1744141cc406Sopenharmony_ci DBG (DBG_proc, ">> trigger scan\n"); 1745141cc406Sopenharmony_ci 1746141cc406Sopenharmony_ci memset (&scan, 0, sizeof (scan)); /* CLEAR scan */ 1747141cc406Sopenharmony_ci scan.cmd.opcode = HS2P_SCSI_START_SCAN; 1748141cc406Sopenharmony_ci /* Transfer length is the byte length of Window List transferred 1749141cc406Sopenharmony_ci * Window List is a list of Window Identifier created by SET WINDOW command 1750141cc406Sopenharmony_ci * Since only 1 Window is supported by SCAN command, 0 or 1 is used for Window Identifier 1751141cc406Sopenharmony_ci * and 1 or 2 for length 1752141cc406Sopenharmony_ci status = sanei_scsi_cmd (s->fd, &trigger, sizeof (trigger), &window_id_list[0], &wl_size); 1753141cc406Sopenharmony_ci */ 1754141cc406Sopenharmony_ci scan.cmd.len = (s->val[OPT_DUPLEX].w == SANE_TRUE) ? 2 : 1; 1755141cc406Sopenharmony_ci 1756141cc406Sopenharmony_ci DBG (DBG_info, "trigger_scan: sending %d Window Id to scanner\n", 1757141cc406Sopenharmony_ci scan.cmd.len); 1758141cc406Sopenharmony_ci status = 1759141cc406Sopenharmony_ci sanei_scsi_cmd (s->fd, &scan, sizeof (scan.cmd) + scan.cmd.len, NULL, 1760141cc406Sopenharmony_ci NULL); 1761141cc406Sopenharmony_ci 1762141cc406Sopenharmony_ci DBG (DBG_proc, "<< trigger scan\n"); 1763141cc406Sopenharmony_ci return (status); 1764141cc406Sopenharmony_ci} 1765141cc406Sopenharmony_ci 1766141cc406Sopenharmony_ci#define MAX_WAITING_TIME 15 1767141cc406Sopenharmony_cistatic SANE_Status 1768141cc406Sopenharmony_cihs2p_wait_ready (HS2P_Scanner * s) 1769141cc406Sopenharmony_ci{ 1770141cc406Sopenharmony_ci STATUS_DATA dbs; /* Status Buffer Status DATA */ 1771141cc406Sopenharmony_ci time_t now, start; 1772141cc406Sopenharmony_ci SANE_Status status; 1773141cc406Sopenharmony_ci 1774141cc406Sopenharmony_ci start = time (NULL); 1775141cc406Sopenharmony_ci 1776141cc406Sopenharmony_ci while (1) 1777141cc406Sopenharmony_ci { 1778141cc406Sopenharmony_ci status = get_data_status (s->fd, &dbs); 1779141cc406Sopenharmony_ci 1780141cc406Sopenharmony_ci switch (status) 1781141cc406Sopenharmony_ci { 1782141cc406Sopenharmony_ci default: 1783141cc406Sopenharmony_ci /* Ignore errors while waiting for scanner to become ready. 1784141cc406Sopenharmony_ci Some SCSI drivers return EIO while the scanner is 1785141cc406Sopenharmony_ci returning to the home position. */ 1786141cc406Sopenharmony_ci DBG (DBG_error, "scsi_wait_ready: get datat status failed (%s)\n", 1787141cc406Sopenharmony_ci sane_strstatus (status)); 1788141cc406Sopenharmony_ci /* fall through */ 1789141cc406Sopenharmony_ci case SANE_STATUS_DEVICE_BUSY: 1790141cc406Sopenharmony_ci now = time (NULL); 1791141cc406Sopenharmony_ci if (now - start >= MAX_WAITING_TIME) 1792141cc406Sopenharmony_ci { 1793141cc406Sopenharmony_ci DBG (DBG_error, 1794141cc406Sopenharmony_ci "hs2p_wait_ready: timed out after %lu seconds\n", 1795141cc406Sopenharmony_ci (u_long) (now - start)); 1796141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1797141cc406Sopenharmony_ci } 1798141cc406Sopenharmony_ci break; 1799141cc406Sopenharmony_ci 1800141cc406Sopenharmony_ci case SANE_STATUS_GOOD: 1801141cc406Sopenharmony_ci DBG (DBG_proc, "hs2p_wait_ready: %d bytes ready\n", 1802141cc406Sopenharmony_ci _3btol (dbs.filled)); 1803141cc406Sopenharmony_ci return status; 1804141cc406Sopenharmony_ci break; 1805141cc406Sopenharmony_ci } 1806141cc406Sopenharmony_ci usleep (1000000); /* retry after 100ms */ 1807141cc406Sopenharmony_ci } 1808141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1809141cc406Sopenharmony_ci} 1810141cc406Sopenharmony_ci 1811141cc406Sopenharmony_ci 1812141cc406Sopenharmony_ci/* MODE PAGES GET/SET */ 1813141cc406Sopenharmony_cistatic SANE_Status 1814141cc406Sopenharmony_ciconnection_parameters (int fd, MP_CXN * settings, SANE_Bool flag) 1815141cc406Sopenharmony_ci{ 1816141cc406Sopenharmony_ci SANE_Status status; 1817141cc406Sopenharmony_ci MP_CXN buf; 1818141cc406Sopenharmony_ci size_t nbytes; 1819141cc406Sopenharmony_ci DBG (DBG_proc, ">> connection_parameters\n"); 1820141cc406Sopenharmony_ci nbytes = sizeof (buf); 1821141cc406Sopenharmony_ci 1822141cc406Sopenharmony_ci if (flag) 1823141cc406Sopenharmony_ci { /* GET */ 1824141cc406Sopenharmony_ci DBG (DBG_info, ">> GET connection_parameters >> calling mode_sense\n"); 1825141cc406Sopenharmony_ci status = 1826141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, (SANE_Byte) PAGE_CODE_CONNECTION); 1827141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1828141cc406Sopenharmony_ci { 1829141cc406Sopenharmony_ci DBG (DBG_error, 1830141cc406Sopenharmony_ci "get_connection_parameters: MODE_SELECT failed with status=%d\n", 1831141cc406Sopenharmony_ci status); 1832141cc406Sopenharmony_ci return (status); 1833141cc406Sopenharmony_ci } 1834141cc406Sopenharmony_ci memcpy (settings, &buf, nbytes); 1835141cc406Sopenharmony_ci } 1836141cc406Sopenharmony_ci else 1837141cc406Sopenharmony_ci { /* SET */ 1838141cc406Sopenharmony_ci DBG (DBG_info, ">> SET connection_parameters >> calling mode_select\n"); 1839141cc406Sopenharmony_ci /* Fill in struct then hand off to mode_select */ 1840141cc406Sopenharmony_ci memset (&buf, 0, sizeof (buf)); /* Fill struct with zeros */ 1841141cc406Sopenharmony_ci memcpy (&buf, settings, nbytes); 1842141cc406Sopenharmony_ci /* Make sure calling function didn't change these bytes */ 1843141cc406Sopenharmony_ci memset (&buf.hdr, 0, sizeof (buf.hdr)); /* Make sure 4bytes are 0 */ 1844141cc406Sopenharmony_ci buf.code = PAGE_CODE_CONNECTION; /* bits5-0: Page Code 02H */ 1845141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 1846141cc406Sopenharmony_ci buf.len = 0x0E; /* This is the only page with 14 bytes */ 1847141cc406Sopenharmony_ci 1848141cc406Sopenharmony_ci status = mode_select (fd, (MP *) & buf); 1849141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1850141cc406Sopenharmony_ci { 1851141cc406Sopenharmony_ci DBG (DBG_error, 1852141cc406Sopenharmony_ci "set_connection_parameters: MODE_SELECT failed with status=%d\n", 1853141cc406Sopenharmony_ci status); 1854141cc406Sopenharmony_ci return (-1); 1855141cc406Sopenharmony_ci } 1856141cc406Sopenharmony_ci } 1857141cc406Sopenharmony_ci DBG (DBG_proc, "<< connection_parameters\n"); 1858141cc406Sopenharmony_ci return (status); 1859141cc406Sopenharmony_ci} 1860141cc406Sopenharmony_ci 1861141cc406Sopenharmony_cistatic SANE_Status 1862141cc406Sopenharmony_ciget_basic_measurement_unit (int fd, SANE_Int * bmu, SANE_Int * mud) 1863141cc406Sopenharmony_ci{ 1864141cc406Sopenharmony_ci SANE_Status status; 1865141cc406Sopenharmony_ci MP_SMU buf; 1866141cc406Sopenharmony_ci 1867141cc406Sopenharmony_ci DBG (DBG_proc, ">> get_basic_measurement_unit: fd=\"%d\"\n", fd); 1868141cc406Sopenharmony_ci 1869141cc406Sopenharmony_ci status = 1870141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, 1871141cc406Sopenharmony_ci (SANE_Byte) PAGE_CODE_SCANNING_MEASUREMENTS); 1872141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1873141cc406Sopenharmony_ci { 1874141cc406Sopenharmony_ci DBG (DBG_error, 1875141cc406Sopenharmony_ci "set_basic_measurement_unit: MODE_SELECT failed with status=%d\n", 1876141cc406Sopenharmony_ci status); 1877141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 1878141cc406Sopenharmony_ci } 1879141cc406Sopenharmony_ci *bmu = buf.bmu; 1880141cc406Sopenharmony_ci *mud = ((buf.mud[0] << 8) | buf.mud[1]); 1881141cc406Sopenharmony_ci 1882141cc406Sopenharmony_ci DBG (DBG_proc, "<< get_basic_measurement_unit: bmu=%d mud=%d\n", *bmu, 1883141cc406Sopenharmony_ci *mud); 1884141cc406Sopenharmony_ci return (status); 1885141cc406Sopenharmony_ci} 1886141cc406Sopenharmony_ci 1887141cc406Sopenharmony_cistatic SANE_Status 1888141cc406Sopenharmony_ciset_basic_measurement_unit (int fd, SANE_Byte bmu) 1889141cc406Sopenharmony_ci{ 1890141cc406Sopenharmony_ci MP_SMU buf; /* Mode Page Scanning Measurements Page Code */ 1891141cc406Sopenharmony_ci SANE_Status status; 1892141cc406Sopenharmony_ci SANE_Int mud; 1893141cc406Sopenharmony_ci size_t bufsize = sizeof (buf); 1894141cc406Sopenharmony_ci 1895141cc406Sopenharmony_ci DBG (DBG_proc, ">> set_basic_measurement_unit: %d\n", bmu); 1896141cc406Sopenharmony_ci 1897141cc406Sopenharmony_ci /* Set up buf */ 1898141cc406Sopenharmony_ci memset (&buf, 0, bufsize); /* CLEAR buf */ 1899141cc406Sopenharmony_ci buf.code = PAGE_CODE_SCANNING_MEASUREMENTS; /* bits5-0: Page Code */ 1900141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 1901141cc406Sopenharmony_ci buf.len = 0x06; 1902141cc406Sopenharmony_ci 1903141cc406Sopenharmony_ci buf.bmu = bmu; /* Power on default is POINTS */ 1904141cc406Sopenharmony_ci mud = (bmu == INCHES) ? DEFAULT_MUD : 1; 1905141cc406Sopenharmony_ci DBG (DBG_info, "SET_BASIC_MEASUREMENT_UNIT: bmu=%d mud=%d\n", bmu, mud); 1906141cc406Sopenharmony_ci _lto2b (mud, &buf.mud[0]); /* buf.mud[0] = (mud >> 8) & 0xff; buf.mud[1] = (mud & 0xff); */ 1907141cc406Sopenharmony_ci 1908141cc406Sopenharmony_ci status = mode_select (fd, (MP *) & buf); 1909141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1910141cc406Sopenharmony_ci { 1911141cc406Sopenharmony_ci DBG (DBG_error, 1912141cc406Sopenharmony_ci "set_basic_measurement_unit: MODE_SELECT failed with status=%d\n", 1913141cc406Sopenharmony_ci status); 1914141cc406Sopenharmony_ci status = SANE_STATUS_INVAL; 1915141cc406Sopenharmony_ci } 1916141cc406Sopenharmony_ci 1917141cc406Sopenharmony_ci DBG (DBG_proc, 1918141cc406Sopenharmony_ci "<< set_basic_measurement_unit: opcode=%d len=%d bmu=%d mud=%ld\n", 1919141cc406Sopenharmony_ci buf.code, buf.len, buf.bmu, _2btol (&buf.mud[0])); 1920141cc406Sopenharmony_ci return (status); 1921141cc406Sopenharmony_ci} 1922141cc406Sopenharmony_ci 1923141cc406Sopenharmony_cistatic SANE_Status 1924141cc406Sopenharmony_ciadf_control (int fd, SANE_Bool flag, SANE_Byte * adf_control, 1925141cc406Sopenharmony_ci SANE_Byte * adf_mode, SANE_Byte * mwt) 1926141cc406Sopenharmony_ci{ 1927141cc406Sopenharmony_ci SANE_Status status; 1928141cc406Sopenharmony_ci MP_ADF buf; 1929141cc406Sopenharmony_ci size_t bufsize = sizeof (buf); 1930141cc406Sopenharmony_ci 1931141cc406Sopenharmony_ci DBG (DBG_proc, ">> adf_control\n"); 1932141cc406Sopenharmony_ci 1933141cc406Sopenharmony_ci memset (&buf, 0, bufsize); /* Fill struct with zeros */ 1934141cc406Sopenharmony_ci 1935141cc406Sopenharmony_ci if (flag) 1936141cc406Sopenharmony_ci { /* GET */ 1937141cc406Sopenharmony_ci DBG (DBG_info, ">> GET ADF_control>> calling mode_sense\n"); 1938141cc406Sopenharmony_ci status = 1939141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, (SANE_Byte) PAGE_CODE_ADF_CONTROL); 1940141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1941141cc406Sopenharmony_ci { 1942141cc406Sopenharmony_ci DBG (DBG_error, "get_adf_control: MODE_SELECT failed\n"); 1943141cc406Sopenharmony_ci return (status); 1944141cc406Sopenharmony_ci } 1945141cc406Sopenharmony_ci *adf_control = buf.adf_control; 1946141cc406Sopenharmony_ci *adf_mode = buf.adf_mode_control; 1947141cc406Sopenharmony_ci *mwt = buf.medium_wait_timer; 1948141cc406Sopenharmony_ci } 1949141cc406Sopenharmony_ci else 1950141cc406Sopenharmony_ci { /* SET */ 1951141cc406Sopenharmony_ci /* Fill in struct then hand off to mode_select */ 1952141cc406Sopenharmony_ci buf.code = PAGE_CODE_ADF_CONTROL; /* bits5-0: Page Code */ 1953141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 1954141cc406Sopenharmony_ci buf.len = 0x06; 1955141cc406Sopenharmony_ci /* Byte2: adf_control: 7-2:reserved; 1-0:adf_control: Default 00H Flatbed, 01H Simplex, 02H Duplex */ 1956141cc406Sopenharmony_ci /* Byte3: adf_mode_control: 7-3:reserved; 2: Prefeed Mode: 0 invalid, 1 valid; 1-0: ignored */ 1957141cc406Sopenharmony_ci /* Byte4: medium_wait_timer: timeout period. Not supported */ 1958141cc406Sopenharmony_ci buf.adf_control = (*adf_control & 0x03); 1959141cc406Sopenharmony_ci buf.adf_mode_control = (*adf_mode & 0x04); 1960141cc406Sopenharmony_ci buf.medium_wait_timer = *mwt; 1961141cc406Sopenharmony_ci status = mode_select (fd, (MP *) & buf); 1962141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1963141cc406Sopenharmony_ci { 1964141cc406Sopenharmony_ci DBG (DBG_error, 1965141cc406Sopenharmony_ci "set_adf_control: MODE_SELECT failed with status=%d\n", 1966141cc406Sopenharmony_ci status); 1967141cc406Sopenharmony_ci return (status); 1968141cc406Sopenharmony_ci } 1969141cc406Sopenharmony_ci } 1970141cc406Sopenharmony_ci DBG (DBG_proc, ">> adf_control\n"); 1971141cc406Sopenharmony_ci return (status); 1972141cc406Sopenharmony_ci} 1973141cc406Sopenharmony_ci 1974141cc406Sopenharmony_cistatic SANE_Status 1975141cc406Sopenharmony_ciwhite_balance (int fd, int *val, SANE_Bool flag) 1976141cc406Sopenharmony_ci{ 1977141cc406Sopenharmony_ci SANE_Status status; 1978141cc406Sopenharmony_ci MP_WhiteBal buf; /* White Balance Page Code */ 1979141cc406Sopenharmony_ci size_t bufsize = sizeof (buf); 1980141cc406Sopenharmony_ci 1981141cc406Sopenharmony_ci memset (&buf, 0, bufsize); 1982141cc406Sopenharmony_ci 1983141cc406Sopenharmony_ci if (flag) 1984141cc406Sopenharmony_ci { /* GET */ 1985141cc406Sopenharmony_ci DBG (DBG_proc, ">> GET white_balance>> calling mode_sense\n"); 1986141cc406Sopenharmony_ci status = 1987141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, (SANE_Byte) PAGE_CODE_WHITE_BALANCE); 1988141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1989141cc406Sopenharmony_ci { 1990141cc406Sopenharmony_ci DBG (DBG_error, 1991141cc406Sopenharmony_ci "get_white_balance: MODE_SELECT failed with status=%d\n", 1992141cc406Sopenharmony_ci status); 1993141cc406Sopenharmony_ci return (status); 1994141cc406Sopenharmony_ci } 1995141cc406Sopenharmony_ci *val = buf.white_balance; 1996141cc406Sopenharmony_ci } 1997141cc406Sopenharmony_ci else 1998141cc406Sopenharmony_ci { /* SET */ 1999141cc406Sopenharmony_ci /* Fill in struct then hand off to mode_select */ 2000141cc406Sopenharmony_ci memset (&buf, 0, sizeof (buf)); /* Fill struct with zeros */ 2001141cc406Sopenharmony_ci buf.code = PAGE_CODE_WHITE_BALANCE; /* bits5-0: Page Code */ 2002141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 2003141cc406Sopenharmony_ci buf.len = 0x06; 2004141cc406Sopenharmony_ci buf.white_balance = *val; /* Power on default is RELATIVE_WHITE */ 2005141cc406Sopenharmony_ci status = mode_select (fd, (MP *) & buf); 2006141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 2007141cc406Sopenharmony_ci { 2008141cc406Sopenharmony_ci DBG (DBG_error, 2009141cc406Sopenharmony_ci "set_white_balance: MODE_SELECT failed with status=%d\n", 2010141cc406Sopenharmony_ci status); 2011141cc406Sopenharmony_ci return (status); 2012141cc406Sopenharmony_ci } 2013141cc406Sopenharmony_ci } 2014141cc406Sopenharmony_ci DBG (DBG_proc, "<< white balance: buf.white_balance=%#02x\n", 2015141cc406Sopenharmony_ci buf.white_balance); 2016141cc406Sopenharmony_ci return (status); 2017141cc406Sopenharmony_ci} 2018141cc406Sopenharmony_ci 2019141cc406Sopenharmony_ci#if 0 2020141cc406Sopenharmony_cistatic SANE_Int 2021141cc406Sopenharmony_cilamp_timer (int fd, int val, SANE_Bool flag) 2022141cc406Sopenharmony_ci{ 2023141cc406Sopenharmony_ci SANE_Status status; 2024141cc406Sopenharmony_ci MP_LampTimer buf; /* Lamp Timer Page Code */ 2025141cc406Sopenharmony_ci 2026141cc406Sopenharmony_ci DBG (DBG_proc, ">> lamp timer\n"); 2027141cc406Sopenharmony_ci if (flag) 2028141cc406Sopenharmony_ci { /* GET */ 2029141cc406Sopenharmony_ci DBG (DBG_info, ">> GET lamp_timer>> calling mode_sense\n"); 2030141cc406Sopenharmony_ci if ((status = 2031141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, 2032141cc406Sopenharmony_ci (SANE_Byte) PAGE_CODE_LAMP_TIMER_SET)) != 2033141cc406Sopenharmony_ci SANE_STATUS_GOOD) 2034141cc406Sopenharmony_ci { 2035141cc406Sopenharmony_ci DBG (DBG_error, "get_lamp_timer: MODE_SELECT failed\n"); 2036141cc406Sopenharmony_ci return (-1); 2037141cc406Sopenharmony_ci } 2038141cc406Sopenharmony_ci } 2039141cc406Sopenharmony_ci else 2040141cc406Sopenharmony_ci { /* SET */ 2041141cc406Sopenharmony_ci /* Fill in struct then hand off to mode_select */ 2042141cc406Sopenharmony_ci memset (&buf, 0, sizeof (buf)); /* Fill struct with zeros */ 2043141cc406Sopenharmony_ci buf.code = PAGE_CODE_LAMP_TIMER_SET; /* bits5-0: Page Code */ 2044141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 2045141cc406Sopenharmony_ci buf.len = 0x06; 2046141cc406Sopenharmony_ci buf.time_on = val; /* time lamp has been on */ 2047141cc406Sopenharmony_ci if ((status = mode_select (fd, (MP *) & buf)) != SANE_STATUS_GOOD) 2048141cc406Sopenharmony_ci { 2049141cc406Sopenharmony_ci DBG (DBG_error, 2050141cc406Sopenharmony_ci "set_lamp_timer: MODE_SELECT failed with status=%d\n", status); 2051141cc406Sopenharmony_ci return (-1); 2052141cc406Sopenharmony_ci } 2053141cc406Sopenharmony_ci } 2054141cc406Sopenharmony_ci DBG (DBG_proc, "<< lamp timer\n"); 2055141cc406Sopenharmony_ci return (buf.time_on); 2056141cc406Sopenharmony_ci} 2057141cc406Sopenharmony_ci#endif 2058141cc406Sopenharmony_ci 2059141cc406Sopenharmony_cistatic SANE_Status 2060141cc406Sopenharmony_ciendorser_control (int fd, int *val, SANE_Bool flag) 2061141cc406Sopenharmony_ci{ 2062141cc406Sopenharmony_ci SANE_Status status; 2063141cc406Sopenharmony_ci MP_EndCtrl buf; /* MPHdr (4bytes) + MPP (8bytes) */ 2064141cc406Sopenharmony_ci SANE_Byte mask = 0x7; /* 7-3:reserved; 2-0: Endorser Control */ 2065141cc406Sopenharmony_ci size_t bufsize = sizeof (buf); 2066141cc406Sopenharmony_ci 2067141cc406Sopenharmony_ci DBG (DBG_proc, ">> endorser_control: fd=%d val=%d flag=%d\n", fd, *val, 2068141cc406Sopenharmony_ci flag); 2069141cc406Sopenharmony_ci 2070141cc406Sopenharmony_ci memset (&buf, 0, bufsize); /* Fill struct with zeros */ 2071141cc406Sopenharmony_ci 2072141cc406Sopenharmony_ci if (flag) 2073141cc406Sopenharmony_ci { /* GET */ 2074141cc406Sopenharmony_ci DBG (DBG_info, ">> GET endorser control >> calling mode_sense\n"); 2075141cc406Sopenharmony_ci status = 2076141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, (SANE_Byte) PAGE_CODE_ENDORSER_CONTROL); 2077141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 2078141cc406Sopenharmony_ci { 2079141cc406Sopenharmony_ci DBG (DBG_error, 2080141cc406Sopenharmony_ci "get_endorser_control: MODE_SELECT failed with status=%d\n", 2081141cc406Sopenharmony_ci status); 2082141cc406Sopenharmony_ci return (status); 2083141cc406Sopenharmony_ci } 2084141cc406Sopenharmony_ci *val = buf.endorser_control & mask; 2085141cc406Sopenharmony_ci } 2086141cc406Sopenharmony_ci else 2087141cc406Sopenharmony_ci { /* SET */ 2088141cc406Sopenharmony_ci DBG (DBG_info, ">> SET endorser control >> calling mode_select\n"); 2089141cc406Sopenharmony_ci /* Fill in struct then hand off to mode_select */ 2090141cc406Sopenharmony_ci memset (&buf, 0, sizeof (buf)); /* Fill struct with zeros */ 2091141cc406Sopenharmony_ci buf.code = PAGE_CODE_ENDORSER_CONTROL; /* bits5-0: Page Code */ 2092141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 2093141cc406Sopenharmony_ci buf.len = 0x06; 2094141cc406Sopenharmony_ci 2095141cc406Sopenharmony_ci buf.endorser_control = *val & mask; /* Power on default is OFF */ 2096141cc406Sopenharmony_ci status = mode_select (fd, (MP *) & buf); 2097141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 2098141cc406Sopenharmony_ci { 2099141cc406Sopenharmony_ci DBG (DBG_error, 2100141cc406Sopenharmony_ci "set_endorser_control: MODE_SELECT failed with status=%d\n", 2101141cc406Sopenharmony_ci status); 2102141cc406Sopenharmony_ci return (status); 2103141cc406Sopenharmony_ci } 2104141cc406Sopenharmony_ci } 2105141cc406Sopenharmony_ci DBG (DBG_proc, "<< endorser_control: endorser_control=%#02x\n", 2106141cc406Sopenharmony_ci buf.endorser_control); 2107141cc406Sopenharmony_ci return (status); 2108141cc406Sopenharmony_ci} 2109141cc406Sopenharmony_ci 2110141cc406Sopenharmony_ci/* When SCAN, READ, or LOAD (in ADF mode) is issued, scanner waits until operator panel start button is pressed */ 2111141cc406Sopenharmony_cistatic SANE_Status 2112141cc406Sopenharmony_ciscan_wait_mode (int fd, int val, SANE_Bool flag) 2113141cc406Sopenharmony_ci{ 2114141cc406Sopenharmony_ci SANE_Status status; 2115141cc406Sopenharmony_ci MP_SWM buf; /* Scan Wait Mode Page Code */ 2116141cc406Sopenharmony_ci DBG (DBG_proc, ">> scan_wait_mode\n"); 2117141cc406Sopenharmony_ci 2118141cc406Sopenharmony_ci if (flag) 2119141cc406Sopenharmony_ci { /* GET */ 2120141cc406Sopenharmony_ci DBG (DBG_info, ">> GET scan_wait_mode >> calling mode_sense\n"); 2121141cc406Sopenharmony_ci status = 2122141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, (SANE_Byte) PAGE_CODE_SCAN_WAIT_MODE); 2123141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 2124141cc406Sopenharmony_ci { 2125141cc406Sopenharmony_ci DBG (DBG_error, 2126141cc406Sopenharmony_ci "get_scan_wait_mode: MODE_SELECT failed with status=%d\n", 2127141cc406Sopenharmony_ci status); 2128141cc406Sopenharmony_ci return (-1); 2129141cc406Sopenharmony_ci } 2130141cc406Sopenharmony_ci } 2131141cc406Sopenharmony_ci else 2132141cc406Sopenharmony_ci { /* SET */ 2133141cc406Sopenharmony_ci /* Fill in struct then hand off to mode_select */ 2134141cc406Sopenharmony_ci memset (&buf, 0, sizeof (buf)); /* Fill struct with zeros */ 2135141cc406Sopenharmony_ci buf.code = PAGE_CODE_SCAN_WAIT_MODE; /* bits5-0: Page Code */ 2136141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 2137141cc406Sopenharmony_ci buf.len = 0x06; 2138141cc406Sopenharmony_ci buf.swm = 0x00; 2139141cc406Sopenharmony_ci if (val == 1) 2140141cc406Sopenharmony_ci buf.swm |= 1; /* set bit 1 if scan_wait_mode ON */ 2141141cc406Sopenharmony_ci else 2142141cc406Sopenharmony_ci buf.swm &= ~1; /* unset bit 1 if scan_wait_mode OFF */ 2143141cc406Sopenharmony_ci 2144141cc406Sopenharmony_ci DBG (DBG_info, ">> SET scan_wait_mode >> calling mode_sense\n"); 2145141cc406Sopenharmony_ci if ((status = mode_select (fd, (MP *) & buf)) != SANE_STATUS_GOOD) 2146141cc406Sopenharmony_ci { 2147141cc406Sopenharmony_ci DBG (DBG_error, "mode_select ERROR %s\n", sane_strstatus (status)); 2148141cc406Sopenharmony_ci } 2149141cc406Sopenharmony_ci } 2150141cc406Sopenharmony_ci DBG (DBG_proc, "<< scan_wait_mode: buf.swm=%#02x\n", buf.swm); 2151141cc406Sopenharmony_ci return (status); 2152141cc406Sopenharmony_ci} 2153141cc406Sopenharmony_ci 2154141cc406Sopenharmony_ci/* Selectable when Send Diagnostics command is performed */ 2155141cc406Sopenharmony_cistatic SANE_Int 2156141cc406Sopenharmony_ciservice_mode (int fd, int val, SANE_Bool flag) 2157141cc406Sopenharmony_ci{ 2158141cc406Sopenharmony_ci SANE_Status status; 2159141cc406Sopenharmony_ci MP_SRV buf; /* Service Mode Page Code */ 2160141cc406Sopenharmony_ci DBG (DBG_proc, ">> service_mode\n"); 2161141cc406Sopenharmony_ci 2162141cc406Sopenharmony_ci if (flag) 2163141cc406Sopenharmony_ci { /* GET */ 2164141cc406Sopenharmony_ci DBG (DBG_info, ">> GET service_mode >> calling mode_sense\n"); 2165141cc406Sopenharmony_ci status = 2166141cc406Sopenharmony_ci mode_sense (fd, (MP *) & buf, 2167141cc406Sopenharmony_ci (SANE_Byte) PAGE_CODE_SERVICE_MODE_SELECT); 2168141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 2169141cc406Sopenharmony_ci { 2170141cc406Sopenharmony_ci DBG (DBG_error, 2171141cc406Sopenharmony_ci "get_service_mode: MODE_SELECT failed with status=%d\n", 2172141cc406Sopenharmony_ci status); 2173141cc406Sopenharmony_ci return (-1); 2174141cc406Sopenharmony_ci } 2175141cc406Sopenharmony_ci } 2176141cc406Sopenharmony_ci else 2177141cc406Sopenharmony_ci { /* SET */ 2178141cc406Sopenharmony_ci /* Fill in struct then hand off to mode_select */ 2179141cc406Sopenharmony_ci memset (&buf, 0, sizeof (buf)); /* Fill struct with zeros */ 2180141cc406Sopenharmony_ci buf.code = PAGE_CODE_SERVICE_MODE_SELECT; /* bits5-0: Page Code */ 2181141cc406Sopenharmony_ci buf.code &= ~(1 << 7); /* Bit7 PS is set to 0 */ 2182141cc406Sopenharmony_ci buf.len = 0x06; 2183141cc406Sopenharmony_ci /* 0H: Self-Diagnostics Mode, 1H: Optical Adjustment Mode */ 2184141cc406Sopenharmony_ci buf.service = val & 0x01; 2185141cc406Sopenharmony_ci status = mode_select (fd, (MP *) & buf); 2186141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 2187141cc406Sopenharmony_ci { 2188141cc406Sopenharmony_ci DBG (DBG_error, 2189141cc406Sopenharmony_ci "set_service_mode: MODE_SELECT failed with status=%d\n", 2190141cc406Sopenharmony_ci status); 2191141cc406Sopenharmony_ci return (-1); 2192141cc406Sopenharmony_ci } 2193141cc406Sopenharmony_ci } 2194141cc406Sopenharmony_ci DBG (DBG_proc, "<< service_mode\n"); 2195141cc406Sopenharmony_ci return (buf.service & 0x01); 2196141cc406Sopenharmony_ci} 2197