[FL-2263] Flasher service & RAM exec (#1006)

* WIP on stripping fw
* Compact FW build - use RAM_EXEC=1 COMPACT=1 DEBUG=0
* Fixed uninitialized storage struct; small fixes to compact fw
* Flasher srv w/mocked flash ops
* Fixed typos & accomodated FFF changes
* Alternative fw startup branch
* Working load & jmp to RAM fw
* +manifest processing for stage loader; + crc verification for stage payload
* Fixed questionable code & potential leaks
* Lowered screen update rate; added radio stack update stubs; working dfu write
* Console EP with manifest & stage validation
* Added microtar lib; minor ui fixes for updater
* Removed microtar
* Removed mtar #2
* Added a better version of microtar
* TAR archive api; LFS backup & restore core
* Recursive backup/restore
* LFS worker thread
* Added system apps to loader - not visible in UI; full update process with restarts
* Typo fix
* Dropped BL & f6; tooling for updater WIP
* Minor py fixes
* Minor fixes to make it build after merge
* Ported flash workaround from BL + fixed visuals
* Minor cleanup
* Chmod + loader app search fix
* Python linter fix
* Removed usb stuff & float read support for staged loader == -10% of binary size
* Added backup/restore & update pb requests
* Added stub impl to RPC for backup/restore/update commands
* Reworked TAR to use borrowed Storage api; slightly reduced build size by removing `static string`; hidden update-related RPC behind defines
* Moved backup&restore to storage
* Fixed new message types
* Backup/restore/update RPC impl
* Moved furi_hal_crc to LL; minor fixes
* CRC HAL rework to LL
* Purging STM HAL
* Brought back minimal DFU boot mode (no gui); additional crc state checks
* Added splash screen, BROKEN usb function
* Clock init rework WIP
* Stripped graphics from DFU mode
* Temp fix for unused static fun
* WIP update picker - broken!
* Fixed UI
* Bumping version
* Fixed RTC setup
* Backup to update folder instead of ext root
* Removed unused scenes & more usb remnants from staged loader
* CI updates
* Fixed update bundle name
* Temporary restored USB handler
* Attempt to prevent .text corruption
* Comments on how I spent this Saturday
* Added update file icon
* Documentation updates
* Moved common code to lib folder
* Storage: more unit tests
* Storage: blocking dir open, differentiate file and dir when freed.
* Major refactoring; added input processing to updater to allow retrying on failures (not very useful prob). Added API for extraction of thread return value
* Removed re-init check for manifest
* Changed low-level path manipulation to toolbox/path.h; makefile cleanup; tiny fix in lint.py
* Increased update worker stack size
* Text fixes in backup CLI
* Displaying number of update stages to run; removed timeout in handling errors
* Bumping version
* Added thread cleanup for spawner thread
* Updated build targets to exclude firmware bundle from 'ALL'
* Fixed makefile for update_package; skipping VCP init for update mode (ugly)
* Switched github build from ALL to update_package
* Added +x for dist_update.sh
* Cli: add total heap size to "free" command
* Moved (RAM) suffix to build version instead of git commit no.
* DFU comment
* Some fixes suggested by clang-tidy
* Fixed recursive PREFIX macro
* Makefile: gather all new rules in updater namespace. FuriHal: rename bootloader to boot, isr safe delays
* Github: correct build target name in firmware build
* FuriHal: move target switch to boot
* Makefile: fix firmware flash
* Furi, FuriHal: move kernel start to furi, early init
* Drop bootloader related stuff
* Drop cube. Drop bootloader linker script.
* Renamed update_hl, moved constants to #defines
* Moved update-related boot mode to separate bitfield
* Reworked updater cli to single entry point; fixed crash on tar cleanup
* Added Python replacement for dist shell scripts
* Linter fixes for dist.py +x
* Fixes for environment suffix
* Dropped bash scripts
* Added dirty build flag to version structure & interfaces
* Version string escapes
* Fixed flag logic in dist.py; added support for App instances being imported and not terminating the whole program
* Fixed fw address in ReadMe.md
* Rpc: fix crash on double screen start
* Return back original boot behavior and fix jump to system bootloader
* Cleanup code, add error sequence for RTC
* Update firmware readme
* FuriHal: drop boot, restructure RTC registers usage and add header register check
* Furi goes first
* Toolchain: add ccache support
* Renamed update bundle dir

Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com>
Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
hedger
2022-04-13 23:50:25 +03:00
committed by GitHub
parent a25552eb99
commit e02040107b
221 changed files with 4199 additions and 11704 deletions

View File

@@ -11,13 +11,14 @@ static void flipper_print_version(const char* target, const Version* version) {
TAG,
"\r\n\t%s version:\t%s\r\n"
"\tBuild date:\t\t%s\r\n"
"\tGit Commit:\t\t%s (%s)\r\n"
"\tGit Commit:\t\t%s (%s)%s\r\n"
"\tGit Branch:\t\t%s",
target,
version_get_version(version),
version_get_builddate(version),
version_get_githash(version),
version_get_gitbranchnum(version),
version_get_dirty_flag(version) ? " (dirty)" : "",
version_get_gitbranch(version));
} else {
FURI_LOG_I(TAG, "No build info for %s", target);
@@ -25,13 +26,7 @@ static void flipper_print_version(const char* target, const Version* version) {
}
void flipper_init() {
const Version* version;
version = (const Version*)furi_hal_version_get_bootloader_version();
flipper_print_version("Bootloader", version);
version = (const Version*)furi_hal_version_get_firmware_version();
flipper_print_version("Firmware", version);
flipper_print_version("Firmware", furi_hal_version_get_firmware_version());
FURI_LOG_I(TAG, "starting services");

View File

@@ -1,7 +1,13 @@
#include "furi.h"
void furi_init() {
osKernelInitialize();
furi_log_init();
furi_record_init();
furi_stdglue_init();
}
void furi_run() {
osKernelStart();
}

View File

@@ -27,6 +27,8 @@ extern "C" {
void furi_init();
void furi_run();
#ifdef __cplusplus
}
#endif

View File

@@ -21,20 +21,21 @@ void __furi_print_name() {
}
}
void __furi_halt() {
static FURI_NORETURN void __furi_halt() {
asm volatile(
#ifdef FURI_DEBUG
"bkpt 0x00 \n"
#endif
"loop: \n"
"loop%=: \n"
"wfi \n"
"b loop \n"
"b loop%= \n"
:
:
: "memory");
__builtin_unreachable();
}
void furi_crash(const char* message) {
FURI_NORETURN void furi_crash(const char* message) {
__disable_irq();
if(message == NULL) {
@@ -54,9 +55,10 @@ void furi_crash(const char* message) {
furi_hal_console_puts("\033[0m\r\n");
furi_hal_power_reset();
#endif
__builtin_unreachable();
}
void furi_halt(const char* message) {
FURI_NORETURN void furi_halt(const char* message) {
__disable_irq();
if(message == NULL) {
@@ -69,4 +71,4 @@ void furi_halt(const char* message) {
furi_hal_console_puts("\r\nSystem halted. Bye-bye!\r\n");
furi_hal_console_puts("\033[0m\r\n");
__furi_halt();
}
}

View File

@@ -1,7 +1,10 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#define FURI_NORETURN [[noreturn]]
#else
#include <stdnoreturn.h>
#define FURI_NORETURN noreturn
#endif
/** Check condition and crash if check failed */
@@ -15,10 +18,10 @@ extern "C" {
#endif
/** Crash system */
void furi_crash(const char* message);
FURI_NORETURN void furi_crash(const char* message);
/** Halt system */
void furi_halt(const char* message);
FURI_NORETURN void furi_halt(const char* message);
#ifdef __cplusplus
}

View File

@@ -101,18 +101,20 @@ extern "C" {
#endif
#ifndef FURI_IS_ISR
#define FURI_IS_ISR() \
(FURI_IS_IRQ_MODE() || (FURI_IS_IRQ_MASKED() && (osKernelGetState() == osKernelRunning)))
#define FURI_IS_ISR() (FURI_IS_IRQ_MODE() || FURI_IS_IRQ_MASKED())
#endif
#ifndef FURI_CRITICAL_ENTER
#define FURI_CRITICAL_ENTER() \
uint32_t __isrm = 0; \
bool __from_isr = FURI_IS_ISR(); \
if(__from_isr) { \
__isrm = taskENTER_CRITICAL_FROM_ISR(); \
} else { \
taskENTER_CRITICAL(); \
#define FURI_CRITICAL_ENTER() \
uint32_t __isrm = 0; \
bool __from_isr = FURI_IS_ISR(); \
bool __kernel_running = (osKernelGetState() == osKernelRunning); \
if(__from_isr) { \
__isrm = taskENTER_CRITICAL_FROM_ISR(); \
} else if(__kernel_running) { \
taskENTER_CRITICAL(); \
} else { \
__disable_irq(); \
}
#endif
@@ -120,8 +122,10 @@ extern "C" {
#define FURI_CRITICAL_EXIT() \
if(__from_isr) { \
taskEXIT_CRITICAL_FROM_ISR(__isrm); \
} else { \
} else if(__kernel_running) { \
taskEXIT_CRITICAL(); \
} else { \
__enable_irq(); \
}
#endif

View File

@@ -4,6 +4,7 @@
extern void* pvPortMalloc(size_t xSize);
extern void vPortFree(void* pv);
extern size_t xPortGetFreeHeapSize(void);
extern size_t xPortGetTotalHeapSize(void);
extern size_t xPortGetMinimumEverFreeHeapSize(void);
void* malloc(size_t size) {
@@ -50,6 +51,10 @@ size_t memmgr_get_free_heap(void) {
return xPortGetFreeHeapSize();
}
size_t memmgr_get_total_heap(void) {
return xPortGetTotalHeapSize();
}
size_t memmgr_get_minimum_free_heap(void) {
return xPortGetMinimumEverFreeHeapSize();
}

View File

@@ -23,6 +23,12 @@ extern "C" {
*/
size_t memmgr_get_free_heap(void);
/** Get total heap size
*
* @return total heap size in bytes
*/
size_t memmgr_get_total_heap(void);
/** Get heap watermark
*
* @return minimum heap in bytes

View File

@@ -526,6 +526,11 @@ void vPortFree(void* pv) {
}
/*-----------------------------------------------------------*/
size_t xPortGetTotalHeapSize(void) {
return (size_t)&__heap_end__ - (size_t)&__heap_start__;
}
/*-----------------------------------------------------------*/
size_t xPortGetFreeHeapSize(void) {
return xFreeBytesRemaining;
}

View File

@@ -49,7 +49,7 @@ bool furi_record_destroy(const char* name);
*
* @return pointer to the record
* @note Thread safe. Open and close must be executed from the same
* thread. Suspends caller thread till record appear
* thread. Suspends caller thread till record is available
*/
void* furi_record_open(const char* name);

View File

@@ -30,7 +30,7 @@ void furi_thread_set_state(FuriThread* thread, FuriThreadState state) {
}
}
void furi_thread_body(void* context) {
static void furi_thread_body(void* context) {
furi_assert(context);
FuriThread* thread = context;
@@ -167,3 +167,9 @@ size_t furi_thread_get_heap_size(FuriThread* thread) {
furi_assert(thread->heap_trace_enabled == true);
return thread->heap_size;
}
int32_t furi_thread_get_return_code(FuriThread* thread) {
furi_assert(thread);
furi_assert(thread->state == FuriThreadStateStopped);
return thread->ret;
}

View File

@@ -150,6 +150,14 @@ void furi_thread_disable_heap_trace(FuriThread* thread);
*/
size_t furi_thread_get_heap_size(FuriThread* thread);
/** Get thread return code
*
* @param thread FuriThread instance
*
* @return return code
*/
int32_t furi_thread_get_return_code(FuriThread* thread);
#ifdef __cplusplus
}
#endif
#endif