main.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include <flipper.h>
  4. #include <alt_boot.h>
  5. #include <semphr.h>
  6. #include <update_util/update_operation.h>
  7. #define TAG "Main"
  8. int32_t init_task(void* context) {
  9. UNUSED(context);
  10. // Flipper FURI HAL
  11. furi_hal_init();
  12. // Init flipper
  13. flipper_init();
  14. return 0;
  15. }
  16. int main() {
  17. // Initialize FURI layer
  18. furi_init();
  19. // Flipper critical FURI HAL
  20. furi_hal_init_early();
  21. FuriThread* main_thread = furi_thread_alloc_ex("Init", 4096, init_task, NULL);
  22. #ifdef FURI_RAM_EXEC
  23. furi_thread_start(main_thread);
  24. #else
  25. furi_hal_light_sequence("RGB");
  26. // Delay is for button sampling
  27. furi_delay_ms(100);
  28. FuriHalRtcBootMode boot_mode = furi_hal_rtc_get_boot_mode();
  29. if(boot_mode == FuriHalRtcBootModeDfu || !furi_hal_gpio_read(&gpio_button_left)) {
  30. furi_hal_light_sequence("rgb WB");
  31. furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
  32. flipper_boot_dfu_exec();
  33. furi_hal_power_reset();
  34. } else if(boot_mode == FuriHalRtcBootModeUpdate) {
  35. furi_hal_light_sequence("rgb BR");
  36. flipper_boot_update_exec();
  37. // if things go nice, we shouldn't reach this point.
  38. // But if we do, abandon to avoid bootloops
  39. furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
  40. furi_hal_power_reset();
  41. } else {
  42. furi_hal_light_sequence("rgb G");
  43. furi_thread_start(main_thread);
  44. }
  45. #endif
  46. // Run Kernel
  47. furi_run();
  48. furi_crash("Kernel is Dead");
  49. }
  50. void Error_Handler(void) {
  51. furi_crash("ErrorHandler");
  52. }
  53. void abort() {
  54. furi_crash("AbortHandler");
  55. }