efuse.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <Arduino.h>
  2. #include "efuse.h"
  3. #include <soc/efuse_reg.h>
  4. #include <esp_efuse.h>
  5. #include <esp_efuse_table.h>
  6. #include "parameters.h"
  7. static const struct {
  8. const esp_efuse_desc_t **desc;
  9. const char *name;
  10. } fuses[] = {
  11. { ESP_EFUSE_DIS_DOWNLOAD_MODE, "DIS_DOWNLOAD_MODE" },
  12. { ESP_EFUSE_DIS_USB_JTAG, "DIS_USB_JTAG" },
  13. #ifdef ESP_EFUSE_DIS_PAD_JTAG
  14. { ESP_EFUSE_DIS_PAD_JTAG, "DIS_PAD_JTAG" },
  15. #endif
  16. #ifdef ESP_EFUSE_DIS_USB_SERIAL_JTAG
  17. { ESP_EFUSE_DIS_USB_SERIAL_JTAG, "DIS_USB_SERIAL_JTAG" },
  18. #endif
  19. #ifdef ESP_EFUSE_DIS_USB_DOWNLOAD_MODE
  20. { ESP_EFUSE_DIS_USB_DOWNLOAD_MODE, "DIS_USB_DOWNLOAD_MODE" },
  21. #endif
  22. #ifdef ESP_EFUSE_DIS_FORCE_DOWNLOAD
  23. { ESP_EFUSE_DIS_FORCE_DOWNLOAD, "DIS_FORCE_DOWNLOAD" },
  24. #endif
  25. #ifdef ESP_EFUSE_DIS_LEGACY_SPI_BOOT
  26. { ESP_EFUSE_DIS_LEGACY_SPI_BOOT, "DIS_LEGACY_SPI_BOOT" },
  27. #endif
  28. };
  29. /*
  30. set efuses to prevent firmware upload except via signed web
  31. interface
  32. */
  33. void set_efuses(void)
  34. {
  35. bool some_unset = false;
  36. for (const auto &f : fuses) {
  37. const bool v = esp_efuse_read_field_bit(f.desc);
  38. Serial.printf("%s = %u\n", f.name, unsigned(v));
  39. some_unset |= !v;
  40. }
  41. if (g.lock_level >= 2 && some_unset) {
  42. Serial.printf("Burning efuses\n");
  43. esp_efuse_batch_write_begin();
  44. for (const auto &f : fuses) {
  45. const bool v = esp_efuse_read_field_bit(f.desc);
  46. if (!v) {
  47. Serial.printf("%s -> 1\n", f.name);
  48. auto ret = esp_efuse_write_field_bit(f.desc);
  49. if (ret != ESP_OK) {
  50. Serial.printf("%s change failed\n", f.name);
  51. }
  52. }
  53. }
  54. esp_efuse_batch_write_commit();
  55. }
  56. }