#ifndef _SYS_USB_CCID_H
#define _SYS_USB_CCID_H
#include <sys/stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum ccid_class_voltage {
CCID_CLASS_VOLT_AUTO = 0x00,
CCID_CLASS_VOLT_5_0 = 0x01,
CCID_CLASS_VOLT_3_0 = 0x02,
CCID_CLASS_VOLT_1_8 = 0x04
} ccid_class_voltage_t;
typedef enum ccid_class_mechanical {
CCID_CLASS_MECH_CARD_ACCEPT = 0x01,
CCID_CLASS_MECH_CARD_EJECT = 0x02,
CCID_CLASS_MECH_CARD_CAPTURE = 0x04,
CCID_CLASS_MECH_CARD_LOCK = 0x08
} ccid_class_mechanical_t;
typedef enum ccid_class_features {
CCID_CLASS_F_AUTO_PARAM_ATR = 0x00000002,
CCID_CLASS_F_AUTO_ICC_ACTIVATE = 0x00000004,
CCID_CLASS_F_AUTO_ICC_VOLTAGE = 0x00000008,
CCID_CLASS_F_AUTO_ICC_CLOCK = 0x00000010,
CCID_CLASS_F_AUTO_BAUD = 0x00000020,
CCID_CLASS_F_AUTO_PARAM_NEG = 0x00000040,
CCID_CLASS_F_AUTO_PPS = 0x00000080,
CCID_CLASS_F_ICC_CLOCK_STOP = 0x00000100,
CCID_CLASS_F_ALTNAD_SUP = 0x00000200,
CCID_CLASS_F_AUTO_IFSD = 0x00000400,
CCID_CLASS_F_TPDU_XCHG = 0x00010000,
CCID_CLASS_F_SHORT_APDU_XCHG = 0x00020000,
CCID_CLASS_F_EXT_APDU_XCHG = 0x00040000,
CCID_CLASS_F_WAKE_UP = 0x00100000
} ccid_class_features_t;
typedef enum ccid_class_pin {
CCID_CLASS_PIN_VERIFICATION = 0x01,
CCID_CLASS_PIN_MODIFICATION = 0x02
} ccid_class_pin_t;
typedef struct ccid_class_descr {
uint8_t ccd_bLength;
uint8_t ccd_bDescriptorType;
uint16_t ccd_bcdCCID;
uint8_t ccd_bMaxSlotIndex;
uint8_t ccd_bVoltageSupport;
uint32_t ccd_dwProtocols;
uint32_t ccd_dwDefaultClock;
uint32_t ccd_dwMaximumClock;
uint8_t ccd_bNumClockSupported;
uint32_t ccd_dwDataRate;
uint32_t ccd_dwMaxDataRate;
uint8_t ccd_bNumDataRatesSupported;
uint32_t ccd_dwMaxIFSD;
uint32_t ccd_dwSyncProtocols;
uint32_t ccd_dwMechanical;
uint32_t ccd_dwFeatures;
uint32_t ccd_dwMaxCCIDMessageLength;
uint8_t ccd_bClassGetResponse;
uint8_t ccd_bClassEnvelope;
uint16_t ccd_wLcdLayout;
uint8_t ccd_bPinSupport;
uint8_t ccd_bMaxCCIDBusySlots;
} ccid_class_descr_t;
#define CCID_VERSION_MAJOR(ver) (((ver) & 0xff00) >> 8)
#define CCID_VERSION_MINOR(ver) ((ver) & 0x00ff)
#define CCID_VERSION_ONE 0x01
typedef struct ccid_params_t0 {
uint8_t cp0_bmFindexDindex;
uint8_t cp0_bmTCCKST0;
uint8_t cp0_bGuardTimeT0;
uint8_t cp0_bWaitingIntegerT0;
uint8_t cp0_bClockStop;
} __packed ccid_params_t0_t;
#define CCID_P_TCCKST0_DIRECT 0x00
#define CCID_P_TCCKST0_INVERSE 0x02
typedef struct ccid_params_t1 {
uint8_t cp1_bmFindexDindex;
uint8_t cp1_bmTCCKST1;
uint8_t cp1_bGuardTimeT1;
uint8_t cp1_bmWaitingIntegersT1;
uint8_t cp1_bClockStop;
uint8_t cp1_bIFSC;
uint8_t cp1_bNadValue;
} __packed ccid_params_t1_t;
typedef union ccid_params {
ccid_params_t0_t ccp_t0;
ccid_params_t1_t ccp_t1;
} ccid_params_t;
#define CCID_P_FI_DI(fi, di) ((((fi) & 0x0f) << 4) | ((di) & 0x0f))
#ifdef _KERNEL
#define CCID_DESCR_TYPE 0x21
#define CCID_DESCR_LENGTH 0x36
#define CCID_SEQ_MIN 0x01
#define CCID_SEQ_MAX UINT8_MAX
typedef enum ccid_intr_code {
CCID_INTR_CODE_SLOT_CHANGE = 0x50,
CCID_INTR_CODE_HW_ERROR = 0x51
} ccid_intr_code_t;
typedef enum ccid_intr_hwerr_code {
CCID_INTR_HWERR_OVERCURRENT = 0x01
} ccid_intr_hwerr_code_t;
typedef struct ccid_intr_slot {
uint8_t cis_type;
uint8_t cis_state[];
} ccid_intr_slot_t;
typedef struct ccid_intr_hwerr {
uint8_t cih_type;
uint8_t cih_slot;
uint8_t cih_seq;
uint8_t cih_code;
} ccid_intr_hwerr_t;
typedef enum ccid_request_code {
CCID_REQUEST_POWER_ON = 0x62,
CCID_REQUEST_POWER_OFF = 0x63,
CCID_REQUEST_SLOT_STATUS = 0x65,
CCID_REQUEST_TRANSFER_BLOCK = 0x6f,
CCID_REQUEST_GET_PARAMS = 0x6c,
CCID_REQUEST_RESET_PARAMS = 0x6d,
CCID_REQUEST_SET_PARAMS = 0x61,
CCID_REQUEST_ESCAPE = 0x6b,
CCID_REQUEST_ICC_CLOCK = 0x6e,
CCID_REQUEST_T0APDU = 0x6a,
CCID_REQUEST_SECURE = 0x69,
CCID_REQUEST_MECHANICAL = 0x71,
CCID_REQEUST_ABORT = 0x72,
CCID_REQUEST_DATA_CLOCK = 0x73
} ccid_request_code_t;
typedef enum ccid_response_code {
CCID_RESPONSE_DATA_BLOCK = 0x80,
CCID_RESPONSE_SLOT_STATUS = 0x81,
CCID_RESPONSE_PARAMETERS = 0x82,
CCID_RESPONSE_ESCAPE = 0x83,
CCID_RESPONSE_DATA_CLOCK = 0x84
} ccid_response_code_t;
typedef struct ccid_header {
uint8_t ch_mtype;
uint32_t ch_length;
uint8_t ch_slot;
uint8_t ch_seq;
uint8_t ch_param0;
uint8_t ch_param1;
uint8_t ch_param2;
uint8_t ch_data[];
} __packed ccid_header_t;
typedef struct ccid_data_clock {
uint32_t cdc_clock;
uint32_t cdc_data;
} __packed ccid_data_clock_t;
#define CCID_REPLY_ICC(x) (x & 0x3)
#define CCID_REPLY_STATUS(x) ((x & 0xc0) >> 6)
typedef enum {
CCID_REPLY_ICC_ACTIVE = 0,
CCID_REPLY_ICC_INACTIVE,
CCID_REPLY_ICC_MISSING
} ccid_reply_icc_status_t;
typedef enum {
CCID_REPLY_STATUS_COMPLETE = 0,
CCID_REPLY_STATUS_FAILED,
CCID_REPLY_STATUS_MORE_TIME
} ccid_reply_command_status_t;
typedef enum ccid_command_err {
CCID_ERR_CMD_ABORTED = 0xff,
CCID_ERR_ICC_MUTE = 0xfe,
CCID_ERR_XFR_PARITY_ERROR = 0xfd,
CCID_ERR_XFR_OVERRUN = 0xfc,
CCID_ERR_HW_ERROR = 0xfb,
CCID_ERR_BAD_ATR_TS = 0xf8,
CCID_ERR_BAD_ATR_TCK = 0xf7,
CCID_ERR_ICC_PROTOCOL_NOT_SUPPORTED = 0xf6,
CCID_ERR_ICC_CLASS_NOT_SUPPORTED = 0xf5,
CCID_ERR_PROCEDURE_BYTE_CONFLICT = 0xf4,
CCID_ERR_DEACTIVATED_PROTOCOL = 0xf3,
CCID_ERR_BUSY_WITH_AUTO_SEQUENCE = 0xf2,
CCID_ERR_PIN_TIMEOUT = 0xf0,
CCID_ERR_PIN_CANCELLED = 0xef,
CCID_ERR_CMD_SLOT_BUSY = 0xe0,
CCID_ERR_CMD_NOT_SUPPORTED = 0x00
} ccid_command_err_t;
#define CCID_APDU_LEN_MAX 261
#endif
#ifdef __cplusplus
}
#endif
#endif