[FL-2366] HAL to LL migration part 2 (#1053)

* iButton, FuriHal: add onewire HAL, migrate to LL, add missing critical section guards
* FuriHal: rename onewire to ibutton, cleanup RCC domain usage, fix ibutton and rfid
* FuriHal: cleanup RCC usage
This commit is contained in:
あく
2022-03-25 13:33:01 +03:00
committed by GitHub
parent 3615ffecbe
commit 1fdc5f2950
21 changed files with 178 additions and 308 deletions

View File

@@ -1,7 +1,7 @@
#include "pulse_sequencer.h"
#include <furi.h>
#include <callback-connector.h>
#include <furi_hal_resources.h>
#include <furi_hal.h>
void PulseSequencer::set_periods(
uint32_t* _periods,
@@ -13,74 +13,40 @@ void PulseSequencer::set_periods(
}
void PulseSequencer::start() {
callback_pointer = cbc::obtain_connector(this, &PulseSequencer::timer_elapsed_callback);
api_interrupt_add(callback_pointer, InterruptTypeTimerUpdate, this);
period_index = 1;
init_timer(periods[period_index]);
pin_state = pin_start_state;
hal_gpio_write(&ibutton_gpio, pin_state);
pin_state = !pin_state;
HAL_TIM_Base_Start_IT(&htim1);
hal_gpio_init(&ibutton_gpio, GpioModeOutputOpenDrain, GpioPullNo, GpioSpeedVeryHigh);
furi_hal_ibutton_emulate_start(
periods[period_index], PulseSequencer::timer_elapsed_callback, this);
}
void PulseSequencer::stop() {
HAL_TIM_Base_Stop_IT(&htim1);
api_interrupt_remove(callback_pointer, InterruptTypeTimerUpdate);
deinit_timer();
furi_hal_ibutton_emulate_stop();
}
PulseSequencer::~PulseSequencer() {
stop();
}
void PulseSequencer::init_timer(uint32_t period) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
void PulseSequencer::timer_elapsed_callback(void* context) {
PulseSequencer* self = static_cast<PulseSequencer*>(context);
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = period;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if(HAL_TIM_Base_Init(&htim1) != HAL_OK) {
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if(HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) {
Error_Handler();
furi_hal_ibutton_emulate_set_next(self->periods[self->period_index]);
if(self->period_index == 0) {
self->pin_state = self->pin_start_state;
} else {
self->pin_state = !self->pin_state;
}
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
hal_gpio_write(&ibutton_gpio, self->pin_state);
hal_gpio_init(&ibutton_gpio, GpioModeOutputOpenDrain, GpioPullNo, GpioSpeedVeryHigh);
}
self->period_index++;
void PulseSequencer::deinit_timer() {
}
void PulseSequencer::timer_elapsed_callback(void* hw, void* context) {
PulseSequencer* _this = static_cast<PulseSequencer*>(context);
TIM_HandleTypeDef* htim = static_cast<TIM_HandleTypeDef*>(hw);
if(htim->Instance == TIM1) {
htim->Instance->ARR = _this->periods[_this->period_index];
if(_this->period_index == 0) {
_this->pin_state = _this->pin_start_state;
} else {
_this->pin_state = !_this->pin_state;
}
hal_gpio_write(&ibutton_gpio, _this->pin_state);
_this->period_index++;
if(_this->period_index == _this->periods_count) {
_this->period_index = 0;
}
if(self->period_index == self->periods_count) {
self->period_index = 0;
}
}

View File

@@ -17,10 +17,10 @@ private:
bool pin_state;
void init_timer(uint32_t period);
void deinit_timer();
void reset_period_index(PulseSequencer* _this);
void (*callback_pointer)(void*, void*);
void timer_elapsed_callback(void* hcomp, void* comp_ctx);
};
static void timer_elapsed_callback(void* comp_ctx);
};