Updated cciddriver library files

I originally took the library files from https://github.com/zwizwa/simtrace
for cciddriver, etc.
Then I notices some things changed and between the AT91Lib for SAM7
and SAM3S I am using. Therefore I took the original files from the AT91Lib
which I downloaded for the SAM3S. Most lines only differ in comment convention.
This commit is contained in:
Christina Quast
2015-01-03 21:51:24 +01:00
parent 0b87d12002
commit f51e0d22fe
4 changed files with 959 additions and 1130 deletions

View File

@@ -910,6 +910,16 @@ static inline uint8_t UDP_Write(uint8_t bEndpoint,
}
TRACE_DEBUG_WP("Write%d(%d) ", bEndpoint, dLength);
/* int i;
for (i = 0; i < dLength; i++) {
if (!(i%16)) {
printf("\n\r");
}
printf("0x%x ", ((uint8_t*)pData)[i]);
}
printf("\n\r");
*/
/* Setup the transfer descriptor */
pTransfer->pData = (void *) pData;
pTransfer->remaining = dLength;
@@ -1039,6 +1049,16 @@ static inline uint8_t UDP_Read(uint8_t bEndpoint,
pEndpoint->state = UDP_ENDPOINT_RECEIVING;
TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength);
/* int i;
for (i = 0; i < dLength; i++) {
if (!(i%16)) {
printf("\n\r");
}
printf("0x%x ", ((uint8_t*)pData)[i]);
}
printf("\n\r");
*/
/* Set the transfer descriptor */
pTransfer->pData = pData;
pTransfer->remaining = dLength;
@@ -1073,6 +1093,8 @@ void USBD_IrqHandler(void)
Some interrupts may get masked depending on the device state */
status = UDP->UDP_ISR;
status &= UDP->UDP_IMR;
TRACE_DEBUG("status; 0x%x", status);
if (USBD_GetState() < USBD_STATE_POWERED) {
@@ -1527,6 +1549,8 @@ void USBD_HAL_SetConfiguration(uint8_t cfgnum)
*/
void USBD_HAL_Init(void)
{
TRACE_DEBUG("%s\n\r", "USBD_HAL_Init");
/* Must before USB & TXVC access! */
UDP_EnablePeripheralClock();

View File

@@ -1,5 +1,5 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
@@ -27,379 +27,350 @@
* ----------------------------------------------------------------------------
*/
/**------------------------------------------------------------------------------
* \file
*
* \section Purpose
*
* Definition of methods for using a CCID device driver.
*
* \section Usage
*
* -# CCIDDriver_Initialize
* -# CCID_Read
* -# CCID_Write
* -# CCID_SmartCardRequest
* -# CCID_Insertion
* -# CCID_Removal
* -# RDRtoPCHardwareError
*/
//------------------------------------------------------------------------------
/// \unit
///
/// !Purpose
///
/// Definition of methods for using a CCID device driver.
///
/// !Usage
///
/// -# CCIDDriver_Initialize
/// -# CCID_Read
/// -# CCID_Write
/// -# CCID_SmartCardRequest
/// -# CCID_Insertion
/// -# CCID_Removal
/// -# RDRtoPCHardwareError
//------------------------------------------------------------------------------
#ifndef CCID_DRIVER_H
#define CCID_DRIVER_H
/** \addtogroup usbd_ccid
*@{
*/
/** 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. */
// FIXME: This is dirty! Typedef copied from USBD.h
typedef void (*TransferCallback)(void *pArg,
uint8_t status,
uint32_t transferred,
uint32_t remaining);
/// 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.
#define ABDATA_SIZE 260
/** define protocol T=0 */
/// define protocol T=0
#define PROTOCOL_TO 0
/** define protocol T=1 */
/// define protocol T=1
#define PROTOCOL_T1 1
/** define for dwFeatures see Table 5.1-1 Smart Card Device Class Descriptors */
/** No special characteristics */
/// define for dwFeatures see Table 5.1-1 Smart Card Device Class Descriptors
/// No special characteristics
#define CCID_FEATURES_NADA 0x00000000
/** Automatic parameter configuration based on ATR data */
/// Automatic parameter configuration based on ATR data
#define CCID_FEATURES_AUTO_PCONF 0x00000002
/** Automatic activation of ICC on inserting */
#define CCID_FEATURES_AUTO_ACTIV 0x00000004
/** Automatic ICC voltage selection */
#define CCID_FEATURES_AUTO_VOLT 0x00000008
/** Automatic ICC clock frequency change according to active parameters provided */
/** by the Host or self determined */
#define CCID_FEATURES_AUTO_CLOCK 0x00000010
/** Automatic baud rate change according to active parameters provided by the */
/** Host or self determined */
#define CCID_FEATURES_AUTO_BAUD 0x00000020
/** Automatic parameters negotiation made by the CCID (use of warm or cold */
/** resets or PPS according to a manufacturer proprietary algorithm to select */
/** the communication parameters with the ICC) */
#define CCID_FEATURES_AUTO_PNEGO 0x00000040
/** Automatic PPS made by the CCID according to the active parameters */
#define CCID_FEATURES_AUTO_PPS 0x00000080
/** CCID can set ICC in clock stop mode */
#define CCID_FEATURES_ICCSTOP 0x00000100
/** NAD value other than 00 accepted (T=1 protocol in use) */
#define CCID_FEATURES_NAD 0x00000200
/** Automatic IFSD exchange as first exchange (T=1 protocol in use) */
#define CCID_FEATURES_AUTO_IFSD 0x00000400
/** TPDU level exchanges with CCID */
#define CCID_FEATURES_EXC_TPDU 0x00010000
/** Short APDU level exchange with CCID */
#define CCID_FEATURES_EXC_SAPDU 0x00020000
/** Short and Extended APDU level exchange with CCID */
#define CCID_FEATURES_EXC_APDU 0x00040000
/** USB Wake up signaling supported on card insertion and removal */
#define CCID_FEATURES_WAKEUP 0x00100000
/// Automatic activation of ICC on inserting
#define CCID_FEATURES_AUTO_ACTIV 0x00000004
/// Automatic ICC voltage selection
#define CCID_FEATURES_AUTO_VOLT 0x00000008
/// Automatic ICC clock frequency change according to active parameters provided
/// by the Host or self determined
#define CCID_FEATURES_AUTO_CLOCK 0x00000010
/// Automatic baud rate change according to active parameters provided by the
/// Host or self determined
#define CCID_FEATURES_AUTO_BAUD 0x00000020
/// Automatic parameters negotiation made by the CCID (use of warm or cold
/// resets or PPS according to a manufacturer proprietary algorithm to select
/// the communication parameters with the ICC)
#define CCID_FEATURES_AUTO_PNEGO 0x00000040
/// Automatic PPS made by the CCID according to the active parameters
#define CCID_FEATURES_AUTO_PPS 0x00000080
/// CCID can set ICC in clock stop mode
#define CCID_FEATURES_ICCSTOP 0x00000100
/// NAD value other than 00 accepted (T=1 protocol in use)
#define CCID_FEATURES_NAD 0x00000200
/// Automatic IFSD exchange as first exchange (T=1 protocol in use)
#define CCID_FEATURES_AUTO_IFSD 0x00000400
/// TPDU level exchanges with CCID
#define CCID_FEATURES_EXC_TPDU 0x00010000
/// Short APDU level exchange with CCID
#define CCID_FEATURES_EXC_SAPDU 0x00020000
/// Short and Extended APDU level exchange with CCID
#define CCID_FEATURES_EXC_APDU 0x00040000
/// USB Wake up signaling supported on card insertion and removal
#define CCID_FEATURES_WAKEUP 0x00100000
/*------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/**
* \typedef S_ccid_bulk_in_header
* \brief Bulk CCID Message header structure
*/
typedef struct _S_ccid_bulk_in_header
/// Bulk CCID Message header structure
typedef struct
{
unsigned char bMessageType;
/** Message-specific data length */
/// Message-specific data length
unsigned long wLength;
/** Identifies the slot number for this command */
/// Identifies the slot number for this command
unsigned char bSlot;
/** Sequence number for command. */
/// Sequence number for command.
unsigned char bSeq;
/** Slot status register */
/// Slot status register
unsigned char bStatus;
/** Slot error */
/// Slot error
unsigned char bError;
/** specific register */
/// specific register
unsigned char bSpecific;
/** Data block sent to the CCID. */
/// Data block sent to the CCID.
unsigned char abData[ABDATA_SIZE];
unsigned char bSizeToSend;
} __attribute__ ((packed)) S_ccid_bulk_in_header;
/**
* \typedef S_ccid_bulk_out_header
* \brief 6.1 Bulk Transfers
*/
typedef struct _S_ccid_bulk_out_header
/// 6.1 Bulk Transfers
typedef struct
{
unsigned char bMessageType;
/** Message-specific data length */
/// Message-specific data length
unsigned long wLength;
/** Identifies the slot number for this command */
/// Identifies the slot number for this command
unsigned char bSlot;
/** Sequence number for command. */
/// Sequence number for command.
unsigned char bSeq;
/** specific register */
/// specific register
unsigned char bSpecific_0;
unsigned char bSpecific_1;
unsigned char bSpecific_2;
/** Application Protocol Data Unit */
/// Application Protocol Data Unit
unsigned char APDU[ABDATA_SIZE];
} __attribute__ ((packed)) S_ccid_bulk_out_header;
/**
* \typedef S_ccid_PIN_Verification
* \brief 6.1.11.2 PIN Verification Data Structure
*/
typedef struct _S_ccid_PIN_Verification
/// 6.1.11.2 PIN Verification Data Structure
typedef struct
{
/** Number of seconds. */
/// Number of seconds.
unsigned char bTimerOut;
/** Several parameters for the PIN format options */
/// Several parameters for the PIN format options
unsigned char bmFormatString;
/** Define the length of the PIN to present in the APDU command */
/// Define the length of the PIN to present in the APDU command
unsigned char bmPINBlockString;
/** Allows the length PIN insertion in the APDU command */
/// Allows the length PIN insertion in the APDU command
unsigned char bmPINLengthFormat;
/** Minimum PIN size in digit and Maximum PIN size in digit */
/// Minimum PIN size in digit and Maximum PIN size in digit
unsigned char wPINMaxExtraDigit;
/** The value is a bit wise OR operation. */
/// The value is a bit wise OR operation.
unsigned char bEntryValidationCondition;
/** Number of messages to display for the PIN modify command */
/// Number of messages to display for the PIN modify command
unsigned char bNumberMessage;
/** Language used to display the messages. */
/// Language used to display the messages.
unsigned char wLangId;
/** Message index in the Reader message table */
/// Message index in the Reader message table
unsigned char bMsgIndex;
/** T=1 I-block prologue field to use */
/// T=1 I-block prologue field to use
unsigned char bTeoPrologue[3];
/** APDU to send to the ICC */
/// APDU to send to the ICC
unsigned char abPINApdu[255];
}__attribute__ ((packed)) S_ccid_PIN_Verification;
/**
* \typedef S_ccid_PIN_Modification
* \brief 6.1.11.7 PIN Modification Data Structure
*/
typedef struct _S_ccid_PIN_Modification
/// 6.1.11.7 PIN Modification Data Structure
typedef struct
{
/** Number of seconds. If 00h then CCID default value is used. */
/// Number of seconds. If 00h then CCID default value is used.
unsigned char bTimeOut;
/** Several parameters for the PIN format options (defined in § 6.1.11.4) */
/// Several parameters for the PIN format options (defined in § 6.1.11.4)
unsigned char bmFormatString4;
/** Define the length of the PIN to present in the APDU command */
/// Define the length of the PIN to present in the APDU command
unsigned char bmPINBlockString;
/** Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6) */
/// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)
unsigned char bmPinLengthFormat;
/** Insertion position offset in byte for the current PIN */
/// Insertion position offset in byte for the current PIN
unsigned char bInsertionOffsetOld;
/** Insertion position offset in byte for the new PIN */
/// Insertion position offset in byte for the new PIN
unsigned char bInsertionOffsetNew;
/** XXYYh */
/** XX: Minimum PIN size in digit */
/** YY: Maximum PIN size in digit */
/// XXYYh
/// XX: Minimum PIN size in digit
/// YY: Maximum PIN size in digit
unsigned char wPINMaxExtraDigit;
/** 00h,01h,02h,03h */
/** Indicates if a confirmation is requested before acceptance of a new PIN (meaning that the user has to enter this new PIN twice before it is accepted) */
/** Indicates if the current PIN must be entered and set in the same APDU field of not. */
/// 00h,01h,02h,03h
/// Indicates if a confirmation is requested before acceptance of a new PIN (meaning that the user has to enter this new PIN twice before it is accepted)
/// Indicates if the current PIN must be entered and set in the same APDU field of not.
unsigned char bConfirmPIN;
/** The value is a bit wise OR operation. */
/** 01h Max size reached */
/** 02h Validation key pressed */
/** 04h Timeout occurred */
/// The value is a bit wise OR operation.
/// 01h Max size reached
/// 02h Validation key pressed
/// 04h Timeout occurred
unsigned char bEntryValidationCondition;
/** 00h,01h,02h,03h,or FFh */
/** Number of messages to display for the PIN modify command. */
/// 00h,01h,02h,03h,or FFh
/// Number of messages to display for the PIN modify command.
unsigned char bNumberMessage;
/** Language used to display the messages. The 16 bit */
/// Language used to display the messages. The 16 bit
unsigned char wLangId;
/** Message index in the Reader message table (should be 00h or 01h). */
/// Message index in the Reader message table (should be 00h or 01h).
unsigned char bMsgIndex1;
/** Message index in the Reader message table (should be 01h or 02h). */
/// Message index in the Reader message table (should be 01h or 02h).
unsigned char bMsgIndex2;
/** Message index in the Reader message table (should be 02h). */
/// Message index in the Reader message table (should be 02h).
unsigned char bMsgIndex3;
/** T=1 I-block prologue field to use. Significant only if protocol in use is T=1. */
/// T=1 I-block prologue field to use. Significant only if protocol in use is T=1.
unsigned char bTeoPrologue[3];
/** Byte array APDU to send to the ICC */
/// Byte array APDU to send to the ICC
unsigned char abPINApdu[255];
}__attribute__ ((packed)) S_ccid_PIN_Modification;
/**
* \typedef S_ccid_protocol_t0
* \brief Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)
*/
typedef struct _S_ccid_protocol_t0
/// Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)
typedef struct
{
/** B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a */
/** clock rate conversion factor */
/** B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a */
/** baud rate conversion factor */
/// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/// clock rate conversion factor
/// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/// baud rate conversion factor
unsigned char bmFindexDindex;
/** For T=0 ,B0 0b, B7-2 000000b */
/** B1 Convention used (b1=0 for direct, b1=1 for inverse) */
unsigned char bmTCCKST0; /* 0 to 2 */
/** Extra Guardtime between two characters. Add 0 to 254 etu to the normal */
/** guardtime of 12etu. FFh is the same as 00h. */
unsigned char bGuardTimeT0; /* 0 to FF */
/** WI for T=0 used to define WWT */
unsigned char bWaitingIntegerT0; /* 0 to FF */
/** ICC Clock Stop Support */
/** 00 = Stopping the Clock is not allowed */
/** 01 = Stop with Clock signal Low */
/** 02 = Stop with Clock signal High */
/** 03 = Stop with Clock either High or Low */
unsigned char bClockStop; /* 0 to 3 */
/// For T=0 ,B0 0b, B7-2 000000b
/// B1 Convention used (b1=0 for direct, b1=1 for inverse)
unsigned char bmTCCKST0; // 0 to 2
/// Extra Guardtime between two characters. Add 0 to 254 etu to the normal
/// guardtime of 12etu. FFh is the same as 00h.
unsigned char bGuardTimeT0; // 0 to FF
/// WI for T=0 used to define WWT
unsigned char bWaitingIntegerT0; // 0 to FF
/// ICC Clock Stop Support
/// 00 = Stopping the Clock is not allowed
/// 01 = Stop with Clock signal Low
/// 02 = Stop with Clock signal High
/// 03 = Stop with Clock either High or Low
unsigned char bClockStop; // 0 to 3
} __attribute__ ((packed)) S_ccid_protocol_t0;
/**
* \typedef S_ccid_protocol_t1
* \brief Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)
*/
typedef struct _S_ccid_protocol_t1
/// Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)
typedef struct
{
/** B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a */
/** clock rate conversion factor */
/** B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a */
/** baud rate conversion factor */
/// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/// clock rate conversion factor
/// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/// baud rate conversion factor
unsigned char bmFindexDindex;
/** For T=1, B7-2 000100b */
/** B0 Checksum type (b0=0 for LRC, b0=1 for CRC */
/** B1 Convention used (b1=0 for direct, b1=1 for inverse) */
unsigned char bmTCCKST1; /* 10h, 11h, 12h, 13h */
/** Extra Guardtime (0 to 254 etu between two characters). */
/** If value is FFh, then guardtime is reduced by 1. */
unsigned char bGuardTimeT1; /* 0 to FF */
/** B7-4 = BWI */
/** B3-0 = CWI */
unsigned char bmWaitingIntegersT1; /* 0 to 9 */
/** ICC Clock Stop Support */
/** 00 = Stopping the Clock is not allowed */
/** 01 = Stop with Clock signal Low */
/** 02 = Stop with Clock signal High */
/** 03 = Stop with Clock either High or Low */
unsigned char bClockStop; /* 0 to 3 */
/** Size of negotiated IFSC */
unsigned char bIFSC; /* 0 to FE */
/** Nad value used by CCID */
unsigned char bNadValue; /* 0 to FF */
/// For T=1, B7-2 000100b
/// B0 Checksum type (b0=0 for LRC, b0=1 for CRC
/// B1 Convention used (b1=0 for direct, b1=1 for inverse)
unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h
/// Extra Guardtime (0 to 254 etu between two characters).
/// If value is FFh, then guardtime is reduced by 1.
unsigned char bGuardTimeT1; // 0 to FF
/// B7-4 = BWI
/// B3-0 = CWI
unsigned char bmWaitingIntegersT1; // 0 to 9
/// ICC Clock Stop Support
/// 00 = Stopping the Clock is not allowed
/// 01 = Stop with Clock signal Low
/// 02 = Stop with Clock signal High
/// 03 = Stop with Clock either High or Low
unsigned char bClockStop; // 0 to 3
/// Size of negotiated IFSC
unsigned char bIFSC; // 0 to FE
/// Nad value used by CCID
unsigned char bNadValue; // 0 to FF
} __attribute__ ((packed)) S_ccid_protocol_t1;
/**
* \typedef CCIDDescriptor
* \brief Identifies the length of type of subordinate descriptors of a CCID device
* Table 5.1-1 Smart Card Device Class descriptors
*/
typedef struct _CCIDDescriptor
/// Identifies the length of type of subordinate descriptors of a CCID device
/// Table 5.1-1 Smart Card Device Class descriptors
typedef struct
{
/** Size of this descriptor, in bytes. */
/// Size of this descriptor, in bytes.
unsigned char bLength;
/** Functional Descriptor type */
/// Functional Descriptor type
unsigned char bDescriptorType;
/** Integrated Circuit(s) Cards Interface Devices (CCID) Specification */
/** Release Number */
/// Integrated Circuit(s) Cards Interface Devices (CCID) Specification
/// Release Number
unsigned short bcdCCID;
/** Index of the highest available slot. An USB-ICC is regarded as a single */
/** slot CCID. */
/// Index of the highest available slot. An USB-ICC is regarded as a single
/// slot CCID.
unsigned char bMaxSlotIndex;
/** This value indicates what voltages the CCID can supply to its slots. */
/** It is a bitwise OR operation performed on the following values: */
/** - 01h 5.0V */
/** - 02h 3.0V */
/** - 04h 1.8V */
/** Other bits are RFU. */
/// This value indicates what voltages the CCID can supply to its slots.
/// It is a bitwise OR operation performed on the following values:
/// - 01h 5.0V
/// - 02h 3.0V
/// - 04h 1.8V
/// Other bits are RFU.
unsigned char bVoltageSupport;
/** RRRR Upper Word- is RFU = 0000h */
/** PPPP Lower Word- Encodes the supported protocol types. A 1 in a given */
/** bit position indicates support for the associated ISO protocol. */
/** 0001h = Protocol T=0 */
/** 0002h = Protocol T=1 */
/** All other bits are reserved and must be set to zero. The field is */
/** intended to correspond to the PCSC specification definitions. */
/// RRRR Upper Word- is RFU = 0000h
/// PPPP Lower Word- Encodes the supported protocol types. A 1 in a given
/// bit position indicates support for the associated ISO protocol.
/// 0001h = Protocol T=0
/// 0002h = Protocol T=1
/// All other bits are reserved and must be set to zero. The field is
/// intended to correspond to the PCSC specification definitions.
unsigned long dwProtocols;
/** Default ICC clock frequency in KHz. This is an integer value. */
/// Default ICC clock frequency in KHz. This is an integer value.
unsigned long dwDefaultClock;
/** Maximum supported ICC clock frequency in KHz. This is an integer value. */
/// Maximum supported ICC clock frequency in KHz. This is an integer value.
unsigned long dwMaximumClock;
/** The number of clock frequencies that are supported by the CCID. If the */
/** value is 00h, the supported clock frequencies are assumed to be the */
/** default clock frequency defined by dwDefaultClock and the maximum clock */
/** frequency defined by dwMaximumClock. */
/// The number of clock frequencies that are supported by the CCID. If the
/// value is 00h, the supported clock frequencies are assumed to be the
/// default clock frequency defined by dwDefaultClock and the maximum clock
/// frequency defined by dwMaximumClock.
unsigned char bNumClockSupported;
/** Default ICC I/O data rate in bps. This is an integer value */
/// Default ICC I/O data rate in bps. This is an integer value
unsigned long dwDataRate;
/** Maximum supported ICC I/O data rate in bps */
/// Maximum supported ICC I/O data rate in bps
unsigned long dwMaxDataRate;
/** The number of data rates that are supported by the CCID. */
/// The number of data rates that are supported by the CCID.
unsigned char bNumDataRatesSupported;
/** Indicates the maximum IFSD supported by CCID for protocol T=1. */
/// Indicates the maximum IFSD supported by CCID for protocol T=1.
unsigned long dwMaxIFSD;
/** - RRRR-Upper Word- is RFU = 0000h */
/** - PPPP-Lower Word- encodes the supported protocol types. A 1 in a given */
/** bit position indicates support for the associated protocol. */
/** 0001h indicates support for the 2-wire protocol 1 */
/** 0002h indicates support for the 3-wire protocol 1 */
/** 0004h indicates support for the I2C protocol 1 */
/** All other values are outside of this specification, and must be handled */
/** by vendor-supplied drivers. */
/// - RRRR-Upper Word- is RFU = 0000h
/// - PPPP-Lower Word- encodes the supported protocol types. A 1 in a given
/// bit position indicates support for the associated protocol.
/// 0001h indicates support for the 2-wire protocol 1
/// 0002h indicates support for the 3-wire protocol 1
/// 0004h indicates support for the I2C protocol 1
/// All other values are outside of this specification, and must be handled
/// by vendor-supplied drivers.
unsigned long dwSynchProtocols;
/** The value is a bitwise OR operation performed on the following values: */
/** - 00000000h No special characteristics */
/** - 00000001h Card accept mechanism 2 */
/** - 00000002h Card ejection mechanism 2 */
/** - 00000004h Card capture mechanism 2 */
/** - 00000008h Card lock/unlock mechanism */
/// The value is a bitwise OR operation performed on the following values:
/// - 00000000h No special characteristics
/// - 00000001h Card accept mechanism 2
/// - 00000002h Card ejection mechanism 2
/// - 00000004h Card capture mechanism 2
/// - 00000008h Card lock/unlock mechanism
unsigned long dwMechanical;
/** This value indicates what intelligent features the CCID has. */
/// This value indicates what intelligent features the CCID has.
unsigned long dwFeatures;
/** For extended APDU level the value shall be between 261 + 10 (header) and */
/** 65544 +10, otherwise the minimum value is the wMaxPacketSize of the */
/** Bulk-OUT endpoint. */
/// For extended APDU level the value shall be between 261 + 10 (header) and
/// 65544 +10, otherwise the minimum value is the wMaxPacketSize of the
/// Bulk-OUT endpoint.
unsigned long dwMaxCCIDMessageLength;
/** Significant only for CCID that offers an APDU level for exchanges. */
/// Significant only for CCID that offers an APDU level for exchanges.
unsigned char bClassGetResponse;
/** Significant only for CCID that offers an extended APDU level for exchanges. */
/// Significant only for CCID that offers an extended APDU level for exchanges.
unsigned char bClassEnvelope;
/** Number of lines and characters for the LCD display used to send messages for PIN entry. */
/// Number of lines and characters for the LCD display used to send messages for PIN entry.
unsigned short wLcdLayout;
/** This value indicates what PIN support features the CCID has. */
/// This value indicates what PIN support features the CCID has.
unsigned char bPINSupport;
/** Maximum number of slots which can be simultaneously busy. */
/// Maximum number of slots which can be simultaneously busy.
unsigned char bMaxCCIDBusySlots;
} __attribute__ ((packed)) CCIDDescriptor;
/*------------------------------------------------------------------------------ */
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
/* Exported functions */
/*------------------------------------------------------------------------------ */
extern unsigned char RDRtoPCHardwareError( unsigned char bSlot,
unsigned char bSeq,
extern unsigned char RDRtoPCHardwareError( unsigned char bSlot,
unsigned char bSeq,
unsigned char bHardwareErrorCode );
/*
#if !defined(NOAUTOCALLBACK)
extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request);
#endif
*/
extern void CCID_SmartCardRequest( void );
extern void CCIDDriver_Initialize( void );
extern unsigned char CCID_Read(void *pBuffer,
@@ -413,8 +384,5 @@ extern unsigned char CCID_Write(void *pBuffer,
extern unsigned char CCID_Insertion( void );
extern unsigned char CCID_Removal( void );
/**@}*/
#endif /*#ifndef CCID_DRIVER_H */
#endif //#ifndef CCID_DRIVER_H

View File

@@ -1,5 +1,5 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
@@ -27,56 +27,47 @@
* ----------------------------------------------------------------------------
*/
/** \file
* Title: cciddriverdescriptors.h
*
* \section Purpose
* Definitions of the descriptors required by the ccid device driver.
* DWG_Smart-Card_CCID_Rev110.pdf
*
*/
//------------------------------------------------------------------------------
// Title: cciddriverdescriptors.h
//
// About: Purpose
// Definitions of the descriptors required by the ccid device driver.
// DWG_Smart-Card_CCID_Rev110.pdf
//------------------------------------------------------------------------------
#ifndef CCID_DRIVER_DESCRIPTORS_H
#define CCID_DRIVER_DESCRIPTORS_H
/** \addtogroup usbd_ccid
*@{
*/
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Constants: Endpoints
* CCID_EPT_DATA_OUT endpoint data out bulk 1
* CCID_EPT_DATA_IN endpoint data in bulk 2
* CCID_EPT_NOTIFICATION endpoint data interupt 3
*------------------------------------------------------------------------------*/
#define CCID_EPT_DATA_OUT 1
//------------------------------------------------------------------------------
// Constants: Endpoints
// CCID_EPT_DATA_OUT endpoint data out bulk 1
// CCID_EPT_DATA_IN endpoint data in bulk 2
// CCID_EPT_NOTIFICATION endpoint data interupt 3
//------------------------------------------------------------------------------
#define CCID_EPT_DATA_OUT 1
#define CCID_EPT_DATA_IN 2
#define CCID_EPT_NOTIFICATION 3
/*------------------------------------------------------------------------------
* USB-ICC protocol
*------------------------------------------------------------------------------*/
/* CCID specification version 1.10 */
//------------------------------------------------------------------------------
// USB-ICC protocol
//------------------------------------------------------------------------------
// CCID specification version 1.10
#define CCID1_10 0x0110
#define SMART_CARD_DEVICE_CLASS 0x0B
/* Smart Card Device Class Descriptor Type */
// Smart Card Device Class Descriptor Type
#define CCID_DECRIPTOR_TYPE 0x21
/* Table 5.3-1 Summary of CCID Class Specific Request */
// Table 5.3-1 Summary of CCID Class Specific Request
#define CCIDGenericRequest_ABORT 0x01
#define CCIDGenericRequest_GET_CLOCK_FREQUENCIES 0x02
#define CCIDGenericRequest_GET_DATA_RATES 0x03
/* 6.1 Command Pipe, Bulk-OUT Messages */
// 6.1 Command Pipe, Bulk-OUT Messages
#define PC_TO_RDR_ICCPOWERON 0x62
#define PC_TO_RDR_ICCPOWEROFF 0x63
#define PC_TO_RDR_GETSLOTSTATUS 0x65
@@ -92,21 +83,18 @@
#define PC_TO_RDR_ABORT 0x72
#define PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY 0x73
/* 6.2 Response Pipe, Bulk-IN Messages */
// 6.2 Response Pipe, Bulk-IN Messages
#define RDR_TO_PC_DATABLOCK 0x80
#define RDR_TO_PC_SLOTSTATUS 0x81
#define RDR_TO_PC_PARAMETERS 0x82
#define RDR_TO_PC_ESCAPE 0x83
#define RDR_TO_PC_DATARATEANDCLOCKFREQUENCY 0x84
/* 6.3 Interrupt-IN Messages */
// 6.3 Interrupt-IN Messages
#define RDR_TO_PC_NOTIFYSLOTCHANGE 0x50
#define RDR_TO_PC_HARDWAREERROR 0x51
/* Table 6.2-2 Slot error register when bmCommandStatus = 1 */
// Table 6.2-2 Slot error register when bmCommandStatus = 1
#define CMD_ABORTED 0xFF
#define ICC_MUTE 0xFE
#define XFR_PARITY_ERROR 0xFD
@@ -122,61 +110,43 @@
#define PIN_TIMEOUT 0xF0
#define PIN_CANCELLED 0xEF
#define CMD_SLOT_BUSY 0xE0
/* User defined 0xC0 to 0x81 */
/* Reserved for futur use 0x80 */
/* not supported incorrect message parameter 0x7F to 0x01 */
/* Command not supported 0x00 */
/* CCID rev 1.1, p.27 */
// User defined 0xC0 to 0x81
// Reserved for futur use 0x80
// not supported incorrect message parameter 0x7F to 0x01
// Command not supported 0x00
// CCID rev 1.1, p.27
#define VOLTS_AUTO 0x00
#define VOLTS_5_0 0x01
#define VOLTS_3_0 0x02
#define VOLTS_1_8 0x03
/* 6.3.1 RDR_to_PC_NotifySlotChange */
// 6.3.1 RDR_to_PC_NotifySlotChange
#define ICC_NOT_PRESENT 0x00
#define ICC_PRESENT 0x01
#define ICC_CHANGE 0x02
#define ICC_INSERTED_EVENT ICC_PRESENT+ICC_CHANGE
/* ICCD: Table 6.1-8 Bitmap for bStatus field */
#define ICC_BS_PRESENT_ACTIVATED 0x00 /* USB-ICC is present and activated */
#define ICC_BS_PRESENT_NOTACTIVATED 0x01 /* USB-ICC is present but not activated */
#define ICC_BS_NOTPRESENT 0x02 /* USB-ICC is virtually not present */
#define ICC_BS_RFU 0x03 /* RFU */
#define ICC_CS_NO_ERROR (0x00<<6) /* Processed without error */
#define ICC_CS_FAILED (0x01<<6) /* Failed, error condition given by bError */
#define ICC_CS_TIME_EXT (0x02<<6) /* Time extension is requested */
#define ICC_CS_RFU (0x03<<6) /* RFU */
// ICCD: Table 6.1-8 Bitmap for bStatus field
#define ICC_BS_PRESENT_ACTIVATED 0x00 // USB-ICC is present and activated
#define ICC_BS_PRESENT_NOTACTIVATED 0x01 // USB-ICC is present but not activated
#define ICC_BS_NOTPRESENT 0x02 // USB-ICC is virtually not present
#define ICC_BS_RFU 0x03 // RFU
#define ICC_CS_NO_ERROR (0x00<<6) // Processed without error
#define ICC_CS_FAILED (0x01<<6) // Failed, error condition given by bError
#define ICC_CS_TIME_EXT (0x02<<6) // Time extension is requested
#define ICC_CS_RFU (0x03<<6) // RFU
/*
* #define NO_ERROR 0x00
* #define NO_EXTRA_BYTES 0x00
* #define CCID_FLAG_INITIAL_VALUE 0x05
* #define CCID_EVENT_SIZE 0x02
* #define STATUS_MASK 0x41
*/
/*------------------------------------------------------------------------------
* Structures
*------------------------------------------------------------------------------*/
/**@}*/
#endif /*#ifndef CCID_DRIVER_DESCRIPTORS_H */
#define NO_ERROR 0x00
#define NO_EXTRA_BYTES 0x00
#define CCID_FLAG_INITIAL_VALUE 0x05
#define CCID_EVENT_SIZE 0x02
#define STATUS_MASK 0x41
*/
//------------------------------------------------------------------------------
// Structures
//------------------------------------------------------------------------------
#endif //#ifndef CCID_DRIVER_DESCRIPTORS_H