Просмотр исходного кода

[FL-1009, FL-1118] Better initialization sequence and V8 hardware support (#406)

* Interrupt manager: add memory barriers.
* ISRs: remove TIM17 dead code.
* API HAL Delay: rename initialization routine and move to API-HAL
* Main: move FURI initialization to the start.
* API HAL GPIO: drop CC1101 shenanigans, COMP inversion for new boards.
* IButton: migrate Cyfral and Metakom to RFID comp routine, make it compatible with new boards.
* RFID: Better keyboard handling and shutdown routines
あく 4 лет назад
Родитель
Сommit
5d08b35b54

+ 2 - 7
applications/ibutton/helpers/key-reader.cpp

@@ -137,17 +137,12 @@ void KeyReader::stop_comaparator(void) {
 }
 
 void KeyReader::comparator_trigger_callback(void* hcomp, void* comp_ctx) {
-    COMP_HandleTypeDef* _hcomp = static_cast<COMP_HandleTypeDef*>(hcomp);
     KeyReader* _this = static_cast<KeyReader*>(comp_ctx);
 
     if(hcomp == &hcomp1) {
-        _this->cyfral_decoder.process_front(
-            (HAL_COMP_GetOutputLevel(_hcomp) == COMP_OUTPUT_LEVEL_HIGH),
-            DWT->CYCCNT - last_dwt_value);
+        _this->cyfral_decoder.process_front(get_rfid_in_level(), DWT->CYCCNT - last_dwt_value);
 
-        _this->metakom_decoder.process_front(
-            (HAL_COMP_GetOutputLevel(_hcomp) == COMP_OUTPUT_LEVEL_HIGH),
-            DWT->CYCCNT - last_dwt_value);
+        _this->metakom_decoder.process_front(get_rfid_in_level(), DWT->CYCCNT - last_dwt_value);
 
         last_dwt_value = DWT->CYCCNT;
     }

+ 28 - 23
applications/lf-rfid/lf-rfid.c

@@ -51,10 +51,12 @@ static void render_callback(Canvas* canvas, void* ctx) {
 static void input_callback(InputEvent* input_event, void* ctx) {
     osMessageQueueId_t event_queue = ctx;
 
+    if(input_event->type != InputTypeShort) return;
+
     AppEvent event;
     event.type = EventTypeKey;
     event.value.input = *input_event;
-    osMessageQueuePut(event_queue, &event, 0, 0);
+    osMessageQueuePut(event_queue, &event, 1, osWaitForever);
 }
 
 extern TIM_HandleTypeDef TIM_C;
@@ -244,7 +246,7 @@ static void extract_data(uint8_t* buf, uint8_t* customer, uint32_t* em_data) {
 }
 
 int32_t lf_rfid_workaround(void* p) {
-    osMessageQueueId_t event_queue = osMessageQueueNew(2, sizeof(AppEvent), NULL);
+    osMessageQueueId_t event_queue = osMessageQueueNew(8, sizeof(AppEvent), NULL);
 
     // create pin
     GpioPin pull_pin = {.pin = RFID_PULL_Pin, .port = RFID_PULL_GPIO_Port};
@@ -337,41 +339,27 @@ int32_t lf_rfid_workaround(void* p) {
             if(event_status == osOK) {
                 if(event.type == EventTypeKey) {
                     // press events
-                    if(event.value.input.type == InputTypePress &&
-                       event.value.input.key == InputKeyBack) {
-                        hal_pwmn_stop(&TIM_C, TIM_CHANNEL_1); // TODO: move to furiac_onexit
-                        api_interrupt_remove(
-                            comparator_trigger_callback, InterruptTypeComparatorTrigger);
-                        gpio_init(pull_pin_record, GpioModeInput);
-                        gpio_init((GpioPin*)&ibutton_gpio, GpioModeInput);
-
-                        // TODO remove all view_ports create by app
-                        view_port_enabled_set(view_port, false);
-                        return 255;
+                    if(event.value.input.key == InputKeyBack) {
+                        break;
                     }
 
-                    if(event.value.input.type == InputTypePress &&
-                       event.value.input.key == InputKeyUp) {
+                    if(event.value.input.key == InputKeyUp) {
                         state->dirty_freq = true;
                         state->freq_khz += 10;
                     }
 
-                    if(event.value.input.type == InputTypePress &&
-                       event.value.input.key == InputKeyDown) {
+                    if(event.value.input.key == InputKeyDown) {
                         state->dirty_freq = true;
                         state->freq_khz -= 10;
                     }
 
-                    if(event.value.input.type == InputTypePress &&
-                       event.value.input.key == InputKeyLeft) {
+                    if(event.value.input.key == InputKeyLeft) {
                     }
 
-                    if(event.value.input.type == InputTypePress &&
-                       event.value.input.key == InputKeyRight) {
+                    if(event.value.input.key == InputKeyRight) {
                     }
 
-                    if(event.value.input.type == InputTypePress &&
-                       event.value.input.key == InputKeyOk) {
+                    if(event.value.input.key == InputKeyOk) {
                         state->dirty = true;
                         state->on = !state->on;
                     }
@@ -412,5 +400,22 @@ int32_t lf_rfid_workaround(void* p) {
         }
     }
 
+    hal_pwmn_stop(&TIM_C, TIM_CHANNEL_1); // TODO: move to furiac_onexit
+    api_interrupt_remove(comparator_trigger_callback, InterruptTypeComparatorTrigger);
+
+    gpio_init(pull_pin_record, GpioModeInput);
+    gpio_init((GpioPin*)&ibutton_gpio, GpioModeInput);
+
+    // TODO remove all view_ports create by app
+    view_port_enabled_set(view_port, false);
+    gui_remove_view_port(gui, view_port);
+    view_port_free(view_port);
+
+    HAL_COMP_Stop(&hcomp1);
+
+    vStreamBufferDelete(comp_ctx.stream_buffer);
+
+    osMessageQueueDelete(event_queue);
+
     return 0;
 }

+ 3 - 3
core/api-hal/api-interrupt-mgr.c

@@ -36,11 +36,9 @@ void api_interrupt_add(InterruptCallback callback, InterruptType type, void* con
         item->callback = callback;
         item->type = type;
         item->context = context;
+        asm volatile("dmb" : : : "memory");
         item->ready = true;
 
-        // TODO remove on app exit
-        //flapp_on_exit(api_interrupt_remove, callback);
-
         osMutexRelease(interrupt_mutex);
     }
 }
@@ -77,6 +75,7 @@ void api_interrupt_enable(InterruptCallback callback, InterruptType type) {
                 // if the iterator is equal to our element
                 if(it->current->data.callback == callback) {
                     it->current->data.ready = true;
+                    asm volatile("dmb" : : : "memory");
                 }
             }
         }
@@ -96,6 +95,7 @@ void api_interrupt_disable(InterruptCallback callback, InterruptType type) {
                 // if the iterator is equal to our element
                 if(it->current->data.callback == callback) {
                     it->current->data.ready = false;
+                    asm volatile("dmb" : : : "memory");
                 }
             }
         }

+ 3 - 3
firmware/targets/api-hal-include/api-hal-delay.h

@@ -5,6 +5,9 @@
 extern "C" {
 #endif
 
+/** Init DWT */
+void api_hal_delay_init(void);
+
 /**
  * Delay in milliseconds
  * @warning Cannot be used from ISR
@@ -14,9 +17,6 @@ void delay(float milliseconds);
 /** Delay in microseconds */
 void delay_us(float microseconds);
 
-/** Init DWT */
-void delay_us_init_DWT(void);
-
 #ifdef __cplusplus
 }
 #endif

+ 8 - 5
firmware/targets/f4/Src/main.c

@@ -23,11 +23,13 @@
 void SystemClock_Config(void);
 void MX_FREERTOS_Init(void);
 
-int main(void)
-{
+int main(void) {
+    // Initialize FURI layer
+    furi_init();
+
+    // Initialize ST HAL hardware
     HAL_Init();
     SystemClock_Config();
-
     MX_GPIO_Init();
     MX_ADC1_Init();
     MX_RTC_Init();
@@ -46,11 +48,12 @@ int main(void)
     MX_AES2_Init();
     MX_CRC_Init();
 
-    delay_us_init_DWT();
+    // Flipper API HAL
     api_hal_init();
+
+    // 3rd party
     MX_FATFS_Init();
 
-    furi_init();
     // CMSIS initialization
     osKernelInitialize();
     // Init flipper

+ 1 - 1
firmware/targets/f4/api-hal/api-hal-delay.c

@@ -5,7 +5,7 @@
 
 static uint32_t clk_per_microsecond;
 
-void delay_us_init_DWT(void) {
+void api_hal_delay_init(void) {
     CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
     DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
     DWT->CYCCNT = 0U;

+ 6 - 10
firmware/targets/f4/api-hal/api-hal-gpio.c

@@ -1,4 +1,5 @@
 #include <api-hal-gpio.h>
+#include <api-hal-version.h>
 
 // init GPIO
 void hal_gpio_init(
@@ -17,17 +18,12 @@ void hal_gpio_init(
     HAL_GPIO_Init(gpio->port, &GPIO_InitStruct);
 }
 
-void enable_cc1101_irq() {
-    HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);
-    HAL_NVIC_EnableIRQ(EXTI4_IRQn);
-}
-
 extern COMP_HandleTypeDef hcomp1;
 
 bool get_rfid_in_level() {
-    #ifdef INVERT_RFID_IN
-        return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW);
-    #else
-        return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH);
-    #endif
+#ifdef INVERT_RFID_IN
+    return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW);
+#else
+    return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH);
+#endif
 }

+ 0 - 2
firmware/targets/f4/api-hal/api-hal-gpio.h

@@ -68,8 +68,6 @@ static inline bool hal_gpio_read(const GpioPin* gpio) {
     }
 }
 
-void enable_cc1101_irq();
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 0
firmware/targets/f4/api-hal/api-hal.c

@@ -1,6 +1,7 @@
 #include <api-hal.h>
 
 void api_hal_init() {
+    api_hal_delay_init();
     api_hal_os_init();
     api_hal_vcp_init();
     api_hal_spi_init();

+ 0 - 5
firmware/targets/f4/api-hal/api-interrupts.c

@@ -23,11 +23,6 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) {
 /* Timer update event */
 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) {
     api_interrupt_call(InterruptTypeTimerUpdate, htim);
-
-    // handle HAL ticks
-    if(htim->Instance == TIM17) {
-        HAL_IncTick();
-    }
 }
 
 /* External interrupt event */

+ 8 - 5
firmware/targets/f5/Src/main.c

@@ -23,11 +23,13 @@
 void SystemClock_Config(void);
 void MX_FREERTOS_Init(void);
 
-int main(void)
-{
+int main(void) {
+    // Initialize FURI layer
+    furi_init();
+
+    // Initialize ST HAL hardware
     HAL_Init();
     SystemClock_Config();
-
     MX_GPIO_Init();
     MX_ADC1_Init();
     MX_RTC_Init();
@@ -46,11 +48,12 @@ int main(void)
     MX_AES2_Init();
     MX_CRC_Init();
 
-    delay_us_init_DWT();
+    // Flipper API HAL
     api_hal_init();
+
+    // 3rd party
     MX_FATFS_Init();
 
-    furi_init();
     // CMSIS initialization
     osKernelInitialize();
     // Init flipper

+ 1 - 1
firmware/targets/f5/api-hal/api-hal-delay.c

@@ -5,7 +5,7 @@
 
 static uint32_t clk_per_microsecond;
 
-void delay_us_init_DWT(void) {
+void api_hal_delay_init(void) {
     CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
     DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
     DWT->CYCCNT = 0U;

+ 13 - 8
firmware/targets/f5/api-hal/api-hal-gpio.c

@@ -1,7 +1,5 @@
 #include <api-hal-gpio.h>
-#include <api-hal-spi.h>
-#include <api-hal-resources.h>
-#include <api-hal-delay.h>
+#include <api-hal-version.h>
 
 // init GPIO
 void hal_gpio_init(
@@ -23,9 +21,16 @@ void hal_gpio_init(
 extern COMP_HandleTypeDef hcomp1;
 
 bool get_rfid_in_level() {
-    #ifdef INVERT_RFID_IN
-        return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW);
-    #else
-        return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH);
-    #endif
+    bool value = false;
+    if (api_hal_version_get_hw_version() > 7) {
+        value = (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW);
+    } else {
+        value = (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH);
+    }
+
+#ifdef INVERT_RFID_IN
+    return !value;
+#else
+    return value;
+#endif
 }

+ 0 - 2
firmware/targets/f5/api-hal/api-hal-gpio.h

@@ -68,8 +68,6 @@ static inline bool hal_gpio_read(const GpioPin* gpio) {
     }
 }
 
-void enable_cc1101_irq();
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 0
firmware/targets/f5/api-hal/api-hal.c

@@ -1,6 +1,7 @@
 #include <api-hal.h>
 
 void api_hal_init() {
+    api_hal_delay_init();
     api_hal_os_init();
     api_hal_vcp_init();
     api_hal_spi_init();

+ 0 - 5
firmware/targets/f5/api-hal/api-interrupts.c

@@ -23,11 +23,6 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) {
 /* Timer update event */
 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) {
     api_interrupt_call(InterruptTypeTimerUpdate, htim);
-
-    // handle HAL ticks
-    if(htim->Instance == TIM17) {
-        HAL_IncTick();
-    }
 }
 
 /* External interrupt event */