source: trunk/src/ifd/ifd-etoken64.c @ 1137

Revision 1137, 3.8 KB checked in by alonbl, 3 years ago (diff)

Allow driver to specify events to poll

Line 
1/*
2 * eToken 64 driver
3 *
4 * Copyright (C) 2005, Olaf Kirch <okir@suse.de>
5 * Copyright (C) 2005, Andreas Jellinghaus <aj@dungeon.inka.de>.
6 */
7
8#include "internal.h"
9#include <stdlib.h>
10#include <string.h>
11
12#define ET64_TIMEOUT    1000
13
14/*
15 * Initialize the device
16 */
17static int et64_open(ifd_reader_t * reader, const char *device_name)
18{
19        ifd_device_t *dev;
20        ifd_device_params_t params;
21
22        reader->name = "Aladdin eToken PRO 64k";
23        reader->nslots = 1;
24        if (!(dev = ifd_device_open(device_name)))
25                return -1;
26        if (ifd_device_type(dev) != IFD_DEVICE_TYPE_USB) {
27                ct_error("etoken64: device %s is not a USB device",
28                         device_name);
29                ifd_device_close(dev);
30                return -1;
31        }
32
33        params = dev->settings;
34        params.usb.interface = 0;
35        if (ifd_device_set_parameters(dev, &params) < 0) {
36                ct_error("etoken64: setting parameters failed", device_name);
37                ifd_device_close(dev);
38                return -1;
39        }
40
41        reader->device = dev;
42
43        return 0;
44}
45
46/*
47 * Power up the reader
48 */
49static int et64_activate(ifd_reader_t * reader)
50{
51        return 0;
52}
53
54static int et64_deactivate(ifd_reader_t * reader)
55{
56        return -1;
57}
58
59/*
60 * Card status - always present
61 */
62static int et64_card_status(ifd_reader_t * reader, int slot, int *status)
63{
64        *status = IFD_CARD_PRESENT;
65        return 0;
66}
67
68/*
69 * Reset - nothing to be done?
70 * We should do something to make it come back with all state zapped
71 */
72static int et64_card_reset(ifd_reader_t * reader, int slot, void *atr,
73                           size_t size)
74{
75        ifd_device_t *dev = reader->device;
76        unsigned char buffer[256];
77        int rc, n, atrlen;
78
79        /* Request the ATR */
80        rc = ifd_usb_control(dev, 0x40, 0x01, 0, 0, NULL, 0, ET64_TIMEOUT);
81        if (rc < 0)
82                goto failed;
83
84        /* Receive the ATR */
85        rc = ifd_usb_control(dev, 0xc0, 0x81, 0, 0, buffer, 0x23, ET64_TIMEOUT);
86        if (rc <= 0)
87                goto failed;
88
89        n = buffer[0];
90        if (n + 1 > rc)
91                goto failed;
92        if (n > IFD_MAX_ATR_LEN)
93                goto failed;
94
95        if (n > size)
96                n = size;
97        atrlen = n;
98        memcpy(atr, buffer + 1, atrlen);
99
100        if (ifd_usb_control(dev, 0x40, 0x08, 0, 0, NULL, 0, -1) < 0
101            || ifd_usb_control(dev, 0xc0, 0x88, 0, 0, buffer, 02, -1) != 02
102            || ifd_usb_control(dev, 0x40, 0x03, 0, 0, NULL, 0, -1) < 0
103            || ifd_usb_control(dev, 0xc0, 0x83, 0, 0, buffer, 1, -1) != 1
104            || buffer[0] != 0)
105                goto failed;
106
107        return atrlen;
108
109      failed:
110        ct_error("etoken64: failed to activate token");
111        return -1;
112}
113
114/*
115 * Send/receive routines
116 */
117static int et64_send(ifd_reader_t * reader, unsigned int dad,
118                     const unsigned char *buffer, size_t len)
119{
120        return ifd_usb_control(reader->device, 0x40, 0x06, 0, 0,
121                               (void *)buffer, len, -1);
122}
123
124static int et64_recv(ifd_reader_t * reader, unsigned int dad,
125                     unsigned char *buffer, size_t len, long timeout)
126{
127        return ifd_usb_control(reader->device, 0xc0, 0x86, 0, 0,
128                               buffer, len, timeout);
129}
130
131static int et64_get_eventfd(ifd_reader_t * reader, short *events)
132{
133        ifd_debug(1, "called.");
134
135        return ifd_device_get_eventfd(reader->device, events);
136}
137
138static int et64_event(ifd_reader_t * reader, int *status, size_t status_size)
139{
140        (void)reader;
141        (void)status;
142        (void)status_size;
143
144        ifd_debug(1, "called.");
145
146        return 0;
147}
148
149static int et64_error(ifd_reader_t * reader)
150{
151        (void)reader;
152
153        ifd_debug(1, "called.");
154
155        return IFD_ERROR_DEVICE_DISCONNECTED;
156}
157
158/*
159 * Driver operations
160 */
161static struct ifd_driver_ops etoken64_driver;
162
163/*
164 * Initialize this module
165 */
166void ifd_etoken64_register(void)
167{
168        etoken64_driver.open = et64_open;
169        etoken64_driver.activate = et64_activate;
170        etoken64_driver.deactivate = et64_deactivate;
171        etoken64_driver.card_status = et64_card_status;
172        etoken64_driver.card_reset = et64_card_reset;
173        etoken64_driver.send = et64_send;
174        etoken64_driver.recv = et64_recv;
175        etoken64_driver.get_eventfd = et64_get_eventfd;
176        etoken64_driver.event = et64_event;
177        etoken64_driver.error = et64_error;
178
179        ifd_driver_register("etoken64", &etoken64_driver);
180}
Note: See TracBrowser for help on using the repository browser.