/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support
 * ----------------------------------------------------------------------------
 * Copyright (c) 2009, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

/**
 * \file
 *
 * \section Purpose
 *
 * ISO 7816 driver
 *
 * \section Usage
 *
 * Explanation on the usage of the code made available through the header file.
 */

/*------------------------------------------------------------------------------
 *         Headers
 *------------------------------------------------------------------------------*/

#include "board.h"

/*------------------------------------------------------------------------------
 *         Definitions
 *------------------------------------------------------------------------------*/
/** Case for APDU commands*/
#define CASE1  1
#define CASE2  2
#define CASE3  3

/** Flip flop for send and receive char */
#define USART_SEND 0
#define USART_RCV  1

/*-----------------------------------------------------------------------------
 *          Internal variables
 *-----------------------------------------------------------------------------*/
/** Pin reset master card */
static Pin *st_pinIso7816RstMC;

struct Usart_info usart_sim = {.base = USART_SIM, .id = ID_USART_SIM, .state = USART_RCV};

/*----------------------------------------------------------------------------
 *          Internal functions
 *----------------------------------------------------------------------------*/

/**
 * Get a character from ISO7816
 * \param pCharToReceive Pointer for store the received char
 * \return 0: if timeout else status of US_CSR
 */
uint32_t ISO7816_GetChar( uint8_t *pCharToReceive, Usart_info *usart)
{
    uint32_t status;
    uint32_t timeout=0;

    Usart *us_base = usart->base;
    uint32_t us_id = usart->id;

    if( usart->state == USART_SEND ) {
        while((us_base->US_CSR & US_CSR_TXEMPTY) == 0) {}
        us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
        usart->state = USART_RCV;
    }

    /* Wait USART ready for reception */
    while( ((us_base->US_CSR & US_CSR_RXRDY) == 0) ) {
        if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
            TRACE_WARNING("TimeOut\n\r");
            return( 0 );
        }
    }

    /* At least one complete character has been received and US_RHR has not yet been read. */

    /* Get a char */
    *pCharToReceive = ((us_base->US_RHR) & 0xFF);

    status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
                                      US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
                                      (1<<10)));

    if (status != 0 ) {
        TRACE_DEBUG("R:0x%" PRIX32 "\n\r", status); 
        TRACE_DEBUG("R:0x%" PRIX32 "\n\r", us_base->US_CSR);
        TRACE_DEBUG("Nb:0x%" PRIX32 "\n\r", us_base->US_NER );
        us_base->US_CR = US_CR_RSTSTA;
    }

    /* Return status */
    return( status );
}


/**
 * Send a char to ISO7816
 * \param CharToSend char to be send
 * \return status of US_CSR
 */
uint32_t ISO7816_SendChar( uint8_t CharToSend, Usart_info *usart )
{
    uint32_t status;

    Usart *us_base = usart->base;
    uint32_t us_id = usart->id;

    TRACE_DEBUG("***Send char: 0x%X\n\r", CharToSend);

    if( usart->state == USART_RCV ) {
        us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
        usart->state = USART_SEND;
    }

    /* Wait USART ready for transmit */
    int i = 0;
    while((us_base->US_CSR & (US_CSR_TXRDY)) == 0)  {
        i++;
        if (!(i%1000000)) {
            printf("s: %x\n", us_base->US_CSR);
              printf("s: %x\n", us_base->US_RHR & 0xFF);
            us_base->US_CR = US_CR_RSTTX;
            us_base->US_CR = US_CR_RSTRX;
      }
    }
    /* There is no character in the US_THR */

    /* Transmit a char */
    us_base->US_THR = CharToSend;

    status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
                                      US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
                                      (1<<10)));

    if (status != 0 ) {
        TRACE_INFO("******* status: 0x%" PRIX32 " (Overrun: %" PRIX32
                    ", NACK: %" PRIX32 ", Timeout: %" PRIX32 ", underrun: %" PRIX32 ")\n\r",
                    status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
                    ((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
        TRACE_INFO("E (USART CSR reg):0x%" PRIX32 "\n\r", us_base->US_CSR);
        TRACE_INFO("Nb (Number of errors):0x%" PRIX32 "\n\r", us_base->US_NER );
        us_base->US_CR = US_CR_RSTSTA;
    }

    /* Return status */
    return( status );
}


/**
 *  Iso 7816 ICC power on
 */
static void ISO7816_IccPowerOn( void )
{
    /* Set RESET Master Card */
    if (st_pinIso7816RstMC) {
        PIO_Set(st_pinIso7816RstMC);
    }
}

/*----------------------------------------------------------------------------
 *          Exported functions
 *----------------------------------------------------------------------------*/

/**
 *  Iso 7816 ICC power off
 */
void ISO7816_IccPowerOff( void )
{
    /* Clear RESET Master Card */
    if (st_pinIso7816RstMC) {
        PIO_Clear(st_pinIso7816RstMC);
    }
}

/**
 * Transfert Block      TPDU T=0
 * \param pAPDU         APDU buffer
 * \param pMessage      Message buffer
 * \param wLength       Block length
 * \param indexMsg      Message index
 * \return              0 on success, content of US_CSR otherwise
 */
uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,
                                        uint8_t *pMessage,
                                        uint16_t wLength,
                                        uint16_t *retlen )
{
    uint16_t NeNc;
    uint16_t indexApdu = 4;
    uint16_t indexMsg = 0;
    uint8_t SW1 = 0;
    uint8_t procByte;
    uint8_t cmdCase;
    uint32_t status = 0;

    TRACE_INFO("pAPDU[0]=0x%X\n\r",pAPDU[0]);
    TRACE_INFO("pAPDU[1]=0x%X\n\r",pAPDU[1]);
    TRACE_INFO("pAPDU[2]=0x%X\n\r",pAPDU[2]);
    TRACE_INFO("pAPDU[3]=0x%X\n\r",pAPDU[3]);
    TRACE_INFO("pAPDU[4]=0x%X\n\r",pAPDU[4]);
    TRACE_INFO("pAPDU[5]=0x%X\n\r",pAPDU[5]);
    TRACE_INFO("wlength=%d\n\r",wLength);

    ISO7816_SendChar( pAPDU[0], &usart_sim ); /* CLA */
    ISO7816_SendChar( pAPDU[1], &usart_sim ); /* INS */
    ISO7816_SendChar( pAPDU[2], &usart_sim ); /* P1 */
    ISO7816_SendChar( pAPDU[3], &usart_sim ); /* P2 */
    ISO7816_SendChar( pAPDU[4], &usart_sim ); /* P3 */

    /* Handle the four structures of command APDU */
    indexApdu = 5;

    if( wLength == 4 ) {
        cmdCase = CASE1;
        NeNc = 0;
    }
    else if( wLength == 5) {
        cmdCase = CASE2;
        NeNc = pAPDU[4]; /* C5 */
        if (NeNc == 0) {
            NeNc = 256;
        }
    }
    else if( wLength == 6) {
        NeNc = pAPDU[4]; /* C5 */
        cmdCase = CASE3;
    }
    else if( wLength == 7) {
        NeNc = pAPDU[4]; /* C5 */
        if( NeNc == 0 ) {
            cmdCase = CASE2;
            NeNc = (pAPDU[5]<<8)+pAPDU[6];
        }
        else {
            cmdCase = CASE3;
        }
    }
    else {
        NeNc = pAPDU[4]; /* C5 */
        if( NeNc == 0 ) {
            cmdCase = CASE3;
            NeNc = (pAPDU[5]<<8)+pAPDU[6];
        }
        else {
            cmdCase = CASE3;
        }
    }

    TRACE_DEBUG("CASE=0x%X NeNc=0x%X\n\r", cmdCase, NeNc);

    /* Handle Procedure Bytes */
    do {
        status = ISO7816_GetChar(&procByte, &usart_sim);
        if (status != 0) {
            return status;
        }
        TRACE_INFO("procByte: 0x%X\n\r", procByte);
        /* Handle NULL */
        if ( procByte == ISO_NULL_VAL ) {
            TRACE_INFO("INS\n\r");
            continue;
        }
        /* Handle SW1 */
        else if ( ((procByte & 0xF0) ==0x60) || ((procByte & 0xF0) ==0x90) ) {
            TRACE_INFO("SW1\n\r");
            SW1 = 1;
        }
        /* Handle INS */
        else if ( pAPDU[1] == procByte) {
            TRACE_INFO("HdlINS\n\r");
            if (cmdCase == CASE2) {
                /* receive data from card */
                do {
                    status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
                } while(( 0 != --NeNc) && (status == 0) );
                if (status != 0) {
                    return status;
                }
            }
            else {
                 /* Send data */
                do {
                    TRACE_INFO("Send %X", pAPDU[indexApdu]);
                    ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
                } while( 0 != --NeNc );
            }
        }
        /* Handle INS ^ 0xff */
        else
        #pragma GCC diagnostic push
        #pragma GCC diagnostic ignored "-Wsign-compare"
        if ( pAPDU[1] == (procByte ^ 0xff)) {
        #pragma GCC diagnostic pop
            TRACE_INFO("HdlINS+\n\r");
            if (cmdCase == CASE2) {
                /* receive data from card */
                status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
                if (status != 0) {
                    return status;
                }
                TRACE_INFO("Rcv: 0x%X\n\r", pMessage[indexMsg-1]);
            }
            else {
                status = ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
                if (status != 0) {
                    return status;
                }
            }
            NeNc--;
        }
        else {
            /* ?? */
            TRACE_INFO("procByte=0x%X\n\r", procByte);
            break;
        }
    } while (NeNc != 0);

    /* Status Bytes */
    if (SW1 == 0) {
        status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW1 */
        if (status != 0) {
            return status;
        }
    }
    else {
        pMessage[indexMsg++] = procByte;
    }
    status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW2 */
    if (status != 0) {
        return status;
    }

    TRACE_WARNING("SW1=0x%X, SW2=0x%X\n\r", pMessage[indexMsg-2], pMessage[indexMsg-1]);

    *retlen = indexMsg;
    return status;

}

/**
 *  Escape ISO7816
 */
void ISO7816_Escape( void )
{
    TRACE_DEBUG("For user, if needed\n\r");
}

/**
 *  Restart clock ISO7816
 */
void ISO7816_RestartClock( void )
{
    TRACE_DEBUG("ISO7816_RestartClock\n\r");
    USART_SIM->US_BRGR = 13;
}

/**
 *  Stop clock ISO7816
 */
void ISO7816_StopClock( void )
{
    TRACE_DEBUG("ISO7816_StopClock\n\r");
    USART_SIM->US_BRGR = 0;
}

/**
 *  T0 APDU
 */
void ISO7816_toAPDU( void )
{
    TRACE_DEBUG("ISO7816_toAPDU\n\r");
    TRACE_DEBUG("Not supported at this time\n\r");
}

/**
 * Answer To Reset (ATR)
 * \param pAtr    ATR buffer
 * \param pLength Pointer for store the ATR length
 * \return 0: if timeout else status of US_CSR
 */
uint32_t ISO7816_Datablock_ATR( uint8_t* pAtr, uint8_t* pLength )
{
    uint32_t i;
    uint32_t j;
    uint32_t y;
    uint32_t status = 0; 

    *pLength = 0;

    /* Read ATR TS */
    // FIXME: There should always be a check for the GetChar return value..0 means timeout
    status = ISO7816_GetChar(&pAtr[0], &usart_sim);
    if (status != 0) {
        return status;
    }

    /* Read ATR T0 */
    status = ISO7816_GetChar(&pAtr[1], &usart_sim);
    if (status != 0) {
        return status;
    }
    y = pAtr[1] & 0xF0;
    i = 2;

    /* Read ATR Ti */
    while (y && (status == 0)) {

        if (y & 0x10) {  /* TA[i] */
            status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
        }
        if (y & 0x20) {  /* TB[i] */
            status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
        }
        if (y & 0x40) {  /* TC[i] */
            status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
        }
        if (y & 0x80) {  /* TD[i] */
            status = ISO7816_GetChar(&pAtr[i], &usart_sim);
            y =  pAtr[i++] & 0xF0;
        }
        else {
            y = 0;
        }
    }
    if (status != 0) {
        return status;
    }

    /* Historical Bytes */
    y = pAtr[1] & 0x0F;
    for( j=0; (j < y) && (status == 0); j++ ) {
        status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
    }

    if (status != 0) {
        return status;
    }

    *pLength = i;
    return status;
}

/**
 * Set data rate and clock frequency
 * \param dwClockFrequency ICC clock frequency in KHz.
 * \param dwDataRate       ICC data rate in bpd
 */
void ISO7816_SetDataRateandClockFrequency( uint32_t dwClockFrequency, uint32_t dwDataRate )
{
    uint8_t ClockFrequency;

    /* Define the baud rate divisor register */
    /* CD  = MCK / SCK */
    /* SCK = FIDI x BAUD = 372 x 9600 */
    /* BOARD_MCK */
    /* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
    USART_SIM->US_BRGR = BOARD_MCK / (dwClockFrequency*1000);

    ClockFrequency = BOARD_MCK / USART_SIM->US_BRGR;

    USART_SIM->US_FIDI = (ClockFrequency)/dwDataRate;

}

/**
 * Pin status for ISO7816 RESET
 * \return 1 if the Pin RstMC is high; otherwise 0.
 */
uint8_t ISO7816_StatusReset( void )
{
    if (st_pinIso7816RstMC) {
        return PIO_Get(st_pinIso7816RstMC);
    }
    return 0;
}

/**
 *  cold reset
 */
void ISO7816_cold_reset( void )
{
    volatile uint32_t i;

    /* tb: wait ??? cycles*/
    for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
    }

    USART_SIM->US_RHR;
    USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;

    ISO7816_IccPowerOn();
}

/**
 *  Warm reset
 */
void ISO7816_warm_reset( void )
{
    volatile uint32_t i;

// Clears Reset
    ISO7816_IccPowerOff();

    /* tb: wait ??? cycles */
    for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
    }

    USART_SIM->US_RHR;
    USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;

// Sets Reset
    ISO7816_IccPowerOn();
}

/**
 * Decode ATR trace
 * \param pAtr pointer on ATR buffer
 */
void ISO7816_Decode_ATR( uint8_t* pAtr )
{
    uint32_t i;
    uint32_t j;
    uint32_t y;
    uint8_t offset;

    printf("\n\r");
    printf("ATR: Answer To Reset:\n\r");
    printf("TS = 0x%X Initial character ",pAtr[0]);
    if( pAtr[0] == 0x3B ) {

        printf("Direct Convention\n\r");
    }
    else {
        if( pAtr[0] == 0x3F ) {

            printf("Inverse Convention\n\r");
        }
        else {
            printf("BAD Convention\n\r");
        }
    }

    printf("T0 = 0x%X Format caracter\n\r",pAtr[1]);
    printf("    Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);
    printf("    Presence further interface byte:\n\r");
    if( pAtr[1]&0x80 ) {
        printf("TA ");
    }
    if( pAtr[1]&0x40 ) {
        printf("TB ");
    }
    if( pAtr[1]&0x20 ) {
        printf("TC ");
    }
    if( pAtr[1]&0x10 ) {
        printf("TD ");
    }
    if( pAtr[1] != 0 ) {
        printf(" present\n\r");
    }

    i = 2;
    y = pAtr[1] & 0xF0;

    /* Read ATR Ti */
    offset = 1;
    while (y) {

        if (y & 0x10) {  /* TA[i] */
            printf("TA[%d] = 0x%X ", offset, pAtr[i]);
            if( offset == 1 ) {
                printf("FI = %d ", (pAtr[i]>>8));
                printf("DI = %d", (pAtr[i]&0x0F));
            }
            printf("\n\r");
            i++;
        }
        if (y & 0x20) {  /* TB[i] */
            printf("TB[%d] = 0x%X\n\r", offset, pAtr[i]);
            i++;
        }
        if (y & 0x40) {  /* TC[i] */
            printf("TC[%d] = 0x%X ", offset, pAtr[i]);
            if( offset == 1 ) {
                printf("Extra Guard Time: N = %d", pAtr[i]);
            }
            printf("\n\r");
            i++;
        }
        if (y & 0x80) {  /* TD[i] */
            printf("TD[%d] = 0x%X\n\r", offset, pAtr[i]);
            y =  pAtr[i++] & 0xF0;
        }
        else {
            y = 0;
        }
        offset++;
    }

    /* Historical Bytes */
    printf("Historical bytes:\n\r");
    y = pAtr[1] & 0x0F;
    for( j=0; j < y; j++ ) {
        printf(" 0x%X", pAtr[i]);
        i++;
    }
    printf("\n\r\n\r");

}

void ISO7816_Set_Reset_Pin(const Pin *pPinIso7816RstMC) {
    /* Pin ISO7816 initialize */
    st_pinIso7816RstMC  = (Pin *)pPinIso7816RstMC;
}

/** Initializes a ISO driver
 *  \param pPinIso7816RstMC Pin ISO 7816 Rst MC
 */
void ISO7816_Init( Usart_info *usart, bool master_clock )
{
    uint32_t clk;
    TRACE_DEBUG("ISO_Init\n\r");

    Usart *us_base = usart->base;
    uint32_t us_id = usart->id;

    us_base->US_CR = US_CR_RSTRX
                | US_CR_RSTTX
                | US_CR_RXDIS
                | US_CR_TXDIS;

    if (master_clock == true) {
        clk = US_MR_USCLKS_MCK;
    } else {
        clk = US_MR_USCLKS_SCK;
    }

    USART_Configure( us_base,
                     US_MR_USART_MODE_IS07816_T_0
                     | clk
                     | US_MR_NBSTOP_1_BIT
                     | US_MR_PAR_EVEN
                     | US_MR_CHRL_8_BIT
                     | US_MR_CLKO
                     | US_MR_INACK  /* Inhibit errors */
                     | (3<<24), /* MAX_ITERATION */
                     1,
                     0);

    /* Disable interrupts */
    us_base->US_IDR = (uint32_t) -1;

    /* Configure USART */
    PMC_EnablePeripheral(us_id);

    us_base->US_FIDI = 372;  /* by default */
    /* Define the baud rate divisor register */
    /* CD  = MCK / SCK */
    /* SCK = FIDI x BAUD = 372 x 9600 */
    /* BOARD_MCK */
    /* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
    us_base->US_BRGR = US_BRGR_CD(1);
//    us_base->US_BRGR = BOARD_MCK / (372*9150);

    /* Write the Timeguard Register */
//    us_base->US_RTOR = 0;
    us_base->US_TTGR = 5;

    USART_SetTransmitterEnabled(us_base, 1);
    USART_SetReceiverEnabled(us_base, 1);

    us_base->US_RHR;
}

