main.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 if(!furi_hal_gpio_read(&gpio_button_up)) {
  42. furi_hal_light_sequence("rgb WR");
  43. flipper_boot_recovery_exec();
  44. furi_hal_power_reset();
  45. } else {
  46. furi_hal_light_sequence("rgb G");
  47. furi_thread_start(main_thread);
  48. }
  49. #endif
  50. // Run Kernel
  51. furi_run();
  52. furi_crash("Kernel is Dead");
  53. }
  54. void Error_Handler(void) {
  55. furi_crash("ErrorHandler");
  56. }
  57. void abort() {
  58. furi_crash("AbortHandler");
  59. }