mirror of
https://github.com/azure-rtos/usbx.git
synced 2025-02-04 07:13:12 +08:00
1229 lines
62 KiB
C
1229 lines
62 KiB
C
/***************************************************************************
|
|
* Copyright (c) 2024 Microsoft Corporation
|
|
*
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the MIT License which is available at
|
|
* https://opensource.org/licenses/MIT.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
**************************************************************************/
|
|
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
/** */
|
|
/** USBX Component */
|
|
/** */
|
|
/** Device CCID Class */
|
|
/** */
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
|
|
/**************************************************************************/
|
|
/* */
|
|
/* COMPONENT DEFINITION RELEASE */
|
|
/* */
|
|
/* ux_device_class_ccid.h PORTABLE C */
|
|
/* 6.3.0 */
|
|
/* AUTHOR */
|
|
/* */
|
|
/* Chaoqiong Xiao, Microsoft Corporation */
|
|
/* */
|
|
/* DESCRIPTION */
|
|
/* */
|
|
/* This file defines the equivalences for the USBX Device Class CCID */
|
|
/* (Smart-Card Integrated Circuit(s) Card) component. */
|
|
/* */
|
|
/* RELEASE HISTORY */
|
|
/* */
|
|
/* DATE NAME DESCRIPTION */
|
|
/* */
|
|
/* 04-25-2022 Chaoqiong Xiao Initial Version 6.1.11 */
|
|
/* 03-08-2023 Chaoqiong Xiao Modified comment(s), */
|
|
/* added standalone support, */
|
|
/* resulting in version 6.2.1 */
|
|
/* 10-31-2023 Yajun xia, CQ Xiao Modified comment(s), */
|
|
/* added error checks support, */
|
|
/* resulting in version 6.3.0 */
|
|
/* */
|
|
/**************************************************************************/
|
|
|
|
#ifndef UX_DEVICE_CLASS_CCID_H
|
|
#define UX_DEVICE_CLASS_CCID_H
|
|
|
|
/* Determine if a C++ compiler is being used. If so, ensure that standard
|
|
C is used to process the API information. */
|
|
|
|
#ifdef __cplusplus
|
|
|
|
/* Yes, C++ compiler is present. Use standard C. */
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Internal option: enable the basic USBX error checking. This define is typically used
|
|
while debugging application. */
|
|
#if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_DEVICE_CLASS_CCID_ENABLE_ERROR_CHECKING)
|
|
#define UX_DEVICE_CLASS_CCID_ENABLE_ERROR_CHECKING
|
|
#endif
|
|
|
|
|
|
/* Notification/interrupt endpoint buffer size, must be larger than max packet size in framework, and aligned in 4-bytes. */
|
|
#define UX_DEVICE_CLASS_CCID_INTERRUPT_BUFFER_SIZE 16
|
|
|
|
/* Bulk endpoints buffer size, must be larger than dwMaxCCIDMessageLength and wMaxPacketSize in framework, and aligned in 4-bytes. */
|
|
#define UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE UX_SLAVE_REQUEST_DATA_MAX_LENGTH
|
|
|
|
|
|
#if !defined(UX_DEVICE_STANDALONE)
|
|
|
|
/* Define CCID max number of slots, 32 for 32 bit data width. */
|
|
#define UX_DEVICE_CLASS_CCID_MAX_N_SLOTS (4*8)
|
|
#else
|
|
|
|
/* To optimize the max number of slots fixed to 1. */
|
|
#define UX_DEVICE_CLASS_CCID_MAX_N_SLOTS 1
|
|
#endif
|
|
|
|
/* Thread stack size, for RTOS mode only. */
|
|
#define UX_DEVICE_CLASS_CCID_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
|
|
#define UX_DEVICE_CLASS_CCID_NOTIFY_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
|
|
#define UX_DEVICE_CLASS_CCID_RUNNER_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
|
|
|
|
/* Define CCID Class USB Class constants. */
|
|
#define UX_DEVICE_CLASS_CCID_CLASS 0x0B
|
|
|
|
#define UX_DEVICE_CLASS_CCID_SUBCLASS 0
|
|
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOL 0
|
|
|
|
#define UX_DEVICE_CLASS_CCID_BCD_CCID_1_10 0x0110
|
|
|
|
#define UX_DEVICE_CLASS_CCID_VOLTAGE_SUPPORT_5_0 1u
|
|
#define UX_DEVICE_CLASS_CCID_VOLTAGE_SUPPORT_3_0 2u
|
|
#define UX_DEVICE_CLASS_CCID_VOLTAGE_SUPPORT_1_8 4u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOLS_T0 1u
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOLS_T1 2u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_SYNCH_PROTOCOLS_2_WIRE 1u
|
|
#define UX_DEVICE_CLASS_CCID_SYNCH_PROTOCOLS_3_WIRE 2u
|
|
#define UX_DEVICE_CLASS_CCID_SYNCH_PROTOCOLS_I2C 4u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_MECHANICAL_NO_SPECIAL 0u
|
|
#define UX_DEVICE_CLASS_CCID_MECHANICAL_ACCEPT 1u
|
|
#define UX_DEVICE_CLASS_CCID_MECHANICAL_EJECT 2u
|
|
#define UX_DEVICE_CLASS_CCID_MECHANICAL_CAPTURE 4u
|
|
#define UX_DEVICE_CLASS_CCID_MECHANICAL_LOCK_UNLOCK 8u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_NO_SPECIAL 0u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_PARAMETER_ATR 2u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_ACTIVATION 4u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_VOLTAGE 8u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_CLOCK_FREQUENCY 0x10u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_BAUD_RATE 0x20u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_PARAMETER_NEGOTIATION 0x40u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_PPS 0x80u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_CAN_SET_ICC_IN_CLOCK_STOP 0x100u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_NAD_NOT_0_ACCEPTED 0x200u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_IFSD_EXCHANGE_1ST 0x400u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_TPUD_EXCHANGES 0x10000u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_SHORT_APUD_EXCHANGES 0x20000u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_SHORT_AND_EXTENDED_APUD_EXCHANGES 0x40000u
|
|
#define UX_DEVICE_CLASS_CCID_FEATURES_WAKEUP_ON_INSERTION_REMOVAL 0x100000u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_LCD_LAYOUT_NO_LCD 0
|
|
#define UX_DEVICE_CLASS_CCID_LCD_LAYOUT(n_lines,n_per_line) (((n_lines) << 8) | (n_per_line))
|
|
|
|
#define UX_DEVICE_CLASS_CCID_PIN_SUPPORT_VERIFICATION 1u
|
|
#define UX_DEVICE_CLASS_CCID_PIN_SUPPORT_MODIFICATION 2u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_MAX_CCID_MESSAGE_EXT_APDU_MIN (261+10)
|
|
#define UX_DEVICE_CLASS_CCID_MAX_CCID_MESSAGE_EXT_APDU_MAX (65544+10)
|
|
|
|
|
|
/* Device CCID Requests */
|
|
#define UX_DEVICE_CLASS_CCID_ABORT 0x01
|
|
#define UX_DEVICE_CLASS_CCID_GET_CLOCK_FREQUENCIES 0x02
|
|
#define UX_DEVICE_CLASS_CCID_GET_DATA_RATES 0x03
|
|
|
|
|
|
/* CCID message offsets, values. */
|
|
|
|
/* General. */
|
|
#define UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_LENGTH 10
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_MESSAGE_TYPE 0
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_LENGTH 1
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_SLOT 5
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_SEQ 6
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_DATA 10
|
|
|
|
/* PC_to_RDR_IccPowerOn. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_POWER_SELECT 7
|
|
#define UX_DEVICE_CLASS_CCID_POWER_SELECT_AUTO 0
|
|
#define UX_DEVICE_CLASS_CCID_POWER_SELECT_5_0_V 1
|
|
#define UX_DEVICE_CLASS_CCID_POWER_SELECT_3_0_V 2
|
|
#define UX_DEVICE_CLASS_CCID_POWER_SELECT_1_8_V 3
|
|
|
|
/* PC_to_RDR_XfrBlock/PC_to_RDR_Secure. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_BWI 7
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_LEVEL_PARAMETER 8
|
|
#define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_RFU 0x00u
|
|
#define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_BEGIN_END 0x00u
|
|
#define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_BEGIN_CONTINUE 0x01u
|
|
#define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_CONTINUE_END 0x02u
|
|
#define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_CONTINUE 0x03u
|
|
#define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_EMPTY_DATA 0x10u
|
|
|
|
/* PC_to_RDR_SetParameters. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_SET_PARAMETERS_PROTOCOL_NUM 7
|
|
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOL_T_0 0
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOL_T_1 1
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOL_2_WIRE 0x80
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOL_3_WIRE 0x81
|
|
#define UX_DEVICE_CLASS_CCID_PROTOCOL_I2C 0x82
|
|
|
|
/* Parameters. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_FI_DI 10
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_TCCKS_T0 11
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_GUARD_TIME_T0 12
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_WAITING_INTEGER_T0 13
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_STOP_T0 14
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_TCCKS_T1 11
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_GUARD_TIME_T1 12
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_WAITING_INTEGERS_T1 13
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_STOP_T1 14
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_IFSC 15
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_NAD_VALUE 16
|
|
|
|
/* PC_to_RDR_IccClock. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_COMMAND 7
|
|
#define UX_DEVICE_CLASS_CCID_CLOCK_COMMAND_RESTART 0
|
|
#define UX_DEVICE_CLASS_CCID_CLOCK_COMMAND_STOP 1
|
|
|
|
/* PC_to_RDR_T0APDU. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CHANGES 7
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CLASS_GET_RESPONSE 8
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CLASS_ENVELOPE 9
|
|
#define UX_DEVICE_CLASS_CCID_CHANGE_CLASS_GET_RESPONSE (1u << 0)
|
|
#define UX_DEVICE_CLASS_CCID_CHANGE_CLASS_ENVELOPE (1u << 1)
|
|
|
|
/* PC_to_RDR_Secure. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_OPERATION 10
|
|
#define UX_DEVICE_CLASS_CCID_PIN_VERIFICATION 0
|
|
#define UX_DEVICE_CLASS_CCID_PIN_MODIFICATION 1
|
|
#define UX_DEVICE_CLASS_CCID_PIN_TRANSFER 2
|
|
#define UX_DEVICE_CLASS_CCID_PIN_WAIT_ICC_RESP 3
|
|
#define UX_DEVICE_CLASS_CCID_PIN_CANCEL 4
|
|
#define UX_DEVICE_CLASS_CCID_PIN_RESEND_I_BLOCK 5
|
|
#define UX_DEVICE_CLASS_CCID_PIN_NEXT_APDU 6
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_DATA 11
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_TIME_OUT 11
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_FORMAT_STRING 12
|
|
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_FORMAT_TYPE_MASK (0x3u << 0)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_BINARY (0x0u << 0)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_BCD (0x1u << 0)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_ASCII (0x2u << 0)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_JUSTIFICATION (0x1u << 2)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_LEFT_JUSTIFY (0x0u << 2)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_RIGHT_JUSTIFY (0x1u << 2)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_POSITION_MASK (0xFu << 3)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_POSITION(v) (((v) >> 3) & 0xFu)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_UNIT_TYPE (0x1u << 7)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_UNIT_BITS (0x0u << 7)
|
|
#define UX_DEVICE_CLASS_CCID_FORMAT_STRING_UNIT_BYTES (0x1u << 7)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_PIN_BLOCK_STRING 13
|
|
#define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_LENGTH_BITS_MASK (0xFu << 3)
|
|
#define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_BLOCK_SIZE_BYTES_MASK (0xFu << 0)
|
|
#define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_LENGTH_BITS(v) ((v) >> 4) & 0xFu)
|
|
#define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_BLOCK_SIZE_BYTES(v) ((v) >> 0) & 0xFu)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_PIN_LENGTH_FORMAT 14
|
|
#define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_UNIT_TYPE (1u << 4)
|
|
#define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_UNIT_BITS (0u << 4)
|
|
#define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_UNIT_BYTES (1u << 4)
|
|
#define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_POSITION_MASK (0xFu << 0)
|
|
#define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_POSITION(v) (((v) << 0) & 0xFu)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_TIME_OUT 11
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_FORMAT_STRING 12
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_BLOCK_STRING 13
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_LENGTH_FORMAT 14
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_MAX_EXTRA_DIGIT 15
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_MAX_EXTRA_DIGIT_MIN 16
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_MAX_EXTRA_DIGIT_MAX 15
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_ENTRY_VALIDATION_CONDITION 17
|
|
#define UX_DEVICE_CLASS_CCID_PIN_ENTRY_VALIDATION_MAX_SIZE 1u
|
|
#define UX_DEVICE_CLASS_CCID_PIN_ENTRY_VALIDATION_KEY_PRESS 2u
|
|
#define UX_DEVICE_CLASS_CCID_PIN_ENTRY_VALIDATION_TIMEOUT 4u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_NUMBER_MESSAGE 18
|
|
#define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_NO 0
|
|
#define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_1 0
|
|
#define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_2 0
|
|
#define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_3 0
|
|
#define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_DEFAULT 0xFF
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_LANG_ID 19
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_MSG_INDEX 21
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_TEO_PROLOGUE 22
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_APDU 25
|
|
|
|
#define UX_DEVICE_CLASS_CCID_PIN_MESSAGE_INSERT_PROMPT 0
|
|
#define UX_DEVICE_CLASS_CCID_PIN_MESSAGE_MODIFY_PROMPT 1
|
|
#define UX_DEVICE_CLASS_CCID_PIN_MESSAGE_NEW_CONFIRM_PROMPT 2
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TIME_OUT 11
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_FORMAT_STRING 12
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_BLOCK_STRING 13
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_LENGTH_FORMAT 14
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_INSERTION_OFFSET_OLD 15
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_INSERTION_OFFSET_NEW 16
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_MAX_EXTRA_DIGIT 17
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_MAX_EXTRA_DIGIT_MIN 18
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_MAX_EXTRA_DIGIT_MAX 17
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_CONFIRM_PIN 19
|
|
#define UX_DEVICE_CLASS_CCID_CONFIRM_PIN_CONFIRM_REQUESTED (1u << 0)
|
|
#define UX_DEVICE_CLASS_CCID_CONFIRM_PIN_ENTRY_REQUESTED (1u << 1)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_ENTRY_VALIDATION_CONDITION 20
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_NUMBER_MESSAGE 21
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_LANG_ID 22
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_MSG_INDEX1 24
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_MSG_INDEX2 25
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_MSG_INDEX3 26
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TEO_PROLOGUE1 25
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TEO_PROLOGUE2 26
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TEO_PROLOGUE3 27
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_APDU1 28
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_APDU2 29
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_APDU3 30
|
|
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PIN_NEXT_APDU_TEO_PROLOGUE 11
|
|
|
|
/* PC_to_RDR_Mechanical. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_FUNCTION 7
|
|
#define UX_DEVICE_CLASS_CCID_FUNCTION_ACCEPT_CARD 0x01
|
|
#define UX_DEVICE_CLASS_CCID_FUNCTION_EJECT_CARD 0x02
|
|
#define UX_DEVICE_CLASS_CCID_FUNCTION_CAPTURE_CARD 0x03
|
|
#define UX_DEVICE_CLASS_CCID_FUNCTION_LOCK_CARD 0x04
|
|
#define UX_DEVICE_CLASS_CCID_FUNCTION_UNLOCK_CARD 0x05
|
|
|
|
/* PC_to_RDR_SetDataRateAndClockFrequency/RDR_to_PC_DataRateAndClockFrequency. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_FREQUENCY 10
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_DATA_RATE 14
|
|
|
|
/* RDR_to_PC_ */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_STATUS 7
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_ERROR 8
|
|
|
|
/* RDR_to_PC_DataBlock. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CHAIN_PARAMETER 9
|
|
#define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_BEGIN_END 0x00
|
|
#define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_BEGIN_CONTINUE 0x01
|
|
#define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_CONTINUE_END 0x02
|
|
#define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_CONTINUE 0x03
|
|
#define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_EMPTY 0x10
|
|
|
|
/* RDR_to_PC_SlotStatus. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_STATUS 9
|
|
|
|
/* RDR_to_PC_Parameters. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_PARAMETERS_PROTOCOL_NUM 9
|
|
|
|
#define UX_DEVICE_CLASS_CCID_PARAMETERS_T0_LENGTH 5
|
|
#define UX_DEVICE_CLASS_CCID_PARAMETERS_T1_LENGTH 7
|
|
|
|
/* RDR_to_PC_NotifySlotChange. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_SLOT_ICC_STATE 1
|
|
|
|
/* RDR_to_PC_HardwareError. */
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_HW_ERROR_SLOT 1
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_HW_ERROR_SEQ 2
|
|
#define UX_DEVICE_CLASS_CCID_OFFSET_HW_ERROR_CODE 3
|
|
#define UX_DEVICE_CLASS_CCID_HW_ERROR_OVERCURRENT 1
|
|
|
|
|
|
/* CCID bMessageTypes. */
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON 0x62
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_OFF 0x63
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_SLOT_STATUS 0x64
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK 0x6F
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_PARAMETERS 0x6C
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_RESET_PARAMETERS 0x6D
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS 0x61
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ESCAPE 0x6B
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK 0x6E
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU 0x6A
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE 0x69
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL 0x71
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ABORT 0x72
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQ 0x73
|
|
|
|
#define UX_DEVICE_CLASS_CCID_N_COMMANDS 14
|
|
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK 0x80
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS 0x81
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS 0x82
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_ESCAPE 0x83
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQ 0x84
|
|
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_NOTIFY_SLOT_CHANGE 0x50
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_HARDWARE_ERROR 0x51
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_ABORTABLE(bMessageType) \
|
|
(((bMessageType) == 0x62) || ((bMessageType) == 0x6F) || \
|
|
((bMessageType) == 0x6B) || ((bMessageType) == 0x69) || \
|
|
((bMessageType) == 0x71) || ((bMessageType) == 0x72))
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_HW_ERROR_CHECK(bMessageType) \
|
|
(((bMessageType) != 0x63) && ((bMessageType) != 0x6B) && \
|
|
((bMessageType) != 0x6A) && ((bMessageType) != 0x72) && \
|
|
((bMessageType) != 0x73))
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_AUTO_SEQUENCE_CHECK(bMessageType) \
|
|
(((bMessageType) != 0x62) && ((bMessageType) != 0x65) && \
|
|
((bMessageType) != 0x6B) && ((bMessageType) != 0x6A) && \
|
|
((bMessageType) != 0x72) && ((bMessageType) != 0x73))
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_BLOCK(m) \
|
|
((m) == 0x62 || (m) == 0x6F || (m) == 0x69)
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_RESP_SLOT_STATUS(m) \
|
|
((m) == 0x63 || (m) == 0x64 || (m) == 0x6E || (m) == 0x6A || \
|
|
(m) == 0x71 || (m) == 0x72 || (m) == 0x65)
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_RESP_PARAMETERS(m) \
|
|
((m) == 0x6C || (m) == 0x6D || (m) == 0x61)
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_RESP_ESCAPE(m) \
|
|
((m) == 0x6B)
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_RATE_AND_CLOCK_FREQ(m) \
|
|
((m) == 0x73)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_RESP_TYPE(m) \
|
|
(UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_BLOCK(m) ? 0x80 : \
|
|
UX_DEVICE_CLASS_CCID_COMMAND_RESP_SLOT_STATUS(m) ? 0x81 : \
|
|
UX_DEVICE_CLASS_CCID_COMMAND_RESP_PARAMETERS(m) ? 0x82 : \
|
|
UX_DEVICE_CLASS_CCID_COMMAND_RESP_ESCAPE(m) ? 0x83 : \
|
|
UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_RATE_AND_CLOCK_FREQ(m) ? 0x84 : \
|
|
0)
|
|
|
|
/* CCID Slot error binary code. */
|
|
#define UX_DEVICE_CLASS_CCID_CMD_ABORTED 0xFF
|
|
#define UX_DEVICE_CLASS_CCID_ICC_MUTE 0xFE
|
|
#define UX_DEVICE_CLASS_CCID_XFR_PARITY_ERROR 0xFD
|
|
#define UX_DEVICE_CLASS_CCID_XFR_OVERRUN 0xFC
|
|
#define UX_DEVICE_CLASS_CCID_HW_ERROR 0xFB
|
|
#define UX_DEVICE_CLASS_CCID_BAD_ATR_TS 0xF8
|
|
#define UX_DEVICE_CLASS_CCID_BAD_ATR_TCK 0xF7
|
|
#define UX_DEVICE_CLASS_CCID_ICC_PROTOCOL_NOT_SUPPORTED 0xF6
|
|
#define UX_DEVICE_CLASS_CCID_ICC_CLASS_NOT_SUPPORTED 0xF5
|
|
#define UX_DEVICE_CLASS_CCID_PROCEDURE_BYTE_CONFLICT 0xF4
|
|
#define UX_DEVICE_CLASS_CCID_DEACTIVATED_PROTOCOL 0xF3
|
|
#define UX_DEVICE_CLASS_CCID_BUSY_WITH_AUTO_SEQUENCE 0xF2
|
|
#define UX_DEVICE_CLASS_CCID_PIN_TIMEOUT 0xF0
|
|
#define UX_DEVICE_CLASS_CCID_PIN_CANCELLED 0xEF
|
|
#define UX_DEVICE_CLASS_CCID_CMD_SLOT_BUSY 0xE0
|
|
|
|
|
|
/* CCID bStatus. */
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_TIME_EXTENSION 0x80
|
|
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_ACTIVE (0x0u)
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_INACTIVE (0x1u)
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_NOT_PRESENT (0x2u)
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_MASK (0x3u)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_NO_ERROR (0x0u << 6)
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_FAILED (0x1u << 6)
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_TIME_EXTENSION (0x2u << 6)
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_MASK (0x3u << 6)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_SLOT_STATUS(bmICCStatus, bmCommandStatus) ((bmICCStatus) | ((bmCommandStatus) << 6))
|
|
#define UX_DEVICE_CLASS_CCID_ICC_ACTIVE 0
|
|
#define UX_DEVICE_CLASS_CCID_ICC_INACTIVE 1
|
|
#define UX_DEVICE_CLASS_CCID_ICC_NOT_PRESENT 2
|
|
#define UX_DEVICE_CLASS_CCID_CMD_NO_ERROR 0
|
|
#define UX_DEVICE_CLASS_CCID_CMD_FAILED 1
|
|
#define UX_DEVICE_CLASS_CCID_CMD_TIME_EXTENSION 2
|
|
|
|
|
|
/* CCID events. */
|
|
#define UX_DEVICE_CLASS_CCID_EVENT_SLOT(n) (1u<<(n))
|
|
|
|
|
|
/* CCID flags. */
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_ABORTABLE 0x80u
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_BUSY 0x40u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_NOTIFY_CHANGE 0x01u
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_NOTIFY_HW_ERROR 0x02u
|
|
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_AUTO_SEQUENCING 0x04u
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_HW_ERROR 0x08u
|
|
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_FLAG_ABORTABLE(bMessageType) \
|
|
(UX_DEVICE_CLASS_CCID_COMMAND_ABORTABLE(bMessageType) ? \
|
|
UX_DEVICE_CLASS_CCID_FLAG_ABORTABLE : 0)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_FLAG_AUTO_SEQUENCE_CHECK(bMessageType) \
|
|
(UX_DEVICE_CLASS_CCID_COMMAND_AUTO_SEQUENCE_CHECK(bMessageType) ? \
|
|
UX_DEVICE_CLASS_CCID_FLAG_AUTO_SEQUENCING : 0)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_FLAG_HW_ERROR_CHECK(bMessageType) \
|
|
(UX_DEVICE_CLASS_CCID_COMMAND_HW_ERROR_CHECK(bMessageType) ? \
|
|
UX_DEVICE_CLASS_CCID_FLAG_HW_ERROR : 0)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_COMMAND_FLAGS(bMessageType) \
|
|
(UX_DEVICE_CLASS_CCID_COMMAND_FLAG_ABORTABLE(bMessageType) | \
|
|
UX_DEVICE_CLASS_CCID_COMMAND_FLAG_AUTO_SEQUENCE_CHECK(bMessageType) | \
|
|
UX_DEVICE_CLASS_CCID_COMMAND_FLAG_HW_ERROR_CHECK(bMessageType))
|
|
|
|
|
|
/* CCID message structures. */
|
|
|
|
/* General message for both PC_to_RDR and RDR_to_PC. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_MESSAGES_STRUCT
|
|
{
|
|
UCHAR *ux_device_class_ccid_messages_pc_to_rdr;
|
|
UCHAR *ux_device_class_ccid_messages_rdr_to_pc;
|
|
ULONG ux_device_class_ccid_messages_rdr_to_pc_length; /* Total buffer length including header. */
|
|
} UX_DEVICE_CLASS_CCID_MESSAGES;
|
|
|
|
/* Define CCID message header. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bRFU[3];
|
|
} UX_DEVICE_CLASS_CCID_MESSAGE_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_MESSAGE_TYPE(msg) (((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->bMessageType)
|
|
#define UX_DEVICE_CLASS_CCID_MESSAGE_LENGTH_GET(msg) _ux_utility_long_get(((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->dwLength)
|
|
#define UX_DEVICE_CLASS_CCID_MESSAGE_LENGTH_SET(msg,len) _ux_utility_long_put(((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->dwLength, (len))
|
|
#define UX_DEVICE_CLASS_CCID_MESSAGE_SLOT(msg) (((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->bSlot)
|
|
#define UX_DEVICE_CLASS_CCID_MESSAGE_SEQ(msg) (((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->bSeq)
|
|
#define UX_DEVICE_CLASS_CCID_MESSAGE_DATA(msg) (((UCHAR *)(msg) + UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_LENGTH))
|
|
|
|
/* Define CCID PC_to_RDR_IccPowerOn. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bPowerSelect;
|
|
UCHAR bRFU[2];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_POWER_SELECT(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON_HEADER*)(msg))->bPowerSelect)
|
|
|
|
/* Define CCID PC_to_RDR_IccPowerOff. */
|
|
typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_OFF_HEADER;
|
|
|
|
/* Define CCID PC_to_RDR_GetSlotStatus. */
|
|
typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_SLOT_STATUS_HEADER;
|
|
|
|
/* Define CCID PC_to_RDR_XfrBlock. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bBWI;
|
|
USHORT wLevelParameter;
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_BWI(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER*)(msg))->bBWI)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_LEVEL_PARAMETER(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER*)(msg))->wLevelParameter)
|
|
|
|
/* Define CCID PC_to_RDR_GetParameters. */
|
|
typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_PARAMETERS_HEADER;
|
|
|
|
/* Define CCID PC_to_RDR_ResetParameters. */
|
|
typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_RESET_PARAMETERS_HEADER;
|
|
|
|
/* Define CCID PC_to_RDR_SetParameters. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bProtocolNum;
|
|
UCHAR bRFU[2];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PROTOCOL_NUM(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_HEADER*)(msg))->bProtocolNum)
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T0_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bProtocolNum;
|
|
UCHAR bRFU[2];
|
|
UCHAR bmFindexDindex;
|
|
UCHAR bmTCCKST0;
|
|
UCHAR bGuardTimeT0;
|
|
UCHAR bWaitingIntegerT0;
|
|
UCHAR bClockStop;
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T0;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T0_LENGTH 5
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T1_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bProtocolNum;
|
|
UCHAR bRFU[2];
|
|
UCHAR bmFindexDindex;
|
|
UCHAR bmTCCKST1;
|
|
UCHAR bGuardTimeT1;
|
|
UCHAR bmWaitingIntegersT1;
|
|
UCHAR bClockStop;
|
|
UCHAR bIFSC;
|
|
UCHAR bNadValue;
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T1;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T1_LENGTH 7
|
|
|
|
/* Define CCID PC_to_RDR_Escape. */
|
|
typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_ESCAPE_HEADER;
|
|
|
|
/* Define CCID PC_to_RDR_IccClock. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bClockCommand;
|
|
UCHAR bRFU[2];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_CLOCK_COMMAND(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK_HEADER*)(msg))->bClockCommand)
|
|
|
|
/* Define CCID PC_to_RDR_T0APDU. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bmChanges;
|
|
UCHAR bClassGetResponse;
|
|
UCHAR bClassEnvelope;
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_CHANGES(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER*)(msg))->bmChanges)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_CLASS_GET_RESP(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER*)(msg))->bClassGetResponse)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_CLASS_ENVELOPE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER*)(msg))->bClassEnvelope)
|
|
|
|
/* Define CCID PC_to_RDR_Secure. */
|
|
typedef UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_HEADER;
|
|
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bBWI;
|
|
USHORT wLevelParameter;
|
|
UCHAR bPINOperation;
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_BWI(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER*)(msg))->bBWI)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_LEVEL_PARAMETER(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER*)(msg))->wLevelParameter)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_OPERATION(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER*)(msg))->bPINOperation)
|
|
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bBWI;
|
|
USHORT wLevelParameter;
|
|
UCHAR bPINOperation;
|
|
|
|
UCHAR bTimeOut;
|
|
UCHAR bmFormatString;
|
|
UCHAR bmPINBlockString;
|
|
UCHAR bmPINLengthFormat;
|
|
|
|
UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
|
|
UCHAR bEntryValidationCondition;
|
|
UCHAR bNumberMessage;
|
|
UCHAR wLangId[2];
|
|
UCHAR bMsgIndex;
|
|
UCHAR bTeoPrologue[3];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_TIMEOUT(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bTimeOut)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_FORMAT_STRING(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bmFormatString)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_BLOCK_STRING(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bmPINBlockString)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_LENGTH_FORMAT(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bmPINLengthFormat)
|
|
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_PIN_MAX_EXTRA_DIGIT(msg) _ux_utility_short_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wPINMaxExtraDigit)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_PIN_MIN_PIN_SIZE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wPINMaxExtraDigit[1])
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_PIN_MAX_PIN_SIZE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wPINMaxExtraDigit[0])
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_ENTRY_VALIDATION_CONDITION(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bEntryValidationCondition)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_NUMBER_MESSAGE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bNumberMessage)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_LANG_ID(msg) _ux_utility_short_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wLangId)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_MESSAGE_INDEX(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bMsgIndex)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_TEO_PROLOGUE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bTeoPrologue)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_DATA(msg) ((UCHAR*)(msg) + 25)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_APDU(msg) ((UCHAR*)(msg) + 25)
|
|
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bBWI;
|
|
USHORT wLevelParameter;
|
|
UCHAR bPINOperation;
|
|
|
|
UCHAR bTimeOut;
|
|
UCHAR bmFormatString;
|
|
UCHAR bmPINBlockString;
|
|
UCHAR bmPINLengthFormat;
|
|
|
|
UCHAR bInsertionOffsetOld;
|
|
UCHAR bInsertionOffsetNew;
|
|
UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
|
|
UCHAR bConfirmPIN;
|
|
UCHAR bEntryValidationCondition;
|
|
UCHAR bNumberMessage;
|
|
UCHAR wLangId[2];
|
|
UCHAR bMsgIndex1;
|
|
UCHAR bTeoPrologue[3];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION;
|
|
typedef UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1_TEO_PROLOGUE(msg) ((UCHAR*)(msg) + 25)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1_DATA(msg) ((UCHAR*)(msg) + 28)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1_APDU(msg) ((UCHAR*)(msg) + 28)
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bBWI;
|
|
USHORT wLevelParameter;
|
|
UCHAR bPINOperation;
|
|
UCHAR bTimeOut;
|
|
UCHAR bmFormatString;
|
|
UCHAR bmPINBlockString;
|
|
UCHAR bmPINLengthFormat;
|
|
UCHAR bInsertionOffsetOld;
|
|
UCHAR bInsertionOffsetNew;
|
|
UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
|
|
UCHAR bConfirmPIN;
|
|
UCHAR bEntryValidationCondition;
|
|
UCHAR bNumberMessage;
|
|
UCHAR wLangId[2];
|
|
UCHAR bMsgIndex1;
|
|
UCHAR bMsgIndex2;
|
|
UCHAR bTeoPrologue[3];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_TEO_PROLOGUE(msg) ((UCHAR*)(msg) + 26)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_DATA(msg) ((UCHAR*)(msg) + 29)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_APDU(msg) ((UCHAR*)(msg) + 29)
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bBWI;
|
|
USHORT wLevelParameter;
|
|
UCHAR bPINOperation;
|
|
UCHAR bTimeOut;
|
|
UCHAR bmFormatString;
|
|
UCHAR bmPINBlockString;
|
|
UCHAR bmPINLengthFormat;
|
|
UCHAR bInsertionOffsetOld;
|
|
UCHAR bInsertionOffsetNew;
|
|
UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
|
|
UCHAR bConfirmPIN;
|
|
UCHAR bEntryValidationCondition;
|
|
UCHAR bNumberMessage;
|
|
UCHAR wLangId[2];
|
|
UCHAR bMsgIndex1;
|
|
UCHAR bMsgIndex2;
|
|
UCHAR bMsgIndex3;
|
|
UCHAR bTeoPrologue[3];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_TEO_PROLOGUE(msg) ((UCHAR*)(msg) + 27)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_DATA(msg) ((UCHAR*)(msg) + 30)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_APDU(msg) ((UCHAR*)(msg) + 30)
|
|
|
|
|
|
/* Define CCID PC_to_RDR_Mechanical. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bFunction;
|
|
UCHAR bRFU[2];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_FUNCTION(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_HEADER*)(msg))->bFunction)
|
|
|
|
/* Define CCID PC_to_RDR_Abort. */
|
|
typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_ABORT_HEADER;
|
|
|
|
/* Define CCID PC_to_RDR_SetDataRateAndClockFrequency. */
|
|
typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY_HEADER;
|
|
typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bRFU[3];
|
|
UCHAR dwClockFrequency[4];
|
|
UCHAR dwDataRate[4];
|
|
} UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY;
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_CLOCK_FREQUENCY_GET(msg) _ux_utility_long_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwClockFrequency)
|
|
#define UX_DEVICE_CLASS_CCID_PC_TO_RDR_DATA_RATE_GET(msg) _ux_utility_long_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwDataRate)
|
|
|
|
/* Define CCID RDR_to_PC_ header. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bStatus;
|
|
UCHAR bError;
|
|
UCHAR bRFU;
|
|
} UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_STATUS(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER*)(msg))->bStatus)
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_ERROR(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER*)(msg))->bError)
|
|
|
|
/* Define CCID Slot Status Register. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_SLOT_STATUS_REGISTER_BITMAP_STRUCT
|
|
{
|
|
UCHAR bmICCStatus:2;
|
|
UCHAR bmRFU:4;
|
|
UCHAR bmCommandStatus:2;
|
|
} UX_DEVICE_CLASS_CCID_SLOT_STATUS_REGISTER_BITMAP;
|
|
|
|
/* Define CCID RDR_to_PC_DataBlock. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bStatus;
|
|
UCHAR bError;
|
|
UCHAR bChainParameter;
|
|
} UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_CHAIN_PARAMETER(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK_HEADER*)(msg))->bChainParameter)
|
|
|
|
/* Define CCID RDR_to_PC_SlotStatus. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bStatus;
|
|
UCHAR bError;
|
|
UCHAR bClockStatus;
|
|
} UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_CLOCK_STATUS(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS_HEADER*)(msg))->bClockStatus)
|
|
|
|
/* Define CCID RDR_to_PC_Parameters. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_HEADER_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bStatus;
|
|
UCHAR bError;
|
|
UCHAR bProtocolNum;
|
|
} UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_HEADER;
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PROTOCOL_NUM(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_HEADER*)(msg))->bProtocolNum)
|
|
|
|
typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T0_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bStatus;
|
|
UCHAR bError;
|
|
UCHAR bProtocolNum;
|
|
UCHAR bmFindexDindex;
|
|
UCHAR bmTCCKST0;
|
|
UCHAR bGuardTimeT0;
|
|
UCHAR bWaitingIntegerT0;
|
|
UCHAR bClockStop;
|
|
} UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T0;
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T0_LENGTH 5
|
|
|
|
typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T1_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bStatus;
|
|
UCHAR bError;
|
|
UCHAR bProtocolNum;
|
|
UCHAR bmFindexDindex;
|
|
UCHAR bmTCCKST1;
|
|
UCHAR bGuardTimeT1;
|
|
UCHAR bmWaitingIntegersT1;
|
|
UCHAR bClockStop;
|
|
UCHAR bIFSC;
|
|
UCHAR bNadValue;
|
|
} UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T1;
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T1_LENGTH 7
|
|
|
|
/* Define CCID RDR_to_PC_Escape. */
|
|
typedef UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER UX_DEVICE_CLASS_CCID_RDR_TO_PC_ESCAPE_HEADER;
|
|
|
|
/* Define CCID RDR_to_PC_DataRateAndClockFrequency. */
|
|
typedef UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY_HEADER;
|
|
typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY_STRUCT
|
|
{
|
|
UCHAR bMessageType;
|
|
UCHAR dwLength[4];
|
|
UCHAR bSlot;
|
|
UCHAR bSeq;
|
|
UCHAR bStatus;
|
|
UCHAR bError;
|
|
UCHAR bRFU;
|
|
UCHAR dwClockFrequency[4];
|
|
UCHAR dwDataRate[4];
|
|
} UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY;
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_CLOCK_FREQUENCY_SET(msg,v) _ux_utility_long_put(((UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwClockFrequency,(v))
|
|
#define UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_SET(msg,v) _ux_utility_long_put(((UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwDataRate,(v))
|
|
|
|
|
|
/* Define CCID message command handles, if command handle is not defined device
|
|
reports command not supported to host.
|
|
In RTOS mode return normal status code (_SUCCESS/_ERROR/...).
|
|
In standalone mode return task state status code (_STATE_NEXT/_STATE_ERROR/...). */
|
|
typedef UINT (*UX_DEVICE_CLASS_CCID_HANDLE)(ULONG slot, UX_DEVICE_CLASS_CCID_MESSAGES*);
|
|
typedef struct UX_DEVICE_CLASS_CCID_HANDLES_STRUCT
|
|
{
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_icc_power_on;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_icc_power_off;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_get_slot_status;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_xfr_block;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_get_parameters;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_reset_parameters;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_set_parameters;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_escape;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_icc_clock;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_t0_apdu;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_secure;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_mechanical;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_abort;
|
|
UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_set_data_rate_and_clock_frequency;
|
|
} UX_DEVICE_CLASS_CCID_HANDLES;
|
|
|
|
typedef struct UX_DEVICE_CLASS_CCID_COMMAND_SETT_STRUCT
|
|
{
|
|
UCHAR ux_device_class_ccid_command_sett_command_type;
|
|
UCHAR ux_device_class_ccid_command_sett_response_type;
|
|
UCHAR ux_device_class_ccid_command_sett_flags;
|
|
CHAR ux_device_class_ccid_command_sett_handle_index;
|
|
} UX_DEVICE_CLASS_CCID_COMMAND_SETT;
|
|
|
|
|
|
/* Define CCID slot structure. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_SLOT_STRUCT
|
|
{
|
|
CHAR ux_device_class_ccid_slot_runner;
|
|
UCHAR ux_device_class_ccid_slot_flags;
|
|
|
|
UCHAR ux_device_class_ccid_slot_icc_status;
|
|
UCHAR ux_device_class_ccid_slot_clock_status;
|
|
|
|
UCHAR ux_device_class_ccid_slot_hw_error;
|
|
UCHAR ux_device_class_ccid_slot_hw_error_seq;
|
|
|
|
UCHAR ux_device_class_ccid_slot_aborting_seq;
|
|
UCHAR ux_device_class_ccid_slot_aborting;
|
|
} UX_DEVICE_CLASS_CCID_SLOT;
|
|
|
|
/* Define CCID runner structure. */
|
|
typedef struct UX_DEVICE_CLASS_CCID_RUNNER_STRUCT
|
|
{
|
|
struct UX_DEVICE_CLASS_CCID_STRUCT
|
|
*ux_device_class_ccid_runner_ccid;
|
|
UCHAR *ux_device_class_ccid_runner_command;
|
|
UCHAR *ux_device_class_ccid_runner_response;
|
|
|
|
CHAR ux_device_class_ccid_runner_slot;
|
|
CHAR ux_device_class_ccid_runner_id;
|
|
CHAR ux_device_class_ccid_runner_command_index;
|
|
#if !defined(UX_DEVICE_STANDALONE)
|
|
UCHAR reserved;
|
|
|
|
UX_THREAD ux_device_class_ccid_runner_thread;
|
|
UCHAR *ux_device_class_ccid_runner_thread_stack;
|
|
#else
|
|
UCHAR ux_device_class_ccid_runner_state;
|
|
|
|
UX_DEVICE_CLASS_CCID_HANDLE
|
|
ux_device_class_ccid_runner_handle;
|
|
UX_DEVICE_CLASS_CCID_MESSAGES
|
|
ux_device_class_ccid_runner_messages;
|
|
#endif
|
|
} UX_DEVICE_CLASS_CCID_RUNNER;
|
|
|
|
/* Define Device CCID Class Calling Parameter structure */
|
|
typedef struct UX_DEVICE_CLASS_CCID_PARAMETER_STRUCT
|
|
{
|
|
VOID (*ux_device_class_ccid_instance_activate)(VOID *);
|
|
VOID (*ux_device_class_ccid_instance_deactivate)(VOID *);
|
|
UX_DEVICE_CLASS_CCID_HANDLES
|
|
*ux_device_class_ccid_handles;
|
|
ULONG *ux_device_class_ccid_clocks;
|
|
ULONG *ux_device_class_ccid_data_rates;
|
|
ULONG ux_device_class_ccid_max_transfer_length;
|
|
UCHAR ux_device_class_ccid_max_n_slots;
|
|
UCHAR ux_device_class_ccid_max_n_busy_slots;
|
|
UCHAR ux_device_class_ccid_n_clocks;
|
|
UCHAR ux_device_class_ccid_n_data_rates;
|
|
} UX_DEVICE_CLASS_CCID_PARAMETER;
|
|
|
|
|
|
/* Define CCID Class structure. */
|
|
|
|
typedef struct UX_DEVICE_CLASS_CCID_STRUCT
|
|
{
|
|
UX_SLAVE_INTERFACE *ux_device_class_ccid_interface;
|
|
UX_SLAVE_ENDPOINT *ux_device_class_ccid_endpoint_out;
|
|
UX_SLAVE_ENDPOINT *ux_device_class_ccid_endpoint_in;
|
|
UX_SLAVE_ENDPOINT *ux_device_class_ccid_endpoint_notify;
|
|
|
|
#if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
|
|
UCHAR *ux_device_class_ccid_endpoint_buffer;
|
|
#endif
|
|
|
|
UX_DEVICE_CLASS_CCID_PARAMETER
|
|
ux_device_class_ccid_parameter;
|
|
|
|
UX_DEVICE_CLASS_CCID_RUNNER
|
|
*ux_device_class_ccid_runners;
|
|
UX_DEVICE_CLASS_CCID_SLOT
|
|
*ux_device_class_ccid_slots;
|
|
|
|
UCHAR ux_device_class_ccid_header[UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_LENGTH];
|
|
SHORT ux_device_class_ccid_n_busy;
|
|
|
|
#if !defined(UX_DEVICE_STANDALONE)
|
|
UX_THREAD ux_device_class_ccid_thread;
|
|
UCHAR *ux_device_class_ccid_thread_stack;
|
|
|
|
UX_THREAD ux_device_class_ccid_notify_thread;
|
|
UCHAR *ux_device_class_ccid_notify_thread_stack;
|
|
|
|
UX_EVENT_FLAGS_GROUP ux_device_class_ccid_events;
|
|
UX_MUTEX ux_device_class_ccid_mutex;
|
|
UX_MUTEX ux_device_class_ccid_response_mutex;
|
|
UX_SEMAPHORE ux_device_class_ccid_notify_semaphore;
|
|
#else
|
|
ULONG ux_device_class_ccid_flags;
|
|
|
|
UCHAR ux_device_class_ccid_cmd_state;
|
|
CHAR ux_device_class_ccid_cmd_index;
|
|
UCHAR ux_device_class_ccid_rsp_state;
|
|
UCHAR ux_device_class_ccid_notify_state;
|
|
#endif
|
|
} UX_DEVICE_CLASS_CCID;
|
|
|
|
/* Device CCID endpoint buffer settings (when CCID owns buffer). */
|
|
#define UX_DEVICE_CLASS_CCID_ENDPOINT_BUFFER_SIZE_CALC_OVERFLOW \
|
|
(UX_OVERFLOW_CHECK_MULC_ULONG(UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE, 2) || \
|
|
UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE * 2, \
|
|
UX_DEVICE_CLASS_CCID_INTERRUPT_BUFFER_SIZE))
|
|
#define UX_DEVICE_CLASS_CCID_ENDPOINT_BUFFER_SIZE (UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE * 2 + UX_DEVICE_CLASS_CCID_INTERRUPT_BUFFER_SIZE)
|
|
#define UX_DEVICE_CLASS_CCID_BULKOUT_BUFFER(ccid) ((ccid) -> ux_device_class_ccid_endpoint_buffer)
|
|
#define UX_DEVICE_CLASS_CCID_BULKIN_BUFFER(ccid) (UX_DEVICE_CLASS_CCID_BULKOUT_BUFFER(ccid) + UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE)
|
|
#define UX_DEVICE_CLASS_CCID_INTERRUPTIN_BUFFER(ccid) (UX_DEVICE_CLASS_CCID_BULKIN_BUFFER(ccid) + UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE)
|
|
|
|
/* Device CCID flags. */
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_LOCK 0x0001u
|
|
#define UX_DEVICE_CLASS_CCID_FLAG_CMD_RSP 0x0010u
|
|
|
|
#if defined(UX_DEVICE_STANDALONE)
|
|
#define _ux_device_class_ccid_lock(ccid) do { \
|
|
UX_INTERRUPT_SAVE_AREA \
|
|
UX_DISABLE \
|
|
if (ccid->ux_device_class_ccid_flags & UX_DEVICE_CLASS_CCID_FLAG_LOCK) \
|
|
{ \
|
|
UX_RESTORE \
|
|
return(UX_BUSY); \
|
|
} \
|
|
ccid->ux_device_class_ccid_flags |= UX_DEVICE_CLASS_CCID_FLAG_LOCK; \
|
|
UX_RESTORE \
|
|
} while(0)
|
|
#define _ux_device_class_ccid_unlock(ccid) do { \
|
|
ccid->ux_device_class_ccid_flags &= ~UX_DEVICE_CLASS_CCID_FLAG_LOCK; \
|
|
} while(0)
|
|
#else
|
|
#define _ux_device_class_ccid_lock(ccid) _ux_device_mutex_on(&ccid -> ux_device_class_ccid_mutex)
|
|
#define _ux_device_class_ccid_unlock(ccid) _ux_device_mutex_off(&ccid -> ux_device_class_ccid_mutex)
|
|
#endif
|
|
|
|
/* Device CCID states. */
|
|
#define UX_DEVICE_CLASS_CCID_CMD_IDLE (UX_STATE_STEP + 0)
|
|
#define UX_DEVICE_CLASS_CCID_CMD_START (UX_STATE_STEP + 1)
|
|
#define UX_DEVICE_CLASS_CCID_CMD_WAIT (UX_STATE_STEP + 2)
|
|
#define UX_DEVICE_CLASS_CCID_CMD_LOCK (UX_STATE_STEP + 3)
|
|
#define UX_DEVICE_CLASS_CCID_CMD_PROCESS (UX_STATE_STEP + 4)
|
|
#define UX_DEVICE_CLASS_CCID_CMD_RSP_START (UX_STATE_STEP + 5)
|
|
static inline const char *ccidCmdStateName(const UINT s)
|
|
{
|
|
switch(s)
|
|
{
|
|
case UX_DEVICE_CLASS_CCID_CMD_IDLE: return("cmdIDLE");
|
|
case UX_DEVICE_CLASS_CCID_CMD_START: return("cmdSTART");
|
|
case UX_DEVICE_CLASS_CCID_CMD_WAIT: return("cmdWAIT");
|
|
case UX_DEVICE_CLASS_CCID_CMD_LOCK: return("cmdLOCK");
|
|
case UX_DEVICE_CLASS_CCID_CMD_PROCESS: return("cmdPROCESS");
|
|
case UX_DEVICE_CLASS_CCID_CMD_RSP_START:return("cmdRSP_START");
|
|
default: return("cmd?");
|
|
}
|
|
}
|
|
|
|
#define UX_DEVICE_CLASS_CCID_RUNNER_IDLE (UX_STATE_STEP + 0)
|
|
#define UX_DEVICE_CLASS_CCID_RUNNER_START (UX_STATE_STEP + 1)
|
|
#define UX_DEVICE_CLASS_CCID_RUNNER_HANDLE (UX_STATE_STEP + 2)
|
|
#define UX_DEVICE_CLASS_CCID_RUNNER_RSP_START (UX_STATE_STEP + 3)
|
|
static inline const char *ccidRunnerStateName(const UINT s)
|
|
{
|
|
switch(s)
|
|
{
|
|
case UX_DEVICE_CLASS_CCID_RUNNER_IDLE: return("runnerIDLE");
|
|
case UX_DEVICE_CLASS_CCID_RUNNER_START: return("runnerSTART");
|
|
case UX_DEVICE_CLASS_CCID_RUNNER_HANDLE: return("runnerHANDLE");
|
|
case UX_DEVICE_CLASS_CCID_RUNNER_RSP_START: return("runnerRSP_START");
|
|
default: return("runner?");
|
|
}
|
|
}
|
|
|
|
#define UX_DEVICE_CLASS_CCID_RSP_IDLE (UX_STATE_STEP + 0)
|
|
#define UX_DEVICE_CLASS_CCID_RSP_START (UX_STATE_STEP + 1)
|
|
#define UX_DEVICE_CLASS_CCID_RSP_WAIT (UX_STATE_STEP + 2)
|
|
#define UX_DEVICE_CLASS_CCID_RSP_LOCK (UX_STATE_STEP + 3)
|
|
#define UX_DEVICE_CLASS_CCID_RSP_UPDATE (UX_STATE_STEP + 4)
|
|
#define UX_DEVICE_CLASS_CCID_RSP_DONE (UX_STATE_STEP + 5)
|
|
static inline const char *ccidRspStateName(const UINT s)
|
|
{
|
|
switch(s)
|
|
{
|
|
case UX_DEVICE_CLASS_CCID_RSP_IDLE: return("rspIDLE");
|
|
case UX_DEVICE_CLASS_CCID_RSP_START: return("rspSTART");
|
|
case UX_DEVICE_CLASS_CCID_RSP_WAIT: return("rspWAIT");
|
|
case UX_DEVICE_CLASS_CCID_RSP_LOCK: return("rspLOCK");
|
|
case UX_DEVICE_CLASS_CCID_RSP_UPDATE: return("rspUPDATE");
|
|
case UX_DEVICE_CLASS_CCID_RSP_DONE: return("rspDONE");
|
|
default: return("rsp?");
|
|
}
|
|
}
|
|
|
|
#define UX_DEVICE_CLASS_CCID_NOTIFY_IDLE (UX_STATE_STEP + 0)
|
|
#define UX_DEVICE_CLASS_CCID_NOTIFY_LOCK (UX_STATE_STEP + 1)
|
|
#define UX_DEVICE_CLASS_CCID_NOTIFY_START (UX_STATE_STEP + 2)
|
|
#define UX_DEVICE_CLASS_CCID_NOTIFY_WAIT (UX_STATE_STEP + 3)
|
|
static inline const char *ccidNotifyStateName(const UINT s)
|
|
{
|
|
switch(s)
|
|
{
|
|
case UX_DEVICE_CLASS_CCID_NOTIFY_IDLE: return("notifyIDLE");
|
|
case UX_DEVICE_CLASS_CCID_NOTIFY_LOCK: return("notifyLOCK");
|
|
case UX_DEVICE_CLASS_CCID_NOTIFY_START: return("notifySTART");
|
|
case UX_DEVICE_CLASS_CCID_NOTIFY_WAIT: return("notifyWAIT");
|
|
default: return("notify?");
|
|
}
|
|
}
|
|
|
|
/* Define Device CCID command settings. */
|
|
extern const UX_DEVICE_CLASS_CCID_COMMAND_SETT _ux_device_class_ccid_command_sett[];
|
|
|
|
/* Define Device CCID Class prototypes. */
|
|
UINT _ux_device_class_ccid_initialize(UX_SLAVE_CLASS_COMMAND *command);
|
|
UINT _ux_device_class_ccid_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
|
|
UINT _ux_device_class_ccid_activate(UX_SLAVE_CLASS_COMMAND *command);
|
|
UINT _ux_device_class_ccid_deactivate(UX_SLAVE_CLASS_COMMAND *command);
|
|
UINT _ux_device_class_ccid_control_request(UX_SLAVE_CLASS_COMMAND *command);
|
|
|
|
VOID _ux_device_class_ccid_thread_entry(ULONG ccid_instance);
|
|
VOID _ux_device_class_ccid_notify_thread_entry(ULONG ccid_instance);
|
|
VOID _ux_device_class_ccid_runner_thread_entry(ULONG runner_instance);
|
|
|
|
UINT _ux_device_class_ccid_tasks_run(VOID *instance);
|
|
UINT _ux_device_class_ccid_notify_task_run(UX_DEVICE_CLASS_CCID *ccid);
|
|
UINT _ux_device_class_ccid_runner_task_run(UX_DEVICE_CLASS_CCID *ccid);
|
|
|
|
UINT _ux_device_class_ccid_control_abort(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG seq);
|
|
|
|
UINT _ux_device_class_ccid_response(UX_DEVICE_CLASS_CCID *ccid, UCHAR *buffer, ULONG length);
|
|
|
|
UINT _ux_device_class_ccid_entry(UX_SLAVE_CLASS_COMMAND *command);
|
|
|
|
UINT _ux_device_class_ccid_icc_insert(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG seq_start);
|
|
UINT _ux_device_class_ccid_icc_remove(UX_DEVICE_CLASS_CCID *ccid, ULONG slot);
|
|
UINT _ux_device_class_ccid_auto_seq_start(UX_DEVICE_CLASS_CCID *ccid, ULONG slot);
|
|
UINT _ux_device_class_ccid_auto_seq_done(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG icc_status);
|
|
UINT _ux_device_class_ccid_time_extension(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG wt);
|
|
UINT _ux_device_class_ccid_hardware_error(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG error);
|
|
|
|
UINT _uxe_device_class_ccid_icc_insert(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG seq_start);
|
|
UINT _uxe_device_class_ccid_icc_remove(UX_DEVICE_CLASS_CCID *ccid, ULONG slot);
|
|
UINT _uxe_device_class_ccid_auto_seq_done(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG icc_status);
|
|
UINT _uxe_device_class_ccid_time_extension(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG wt);
|
|
UINT _uxe_device_class_ccid_hardware_error(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG error);
|
|
|
|
/* Define Device CCID Class API prototypes. */
|
|
|
|
#define ux_device_class_ccid_entry _ux_device_class_ccid_entry
|
|
|
|
#if defined(UX_DEVICE_CLASS_CCID_ENABLE_ERROR_CHECKING)
|
|
|
|
#define ux_device_class_ccid_icc_insert _uxe_device_class_ccid_icc_insert
|
|
#define ux_device_class_ccid_icc_remove _uxe_device_class_ccid_icc_remove
|
|
#define ux_device_class_ccid_auto_seq_done _uxe_device_class_ccid_auto_seq_done
|
|
#define ux_device_class_ccid_time_extension _uxe_device_class_ccid_time_extension
|
|
#define ux_device_class_ccid_hardware_error _uxe_device_class_ccid_hardware_error
|
|
|
|
#else
|
|
|
|
#define ux_device_class_ccid_icc_insert _ux_device_class_ccid_icc_insert
|
|
#define ux_device_class_ccid_icc_remove _ux_device_class_ccid_icc_remove
|
|
#define ux_device_class_ccid_auto_seq_done _ux_device_class_ccid_auto_seq_done
|
|
#define ux_device_class_ccid_time_extension _ux_device_class_ccid_time_extension
|
|
#define ux_device_class_ccid_hardware_error _ux_device_class_ccid_hardware_error
|
|
|
|
#endif
|
|
|
|
/* Determine if a C++ compiler is being used. If so, complete the standard
|
|
C conditional started above. */
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* UX_DEVICE_CLASS_CCID_H */
|