diff options
-rw-r--r-- | Demos/Device/ClassDriver/CCID/CCID.c | 22 | ||||
-rw-r--r-- | Demos/Device/ClassDriver/CCID/CCID.h | 25 | ||||
-rw-r--r-- | Demos/Device/ClassDriver/CCID/Lib/Iso7816.c | 4 | ||||
-rw-r--r-- | Demos/Device/ClassDriver/CCID/Lib/Iso7816.h | 4 | ||||
-rw-r--r-- | Demos/Device/LowLevel/CCID/CCID.c | 14 | ||||
-rw-r--r-- | Demos/Device/LowLevel/CCID/CCID.h | 17 | ||||
-rw-r--r-- | Demos/Device/LowLevel/CCID/Lib/Iso7816.c | 3 | ||||
-rw-r--r-- | Demos/Device/LowLevel/CCID/Lib/Iso7816.h | 4 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/CCIDClass.h | 9 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Common/CCIDClassCommon.h | 3 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c | 13 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h | 67 |
12 files changed, 114 insertions, 71 deletions
diff --git a/Demos/Device/ClassDriver/CCID/CCID.c b/Demos/Device/ClassDriver/CCID/CCID.c index 916306505..9059ad40d 100644 --- a/Demos/Device/ClassDriver/CCID/CCID.c +++ b/Demos/Device/ClassDriver/CCID/CCID.c @@ -157,10 +157,11 @@ void EVENT_USB_Device_ControlRequest(void) * whenever an application at the host wants to send a power off signal to a slot. * THe slot must reply back with a recognizable ATR (answer to reset) */ -uint8_t CALLBACK_CCID_IccPowerOn(uint8_t slot, - uint8_t* atr, - uint8_t* attrSize, - uint8_t* error) +uint8_t CALLBACK_CCID_IccPowerOn(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const atr, + uint8_t* const attrSize, + uint8_t* const error) { if (slot < CCID_Interface.Config.TotalSlots) { @@ -176,7 +177,9 @@ uint8_t CALLBACK_CCID_IccPowerOn(uint8_t slot, /** Event handler for the CCID_PC_to_RDR_IccPowerOff message. This message is sent to the device * whenever an application at the host wants to send a power off signal to a slot. */ -uint8_t CALLBACK_CCID_IccPowerOff(uint8_t slot, uint8_t* error) +uint8_t CALLBACK_CCID_IccPowerOff(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const error) { if (slot < CCID_Interface.Config.TotalSlots) { @@ -194,7 +197,9 @@ uint8_t CALLBACK_CCID_IccPowerOff(uint8_t slot, uint8_t* error) * whenever an application at the host wants to the get the current slot status * */ -uint8_t CALLBACK_CCID_GetSlotStatus(uint8_t slot, uint8_t* error) +uint8_t CALLBACK_CCID_GetSlotStatus(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const error) { if (slot < CCID_Interface.Config.TotalSlots) { @@ -208,9 +213,10 @@ uint8_t CALLBACK_CCID_GetSlotStatus(uint8_t slot, uint8_t* error) } } -uint8_t CALLBACK_CCID_Abort(uint8_t slot, +uint8_t CALLBACK_CCID_Abort(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, uint8_t seq, - uint8_t* error) + uint8_t* const error) { if (CCID_Interface.State.Aborted && slot == 0 && CCID_Interface.State.AbortedSeq == seq) { diff --git a/Demos/Device/ClassDriver/CCID/CCID.h b/Demos/Device/ClassDriver/CCID/CCID.h index 608fb7801..f6dd4adf5 100644 --- a/Demos/Device/ClassDriver/CCID/CCID.h +++ b/Demos/Device/ClassDriver/CCID/CCID.h @@ -75,16 +75,21 @@ void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_ControlRequest(void); - uint8_t CALLBACK_CCID_IccPowerOn(uint8_t slot, - uint8_t* atr, - uint8_t* atrSize, - uint8_t* error); - uint8_t CALLBACK_CCID_IccPowerOff(uint8_t slot, uint8_t* error); - uint8_t CALLBACK_CCID_GetSlotStatus(uint8_t slot, uint8_t* error); - uint8_t CALLBACK_CCID_Abort(uint8_t slot, - uint8_t seq, - uint8_t *error); - + uint8_t CALLBACK_CCID_IccPowerOn(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const atr, + uint8_t* const atrSize, + uint8_t* const error); + uint8_t CALLBACK_CCID_IccPowerOff(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const error); + uint8_t CALLBACK_CCID_GetSlotStatus(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const error); + uint8_t CALLBACK_CCID_Abort(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t seq, + uint8_t* const error); #endif diff --git a/Demos/Device/ClassDriver/CCID/Lib/Iso7816.c b/Demos/Device/ClassDriver/CCID/Lib/Iso7816.c index 1f9391d72..ec6e1f323 100644 --- a/Demos/Device/ClassDriver/CCID/Lib/Iso7816.c +++ b/Demos/Device/ClassDriver/CCID/Lib/Iso7816.c @@ -31,7 +31,9 @@ #include "Iso7816.h" -void Iso7816_CreateSimpleAtr(uint8_t* attr, uint8_t* attrLength) + +void Iso7816_CreateSimpleAtr(uint8_t* const attr, + uint8_t* const attrLength) { attr[0] = 0x3B; //TS: direct convention diff --git a/Demos/Device/ClassDriver/CCID/Lib/Iso7816.h b/Demos/Device/ClassDriver/CCID/Lib/Iso7816.h index f5fc1d70a..2a5570629 100644 --- a/Demos/Device/ClassDriver/CCID/Lib/Iso7816.h +++ b/Demos/Device/ClassDriver/CCID/Lib/Iso7816.h @@ -36,7 +36,9 @@ #include <avr/power.h> #include <avr/interrupt.h> #include <stdlib.h> + #include <string.h> /* Function Prototypes: */ - void Iso7816_CreateSimpleAtr(uint8_t* attr, uint8_t* attrLength); + void Iso7816_CreateSimpleAtr(uint8_t* const attr, + uint8_t* const attrLength); #endif diff --git a/Demos/Device/LowLevel/CCID/CCID.c b/Demos/Device/LowLevel/CCID/CCID.c index 8b46e89be..764392de0 100644 --- a/Demos/Device/LowLevel/CCID/CCID.c +++ b/Demos/Device/LowLevel/CCID/CCID.c @@ -197,9 +197,9 @@ void EVENT_USB_Device_ControlRequest(void) * THe slot must reply back with a recognizable ATR (answer to reset) */ uint8_t CCID_IccPowerOn(uint8_t slot, - uint8_t* atr, - uint8_t* atrLength, - uint8_t* error) + uint8_t* const atr, + uint8_t* const atrLength, + uint8_t* const error) { if (slot == 0) { @@ -219,7 +219,7 @@ uint8_t CCID_IccPowerOn(uint8_t slot, * whenever an application at the host wants to send a power off signal to a slot. */ uint8_t CCID_IccPowerOff(uint8_t slot, - uint8_t* error) + uint8_t* const error) { if (slot == 0) { @@ -238,7 +238,7 @@ uint8_t CCID_IccPowerOff(uint8_t slot, * slot status. */ uint8_t CCID_GetSlotStatus(uint8_t slot, - uint8_t* error) + uint8_t* const error) { if (slot == 0) { @@ -258,7 +258,7 @@ uint8_t CCID_GetSlotStatus(uint8_t slot, */ uint8_t CCID_Abort(uint8_t slot, uint8_t seq, - uint8_t* error) + uint8_t* const error) { if (Aborted && slot == 0 && AbortedSeq == seq) { @@ -283,7 +283,7 @@ uint8_t CCID_Abort(uint8_t slot, } /** Gets and status and verifies whether an error occurred. */ -bool CCID_CheckStatusNoError(int status) +bool CCID_CheckStatusNoError(uint8_t status) { return (status & 0xC0) == 0x0; } diff --git a/Demos/Device/LowLevel/CCID/CCID.h b/Demos/Device/LowLevel/CCID/CCID.h index 77bedcf0e..d4503597b 100644 --- a/Demos/Device/LowLevel/CCID/CCID.h +++ b/Demos/Device/LowLevel/CCID/CCID.h @@ -72,11 +72,18 @@ void SetupHardware(void); void CCID_Task(void); - uint8_t CCID_IccPowerOn(uint8_t slot, uint8_t* attr, uint8_t* attrLength, uint8_t* error); - uint8_t CCID_IccPowerOff(uint8_t slot, uint8_t* error); - uint8_t CCID_GetSlotStatus(uint8_t slot, uint8_t* error); - uint8_t CCID_Abort(uint8_t slot, uint8_t seq, uint8_t* error); - bool CCID_CheckStatusNoError(int status); + uint8_t CCID_IccPowerOn(uint8_t slot, + uint8_t* const attr, + uint8_t* const attrLength, + uint8_t* const error); + uint8_t CCID_IccPowerOff(uint8_t slot, + uint8_t* const error); + uint8_t CCID_GetSlotStatus(uint8_t slot, + uint8_t* const error); + uint8_t CCID_Abort(uint8_t slot, + uint8_t seq, + uint8_t* const error); + bool CCID_CheckStatusNoError(uint8_t status); void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); diff --git a/Demos/Device/LowLevel/CCID/Lib/Iso7816.c b/Demos/Device/LowLevel/CCID/Lib/Iso7816.c index 0c2e5e8b0..138c5b65f 100644 --- a/Demos/Device/LowLevel/CCID/Lib/Iso7816.c +++ b/Demos/Device/LowLevel/CCID/Lib/Iso7816.c @@ -31,7 +31,8 @@ #include "Iso7816.h" -void Iso7816_CreateSimpleAtr(uint8_t* atr, uint8_t* atrLength) +void Iso7816_CreateSimpleAtr(uint8_t* const atr, + uint8_t* const atrLength) { atr[0] = 0x3B; // TS: direct convention diff --git a/Demos/Device/LowLevel/CCID/Lib/Iso7816.h b/Demos/Device/LowLevel/CCID/Lib/Iso7816.h index aa5f4ba83..f73309d90 100644 --- a/Demos/Device/LowLevel/CCID/Lib/Iso7816.h +++ b/Demos/Device/LowLevel/CCID/Lib/Iso7816.h @@ -38,8 +38,10 @@ #include <avr/power.h> #include <avr/interrupt.h> #include <stdlib.h> + #include <string.h> /* Function Prototypes: */ - void Iso7816_CreateSimpleAtr(uint8_t* atr, uint8_t* atrLength); + void Iso7816_CreateSimpleAtr(uint8_t* const atr, + uint8_t* const atrLength); #endif diff --git a/LUFA/Drivers/USB/Class/CCIDClass.h b/LUFA/Drivers/USB/Class/CCIDClass.h index 681326f65..2e61571bc 100644 --- a/LUFA/Drivers/USB/Class/CCIDClass.h +++ b/LUFA/Drivers/USB/Class/CCIDClass.h @@ -45,15 +45,14 @@ * \section Sec_USBClassCCID_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: * - LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> - * - LUFA/Drivers/USB/Class/Host/CCIDClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> * * \section Sec_USBClassCCID_ModDescription Module Description - * CCID Class Driver module. This module contains an internal implementation of the USB CCID Class, for both Device - * and Host USB modes. User applications can use this class driver instead of implementing the CCID class manually - * via the low-level LUFA APIs. + * CCID Class Driver module. This module contains an internal implementation of the USB CCID Class, for Device USB + * mode. User applications can use this class driver instead of implementing the CCID class manually via the low-level + * LUFA APIs. * * This module is designed to simplify the user code by exposing only the required interface needed to interface with - * Hosts or Devices using the USB CCID Class. + * Devices using the USB CCID Class. * * \warning * LUFA is not a secure USB stack, and has not undergone, not is it expected to pass, any form of security audit. The diff --git a/LUFA/Drivers/USB/Class/Common/CCIDClassCommon.h b/LUFA/Drivers/USB/Class/Common/CCIDClassCommon.h index 61239ec8a..6cedcad36 100644 --- a/LUFA/Drivers/USB/Class/Common/CCIDClassCommon.h +++ b/LUFA/Drivers/USB/Class/Common/CCIDClassCommon.h @@ -233,7 +233,8 @@ uint8_t Status; uint8_t Error; uint8_t ProtocolNum; - union { + union + { USB_CCID_ProtocolData_T0_t T0; USB_CCID_ProtocolData_T1_t T1; } ProtocolData; diff --git a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c index 11c20f0b3..0595e0715 100644 --- a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c +++ b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c @@ -39,7 +39,7 @@ #include "CCIDClassDevice.h" -bool CCID_CheckStatusNoError(int status) +bool CCID_CheckStatusNoError(uint8_t status) { return (status & 0xC0) == 0x0; } @@ -84,6 +84,7 @@ void CCID_Device_ProcessControlRequest(USB_ClassInfo_CCID_Device_t* const CCIDIn break; } + case CCID_GET_CLOCK_FREQUENCIES: { if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) @@ -95,6 +96,7 @@ void CCID_Device_ProcessControlRequest(USB_ClassInfo_CCID_Device_t* const CCIDIn } break; } + case CCID_GET_DATA_RATES: { if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) @@ -154,7 +156,7 @@ void CCID_Device_USBTask(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo) ResponseATR->CCIDHeader.Seq = CCIDHeader.Seq; ResponseATR->ChainParam = 0; - Status = CALLBACK_CCID_IccPowerOn(ResponseATR->CCIDHeader.Slot, (uint8_t*)ResponseATR->Data, &AtrLength, &Error); + Status = CALLBACK_CCID_IccPowerOn(CCIDInterfaceInfo, ResponseATR->CCIDHeader.Slot, (uint8_t*)ResponseATR->Data, &AtrLength, &Error); if (CCID_CheckStatusNoError(Status) && !CCIDInterfaceInfo->State.Aborted) { @@ -192,7 +194,7 @@ void CCID_Device_USBTask(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo) ResponsePowerOff->ClockStatus = 0; - Status = CALLBACK_CCID_IccPowerOff(CCIDHeader.Slot, &Error); + Status = CALLBACK_CCID_IccPowerOff(CCIDInterfaceInfo, CCIDHeader.Slot, &Error); ResponsePowerOff->Status = Status; ResponsePowerOff->Error = Error; @@ -215,7 +217,7 @@ void CCID_Device_USBTask(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo) ResponseSlotStatus->ClockStatus = 0; - Status = CALLBACK_CCID_GetSlotStatus(CCIDHeader.Slot, &Error); + Status = CALLBACK_CCID_GetSlotStatus(CCIDInterfaceInfo, CCIDHeader.Slot, &Error); ResponseSlotStatus->Status = Status; ResponseSlotStatus->Error = Error; @@ -238,7 +240,7 @@ void CCID_Device_USBTask(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo) ResponseAbort->ClockStatus = 0; - Status = CALLBACK_CCID_Abort(CCIDHeader.Slot, CCIDHeader.Seq, &Error); + Status = CALLBACK_CCID_Abort(CCIDInterfaceInfo, CCIDHeader.Slot, CCIDHeader.Seq, &Error); ResponseAbort->Status = Status; ResponseAbort->Error = Error; @@ -250,6 +252,7 @@ void CCID_Device_USBTask(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo) Endpoint_ClearIN(); break; } + default: { memset(BlockBuffer, 0x00, sizeof(BlockBuffer)); diff --git a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h index 5acc33af5..245e12665 100644 --- a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h +++ b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h @@ -115,46 +115,61 @@ * When the ICC is inserted into a slot of a CCID, the CCID can activate the ICC, and the ICC will respond with an ATR * (answer to reset) * - * \param[in] slot The slot currently being powered on - * \param[in, out] atr Pointer to an array where the ATR being sent to the device when the Icc is powered on is. - * \param[out] atrSize The size of the ATR being sent. Maximum size is 15 - * \param[out] error The result of the operation, or error + * \param[in,out] CCIDInterfaceInfo Pointer to a structure containing a CCID Class configuration and state. + * \param[in] slot The slot ID currently being powered on. + * \param[in,out] atr Pointer to an array containing the Power On ATR being sent to the device. + * \param[out] atrSize The size of the ATR being sent (up to 15 bytes maximum). + * \param[out] error The result of the operation, or error. * - * \return uint8_t The command result + * \return The command result code. */ - uint8_t CALLBACK_CCID_IccPowerOn(uint8_t slot, uint8_t* atr, uint8_t* atrSize, uint8_t* error); + uint8_t CALLBACK_CCID_IccPowerOn(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const atr, + uint8_t* const atrSize, + uint8_t* const error) ATTR_NON_NULL_PTR_ARG(1); /** CCID class driver callback for PC_TO_RDR_IccPowerOff CCID message * Turns off the ICC - * - * \param[in] slot The slot currently being powered off - * \param[out] error The result of the operation, or error - * - * \return uint8_t The command result + * + * \param[in,out] CCIDInterfaceInfo Pointer to a structure containing a CCID Class configuration and state. + * \param[in] slot The slot ID currently being powered off. + * \param[out] error The result of the operation, or error. + * + * \return The command result code. */ - uint8_t CALLBACK_CCID_IccPowerOff(uint8_t slot, uint8_t* error); + uint8_t CALLBACK_CCID_IccPowerOff(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const error) ATTR_NON_NULL_PTR_ARG(1); /** CCID class driver callback for PC_TO_RDR_GetSlotStatus CCID message * Retrieves the current status of a given slot - * - * \param[in] slot The slot from which we want to retrieve the status - * \param[out] error The result of the operation, or error - * - * \return uint8_t The command result + * + * \param[in,out] CCIDInterfaceInfo Pointer to a structure containing a CCID Class configuration and state. + * \param[in] slot The slot ID from which we want to retrieve the status. + * \param[out] error The result of the operation, or error. + * + * \return The command result code. */ - uint8_t CALLBACK_CCID_GetSlotStatus(uint8_t slot, uint8_t* error); + uint8_t CALLBACK_CCID_GetSlotStatus(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t* const error) ATTR_NON_NULL_PTR_ARG(1); /** CCID class driver callback for CCID_PC_to_RDR_Abort CCID message * Aborts a BULK out message previously sent to a slot - * - * \param[in] slot The slot to where the message being aborted was sent to - * \param[in] seq The current sequence number for this message. Must be checked against to the current - * abort massage being sent at the control pipe - * \param[out] error The result of the operation, or error - * - * \return uint8_t The command result + * + * \param[in,out] CCIDInterfaceInfo Pointer to a structure containing a CCID Class configuration and state. + * \param[in] slot The slot ID to where the message being aborted was sent to. + * \param[in] seq The current sequence number for this message. Must be checked against + * the current abort message being sent at the control pipe. + * \param[out] error The result of the operation, or error. + * + * \return The command result code. */ - uint8_t CALLBACK_CCID_Abort(uint8_t slot, uint8_t seq, uint8_t* error); + uint8_t CALLBACK_CCID_Abort(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo, + uint8_t slot, + uint8_t seq, + uint8_t* const error) ATTR_NON_NULL_PTR_ARG(1); #endif |