mirror of
https://github.com/STMicroelectronics/stm32-mw-usb-device.git
synced 2026-02-08 20:18:07 -05:00
280 lines
11 KiB
C
280 lines
11 KiB
C
/**
|
|
******************************************************************************
|
|
* @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 /* __USBD_CCID_IF_H */
|
|
|
|
/* 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_InterfaceByteTypeDef;
|
|
|
|
/* Protocol Level structure - ------------------------------------------------*/
|
|
typedef struct
|
|
{
|
|
SC_InterfaceByteTypeDef InterfaceByte[MAX_INTERFACEBYTE]; /* The Values of the Interface byte
|
|
TA(i), TB(i), TC(i)and TD(i) */
|
|
} SC_ProtocolLevelTypeDef;
|
|
|
|
/* 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_ProtocolLevelTypeDef T[MAX_PROTOCOLLEVEL]; /* Setup array */
|
|
uint8_t Historical[HIST_LENGTH]; /* Historical array */
|
|
uint8_t Tlength; /* Setup array dimension */
|
|
uint8_t Hlength; /* Historical array dimension */
|
|
uint8_t TCK;
|
|
} SC_ATRTypeDef;
|
|
|
|
/* 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_HeaderTypeDef;
|
|
|
|
/* 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_BodyTypeDef;
|
|
|
|
/* ADPU Command structure ----------------------------------------------------*/
|
|
typedef struct
|
|
{
|
|
SC_HeaderTypeDef Header;
|
|
SC_BodyTypeDef Body;
|
|
} SC_ADPU_CommandsTypeDef;
|
|
|
|
/* 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_ResponseTypeDef;
|
|
|
|
/* 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_CommandsTypeDef *SC_ADPU, SC_ADPU_ResponseTypeDef *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_ATRTypeDef SC_A2R;
|
|
extern SC_ADPU_ResponseTypeDef SC_Response;
|
|
|
|
extern uint8_t ProtocolNUM_OUT;
|
|
extern SC_ADPU_CommandsTypeDef SC_ADPU;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __USBD_CCID_SMARTCARD_TEMPLATE_H */
|