logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

interrupt_handlers.c (1631B)


  1. // Copyright 2023 Nick Brassel (@tzarc)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. ///////////////////////////////////////////////////////////////////////////////
  4. // BEGIN: STM32 EFL Wear-leveling ECC fault handling
  5. //
  6. // Some STM32s have ECC checks for all flash memory access. Whenever there's an
  7. // ECC failure, the MCU raises the NMI interrupt. Whenever we receive such an
  8. // interrupt whilst reading the wear-leveling EEPROM area, we gracefully cater
  9. // for it, signalling the wear-leveling code that a failure has occurred.
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include <ch.h>
  12. #include <chcore.h>
  13. #ifdef WEAR_LEVELING_EMBEDDED_FLASH
  14. # ifdef QMK_MCU_SERIES_STM32L4XX
  15. # define ECC_ERRORS_TRIGGER_NMI_INTERRUPT
  16. # define ECC_CHECK_REGISTER FLASH->ECCR
  17. # define ECC_CHECK_FLAG FLASH_ECCR_ECCD
  18. # endif // QMK_MCU_SERIES_STM32L4XX
  19. #endif // WEAR_LEVELING_EMBEDDED_FLASH
  20. #ifdef ECC_ERRORS_TRIGGER_NMI_INTERRUPT
  21. extern bool backing_store_allow_ecc_errors(void);
  22. extern void backing_store_signal_ecc_error(void);
  23. void NMI_Handler(void) {
  24. if ((ECC_CHECK_REGISTER) & (ECC_CHECK_FLAG)) {
  25. if (backing_store_allow_ecc_errors()) {
  26. (ECC_CHECK_REGISTER) = (ECC_CHECK_FLAG);
  27. backing_store_signal_ecc_error();
  28. return;
  29. }
  30. }
  31. chSysHalt("NMI");
  32. }
  33. #endif // ECC_ERRORS_TRIGGER_NMI_INTERRUPT
  34. ///////////////////////////////////////////////////////////////////////////////
  35. // END: STM32 EFL Wear-leveling ECC fault handling
  36. ///////////////////////////////////////////////////////////////////////////////