mirror of
https://github.com/STMicroelectronics/stm32-mw-usb-device.git
synced 2026-02-08 20:18:07 -05:00
Release v2.9.0
This commit is contained in:
343
Class/CCID/Inc/usbd_ccid.h
Normal file
343
Class/CCID/Inc/usbd_ccid.h
Normal file
@@ -0,0 +1,343 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usbd_ccid.h
|
||||
* @author MCD Application Team
|
||||
* @brief header file for the usbd_ccid.c file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USBD_CCID_H
|
||||
#define __USBD_CCID_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usbd_ioreq.h"
|
||||
|
||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup usbd_cdc
|
||||
* @brief This file is the Header file for usbd_ccid.c
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/** @defgroup usbd_cdc_Exported_Defines
|
||||
* @{
|
||||
*/
|
||||
#ifndef CCID_IN_EP
|
||||
#define CCID_IN_EP 0x81U /* EP1 for data IN */
|
||||
#endif /* CCID_IN_EP */
|
||||
|
||||
#ifndef CCID_OUT_EP
|
||||
#define CCID_OUT_EP 0x01U /* EP1 for data OUT */
|
||||
#endif /* CCID_OUT_EP */
|
||||
|
||||
#ifndef CCID_CMD_EP
|
||||
#define CCID_CMD_EP 0x82U /* EP2 for CCID commands */
|
||||
#endif /* CCID_CMD_EP */
|
||||
|
||||
#ifndef CCID_CMD_HS_BINTERVAL
|
||||
#define CCID_CMD_HS_BINTERVAL 0x10U
|
||||
#endif /* CCID_CMD_HS_BINTERVAL */
|
||||
|
||||
#ifndef CCID_CMD_FS_BINTERVAL
|
||||
#define CCID_CMD_FS_BINTERVAL 0x10U
|
||||
#endif /* CCID_CMD_FS_BINTERVAL */
|
||||
|
||||
|
||||
#define CCID_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */
|
||||
#define CCID_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */
|
||||
#define CCID_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */
|
||||
|
||||
#define USB_CCID_CONFIG_DESC_SIZ 93U
|
||||
#define CCID_DATA_HS_IN_PACKET_SIZE CCID_DATA_HS_MAX_PACKET_SIZE
|
||||
#define CCID_DATA_HS_OUT_PACKET_SIZE CCID_DATA_HS_MAX_PACKET_SIZE
|
||||
|
||||
#define CCID_DATA_FS_IN_PACKET_SIZE CCID_DATA_FS_MAX_PACKET_SIZE
|
||||
#define CCID_DATA_FS_OUT_PACKET_SIZE CCID_DATA_FS_MAX_PACKET_SIZE
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* CCID definitions */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define CCID_SEND_ENCAPSULATED_COMMAND 0x00U
|
||||
#define CCID_GET_ENCAPSULATED_RESPONSE 0x01U
|
||||
#define CCID_SET_COMM_FEATURE 0x02U
|
||||
#define CCID_GET_COMM_FEATURE 0x03U
|
||||
#define CCID_CLEAR_COMM_FEATURE 0x04U
|
||||
#define CCID_SET_LINE_CODING 0x20U
|
||||
#define CCID_GET_LINE_CODING 0x21U
|
||||
#define CCID_SET_CONTROL_LINE_STATE 0x22U
|
||||
#define CCID_SEND_BREAK 0x23U
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define REQUEST_ABORT 0x01U
|
||||
#define REQUEST_GET_CLOCK_FREQUENCIES 0x02U
|
||||
#define REQUEST_GET_DATA_RATES 0x03U
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* The Smart Card Device Class Descriptor definitions */
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
#define CCID_INTERFACE_DESC_SIZE 0x09U
|
||||
#define USB_DEVICE_CLASS_CCID 0x0BU
|
||||
#define CCID_CLASS_DESC_SIZE 0x36U
|
||||
#define CCID_DESC_TYPE 0x21U
|
||||
|
||||
#ifndef CCID_VOLTAGE_SUPP
|
||||
#define CCID_VOLTAGE_SUPP 0x07U
|
||||
#endif
|
||||
#ifndef USBD_CCID_PROTOCOL
|
||||
#define USBD_CCID_PROTOCOL 0x03U
|
||||
#endif
|
||||
#ifndef USBD_CCID_DEFAULT_CLOCK_FREQ
|
||||
#define USBD_CCID_DEFAULT_CLOCK_FREQ 3600U
|
||||
#endif
|
||||
#ifndef USBD_CCID_MAX_CLOCK_FREQ
|
||||
#define USBD_CCID_MAX_CLOCK_FREQ USBD_CCID_DEFAULT_CLOCK_FREQ
|
||||
#endif
|
||||
#ifndef USBD_CCID_DEFAULT_DATA_RATE
|
||||
#define USBD_CCID_DEFAULT_DATA_RATE 9677U
|
||||
#endif
|
||||
#ifndef USBD_CCID_MAX_DATA_RATE
|
||||
#define USBD_CCID_MAX_DATA_RATE USBD_CCID_DEFAULT_DATA_RATE
|
||||
#endif
|
||||
#ifndef USBD_CCID_MAX_INF_FIELD_SIZE
|
||||
#define USBD_CCID_MAX_INF_FIELD_SIZE 254U
|
||||
#endif
|
||||
#ifndef CCID_MAX_BLOCK_SIZE_HEADER
|
||||
#define CCID_MAX_BLOCK_SIZE_HEADER 271U
|
||||
#endif
|
||||
|
||||
#define TPDU_EXCHANGE 0x01U
|
||||
#define SHORT_APDU_EXCHANGE 0x02U
|
||||
#define EXTENDED_APDU_EXCHANGE 0x04U
|
||||
#define CHARACTER_EXCHANGE 0x00U
|
||||
|
||||
#ifndef EXCHANGE_LEVEL_FEATURE
|
||||
#define EXCHANGE_LEVEL_FEATURE TPDU_EXCHANGE
|
||||
#endif
|
||||
|
||||
#define CCID_ENDPOINT_DESC_SIZE 0x07U
|
||||
|
||||
#ifndef CCID_EP0_BUFF_SIZ
|
||||
#define CCID_EP0_BUFF_SIZ 64U
|
||||
#endif
|
||||
|
||||
#ifndef CCID_BULK_EPIN_SIZE
|
||||
#define CCID_BULK_EPIN_SIZE 64U
|
||||
#endif
|
||||
|
||||
#define CCID_INT_BUFF_SIZ 2U
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
/* CCID Bulk Out Command definitions */
|
||||
#define PC_TO_RDR_ICCPOWERON 0x62U
|
||||
#define PC_TO_RDR_ICCPOWEROFF 0x63U
|
||||
#define PC_TO_RDR_GETSLOTSTATUS 0x65U
|
||||
#define PC_TO_RDR_XFRBLOCK 0x6FU
|
||||
#define PC_TO_RDR_GETPARAMETERS 0x6CU
|
||||
#define PC_TO_RDR_RESETPARAMETERS 0x6DU
|
||||
#define PC_TO_RDR_SETPARAMETERS 0x61U
|
||||
#define PC_TO_RDR_ESCAPE 0x6BU
|
||||
#define PC_TO_RDR_ICCCLOCK 0x6EU
|
||||
#define PC_TO_RDR_T0APDU 0x6AU
|
||||
#define PC_TO_RDR_SECURE 0x69U
|
||||
#define PC_TO_RDR_MECHANICAL 0x71U
|
||||
#define PC_TO_RDR_ABORT 0x72U
|
||||
#define PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY 0x73U
|
||||
|
||||
/* CCID Bulk In Command definitions */
|
||||
#define RDR_TO_PC_DATABLOCK 0x80U
|
||||
#define RDR_TO_PC_SLOTSTATUS 0x81U
|
||||
#define RDR_TO_PC_PARAMETERS 0x82U
|
||||
#define RDR_TO_PC_ESCAPE 0x83U
|
||||
#define RDR_TO_PC_DATARATEANDCLOCKFREQUENCY 0x84U
|
||||
|
||||
/* CCID Interrupt In Command definitions */
|
||||
#define RDR_TO_PC_NOTIFYSLOTCHANGE 0x50U
|
||||
#define RDR_TO_PC_HARDWAREERROR 0x51U
|
||||
|
||||
/* Bulk-only Command Block Wrapper */
|
||||
#define ABDATA_SIZE 261U
|
||||
#define CCID_CMD_HEADER_SIZE 10U
|
||||
#define CCID_RESPONSE_HEADER_SIZE 10U
|
||||
|
||||
/* Number of SLOTS. For single card, this value is 1 */
|
||||
#define CCID_NUMBER_OF_SLOTS 1U
|
||||
|
||||
#define CARD_SLOT_FITTED 1U
|
||||
#define CARD_SLOT_REMOVED 0U
|
||||
|
||||
#define OFFSET_INT_BMESSAGETYPE 0x00U
|
||||
#define OFFSET_INT_BMSLOTICCSTATE 0x01U
|
||||
#define SLOT_ICC_PRESENT 0x01U
|
||||
/* LSb : (0b = no ICC present, 1b = ICC present) */
|
||||
#define SLOT_ICC_CHANGE 0x02U
|
||||
/* MSb : (0b = no change, 1b = change) */
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t bitrate;
|
||||
uint8_t format;
|
||||
uint8_t paritytype;
|
||||
uint8_t datatype;
|
||||
} USBD_CCID_LineCodingTypeDef;
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct
|
||||
{
|
||||
uint8_t bMessageType; /* Offset = 0*/
|
||||
uint32_t dwLength; /* Offset = 1, The length field (dwLength) is the length
|
||||
of the message not including the 10-byte header.*/
|
||||
uint8_t bSlot; /* Offset = 5*/
|
||||
uint8_t bSeq; /* Offset = 6*/
|
||||
uint8_t bSpecific_0; /* Offset = 7*/
|
||||
uint8_t bSpecific_1; /* Offset = 8*/
|
||||
uint8_t bSpecific_2; /* Offset = 9*/
|
||||
uint8_t abData [ABDATA_SIZE]; /* Offset = 10, For reference, the absolute
|
||||
maximum block size for a TPDU T=0 block is 260 bytes
|
||||
(5 bytes command; 255 bytes data),
|
||||
or for a TPDU T=1 block is 259 bytes,
|
||||
or for a short APDU T=1 block is 261 bytes,
|
||||
or for an extended APDU T=1 block is 65544 bytes.*/
|
||||
} USBD_CCID_BulkOut_DataTypeDef;
|
||||
#pragma pack()
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct
|
||||
{
|
||||
uint8_t bMessageType; /* Offset = 0 */
|
||||
uint32_t dwLength; /* Offset = 1 */
|
||||
uint8_t bSlot; /* Offset = 5, Same as Bulk-OUT message */
|
||||
uint8_t bSeq; /* Offset = 6, Same as Bulk-OUT message */
|
||||
uint8_t bStatus; /* Offset = 7, Slot status as defined in section 6.2.6 */
|
||||
uint8_t bError; /* Offset = 8, Slot error as defined in section 6.2.6 */
|
||||
uint8_t bSpecific; /* Offset = 9 */
|
||||
uint8_t abData[ABDATA_SIZE]; /* Offset = 10 */
|
||||
uint16_t u16SizeToSend;
|
||||
} USBD_CCID_BulkIn_DataTypeDef;
|
||||
#pragma pack()
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__IO uint8_t SlotStatus;
|
||||
__IO uint8_t SlotStatusChange;
|
||||
} USBD_CCID_SlotStatusTypeDef;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__IO uint8_t bAbortRequestFlag;
|
||||
__IO uint8_t bSeq;
|
||||
__IO uint8_t bSlot;
|
||||
} USBD_CCID_ParamTypeDef;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t data[CCID_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */
|
||||
uint32_t UsbMessageLength;
|
||||
uint8_t UsbIntData[CCID_CMD_PACKET_SIZE]; /* Buffer for the Interrupt In Data */
|
||||
uint32_t alt_setting;
|
||||
|
||||
USBD_CCID_BulkIn_DataTypeDef UsbBlkInData; /* Buffer for the Out Data */
|
||||
USBD_CCID_BulkOut_DataTypeDef UsbBlkOutData; /* Buffer for the In Data */
|
||||
USBD_CCID_SlotStatusTypeDef SlotStatus;
|
||||
USBD_CCID_ParamTypeDef USBD_CCID_Param;
|
||||
|
||||
__IO uint32_t MaxPcktLen;
|
||||
__IO uint8_t blkt_state; /* Bulk transfer state */
|
||||
|
||||
uint16_t slot_nb;
|
||||
uint16_t seq_nb;
|
||||
} USBD_CCID_HandleTypeDef;
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Macros
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @defgroup USBD_CORE_Exported_Variables
|
||||
* @{
|
||||
*/
|
||||
|
||||
extern USBD_ClassTypeDef USBD_CCID;
|
||||
#define USBD_CCID_CLASS &USBD_CCID
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @defgroup USB_CORE_Exported_Functions
|
||||
* @{
|
||||
*/
|
||||
typedef struct _USBD_CCID_Itf
|
||||
{
|
||||
uint8_t (* Init)(USBD_HandleTypeDef *pdev);
|
||||
uint8_t (* DeInit)(USBD_HandleTypeDef *pdev);
|
||||
uint8_t (* Control)(uint8_t req, uint8_t *pbuf, uint16_t *length);
|
||||
uint8_t (* Response_SendData)(USBD_HandleTypeDef *pdev, uint8_t *buf, uint16_t len);
|
||||
uint8_t (* Send_Process)(uint8_t *Command, uint8_t *Data);
|
||||
uint8_t (* SetSlotStatus)(USBD_HandleTypeDef *pdev);
|
||||
} USBD_CCID_ItfTypeDef;
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
/** @defgroup USB_CORE_Exported_Functions
|
||||
* @{
|
||||
*/
|
||||
uint8_t USBD_CCID_RegisterInterface(USBD_HandleTypeDef *pdev,
|
||||
USBD_CCID_ItfTypeDef *fops);
|
||||
|
||||
uint8_t USBD_CCID_IntMessage(USBD_HandleTypeDef *pdev);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USBD_CCID_H */
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
219
Class/CCID/Inc/usbd_ccid_cmd.h
Normal file
219
Class/CCID/Inc/usbd_ccid_cmd.h
Normal file
@@ -0,0 +1,219 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usbd_ccid_cmd.h
|
||||
* @author MCD Application Team
|
||||
* @brief header file for the usbd_ccid_cmd.c file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USBD_CCID_CMD_H
|
||||
#define __USBD_CCID_CMD_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#ifndef __USBD_CCID_IF_H
|
||||
#include "usbd_ccid_if_template.h"
|
||||
#endif
|
||||
|
||||
#ifndef __USBD_CCID_SC_IF_H
|
||||
#include "usbd_ccid_sc_if_template.h"
|
||||
#endif
|
||||
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
|
||||
/******************************************************************************/
|
||||
/* ERROR CODES for USB Bulk In Messages : bError */
|
||||
/******************************************************************************/
|
||||
|
||||
#define SLOT_NO_ERROR 0x81U
|
||||
#define SLOTERROR_UNKNOWN 0x82U
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/* Index of not supported / incorrect message parameter : 7Fh to 01h */
|
||||
/* These Values are used for Return Types between Firmware Layers */
|
||||
/*
|
||||
Failure of a command
|
||||
The CCID cannot parse one parameter or the ICC is not supporting one parameter.
|
||||
Then the Slot Error register contains the index of the first bad parameter as a
|
||||
positive number (1-127). For instance, if the CCID receives an ICC command to
|
||||
an unimplemented slot, then the Slot Error register shall be set to 5 (index of bSlot field) */
|
||||
|
||||
/* Following Parameters used in PC_to_RDR_XfrBlock */
|
||||
#define SLOTERROR_BAD_LENTGH 0x01U
|
||||
#define SLOTERROR_BAD_SLOT 0x05U
|
||||
#define SLOTERROR_BAD_POWERSELECT 0x07U
|
||||
#define SLOTERROR_BAD_PROTOCOLNUM 0x07U
|
||||
#define SLOTERROR_BAD_CLOCKCOMMAND 0x07U
|
||||
#define SLOTERROR_BAD_ABRFU_3B 0x07U
|
||||
#define SLOTERROR_BAD_BMCHANGES 0x07U
|
||||
#define SLOTERROR_BAD_BFUNCTION_MECHANICAL 0x07U
|
||||
#define SLOTERROR_BAD_ABRFU_2B 0x08U
|
||||
#define SLOTERROR_BAD_LEVELPARAMETER 0x08U
|
||||
#define SLOTERROR_BAD_FIDI 0x0AU
|
||||
#define SLOTERROR_BAD_T01CONVCHECKSUM 0x0BU
|
||||
#define SLOTERROR_BAD_GUARDTIME 0x0CU
|
||||
#define SLOTERROR_BAD_WAITINGINTEGER 0x0DU
|
||||
#define SLOTERROR_BAD_CLOCKSTOP 0x0EU
|
||||
#define SLOTERROR_BAD_IFSC 0x0FU
|
||||
#define SLOTERROR_BAD_NAD 0x10U
|
||||
#define SLOTERROR_BAD_DWLENGTH 0x08U
|
||||
|
||||
|
||||
/*---------- Table 6.2-2 Slot error register when bmCommandStatus = 1 */
|
||||
#define SLOTERROR_CMD_ABORTED 0xFFU
|
||||
#define SLOTERROR_ICC_MUTE 0xFEU
|
||||
#define SLOTERROR_XFR_PARITY_ERROR 0xFDU
|
||||
#define SLOTERROR_XFR_OVERRUN 0xFCU
|
||||
#define SLOTERROR_HW_ERROR 0xFBU
|
||||
#define SLOTERROR_BAD_ATR_TS 0xF8U
|
||||
#define SLOTERROR_BAD_ATR_TCK 0xF7U
|
||||
#define SLOTERROR_ICC_PROTOCOL_NOT_SUPPORTED 0xF6U
|
||||
#define SLOTERROR_ICC_CLASS_NOT_SUPPORTED 0xF5U
|
||||
#define SLOTERROR_PROCEDURE_BYTE_CONFLICT 0xF4U
|
||||
#define SLOTERROR_DEACTIVATED_PROTOCOL 0xF3U
|
||||
#define SLOTERROR_BUSY_WITH_AUTO_SEQUENCE 0xF2U
|
||||
#define SLOTERROR_PIN_TIMEOUT 0xF0U
|
||||
#define SLOTERROR_PIN_CANCELLED 0xEFU
|
||||
#define SLOTERROR_CMD_SLOT_BUSY 0xE0U
|
||||
#define SLOTERROR_CMD_NOT_SUPPORTED 0x00U
|
||||
|
||||
/* Following Parameters used in PC_to_RDR_ResetParameters */
|
||||
/* DEFAULT_FIDI_VALUE */
|
||||
#ifndef DEFAULT_FIDI
|
||||
#define DEFAULT_FIDI 0x11U
|
||||
#endif
|
||||
#ifndef DEFAULT_T01CONVCHECKSUM
|
||||
#define DEFAULT_T01CONVCHECKSUM 0x00U
|
||||
#endif
|
||||
#ifndef DEFAULT_EXTRA_GUARDTIME
|
||||
#define DEFAULT_EXTRA_GUARDTIME 0x00U
|
||||
#endif
|
||||
#ifndef DEFAULT_WAITINGINTEGER
|
||||
#define DEFAULT_WAITINGINTEGER 0x0AU
|
||||
#endif
|
||||
#ifndef DEFAULT_CLOCKSTOP
|
||||
#define DEFAULT_CLOCKSTOP 0x00U
|
||||
#endif
|
||||
#ifndef DEFAULT_IFSC
|
||||
#define DEFAULT_IFSC 0x20U
|
||||
#endif
|
||||
#ifndef DEFAULT_NAD
|
||||
#define DEFAULT_NAD 0x00U
|
||||
#endif
|
||||
|
||||
/* Following Parameters used in PC_to_RDR_IccPowerOn */
|
||||
#define VOLTAGE_SELECTION_AUTOMATIC 0xFFU
|
||||
#define VOLTAGE_SELECTION_3V 0x02U
|
||||
#define VOLTAGE_SELECTION_5V 0x01U
|
||||
#define VOLTAGE_SELECTION_1V8 0x03U
|
||||
|
||||
/*
|
||||
Offset=0 bmICCStatus 2 bit 0, 1, 2
|
||||
0 - An ICC is present and active (power is on and stable, RST is inactive)
|
||||
1 - An ICC is present and inactive (not activated or shut down by hardware error)
|
||||
2 - No ICC is present
|
||||
3 - RFU
|
||||
Offset=0 bmRFU 4 bits 0 RFU
|
||||
Offset=6 bmCommandStatus 2 bits 0, 1, 2
|
||||
0 - Processed without error
|
||||
1 - Failed (error code provided by the error register)
|
||||
2 - Time Extension is requested
|
||||
3 - RFU
|
||||
*/
|
||||
|
||||
#define BM_ICC_PRESENT_ACTIVE 0x00U
|
||||
#define BM_ICC_PRESENT_INACTIVE 0x01U
|
||||
#define BM_ICC_NO_ICC_PRESENT 0x02U
|
||||
|
||||
#define BM_COMMAND_STATUS_OFFSET 0x06U
|
||||
#define BM_COMMAND_STATUS_NO_ERROR 0x00U
|
||||
#define BM_COMMAND_STATUS_FAILED (0x01U << BM_COMMAND_STATUS_OFFSET)
|
||||
#define BM_COMMAND_STATUS_TIME_EXTN (0x02 << BM_COMMAND_STATUS_OFFSET)
|
||||
|
||||
|
||||
#if (ATR_T01 == 0)
|
||||
#define SIZE_OF_ATR 19U
|
||||
#else
|
||||
#define SIZE_OF_ATR 15U
|
||||
#endif
|
||||
|
||||
/* defines for the CCID_CMD Layers */
|
||||
#define LEN_RDR_TO_PC_SLOTSTATUS 10U
|
||||
#define LEN_PROTOCOL_STRUCT_T0 5U
|
||||
#define LEN_PROTOCOL_STRUCT_T1 7U
|
||||
|
||||
#define BPROTOCOL_NUM_T0 0U
|
||||
#define BPROTOCOL_NUM_T1 1U
|
||||
|
||||
/************************************************************************************/
|
||||
/* ERROR CODES for RDR_TO_PC_HARDWAREERROR Message : bHardwareErrorCode */
|
||||
/************************************************************************************/
|
||||
|
||||
#define HARDWAREERRORCODE_OVERCURRENT 0x01U
|
||||
#define HARDWAREERRORCODE_VOLTAGEERROR 0x02U
|
||||
#define HARDWAREERRORCODE_OVERCURRENT_IT 0x04U
|
||||
#define HARDWAREERRORCODE_VOLTAGEERROR_IT 0x08U
|
||||
|
||||
|
||||
|
||||
#define CHK_PARAM_SLOT 0x01U
|
||||
#define CHK_PARAM_DWLENGTH 0x02U
|
||||
#define CHK_PARAM_abRFU2 0x04U
|
||||
#define CHK_PARAM_abRFU3 0x08U
|
||||
#define CHK_PARAM_CARD_PRESENT 0x10U
|
||||
#define CHK_PARAM_ABORT 0x20U
|
||||
#define CHK_ACTIVE_STATE 0x40U
|
||||
|
||||
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
uint8_t PC_to_RDR_IccPowerOn(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_IccPowerOff(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_GetSlotStatus(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_XfrBlock(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_GetParameters(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_ResetParameters(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_SetParameters(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_Escape(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_IccClock(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_to_RDR_Abort(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_TO_RDR_T0Apdu(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_TO_RDR_Mechanical(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_TO_RDR_SetDataRateAndClockFrequency(USBD_HandleTypeDef *pdev);
|
||||
uint8_t PC_TO_RDR_Secure(USBD_HandleTypeDef *pdev);
|
||||
|
||||
void RDR_to_PC_DataBlock(uint8_t errorCode, USBD_HandleTypeDef *pdev);
|
||||
void RDR_to_PC_NotifySlotChange(USBD_HandleTypeDef *pdev);
|
||||
void RDR_to_PC_SlotStatus(uint8_t errorCode, USBD_HandleTypeDef *pdev);
|
||||
void RDR_to_PC_Parameters(uint8_t errorCode, USBD_HandleTypeDef *pdev);
|
||||
void RDR_to_PC_Escape(uint8_t errorCode, USBD_HandleTypeDef *pdev);
|
||||
void RDR_to_PC_DataRateAndClockFrequency(uint8_t errorCode, USBD_HandleTypeDef *pdev);
|
||||
|
||||
void CCID_UpdSlotStatus(USBD_HandleTypeDef *pdev, uint8_t slotStatus);
|
||||
void CCID_UpdSlotChange(USBD_HandleTypeDef *pdev, uint8_t changeStatus);
|
||||
uint8_t CCID_IsSlotStatusChange(USBD_HandleTypeDef *pdev);
|
||||
uint8_t CCID_CmdAbort(uint8_t slot, uint8_t seq);
|
||||
uint8_t USBD_CCID_Transfer_Data_Request(USBD_HandleTypeDef *pdev,
|
||||
uint8_t *dataPointer, uint16_t dataLen);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USBD_CCID_CMD_H */
|
||||
76
Class/CCID/Inc/usbd_ccid_if_template.h
Normal file
76
Class/CCID/Inc/usbd_ccid_if_template.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usbd_ccid_if_template.h
|
||||
* @author MCD Application Team
|
||||
* @brief header file for the usbd_ccid_if_template.c file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USBD_CCID_IF_TEMPLATE_H
|
||||
#define __USBD_CCID_IF_TEMPLATE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usbd_ccid.h"
|
||||
#include "usbd_ccid_cmd.h"
|
||||
|
||||
#ifndef __USBD_CCID_SMARTCARD_H
|
||||
#include "usbd_ccid_smartcard_template.h"
|
||||
#endif
|
||||
|
||||
/* Exported defines ----------------------------------------------------------*/
|
||||
|
||||
/*****************************************************************************/
|
||||
/*********************** CCID Bulk Transfer State machine ********************/
|
||||
/*****************************************************************************/
|
||||
#define CCID_STATE_IDLE 0U
|
||||
#define CCID_STATE_DATA_OUT 1U
|
||||
#define CCID_STATE_RECEIVE_DATA 2U
|
||||
#define CCID_STATE_SEND_RESP 3U
|
||||
#define CCID_STATE_DATAIN 4U
|
||||
#define CCID_STATE_UNCORRECT_LENGTH 5U
|
||||
|
||||
#define DIR_IN 0U
|
||||
#define DIR_OUT 1U
|
||||
#define BOTH_DIR 2U
|
||||
|
||||
/************ Value of the Interrupt transfer status to set ******************/
|
||||
#define IntrStatus_Complete 1U
|
||||
#define IntrStatus_Reset 0U
|
||||
/************** slot change status *******************************************/
|
||||
#define SlotStatus_Changed 1U
|
||||
#define SlotStatus_Reset 0U
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
extern USBD_HandleTypeDef USBD_Device;
|
||||
|
||||
/* CCID Interface callback */
|
||||
extern USBD_CCID_ItfTypeDef USBD_CCID_If_fops;
|
||||
|
||||
/* Exported macros -----------------------------------------------------------*/
|
||||
/* Exported variables --------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USBD_CCID_IF_TEMPLATE_H */
|
||||
100
Class/CCID/Inc/usbd_ccid_sc_if_template.h
Normal file
100
Class/CCID/Inc/usbd_ccid_sc_if_template.h
Normal file
@@ -0,0 +1,100 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usbd_ccid_sc_if_template.h
|
||||
* @author MCD Application Team
|
||||
* @brief header file for the usbd_ccid_sc_if_template.c file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USBD_CCID_SC_IF_TEMPLATE_H
|
||||
#define __USBD_CCID_SC_IF_TEMPLATE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usbd_ccid.h"
|
||||
#include "usbd_ccid_cmd.h"
|
||||
|
||||
#ifndef __USBD_CCID_SMARTCARD_H
|
||||
#include "usbd_ccid_smartcard_template.h"
|
||||
#endif
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t voltage; /* Voltage for the Card Already Selected */
|
||||
uint8_t USART_GuardTime;
|
||||
uint8_t SC_A2R_FiDi;
|
||||
uint8_t SC_hostFiDi;
|
||||
uint8_t USART_DefaultGuardTime;
|
||||
uint32_t USART_BaudRate;
|
||||
} SC_Param_t;
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct
|
||||
{
|
||||
uint8_t bmFindexDindex;
|
||||
uint8_t bmTCCKST0;
|
||||
uint8_t bGuardTimeT0;
|
||||
uint8_t bWaitingIntegerT0;
|
||||
uint8_t bClockStop;
|
||||
uint8_t bIfsc;
|
||||
uint8_t bNad;
|
||||
} Protocol_01_DataTypeDef;
|
||||
#pragma pack()
|
||||
|
||||
extern Protocol_01_DataTypeDef ProtocolData;
|
||||
extern SC_Param_t SC_Param;
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
#define MAX_EXTRA_GUARD_TIME (0xFF - DEFAULT_EXTRA_GUARDTIME)
|
||||
|
||||
/* Following macros are used for SC_XferBlock command */
|
||||
#define XFER_BLK_SEND_DATA 1U /* Command is for issuing the data */
|
||||
#define XFER_BLK_RECEIVE_DATA 2U /* Command is for receiving the data */
|
||||
#define XFER_BLK_NO_DATA 3U /* Command type is No data exchange */
|
||||
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
/* APPLICATION LAYER ---------------------------------------------------------*/
|
||||
void SC_Itf_InitParams(void);
|
||||
void SC_Itf_IccPowerOn(uint8_t voltage);
|
||||
void SC_Itf_IccPowerOff(void);
|
||||
uint8_t SC_GetState(void);
|
||||
uint8_t SC_Itf_XferBlock(uint8_t *ptrBlock, uint32_t blockLen,
|
||||
uint16_t expectedLen,
|
||||
USBD_CCID_BulkIn_DataTypeDef *CCID_BulkIn_Data);
|
||||
|
||||
uint8_t SC_Itf_SetParams(Protocol_01_DataTypeDef *pPtr, uint8_t T_01);
|
||||
uint8_t SC_Itf_Escape(uint8_t *escapePtr, uint32_t escapeLen,
|
||||
uint8_t *responseBuff, uint32_t *responseLen);
|
||||
|
||||
uint8_t SC_Itf_SetClock(uint8_t bClockCommand);
|
||||
uint8_t SC_Itf_T0Apdu(uint8_t bmChanges, uint8_t bClassGetResponse,
|
||||
uint8_t bClassEnvelope);
|
||||
|
||||
uint8_t SC_Itf_Mechanical(uint8_t bFunction);
|
||||
uint8_t SC_Itf_SetDataRateAndClockFrequency(uint32_t dwClockFrequency,
|
||||
uint32_t dwDataRate);
|
||||
|
||||
uint8_t SC_Itf_Secure(uint32_t dwLength, uint8_t bBWI, uint16_t wLevelParameter,
|
||||
uint8_t *pbuf, uint32_t *returnLen);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USBD_CCID_SC_IF_TEMPLATE_H */
|
||||
279
Class/CCID/Inc/usbd_ccid_smartcard_template.h
Normal file
279
Class/CCID/Inc/usbd_ccid_smartcard_template.h
Normal file
@@ -0,0 +1,279 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usbd_ccid_smartcard_template.h
|
||||
* @author MCD Application Team
|
||||
* @brief header file for the usbd_ccid_smartcard_template.c file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USBD_CCID_SMARTCARD_TEMPLATE_H
|
||||
#define __USBD_CCID_SMARTCARD_TEMPLATE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#ifndef __USBD_CCID_IF_H
|
||||
#include "usbd_ccid_if_template.h"
|
||||
#endif
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
#define T0_PROTOCOL 0x00U /* T0 protocol */
|
||||
#define T1_PROTOCOL 0x01U /* T1 protocol */
|
||||
#define DIRECT 0x3BU /* Direct bit convention */
|
||||
#define INDIRECT 0x3FU /* Indirect bit convention */
|
||||
#define SETUP_LENGTH 20U
|
||||
#define HIST_LENGTH 20U
|
||||
|
||||
#define SC_TRANSMIT_TIMEOUT 200U /* Direction to transmit */
|
||||
#define MAX_PROTOCOLLEVEL 7U /* Maximum levels of protocol */
|
||||
#define MAX_INTERFACEBYTE 4U /* Maximum number of interface bytes per protocol */
|
||||
#define LC_MAX 24U
|
||||
#define SC_RECEIVE_TIMEOUT 0x8000U /* Direction to reader */
|
||||
|
||||
/* T=1 protocol constants */
|
||||
#define T1_I_BLOCK 0x00U /* PCB (I-block: b8 = 0) */
|
||||
#define T1_R_BLOCK 0x80U /* PCB (R-block: b8 b7 = 10) */
|
||||
#define T1_S_BLOCK 0xC0U /* PCB (S-block: b8 b7 = 11) */
|
||||
|
||||
/* I block */
|
||||
#define T1_I_SEQ_SHIFT 6U /* N(S) position (bit 7) */
|
||||
|
||||
/* R block */
|
||||
#define T1_IS_ERROR(pcb) ((pcb) & 0x0FU)
|
||||
#define T1_EDC_ERROR 0x01U /* [b6..b1] = 0-N(R)-0001 */
|
||||
#define T1_OTHER_ERROR 0x02U /* [b6..b1] = 0-N(R)-0010 */
|
||||
#define T1_R_SEQ_SHIFT 4U /* N(R) position (b5) */
|
||||
|
||||
/* S block */
|
||||
#define T1_S_RESPONSE 0x20U /* If response: set bit b6, if request reset b6 in PCB S-Block */
|
||||
#define T1_S_RESYNC 0x00U /* RESYNCH: b6->b1: 000000 of PCB S-Block */
|
||||
#define T1_S_IFS 0x01U /* IFS: b6->b1: 000001 of PCB S-Block */
|
||||
#define T1_S_ABORT 0x02U /* ABORT: b6->b1: 000010 of PCB S-Block */
|
||||
#define T1_S_WTX 0x03U /* WTX: b6->b1: 000011 of PCB S-Block */
|
||||
|
||||
#define NAD 0U /* NAD byte position in the block */
|
||||
#define PCB 1U /* PCB byte position in the block */
|
||||
#define LEN 2U /* LEN byte position in the block */
|
||||
#define DATA 3U /* The position of the first byte of INF field in the block */
|
||||
|
||||
/* Modifiable parameters */
|
||||
#define SAD 0x0U /* Source address: reader (allowed values 0 -> 7) */
|
||||
#define DAD 0x0U /* Destination address: card (allowed values 0 -> 7) */
|
||||
#define IFSD_VALUE 254U /* Max length of INF field Supported by the reader */
|
||||
#define SC_FILE_SIZE 0x100U /* File size */
|
||||
#define SC_FILE_ID 0x0001U /* File identifier */
|
||||
#define SC_CLASS 0x00U
|
||||
|
||||
/* Constant parameters */
|
||||
#define INS_SELECT_FILE 0xA4U /* Select file instruction */
|
||||
#define INS_READ_FILE 0xB0U /* Read file instruction */
|
||||
#define INS_WRITE_FILE 0xD6U /* Write file instruction */
|
||||
#define TRAILER_LENGTH 2U /* Trailer length (SW1 and SW2: 2 bytes) */
|
||||
|
||||
#define SC_T1_RECEIVE_SUCCESS 0U
|
||||
#define SC_T1_BWT_TIMEOUT 1U
|
||||
#define SC_T1_CWT_TIMEOUT 2U
|
||||
|
||||
#define DEFAULT_FIDI_VALUE 0x11U
|
||||
#define PPS_REQUEST 0xFFU
|
||||
|
||||
/* SC Tree Structure -----------------------------------------------------------
|
||||
MasterFile
|
||||
________|___________
|
||||
| | |
|
||||
System UserData Note
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
/* SC ADPU Command: Operation Code -------------------------------------------*/
|
||||
#define SC_CLA_NAME 0x00U
|
||||
|
||||
/*------------------------ Data Area Management Commands ---------------------*/
|
||||
#define SC_SELECT_FILE 0xA4U
|
||||
#define SC_GET_RESPONCE 0xC0U
|
||||
#define SC_STATUS 0xF2U
|
||||
#define SC_UPDATE_BINARY 0xD6U
|
||||
#define SC_READ_BINARY 0xB0U
|
||||
#define SC_WRITE_BINARY 0xD0U
|
||||
#define SC_UPDATE_RECORD 0xDCU
|
||||
#define SC_READ_RECORD 0xB2U
|
||||
|
||||
/*-------------------------- Administrative Commands -------------------------*/
|
||||
#define SC_CREATE_FILE 0xE0U
|
||||
|
||||
/*-------------------------- Safety Management Commands ----------------------*/
|
||||
#define SC_VERIFY 0x20U
|
||||
#define SC_CHANGE 0x24U
|
||||
#define SC_DISABLE 0x26U
|
||||
#define SC_ENABLE 0x28U
|
||||
#define SC_UNBLOCK 0x2CU
|
||||
#define SC_EXTERNAL_AUTH 0x82U
|
||||
#define SC_GET_CHALLENGE 0x84U
|
||||
|
||||
/*-------------------------- Smartcard Interface Byte-------------------------*/
|
||||
#define SC_INTERFACEBYTE_TA 0U /* Interface byte TA(i) */
|
||||
#define SC_INTERFACEBYTE_TB 1U /* Interface byte TB(i) */
|
||||
#define SC_INTERFACEBYTE_TC 2U /* Interface byte TC(i) */
|
||||
#define SC_INTERFACEBYTE_TD 3U /* Interface byte TD(i) */
|
||||
|
||||
/*-------------------------- Answer to reset Commands ------------------------*/
|
||||
#define SC_GET_A2R 0x00U
|
||||
|
||||
/* SC STATUS: Status Code ----------------------------------------------------*/
|
||||
#define SC_EF_SELECTED 0x9FU
|
||||
#define SC_DF_SELECTED 0x9FU
|
||||
#define SC_OP_TERMINATED 0x9000U
|
||||
|
||||
/* Smartcard Voltage */
|
||||
#define SC_VOLTAGE_5V 0x00U
|
||||
#define SC_VOLTAGE_3V 0x01U
|
||||
#define SC_VOLTAGE_NOINIT 0xFFU
|
||||
/*----------------- ATR Protocole supported ----------------------------------*/
|
||||
#define ATR_T01 0x00U
|
||||
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
typedef enum
|
||||
{
|
||||
SC_POWER_ON = 0x00,
|
||||
SC_RESET_LOW = 0x01,
|
||||
SC_RESET_HIGH = 0x02,
|
||||
SC_ACTIVE = 0x03,
|
||||
SC_ACTIVE_ON_T0 = 0x04,
|
||||
SC_ACTIVE_ON_T1 = 0x05,
|
||||
SC_POWER_OFF = 0x06,
|
||||
SC_NO_INIT = 0x07
|
||||
|
||||
} SC_State;
|
||||
|
||||
/* Interface Byte structure - TA(i), TB(i), TC(i) and TD(i) ------------------*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Status; /* The Presence of the Interface byte */
|
||||
uint8_t Value; /* The Value of the Interface byte */
|
||||
} SC_InterfaceByte;
|
||||
|
||||
/* Protocol Level structure - ------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
SC_InterfaceByte InterfaceByte[MAX_INTERFACEBYTE]; /* The Values of the Interface byte TA(i), TB(i), TC(i)and TD(i) */
|
||||
} SC_ProtocolLevel;
|
||||
|
||||
/* ATR structure - Answer To Reset -------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t TS; /* Bit Convention Direct/Indirect */
|
||||
uint8_t T0; /* Each bit in the high nibble = Presence of the further interface byte;
|
||||
Low nibble = Number of historical byte */
|
||||
|
||||
SC_ProtocolLevel T[MAX_PROTOCOLLEVEL]; /* Setup array */
|
||||
uint8_t H[HIST_LENGTH]; /* Historical array */
|
||||
uint8_t Tlength; /* Setup array dimension */
|
||||
uint8_t Hlength; /* Historical array dimension */
|
||||
uint8_t TCK;
|
||||
} SC_ATR;
|
||||
|
||||
/* ADPU-Header command structure ---------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t CLA; /* Command class */
|
||||
uint8_t INS; /* Operation code */
|
||||
uint8_t P1; /* Selection Mode */
|
||||
uint8_t P2; /* Selection Option */
|
||||
} SC_Header;
|
||||
|
||||
/* ADPU-Body command structure -----------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t LC; /* Data field length */
|
||||
uint8_t Data[LC_MAX]; /* Command parameters */
|
||||
uint8_t LE; /* Expected length of data to be returned */
|
||||
} SC_Body;
|
||||
|
||||
/* ADPU Command structure ----------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
SC_Header Header;
|
||||
SC_Body Body;
|
||||
} SC_ADPU_Commands;
|
||||
|
||||
/* SC response structure -----------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Data[LC_MAX]; /* Data returned from the card */
|
||||
uint8_t SW1; /* Command Processing status */
|
||||
uint8_t SW2; /* Command Processing qualification */
|
||||
} SC_ADPU_Response;
|
||||
|
||||
/* SC Command Status -----------------------------------------------------*/
|
||||
typedef enum
|
||||
{
|
||||
SC_CS_FAILED = 0x00,
|
||||
SC_CS_PIN_ENABLED = 0x01,
|
||||
SC_CS_PIN_VERIFIED = 0x02,
|
||||
SC_CS_READ = 0x03,
|
||||
SC_CS_PIN_CHANGED = 0x04
|
||||
|
||||
} SC_Command_State;
|
||||
/* SC Response Status -----------------------------------------------------*/
|
||||
typedef enum
|
||||
{
|
||||
REP_OK = 0x00,
|
||||
REP_NOT_OK = 0x01,
|
||||
REP_NOT_SUPP = 0x02,
|
||||
REP_ENABLED = 0x03,
|
||||
REP_CHANGE = 0x04
|
||||
|
||||
} REP_Command_t;
|
||||
/* Conforming of Command with ICC APP -----------------------------------------------------*/
|
||||
typedef enum
|
||||
{
|
||||
Command_OK = 0x00,
|
||||
Command_NOT_OK = 0x01,
|
||||
|
||||
} Command_State_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SC_DISABLED = 0U,
|
||||
SC_ENABLED = !SC_DISABLED
|
||||
} SCPowerState;
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
/* APPLICATION LAYER ---------------------------------------------------------*/
|
||||
void SC_Handler(SC_State *SCState, SC_ADPU_Commands *SC_ADPU, SC_ADPU_Response *SC_Response);
|
||||
void SC_PowerCmd(SCPowerState NewState);
|
||||
void SC_ParityErrorHandler(void);
|
||||
void SC_PTSConfig(void);
|
||||
uint8_t SC_Detect(void);
|
||||
uint32_t SC_GetDTableValue(uint32_t idx);
|
||||
void SC_VoltageConfig(uint32_t SC_Voltage);
|
||||
void SC_SetState(SC_State scState);
|
||||
void SC_IOConfig(void);
|
||||
|
||||
extern uint8_t SC_ATR_Table[40];
|
||||
extern SC_ATR SC_A2R;
|
||||
extern SC_ADPU_Response SC_Response;
|
||||
|
||||
extern uint8_t ProtocolNUM_OUT;
|
||||
extern SC_ADPU_Commands SC_ADPU;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USBD_CCID_SMARTCARD_TEMPLATE_H */
|
||||
Reference in New Issue
Block a user