#ifndef _ATR_H
#define _ATR_H
#include <sys/types.h>
#include <sys/usb/clients/ccid/ccid.h>
#ifndef _KERNEL
#include <stdio.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define ATR_LEN_MIN 2
#define ATR_LEN_MAX 33
typedef enum atr_parsecode {
ATR_CODE_OK = 0,
ATR_CODE_TOO_SHORT,
ATR_CODE_TOO_LONG,
ATR_CODE_INVALID_TS,
ATR_CODE_OVERRUN,
ATR_CODE_UNDERRUN,
ATR_CODE_CHECKSUM_ERROR,
ATR_CODE_INVALID_TD1
} atr_parsecode_t;
typedef enum atr_protocol {
ATR_P_NONE = 0,
ATR_P_T0 = 1 << 0,
ATR_P_T1 = 1 << 1
} atr_protocol_t;
typedef enum atr_convention {
ATR_CONVENTION_DIRECT = 0x00,
ATR_CONVENTION_INVERSE = 0x01
} atr_convention_t;
typedef enum atr_clock_stop {
ATR_CLOCK_STOP_NONE = 0x00,
ATR_CLOCK_STOP_LOW = 0x01,
ATR_CLOCK_STOP_HI = 0x02,
ATR_CLOCK_STOP_BOTH = 0x03
} atr_clock_stop_t;
typedef enum atr_data_rate_choice {
ATR_RATE_UNSUPPORTED = 0x00,
ATR_RATE_USEDEFAULT = 0x01,
ATR_RATE_USEATR = 0x02,
ATR_RATE_USEATR_SETRATE = 0x03
} atr_data_rate_choice_t;
typedef enum atr_t1_checksum {
ATR_T1_CHECKSUM_LRC = 0x00,
ATR_T1_CHECKSUM_CRC = 0x01
} atr_t1_checksum_t;
typedef struct atr_data atr_data_t;
extern atr_data_t *atr_data_alloc(void);
extern void atr_data_free(atr_data_t *);
extern void atr_data_reset(atr_data_t *);
extern atr_parsecode_t atr_parse(const uint8_t *, size_t, atr_data_t *data);
extern const char *atr_strerror(atr_parsecode_t);
extern atr_protocol_t atr_supported_protocols(atr_data_t *);
extern boolean_t atr_params_negotiable(atr_data_t *);
extern atr_protocol_t atr_default_protocol(atr_data_t *);
extern uint8_t atr_fi_default_index(void);
extern uint8_t atr_di_default_index(void);
extern uint8_t atr_fi_index(atr_data_t *);
extern uint8_t atr_di_index(atr_data_t *);
extern atr_convention_t atr_convention(atr_data_t *);
extern uint8_t atr_extra_guardtime(atr_data_t *);
extern uint8_t atr_t0_wi(atr_data_t *);
extern atr_t1_checksum_t atr_t1_checksum(atr_data_t *);
extern uint8_t atr_t1_bwi(atr_data_t *);
extern uint8_t atr_t1_cwi(atr_data_t *);
extern atr_clock_stop_t atr_clock_stop(atr_data_t *);
extern uint8_t atr_t1_ifsc(atr_data_t *);
extern atr_data_rate_choice_t atr_data_rate(atr_data_t *, ccid_class_descr_t *,
uint32_t *, uint_t, uint32_t *);
#ifndef _KERNEL
extern void atr_data_hexdump(const uint8_t *, size_t, FILE *);
extern void atr_data_dump(atr_data_t *, FILE *);
#endif
extern const char *atr_protocol_to_string(atr_protocol_t);
extern uint_t atr_fi_index_to_value(uint8_t);
extern const char *atr_fi_index_to_string(uint8_t);
extern const char *atr_fmax_index_to_string(uint8_t);
extern uint_t atr_di_index_to_value(uint8_t);
extern const char *atr_di_index_to_string(uint8_t);
extern const char *atr_clock_stop_to_string(atr_clock_stop_t);
extern const char *atr_convention_to_string(atr_convention_t);
#define PPS_BUFFER_MAX 6
extern uint_t atr_pps_generate(uint8_t *, size_t, atr_protocol_t, boolean_t,
uint8_t, uint8_t, boolean_t, uint8_t);
extern boolean_t atr_pps_valid(void *, size_t, void *, size_t);
extern boolean_t atr_pps_fidi_accepted(void *, size_t);
#ifdef __cplusplus
}
#endif
#endif