aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2018-06-24 16:23:16 +1000
committerGitHub <noreply@github.com>2018-06-24 16:23:16 +1000
commit8e590e6cb3013ab3e317e219031b326df16fb6dc (patch)
tree870a7846aef63fc80aecce175e35bab08f812f5b
parentfc371d0d0e3a60b06dec862e37612375860c41d5 (diff)
parentded673ec02a92906c5402d5f749518e55beff9fc (diff)
downloadlufa-8e590e6cb3013ab3e317e219031b326df16fb6dc.tar.gz
lufa-8e590e6cb3013ab3e317e219031b326df16fb6dc.tar.bz2
lufa-8e590e6cb3013ab3e317e219031b326df16fb6dc.zip
Merge pull request #126 from kidbomb/feature-ccid
CCID: Multiple Low level and Class driver changes.
-rw-r--r--Demos/Device/ClassDriver/CCID/CCID.c42
-rw-r--r--Demos/Device/ClassDriver/CCID/CCID.h6
-rw-r--r--Demos/Device/LowLevel/CCID/CCID.c57
-rw-r--r--Demos/Device/LowLevel/CCID/HostTestApp/test_generic_ccid_libusb.js6
-rw-r--r--Demos/Device/LowLevel/CCID/Lib/Iso7816.c10
-rw-r--r--Demos/Device/LowLevel/CCID/Lib/Iso7816.h2
-rw-r--r--LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c51
-rw-r--r--LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h39
8 files changed, 53 insertions, 160 deletions
diff --git a/Demos/Device/ClassDriver/CCID/CCID.c b/Demos/Device/ClassDriver/CCID/CCID.c
index 40491fcfd..916306505 100644
--- a/Demos/Device/ClassDriver/CCID/CCID.c
+++ b/Demos/Device/ClassDriver/CCID/CCID.c
@@ -158,19 +158,19 @@ void EVENT_USB_Device_ControlRequest(void)
* THe slot must reply back with a recognizable ATR (answer to reset)
*/
uint8_t CALLBACK_CCID_IccPowerOn(uint8_t slot,
- uint8_t* attr,
+ uint8_t* atr,
uint8_t* attrSize,
uint8_t* error)
{
if (slot < CCID_Interface.Config.TotalSlots)
{
- Iso7816_CreateSimpleAtr(attr, attrSize);
+ Iso7816_CreateSimpleAtr(atr, attrSize);
*error = CCID_ERROR_NO_ERROR;
return CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR | CCID_ICCSTATUS_PRESENTANDACTIVE;
}
*error = CCID_ERROR_SLOT_NOT_FOUND;
- return CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_NOICCPRESENT;
+ return CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_NOICCPRESENT;
}
/** Event handler for the CCID_PC_to_RDR_IccPowerOff message. This message is sent to the device
@@ -186,7 +186,7 @@ uint8_t CALLBACK_CCID_IccPowerOff(uint8_t slot, uint8_t* error)
else
{
*error = CCID_ERROR_SLOT_NOT_FOUND;
- return CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_NOICCPRESENT;
+ return CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_NOICCPRESENT;
}
}
@@ -204,41 +204,13 @@ uint8_t CALLBACK_CCID_GetSlotStatus(uint8_t slot, uint8_t* error)
else
{
*error = CCID_ERROR_SLOT_NOT_FOUND;
- return CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_NOICCPRESENT;
- }
-}
-
-/** Event handler for the CCID_PC_to_RDR_XfrBlock. THis message is sent to the device
- * whenever an application at the host wants to send a block of bytes to the device
- * THe device reply back with an array of bytes
- */
-uint8_t CALLBACK_CCID_XfrBlock(uint8_t slot,
- uint8_t* error,
- uint8_t* receivedBuffer,
- uint8_t receivedBufferSize,
- uint8_t* sendBuffer,
- uint8_t* sentBufferSize)
-{
- if (slot < CCID_Interface.Config.TotalSlots)
- {
- uint8_t okResponse[2] = {0x90, 0x00};
- memcpy(sendBuffer, okResponse, sizeof(okResponse));
- *sentBufferSize = sizeof(okResponse);
-
- *error = CCID_ERROR_NO_ERROR;
- return CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR | CCID_ICCSTATUS_NOICCPRESENT;
- }
- else
- {
- *error = CCID_ERROR_SLOT_NOT_FOUND;
- return CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_NOICCPRESENT;
+ return CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_NOICCPRESENT;
}
}
-
uint8_t CALLBACK_CCID_Abort(uint8_t slot,
- uint8_t seq,
- uint8_t* error)
+ uint8_t seq,
+ uint8_t* 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 ff2ee19e7..608fb7801 100644
--- a/Demos/Device/ClassDriver/CCID/CCID.h
+++ b/Demos/Device/ClassDriver/CCID/CCID.h
@@ -81,12 +81,6 @@
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_XfrBlock(uint8_t slot,
- uint8_t* error,
- uint8_t* receivedBuffer,
- uint8_t receivedBufferSize,
- uint8_t* sendBuffer,
- uint8_t* sentBufferSize);
uint8_t CALLBACK_CCID_Abort(uint8_t slot,
uint8_t seq,
uint8_t *error);
diff --git a/Demos/Device/LowLevel/CCID/CCID.c b/Demos/Device/LowLevel/CCID/CCID.c
index b80507659..8b46e89be 100644
--- a/Demos/Device/LowLevel/CCID/CCID.c
+++ b/Demos/Device/LowLevel/CCID/CCID.c
@@ -197,13 +197,13 @@ 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* attr,
- uint8_t* attrLength,
+ uint8_t* atr,
+ uint8_t* atrLength,
uint8_t* error)
{
if (slot == 0)
{
- Iso7816_CreateSimpleAttr(attr, attrLength);
+ Iso7816_CreateSimpleAtr(atr, atrLength);
*error = CCID_ERROR_NO_ERROR;
return CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR | CCID_ICCSTATUS_PRESENTANDACTIVE;
@@ -394,57 +394,6 @@ void CCID_Task(void)
break;
}
- case CCID_PC_to_RDR_XfrBlock:
- {
- uint8_t Bwi = Endpoint_Read_8();
- uint16_t LevelParameter = Endpoint_Read_16_LE();
- uint8_t ReceivedBuffer[0x4];
-
- (void)Bwi;
- (void)LevelParameter;
-
- Endpoint_Read_Stream_LE(ReceivedBuffer, sizeof(ReceivedBuffer), NULL);
-
- uint8_t SendBuffer[0x2] = {0x90, 0x00};
- uint8_t SendLength = sizeof(SendBuffer);
-
- USB_CCID_RDR_to_PC_DataBlock_t* ResponseBlock = (USB_CCID_RDR_to_PC_DataBlock_t*)&BlockBuffer;
- ResponseBlock->CCIDHeader.MessageType = CCID_RDR_to_PC_DataBlock;
- ResponseBlock->CCIDHeader.Slot = CCIDHeader.Slot;
- ResponseBlock->CCIDHeader.Seq = CCIDHeader.Seq;
-
- ResponseBlock->ChainParam = 0;
-
- // TODO: Callback
- Status = CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR | CCID_ICCSTATUS_PRESENTANDACTIVE;
-
- if (CCID_CheckStatusNoError(Status) && !Aborted)
- {
- ResponseBlock->CCIDHeader.Length = SendLength;
- memcpy(&ResponseBlock->Data, SendBuffer, SendLength);
- }
- else if (Aborted)
- {
- Status = CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_PRESENTANDACTIVE;
- Error = CCID_ERROR_CMD_ABORTED;
- SendLength = 0;
- }
- else
- {
- SendLength = 0;
- }
-
- ResponseBlock->Status = Status;
- ResponseBlock->Error = Error;
-
- Endpoint_ClearOUT();
-
- Endpoint_SelectEndpoint(CCID_IN_EPADDR);
- Endpoint_Write_Stream_LE(ResponseBlock, sizeof(USB_CCID_RDR_to_PC_DataBlock_t) + SendLength, NULL);
- Endpoint_ClearIN();
- break;
- }
-
case CCID_PC_to_RDR_Abort:
{
USB_CCID_RDR_to_PC_SlotStatus_t* ResponseAbort = (USB_CCID_RDR_to_PC_SlotStatus_t*)&BlockBuffer;
diff --git a/Demos/Device/LowLevel/CCID/HostTestApp/test_generic_ccid_libusb.js b/Demos/Device/LowLevel/CCID/HostTestApp/test_generic_ccid_libusb.js
index b53f1a49c..993c0e550 100644
--- a/Demos/Device/LowLevel/CCID/HostTestApp/test_generic_ccid_libusb.js
+++ b/Demos/Device/LowLevel/CCID/HostTestApp/test_generic_ccid_libusb.js
@@ -140,12 +140,6 @@ function startTest()
},
function(callback) {
read(ccidInterface, 10, callback);
- },
- function(callback) {
- write(ccidInterface, new Buffer(XfrBlockMessage(0, 4)), callback);
- },
- function(callback) {
- read(ccidInterface, 10 + 2, callback);
}
]);
}
diff --git a/Demos/Device/LowLevel/CCID/Lib/Iso7816.c b/Demos/Device/LowLevel/CCID/Lib/Iso7816.c
index eaa96e544..0c2e5e8b0 100644
--- a/Demos/Device/LowLevel/CCID/Lib/Iso7816.c
+++ b/Demos/Device/LowLevel/CCID/Lib/Iso7816.c
@@ -31,17 +31,17 @@
#include "Iso7816.h"
-void Iso7816_CreateSimpleAttr(uint8_t* attr, uint8_t* attrLength)
+void Iso7816_CreateSimpleAtr(uint8_t* atr, uint8_t* atrLength)
{
- attr[0] = 0x3B; // TS: direct convention
+ atr[0] = 0x3B; // TS: direct convention
uint8_t interfaceBytesPresence = 0;
uint8_t historycalBytes[14] = "Lufa CCID Demo"; // Must be equal or less than 15
uint8_t historicalBytesLength = sizeof(historycalBytes);
- attr[1] = (interfaceBytesPresence << 4) + historicalBytesLength; //TO
- memcpy(attr + 2, historycalBytes, historicalBytesLength);
+ atr[1] = (interfaceBytesPresence << 4) + historicalBytesLength; //TO
+ memcpy(atr + 2, historycalBytes, historicalBytesLength);
- *attrLength = historicalBytesLength + 2;
+ *atrLength = historicalBytesLength + 2;
}
diff --git a/Demos/Device/LowLevel/CCID/Lib/Iso7816.h b/Demos/Device/LowLevel/CCID/Lib/Iso7816.h
index d07485823..aa5f4ba83 100644
--- a/Demos/Device/LowLevel/CCID/Lib/Iso7816.h
+++ b/Demos/Device/LowLevel/CCID/Lib/Iso7816.h
@@ -40,6 +40,6 @@
#include <stdlib.h>
/* Function Prototypes: */
- void Iso7816_CreateSimpleAttr(uint8_t* attr, uint8_t* attrLength);
+ void Iso7816_CreateSimpleAtr(uint8_t* atr, uint8_t* atrLength);
#endif
diff --git a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c
index edc125779..11c20f0b3 100644
--- a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c
+++ b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.c
@@ -228,57 +228,6 @@ void CCID_Device_USBTask(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo)
break;
}
- case CCID_PC_to_RDR_XfrBlock:
- {
- uint8_t Bwi = Endpoint_Read_8();
- uint16_t LevelParameter = Endpoint_Read_16_LE();
- uint8_t ReceivedBuffer[0x4];
-
- (void)Bwi;
- (void)LevelParameter;
-
- Endpoint_Read_Stream_LE(ReceivedBuffer, sizeof(ReceivedBuffer), NULL);
-
- uint8_t SendBuffer[0x2] = {0x90, 0x00};
- uint8_t SendLength = sizeof(SendBuffer);
-
- USB_CCID_RDR_to_PC_DataBlock_t* ResponseBlock = (USB_CCID_RDR_to_PC_DataBlock_t*)&BlockBuffer;
- ResponseBlock->CCIDHeader.MessageType = CCID_RDR_to_PC_DataBlock;
- ResponseBlock->CCIDHeader.Slot = CCIDHeader.Slot;
- ResponseBlock->CCIDHeader.Seq = CCIDHeader.Seq;
-
- ResponseBlock->ChainParam = 0;
-
- //TODO: Callback
- Status = CCID_COMMANDSTATUS_PROCESSEDWITHOUTERROR | CCID_ICCSTATUS_PRESENTANDACTIVE;
-
- if (CCID_CheckStatusNoError(Status) && !CCIDInterfaceInfo->State.Aborted)
- {
- ResponseBlock->CCIDHeader.Length = SendLength;
- memcpy(&ResponseBlock->Data, SendBuffer, SendLength);
- }
- else if(CCIDInterfaceInfo->State.Aborted)
- {
- Status = CCID_COMMANDSTATUS_FAILED | CCID_ICCSTATUS_PRESENTANDACTIVE;
- Error = CCID_ERROR_CMD_ABORTED;
- SendLength = 0;
- }
- else
- {
- SendLength = 0;
- }
-
- ResponseBlock->Status = Status;
- ResponseBlock->Error = Error;
-
- Endpoint_ClearOUT();
-
- Endpoint_SelectEndpoint(CCIDInterfaceInfo->Config.DataINEndpoint.Address);
- Endpoint_Write_Stream_LE(ResponseBlock, sizeof(USB_CCID_RDR_to_PC_DataBlock_t) + SendLength, NULL);
- Endpoint_ClearIN();
- break;
- }
-
case CCID_PC_to_RDR_Abort:
{
USB_CCID_RDR_to_PC_SlotStatus_t* ResponseAbort = (USB_CCID_RDR_to_PC_SlotStatus_t*)&BlockBuffer;
diff --git a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h
index 29a79f02d..5acc33af5 100644
--- a/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h
+++ b/LUFA/Drivers/USB/Class/Device/CCIDClassDevice.h
@@ -111,14 +111,49 @@
*/
void CCID_Device_USBTask(USB_ClassInfo_CCID_Device_t* const CCIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+ /** CCID class driver callback for PC_TO_RDR_IccPowerOn CCID message
+ * 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
+ *
+ * \return uint8_t The command result
+ */
uint8_t CALLBACK_CCID_IccPowerOn(uint8_t slot, uint8_t* atr, uint8_t* atrSize, uint8_t* error);
+ /** 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
+ */
uint8_t CALLBACK_CCID_IccPowerOff(uint8_t slot, uint8_t* error);
+ /** 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
+ */
uint8_t CALLBACK_CCID_GetSlotStatus(uint8_t slot, uint8_t* error);
- uint8_t CALLBACK_CCID_XfrBlock(uint8_t slot, uint8_t* error, uint8_t* receivedBuffer, uint8_t receivedBufferSize, uint8_t* sendBuffer, uint8_t* sentBufferSize);
-
+ /** 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
+ */
uint8_t CALLBACK_CCID_Abort(uint8_t slot, uint8_t seq, uint8_t* error);