[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
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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
|
||||
|
Reference in New Issue
Block a user