void IBN_USB_Stats (u8 nParamsGet_u8,u8 CMD_u8,u32 Param_u32,u8 *String_pu8)
{
  u8      Time_u8[30];
  time_t  now;

  if (0 == nParamsGet_u8)
  {
    CI_LocalPrintf ("USB functions\r\n");
    CI_LocalPrintf ("\r\n");
    CI_LocalPrintf ("0   Show USB stat\r\n");
    CI_LocalPrintf ("1   Set CCID card inserted\r\n");
    CI_LocalPrintf ("\r\n");
    return;
  }
  switch (CMD_u8)
  {
    case 0 :
       CI_LocalPrintf ("USB status\r\n");

       CI_LocalPrintf ("\r\nMSD\r\n");
       CI_LocalPrintf ("Read calls  : %9d\r\n",USB_Log_st.MSD_ReadCalls_u32);
       CI_LocalPrintf ("Read        : %9d blocks\r\n",USB_Log_st.MSD_BytesRead_u32);
       CI_LocalPrintf ("Write calls : %9d\r\n",USB_Log_st.MSD_WriteCalls_u32);
       CI_LocalPrintf ("Write       : %9d blocks\r\n",USB_Log_st.MSD_BytesWrite_u32);

       CI_LocalPrintf ("\r\nLast MSD access time\r\n");
       time (&now);
       ctime_r (&now,(char*)Time_u8);
       CI_LocalPrintf ("Actual time       : %s",Time_u8);
       ctime_r (&USB_Log_st.MSD_LastReadAccess_u32,(char*)Time_u8);
       CI_LocalPrintf ("Last read access  : %s",Time_u8);
       ctime_r (&USB_Log_st.MSD_LastWriteAccess_u32,(char*)Time_u8);
       CI_LocalPrintf ("Last write access : %s",Time_u8);

       CI_LocalPrintf ("\r\nCCID\r\n");
       CI_LocalPrintf ("USB > CCID calls : %9d\r\n",USB_Log_st.CCID_WriteCalls_u32);
       CI_LocalPrintf ("USB > CCID       : %9d bytes\r\n",USB_Log_st.CCID_BytesWrite_u32);
       CI_LocalPrintf ("CCID > USB calls : %9d\r\n",USB_Log_st.CCID_ReadCalls_u32);
       CI_LocalPrintf ("CCID > USB       : %9d bytes\r\n",USB_Log_st.CCID_BytesRead_u32);
       break;

    case 1:
      USB_CCID_send_INT_Message ();
      break;
  }
}
void USB_CCID_task (void* pvParameters)
{
    unsigned char Startup_b = TRUE;
    portTickType xLastWakeTime;

    ISO7816_InitSC ();
    /*
       CI_LocalPrintf ("USB_CCID : USB CCID raise IN ready - %d\n",xTaskGetTickCount()); */
    // Start CCID interface
    while (0 != Usb_nb_busy_bank (EP_CCID_IN))  // MSC Compliance - Wait end of all transmitions on USB line
    {
        if (Is_usb_setup_received ())
            usb_process_request ();
    }
    Usb_raise_in_ready (EP_CCID_IN);

    // Start keyboard interface
    while (0 != Usb_nb_busy_bank (EP_KB_IN))    // MSC Compliance - Wait end of all transmitions on USB line
    {
        if (Is_usb_setup_received ())
            usb_process_request ();
    }
    Usb_raise_in_ready (EP_KB_IN);


    xLastWakeTime = xTaskGetTickCount ();

    while (TRUE)
    {
        vTaskDelayUntil (&xLastWakeTime, configTSK_USB_CCID_PERIOD);

        // First, check the device enumeration state
        if (!Is_device_enumerated ())
            continue;

        // If smartcard is ready send it over usb
        if (TRUE == Startup_b)
        {
            Startup_b = FALSE;
            // CI_LocalPrintf ("USB_CCID : USB CCID started - %d\n",xTaskGetTickCount());
            DelayMs (100);  // Wait 100 ms
            USB_CCID_send_INT_Message ();   // We are always online
        }

        // If we receive something in the OUT endpoint, parse it
        if (Is_usb_out_received (EP_CCID_OUT))
        {
#ifdef TIME_MEASURING_ENABLE
            TIME_MEASURING_Start (TIME_MEASURING_TIME_CCID_USB_GET);
#endif
            USB_CCID_GetDataFromUSB ();
#ifdef TIME_MEASURING_ENABLE
            TIME_MEASURING_Stop (TIME_MEASURING_TIME_CCID_USB_GET);
            TIME_MEASURING_Start (TIME_MEASURING_TIME_CCID_USB_SEND);
#endif
            USB_CCID_SendDataToUSB ();

            USB_to_CRD_DispatchUSBMessage_v (&USB_CCID_data_st);

// Clear buffer after transmission
            memset (USB_CCID_data_st.USB_data,0,CCID_MAX_XFER_LENGTH);

#ifdef TIME_MEASURING_ENABLE
            TIME_MEASURING_Stop (TIME_MEASURING_TIME_CCID_USB_SEND);
#endif
        }
    }
}