diff --git a/applications/ibutton/helpers/key-reader.cpp b/applications/ibutton/helpers/key-reader.cpp index 1d868b8d..0afd5f4b 100644 --- a/applications/ibutton/helpers/key-reader.cpp +++ b/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(hcomp); KeyReader* _this = static_cast(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; } diff --git a/applications/lf-rfid/lf-rfid.c b/applications/lf-rfid/lf-rfid.c index 45ce4513..aef5f323 100644 --- a/applications/lf-rfid/lf-rfid.c +++ b/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; } diff --git a/core/api-hal/api-interrupt-mgr.c b/core/api-hal/api-interrupt-mgr.c index 83557d1a..f412fba1 100644 --- a/core/api-hal/api-interrupt-mgr.c +++ b/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"); } } } diff --git a/firmware/targets/api-hal-include/api-hal-delay.h b/firmware/targets/api-hal-include/api-hal-delay.h index 3a927bed..e01321d7 100644 --- a/firmware/targets/api-hal-include/api-hal-delay.h +++ b/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 diff --git a/firmware/targets/f4/Src/main.c b/firmware/targets/f4/Src/main.c index 72dcebaa..9dec9267 100644 --- a/firmware/targets/f4/Src/main.c +++ b/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 diff --git a/firmware/targets/f4/api-hal/api-hal-delay.c b/firmware/targets/f4/api-hal/api-hal-delay.c index a6d90d8d..f4cd80f7 100644 --- a/firmware/targets/f4/api-hal/api-hal-delay.c +++ b/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; diff --git a/firmware/targets/f4/api-hal/api-hal-gpio.c b/firmware/targets/f4/api-hal/api-hal-gpio.c index b36e8a62..13969299 100644 --- a/firmware/targets/f4/api-hal/api-hal-gpio.c +++ b/firmware/targets/f4/api-hal/api-hal-gpio.c @@ -1,4 +1,5 @@ #include +#include // 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 } diff --git a/firmware/targets/f4/api-hal/api-hal-gpio.h b/firmware/targets/f4/api-hal/api-hal-gpio.h index af3c8735..476d3788 100644 --- a/firmware/targets/f4/api-hal/api-hal-gpio.h +++ b/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 diff --git a/firmware/targets/f4/api-hal/api-hal.c b/firmware/targets/f4/api-hal/api-hal.c index 61dac551..9c1fb089 100644 --- a/firmware/targets/f4/api-hal/api-hal.c +++ b/firmware/targets/f4/api-hal/api-hal.c @@ -1,6 +1,7 @@ #include void api_hal_init() { + api_hal_delay_init(); api_hal_os_init(); api_hal_vcp_init(); api_hal_spi_init(); diff --git a/firmware/targets/f4/api-hal/api-interrupts.c b/firmware/targets/f4/api-hal/api-interrupts.c index 3aff02f9..74a8de1b 100644 --- a/firmware/targets/f4/api-hal/api-interrupts.c +++ b/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 */ diff --git a/firmware/targets/f5/Src/main.c b/firmware/targets/f5/Src/main.c index 47e0ead0..442fbcb1 100644 --- a/firmware/targets/f5/Src/main.c +++ b/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 diff --git a/firmware/targets/f5/api-hal/api-hal-delay.c b/firmware/targets/f5/api-hal/api-hal-delay.c index a6d90d8d..f4cd80f7 100644 --- a/firmware/targets/f5/api-hal/api-hal-delay.c +++ b/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; diff --git a/firmware/targets/f5/api-hal/api-hal-gpio.c b/firmware/targets/f5/api-hal/api-hal-gpio.c index 797a928f..8be5614e 100644 --- a/firmware/targets/f5/api-hal/api-hal-gpio.c +++ b/firmware/targets/f5/api-hal/api-hal-gpio.c @@ -1,7 +1,5 @@ #include -#include -#include -#include +#include // 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 } diff --git a/firmware/targets/f5/api-hal/api-hal-gpio.h b/firmware/targets/f5/api-hal/api-hal-gpio.h index 9aee3140..c60c721d 100644 --- a/firmware/targets/f5/api-hal/api-hal-gpio.h +++ b/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 diff --git a/firmware/targets/f5/api-hal/api-hal.c b/firmware/targets/f5/api-hal/api-hal.c index 81cc5d40..7333ee36 100644 --- a/firmware/targets/f5/api-hal/api-hal.c +++ b/firmware/targets/f5/api-hal/api-hal.c @@ -1,6 +1,7 @@ #include void api_hal_init() { + api_hal_delay_init(); api_hal_os_init(); api_hal_vcp_init(); api_hal_spi_init(); diff --git a/firmware/targets/f5/api-hal/api-interrupts.c b/firmware/targets/f5/api-hal/api-interrupts.c index 3aff02f9..74a8de1b 100644 --- a/firmware/targets/f5/api-hal/api-interrupts.c +++ b/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 */