[FL-835] Factory reset. Cli refactoring. (#466)
* ApiHal: add boot flags. Internal storage: add factory reset. * Bootloader: correct doxygen comment format. * Cli: change cli callback signature. Applications: update API usage. Add factory_reset cli command.
This commit is contained in:
		
							parent
							
								
									a02aa42095
								
							
						
					
					
						commit
						6d648da003
					
				| @ -31,7 +31,7 @@ static void app_loader_menu_callback(void* _ctx) { | |||||||
|     furi_thread_start(state.thread); |     furi_thread_start(state.thread); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void app_loader_cli_callback(string_t args, void* _ctx) { | static void app_loader_cli_callback(Cli* cli, string_t args, void* _ctx) { | ||||||
|     furi_assert(_ctx); |     furi_assert(_ctx); | ||||||
|     const FlipperApplication* flipper_app = (FlipperApplication*)_ctx; |     const FlipperApplication* flipper_app = (FlipperApplication*)_ctx; | ||||||
|     furi_assert(flipper_app->app); |     furi_assert(flipper_app->app); | ||||||
|  | |||||||
| @ -134,7 +134,7 @@ void bt_menu_start_app(void* context) { | |||||||
|     furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK); |     furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void bt_cli_info(string_t args, void* context) { | void bt_cli_info(Cli* cli, string_t args, void* context) { | ||||||
|     string_t buffer; |     string_t buffer; | ||||||
|     string_init(buffer); |     string_init(buffer); | ||||||
|     api_hal_bt_dump_state(buffer); |     api_hal_bt_dump_state(buffer); | ||||||
|  | |||||||
| @ -43,7 +43,7 @@ void bt_draw_statusbar_callback(Canvas* canvas, void* context); | |||||||
| 
 | 
 | ||||||
| BtTestChannel bt_switch_channel(InputKey key, BtTestChannel inst_chan); | BtTestChannel bt_switch_channel(InputKey key, BtTestChannel inst_chan); | ||||||
| 
 | 
 | ||||||
| void bt_cli_info(string_t args, void* context); | void bt_cli_info(Cli* cli, string_t args, void* context); | ||||||
| 
 | 
 | ||||||
| void bt_draw_statusbar_callback(Canvas* canvas, void* context); | void bt_draw_statusbar_callback(Canvas* canvas, void* context); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -130,7 +130,7 @@ void cli_enter(Cli* cli) { | |||||||
|     furi_check(osMutexRelease(cli->mutex) == osOK); |     furi_check(osMutexRelease(cli->mutex) == osOK); | ||||||
|     if(cli_command) { |     if(cli_command) { | ||||||
|         cli_nl(); |         cli_nl(); | ||||||
|         cli_command->callback(cli->line, cli_command->context); |         cli_command->callback(cli, cli->line, cli_command->context); | ||||||
|         cli_prompt(); |         cli_prompt(); | ||||||
|     } else { |     } else { | ||||||
|         cli_nl(); |         cli_nl(); | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ typedef struct Cli Cli; | |||||||
|  * @param args - string with what was passed after command |  * @param args - string with what was passed after command | ||||||
|  * @param context - pointer to whatever you gave us on cli_add_command |  * @param context - pointer to whatever you gave us on cli_add_command | ||||||
|  */ |  */ | ||||||
| typedef void (*CliCallback)(string_t args, void* context); | typedef void (*CliCallback)(Cli* cli, string_t args, void* context); | ||||||
| 
 | 
 | ||||||
| /* Add cli command
 | /* Add cli command
 | ||||||
|  * Registers you command callback |  * Registers you command callback | ||||||
|  | |||||||
| @ -4,9 +4,8 @@ | |||||||
| #include <rtc.h> | #include <rtc.h> | ||||||
| #include <task-control-block.h> | #include <task-control-block.h> | ||||||
| 
 | 
 | ||||||
| void cli_command_help(string_t args, void* context) { | void cli_command_help(Cli* cli, string_t args, void* context) { | ||||||
|     (void)args; |     (void)args; | ||||||
|     Cli* cli = context; |  | ||||||
|     printf("Commands we have:"); |     printf("Commands we have:"); | ||||||
| 
 | 
 | ||||||
|     furi_check(osMutexAcquire(cli->mutex, osWaitForever) == osOK); |     furi_check(osMutexAcquire(cli->mutex, osWaitForever) == osOK); | ||||||
| @ -38,7 +37,7 @@ void cli_command_help(string_t args, void* context) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_version(string_t args, void* context) { | void cli_command_version(Cli* cli, string_t args, void* context) { | ||||||
|     (void)args; |     (void)args; | ||||||
|     (void)context; |     (void)context; | ||||||
|     printf("Bootloader\r\n"); |     printf("Bootloader\r\n"); | ||||||
| @ -48,7 +47,7 @@ void cli_command_version(string_t args, void* context) { | |||||||
|     cli_print_version(api_hal_version_get_fw_version()); |     cli_print_version(api_hal_version_get_fw_version()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_uuid(string_t args, void* context) { | void cli_command_uuid(Cli* cli, string_t args, void* context) { | ||||||
|     (void)args; |     (void)args; | ||||||
|     (void)context; |     (void)context; | ||||||
|     size_t uid_size = api_hal_uid_size(); |     size_t uid_size = api_hal_uid_size(); | ||||||
| @ -64,7 +63,7 @@ void cli_command_uuid(string_t args, void* context) { | |||||||
|     printf(string_get_cstr(byte_str)); |     printf(string_get_cstr(byte_str)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_date(string_t args, void* context) { | void cli_command_date(Cli* cli, string_t args, void* context) { | ||||||
|     RTC_DateTypeDef date; |     RTC_DateTypeDef date; | ||||||
|     RTC_TimeTypeDef time; |     RTC_TimeTypeDef time; | ||||||
| 
 | 
 | ||||||
| @ -84,15 +83,14 @@ void cli_command_date(string_t args, void* context) { | |||||||
|     string_clear(datetime_str); |     string_clear(datetime_str); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_log(string_t args, void* context) { | void cli_command_log(Cli* cli, string_t args, void* context) { | ||||||
|     Cli* cli = context; |  | ||||||
|     furi_stdglue_set_global_stdout_callback(cli_stdout_callback); |     furi_stdglue_set_global_stdout_callback(cli_stdout_callback); | ||||||
|     printf("Press any key to stop...\r\n"); |     printf("Press any key to stop...\r\n"); | ||||||
|     cli_getc(cli); |     cli_getc(cli); | ||||||
|     furi_stdglue_set_global_stdout_callback(NULL); |     furi_stdglue_set_global_stdout_callback(NULL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_vibro(string_t args, void* context) { | void cli_command_vibro(Cli* cli, string_t args, void* context) { | ||||||
|     if(!string_cmp(args, "0")) { |     if(!string_cmp(args, "0")) { | ||||||
|         api_hal_vibro_on(false); |         api_hal_vibro_on(false); | ||||||
|     } else if(!string_cmp(args, "1")) { |     } else if(!string_cmp(args, "1")) { | ||||||
| @ -102,7 +100,7 @@ void cli_command_vibro(string_t args, void* context) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_led(string_t args, void* context) { | void cli_command_led(Cli* cli, string_t args, void* context) { | ||||||
|     // Get first word as light name
 |     // Get first word as light name
 | ||||||
|     Light light; |     Light light; | ||||||
|     string_t light_name; |     string_t light_name; | ||||||
| @ -142,7 +140,7 @@ void cli_command_led(string_t args, void* context) { | |||||||
|     api_hal_light_set(light, value); |     api_hal_light_set(light, value); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_gpio_set(string_t args, void* context) { | void cli_command_gpio_set(Cli* cli, string_t args, void* context) { | ||||||
|     char pin_names[][4] = {"PC0", "PC1", "PC3", "PB2", "PB3", "PA4", "PA6", "PA7"}; |     char pin_names[][4] = {"PC0", "PC1", "PC3", "PB2", "PB3", "PA4", "PA6", "PA7"}; | ||||||
|     GpioPin gpio[] = { |     GpioPin gpio[] = { | ||||||
|         {.port = GPIOC, .pin = LL_GPIO_PIN_0}, |         {.port = GPIOC, .pin = LL_GPIO_PIN_0}, | ||||||
| @ -200,7 +198,7 @@ void cli_command_gpio_set(string_t args, void* context) { | |||||||
|     return; |     return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_os_info(string_t args, void* context) { | void cli_command_os_info(Cli* cli, string_t args, void* context) { | ||||||
|     const uint8_t threads_num_max = 32; |     const uint8_t threads_num_max = 32; | ||||||
|     osThreadId_t threads_id[threads_num_max]; |     osThreadId_t threads_id[threads_num_max]; | ||||||
|     uint8_t thread_num = osThreadEnumerate(threads_id, threads_num_max); |     uint8_t thread_num = osThreadEnumerate(threads_id, threads_num_max); | ||||||
| @ -222,15 +220,15 @@ void cli_command_os_info(string_t args, void* context) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_commands_init(Cli* cli) { | void cli_commands_init(Cli* cli) { | ||||||
|     cli_add_command(cli, "help", cli_command_help, cli); |     cli_add_command(cli, "help", cli_command_help, NULL); | ||||||
|     cli_add_command(cli, "?", cli_command_help, cli); |     cli_add_command(cli, "?", cli_command_help, NULL); | ||||||
|     cli_add_command(cli, "version", cli_command_version, cli); |     cli_add_command(cli, "version", cli_command_version, NULL); | ||||||
|     cli_add_command(cli, "!", cli_command_version, cli); |     cli_add_command(cli, "!", cli_command_version, NULL); | ||||||
|     cli_add_command(cli, "uid", cli_command_uuid, cli); |     cli_add_command(cli, "uid", cli_command_uuid, NULL); | ||||||
|     cli_add_command(cli, "date", cli_command_date, cli); |     cli_add_command(cli, "date", cli_command_date, NULL); | ||||||
|     cli_add_command(cli, "log", cli_command_log, cli); |     cli_add_command(cli, "log", cli_command_log, NULL); | ||||||
|     cli_add_command(cli, "vibro", cli_command_vibro, cli); |     cli_add_command(cli, "vibro", cli_command_vibro, NULL); | ||||||
|     cli_add_command(cli, "led", cli_command_led, cli); |     cli_add_command(cli, "led", cli_command_led, NULL); | ||||||
|     cli_add_command(cli, "gpio_set", cli_command_gpio_set, cli); |     cli_add_command(cli, "gpio_set", cli_command_gpio_set, NULL); | ||||||
|     cli_add_command(cli, "os_info", cli_command_os_info, cli); |     cli_add_command(cli, "os_info", cli_command_os_info, NULL); | ||||||
| } | } | ||||||
|  | |||||||
| @ -213,7 +213,7 @@ void gui_cli_screen_stream_callback(uint8_t* data, size_t size, void* context) { | |||||||
|     cli_write(gui->cli, data, size); |     cli_write(gui->cli, data, size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void gui_cli_screen_stream(string_t args, void* context) { | void gui_cli_screen_stream(Cli* cli, string_t args, void* context) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     Gui* gui = context; |     Gui* gui = context; | ||||||
|     gui_set_framebuffer_callback_context(gui, gui); |     gui_set_framebuffer_callback_context(gui, gui); | ||||||
|  | |||||||
| @ -62,4 +62,4 @@ void gui_unlock(Gui* gui); | |||||||
| 
 | 
 | ||||||
| void gui_cli_screen_stream_callback(uint8_t* data, size_t size, void* context); | void gui_cli_screen_stream_callback(uint8_t* data, size_t size, void* context); | ||||||
| 
 | 
 | ||||||
| void gui_cli_screen_stream(string_t args, void* context); | void gui_cli_screen_stream(Cli* cli, string_t args, void* context); | ||||||
| @ -65,7 +65,7 @@ bool iButtonApp::read_hex_byte(string_t args, uint8_t* byte) { | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void iButtonApp::cli_cmd_callback(string_t args, void* context) { | void iButtonApp::cli_cmd_callback(Cli* cli, string_t args, void* context) { | ||||||
|     iButtonApp::Scene scene; |     iButtonApp::Scene scene; | ||||||
|     string_t cmd; |     string_t cmd; | ||||||
|     string_init(cmd); |     string_init(cmd); | ||||||
|  | |||||||
| @ -110,7 +110,7 @@ public: | |||||||
|     char* get_file_name(); |     char* get_file_name(); | ||||||
|     uint8_t get_file_name_size(); |     uint8_t get_file_name_size(); | ||||||
| 
 | 
 | ||||||
|     void cli_cmd_callback(string_t args, void* context); |     void cli_cmd_callback(Cli* cli, string_t args, void* context); | ||||||
|     void cli_send_event(CliEvent scene); |     void cli_send_event(CliEvent scene); | ||||||
| 
 | 
 | ||||||
|     void generate_random_name(char* name, uint8_t max_name_size); |     void generate_random_name(char* name, uint8_t max_name_size); | ||||||
|  | |||||||
| @ -39,7 +39,7 @@ void input_isr(void* _ctx) { | |||||||
|     osThreadFlagsSet(input->thread, INPUT_THREAD_FLAG_ISR); |     osThreadFlagsSet(input->thread, INPUT_THREAD_FLAG_ISR); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void input_cli_send(string_t args, void* context) { | void input_cli_send(Cli* cli, string_t args, void* context) { | ||||||
|     InputEvent event; |     InputEvent event; | ||||||
| 
 | 
 | ||||||
|     // Get first word as key name
 |     // Get first word as key name
 | ||||||
|  | |||||||
| @ -124,7 +124,29 @@ int32_t internal_storage_task(void* p) { | |||||||
|         internal_storage->config.block_count, |         internal_storage->config.block_count, | ||||||
|         internal_storage->config.block_cycles); |         internal_storage->config.block_cycles); | ||||||
| 
 | 
 | ||||||
|     int err = lfs_mount(&internal_storage->lfs, &internal_storage->config); |     int err; | ||||||
|  |     ApiHalBootFlag boot_flags = api_hal_boot_get_flags(); | ||||||
|  |     if(boot_flags & ApiHalBootFlagFactoryReset) { | ||||||
|  |         // Factory reset
 | ||||||
|  |         err = lfs_format(&internal_storage->lfs, &internal_storage->config); | ||||||
|  |         if(err == 0) { | ||||||
|  |             FURI_LOG_I("internal-storage", "Factory reset: Format successful, trying to mount"); | ||||||
|  |             api_hal_boot_set_flags(boot_flags & ~ApiHalBootFlagFactoryReset); | ||||||
|  |             err = lfs_mount(&internal_storage->lfs, &internal_storage->config); | ||||||
|  |             if(err == 0) { | ||||||
|  |                 FURI_LOG_I("internal-storage", "Factory reset: Mounted"); | ||||||
|  |                 internal_storage->state = InternalStorageStateReady; | ||||||
|  |             } else { | ||||||
|  |                 FURI_LOG_E("internal-storage", "Factory reset: Mount after format failed"); | ||||||
|  |                 internal_storage->state = InternalStorageStateBroken; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             FURI_LOG_E("internal-storage", "Factory reset: Format failed"); | ||||||
|  |             internal_storage->state = InternalStorageStateBroken; | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|  |         // Normal
 | ||||||
|  |         err = lfs_mount(&internal_storage->lfs, &internal_storage->config); | ||||||
|         if(err == 0) { |         if(err == 0) { | ||||||
|             FURI_LOG_I("internal-storage", "Mounted"); |             FURI_LOG_I("internal-storage", "Mounted"); | ||||||
|             internal_storage->state = InternalStorageStateReady; |             internal_storage->state = InternalStorageStateReady; | ||||||
| @ -146,6 +168,7 @@ int32_t internal_storage_task(void* p) { | |||||||
|                 internal_storage->state = InternalStorageStateBroken; |                 internal_storage->state = InternalStorageStateBroken; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_create("internal-storage", internal_storage); |     furi_record_create("internal-storage", internal_storage); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -185,7 +185,7 @@ void init_packet( | |||||||
|     state->packets[index].command = command; |     state->packets[index].command = command; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void irda_cli_cmd_rx(string_t args, void* context) { | void irda_cli_cmd_rx(Cli* cli, string_t args, void* context) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     IrDAPacket packet; |     IrDAPacket packet; | ||||||
|     IrDAApp* app = context; |     IrDAApp* app = context; | ||||||
| @ -211,7 +211,7 @@ void irda_cli_cmd_rx(string_t args, void* context) { | |||||||
|     return; |     return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void irda_cli_cmd_tx(string_t args, void* context) { | void irda_cli_cmd_tx(Cli* cli, string_t args, void* context) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
|     ValueMutex* state_mutex = context; |     ValueMutex* state_mutex = context; | ||||||
|     // Read protocol name
 |     // Read protocol name
 | ||||||
|  | |||||||
| @ -130,10 +130,7 @@ void nfc_free(Nfc* nfc) { | |||||||
|     free(nfc); |     free(nfc); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void nfc_cli_detect(string_t args, void* context) { | void nfc_cli_detect(Cli* cli, string_t args, void* context) { | ||||||
|     furi_assert(context); |  | ||||||
|     Cli* cli = context; |  | ||||||
| 
 |  | ||||||
|     // Check if nfc worker is not busy
 |     // Check if nfc worker is not busy
 | ||||||
|     if(api_hal_nfc_is_busy()) { |     if(api_hal_nfc_is_busy()) { | ||||||
|         printf("Nfc is busy"); |         printf("Nfc is busy"); | ||||||
| @ -167,7 +164,7 @@ void nfc_cli_detect(string_t args, void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_cli_init() { | void nfc_cli_init() { | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open("cli"); | ||||||
|     cli_add_command(cli, "nfc_detect", nfc_cli_detect, cli); |     cli_add_command(cli, "nfc_detect", nfc_cli_detect, NULL); | ||||||
|     furi_record_close("cli"); |     furi_record_close("cli"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,36 +1,50 @@ | |||||||
| #include "power_cli.h" | #include "power_cli.h" | ||||||
| #include <api-hal.h> | #include <api-hal.h> | ||||||
| 
 | 
 | ||||||
| void power_cli_poweroff(string_t args, void* context) { | void power_cli_poweroff(Cli* cli, string_t args, void* context) { | ||||||
|     Power* power = context; |     Power* power = context; | ||||||
|     power_off(power); |     power_off(power); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void power_cli_reset(string_t args, void* context) { | void power_cli_reset(Cli* cli, string_t args, void* context) { | ||||||
|     Power* power = context; |     Power* power = context; | ||||||
|     power_reset(power, PowerBootModeNormal); |     power_reset(power, PowerBootModeNormal); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void power_cli_dfu(string_t args, void* context) { | void power_cli_dfu(Cli* cli, string_t args, void* context) { | ||||||
|     Power* power = context; |     Power* power = context; | ||||||
|     power_reset(power, PowerBootModeDfu); |     power_reset(power, PowerBootModeDfu); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void power_cli_test(string_t args, void* context) { | void power_cli_factory_reset(Cli* cli, string_t args, void* context) { | ||||||
|  |     Power* power = context; | ||||||
|  |     printf("All data will be lost. Are you sure (y/n)?\r\n"); | ||||||
|  |     char c = cli_getc(cli); | ||||||
|  |     if(c == 'y' || c == 'Y') { | ||||||
|  |         printf("Data will be wiped after reboot.\r\n"); | ||||||
|  |         api_hal_boot_set_flags(ApiHalBootFlagFactoryReset); | ||||||
|  |         power_reset(power, PowerBootModeNormal); | ||||||
|  |     } else { | ||||||
|  |         printf("Safe choice.\r\n"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void power_cli_test(Cli* cli, string_t args, void* context) { | ||||||
|     api_hal_power_dump_state(); |     api_hal_power_dump_state(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void power_cli_otg_on(string_t args, void* context) { | void power_cli_otg_on(Cli* cli, string_t args, void* context) { | ||||||
|     api_hal_power_enable_otg(); |     api_hal_power_enable_otg(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void power_cli_otg_off(string_t args, void* context) { | void power_cli_otg_off(Cli* cli, string_t args, void* context) { | ||||||
|     api_hal_power_disable_otg(); |     api_hal_power_disable_otg(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void power_cli_init(Cli* cli, Power* power) { | void power_cli_init(Cli* cli, Power* power) { | ||||||
|     cli_add_command(cli, "poweroff", power_cli_poweroff, power); |     cli_add_command(cli, "poweroff", power_cli_poweroff, power); | ||||||
|     cli_add_command(cli, "reset", power_cli_reset, power); |     cli_add_command(cli, "reset", power_cli_reset, power); | ||||||
|  |     cli_add_command(cli, "factory_reset", power_cli_factory_reset, power); | ||||||
|     cli_add_command(cli, "dfu", power_cli_dfu, power); |     cli_add_command(cli, "dfu", power_cli_dfu, power); | ||||||
|     cli_add_command(cli, "power_test", power_cli_test, power); |     cli_add_command(cli, "power_test", power_cli_test, power); | ||||||
|     cli_add_command(cli, "power_otg_on", power_cli_otg_on, power); |     cli_add_command(cli, "power_otg_on", power_cli_otg_on, power); | ||||||
|  | |||||||
| @ -82,8 +82,8 @@ public: | |||||||
|     void hash_benchmark(); |     void hash_benchmark(); | ||||||
| 
 | 
 | ||||||
|     // cli tests
 |     // cli tests
 | ||||||
|     void cli_read_benchmark(string_t args, void* _ctx); |     void cli_read_benchmark(Cli* cli, string_t args, void* _ctx); | ||||||
|     void cli_write_benchmark(string_t args, void* _ctx); |     void cli_write_benchmark(Cli* cli, string_t args, void* _ctx); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // start app
 | // start app
 | ||||||
| @ -579,7 +579,7 @@ void SdTest::hash_benchmark() { | |||||||
|     wait_for_button(InputKeyOk); |     wait_for_button(InputKeyOk); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SdTest::cli_read_benchmark(string_t args, void* _ctx) { | void SdTest::cli_read_benchmark(Cli* cli, string_t args, void* _ctx) { | ||||||
|     SdTest* _this = static_cast<SdTest*>(_ctx); |     SdTest* _this = static_cast<SdTest*>(_ctx); | ||||||
| 
 | 
 | ||||||
|     const uint32_t benchmark_data_size = 16384 * 8; |     const uint32_t benchmark_data_size = 16384 * 8; | ||||||
| @ -691,7 +691,7 @@ void SdTest::cli_read_benchmark(string_t args, void* _ctx) { | |||||||
|     printf("test completed\r\n"); |     printf("test completed\r\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SdTest::cli_write_benchmark(string_t args, void* _ctx) { | void SdTest::cli_write_benchmark(Cli* cli, string_t args, void* _ctx) { | ||||||
|     SdTest* _this = static_cast<SdTest*>(_ctx); |     SdTest* _this = static_cast<SdTest*>(_ctx); | ||||||
| 
 | 
 | ||||||
|     const uint32_t b1_size = 1; |     const uint32_t b1_size = 1; | ||||||
|  | |||||||
| @ -478,7 +478,7 @@ void app_sd_eject_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| /******************* Cli callbacks *******************/ | /******************* Cli callbacks *******************/ | ||||||
| 
 | 
 | ||||||
| static void cli_sd_status(string_t args, void* _ctx) { | static void cli_sd_status(Cli* cli, string_t args, void* _ctx) { | ||||||
|     SdApp* sd_app = (SdApp*)_ctx; |     SdApp* sd_app = (SdApp*)_ctx; | ||||||
| 
 | 
 | ||||||
|     printf("SD status: "); |     printf("SD status: "); | ||||||
| @ -486,7 +486,7 @@ static void cli_sd_status(string_t args, void* _ctx) { | |||||||
|     printf("\r\n"); |     printf("\r\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cli_sd_format(string_t args, void* _ctx) { | static void cli_sd_format(Cli* cli, string_t args, void* _ctx) { | ||||||
|     SdApp* sd_app = (SdApp*)_ctx; |     SdApp* sd_app = (SdApp*)_ctx; | ||||||
| 
 | 
 | ||||||
|     printf("formatting SD card, please wait\r\n"); |     printf("formatting SD card, please wait\r\n"); | ||||||
| @ -503,7 +503,7 @@ static void cli_sd_format(string_t args, void* _ctx) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cli_sd_info(string_t args, void* _ctx) { | static void cli_sd_info(Cli* cli, string_t args, void* _ctx) { | ||||||
|     SdApp* sd_app = (SdApp*)_ctx; |     SdApp* sd_app = (SdApp*)_ctx; | ||||||
|     SDInfo sd_info; |     SDInfo sd_info; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,25 +1,25 @@ | |||||||
| #ifndef TARGET_H | #ifndef TARGET_H | ||||||
| #define TARGET_H | #define TARGET_H | ||||||
| 
 | 
 | ||||||
| /*
 | /**
 | ||||||
|  * Initialize hardware |  * Initialize hardware | ||||||
| */ | */ | ||||||
| void target_init(); | void target_init(); | ||||||
| 
 | 
 | ||||||
| /*
 | /**
 | ||||||
|  * Check if dfu mode requested |  * Check if dfu mode requested | ||||||
|  * @return 1 if dfu mode requested, 0 if not |  * @return 1 if dfu mode requested, 0 if not | ||||||
| */ |  */ | ||||||
| int target_is_dfu_requested(); | int target_is_dfu_requested(); | ||||||
| 
 | 
 | ||||||
| /*
 | /**
 | ||||||
|  * Switch to dfu mode |  * Switch to dfu mode | ||||||
| */ |  */ | ||||||
| void target_switch2dfu(); | void target_switch2dfu(); | ||||||
| 
 | 
 | ||||||
| /*
 | /**
 | ||||||
|  * Switch to OS |  * Switch to OS | ||||||
| */ |  */ | ||||||
| void target_switch2os(); | void target_switch2os(); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| @ -11,9 +11,21 @@ typedef enum { | |||||||
|     ApiHalBootModeDFU |     ApiHalBootModeDFU | ||||||
| } ApiHalBootMode; | } ApiHalBootMode; | ||||||
| 
 | 
 | ||||||
|  | /** Boot flags */ | ||||||
|  | typedef enum { | ||||||
|  |     ApiHalBootFlagDefault=0, | ||||||
|  |     ApiHalBootFlagFactoryReset=1, | ||||||
|  | } ApiHalBootFlag; | ||||||
|  | 
 | ||||||
| /** Set boot mode */ | /** Set boot mode */ | ||||||
| void api_hal_boot_set_mode(ApiHalBootMode mode); | void api_hal_boot_set_mode(ApiHalBootMode mode); | ||||||
| 
 | 
 | ||||||
|  | /** Set boot flags */ | ||||||
|  | void api_hal_boot_set_flags(ApiHalBootFlag flags); | ||||||
|  | 
 | ||||||
|  | /** Get boot flag */ | ||||||
|  | ApiHalBootFlag api_hal_boot_get_flags(); | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -12,3 +12,10 @@ void api_hal_boot_set_mode(ApiHalBootMode mode) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void api_hal_boot_set_flags(ApiHalBootFlag flags) { | ||||||
|  |     LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR2, flags); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ApiHalBootFlag api_hal_boot_get_flags() { | ||||||
|  |     return LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR2); | ||||||
|  | } | ||||||
| @ -12,3 +12,10 @@ void api_hal_boot_set_mode(ApiHalBootMode mode) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void api_hal_boot_set_flags(ApiHalBootFlag flags) { | ||||||
|  |     LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR2, flags); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ApiHalBootFlag api_hal_boot_get_flags() { | ||||||
|  |     return LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR2); | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく