Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorあく <alleteam@gmail.com>2021-10-04 10:01:41 +0300
committerGitHub <noreply@github.com>2021-10-04 10:01:41 +0300
commit832fb1b795ddb4ca15068bc090b1db86ae984aba (patch)
tree2bee727385468034072feeddebd47c648174675c /firmware
parenta7edebce69039ba65b31a18b57062c29bc39c867 (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.c32
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-flash.h60
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-power.c32
-rw-r--r--firmware/targets/furi-hal-include/furi-hal-power.h10
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