File: geniusvp2-switcher.c

package info (click to toggle)
sane-backends-extras 1.0.22.4
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 3,080 kB
  • ctags: 2,710
  • sloc: ansic: 27,680; sh: 10,433; makefile: 448
file content (65 lines) | stat: -rw-r--r-- 2,027 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/* switcher.c - on/off switcher functions
 * 
 * Copyright (C) 2004, 2005 Anderson Lizardo
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc., 59
 * Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

#include "geniusvp2-parport.h"
#include "geniusvp2-switcher.h"

static int
switcher (unsigned char sequence, unsigned char onoff)
{
    int offset, bit;

    sane_geniusvp2_pp_write (PP_CONTROL, 0xc4);
    sane_geniusvp2_pp_write (PP_DATA, 0xff);
    sane_geniusvp2_pp_write (PP_DATA, 0xfe);
    sane_geniusvp2_pp_write (PP_DATA, 0xff);

    for (bit = 7; bit >= 0; bit--)
    {
        offset = ((sequence >> bit) & 0x01) << 1;
        offset |= onoff;
        sane_geniusvp2_pp_write (PP_DATA, 0x71 + offset);      /* send a double clock pulse */
        sane_geniusvp2_pp_write (PP_DATA, 0xf1 + offset);
        sane_geniusvp2_pp_write (PP_DATA, 0x71 + offset);
        sane_geniusvp2_pp_write (PP_DATA, 0xf1 + offset);
        sane_geniusvp2_pp_write (PP_DATA, 0x71 + offset);
    }

    sane_geniusvp2_pp_write (PP_DATA, 0xff);

    if (onoff == 0x04)
    {                           /* scanner is online */
        sane_geniusvp2_pp_write (PP_DATA, 0xfe);       /* let the ASIC work */
        sane_geniusvp2_pp_write (PP_DATA, 0xff);
    }

    return 0;
}

int
sane_geniusvp2_scanner_on (void)
{
    return switcher (0xf9, 0x04);
}

int
sane_geniusvp2_scanner_off (void)
{
    return switcher (0xf0, 0x00);
}