Changeset 1115 for trunk/src/ifd
- Timestamp:
- 01/03/09 11:35:45 (3 years ago)
- File:
-
- 1 edited
-
trunk/src/ifd/ifd-ccid.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ifd/ifd-ccid.c
r1113 r1115 218 218 size_t slen[OPENCT_MAX_SLOTS]; 219 219 unsigned char seq; 220 int support_events; 221 int events_active; 222 ifd_usb_capture_t *event_cap; 220 223 } ccid_status_t; 221 224 … … 486 489 unsigned char *_class; 487 490 unsigned char *p; 491 int support_events = 0; 488 492 489 493 if (ifd_usb_get_device(dev, &de)) { … … 538 542 params.usb.ep_intr = 0; 539 543 ok |= 4; 544 } 545 if (intf->bNumEndpoints == 3) { 546 support_events = 1; 540 547 } 541 548 for (i = 0; i < intf->bNumEndpoints; i++) { … … 759 766 st->proto_support |= SUPPORT_ESCAPE; 760 767 } 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); 762 772 return 0; 763 773 } … … 809 819 return -1; 810 820 } 821 } 822 823 /* 824 * Close the device 825 */ 826 static 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; 811 838 } 812 839 … … 1297 1324 } 1298 1325 1326 static 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 1347 static 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 1369 static 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 1389 static 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 1428 static 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 1299 1437 /* 1300 1438 * Driver operations … … 1308 1446 { 1309 1447 ccid_driver.open = ccid_open; 1448 ccid_driver.close = ccid_close; 1310 1449 ccid_driver.activate = ccid_activate; 1311 1450 ccid_driver.deactivate = ccid_deactivate; … … 1317 1456 ccid_driver.recv = ccid_recv; 1318 1457 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; 1319 1463 1320 1464 ifd_driver_register("ccid", &ccid_driver);
Note: See TracChangeset
for help on using the changeset viewer.
