00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <ccid.h>
00010
00011 #include "ccid-internal.h"
00012
00023 unsigned int chipcard_status(chipcard_t cc)
00024 {
00025 return cc->cc_status;
00026 }
00027
00037 unsigned int chipcard_slot_status(chipcard_t cc)
00038 {
00039 struct _cci *cci = cc->cc_parent;
00040
00041 if ( !_PC_to_RDR_GetSlotStatus(cci, cc->cc_idx, cci->cci_xfr) )
00042 return CHIPCARD_CLOCK_ERR;
00043
00044 if ( !_RDR_to_PC(cci, cc->cc_idx, cci->cci_xfr) )
00045 return CHIPCARD_CLOCK_ERR;
00046
00047 return _RDR_to_PC_SlotStatus(cci, cci->cci_xfr);
00048 }
00049
00059 const uint8_t *chipcard_slot_on(chipcard_t cc, unsigned int voltage,
00060 size_t *atr_len)
00061 {
00062 struct _cci *cci = cc->cc_parent;
00063
00064 if ( !_PC_to_RDR_IccPowerOn(cci, cc->cc_idx, cci->cci_xfr, voltage) )
00065 return 0;
00066
00067 if ( !_RDR_to_PC(cci, cc->cc_idx, cci->cci_xfr) )
00068 return 0;
00069
00070 _RDR_to_PC_DataBlock(cci, cci->cci_xfr);
00071 if ( atr_len )
00072 *atr_len = cci->cci_xfr->x_rxlen;
00073 return cci->cci_xfr->x_rxbuf;
00074 }
00075
00086 int chipcard_transact(chipcard_t cc, xfr_t xfr)
00087 {
00088 struct _cci *cci = cc->cc_parent;
00089
00090 if ( !_PC_to_RDR_XfrBlock(cci, cc->cc_idx, xfr) )
00091 return 0;
00092
00093 if ( !_RDR_to_PC(cci, cc->cc_idx, xfr) )
00094 return 0;
00095
00096 _RDR_to_PC_DataBlock(cci, xfr);
00097 return 1;
00098 }
00099
00107 int chipcard_slot_off(chipcard_t cc)
00108 {
00109 struct _cci *cci = cc->cc_parent;
00110
00111 if ( !_PC_to_RDR_IccPowerOff(cci, cc->cc_idx, cci->cci_xfr) )
00112 return 0;
00113
00114 if ( !_RDR_to_PC(cci, cc->cc_idx, cci->cci_xfr) )
00115 return 0;
00116
00117 return _RDR_to_PC_SlotStatus(cci, cci->cci_xfr);
00118 }
00119
00127 int chipcard_wait_for_card(chipcard_t cc)
00128 {
00129 struct _cci *cci = cc->cc_parent;
00130
00131 do {
00132 _PC_to_RDR_GetSlotStatus(cci, cc->cc_idx, cci->cci_xfr);
00133 _RDR_to_PC(cci, cc->cc_idx, cci->cci_xfr);
00134 if ( cc->cc_status != CHIPCARD_NOT_PRESENT )
00135 break;
00136 _cci_wait_for_interrupt(cci);
00137 } while( cc->cc_status == CHIPCARD_NOT_PRESENT );
00138 return 1;
00139 }
00140
00148 cci_t chipcard_cci(chipcard_t cc)
00149 {
00150 return cc->cc_parent;
00151 }