[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) { | 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); |     KeyReader* _this = static_cast<KeyReader*>(comp_ctx); | ||||||
| 
 | 
 | ||||||
|     if(hcomp == &hcomp1) { |     if(hcomp == &hcomp1) { | ||||||
|         _this->cyfral_decoder.process_front( |         _this->cyfral_decoder.process_front(get_rfid_in_level(), DWT->CYCCNT - last_dwt_value); | ||||||
|             (HAL_COMP_GetOutputLevel(_hcomp) == COMP_OUTPUT_LEVEL_HIGH), |  | ||||||
|             DWT->CYCCNT - last_dwt_value); |  | ||||||
| 
 | 
 | ||||||
|         _this->metakom_decoder.process_front( |         _this->metakom_decoder.process_front(get_rfid_in_level(), DWT->CYCCNT - last_dwt_value); | ||||||
|             (HAL_COMP_GetOutputLevel(_hcomp) == COMP_OUTPUT_LEVEL_HIGH), |  | ||||||
|             DWT->CYCCNT - last_dwt_value); |  | ||||||
| 
 | 
 | ||||||
|         last_dwt_value = DWT->CYCCNT; |         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) { | static void input_callback(InputEvent* input_event, void* ctx) { | ||||||
|     osMessageQueueId_t event_queue = ctx; |     osMessageQueueId_t event_queue = ctx; | ||||||
| 
 | 
 | ||||||
|  |     if(input_event->type != InputTypeShort) return; | ||||||
|  | 
 | ||||||
|     AppEvent event; |     AppEvent event; | ||||||
|     event.type = EventTypeKey; |     event.type = EventTypeKey; | ||||||
|     event.value.input = *input_event; |     event.value.input = *input_event; | ||||||
|     osMessageQueuePut(event_queue, &event, 0, 0); |     osMessageQueuePut(event_queue, &event, 1, osWaitForever); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| extern TIM_HandleTypeDef TIM_C; | 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) { | 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
 |     // create pin
 | ||||||
|     GpioPin pull_pin = {.pin = RFID_PULL_Pin, .port = RFID_PULL_GPIO_Port}; |     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_status == osOK) { | ||||||
|                 if(event.type == EventTypeKey) { |                 if(event.type == EventTypeKey) { | ||||||
|                     // press events
 |                     // press events
 | ||||||
|                     if(event.value.input.type == InputTypePress && |                     if(event.value.input.key == InputKeyBack) { | ||||||
|                        event.value.input.key == InputKeyBack) { |                         break; | ||||||
|                         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.type == InputTypePress && |                     if(event.value.input.key == InputKeyUp) { | ||||||
|                        event.value.input.key == InputKeyUp) { |  | ||||||
|                         state->dirty_freq = true; |                         state->dirty_freq = true; | ||||||
|                         state->freq_khz += 10; |                         state->freq_khz += 10; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     if(event.value.input.type == InputTypePress && |                     if(event.value.input.key == InputKeyDown) { | ||||||
|                        event.value.input.key == InputKeyDown) { |  | ||||||
|                         state->dirty_freq = true; |                         state->dirty_freq = true; | ||||||
|                         state->freq_khz -= 10; |                         state->freq_khz -= 10; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     if(event.value.input.type == InputTypePress && |                     if(event.value.input.key == InputKeyLeft) { | ||||||
|                        event.value.input.key == InputKeyLeft) { |  | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     if(event.value.input.type == InputTypePress && |                     if(event.value.input.key == InputKeyRight) { | ||||||
|                        event.value.input.key == InputKeyRight) { |  | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     if(event.value.input.type == InputTypePress && |                     if(event.value.input.key == InputKeyOk) { | ||||||
|                        event.value.input.key == InputKeyOk) { |  | ||||||
|                         state->dirty = true; |                         state->dirty = true; | ||||||
|                         state->on = !state->on; |                         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; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -36,11 +36,9 @@ void api_interrupt_add(InterruptCallback callback, InterruptType type, void* con | |||||||
|         item->callback = callback; |         item->callback = callback; | ||||||
|         item->type = type; |         item->type = type; | ||||||
|         item->context = context; |         item->context = context; | ||||||
|  |         asm volatile("dmb" : : : "memory"); | ||||||
|         item->ready = true; |         item->ready = true; | ||||||
| 
 | 
 | ||||||
|         // TODO remove on app exit
 |  | ||||||
|         //flapp_on_exit(api_interrupt_remove, callback);
 |  | ||||||
| 
 |  | ||||||
|         osMutexRelease(interrupt_mutex); |         osMutexRelease(interrupt_mutex); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -77,6 +75,7 @@ void api_interrupt_enable(InterruptCallback callback, InterruptType type) { | |||||||
|                 // if the iterator is equal to our element
 |                 // if the iterator is equal to our element
 | ||||||
|                 if(it->current->data.callback == callback) { |                 if(it->current->data.callback == callback) { | ||||||
|                     it->current->data.ready = true; |                     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 the iterator is equal to our element
 | ||||||
|                 if(it->current->data.callback == callback) { |                 if(it->current->data.callback == callback) { | ||||||
|                     it->current->data.ready = false; |                     it->current->data.ready = false; | ||||||
|  |                     asm volatile("dmb" : : : "memory"); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -5,6 +5,9 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | /** Init DWT */ | ||||||
|  | void api_hal_delay_init(void); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Delay in milliseconds |  * Delay in milliseconds | ||||||
|  * @warning Cannot be used from ISR |  * @warning Cannot be used from ISR | ||||||
| @ -14,9 +17,6 @@ void delay(float milliseconds); | |||||||
| /** Delay in microseconds */ | /** Delay in microseconds */ | ||||||
| void delay_us(float microseconds); | void delay_us(float microseconds); | ||||||
| 
 | 
 | ||||||
| /** Init DWT */ |  | ||||||
| void delay_us_init_DWT(void); |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -23,11 +23,13 @@ | |||||||
| void SystemClock_Config(void); | void SystemClock_Config(void); | ||||||
| void MX_FREERTOS_Init(void); | void MX_FREERTOS_Init(void); | ||||||
| 
 | 
 | ||||||
| int main(void) | int main(void) { | ||||||
| { |     // Initialize FURI layer
 | ||||||
|  |     furi_init(); | ||||||
|  | 
 | ||||||
|  |     // Initialize ST HAL hardware
 | ||||||
|     HAL_Init(); |     HAL_Init(); | ||||||
|     SystemClock_Config(); |     SystemClock_Config(); | ||||||
| 
 |  | ||||||
|     MX_GPIO_Init(); |     MX_GPIO_Init(); | ||||||
|     MX_ADC1_Init(); |     MX_ADC1_Init(); | ||||||
|     MX_RTC_Init(); |     MX_RTC_Init(); | ||||||
| @ -46,11 +48,12 @@ int main(void) | |||||||
|     MX_AES2_Init(); |     MX_AES2_Init(); | ||||||
|     MX_CRC_Init(); |     MX_CRC_Init(); | ||||||
| 
 | 
 | ||||||
|     delay_us_init_DWT(); |     // Flipper API HAL
 | ||||||
|     api_hal_init(); |     api_hal_init(); | ||||||
|  | 
 | ||||||
|  |     // 3rd party
 | ||||||
|     MX_FATFS_Init(); |     MX_FATFS_Init(); | ||||||
| 
 | 
 | ||||||
|     furi_init(); |  | ||||||
|     // CMSIS initialization
 |     // CMSIS initialization
 | ||||||
|     osKernelInitialize(); |     osKernelInitialize(); | ||||||
|     // Init flipper
 |     // Init flipper
 | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
| 
 | 
 | ||||||
| static uint32_t clk_per_microsecond; | static uint32_t clk_per_microsecond; | ||||||
| 
 | 
 | ||||||
| void delay_us_init_DWT(void) { | void api_hal_delay_init(void) { | ||||||
|     CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; |     CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; | ||||||
|     DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; |     DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; | ||||||
|     DWT->CYCCNT = 0U; |     DWT->CYCCNT = 0U; | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include <api-hal-gpio.h> | #include <api-hal-gpio.h> | ||||||
|  | #include <api-hal-version.h> | ||||||
| 
 | 
 | ||||||
| // init GPIO
 | // init GPIO
 | ||||||
| void hal_gpio_init( | void hal_gpio_init( | ||||||
| @ -17,17 +18,12 @@ void hal_gpio_init( | |||||||
|     HAL_GPIO_Init(gpio->port, &GPIO_InitStruct); |     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; | extern COMP_HandleTypeDef hcomp1; | ||||||
| 
 | 
 | ||||||
| bool get_rfid_in_level() { | bool get_rfid_in_level() { | ||||||
|     #ifdef INVERT_RFID_IN | #ifdef INVERT_RFID_IN | ||||||
|         return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW); |     return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW); | ||||||
|     #else | #else | ||||||
|         return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH); |     return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH); | ||||||
|     #endif | #endif | ||||||
| } | } | ||||||
|  | |||||||
| @ -68,8 +68,6 @@ static inline bool hal_gpio_read(const GpioPin* gpio) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void enable_cc1101_irq(); |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| #include <api-hal.h> | #include <api-hal.h> | ||||||
| 
 | 
 | ||||||
| void api_hal_init() { | void api_hal_init() { | ||||||
|  |     api_hal_delay_init(); | ||||||
|     api_hal_os_init(); |     api_hal_os_init(); | ||||||
|     api_hal_vcp_init(); |     api_hal_vcp_init(); | ||||||
|     api_hal_spi_init(); |     api_hal_spi_init(); | ||||||
|  | |||||||
| @ -23,11 +23,6 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) { | |||||||
| /* Timer update event */ | /* Timer update event */ | ||||||
| void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { | ||||||
|     api_interrupt_call(InterruptTypeTimerUpdate, htim); |     api_interrupt_call(InterruptTypeTimerUpdate, htim); | ||||||
| 
 |  | ||||||
|     // handle HAL ticks
 |  | ||||||
|     if(htim->Instance == TIM17) { |  | ||||||
|         HAL_IncTick(); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* External interrupt event */ | /* External interrupt event */ | ||||||
|  | |||||||
| @ -23,11 +23,13 @@ | |||||||
| void SystemClock_Config(void); | void SystemClock_Config(void); | ||||||
| void MX_FREERTOS_Init(void); | void MX_FREERTOS_Init(void); | ||||||
| 
 | 
 | ||||||
| int main(void) | int main(void) { | ||||||
| { |     // Initialize FURI layer
 | ||||||
|  |     furi_init(); | ||||||
|  | 
 | ||||||
|  |     // Initialize ST HAL hardware
 | ||||||
|     HAL_Init(); |     HAL_Init(); | ||||||
|     SystemClock_Config(); |     SystemClock_Config(); | ||||||
| 
 |  | ||||||
|     MX_GPIO_Init(); |     MX_GPIO_Init(); | ||||||
|     MX_ADC1_Init(); |     MX_ADC1_Init(); | ||||||
|     MX_RTC_Init(); |     MX_RTC_Init(); | ||||||
| @ -46,11 +48,12 @@ int main(void) | |||||||
|     MX_AES2_Init(); |     MX_AES2_Init(); | ||||||
|     MX_CRC_Init(); |     MX_CRC_Init(); | ||||||
| 
 | 
 | ||||||
|     delay_us_init_DWT(); |     // Flipper API HAL
 | ||||||
|     api_hal_init(); |     api_hal_init(); | ||||||
|  | 
 | ||||||
|  |     // 3rd party
 | ||||||
|     MX_FATFS_Init(); |     MX_FATFS_Init(); | ||||||
| 
 | 
 | ||||||
|     furi_init(); |  | ||||||
|     // CMSIS initialization
 |     // CMSIS initialization
 | ||||||
|     osKernelInitialize(); |     osKernelInitialize(); | ||||||
|     // Init flipper
 |     // Init flipper
 | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
| 
 | 
 | ||||||
| static uint32_t clk_per_microsecond; | static uint32_t clk_per_microsecond; | ||||||
| 
 | 
 | ||||||
| void delay_us_init_DWT(void) { | void api_hal_delay_init(void) { | ||||||
|     CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; |     CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; | ||||||
|     DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; |     DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; | ||||||
|     DWT->CYCCNT = 0U; |     DWT->CYCCNT = 0U; | ||||||
|  | |||||||
| @ -1,7 +1,5 @@ | |||||||
| #include <api-hal-gpio.h> | #include <api-hal-gpio.h> | ||||||
| #include <api-hal-spi.h> | #include <api-hal-version.h> | ||||||
| #include <api-hal-resources.h> |  | ||||||
| #include <api-hal-delay.h> |  | ||||||
| 
 | 
 | ||||||
| // init GPIO
 | // init GPIO
 | ||||||
| void hal_gpio_init( | void hal_gpio_init( | ||||||
| @ -23,9 +21,16 @@ void hal_gpio_init( | |||||||
| extern COMP_HandleTypeDef hcomp1; | extern COMP_HandleTypeDef hcomp1; | ||||||
| 
 | 
 | ||||||
| bool get_rfid_in_level() { | bool get_rfid_in_level() { | ||||||
|     #ifdef INVERT_RFID_IN |     bool value = false; | ||||||
|         return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW); |     if (api_hal_version_get_hw_version() > 7) { | ||||||
|     #else |         value = (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_LOW); | ||||||
|         return (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH); |     } else { | ||||||
|     #endif |         value = (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | #ifdef INVERT_RFID_IN | ||||||
|  |     return !value; | ||||||
|  | #else | ||||||
|  |     return value; | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  | |||||||
| @ -68,8 +68,6 @@ static inline bool hal_gpio_read(const GpioPin* gpio) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void enable_cc1101_irq(); |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| #include <api-hal.h> | #include <api-hal.h> | ||||||
| 
 | 
 | ||||||
| void api_hal_init() { | void api_hal_init() { | ||||||
|  |     api_hal_delay_init(); | ||||||
|     api_hal_os_init(); |     api_hal_os_init(); | ||||||
|     api_hal_vcp_init(); |     api_hal_vcp_init(); | ||||||
|     api_hal_spi_init(); |     api_hal_spi_init(); | ||||||
|  | |||||||
| @ -23,11 +23,6 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) { | |||||||
| /* Timer update event */ | /* Timer update event */ | ||||||
| void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { | ||||||
|     api_interrupt_call(InterruptTypeTimerUpdate, htim); |     api_interrupt_call(InterruptTypeTimerUpdate, htim); | ||||||
| 
 |  | ||||||
|     // handle HAL ticks
 |  | ||||||
|     if(htim->Instance == TIM17) { |  | ||||||
|         HAL_IncTick(); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* External interrupt event */ | /* External interrupt event */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく