void SendStickStatusToHID (typeStick20Configuration_st *Status_st)
{
  cid_t *cid;

  // If configuration not found then init it
  if (FALSE == ReadStickConfigurationFromUserPage ())
  {
    InitStickConfigurationToUserPage_u8 ();
  }

  memcpy (Status_st,&StickConfiguration_st,sizeof (typeStick20Configuration_st)); // Not the retry counter and sc serial no

// Set the actual volume status
  Status_st->VolumeActiceFlag_u8 = 0;

  if (TRUE == GetSdUncryptedCardEnableState ())
  {
    Status_st->VolumeActiceFlag_u8 |= (1 << SD_UNCRYPTED_VOLUME_BIT_PLACE);
  }

// Only 1 cypted volume could be active
  if (TRUE == GetSdEncryptedCardEnableState ())
  {
    if (TRUE == GetSdEncryptedHiddenState ())
    {
      Status_st->VolumeActiceFlag_u8 |= (1 << SD_HIDDEN_VOLUME_BIT_PLACE);
    }
    else
    {
      Status_st->VolumeActiceFlag_u8 |= (1 << SD_CRYPTED_VOLUME_BIT_PLACE);
    }
  }

// Read actual SD id
  cid = (cid_t *) GetSdCidInfo ();
  Status_st->ActiveSD_CardID_u32 = (cid->psnh << 8) + cid->psnl;
//  ReadSdId (&Status_st->ActiveSD_CardID_u32);

  Status_st->FirmwareLocked_u8 = FALSE;
  if (TRUE ==  flashc_is_security_bit_active())
  {
    Status_st->FirmwareLocked_u8 = TRUE;
  }
}
void GetProductionInfos (typeStick20ProductionInfos_st * Infos_st,u8 WriteTestEnabled)
{
typeStick20Configuration_st SC_Status_st;
volatile u32* id_data = (u32 *) 0x80800204; // Place of 120 bit CPU ID
u32 i;
u32 CPU_ID_u32;
cid_t* cid;
u32 Blockcount_u32;

    // Clear data field
    memset ((void *) Infos_st, 0, sizeof (Infos_st));

    Infos_st->FirmwareVersion_au8[0]     = VERSION_MAJOR;
    Infos_st->FirmwareVersion_au8[1]     = VERSION_MINOR;
    Infos_st->FirmwareVersionInternal_u8 = INTERNAL_VERSION_NR;

    if (TRUE == WriteTestEnabled)
    {
      // Get smartcard infos
      GetSmartCardStatus (&SC_Status_st);

      // Run the check only if the initial pw is aktive
      if (3 == SC_Status_st.UserPwRetryCount)
      {
          if (FALSE == LA_OpenPGP_V20_Test_SendUserPW2 ((unsigned char *) "123456"))
          {
              CI_TickLocalPrintf ("GetProductionInfos: Intial password is not activ\r\n");
              Infos_st->SC_AdminPwRetryCount = 99;    // Marker for wrong pw
              return;
          }
      }
      else
      {
          CI_TickLocalPrintf ("GetProductionInfos: Password retry count is not 3 : %d\r\n", SC_Status_st.UserPwRetryCount);
          Infos_st->SC_AdminPwRetryCount = 88;    // Marker for wrong pw retry count
          return;
      }
    }

    // Get XORed CPU ID
    CPU_ID_u32 = 0;
    for (i = 0; i < 4; i++)
    {
          CPU_ID_u32 ^= id_data[i];
    }
    Infos_st->CPU_CardID_u32 = CPU_ID_u32;

    // Init SD - read capacity
    sd_mmc_mci_read_capacity (SD_SLOT, (unsigned long int *) &Blockcount_u32);

    Infos_st->SD_Card_Size_u8 = Blockcount_u32 / 2 / 1024 / 1024 + 1;   // in GB

    // Save smartcard infos
    if (TRUE == WriteTestEnabled)
    {
      Infos_st->SC_UserPwRetryCount = SC_Status_st.UserPwRetryCount;
      Infos_st->SC_AdminPwRetryCount = SC_Status_st.AdminPwRetryCount;
      Infos_st->SmartCardID_u32 = SC_Status_st.ActiveSmartCardID_u32;
    }
    else
    {
      Infos_st->SC_UserPwRetryCount  = 0;
      Infos_st->SC_AdminPwRetryCount = 0;
      Infos_st->SmartCardID_u32      = 0;
    }

    // Get SD card infos
    cid = (cid_t *) GetSdCidInfo ();

    Infos_st->SD_CardID_u32 = (cid->psnh << 8) + cid->psnl;
    Infos_st->SD_Card_ManufacturingYear_u8 = cid->mdt / 16;
    Infos_st->SD_Card_ManufacturingMonth_u8 = cid->mdt % 0x0f;
    Infos_st->SD_Card_OEM_u16 = cid->oid;
    Infos_st->SD_Card_Manufacturer_u8 = cid->mid;

    // Get SD card speed
    if (TRUE == WriteTestEnabled)
    {
      Infos_st->SD_WriteSpeed_u16 = SD_SpeedTest ();
    }
    else
    {
      Infos_st->SD_WriteSpeed_u16 = 0;
    }

}