Exemple #1
0
// Note that this API should be used in conjunction with halGetResetString
//  to get the full information, as this API does not provide a string for
//  the base reset type
PGM_P halGetExtendedResetString(void)
{

    // Create a table of reset strings for each extended reset type
    typedef PGM char ResetStringTableType[][4];
#define RESET_BASE_DEF(basename, value, string)   \
                         }; static ResetStringTableType basename##ResetStringTable = {
#define RESET_EXT_DEF(basename, extname, extvalue, string)  string,
    {
#include "reset-def.h"
    };
#undef RESET_BASE_DEF
#undef RESET_EXT_DEF

    // Create a table of pointers to each of the above tables
#define RESET_BASE_DEF(basename, value, string)  (ResetStringTableType *)basename##ResetStringTable,
#define RESET_EXT_DEF(basename, extname, extvalue, string)  /*nothing*/
    static ResetStringTableType * PGM extendedResetStringTablePtrs[] = {
#include "reset-def.h"
    };
#undef RESET_BASE_DEF
#undef RESET_EXT_DEF

    uint16_t extResetInfo = halGetExtendedResetInfo();
    // access the particular table of extended strings we are interested in
    ResetStringTableType *extendedResetStringTable =
        extendedResetStringTablePtrs[RESET_BASE_TYPE(extResetInfo)];

    // return the string from within the proper table
    return (*extendedResetStringTable)[((extResetInfo)&0xFF)];


}
uint8_t halGetResetInfo(void)
{
  return RESET_BASE_TYPE(savedResetCause);
}
void halInternalClassifyReset(void)
{
  // Table used to convert from RESET_EVENT register bits to reset types
  static const uint16_t resetEventTable[] = {
  #ifdef _EZR_DEVICE
    RESET_POWERON_HV,                  // bit  0: PORST
    RESET_BROWNOUT_UNREGPOWER,         // bit  1: BODUNREGRST
    RESET_BROWNOUT_REGPOWER,           // bit  2: BODREGRST
    RESET_EXTERNAL_PIN,                // bit  3: EXTRST
    RESET_WATCHDOG_EXPIRED,            // bit  4: WDOGRST
    RESET_FATAL_LOCKUP,                // bit  5: LOCKUPRST
    RESET_SOFTWARE,                    // bit  6: SYSREQRST
    RESET_SOFTWARE_EM4,                // bit  7: EM4RST
    RESET_EXTERNAL_EM4PIN,             // bit  8: EM4WURST
    RESET_BROWNOUT_AVDD0,              // bit  9: BODAVDD0
    RESET_BROWNOUT_AVDD1,              // bit 10: BODAVDD1
    RESET_BROWNOUT_BACKUP_VDD_DREG,    // bit 11: BUBODVDDDREG
    RESET_BROWNOUT_BACKUP_BU_VIN,      // bit 12: BUBODBUVIN
    RESET_BROWNOUT_BACKUP_UNREGPOWER,  // bit 13: BUBODUNREG
    RESET_BROWNOUT_BACKUP_REGPOWER,    // bit 14: BUBODREG
    RESET_BROWNOUT_BACKUP_MODE,        // bit 15: BUMODERST
  #elif defined _EFR_DEVICE
    RESET_POWERON_HV,                  // bit  0: PORST
    RESET_UNKNOWN_UNKNOWN,             // bit  1: RESERVED
    RESET_BROWNOUT_AVDD,               // bit  2: AVDDBOD
    RESET_BROWNOUT_DVDD,               // bit  3: DVDDBOD
    RESET_BROWNOUT_DEC,                // bit  4: DECBOD
    RESET_UNKNOWN_UNKNOWN,             // bit  5: RESERVED
    RESET_UNKNOWN_UNKNOWN,             // bit  6: RESERVED
    RESET_UNKNOWN_UNKNOWN,             // bit  7: RESERVED
    RESET_EXTERNAL_PIN,                // bit  8: EXTRST
    RESET_FATAL_LOCKUP,                // bit  9: LOCKUPRST
    RESET_SOFTWARE,                    // bit 10: SYSREQRST
    RESET_WATCHDOG_EXPIRED,            // bit 11: WDOGRST
    RESET_UNKNOWN_UNKNOWN,             // bit 12: RESERVED
    RESET_UNKNOWN_UNKNOWN,             // bit 13: RESERVED
    RESET_UNKNOWN_UNKNOWN,             // bit 14: RESERVED
    RESET_UNKNOWN_UNKNOWN,             // bit 15: RESERVED
    RESET_SOFTWARE_EM4,                // bit 16: EM4RST
  #endif
  };
  
  uint32_t resetEvent = RMU_ResetCauseGet();
  RMU_ResetCauseClear();
  uint16_t cause = RESET_UNKNOWN;
  uint16_t i;

  for (i = 0; i < sizeof(resetEventTable)/sizeof(resetEventTable[0]); i++) {
    if (resetEvent & (1 << i)) {
      cause = resetEventTable[i];
      break;
    }
  }

  if (cause == RESET_SOFTWARE) {
    if((halResetInfo.crash.resetSignature == RESET_VALID_SIGNATURE) &&
       (RESET_BASE_TYPE(halResetInfo.crash.resetReason) < NUM_RESET_BASE_TYPES)) {
      // The extended reset cause is recovered from RAM
      // This can be trusted because the hardware reset event was software
      //  and additionally because the signature is valid
      savedResetCause = halResetInfo.crash.resetReason;
    } else {
      savedResetCause = RESET_SOFTWARE_UNKNOWN;
    }
    // mark the signature as invalid
    halResetInfo.crash.resetSignature = RESET_INVALID_SIGNATURE;
  } else if (    (cause == RESET_BOOTLOADER_DEEPSLEEP)
              && (halResetInfo.crash.resetSignature == RESET_VALID_SIGNATURE)
              && (halResetInfo.crash.resetReason == RESET_BOOTLOADER_DEEPSLEEP)) {
    // Save the crash info for bootloader deep sleep (even though it's not used
    // yet) and invalidate the resetSignature.
    halResetInfo.crash.resetSignature = RESET_INVALID_SIGNATURE;
    savedResetCause = halResetInfo.crash.resetReason;
  } else {
    savedResetCause = cause;
  }
  // If the last reset was due to an assert, save the assert info.
  if (savedResetCause == RESET_CRASH_ASSERT) {
    savedAssertInfo = halResetInfo.crash.data.assertInfo;
  }
}