main.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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();
  22. furi_thread_set_name(main_thread, "Init");
  23. furi_thread_set_stack_size(main_thread, 4096);
  24. furi_thread_set_callback(main_thread, init_task);
  25. #ifdef FURI_RAM_EXEC
  26. furi_thread_start(main_thread);
  27. #else
  28. furi_hal_light_sequence("RGB");
  29. // Delay is for button sampling
  30. furi_delay_ms(100);
  31. FuriHalRtcBootMode boot_mode = furi_hal_rtc_get_boot_mode();
  32. if(boot_mode == FuriHalRtcBootModeDfu || !furi_hal_gpio_read(&gpio_button_left)) {
  33. furi_hal_light_sequence("rgb WB");
  34. furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
  35. flipper_boot_dfu_exec();
  36. furi_hal_power_reset();
  37. } else if(boot_mode == FuriHalRtcBootModeUpdate) {
  38. furi_hal_light_sequence("rgb BR");
  39. flipper_boot_update_exec();
  40. // if things go nice, we shouldn't reach this point.
  41. // But if we do, abandon to avoid bootloops
  42. furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
  43. furi_hal_power_reset();
  44. } else {
  45. furi_hal_light_sequence("rgb G");
  46. furi_thread_start(main_thread);
  47. }
  48. #endif
  49. // Run Kernel
  50. furi_run();
  51. furi_crash("Kernel is Dead");
  52. }
  53. void Error_Handler(void) {
  54. furi_crash("ErrorHandler");
  55. }
  56. void abort() {
  57. furi_crash("AbortHandler");
  58. }