/** * CT-BCS Reset Card command * * @param ctx Reader context * @param lc Length of command * @param cmd Command * @param lr Length of response * @param rsp Response buffer * @return \ref OK, \ref ERR_MEMORY */ int ResetCard(struct scr *ctx, unsigned int lc, unsigned char *cmd, unsigned int *lr, unsigned char *rsp) { int response = 0; if (PC_to_RDR_IccPowerOn(ctx) < 0) { rsp[0] = HIGH(NOT_SUCCESSFUL); rsp[1] = LOW(NOT_SUCCESSFUL); *lr = 2; return OK; } if (RDR_APDUTransferMode(ctx)) ccidAPDUInit(ctx); else ccidT1Init(ctx); if ((response = setResponse(ctx, cmd, lr, rsp)) < 0) { return response; } return OK; }
void CCID_DispatchMessage(void) { uint8_t ErrorCode; if(gu8IsBulkOutReady) { switch(UsbMessageBuffer[OFFSET_BMESSAGETYPE]) { case PC_TO_RDR_ICCPOWERON: ErrorCode = PC_to_RDR_IccPowerOn(); RDR_to_PC_DataBlock(ErrorCode); break; case PC_TO_RDR_ICCPOWEROFF: ErrorCode = PC_to_RDR_IccPowerOff(); RDR_to_PC_SlotStatus(ErrorCode); break; case PC_TO_RDR_GETSLOTSTATUS: ErrorCode = PC_to_RDR_GetSlotStatus(); RDR_to_PC_SlotStatus(ErrorCode); break; case PC_TO_RDR_XFRBLOCK: ErrorCode = PC_to_RDR_XfrBlock(); RDR_to_PC_DataBlock(ErrorCode); break; case PC_TO_RDR_GETPARAMETERS: ErrorCode = PC_to_RDR_GetParameters(); RDR_to_PC_Parameters(ErrorCode); break; case PC_TO_RDR_RESETPARAMETERS: ErrorCode = PC_to_RDR_ResetParameters(); RDR_to_PC_Parameters(ErrorCode); break; case PC_TO_RDR_SETPARAMETERS: ErrorCode = PC_to_RDR_SetParameters(); RDR_to_PC_Parameters(ErrorCode); break; case PC_TO_RDR_ESCAPE: ErrorCode = PC_to_RDR_Escape(); RDR_to_PC_Escape(ErrorCode); break; case PC_TO_RDR_ICCCLOCK: ErrorCode = PC_to_RDR_IccClock(); RDR_to_PC_SlotStatus(ErrorCode); break; case PC_TO_RDR_ABORT: ErrorCode = PC_to_RDR_Abort(); RDR_to_PC_SlotStatus(ErrorCode); break; case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY: case PC_TO_RDR_SECURE: case PC_TO_RDR_T0APDU: case PC_TO_RDR_MECHANICAL: default: CmdNotSupported(); break; } CCID_BulkInMessage(); gu8IsBulkOutReady = 0; } }
/** * @brief CCID_CmdDecode * Parse the commands and Proccess command * @param pdev: device instance * @retval None */ void CCID_CmdDecode(USB_CORE_HANDLE *pdev) { uint8_t errorCode; switch (Ccid_bulkout_data.bMessageType) { case PC_TO_RDR_ICCPOWERON: errorCode = PC_to_RDR_IccPowerOn(); RDR_to_PC_DataBlock(errorCode); break; case PC_TO_RDR_ICCPOWEROFF: errorCode = PC_to_RDR_IccPowerOff(); RDR_to_PC_SlotStatus(errorCode); break; case PC_TO_RDR_GETSLOTSTATUS: errorCode = PC_to_RDR_GetSlotStatus(); RDR_to_PC_SlotStatus(errorCode); break; case PC_TO_RDR_XFRBLOCK: errorCode = PC_to_RDR_XfrBlock(); RDR_to_PC_DataBlock(errorCode); break; case PC_TO_RDR_GETPARAMETERS: errorCode = PC_to_RDR_GetParameters(); RDR_to_PC_Parameters(errorCode); break; case PC_TO_RDR_RESETPARAMETERS: errorCode = PC_to_RDR_ResetParameters(); RDR_to_PC_Parameters(errorCode); break; case PC_TO_RDR_SETPARAMETERS: errorCode = PC_to_RDR_SetParameters(); RDR_to_PC_Parameters(errorCode); break; case PC_TO_RDR_ESCAPE: errorCode = PC_to_RDR_Escape(); RDR_to_PC_Escape(errorCode); break; case PC_TO_RDR_ICCCLOCK: errorCode = PC_to_RDR_IccClock(); RDR_to_PC_SlotStatus(errorCode); break; case PC_TO_RDR_ABORT: errorCode = PC_to_RDR_Abort(); RDR_to_PC_SlotStatus(errorCode); break; case PC_TO_RDR_T0APDU: errorCode = PC_TO_RDR_T0Apdu(); RDR_to_PC_SlotStatus(errorCode); break; case PC_TO_RDR_MECHANICAL: errorCode = PC_TO_RDR_Mechanical(); RDR_to_PC_SlotStatus(errorCode); break; case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY: errorCode = PC_TO_RDR_SetDataRateAndClockFrequency(); RDR_to_PC_DataRateAndClockFrequency(errorCode); break; case PC_TO_RDR_SECURE: errorCode = PC_TO_RDR_Secure(); RDR_to_PC_DataBlock(errorCode); break; default: RDR_to_PC_SlotStatus(SLOTERROR_CMD_NOT_SUPPORTED); break; } /********** Decide for all commands ***************/ if (Ccid_BulkState == CCID_STATE_SEND_RESP) { CCID_Response_SendData(pdev, (uint8_t*)&Ccid_bulkin_data, Ccid_bulkin_data.u16SizeToSend); } }