00001
00002
00003
00004
00005
00006 #ifndef _CCID_INTERNAL_H
00007 #define _CCID_INTERNAL_H
00008
00009 #include <libusb.h>
00010 #include <ccid-spec.h>
00011
00012 #define trace(cci, fmt, x...) \
00013 do { \
00014 struct _cci *_CCI = cci; \
00015 if ( _CCI->cci_tf ) { \
00016 fprintf(_CCI->cci_tf, fmt , ##x); \
00017 fflush(_CCI->cci_tf); \
00018 } \
00019 }while(0);
00020
00021 struct _chipcard {
00022 struct _cci *cc_parent;
00023 uint8_t cc_idx;
00024 uint8_t cc_status;
00025 };
00026
00027 struct _cci {
00028 libusb_device_handle *cci_dev;
00029
00030 struct _xfr *cci_xfr;
00031
00032 FILE *cci_tf;
00033
00034 int cci_inp;
00035 int cci_outp;
00036 int cci_intrp;
00037
00038 uint16_t cci_max_in;
00039 uint16_t cci_max_out;
00040 uint16_t cci_max_intr;
00041
00042 uint8_t cci_seq;
00043 uint8_t _pad0;
00044
00045 unsigned int cci_num_slots;
00046 unsigned int cci_max_slots;
00047 struct _chipcard cci_slot[CCID_MAX_SLOTS];
00048
00049 struct ccid_desc cci_desc;
00050 };
00051
00052 struct _xfr {
00053 size_t x_txmax, x_rxmax;
00054 size_t x_txlen, x_rxlen;
00055 struct ccid_msg *x_txhdr;
00056 uint8_t *x_txbuf;
00057 const struct ccid_msg *x_rxhdr;
00058 uint8_t *x_rxbuf;
00059 };
00060
00061 _private int _probe_descriptors(struct libusb_device *dev,
00062 int *cp, int *ip, int *ap);
00063
00064 _private int _RDR_to_PC(struct _cci *cci, unsigned int slot, struct _xfr *xfr);
00065 _private unsigned int _RDR_to_PC_SlotStatus(struct _cci *cci, struct _xfr *xfr);
00066 _private unsigned int _RDR_to_PC_DataBlock(struct _cci *cci, struct _xfr *xfr);
00067
00068 _private int _PC_to_RDR_GetSlotStatus(struct _cci *cci, unsigned int slot,
00069 struct _xfr *xfr);
00070 _private int _PC_to_RDR_IccPowerOn(struct _cci *cci, unsigned int slot,
00071 struct _xfr *xfr,
00072 unsigned int voltage);
00073 _private int _PC_to_RDR_IccPowerOff(struct _cci *cci, unsigned int slot,
00074 struct _xfr *xfr);
00075 _private int _PC_to_RDR_XfrBlock(struct _cci *cci, unsigned int slot,
00076 struct _xfr *xfr);
00077
00078 _private int _cci_wait_for_interrupt(struct _cci *cci);
00079
00080 _private struct _xfr *_xfr_do_alloc(size_t txbuf, size_t rxbuf);
00081 _private void _xfr_do_free(struct _xfr *xfr);
00082
00083 _private void _hex_dumpf(FILE *f, const uint8_t *tmp, size_t len, size_t llen);
00084
00085 #endif