diff options
author | あく <alleteam@gmail.com> | 2021-10-04 10:01:41 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-04 10:01:41 +0300 |
commit | 832fb1b795ddb4ca15068bc090b1db86ae984aba (patch) | |
tree | 2bee727385468034072feeddebd47c648174675c /firmware | |
parent | a7edebce69039ba65b31a18b57062c29bc39c867 (diff) |
[FL-1228] FuriHal: add charge suppress API. (#743)
* FuriHal: add charge suppress API.
* FuriHal: add guards to insomnia and charge suppress routines.
* FuriHal: proper API for scheduler in power.
* FuriHal: move charging control from critical section, fix deadlock.
* Gui: use FreeRTOS native timers controls for IconAnimation, fix crash on animation start stop
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/targets/f6/furi-hal/furi-hal-power.c | 32 | ||||
-rw-r--r-- | firmware/targets/f7/furi-hal/furi-hal-flash.h | 60 | ||||
-rw-r--r-- | firmware/targets/f7/furi-hal/furi-hal-power.c | 32 | ||||
-rw-r--r-- | firmware/targets/furi-hal-include/furi-hal-power.h | 10 |
4 files changed, 109 insertions, 25 deletions
diff --git a/firmware/targets/f6/furi-hal/furi-hal-power.c b/firmware/targets/f6/furi-hal/furi-hal-power.c index afc430ab..47ce5f4d 100644 --- a/firmware/targets/f6/furi-hal/furi-hal-power.c +++ b/firmware/targets/f6/furi-hal/furi-hal-power.c @@ -16,13 +16,15 @@ #include <furi.h> typedef struct { - volatile uint32_t insomnia; - volatile uint32_t deep_insomnia; + volatile uint8_t insomnia; + volatile uint8_t deep_insomnia; + volatile uint8_t suppress_charge; } FuriHalPower; static volatile FuriHalPower furi_hal_power = { .insomnia = 0, .deep_insomnia = 1, + .suppress_charge = 0, }; const ParamCEDV cedv = { @@ -80,11 +82,15 @@ uint16_t furi_hal_power_insomnia_level() { } void furi_hal_power_insomnia_enter() { + vTaskSuspendAll(); furi_hal_power.insomnia++; + xTaskResumeAll(); } void furi_hal_power_insomnia_exit() { + vTaskSuspendAll(); furi_hal_power.insomnia--; + xTaskResumeAll(); } bool furi_hal_power_sleep_available() { @@ -282,3 +288,25 @@ void furi_hal_power_enable_external_3_3v(){ void furi_hal_power_disable_external_3_3v(){ LL_GPIO_ResetOutputPin(PERIPH_POWER_GPIO_Port, PERIPH_POWER_Pin); } + +void furi_hal_power_suppress_charge_enter() { + vTaskSuspendAll(); + bool disable_charging = furi_hal_power.suppress_charge == 0; + furi_hal_power.suppress_charge++; + xTaskResumeAll(); + + if (disable_charging) { + bq25896_disable_charging(); + } +} + +void furi_hal_power_suppress_charge_exit() { + vTaskSuspendAll(); + furi_hal_power.suppress_charge--; + bool enable_charging = furi_hal_power.suppress_charge == 0; + xTaskResumeAll(); + + if (enable_charging) { + bq25896_enable_charging(); + } +}
\ No newline at end of file diff --git a/firmware/targets/f7/furi-hal/furi-hal-flash.h b/firmware/targets/f7/furi-hal/furi-hal-flash.h index 3ef9b730..583d53eb 100644 --- a/firmware/targets/f7/furi-hal/furi-hal-flash.h +++ b/firmware/targets/f7/furi-hal/furi-hal-flash.h @@ -5,70 +5,88 @@ #include <stddef.h> /** Get flash base address - * @return pointer to flash base + * + * @return pointer to flash base */ size_t furi_hal_flash_get_base(); /** Get flash read block size - * @return size in bytes + * + * @return size in bytes */ size_t furi_hal_flash_get_read_block_size(); /** Get flash write block size - * @return size in bytes + * + * @return size in bytes */ size_t furi_hal_flash_get_write_block_size(); /** Get flash page size - * @return size in bytes + * + * @return size in bytes */ size_t furi_hal_flash_get_page_size(); /** Get expected flash cycles count - * @return count of erase-write operations + * + * @return count of erase-write operations */ size_t furi_hal_flash_get_cycles_count(); /** Get free flash start address - * @return pointer to free region start + * + * @return pointer to free region start */ const void* furi_hal_flash_get_free_start_address(); /** Get free flash end address - * @return pointer to free region end + * + * @return pointer to free region end */ const void* furi_hal_flash_get_free_end_address(); /** Get first free page start address - * @return first free page memory address + * + * @return first free page memory address */ size_t furi_hal_flash_get_free_page_start_address(); /** Get free page count - * @return free page count + * + * @return free page count */ size_t furi_hal_flash_get_free_page_count(); -/* - * Erase Flash +/** Erase Flash + * * Locking operation, uses HSEM to manage shared access. - * @param page, page number - * @param count, page count to erase + * + * @param page page number + * @param count page count to erase + * + * @return true on success */ bool furi_hal_flash_erase(uint8_t page, uint8_t count); -/* - * Write double word (64 bits) +/** Write double word (64 bits) + * * Locking operation, uses HSEM to manage shared access. - * @param address - destination address, must be double word aligned. - * @param data - data to write + * + * @param address destination address, must be double word aligned. + * @param data data to write + * + * @return true on success */ bool furi_hal_flash_write_dword(size_t address, uint64_t data); -/* - * Write double word (64 bits) from address +/** Write double word (64 bits) from address + * * Locking operation, uses HSEM to manage shared access. - * @param address - destination address, must be block aligned - * @param source_address - source address + * + * @param address destination address, must be block aligned + * @param source_address source address + * + * @return true on success */ bool furi_hal_flash_write_dword_from(size_t address, size_t source_address); diff --git a/firmware/targets/f7/furi-hal/furi-hal-power.c b/firmware/targets/f7/furi-hal/furi-hal-power.c index afc430ab..47ce5f4d 100644 --- a/firmware/targets/f7/furi-hal/furi-hal-power.c +++ b/firmware/targets/f7/furi-hal/furi-hal-power.c @@ -16,13 +16,15 @@ #include <furi.h> typedef struct { - volatile uint32_t insomnia; - volatile uint32_t deep_insomnia; + volatile uint8_t insomnia; + volatile uint8_t deep_insomnia; + volatile uint8_t suppress_charge; } FuriHalPower; static volatile FuriHalPower furi_hal_power = { .insomnia = 0, .deep_insomnia = 1, + .suppress_charge = 0, }; const ParamCEDV cedv = { @@ -80,11 +82,15 @@ uint16_t furi_hal_power_insomnia_level() { } void furi_hal_power_insomnia_enter() { + vTaskSuspendAll(); furi_hal_power.insomnia++; + xTaskResumeAll(); } void furi_hal_power_insomnia_exit() { + vTaskSuspendAll(); furi_hal_power.insomnia--; + xTaskResumeAll(); } bool furi_hal_power_sleep_available() { @@ -282,3 +288,25 @@ void furi_hal_power_enable_external_3_3v(){ void furi_hal_power_disable_external_3_3v(){ LL_GPIO_ResetOutputPin(PERIPH_POWER_GPIO_Port, PERIPH_POWER_Pin); } + +void furi_hal_power_suppress_charge_enter() { + vTaskSuspendAll(); + bool disable_charging = furi_hal_power.suppress_charge == 0; + furi_hal_power.suppress_charge++; + xTaskResumeAll(); + + if (disable_charging) { + bq25896_disable_charging(); + } +} + +void furi_hal_power_suppress_charge_exit() { + vTaskSuspendAll(); + furi_hal_power.suppress_charge--; + bool enable_charging = furi_hal_power.suppress_charge == 0; + xTaskResumeAll(); + + if (enable_charging) { + bq25896_enable_charging(); + } +}
\ No newline at end of file diff --git a/firmware/targets/furi-hal-include/furi-hal-power.h b/firmware/targets/furi-hal-include/furi-hal-power.h index 8bbdcfed..d44138ab 100644 --- a/firmware/targets/furi-hal-include/furi-hal-power.h +++ b/firmware/targets/furi-hal-include/furi-hal-power.h @@ -157,6 +157,16 @@ void furi_hal_power_enable_external_3_3v(); */ void furi_hal_power_disable_external_3_3v(); +/** Enter supress charge mode. + * + * Use this function when your application need clean power supply. + */ +void furi_hal_power_suppress_charge_enter(); + +/** Exit supress charge mode + */ +void furi_hal_power_suppress_charge_exit(); + #ifdef __cplusplus } #endif |