Changeset 1115 for trunk/src/ifd


Ignore:
Timestamp:
01/03/09 11:35:45 (3 years ago)
Author:
alonbl
Message:

Modify ccid driver to use the event interface

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ifd/ifd-ccid.c

    r1113 r1115  
    218218        size_t slen[OPENCT_MAX_SLOTS]; 
    219219        unsigned char seq; 
     220        int support_events; 
     221        int events_active; 
     222        ifd_usb_capture_t *event_cap; 
    220223} ccid_status_t; 
    221224 
     
    486489        unsigned char *_class; 
    487490        unsigned char *p; 
     491        int support_events = 0; 
    488492 
    489493        if (ifd_usb_get_device(dev, &de)) { 
     
    538542                                        params.usb.ep_intr = 0; 
    539543                                        ok |= 4; 
     544                                } 
     545                                if (intf->bNumEndpoints == 3) { 
     546                                        support_events = 1; 
    540547                                } 
    541548                                for (i = 0; i < intf->bNumEndpoints; i++) { 
     
    759766                st->proto_support |= SUPPORT_ESCAPE; 
    760767        } 
    761         ifd_debug(3, "Accepted %04x:%04x with features 0x%x and protocols 0x%x", de.idVendor, de.idProduct, ccid.dwFeatures, ccid.dwProtocols); 
     768 
     769        st->support_events = support_events; 
     770 
     771        ifd_debug(3, "Accepted %04x:%04x with features 0x%x and protocols 0x%x events=%d", de.idVendor, de.idProduct, ccid.dwFeatures, ccid.dwProtocols, st->support_events); 
    762772        return 0; 
    763773} 
     
    809819                return -1; 
    810820        } 
     821} 
     822 
     823/* 
     824 * Close the device 
     825 */ 
     826static int ccid_close(ifd_reader_t * reader) 
     827{ 
     828        ccid_status_t *st = (ccid_status_t *) reader->driver_data; 
     829         
     830        ifd_debug(1, "called."); 
     831 
     832        if (st->event_cap != NULL) { 
     833                ifd_usb_end_capture(reader->device, st->event_cap); 
     834                st->event_cap = NULL; 
     835        } 
     836 
     837        return 0; 
    811838} 
    812839 
     
    12971324} 
    12981325 
     1326static int ccid_before_command(ifd_reader_t * reader) 
     1327{ 
     1328        ccid_status_t *st = (ccid_status_t *) reader->driver_data; 
     1329        int rc; 
     1330 
     1331        ifd_debug(1, "called."); 
     1332 
     1333        if (!st->events_active) { 
     1334                return 0; 
     1335        } 
     1336 
     1337        if (st->event_cap == NULL) { 
     1338                return 0; 
     1339        } 
     1340 
     1341        rc = ifd_usb_end_capture(reader->device, st->event_cap); 
     1342        st->event_cap = NULL; 
     1343 
     1344        return rc; 
     1345} 
     1346 
     1347static int ccid_after_command(ifd_reader_t * reader) 
     1348{ 
     1349        ccid_status_t *st = (ccid_status_t *) reader->driver_data; 
     1350 
     1351        ifd_debug(1, "called."); 
     1352 
     1353        if (!st->events_active) { 
     1354                return 0; 
     1355        } 
     1356 
     1357        if (st->event_cap != NULL) { 
     1358                return 0; 
     1359        } 
     1360 
     1361        return ifd_usb_begin_capture( 
     1362                reader->device, 
     1363                IFD_USB_URB_TYPE_INTERRUPT, 
     1364                reader->device->settings.usb.ep_intr, 
     1365                8, &st->event_cap 
     1366        ); 
     1367} 
     1368 
     1369static int ccid_get_eventfd(ifd_reader_t * reader) 
     1370{ 
     1371        ccid_status_t *st = (ccid_status_t *) reader->driver_data; 
     1372        int fd; 
     1373 
     1374        ifd_debug(1, "called."); 
     1375 
     1376        if (!st->support_events) { 
     1377                return -1; 
     1378        } 
     1379 
     1380        fd = ifd_device_get_eventfd(reader->device); 
     1381 
     1382        if (fd != -1) { 
     1383                st->events_active = 1; 
     1384        } 
     1385 
     1386        return fd; 
     1387} 
     1388 
     1389static int ccid_event(ifd_reader_t * reader, int *status, size_t status_size) 
     1390{ 
     1391        ccid_status_t *st = (ccid_status_t *) reader->driver_data; 
     1392        unsigned char ret[20]; 
     1393        int bytes; 
     1394 
     1395        ifd_debug(1, "called."); 
     1396 
     1397        if (status_size < reader->nslots) { 
     1398                return IFD_ERROR_BUFFER_TOO_SMALL; 
     1399        } 
     1400 
     1401        bytes = ifd_usb_capture_event(reader->device, st->event_cap, ret, 8); 
     1402        if (bytes < 0) { 
     1403                return bytes; 
     1404        } 
     1405 
     1406        if (bytes > 0 && ret[0] == 0x50) { 
     1407                int slot; 
     1408                ifd_debug(3, "status received:%s", ct_hexdump(ret, bytes)); 
     1409                for (slot=0;slot<reader->nslots;slot++) { 
     1410                        if (1 + (slot / 4) < bytes) { 
     1411                                int bits = (ret[1 + (slot / 4)] >> (2 * (slot % 4))) & 0x3; 
     1412                                if (bits & 2) 
     1413                                        status[slot] |= IFD_CARD_STATUS_CHANGED; 
     1414                                if (bits & 1) 
     1415                                        status[slot] |= IFD_CARD_PRESENT; 
     1416                                else 
     1417                                        status[slot] &= ~IFD_CARD_PRESENT; 
     1418 
     1419                                ifd_debug(1, "slot %d event result: %08x", slot, status[slot]); 
     1420                                st->icc_present[slot] = status[slot] & IFD_CARD_PRESENT; 
     1421                        } 
     1422                } 
     1423        } 
     1424 
     1425        return 0; 
     1426} 
     1427 
     1428static int ccid_error(ifd_reader_t * reader) 
     1429{ 
     1430        (void)reader; 
     1431 
     1432        ifd_debug(1, "called."); 
     1433 
     1434        return IFD_ERROR_DEVICE_DISCONNECTED; 
     1435} 
     1436 
    12991437/* 
    13001438 * Driver operations 
     
    13081446{ 
    13091447        ccid_driver.open = ccid_open; 
     1448        ccid_driver.close = ccid_close; 
    13101449        ccid_driver.activate = ccid_activate; 
    13111450        ccid_driver.deactivate = ccid_deactivate; 
     
    13171456        ccid_driver.recv = ccid_recv; 
    13181457        ccid_driver.escape = ccid_escape; 
     1458        ccid_driver.before_command = ccid_before_command; 
     1459        ccid_driver.after_command = ccid_after_command; 
     1460        ccid_driver.get_eventfd = ccid_get_eventfd; 
     1461        ccid_driver.event = ccid_event; 
     1462        ccid_driver.error = ccid_error; 
    13191463 
    13201464        ifd_driver_register("ccid", &ccid_driver); 
Note: See TracChangeset for help on using the changeset viewer.