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

View File

@@ -1,5 +1,5 @@
/* ---------------------------------------------------------------------------- /* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support * ATMEL Microcontroller Software Support
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation * Copyright (c) 2008, Atmel Corporation
* *
@@ -27,379 +27,350 @@
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
*/ */
/**------------------------------------------------------------------------------ //------------------------------------------------------------------------------
* \file /// \unit
* ///
* \section Purpose /// !Purpose
* ///
* Definition of methods for using a CCID device driver. /// Definition of methods for using a CCID device driver.
* ///
* \section Usage /// !Usage
* ///
* -# CCIDDriver_Initialize /// -# CCIDDriver_Initialize
* -# CCID_Read /// -# CCID_Read
* -# CCID_Write /// -# CCID_Write
* -# CCID_SmartCardRequest /// -# CCID_SmartCardRequest
* -# CCID_Insertion /// -# CCID_Insertion
* -# CCID_Removal /// -# CCID_Removal
* -# RDRtoPCHardwareError /// -# RDRtoPCHardwareError
*/ //------------------------------------------------------------------------------
#ifndef CCID_DRIVER_H #ifndef CCID_DRIVER_H
#define CCID_DRIVER_H #define CCID_DRIVER_H
/** \addtogroup usbd_ccid // FIXME: This is dirty! Typedef copied from USBD.h
*@{ typedef void (*TransferCallback)(void *pArg,
*/ uint8_t status,
/** For reference, the absolute maximum block size */ uint32_t transferred,
/** for a TPDU T=0 block is 260 bytes (5 bytes command; 255 bytes data), or */ uint32_t remaining);
/** 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. */
/// 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 ABDATA_SIZE 260
/** define protocol T=0 */ /// define protocol T=0
#define PROTOCOL_TO 0 #define PROTOCOL_TO 0
/** define protocol T=1 */ /// define protocol T=1
#define PROTOCOL_T1 1 #define PROTOCOL_T1 1
/** define for dwFeatures see Table 5.1-1 Smart Card Device Class Descriptors */ /// define for dwFeatures see Table 5.1-1 Smart Card Device Class Descriptors
/** No special characteristics */ /// No special characteristics
#define CCID_FEATURES_NADA 0x00000000 #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 #define CCID_FEATURES_AUTO_PCONF 0x00000002
/** Automatic activation of ICC on inserting */ /// Automatic activation of ICC on inserting
#define CCID_FEATURES_AUTO_ACTIV 0x00000004 #define CCID_FEATURES_AUTO_ACTIV 0x00000004
/** Automatic ICC voltage selection */ /// Automatic ICC voltage selection
#define CCID_FEATURES_AUTO_VOLT 0x00000008 #define CCID_FEATURES_AUTO_VOLT 0x00000008
/** Automatic ICC clock frequency change according to active parameters provided */ /// Automatic ICC clock frequency change according to active parameters provided
/** by the Host or self determined */ /// by the Host or self determined
#define CCID_FEATURES_AUTO_CLOCK 0x00000010 #define CCID_FEATURES_AUTO_CLOCK 0x00000010
/** Automatic baud rate change according to active parameters provided by the */ /// Automatic baud rate change according to active parameters provided by the
/** Host or self determined */ /// Host or self determined
#define CCID_FEATURES_AUTO_BAUD 0x00000020 #define CCID_FEATURES_AUTO_BAUD 0x00000020
/** Automatic parameters negotiation made by the CCID (use of warm or cold */ /// Automatic parameters negotiation made by the CCID (use of warm or cold
/** resets or PPS according to a manufacturer proprietary algorithm to select */ /// resets or PPS according to a manufacturer proprietary algorithm to select
/** the communication parameters with the ICC) */ /// the communication parameters with the ICC)
#define CCID_FEATURES_AUTO_PNEGO 0x00000040 #define CCID_FEATURES_AUTO_PNEGO 0x00000040
/** Automatic PPS made by the CCID according to the active parameters */ /// Automatic PPS made by the CCID according to the active parameters
#define CCID_FEATURES_AUTO_PPS 0x00000080 #define CCID_FEATURES_AUTO_PPS 0x00000080
/** CCID can set ICC in clock stop mode */ /// CCID can set ICC in clock stop mode
#define CCID_FEATURES_ICCSTOP 0x00000100 #define CCID_FEATURES_ICCSTOP 0x00000100
/** NAD value other than 00 accepted (T=1 protocol in use) */ /// NAD value other than 00 accepted (T=1 protocol in use)
#define CCID_FEATURES_NAD 0x00000200 #define CCID_FEATURES_NAD 0x00000200
/** Automatic IFSD exchange as first exchange (T=1 protocol in use) */ /// Automatic IFSD exchange as first exchange (T=1 protocol in use)
#define CCID_FEATURES_AUTO_IFSD 0x00000400 #define CCID_FEATURES_AUTO_IFSD 0x00000400
/** TPDU level exchanges with CCID */ /// TPDU level exchanges with CCID
#define CCID_FEATURES_EXC_TPDU 0x00010000 #define CCID_FEATURES_EXC_TPDU 0x00010000
/** Short APDU level exchange with CCID */ /// Short APDU level exchange with CCID
#define CCID_FEATURES_EXC_SAPDU 0x00020000 #define CCID_FEATURES_EXC_SAPDU 0x00020000
/** Short and Extended APDU level exchange with CCID */ /// Short and Extended APDU level exchange with CCID
#define CCID_FEATURES_EXC_APDU 0x00040000 #define CCID_FEATURES_EXC_APDU 0x00040000
/** USB Wake up signaling supported on card insertion and removal */ /// USB Wake up signaling supported on card insertion and removal
#define CCID_FEATURES_WAKEUP 0x00100000 #define CCID_FEATURES_WAKEUP 0x00100000
/*------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
* Types /// Bulk CCID Message header structure
typedef struct
*------------------------------------------------------------------------------*/
/**
* \typedef S_ccid_bulk_in_header
* \brief Bulk CCID Message header structure
*/
typedef struct _S_ccid_bulk_in_header
{ {
unsigned char bMessageType; unsigned char bMessageType;
/** Message-specific data length */ /// Message-specific data length
unsigned long wLength; unsigned long wLength;
/** Identifies the slot number for this command */ /// Identifies the slot number for this command
unsigned char bSlot; unsigned char bSlot;
/** Sequence number for command. */ /// Sequence number for command.
unsigned char bSeq; unsigned char bSeq;
/** Slot status register */ /// Slot status register
unsigned char bStatus; unsigned char bStatus;
/** Slot error */ /// Slot error
unsigned char bError; unsigned char bError;
/** specific register */ /// specific register
unsigned char bSpecific; unsigned char bSpecific;
/** Data block sent to the CCID. */ /// Data block sent to the CCID.
unsigned char abData[ABDATA_SIZE]; unsigned char abData[ABDATA_SIZE];
unsigned char bSizeToSend; unsigned char bSizeToSend;
} __attribute__ ((packed)) S_ccid_bulk_in_header; } __attribute__ ((packed)) S_ccid_bulk_in_header;
/** /// 6.1 Bulk Transfers
* \typedef S_ccid_bulk_out_header typedef struct
* \brief 6.1 Bulk Transfers
*/
typedef struct _S_ccid_bulk_out_header
{ {
unsigned char bMessageType; unsigned char bMessageType;
/** Message-specific data length */ /// Message-specific data length
unsigned long wLength; unsigned long wLength;
/** Identifies the slot number for this command */ /// Identifies the slot number for this command
unsigned char bSlot; unsigned char bSlot;
/** Sequence number for command. */ /// Sequence number for command.
unsigned char bSeq; unsigned char bSeq;
/** specific register */ /// specific register
unsigned char bSpecific_0; unsigned char bSpecific_0;
unsigned char bSpecific_1; unsigned char bSpecific_1;
unsigned char bSpecific_2; unsigned char bSpecific_2;
/** Application Protocol Data Unit */ /// Application Protocol Data Unit
unsigned char APDU[ABDATA_SIZE]; unsigned char APDU[ABDATA_SIZE];
} __attribute__ ((packed)) S_ccid_bulk_out_header; } __attribute__ ((packed)) S_ccid_bulk_out_header;
/** /// 6.1.11.2 PIN Verification Data Structure
* \typedef S_ccid_PIN_Verification typedef struct
* \brief 6.1.11.2 PIN Verification Data Structure
*/
typedef struct _S_ccid_PIN_Verification
{ {
/** Number of seconds. */ /// Number of seconds.
unsigned char bTimerOut; unsigned char bTimerOut;
/** Several parameters for the PIN format options */ /// Several parameters for the PIN format options
unsigned char bmFormatString; 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; unsigned char bmPINBlockString;
/** Allows the length PIN insertion in the APDU command */ /// Allows the length PIN insertion in the APDU command
unsigned char bmPINLengthFormat; 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; unsigned char wPINMaxExtraDigit;
/** The value is a bit wise OR operation. */ /// The value is a bit wise OR operation.
unsigned char bEntryValidationCondition; 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; unsigned char bNumberMessage;
/** Language used to display the messages. */ /// Language used to display the messages.
unsigned char wLangId; unsigned char wLangId;
/** Message index in the Reader message table */ /// Message index in the Reader message table
unsigned char bMsgIndex; unsigned char bMsgIndex;
/** T=1 I-block prologue field to use */ /// T=1 I-block prologue field to use
unsigned char bTeoPrologue[3]; unsigned char bTeoPrologue[3];
/** APDU to send to the ICC */ /// APDU to send to the ICC
unsigned char abPINApdu[255]; unsigned char abPINApdu[255];
}__attribute__ ((packed)) S_ccid_PIN_Verification; }__attribute__ ((packed)) S_ccid_PIN_Verification;
/** /// 6.1.11.7 PIN Modification Data Structure
* \typedef S_ccid_PIN_Modification typedef struct
* \brief 6.1.11.7 PIN Modification Data Structure
*/
typedef struct _S_ccid_PIN_Modification
{ {
/** 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; 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; 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; 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; unsigned char bmPinLengthFormat;
/** Insertion position offset in byte for the current PIN */ /// Insertion position offset in byte for the current PIN
unsigned char bInsertionOffsetOld; unsigned char bInsertionOffsetOld;
/** Insertion position offset in byte for the new PIN */ /// Insertion position offset in byte for the new PIN
unsigned char bInsertionOffsetNew; unsigned char bInsertionOffsetNew;
/** XXYYh */ /// XXYYh
/** XX: Minimum PIN size in digit */ /// XX: Minimum PIN size in digit
/** YY: Maximum PIN size in digit */ /// YY: Maximum PIN size in digit
unsigned char wPINMaxExtraDigit; unsigned char wPINMaxExtraDigit;
/** 00h,01h,02h,03h */ /// 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 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. */ /// Indicates if the current PIN must be entered and set in the same APDU field of not.
unsigned char bConfirmPIN; unsigned char bConfirmPIN;
/** The value is a bit wise OR operation. */ /// The value is a bit wise OR operation.
/** 01h Max size reached */ /// 01h Max size reached
/** 02h Validation key pressed */ /// 02h Validation key pressed
/** 04h Timeout occurred */ /// 04h Timeout occurred
unsigned char bEntryValidationCondition; unsigned char bEntryValidationCondition;
/** 00h,01h,02h,03h,or FFh */ /// 00h,01h,02h,03h,or FFh
/** Number of messages to display for the PIN modify command. */ /// Number of messages to display for the PIN modify command.
unsigned char bNumberMessage; unsigned char bNumberMessage;
/** Language used to display the messages. The 16 bit */ /// Language used to display the messages. The 16 bit
unsigned char wLangId; 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; 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; 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; 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]; unsigned char bTeoPrologue[3];
/** Byte array APDU to send to the ICC */ /// Byte array APDU to send to the ICC
unsigned char abPINApdu[255]; unsigned char abPINApdu[255];
}__attribute__ ((packed)) S_ccid_PIN_Modification; }__attribute__ ((packed)) S_ccid_PIN_Modification;
/** /// Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)
* \typedef S_ccid_protocol_t0 typedef struct
* \brief Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)
*/
typedef struct _S_ccid_protocol_t0
{ {
/** B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a */ /// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/** clock rate conversion factor */ /// clock rate conversion factor
/** B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a */ /// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/** baud rate conversion factor */ /// baud rate conversion factor
unsigned char bmFindexDindex; unsigned char bmFindexDindex;
/** For T=0 ,B0 0b, B7-2 000000b */ /// For T=0 ,B0 0b, B7-2 000000b
/** B1 Convention used (b1=0 for direct, b1=1 for inverse) */ /// B1 Convention used (b1=0 for direct, b1=1 for inverse)
unsigned char bmTCCKST0; /* 0 to 2 */ unsigned char bmTCCKST0; // 0 to 2
/// Extra Guardtime between two characters. Add 0 to 254 etu to the normal
/** Extra Guardtime between two characters. Add 0 to 254 etu to the normal */ /// guardtime of 12etu. FFh is the same as 00h.
/** guardtime of 12etu. FFh is the same as 00h. */ unsigned char bGuardTimeT0; // 0 to FF
unsigned char bGuardTimeT0; /* 0 to FF */ /// WI for T=0 used to define WWT
unsigned char bWaitingIntegerT0; // 0 to FF
/** WI for T=0 used to define WWT */ /// ICC Clock Stop Support
unsigned char bWaitingIntegerT0; /* 0 to FF */ /// 00 = Stopping the Clock is not allowed
/// 01 = Stop with Clock signal Low
/** ICC Clock Stop Support */ /// 02 = Stop with Clock signal High
/** 00 = Stopping the Clock is not allowed */ /// 03 = Stop with Clock either High or Low
/** 01 = Stop with Clock signal Low */ unsigned char bClockStop; // 0 to 3
/** 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; } __attribute__ ((packed)) S_ccid_protocol_t0;
/** /// Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)
* \typedef S_ccid_protocol_t1 typedef struct
* \brief Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)
*/
typedef struct _S_ccid_protocol_t1
{ {
/** B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a */ /// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/** clock rate conversion factor */ /// clock rate conversion factor
/** B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a */ /// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/** baud rate conversion factor */ /// baud rate conversion factor
unsigned char bmFindexDindex; unsigned char bmFindexDindex;
/** For T=1, B7-2 000100b */ /// For T=1, B7-2 000100b
/** B0 Checksum type (b0=0 for LRC, b0=1 for CRC */ /// B0 Checksum type (b0=0 for LRC, b0=1 for CRC
/** B1 Convention used (b1=0 for direct, b1=1 for inverse) */ /// B1 Convention used (b1=0 for direct, b1=1 for inverse)
unsigned char bmTCCKST1; /* 10h, 11h, 12h, 13h */ unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h
/// Extra Guardtime (0 to 254 etu between two characters).
/** Extra Guardtime (0 to 254 etu between two characters). */ /// If value is FFh, then guardtime is reduced by 1.
/** If value is FFh, then guardtime is reduced by 1. */ unsigned char bGuardTimeT1; // 0 to FF
unsigned char bGuardTimeT1; /* 0 to FF */ /// B7-4 = BWI
/// B3-0 = CWI
/** B7-4 = BWI */ unsigned char bmWaitingIntegersT1; // 0 to 9
/** B3-0 = CWI */ /// ICC Clock Stop Support
unsigned char bmWaitingIntegersT1; /* 0 to 9 */ /// 00 = Stopping the Clock is not allowed
/// 01 = Stop with Clock signal Low
/** ICC Clock Stop Support */ /// 02 = Stop with Clock signal High
/** 00 = Stopping the Clock is not allowed */ /// 03 = Stop with Clock either High or Low
/** 01 = Stop with Clock signal Low */ unsigned char bClockStop; // 0 to 3
/** 02 = Stop with Clock signal High */ /// Size of negotiated IFSC
/** 03 = Stop with Clock either High or Low */ unsigned char bIFSC; // 0 to FE
unsigned char bClockStop; /* 0 to 3 */ /// Nad value used by CCID
unsigned char bNadValue; // 0 to FF
/** 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; } __attribute__ ((packed)) S_ccid_protocol_t1;
/** /// Identifies the length of type of subordinate descriptors of a CCID device
* \typedef CCIDDescriptor /// Table 5.1-1 Smart Card Device Class descriptors
* \brief Identifies the length of type of subordinate descriptors of a CCID device typedef struct
* Table 5.1-1 Smart Card Device Class descriptors
*/
typedef struct _CCIDDescriptor
{ {
/** Size of this descriptor, in bytes. */ /// Size of this descriptor, in bytes.
unsigned char bLength; unsigned char bLength;
/** Functional Descriptor type */ /// Functional Descriptor type
unsigned char bDescriptorType; unsigned char bDescriptorType;
/** Integrated Circuit(s) Cards Interface Devices (CCID) Specification */ /// Integrated Circuit(s) Cards Interface Devices (CCID) Specification
/** Release Number */ /// Release Number
unsigned short bcdCCID; unsigned short bcdCCID;
/** Index of the highest available slot. An USB-ICC is regarded as a single */ /// Index of the highest available slot. An USB-ICC is regarded as a single
/** slot CCID. */ /// slot CCID.
unsigned char bMaxSlotIndex; unsigned char bMaxSlotIndex;
/** This value indicates what voltages the CCID can supply to its slots. */ /// This value indicates what voltages the CCID can supply to its slots.
/** It is a bitwise OR operation performed on the following values: */ /// It is a bitwise OR operation performed on the following values:
/** - 01h 5.0V */ /// - 01h 5.0V
/** - 02h 3.0V */ /// - 02h 3.0V
/** - 04h 1.8V */ /// - 04h 1.8V
/** Other bits are RFU. */ /// Other bits are RFU.
unsigned char bVoltageSupport; unsigned char bVoltageSupport;
/** RRRR Upper Word- is RFU = 0000h */ /// RRRR Upper Word- is RFU = 0000h
/** PPPP Lower Word- Encodes the supported protocol types. A 1 in a given */ /// PPPP Lower Word- Encodes the supported protocol types. A 1 in a given
/** bit position indicates support for the associated ISO protocol. */ /// bit position indicates support for the associated ISO protocol.
/** 0001h = Protocol T=0 */ /// 0001h = Protocol T=0
/** 0002h = Protocol T=1 */ /// 0002h = Protocol T=1
/** All other bits are reserved and must be set to zero. The field is */ /// All other bits are reserved and must be set to zero. The field is
/** intended to correspond to the PCSC specification definitions. */ /// intended to correspond to the PCSC specification definitions.
unsigned long dwProtocols; 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; 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; unsigned long dwMaximumClock;
/** The number of clock frequencies that are supported by the CCID. If the */ /// 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 */ /// value is 00h, the supported clock frequencies are assumed to be the
/** default clock frequency defined by dwDefaultClock and the maximum clock */ /// default clock frequency defined by dwDefaultClock and the maximum clock
/** frequency defined by dwMaximumClock. */ /// frequency defined by dwMaximumClock.
unsigned char bNumClockSupported; 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; unsigned long dwDataRate;
/** Maximum supported ICC I/O data rate in bps */ /// Maximum supported ICC I/O data rate in bps
unsigned long dwMaxDataRate; 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; 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; unsigned long dwMaxIFSD;
/** - RRRR-Upper Word- is RFU = 0000h */ /// - RRRR-Upper Word- is RFU = 0000h
/** - PPPP-Lower Word- encodes the supported protocol types. A 1 in a given */ /// - PPPP-Lower Word- encodes the supported protocol types. A 1 in a given
/** bit position indicates support for the associated protocol. */ /// bit position indicates support for the associated protocol.
/** 0001h indicates support for the 2-wire protocol 1 */ /// 0001h indicates support for the 2-wire protocol 1
/** 0002h indicates support for the 3-wire protocol 1 */ /// 0002h indicates support for the 3-wire protocol 1
/** 0004h indicates support for the I2C protocol 1 */ /// 0004h indicates support for the I2C protocol 1
/** All other values are outside of this specification, and must be handled */ /// All other values are outside of this specification, and must be handled
/** by vendor-supplied drivers. */ /// by vendor-supplied drivers.
unsigned long dwSynchProtocols; unsigned long dwSynchProtocols;
/** The value is a bitwise OR operation performed on the following values: */ /// The value is a bitwise OR operation performed on the following values:
/** - 00000000h No special characteristics */ /// - 00000000h No special characteristics
/** - 00000001h Card accept mechanism 2 */ /// - 00000001h Card accept mechanism 2
/** - 00000002h Card ejection mechanism 2 */ /// - 00000002h Card ejection mechanism 2
/** - 00000004h Card capture mechanism 2 */ /// - 00000004h Card capture mechanism 2
/** - 00000008h Card lock/unlock mechanism */ /// - 00000008h Card lock/unlock mechanism
unsigned long dwMechanical; unsigned long dwMechanical;
/** This value indicates what intelligent features the CCID has. */ /// This value indicates what intelligent features the CCID has.
unsigned long dwFeatures; unsigned long dwFeatures;
/** For extended APDU level the value shall be between 261 + 10 (header) and */ /// For extended APDU level the value shall be between 261 + 10 (header) and
/** 65544 +10, otherwise the minimum value is the wMaxPacketSize of the */ /// 65544 +10, otherwise the minimum value is the wMaxPacketSize of the
/** Bulk-OUT endpoint. */ /// Bulk-OUT endpoint.
unsigned long dwMaxCCIDMessageLength; 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; 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; 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; 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; unsigned char bPINSupport;
/** Maximum number of slots which can be simultaneously busy. */ /// Maximum number of slots which can be simultaneously busy.
unsigned char bMaxCCIDBusySlots; unsigned char bMaxCCIDBusySlots;
} __attribute__ ((packed)) CCIDDescriptor; } __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 ); unsigned char bHardwareErrorCode );
/*
#if !defined(NOAUTOCALLBACK) #if !defined(NOAUTOCALLBACK)
extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request); extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request);
#endif #endif
*/
extern void CCID_SmartCardRequest( void ); extern void CCID_SmartCardRequest( void );
extern void CCIDDriver_Initialize( void ); extern void CCIDDriver_Initialize( void );
extern unsigned char CCID_Read(void *pBuffer, 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_Insertion( void );
extern unsigned char CCID_Removal( 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 * Copyright (c) 2008, Atmel Corporation
* *
@@ -27,56 +27,47 @@
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
*/ */
/** \file //------------------------------------------------------------------------------
* Title: cciddriverdescriptors.h // Title: cciddriverdescriptors.h
* //
* \section Purpose // About: Purpose
* Definitions of the descriptors required by the ccid device driver. // Definitions of the descriptors required by the ccid device driver.
* DWG_Smart-Card_CCID_Rev110.pdf // DWG_Smart-Card_CCID_Rev110.pdf
* //------------------------------------------------------------------------------
*/
#ifndef CCID_DRIVER_DESCRIPTORS_H #ifndef CCID_DRIVER_DESCRIPTORS_H
#define 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
* Constants: Endpoints //------------------------------------------------------------------------------
* CCID_EPT_DATA_OUT endpoint data out bulk 1 #define CCID_EPT_DATA_OUT 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_DATA_IN 2
#define CCID_EPT_NOTIFICATION 3 #define CCID_EPT_NOTIFICATION 3
/*------------------------------------------------------------------------------ //------------------------------------------------------------------------------
* USB-ICC protocol // USB-ICC protocol
*------------------------------------------------------------------------------*/ //------------------------------------------------------------------------------
/* CCID specification version 1.10 */ // CCID specification version 1.10
#define CCID1_10 0x0110 #define CCID1_10 0x0110
#define SMART_CARD_DEVICE_CLASS 0x0B #define SMART_CARD_DEVICE_CLASS 0x0B
/* Smart Card Device Class Descriptor Type */ // Smart Card Device Class Descriptor Type
#define CCID_DECRIPTOR_TYPE 0x21 #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_ABORT 0x01
#define CCIDGenericRequest_GET_CLOCK_FREQUENCIES 0x02 #define CCIDGenericRequest_GET_CLOCK_FREQUENCIES 0x02
#define CCIDGenericRequest_GET_DATA_RATES 0x03 #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_ICCPOWERON 0x62
#define PC_TO_RDR_ICCPOWEROFF 0x63 #define PC_TO_RDR_ICCPOWEROFF 0x63
#define PC_TO_RDR_GETSLOTSTATUS 0x65 #define PC_TO_RDR_GETSLOTSTATUS 0x65
@@ -92,21 +83,18 @@
#define PC_TO_RDR_ABORT 0x72 #define PC_TO_RDR_ABORT 0x72
#define PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY 0x73 #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_DATABLOCK 0x80
#define RDR_TO_PC_SLOTSTATUS 0x81 #define RDR_TO_PC_SLOTSTATUS 0x81
#define RDR_TO_PC_PARAMETERS 0x82 #define RDR_TO_PC_PARAMETERS 0x82
#define RDR_TO_PC_ESCAPE 0x83 #define RDR_TO_PC_ESCAPE 0x83
#define RDR_TO_PC_DATARATEANDCLOCKFREQUENCY 0x84 #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_NOTIFYSLOTCHANGE 0x50
#define RDR_TO_PC_HARDWAREERROR 0x51 #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 CMD_ABORTED 0xFF
#define ICC_MUTE 0xFE #define ICC_MUTE 0xFE
#define XFR_PARITY_ERROR 0xFD #define XFR_PARITY_ERROR 0xFD
@@ -122,61 +110,43 @@
#define PIN_TIMEOUT 0xF0 #define PIN_TIMEOUT 0xF0
#define PIN_CANCELLED 0xEF #define PIN_CANCELLED 0xEF
#define CMD_SLOT_BUSY 0xE0 #define CMD_SLOT_BUSY 0xE0
/* User defined 0xC0 to 0x81 */ // User defined 0xC0 to 0x81
// Reserved for futur use 0x80
/* Reserved for futur use 0x80 */ // not supported incorrect message parameter 0x7F to 0x01
// Command not supported 0x00
/* not supported incorrect message parameter 0x7F to 0x01 */
/* Command not supported 0x00 */
/* CCID rev 1.1, p.27 */
// CCID rev 1.1, p.27
#define VOLTS_AUTO 0x00 #define VOLTS_AUTO 0x00
#define VOLTS_5_0 0x01 #define VOLTS_5_0 0x01
#define VOLTS_3_0 0x02 #define VOLTS_3_0 0x02
#define VOLTS_1_8 0x03 #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_NOT_PRESENT 0x00
#define ICC_PRESENT 0x01 #define ICC_PRESENT 0x01
#define ICC_CHANGE 0x02 #define ICC_CHANGE 0x02
#define ICC_INSERTED_EVENT ICC_PRESENT+ICC_CHANGE #define ICC_INSERTED_EVENT ICC_PRESENT+ICC_CHANGE
/* ICCD: Table 6.1-8 Bitmap for bStatus field */ // 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_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_PRESENT_NOTACTIVATED 0x01 /* USB-ICC is present but not activated */ #define ICC_BS_RFU 0x03 // RFU
#define ICC_CS_NO_ERROR (0x00<<6) // Processed without error
#define ICC_BS_NOTPRESENT 0x02 /* USB-ICC is virtually not present */ #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_BS_RFU 0x03 /* RFU */ #define ICC_CS_RFU (0x03<<6) // 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_ERROR 0x00
* #define NO_EXTRA_BYTES 0x00 #define NO_EXTRA_BYTES 0x00
* #define CCID_FLAG_INITIAL_VALUE 0x05 #define CCID_FLAG_INITIAL_VALUE 0x05
* #define CCID_EVENT_SIZE 0x02 #define CCID_EVENT_SIZE 0x02
* #define STATUS_MASK 0x41 #define STATUS_MASK 0x41
*/ */
/*------------------------------------------------------------------------------ //------------------------------------------------------------------------------
* Structures // Structures
*------------------------------------------------------------------------------*/ //------------------------------------------------------------------------------
/**@}*/
#endif /*#ifndef CCID_DRIVER_DESCRIPTORS_H */
#endif //#ifndef CCID_DRIVER_DESCRIPTORS_H