aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Demos/Device/ClassDriver/CCID/CCID.c22
-rw-r--r--Demos/Device/ClassDriver/CCID/CCID.h25
-rw-r--r--Demos/Device/ClassDriver/CCID/Lib/Iso7816.c4
-rw-r--r--Demos/Device/ClassDriver/CCID/Lib/Iso7816.h4
-rw-r--r--Demos/Device/LowLevel/CCID/CCID.c14
-rw-r--r--Demos/Device/LowLevel/CCID/CCID.h17
-rw-r--r--Demos/Device/LowLevel/CCID/Lib/Iso7816.c3
-rw-r--r--Demos/Device/LowLevel/CCID/Lib/Iso7816.h4
-rw-r--r--LUFA/Drivers/USB/Class/CCIDClass.h9
-rw-r--r--LUFA/Drivers/USB/Class/Common/CCIDClassCommon.h3
-rw-r--r--LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c13
-rw-r--r--LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h67
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