* 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)
{
/** 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)
{
* 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)
{
}
}
-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)
{
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
#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
#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
* 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)
{
* 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)
{
* slot status.
*/
uint8_t CCID_GetSlotStatus(uint8_t slot,
- uint8_t* error)
+ uint8_t* const error)
{
if (slot == 0)
{
*/
uint8_t CCID_Abort(uint8_t slot,
uint8_t seq,
- uint8_t* error)
+ uint8_t* const error)
{
if (Aborted && slot == 0 && AbortedSeq == seq)
{
}
/** Gets and status and verifies whether an error occurred. */
-bool CCID_CheckStatusNoError(int status)
+bool CCID_CheckStatusNoError(uint8_t status)
{
return (status & 0xC0) == 0x0;
}
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);
#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
#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
* \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
uint8_t Status;
uint8_t Error;
uint8_t ProtocolNum;
- union {
+ union
+ {
USB_CCID_ProtocolData_T0_t T0;
USB_CCID_ProtocolData_T1_t T1;
} ProtocolData;
#include "CCIDClassDevice.h"
-bool CCID_CheckStatusNoError(int status)
+bool CCID_CheckStatusNoError(uint8_t status)
{
return (status & 0xC0) == 0x0;
}
break;
}
+
case CCID_GET_CLOCK_FREQUENCIES:
{
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
}
break;
}
+
case CCID_GET_DATA_RATES:
{
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
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)
{
ResponsePowerOff->ClockStatus = 0;
- Status = CALLBACK_CCID_IccPowerOff(CCIDHeader.Slot, &Error);
+ Status = CALLBACK_CCID_IccPowerOff(CCIDInterfaceInfo, CCIDHeader.Slot, &Error);
ResponsePowerOff->Status = Status;
ResponsePowerOff->Error = Error;
ResponseSlotStatus->ClockStatus = 0;
- Status = CALLBACK_CCID_GetSlotStatus(CCIDHeader.Slot, &Error);
+ Status = CALLBACK_CCID_GetSlotStatus(CCIDInterfaceInfo, CCIDHeader.Slot, &Error);
ResponseSlotStatus->Status = Status;
ResponseSlotStatus->Error = Error;
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;
Endpoint_ClearIN();
break;
}
+
default:
{
memset(BlockBuffer, 0x00, sizeof(BlockBuffer));
* 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