[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
This commit is contained in:
		
							parent
							
								
									2fe44e1b11
								
							
						
					
					
						commit
						5d08b35b54
					
				| @ -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; | ||||
|     } | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
|  | ||||
| @ -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"); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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
 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #include <api-hal-gpio.h> | ||||
| #include <api-hal-version.h> | ||||
| 
 | ||||
| // init GPIO
 | ||||
| void hal_gpio_init( | ||||
| @ -17,11 +18,6 @@ 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() { | ||||
|  | ||||
| @ -68,8 +68,6 @@ static inline bool hal_gpio_read(const GpioPin* gpio) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void enable_cc1101_irq(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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 */ | ||||
|  | ||||
| @ -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
 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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() { | ||||
|     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 (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW); | ||||
|     return !value; | ||||
| #else | ||||
|         return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH); | ||||
|     return value; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| @ -68,8 +68,6 @@ static inline bool hal_gpio_read(const GpioPin* gpio) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void enable_cc1101_irq(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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 */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく