main.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. static const osThreadAttr_t init_thread_attr = {
  9. .name = "Init",
  10. .stack_size = 4096,
  11. };
  12. void init_task() {
  13. // Flipper FURI HAL
  14. furi_hal_init();
  15. // Init flipper
  16. flipper_init();
  17. osThreadExit();
  18. }
  19. int main() {
  20. // Initialize FURI layer
  21. furi_init();
  22. // Flipper critical FURI HAL
  23. furi_hal_init_early();
  24. #ifdef FURI_RAM_EXEC
  25. osThreadNew(init_task, NULL, &init_thread_attr);
  26. #else
  27. furi_hal_light_sequence("RGB");
  28. // Delay is for button sampling
  29. furi_hal_delay_ms(100);
  30. FuriHalRtcBootMode boot_mode = furi_hal_rtc_get_boot_mode();
  31. if(boot_mode == FuriHalRtcBootModeDfu || !furi_hal_gpio_read(&gpio_button_left)) {
  32. furi_hal_light_sequence("rgb WB");
  33. furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
  34. flipper_boot_dfu_exec();
  35. furi_hal_power_reset();
  36. } else if(boot_mode == FuriHalRtcBootModeUpdate) {
  37. furi_hal_light_sequence("rgb BR");
  38. flipper_boot_update_exec();
  39. // if things go nice, we shouldn't reach this point.
  40. // But if we do, abandon to avoid bootloops
  41. furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
  42. furi_hal_power_reset();
  43. } else {
  44. furi_hal_light_sequence("rgb G");
  45. osThreadNew(init_task, NULL, &init_thread_attr);
  46. }
  47. #endif
  48. // Run Kernel
  49. furi_run();
  50. furi_crash("Kernel is Dead");
  51. }
  52. void Error_Handler(void) {
  53. furi_crash("ErrorHandler");
  54. }
  55. void abort() {
  56. furi_crash("AbortHandler");
  57. }