FuriHal: replace HAL with LL in RFID Part 1. Drop F6. (#1049)
* FuriHal: new speaker HAL * FuriHal: drop PWM * FuriHal: move COMP1 to LL * FuriHal: move COMP1 to LL backport to F6 * FuriHal: remove missing gpio_rfid_carrier from F6 * FurHal: use LL for system controls in flash HAL * Drop F6 source tree * Drop F6 from GitHub workflow * Tie USE_FULL_ASSERT with APP_UNIT_TESTS * Speaker: return to old volume calculation * FreeRTOS: move TCB header to glue Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com>
This commit is contained in:
		
							parent
							
								
									3857cd7d5f
								
							
						
					
					
						commit
						c4a0847c99
					
				
							
								
								
									
										2
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							| @ -6,7 +6,7 @@ | ||||
| 
 | ||||
| - [ Describe how to verify changes ] | ||||
| 
 | ||||
| # Checklist (do not modify) | ||||
| # Checklist (For Reviewer) | ||||
| 
 | ||||
| - [ ] PR has description of feature/bug or link to Confluence/Jira task | ||||
| - [ ] Description contains actions to verify feature/bugfix | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @ -10,7 +10,7 @@ on: | ||||
|   pull_request: | ||||
| 
 | ||||
| env: | ||||
|   TARGETS: f6 f7 | ||||
|   TARGETS: f7 | ||||
|   DEFAULT_TARGET: f7 | ||||
| 
 | ||||
| jobs: | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/lint_c.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/lint_c.yml
									
									
									
									
										vendored
									
									
								
							| @ -10,7 +10,7 @@ on: | ||||
|   pull_request: | ||||
| 
 | ||||
| env: | ||||
|   TARGETS: f6 f7 | ||||
|   TARGETS: f7 | ||||
| 
 | ||||
| jobs: | ||||
|   lint_c_cpp: | ||||
|  | ||||
| @ -3,8 +3,6 @@ | ||||
| #include <callback-connector.h> | ||||
| #include <maxim_crc.h> | ||||
| 
 | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| KeyReader::Error KeyReader::read(iButtonKey* key) { | ||||
|     uint8_t tmp_key_data[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||
|     iButtonKeyType key_type; | ||||
| @ -116,9 +114,9 @@ void KeyReader::start_comaparator(void) { | ||||
| 
 | ||||
|     comparator_callback_pointer = | ||||
|         cbc::obtain_connector(this, &KeyReader::comparator_trigger_callback); | ||||
|     api_interrupt_add(comparator_callback_pointer, InterruptTypeComparatorTrigger, this); | ||||
|     furi_hal_rfid_comp_set_callback(comparator_callback_pointer, this); | ||||
|     last_dwt_value = DWT->CYCCNT; | ||||
|     HAL_COMP_Start(&hcomp1); | ||||
|     furi_hal_rfid_comp_start(); | ||||
| } | ||||
| 
 | ||||
| void KeyReader::stop_comaparator(void) { | ||||
| @ -127,23 +125,19 @@ void KeyReader::stop_comaparator(void) { | ||||
|     // rfid_pins_reset will disable ibutton pin
 | ||||
|     furi_hal_ibutton_start(); | ||||
| 
 | ||||
|     HAL_COMP_Stop(&hcomp1); | ||||
|     api_interrupt_remove(comparator_callback_pointer, InterruptTypeComparatorTrigger); | ||||
|     furi_hal_rfid_comp_stop(); | ||||
|     furi_hal_rfid_comp_set_callback(NULL, NULL); | ||||
| } | ||||
| 
 | ||||
| void KeyReader::comparator_trigger_callback(void* hcomp, void* comp_ctx) { | ||||
| void KeyReader::comparator_trigger_callback(bool level, void* comp_ctx) { | ||||
|     KeyReader* _this = static_cast<KeyReader*>(comp_ctx); | ||||
| 
 | ||||
|     if(hcomp == &hcomp1) { | ||||
|         uint32_t current_dwt_value = DWT->CYCCNT; | ||||
|     uint32_t current_dwt_value = DWT->CYCCNT; | ||||
| 
 | ||||
|         _this->cyfral_decoder.process_front( | ||||
|             hal_gpio_get_rfid_in_level(), current_dwt_value - last_dwt_value); | ||||
|         _this->metakom_decoder.process_front( | ||||
|             hal_gpio_get_rfid_in_level(), current_dwt_value - last_dwt_value); | ||||
|     _this->cyfral_decoder.process_front(level, current_dwt_value - last_dwt_value); | ||||
|     _this->metakom_decoder.process_front(level, current_dwt_value - last_dwt_value); | ||||
| 
 | ||||
|         last_dwt_value = current_dwt_value; | ||||
|     } | ||||
|     last_dwt_value = current_dwt_value; | ||||
| } | ||||
| 
 | ||||
| void KeyReader::switch_to(ReadMode mode) { | ||||
|  | ||||
| @ -28,8 +28,8 @@ private: | ||||
|     bool verify_key(iButtonKeyType key_type, const uint8_t* const data, uint8_t data_size); | ||||
| 
 | ||||
|     // cyfral and metakom readers data
 | ||||
|     void comparator_trigger_callback(void* hcomp, void* comp_ctx); | ||||
|     void (*comparator_callback_pointer)(void* hcomp, void* comp_ctx); | ||||
|     void comparator_trigger_callback(bool level, void* comp_ctx); | ||||
|     void (*comparator_callback_pointer)(bool level, void* comp_ctx); | ||||
| 
 | ||||
|     void start_comaparator(void); | ||||
|     void stop_comaparator(void); | ||||
| @ -51,4 +51,4 @@ private: | ||||
| 
 | ||||
|     void switch_to(ReadMode mode); | ||||
|     void switch_mode_if_needed(); | ||||
| }; | ||||
| }; | ||||
|  | ||||
| @ -2,8 +2,6 @@ | ||||
| #include <callback-connector.h> | ||||
| #include <maxim_crc.h> | ||||
| 
 | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| KeyReader::Error KeyWorker::read(iButtonKey* key) { | ||||
|     KeyReader::Error result = key_reader.read(key); | ||||
| 
 | ||||
| @ -51,4 +49,4 @@ KeyWorker::KeyWorker(const GpioPin* one_wire_gpio) | ||||
| } | ||||
| 
 | ||||
| KeyWorker::~KeyWorker() { | ||||
| } | ||||
| } | ||||
|  | ||||
| @ -4,8 +4,6 @@ | ||||
| #include <stm32wbxx_ll_cortex.h> | ||||
| #include <tim.h> | ||||
| 
 | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief private violation assistant for RfidReader | ||||
|  */ | ||||
| @ -63,14 +61,10 @@ void RfidReader::switch_mode() { | ||||
|     switch_timer_reset(); | ||||
| } | ||||
| 
 | ||||
| static void comparator_trigger_callback(void* hcomp, void* comp_ctx) { | ||||
|     COMP_HandleTypeDef* _hcomp = static_cast<COMP_HandleTypeDef*>(hcomp); | ||||
| static void comparator_trigger_callback(bool level, void* comp_ctx) { | ||||
|     RfidReader* _this = static_cast<RfidReader*>(comp_ctx); | ||||
| 
 | ||||
|     if(hcomp == &hcomp1) { | ||||
|         RfidReaderAccessor::decode( | ||||
|             *_this, (HAL_COMP_GetOutputLevel(_hcomp) == COMP_OUTPUT_LEVEL_HIGH)); | ||||
|     } | ||||
|     RfidReaderAccessor::decode(*_this, !level); | ||||
| } | ||||
| 
 | ||||
| RfidReader::RfidReader() { | ||||
| @ -163,25 +157,13 @@ bool RfidReader::any_read() { | ||||
| } | ||||
| 
 | ||||
| void RfidReader::start_comparator(void) { | ||||
|     api_interrupt_add(comparator_trigger_callback, InterruptTypeComparatorTrigger, this); | ||||
|     furi_hal_rfid_comp_set_callback(comparator_trigger_callback, this); | ||||
|     last_dwt_value = DWT->CYCCNT; | ||||
| 
 | ||||
|     hcomp1.Init.InputMinus = COMP_INPUT_MINUS_1_2VREFINT; | ||||
|     hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1; | ||||
|     hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED; | ||||
|     hcomp1.Init.Hysteresis = COMP_HYSTERESIS_HIGH; | ||||
|     hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE; | ||||
|     hcomp1.Init.Mode = COMP_POWERMODE_MEDIUMSPEED; | ||||
|     hcomp1.Init.WindowMode = COMP_WINDOWMODE_DISABLE; | ||||
|     hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING_FALLING; | ||||
|     if(HAL_COMP_Init(&hcomp1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     HAL_COMP_Start(&hcomp1); | ||||
|     furi_hal_rfid_comp_start(); | ||||
| } | ||||
| 
 | ||||
| void RfidReader::stop_comparator(void) { | ||||
|     HAL_COMP_Stop(&hcomp1); | ||||
|     api_interrupt_remove(comparator_trigger_callback, InterruptTypeComparatorTrigger); | ||||
| } | ||||
|     furi_hal_rfid_comp_stop(); | ||||
|     furi_hal_rfid_comp_set_callback(NULL, NULL); | ||||
| } | ||||
|  | ||||
| @ -4,8 +4,6 @@ | ||||
| #include "protocols/protocol_hid_h10301.h" | ||||
| #include "protocols/protocol_indala_40134.h" | ||||
| 
 | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief all timings are specified in field clocks (field clock = 125 kHz, 8 us) | ||||
|  *  | ||||
|  | ||||
| @ -1,35 +1,16 @@ | ||||
| #include "lfrfid_debug_app_scene_tune.h" | ||||
| #include <furi_hal.h> | ||||
| 
 | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| static void comparator_trigger_callback(void* hcomp, void* comp_ctx) { | ||||
|     COMP_HandleTypeDef* _hcomp = static_cast<COMP_HandleTypeDef*>(hcomp); | ||||
| 
 | ||||
|     if(hcomp == &hcomp1) { | ||||
|         hal_gpio_write(&gpio_ext_pa7, HAL_COMP_GetOutputLevel(_hcomp) == COMP_OUTPUT_LEVEL_HIGH); | ||||
|     } | ||||
| static void comparator_trigger_callback(bool level, void* comp_ctx) { | ||||
|     hal_gpio_write(&gpio_ext_pa7, !level); | ||||
| } | ||||
| 
 | ||||
| void LfRfidDebugAppSceneTune::on_enter(LfRfidDebugApp* app, bool need_restore) { | ||||
|     app->view_controller.switch_to<LfRfidViewTuneVM>(); | ||||
|     hal_gpio_init_simple(&gpio_ext_pa7, GpioModeOutputPushPull); | ||||
| 
 | ||||
|     api_interrupt_add(comparator_trigger_callback, InterruptTypeComparatorTrigger, this); | ||||
| 
 | ||||
|     hcomp1.Init.InputMinus = COMP_INPUT_MINUS_1_2VREFINT; | ||||
|     hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1; | ||||
|     hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED; | ||||
|     hcomp1.Init.Hysteresis = COMP_HYSTERESIS_HIGH; | ||||
|     hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE; | ||||
|     hcomp1.Init.Mode = COMP_POWERMODE_MEDIUMSPEED; | ||||
|     hcomp1.Init.WindowMode = COMP_WINDOWMODE_DISABLE; | ||||
|     hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING_FALLING; | ||||
|     if(HAL_COMP_Init(&hcomp1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     HAL_COMP_Start(&hcomp1); | ||||
|     furi_hal_rfid_comp_set_callback(comparator_trigger_callback, this); | ||||
|     furi_hal_rfid_comp_start(); | ||||
| 
 | ||||
|     furi_hal_rfid_pins_read(); | ||||
|     furi_hal_rfid_tim_read(125000, 0.5); | ||||
| @ -50,11 +31,11 @@ bool LfRfidDebugAppSceneTune::on_event(LfRfidDebugApp* app, LfRfidDebugApp::Even | ||||
| } | ||||
| 
 | ||||
| void LfRfidDebugAppSceneTune::on_exit(LfRfidDebugApp* app) { | ||||
|     HAL_COMP_Stop(&hcomp1); | ||||
|     api_interrupt_remove(comparator_trigger_callback, InterruptTypeComparatorTrigger); | ||||
|     furi_hal_rfid_comp_stop(); | ||||
|     furi_hal_rfid_comp_set_callback(NULL, NULL); | ||||
| 
 | ||||
|     hal_gpio_init_simple(&gpio_ext_pa7, GpioModeAnalog); | ||||
|     furi_hal_rfid_tim_read_stop(); | ||||
|     furi_hal_rfid_tim_reset(); | ||||
|     furi_hal_rfid_pins_reset(); | ||||
| } | ||||
| } | ||||
|  | ||||
| @ -102,7 +102,7 @@ typedef struct { | ||||
|     uint8_t volume_id_max; | ||||
| } State; | ||||
| 
 | ||||
| const float volumes[] = {0, 0.02, 0.05, 0.1, 0.5}; | ||||
| const float volumes[] = {0, .25, .5, .75, 1}; | ||||
| 
 | ||||
| bool is_white_note(const MelodyEventRecord* note_record, uint8_t id) { | ||||
|     if(note_record == NULL) return false; | ||||
| @ -332,10 +332,10 @@ void process_note( | ||||
|     // play note
 | ||||
|     float note_delay = bar_length_ms / (float)note_record->length; | ||||
|     if(note_record->note != N) { | ||||
|         hal_pwm_set(volume, note_record->note, &SPEAKER_TIM, SPEAKER_CH); | ||||
|         furi_hal_speaker_start(note_record->note, volume); | ||||
|     } | ||||
|     delay(note_delay); | ||||
|     hal_pwm_stop(&SPEAKER_TIM, SPEAKER_CH); | ||||
|     furi_hal_speaker_stop(); | ||||
| } | ||||
| 
 | ||||
| void music_player_thread(void* p) { | ||||
| @ -447,7 +447,7 @@ int32_t music_player_app(void* p) { | ||||
|     } | ||||
| 
 | ||||
|     osThreadTerminate(player); | ||||
|     hal_pwm_stop(&SPEAKER_TIM, SPEAKER_CH); | ||||
|     furi_hal_speaker_stop(); | ||||
|     view_port_enabled_set(view_port, false); | ||||
|     gui_remove_view_port(gui, view_port); | ||||
|     furi_record_close("gui"); | ||||
|  | ||||
| @ -9,7 +9,7 @@ extern "C" { | ||||
| typedef struct NotificationApp NotificationApp; | ||||
| typedef struct { | ||||
|     float frequency; | ||||
|     float pwm; | ||||
|     float volume; | ||||
| } NotificationMessageDataSound; | ||||
| 
 | ||||
| typedef struct { | ||||
|  | ||||
| @ -139,12 +139,12 @@ void notification_vibro_off() { | ||||
|     furi_hal_vibro_on(false); | ||||
| } | ||||
| 
 | ||||
| void notification_sound_on(float pwm, float freq) { | ||||
|     hal_pwm_set(pwm, freq, &SPEAKER_TIM, SPEAKER_CH); | ||||
| void notification_sound_on(float freq, float volume) { | ||||
|     furi_hal_speaker_start(freq, volume); | ||||
| } | ||||
| 
 | ||||
| void notification_sound_off() { | ||||
|     hal_pwm_stop(&SPEAKER_TIM, SPEAKER_CH); | ||||
|     furi_hal_speaker_stop(); | ||||
| } | ||||
| 
 | ||||
| // display timer
 | ||||
| @ -236,8 +236,8 @@ void notification_process_notification_message( | ||||
|             break; | ||||
|         case NotificationMessageTypeSoundOn: | ||||
|             notification_sound_on( | ||||
|                 notification_message->data.sound.pwm * speaker_volume_setting, | ||||
|                 notification_message->data.sound.frequency); | ||||
|                 notification_message->data.sound.frequency, | ||||
|                 notification_message->data.sound.volume * speaker_volume_setting); | ||||
|             reset_mask |= reset_sound_mask; | ||||
|             break; | ||||
|         case NotificationMessageTypeSoundOff: | ||||
|  | ||||
| @ -17,7 +17,7 @@ for octave in range(9): | ||||
|         print(f"const NotificationMessage message_note_{name}{octave}" + " = {\n" | ||||
|               "\t.type = NotificationMessageTypeSoundOn,\n" | ||||
|               f"\t.data.sound.frequency = {round(note, 2)}f,\n" | ||||
|               "\t.data.sound.pwm = 0.5f,\n" | ||||
|               "\t.data.sound.volume = 1.0f,\n" | ||||
|               "};") | ||||
|         note = note * cf | ||||
| 
 | ||||
| @ -29,545 +29,545 @@ for octave in range(9): | ||||
| const NotificationMessage message_click = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 16.35f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 17.32f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 18.35f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 19.45f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 20.6f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 21.83f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 23.12f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 24.5f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 25.96f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 27.5f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 29.14f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b0 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 30.87f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 32.7f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 34.65f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 36.71f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 38.89f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 41.2f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 43.65f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 46.25f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 49.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 51.91f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 55.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 58.27f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b1 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 61.74f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 65.41f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 69.3f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 73.42f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 77.78f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 82.41f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 87.31f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 92.5f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 98.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 103.83f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 110.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 116.54f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b2 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 123.47f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 130.81f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 138.59f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 146.83f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 155.56f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 164.81f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 174.61f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 185.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 196.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 207.65f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 220.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 233.08f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b3 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 246.94f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 261.63f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 277.18f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 293.66f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 311.13f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 329.63f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 349.23f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 369.99f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 392.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 415.3f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 440.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 466.16f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b4 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 493.88f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 523.25f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 554.37f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 587.33f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 622.25f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 659.26f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 698.46f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 739.99f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 783.99f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 830.61f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 880.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 932.33f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b5 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 987.77f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1046.5f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1108.73f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1174.66f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1244.51f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1318.51f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1396.91f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1479.98f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1567.98f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1661.22f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1760.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1864.66f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b6 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 1975.53f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 2093.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 2217.46f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 2349.32f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 2489.02f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 2637.02f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 2793.83f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 2959.96f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 3135.96f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 3322.44f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 3520.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 3729.31f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b7 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 3951.07f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_c8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 4186.01f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_cs8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 4434.92f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_d8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 4698.64f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_ds8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 4978.03f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_e8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 5274.04f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_f8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 5587.65f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_fs8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 5919.91f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_g8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 6271.93f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_gs8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 6644.88f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_a8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 7040.0f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_as8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 7458.62f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
| const NotificationMessage message_note_b8 = { | ||||
|     .type = NotificationMessageTypeSoundOn, | ||||
|     .data.sound.frequency = 7902.13f, | ||||
|     .data.sound.pwm = 0.5f, | ||||
|     .data.sound.volume = 1.0f, | ||||
| }; | ||||
|  | ||||
| @ -43,7 +43,7 @@ const char* const volume_text[VOLUME_COUNT] = { | ||||
|     "75%", | ||||
|     "100%", | ||||
| }; | ||||
| const float volume_value[VOLUME_COUNT] = {0.0f, 0.04f, 0.1f, 0.2f, 1.0f}; | ||||
| const float volume_value[VOLUME_COUNT] = {0.0f, 0.25f, 0.5f, 0.75f, 1.0f}; | ||||
| 
 | ||||
| #define DELAY_COUNT 6 | ||||
| const char* const delay_text[DELAY_COUNT] = { | ||||
|  | ||||
| @ -1,21 +0,0 @@ | ||||
| #include <furi_hal.h> | ||||
| #include <stm32wbxx_ll_utils.h> | ||||
| 
 | ||||
| void furi_hal_init() { | ||||
|     furi_hal_i2c_init(); | ||||
|     furi_hal_light_init(); | ||||
|     furi_hal_spi_init(); | ||||
|     furi_hal_version_init(); | ||||
| } | ||||
| 
 | ||||
| void delay(float milliseconds) { | ||||
|     LL_mDelay((uint32_t)milliseconds); | ||||
| } | ||||
| 
 | ||||
| void delay_us(float microseconds) { | ||||
|     microseconds = microseconds / 1000; | ||||
|     if(microseconds < 1) { | ||||
|         microseconds = 1; | ||||
|     } | ||||
|     LL_mDelay((uint32_t)microseconds); | ||||
| } | ||||
| @ -1,215 +0,0 @@ | ||||
| #include <furi_hal_gpio.h> | ||||
| #include <stddef.h> | ||||
| #include <assert.h> | ||||
| 
 | ||||
| #define GET_SYSCFG_EXTI_PORT(gpio)                \ | ||||
|     (((gpio) == (GPIOA)) ? LL_SYSCFG_EXTI_PORTA : \ | ||||
|      ((gpio) == (GPIOB)) ? LL_SYSCFG_EXTI_PORTB : \ | ||||
|      ((gpio) == (GPIOC)) ? LL_SYSCFG_EXTI_PORTC : \ | ||||
|      ((gpio) == (GPIOD)) ? LL_SYSCFG_EXTI_PORTD : \ | ||||
|      ((gpio) == (GPIOE)) ? LL_SYSCFG_EXTI_PORTE : \ | ||||
|                            LL_SYSCFG_EXTI_PORTH) | ||||
| 
 | ||||
| #define GPIO_PIN_MAP(pin, prefix)               \ | ||||
|     (((pin) == (LL_GPIO_PIN_0))  ? prefix##0 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_1))  ? prefix##1 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_2))  ? prefix##2 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_3))  ? prefix##3 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_4))  ? prefix##4 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_5))  ? prefix##5 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_6))  ? prefix##6 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_7))  ? prefix##7 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_8))  ? prefix##8 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_9))  ? prefix##9 :  \ | ||||
|      ((pin) == (LL_GPIO_PIN_10)) ? prefix##10 : \ | ||||
|      ((pin) == (LL_GPIO_PIN_11)) ? prefix##11 : \ | ||||
|      ((pin) == (LL_GPIO_PIN_12)) ? prefix##12 : \ | ||||
|      ((pin) == (LL_GPIO_PIN_13)) ? prefix##13 : \ | ||||
|      ((pin) == (LL_GPIO_PIN_14)) ? prefix##14 : \ | ||||
|                                    prefix##15) | ||||
| 
 | ||||
| #define GET_SYSCFG_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_SYSCFG_EXTI_LINE) | ||||
| #define GET_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_EXTI_LINE_) | ||||
| 
 | ||||
| static volatile GpioInterrupt gpio_interrupt[GPIO_NUMBER]; | ||||
| 
 | ||||
| static uint8_t hal_gpio_get_pin_num(const GpioPin* gpio) { | ||||
|     uint8_t pin_num = 0; | ||||
|     for(pin_num = 0; pin_num < GPIO_NUMBER; pin_num++) { | ||||
|         if(gpio->pin & (1 << pin_num)) break; | ||||
|     } | ||||
|     return pin_num; | ||||
| } | ||||
| 
 | ||||
| void hal_gpio_init_simple(const GpioPin* gpio, const GpioMode mode) { | ||||
|     hal_gpio_init(gpio, mode, GpioPullNo, GpioSpeedLow); | ||||
| } | ||||
| 
 | ||||
| void hal_gpio_init( | ||||
|     const GpioPin* gpio, | ||||
|     const GpioMode mode, | ||||
|     const GpioPull pull, | ||||
|     const GpioSpeed speed) { | ||||
|     // we cannot set alternate mode in this function
 | ||||
|     assert(mode != GpioModeAltFunctionPushPull); | ||||
|     assert(mode != GpioModeAltFunctionOpenDrain); | ||||
| 
 | ||||
|     hal_gpio_init_ex(gpio, mode, pull, speed, GpioAltFnUnused); | ||||
| } | ||||
| 
 | ||||
| void hal_gpio_init_ex( | ||||
|     const GpioPin* gpio, | ||||
|     const GpioMode mode, | ||||
|     const GpioPull pull, | ||||
|     const GpioSpeed speed, | ||||
|     const GpioAltFn alt_fn) { | ||||
|     uint32_t sys_exti_port = GET_SYSCFG_EXTI_PORT(gpio->port); | ||||
|     uint32_t sys_exti_line = GET_SYSCFG_EXTI_LINE(gpio->pin); | ||||
|     uint32_t exti_line = GET_EXTI_LINE(gpio->pin); | ||||
| 
 | ||||
|     // Configure gpio with interrupts disabled
 | ||||
|     __disable_irq(); | ||||
| 
 | ||||
|     // Set gpio speed
 | ||||
|     switch(speed) { | ||||
|     case GpioSpeedLow: | ||||
|         LL_GPIO_SetPinSpeed(gpio->port, gpio->pin, LL_GPIO_SPEED_FREQ_LOW); | ||||
|         break; | ||||
|     case GpioSpeedMedium: | ||||
|         LL_GPIO_SetPinSpeed(gpio->port, gpio->pin, LL_GPIO_SPEED_FREQ_MEDIUM); | ||||
|         break; | ||||
|     case GpioSpeedHigh: | ||||
|         LL_GPIO_SetPinSpeed(gpio->port, gpio->pin, LL_GPIO_SPEED_FREQ_HIGH); | ||||
|         break; | ||||
|     case GpioSpeedVeryHigh: | ||||
|         LL_GPIO_SetPinSpeed(gpio->port, gpio->pin, LL_GPIO_SPEED_FREQ_VERY_HIGH); | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     // Set gpio pull mode
 | ||||
|     switch(pull) { | ||||
|     case GpioPullNo: | ||||
|         LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_NO); | ||||
|         break; | ||||
|     case GpioPullUp: | ||||
|         LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_UP); | ||||
|         break; | ||||
|     case GpioPullDown: | ||||
|         LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_DOWN); | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     // Set gpio mode
 | ||||
|     if(mode >= GpioModeInterruptRise) { | ||||
|         // Set pin in interrupt mode
 | ||||
|         LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_INPUT); | ||||
|         LL_SYSCFG_SetEXTISource(sys_exti_port, sys_exti_line); | ||||
|         if(mode == GpioModeInterruptRise || mode == GpioModeInterruptRiseFall) { | ||||
|             LL_EXTI_EnableIT_0_31(exti_line); | ||||
|             LL_EXTI_EnableRisingTrig_0_31(exti_line); | ||||
|         } | ||||
|         if(mode == GpioModeInterruptFall || mode == GpioModeInterruptRiseFall) { | ||||
|             LL_EXTI_EnableIT_0_31(exti_line); | ||||
|             LL_EXTI_EnableFallingTrig_0_31(exti_line); | ||||
|         } | ||||
|         if(mode == GpioModeEventRise || mode == GpioModeEventRiseFall) { | ||||
|             LL_EXTI_EnableEvent_0_31(exti_line); | ||||
|             LL_EXTI_EnableRisingTrig_0_31(exti_line); | ||||
|         } | ||||
|         if(mode == GpioModeEventFall || mode == GpioModeEventRiseFall) { | ||||
|             LL_EXTI_EnableEvent_0_31(exti_line); | ||||
|             LL_EXTI_EnableFallingTrig_0_31(exti_line); | ||||
|         } | ||||
|     } else { | ||||
|         // Disable interrupts if set
 | ||||
|         if(LL_SYSCFG_GetEXTISource(sys_exti_line) == sys_exti_port && | ||||
|            LL_EXTI_IsEnabledIT_0_31(exti_line)) { | ||||
|             LL_EXTI_DisableIT_0_31(exti_line); | ||||
|             LL_EXTI_DisableRisingTrig_0_31(exti_line); | ||||
|             LL_EXTI_DisableFallingTrig_0_31(exti_line); | ||||
|         } | ||||
| 
 | ||||
|         // Prepare alternative part if any
 | ||||
|         if(mode == GpioModeAltFunctionPushPull || mode == GpioModeAltFunctionOpenDrain) { | ||||
|             // set alternate function
 | ||||
|             if(hal_gpio_get_pin_num(gpio) < 8) { | ||||
|                 LL_GPIO_SetAFPin_0_7(gpio->port, gpio->pin, alt_fn); | ||||
|             } else { | ||||
|                 LL_GPIO_SetAFPin_8_15(gpio->port, gpio->pin, alt_fn); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // Set not interrupt pin modes
 | ||||
|         switch(mode) { | ||||
|         case GpioModeInput: | ||||
|             LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_INPUT); | ||||
|             break; | ||||
|         case GpioModeOutputPushPull: | ||||
|             LL_GPIO_SetPinOutputType(gpio->port, gpio->pin, LL_GPIO_OUTPUT_PUSHPULL); | ||||
|             LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_OUTPUT); | ||||
|             break; | ||||
|         case GpioModeAltFunctionPushPull: | ||||
|             LL_GPIO_SetPinOutputType(gpio->port, gpio->pin, LL_GPIO_OUTPUT_PUSHPULL); | ||||
|             LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_ALTERNATE); | ||||
|             break; | ||||
|         case GpioModeOutputOpenDrain: | ||||
|             LL_GPIO_SetPinOutputType(gpio->port, gpio->pin, LL_GPIO_OUTPUT_OPENDRAIN); | ||||
|             LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_OUTPUT); | ||||
|             break; | ||||
|         case GpioModeAltFunctionOpenDrain: | ||||
|             LL_GPIO_SetPinOutputType(gpio->port, gpio->pin, LL_GPIO_OUTPUT_OPENDRAIN); | ||||
|             LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_ALTERNATE); | ||||
|             break; | ||||
|         case GpioModeAnalog: | ||||
|             LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_ANALOG); | ||||
|             break; | ||||
|         default: | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     __enable_irq(); | ||||
| } | ||||
| 
 | ||||
| void hal_gpio_add_int_callback(const GpioPin* gpio, GpioExtiCallback cb, void* ctx) { | ||||
|     assert(gpio); | ||||
|     assert(cb); | ||||
| 
 | ||||
|     __disable_irq(); | ||||
|     uint8_t pin_num = hal_gpio_get_pin_num(gpio); | ||||
|     gpio_interrupt[pin_num].callback = cb; | ||||
|     gpio_interrupt[pin_num].context = ctx; | ||||
|     gpio_interrupt[pin_num].ready = true; | ||||
|     __enable_irq(); | ||||
| } | ||||
| 
 | ||||
| void hal_gpio_enable_int_callback(const GpioPin* gpio) { | ||||
|     assert(gpio); | ||||
| 
 | ||||
|     __disable_irq(); | ||||
|     uint8_t pin_num = hal_gpio_get_pin_num(gpio); | ||||
|     if(gpio_interrupt[pin_num].callback) { | ||||
|         gpio_interrupt[pin_num].ready = true; | ||||
|     } | ||||
|     __enable_irq(); | ||||
| } | ||||
| 
 | ||||
| void hal_gpio_disable_int_callback(const GpioPin* gpio) { | ||||
|     assert(gpio); | ||||
| 
 | ||||
|     __disable_irq(); | ||||
|     uint8_t pin_num = hal_gpio_get_pin_num(gpio); | ||||
|     gpio_interrupt[pin_num].ready = false; | ||||
|     __enable_irq(); | ||||
| } | ||||
| 
 | ||||
| void hal_gpio_remove_int_callback(const GpioPin* gpio) { | ||||
|     assert(gpio); | ||||
| 
 | ||||
|     __disable_irq(); | ||||
|     uint8_t pin_num = hal_gpio_get_pin_num(gpio); | ||||
|     gpio_interrupt[pin_num].callback = NULL; | ||||
|     gpio_interrupt[pin_num].context = NULL; | ||||
|     gpio_interrupt[pin_num].ready = false; | ||||
|     __enable_irq(); | ||||
| } | ||||
| @ -1,264 +0,0 @@ | ||||
| #pragma once | ||||
| #include "main.h" | ||||
| #include "stdbool.h" | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_ll_system.h> | ||||
| #include <stm32wbxx_ll_exti.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Number of gpio on one port | ||||
|  */ | ||||
| #define GPIO_NUMBER (16U) | ||||
| 
 | ||||
| /**
 | ||||
|  * Interrupt callback prototype | ||||
|  */ | ||||
| typedef void (*GpioExtiCallback)(void* ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Gpio interrupt type | ||||
|  */ | ||||
| typedef struct { | ||||
|     GpioExtiCallback callback; | ||||
|     void* context; | ||||
|     volatile bool ready; | ||||
| } GpioInterrupt; | ||||
| 
 | ||||
| /**
 | ||||
|  * Gpio modes | ||||
|  */ | ||||
| typedef enum { | ||||
|     GpioModeInput, | ||||
|     GpioModeOutputPushPull, | ||||
|     GpioModeOutputOpenDrain, | ||||
|     GpioModeAltFunctionPushPull, | ||||
|     GpioModeAltFunctionOpenDrain, | ||||
|     GpioModeAnalog, | ||||
|     GpioModeInterruptRise, | ||||
|     GpioModeInterruptFall, | ||||
|     GpioModeInterruptRiseFall, | ||||
|     GpioModeEventRise, | ||||
|     GpioModeEventFall, | ||||
|     GpioModeEventRiseFall, | ||||
| } GpioMode; | ||||
| 
 | ||||
| /**
 | ||||
|  * Gpio pull modes | ||||
|  */ | ||||
| typedef enum { | ||||
|     GpioPullNo, | ||||
|     GpioPullUp, | ||||
|     GpioPullDown, | ||||
| } GpioPull; | ||||
| 
 | ||||
| /**
 | ||||
|  * Gpio speed modes | ||||
|  */ | ||||
| typedef enum { | ||||
|     GpioSpeedLow, | ||||
|     GpioSpeedMedium, | ||||
|     GpioSpeedHigh, | ||||
|     GpioSpeedVeryHigh, | ||||
| } GpioSpeed; | ||||
| 
 | ||||
| /**
 | ||||
|  * Gpio alternate functions | ||||
|  */ | ||||
| typedef enum { | ||||
|     GpioAltFn0MCO = 0, /*!< MCO Alternate Function mapping */ | ||||
|     GpioAltFn0LSCO = 0, /*!< LSCO Alternate Function mapping */ | ||||
|     GpioAltFn0JTMS_SWDIO = 0, /*!< JTMS-SWDIO Alternate Function mapping */ | ||||
|     GpioAltFn0JTCK_SWCLK = 0, /*!< JTCK-SWCLK Alternate Function mapping */ | ||||
|     GpioAltFn0JTDI = 0, /*!< JTDI Alternate Function mapping */ | ||||
|     GpioAltFn0RTC_OUT = 0, /*!< RCT_OUT Alternate Function mapping */ | ||||
|     GpioAltFn0JTD_TRACE = 0, /*!< JTDO-TRACESWO Alternate Function mapping */ | ||||
|     GpioAltFn0NJTRST = 0, /*!< NJTRST Alternate Function mapping */ | ||||
|     GpioAltFn0RTC_REFIN = 0, /*!< RTC_REFIN Alternate Function mapping */ | ||||
|     GpioAltFn0TRACED0 = 0, /*!< TRACED0 Alternate Function mapping */ | ||||
|     GpioAltFn0TRACED1 = 0, /*!< TRACED1 Alternate Function mapping */ | ||||
|     GpioAltFn0TRACED2 = 0, /*!< TRACED2 Alternate Function mapping */ | ||||
|     GpioAltFn0TRACED3 = 0, /*!< TRACED3 Alternate Function mapping */ | ||||
|     GpioAltFn0TRIG_INOUT = 0, /*!< TRIG_INOUT Alternate Function mapping */ | ||||
|     GpioAltFn0TRACECK = 0, /*!< TRACECK Alternate Function mapping */ | ||||
|     GpioAltFn0SYS = 0, /*!< System Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn1TIM1 = 1, /*!< TIM1 Alternate Function mapping */ | ||||
|     GpioAltFn1TIM2 = 1, /*!< TIM2 Alternate Function mapping */ | ||||
|     GpioAltFn1LPTIM1 = 1, /*!< LPTIM1 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn2TIM2 = 2, /*!< TIM2 Alternate Function mapping */ | ||||
|     GpioAltFn2TIM1 = 2, /*!< TIM1 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn3SAI1 = 3, /*!< SAI1_CK1 Alternate Function mapping */ | ||||
|     GpioAltFn3SPI2 = 3, /*!< SPI2 Alternate Function mapping */ | ||||
|     GpioAltFn3TIM1 = 3, /*!< TIM1 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn4I2C1 = 4, /*!< I2C1 Alternate Function mapping */ | ||||
|     GpioAltFn4I2C3 = 4, /*!< I2C3 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn5SPI1 = 5, /*!< SPI1 Alternate Function mapping */ | ||||
|     GpioAltFn5SPI2 = 5, /*!< SPI2 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn6MCO = 6, /*!< MCO Alternate Function mapping */ | ||||
|     GpioAltFn6LSCO = 6, /*!< LSCO Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB0 = 6, /*!< RF_DTB0 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB1 = 6, /*!< RF_DTB1 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB2 = 6, /*!< RF_DTB2 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB3 = 6, /*!< RF_DTB3 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB4 = 6, /*!< RF_DTB4 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB5 = 6, /*!< RF_DTB5 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB6 = 6, /*!< RF_DTB6 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB7 = 6, /*!< RF_DTB7 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB8 = 6, /*!< RF_DTB8 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB9 = 6, /*!< RF_DTB9 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB10 = 6, /*!< RF_DTB10 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB11 = 6, /*!< RF_DTB11 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB12 = 6, /*!< RF_DTB12 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB13 = 6, /*!< RF_DTB13 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB14 = 6, /*!< RF_DTB14 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB15 = 6, /*!< RF_DTB15 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB16 = 6, /*!< RF_DTB16 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB17 = 6, /*!< RF_DTB17 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_DTB18 = 6, /*!< RF_DTB18 Alternate Function mapping */ | ||||
|     GpioAltFn6RF_MISO = 6, /*!< RF_MISO Alternate Function mapping */ | ||||
|     GpioAltFn6RF_MOSI = 6, /*!< RF_MOSI Alternate Function mapping */ | ||||
|     GpioAltFn6RF_SCK = 6, /*!< RF_SCK Alternate Function mapping */ | ||||
|     GpioAltFn6RF_NSS = 6, /*!< RF_NSS Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn7USART1 = 7, /*!< USART1 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn8LPUART1 = 8, /*!< LPUART1 Alternate Function mapping */ | ||||
|     GpioAltFn8IR = 8, /*!< IR Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn9TSC = 9, /*!< TSC Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn10QUADSPI = 10, /*!< QUADSPI Alternate Function mapping */ | ||||
|     GpioAltFn10USB = 10, /*!< USB Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn11LCD = 11, /*!< LCD Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn12COMP1 = 12, /*!< COMP1 Alternate Function mapping */ | ||||
|     GpioAltFn12COMP2 = 12, /*!< COMP2 Alternate Function mapping */ | ||||
|     GpioAltFn12TIM1 = 12, /*!< TIM1 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn13SAI1 = 13, /*!< SAI1 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn14TIM2 = 14, /*!< TIM2 Alternate Function mapping */ | ||||
|     GpioAltFn14TIM16 = 14, /*!< TIM16 Alternate Function mapping */ | ||||
|     GpioAltFn14TIM17 = 14, /*!< TIM17 Alternate Function mapping */ | ||||
|     GpioAltFn14LPTIM2 = 14, /*!< LPTIM2 Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFn15EVENTOUT = 15, /*!< EVENTOUT Alternate Function mapping */ | ||||
| 
 | ||||
|     GpioAltFnUnused = 16, /*!< just dummy value */ | ||||
| } GpioAltFn; | ||||
| 
 | ||||
| /**
 | ||||
|  * Gpio structure | ||||
|  */ | ||||
| typedef struct { | ||||
|     GPIO_TypeDef* port; | ||||
|     uint16_t pin; | ||||
| } GpioPin; | ||||
| 
 | ||||
| /**
 | ||||
|  * GPIO initialization function, simple version | ||||
|  * @param gpio  GpioPin | ||||
|  * @param mode  GpioMode | ||||
|  */ | ||||
| void hal_gpio_init_simple(const GpioPin* gpio, const GpioMode mode); | ||||
| 
 | ||||
| /**
 | ||||
|  * GPIO initialization function, normal version | ||||
|  * @param gpio  GpioPin | ||||
|  * @param mode  GpioMode | ||||
|  * @param pull  GpioPull | ||||
|  * @param speed GpioSpeed | ||||
|  */ | ||||
| void hal_gpio_init( | ||||
|     const GpioPin* gpio, | ||||
|     const GpioMode mode, | ||||
|     const GpioPull pull, | ||||
|     const GpioSpeed speed); | ||||
| 
 | ||||
| /**
 | ||||
|  * GPIO initialization function, extended version | ||||
|  * @param gpio  GpioPin | ||||
|  * @param mode  GpioMode | ||||
|  * @param pull  GpioPull | ||||
|  * @param speed GpioSpeed | ||||
|  * @param alt_fn GpioAltFn | ||||
|  */ | ||||
| void hal_gpio_init_ex( | ||||
|     const GpioPin* gpio, | ||||
|     const GpioMode mode, | ||||
|     const GpioPull pull, | ||||
|     const GpioSpeed speed, | ||||
|     const GpioAltFn alt_fn); | ||||
| 
 | ||||
| /**
 | ||||
|  * Add and enable interrupt | ||||
|  * @param gpio GpioPin | ||||
|  * @param cb   GpioExtiCallback | ||||
|  * @param ctx  context for callback | ||||
|  */ | ||||
| void hal_gpio_add_int_callback(const GpioPin* gpio, GpioExtiCallback cb, void* ctx); | ||||
| 
 | ||||
| /**
 | ||||
|  * Enable interrupt | ||||
|  * @param gpio GpioPin | ||||
|  */ | ||||
| void hal_gpio_enable_int_callback(const GpioPin* gpio); | ||||
| 
 | ||||
| /**
 | ||||
|  * Disable interrupt | ||||
|  * @param gpio GpioPin | ||||
|  */ | ||||
| void hal_gpio_disable_int_callback(const GpioPin* gpio); | ||||
| 
 | ||||
| /**
 | ||||
|  * Remove interrupt | ||||
|  * @param gpio GpioPin | ||||
|  */ | ||||
| void hal_gpio_remove_int_callback(const GpioPin* gpio); | ||||
| 
 | ||||
| /**
 | ||||
|  * GPIO write pin | ||||
|  * @param gpio  GpioPin | ||||
|  * @param state true / false | ||||
|  */ | ||||
| static inline void hal_gpio_write(const GpioPin* gpio, const bool state) { | ||||
|     // writing to BSSR is an atomic operation
 | ||||
|     if(state == true) { | ||||
|         gpio->port->BSRR = gpio->pin; | ||||
|     } else { | ||||
|         gpio->port->BSRR = (uint32_t)gpio->pin << GPIO_NUMBER; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * GPIO read pin | ||||
|  * @param gpio GpioPin | ||||
|  * @return true / false | ||||
|  */ | ||||
| static inline bool hal_gpio_read(const GpioPin* gpio) { | ||||
|     if((gpio->port->IDR & gpio->pin) != 0x00U) { | ||||
|         return true; | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Get RFID IN level | ||||
|  * @return false = LOW, true = HIGH | ||||
|  */ | ||||
| bool hal_gpio_get_rfid_in_level(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,205 +0,0 @@ | ||||
| #include <furi_hal_i2c.h> | ||||
| #include <furi_hal_version.h> | ||||
| 
 | ||||
| #include <stm32wbxx_ll_i2c.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_ll_cortex.h> | ||||
| 
 | ||||
| #include <assert.h> | ||||
| 
 | ||||
| void furi_hal_i2c_init() { | ||||
|     furi_hal_i2c_bus_power.callback(&furi_hal_i2c_bus_power, FuriHalI2cBusEventInit); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_i2c_acquire(FuriHalI2cBusHandle* handle) { | ||||
|     handle->bus->callback(handle->bus, FuriHalI2cBusEventLock); | ||||
| 
 | ||||
|     assert(handle->bus->current_handle == NULL); | ||||
| 
 | ||||
|     handle->bus->current_handle = handle; | ||||
| 
 | ||||
|     handle->bus->callback(handle->bus, FuriHalI2cBusEventActivate); | ||||
| 
 | ||||
|     handle->callback(handle, FuriHalI2cBusHandleEventActivate); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_i2c_release(FuriHalI2cBusHandle* handle) { | ||||
|     assert(handle->bus->current_handle == handle); | ||||
| 
 | ||||
|     handle->callback(handle, FuriHalI2cBusHandleEventDeactivate); | ||||
| 
 | ||||
|     handle->bus->callback(handle->bus, FuriHalI2cBusEventDeactivate); | ||||
| 
 | ||||
|     handle->bus->current_handle = NULL; | ||||
| 
 | ||||
|     handle->bus->callback(handle->bus, FuriHalI2cBusEventUnlock); | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_tx( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t address, | ||||
|     const uint8_t* data, | ||||
|     uint8_t size, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle->bus->current_handle == handle); | ||||
|     uint32_t time_left = timeout; | ||||
|     bool ret = true; | ||||
| 
 | ||||
|     while(LL_I2C_IsActiveFlag_BUSY(handle->bus->i2c)) | ||||
|         ; | ||||
| 
 | ||||
|     LL_I2C_HandleTransfer( | ||||
|         handle->bus->i2c, | ||||
|         address, | ||||
|         LL_I2C_ADDRSLAVE_7BIT, | ||||
|         size, | ||||
|         LL_I2C_MODE_AUTOEND, | ||||
|         LL_I2C_GENERATE_START_WRITE); | ||||
| 
 | ||||
|     while(!LL_I2C_IsActiveFlag_STOP(handle->bus->i2c) || size > 0) { | ||||
|         if(LL_I2C_IsActiveFlag_TXIS(handle->bus->i2c)) { | ||||
|             LL_I2C_TransmitData8(handle->bus->i2c, (*data)); | ||||
|             data++; | ||||
|             size--; | ||||
|             time_left = timeout; | ||||
|         } | ||||
| 
 | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             if(--time_left == 0) { | ||||
|                 ret = false; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     LL_I2C_ClearFlag_STOP(handle->bus->i2c); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_rx( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t address, | ||||
|     uint8_t* data, | ||||
|     uint8_t size, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle->bus->current_handle == handle); | ||||
|     uint32_t time_left = timeout; | ||||
|     bool ret = true; | ||||
| 
 | ||||
|     while(LL_I2C_IsActiveFlag_BUSY(handle->bus->i2c)) | ||||
|         ; | ||||
| 
 | ||||
|     LL_I2C_HandleTransfer( | ||||
|         handle->bus->i2c, | ||||
|         address, | ||||
|         LL_I2C_ADDRSLAVE_7BIT, | ||||
|         size, | ||||
|         LL_I2C_MODE_AUTOEND, | ||||
|         LL_I2C_GENERATE_START_READ); | ||||
| 
 | ||||
|     while(!LL_I2C_IsActiveFlag_STOP(handle->bus->i2c) || size > 0) { | ||||
|         if(LL_I2C_IsActiveFlag_RXNE(handle->bus->i2c)) { | ||||
|             *data = LL_I2C_ReceiveData8(handle->bus->i2c); | ||||
|             data++; | ||||
|             size--; | ||||
|             time_left = timeout; | ||||
|         } | ||||
| 
 | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             if(--time_left == 0) { | ||||
|                 ret = false; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     LL_I2C_ClearFlag_STOP(handle->bus->i2c); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_trx( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t address, | ||||
|     const uint8_t* tx_data, | ||||
|     uint8_t tx_size, | ||||
|     uint8_t* rx_data, | ||||
|     uint8_t rx_size, | ||||
|     uint32_t timeout) { | ||||
|     if(furi_hal_i2c_tx(handle, address, tx_data, tx_size, timeout) && | ||||
|        furi_hal_i2c_rx(handle, address, rx_data, rx_size, timeout)) { | ||||
|         return true; | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_read_reg_8( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint8_t* data, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
| 
 | ||||
|     return furi_hal_i2c_trx(handle, i2c_addr, ®_addr, 1, data, 1, timeout); | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_read_reg_16( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint16_t* data, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
| 
 | ||||
|     uint8_t reg_data[2]; | ||||
|     bool ret = furi_hal_i2c_trx(handle, i2c_addr, ®_addr, 1, reg_data, 2, timeout); | ||||
|     *data = (reg_data[0] << 8) | (reg_data[1]); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_read_mem( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t mem_addr, | ||||
|     uint8_t* data, | ||||
|     uint8_t len, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
| 
 | ||||
|     return furi_hal_i2c_trx(handle, i2c_addr, &mem_addr, 1, data, len, timeout); | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_write_reg_8( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint8_t data, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
| 
 | ||||
|     uint8_t tx_data[2]; | ||||
|     tx_data[0] = reg_addr; | ||||
|     tx_data[1] = data; | ||||
| 
 | ||||
|     return furi_hal_i2c_tx(handle, i2c_addr, (const uint8_t*)&tx_data, 2, timeout); | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_i2c_write_reg_16( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint16_t data, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
| 
 | ||||
|     uint8_t tx_data[3]; | ||||
|     tx_data[0] = reg_addr; | ||||
|     tx_data[1] = (data >> 8) & 0xFF; | ||||
|     tx_data[2] = data & 0xFF; | ||||
| 
 | ||||
|     return furi_hal_i2c_tx(handle, i2c_addr, (const uint8_t*)&tx_data, 3, timeout); | ||||
| } | ||||
| @ -1,195 +0,0 @@ | ||||
| /**
 | ||||
|  * @file furi_hal_i2c.h | ||||
|  * I2C HAL API | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <furi_hal_i2c_config.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /** Init I2C
 | ||||
|  */ | ||||
| void furi_hal_i2c_init(); | ||||
| 
 | ||||
| /** Acquire i2c bus handle
 | ||||
|  * | ||||
|  * @return     Instance of FuriHalI2cBus | ||||
|  */ | ||||
| void furi_hal_i2c_acquire(FuriHalI2cBusHandle* handle); | ||||
| 
 | ||||
| /** Release i2c bus handle
 | ||||
|  * | ||||
|  * @param      bus   instance of FuriHalI2cBus aquired in `furi_hal_i2c_acquire` | ||||
|  */ | ||||
| void furi_hal_i2c_release(FuriHalI2cBusHandle* handle); | ||||
| 
 | ||||
| /** Perform I2C tx transfer
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      address  I2C slave address | ||||
|  * @param      data     pointer to data buffer | ||||
|  * @param      size     size of data buffer | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_tx( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     const uint8_t address, | ||||
|     const uint8_t* data, | ||||
|     const uint8_t size, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C rx transfer
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      address  I2C slave address | ||||
|  * @param      data     pointer to data buffer | ||||
|  * @param      size     size of data buffer | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_rx( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     const uint8_t address, | ||||
|     uint8_t* data, | ||||
|     const uint8_t size, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C tx and rx transfers
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      address  I2C slave address | ||||
|  * @param      tx_data  pointer to tx data buffer | ||||
|  * @param      tx_size  size of tx data buffer | ||||
|  * @param      rx_data  pointer to rx data buffer | ||||
|  * @param      rx_size  size of rx data buffer | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_trx( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     const uint8_t address, | ||||
|     const uint8_t* tx_data, | ||||
|     const uint8_t tx_size, | ||||
|     uint8_t* rx_data, | ||||
|     const uint8_t rx_size, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C device register read (8-bit)
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      i2c_addr I2C slave address | ||||
|  * @param      reg_addr register address | ||||
|  * @param      data     pointer to register value | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_read_reg_8( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint8_t* data, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C device register read (16-bit)
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      i2c_addr I2C slave address | ||||
|  * @param      reg_addr register address | ||||
|  * @param      data     pointer to register value | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_read_reg_16( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint16_t* data, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C device memory read
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      i2c_addr I2C slave address | ||||
|  * @param      mem_addr memory start address | ||||
|  * @param      data     pointer to data buffer | ||||
|  * @param      len      size of data buffer | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_read_mem( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t mem_addr, | ||||
|     uint8_t* data, | ||||
|     uint8_t len, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C device register write (8-bit)
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      i2c_addr I2C slave address | ||||
|  * @param      reg_addr register address | ||||
|  * @param      data     register value | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_write_reg_8( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint8_t data, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C device register write (16-bit)
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      i2c_addr I2C slave address | ||||
|  * @param      reg_addr register address | ||||
|  * @param      data     register value | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_write_reg_16( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t reg_addr, | ||||
|     uint16_t data, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| /** Perform I2C device memory
 | ||||
|  * | ||||
|  * @param      handle   pointer to FuriHalI2cBusHandle instance | ||||
|  * @param      i2c_addr I2C slave address | ||||
|  * @param      mem_addr memory start address | ||||
|  * @param      data     pointer to data buffer | ||||
|  * @param      len      size of data buffer | ||||
|  * @param      timeout  timeout in ticks | ||||
|  * | ||||
|  * @return     true on successful transfer, false otherwise | ||||
|  */ | ||||
| bool furi_hal_i2c_write_mem( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     uint8_t i2c_addr, | ||||
|     uint8_t mem_addr, | ||||
|     uint8_t* data, | ||||
|     uint8_t len, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,149 +0,0 @@ | ||||
| #include "furi_hal_i2c_config.h" | ||||
| #include <furi_hal_resources.h> | ||||
| #include <furi_hal_version.h> | ||||
| 
 | ||||
| #include <stm32wbxx_ll_rcc.h> | ||||
| #include <stm32wbxx_ll_bus.h> | ||||
| 
 | ||||
| /** Timing register value is computed with the STM32CubeMX Tool,
 | ||||
|   * Standard Mode @100kHz with I2CCLK = 64 MHz, | ||||
|   * rise time = 0ns, fall time = 0ns | ||||
|   */ | ||||
| #define FURI_HAL_I2C_CONFIG_POWER_I2C_TIMINGS_100 0x10707DBC | ||||
| 
 | ||||
| /** Timing register value is computed with the STM32CubeMX Tool,
 | ||||
|   * Fast Mode @400kHz with I2CCLK = 64 MHz, | ||||
|   * rise time = 0ns, fall time = 0ns | ||||
|   */ | ||||
| #define FURI_HAL_I2C_CONFIG_POWER_I2C_TIMINGS_400 0x00602173 | ||||
| 
 | ||||
| static void furi_hal_i2c_bus_power_event(FuriHalI2cBus* bus, FuriHalI2cBusEvent event) { | ||||
|     if(event == FuriHalI2cBusEventInit) { | ||||
|         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); | ||||
|         LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); | ||||
|         LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C1); | ||||
|         bus->current_handle = NULL; | ||||
|     } else if(event == FuriHalI2cBusEventDeinit) { | ||||
|     } else if(event == FuriHalI2cBusEventLock) { | ||||
|     } else if(event == FuriHalI2cBusEventUnlock) { | ||||
|     } else if(event == FuriHalI2cBusEventActivate) { | ||||
|         LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C1); | ||||
|     } else if(event == FuriHalI2cBusEventDeactivate) { | ||||
|         LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| FuriHalI2cBus furi_hal_i2c_bus_power = { | ||||
|     .i2c = I2C1, | ||||
|     .current_handle = NULL, | ||||
|     .callback = furi_hal_i2c_bus_power_event, | ||||
| }; | ||||
| 
 | ||||
| static void furi_hal_i2c_bus_external_event(FuriHalI2cBus* bus, FuriHalI2cBusEvent event) { | ||||
|     if(event == FuriHalI2cBusEventActivate) { | ||||
|         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C3); | ||||
|         LL_RCC_SetI2CClockSource(LL_RCC_I2C3_CLKSOURCE_PCLK1); | ||||
|         LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C3); | ||||
|     } else if(event == FuriHalI2cBusEventDeactivate) { | ||||
|         LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C3); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| FuriHalI2cBus furi_hal_i2c_bus_external = { | ||||
|     .i2c = I2C3, | ||||
|     .current_handle = NULL, | ||||
|     .callback = furi_hal_i2c_bus_external_event, | ||||
| }; | ||||
| 
 | ||||
| void furi_hal_i2c_bus_handle_power_event( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     FuriHalI2cBusHandleEvent event) { | ||||
|     if(event == FuriHalI2cBusHandleEventActivate) { | ||||
|         LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); | ||||
|         hal_gpio_init_ex( | ||||
|             &gpio_i2c_power_sda, | ||||
|             GpioModeAltFunctionOpenDrain, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedLow, | ||||
|             GpioAltFn4I2C1); | ||||
|         hal_gpio_init_ex( | ||||
|             &gpio_i2c_power_scl, | ||||
|             GpioModeAltFunctionOpenDrain, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedLow, | ||||
|             GpioAltFn4I2C1); | ||||
| 
 | ||||
|         LL_I2C_InitTypeDef I2C_InitStruct = {0}; | ||||
|         I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; | ||||
|         I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; | ||||
|         I2C_InitStruct.DigitalFilter = 0; | ||||
|         I2C_InitStruct.OwnAddress1 = 0; | ||||
|         I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; | ||||
|         I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; | ||||
|         if(furi_hal_version_get_hw_version() > 10) { | ||||
|             I2C_InitStruct.Timing = FURI_HAL_I2C_CONFIG_POWER_I2C_TIMINGS_400; | ||||
|         } else { | ||||
|             I2C_InitStruct.Timing = FURI_HAL_I2C_CONFIG_POWER_I2C_TIMINGS_100; | ||||
|         } | ||||
|         LL_I2C_Init(handle->bus->i2c, &I2C_InitStruct); | ||||
| 
 | ||||
|         LL_I2C_EnableAutoEndMode(handle->bus->i2c); | ||||
|         LL_I2C_SetOwnAddress2(handle->bus->i2c, 0, LL_I2C_OWNADDRESS2_NOMASK); | ||||
|         LL_I2C_DisableOwnAddress2(handle->bus->i2c); | ||||
|         LL_I2C_DisableGeneralCall(handle->bus->i2c); | ||||
|         LL_I2C_EnableClockStretching(handle->bus->i2c); | ||||
|         LL_I2C_Enable(handle->bus->i2c); | ||||
|     } else if(event == FuriHalI2cBusHandleEventDeactivate) { | ||||
|         LL_I2C_Disable(handle->bus->i2c); | ||||
|         hal_gpio_write(&gpio_i2c_power_sda, 1); | ||||
|         hal_gpio_write(&gpio_i2c_power_scl, 1); | ||||
|         hal_gpio_init_ex( | ||||
|             &gpio_i2c_power_sda, GpioModeAnalog, GpioPullNo, GpioSpeedLow, GpioAltFnUnused); | ||||
|         hal_gpio_init_ex( | ||||
|             &gpio_i2c_power_scl, GpioModeAnalog, GpioPullNo, GpioSpeedLow, GpioAltFnUnused); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| FuriHalI2cBusHandle furi_hal_i2c_handle_power = { | ||||
|     .bus = &furi_hal_i2c_bus_power, | ||||
|     .callback = furi_hal_i2c_bus_handle_power_event, | ||||
| }; | ||||
| 
 | ||||
| void furi_hal_i2c_bus_handle_external_event( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     FuriHalI2cBusHandleEvent event) { | ||||
|     if(event == FuriHalI2cBusHandleEventActivate) { | ||||
|         hal_gpio_init_ex( | ||||
|             &gpio_ext_pc0, GpioModeAltFunctionOpenDrain, GpioPullNo, GpioSpeedLow, GpioAltFn4I2C3); | ||||
|         hal_gpio_init_ex( | ||||
|             &gpio_ext_pc1, GpioModeAltFunctionOpenDrain, GpioPullNo, GpioSpeedLow, GpioAltFn4I2C3); | ||||
| 
 | ||||
|         LL_I2C_InitTypeDef I2C_InitStruct = {0}; | ||||
|         I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; | ||||
|         I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; | ||||
|         I2C_InitStruct.DigitalFilter = 0; | ||||
|         I2C_InitStruct.OwnAddress1 = 0; | ||||
|         I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; | ||||
|         I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; | ||||
|         I2C_InitStruct.Timing = FURI_HAL_I2C_CONFIG_POWER_I2C_TIMINGS_100; | ||||
|         LL_I2C_Init(handle->bus->i2c, &I2C_InitStruct); | ||||
| 
 | ||||
|         LL_I2C_EnableAutoEndMode(handle->bus->i2c); | ||||
|         LL_I2C_SetOwnAddress2(handle->bus->i2c, 0, LL_I2C_OWNADDRESS2_NOMASK); | ||||
|         LL_I2C_DisableOwnAddress2(handle->bus->i2c); | ||||
|         LL_I2C_DisableGeneralCall(handle->bus->i2c); | ||||
|         LL_I2C_EnableClockStretching(handle->bus->i2c); | ||||
|         LL_I2C_Enable(handle->bus->i2c); | ||||
|     } else if(event == FuriHalI2cBusHandleEventDeactivate) { | ||||
|         LL_I2C_Disable(handle->bus->i2c); | ||||
|         hal_gpio_write(&gpio_ext_pc0, 1); | ||||
|         hal_gpio_write(&gpio_ext_pc1, 1); | ||||
|         hal_gpio_init_ex(&gpio_ext_pc0, GpioModeAnalog, GpioPullNo, GpioSpeedLow, GpioAltFnUnused); | ||||
|         hal_gpio_init_ex(&gpio_ext_pc1, GpioModeAnalog, GpioPullNo, GpioSpeedLow, GpioAltFnUnused); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| FuriHalI2cBusHandle furi_hal_i2c_handle_external = { | ||||
|     .bus = &furi_hal_i2c_bus_external, | ||||
|     .callback = furi_hal_i2c_bus_handle_external_event, | ||||
| }; | ||||
| @ -1,31 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <furi_hal_i2c_types.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /** Internal(power) i2c bus, I2C1, under reset when not used */ | ||||
| extern FuriHalI2cBus furi_hal_i2c_bus_power; | ||||
| 
 | ||||
| /** External i2c bus, I2C3, under reset when not used */ | ||||
| extern FuriHalI2cBus furi_hal_i2c_bus_external; | ||||
| 
 | ||||
| /** Handle for internal(power) i2c bus
 | ||||
|  * Bus: furi_hal_i2c_bus_external | ||||
|  * Pins: PA9(SCL) / PA10(SDA), float on release | ||||
|  * Params: 400khz | ||||
|  */ | ||||
| extern FuriHalI2cBusHandle furi_hal_i2c_handle_power; | ||||
| 
 | ||||
| /** Handle for external i2c bus
 | ||||
|  * Bus: furi_hal_i2c_bus_external | ||||
|  * Pins: PC0(SCL) / PC1(SDA), float on release | ||||
|  * Params: 100khz | ||||
|  */ | ||||
| extern FuriHalI2cBusHandle furi_hal_i2c_handle_external; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,51 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stm32wbxx_ll_i2c.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef struct FuriHalI2cBus FuriHalI2cBus; | ||||
| typedef struct FuriHalI2cBusHandle FuriHalI2cBusHandle; | ||||
| 
 | ||||
| /** FuriHal i2c bus states */ | ||||
| typedef enum { | ||||
|     FuriHalI2cBusEventInit, /**< Bus initialization event, called on system start */ | ||||
|     FuriHalI2cBusEventDeinit, /**< Bus deinitialization event, called on system stop */ | ||||
|     FuriHalI2cBusEventLock, /**< Bus lock event, called before activation */ | ||||
|     FuriHalI2cBusEventUnlock, /**< Bus unlock event, called after deactivation */ | ||||
|     FuriHalI2cBusEventActivate, /**< Bus activation event, called before handle activation */ | ||||
|     FuriHalI2cBusEventDeactivate, /**< Bus deactivation event, called after handle deactivation  */ | ||||
| } FuriHalI2cBusEvent; | ||||
| 
 | ||||
| /** FuriHal i2c bus event callback */ | ||||
| typedef void (*FuriHalI2cBusEventCallback)(FuriHalI2cBus* bus, FuriHalI2cBusEvent event); | ||||
| 
 | ||||
| /** FuriHal i2c bus */ | ||||
| struct FuriHalI2cBus { | ||||
|     I2C_TypeDef* i2c; | ||||
|     FuriHalI2cBusHandle* current_handle; | ||||
|     FuriHalI2cBusEventCallback callback; | ||||
| }; | ||||
| 
 | ||||
| /** FuriHal i2c handle states */ | ||||
| typedef enum { | ||||
|     FuriHalI2cBusHandleEventActivate, /**< Handle activate: connect gpio and apply bus config */ | ||||
|     FuriHalI2cBusHandleEventDeactivate, /**< Handle deactivate: disconnect gpio and reset bus config */ | ||||
| } FuriHalI2cBusHandleEvent; | ||||
| 
 | ||||
| /** FuriHal i2c handle event callback */ | ||||
| typedef void (*FuriHalI2cBusHandleEventCallback)( | ||||
|     FuriHalI2cBusHandle* handle, | ||||
|     FuriHalI2cBusHandleEvent event); | ||||
| 
 | ||||
| /** FuriHal i2c handle */ | ||||
| struct FuriHalI2cBusHandle { | ||||
|     FuriHalI2cBus* bus; | ||||
|     FuriHalI2cBusHandleEventCallback callback; | ||||
| }; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,49 +0,0 @@ | ||||
| #include <furi_hal_light.h> | ||||
| #include <lp5562.h> | ||||
| 
 | ||||
| #define LED_CURRENT_RED 50 | ||||
| #define LED_CURRENT_GREEN 50 | ||||
| #define LED_CURRENT_BLUE 50 | ||||
| #define LED_CURRENT_WHITE 150 | ||||
| 
 | ||||
| void furi_hal_light_init() { | ||||
|     furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); | ||||
| 
 | ||||
|     lp5562_reset(&furi_hal_i2c_handle_power); | ||||
| 
 | ||||
|     lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelRed, LED_CURRENT_RED); | ||||
|     lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelGreen, LED_CURRENT_GREEN); | ||||
|     lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelBlue, LED_CURRENT_BLUE); | ||||
|     lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelWhite, LED_CURRENT_WHITE); | ||||
| 
 | ||||
|     lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelRed, 0x00); | ||||
|     lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelGreen, 0x00); | ||||
|     lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelBlue, 0x00); | ||||
|     lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelWhite, 0x00); | ||||
| 
 | ||||
|     lp5562_enable(&furi_hal_i2c_handle_power); | ||||
|     lp5562_configure(&furi_hal_i2c_handle_power); | ||||
| 
 | ||||
|     furi_hal_i2c_release(&furi_hal_i2c_handle_power); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_light_set(Light light, uint8_t value) { | ||||
|     furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); | ||||
|     switch(light) { | ||||
|     case LightRed: | ||||
|         lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelRed, value); | ||||
|         break; | ||||
|     case LightGreen: | ||||
|         lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelGreen, value); | ||||
|         break; | ||||
|     case LightBlue: | ||||
|         lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelBlue, value); | ||||
|         break; | ||||
|     case LightBacklight: | ||||
|         lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelWhite, value); | ||||
|         break; | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
|     furi_hal_i2c_release(&furi_hal_i2c_handle_power); | ||||
| } | ||||
| @ -1,17 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <furi_hal_resources.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| void furi_hal_light_init(); | ||||
| 
 | ||||
| void furi_hal_light_set(Light light, uint8_t value); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,44 +0,0 @@ | ||||
| #include "furi_hal_resources.h" | ||||
| #include "main.h" | ||||
| 
 | ||||
| const GpioPin vibro_gpio = {.port = VIBRO_GPIO_Port, .pin = VIBRO_Pin}; | ||||
| const GpioPin ibutton_gpio = {.port = iBTN_GPIO_Port, .pin = iBTN_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_cc1101_g0 = {.port = CC1101_G0_GPIO_Port, .pin = CC1101_G0_Pin}; | ||||
| const GpioPin gpio_rf_sw_0 = {.port = RF_SW_0_GPIO_Port, .pin = RF_SW_0_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_subghz_cs = {.port = CC1101_CS_GPIO_Port, .pin = CC1101_CS_Pin}; | ||||
| const GpioPin gpio_display_cs = {.port = DISPLAY_CS_GPIO_Port, .pin = DISPLAY_CS_Pin}; | ||||
| const GpioPin gpio_display_rst = {.port = DISPLAY_RST_GPIO_Port, .pin = DISPLAY_RST_Pin}; | ||||
| const GpioPin gpio_display_di = {.port = DISPLAY_DI_GPIO_Port, .pin = DISPLAY_DI_Pin}; | ||||
| const GpioPin gpio_sdcard_cs = {.port = SD_CS_GPIO_Port, .pin = SD_CS_Pin}; | ||||
| const GpioPin gpio_nfc_cs = {.port = NFC_CS_GPIO_Port, .pin = NFC_CS_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_spi_d_miso = {.port = SPI_D_MISO_GPIO_Port, .pin = SPI_D_MISO_Pin}; | ||||
| const GpioPin gpio_spi_d_mosi = {.port = SPI_D_MOSI_GPIO_Port, .pin = SPI_D_MOSI_Pin}; | ||||
| const GpioPin gpio_spi_d_sck = {.port = SPI_D_SCK_GPIO_Port, .pin = SPI_D_SCK_Pin}; | ||||
| const GpioPin gpio_spi_r_miso = {.port = SPI_R_MISO_GPIO_Port, .pin = SPI_R_MISO_Pin}; | ||||
| const GpioPin gpio_spi_r_mosi = {.port = SPI_R_MOSI_GPIO_Port, .pin = SPI_R_MOSI_Pin}; | ||||
| const GpioPin gpio_spi_r_sck = {.port = SPI_R_SCK_GPIO_Port, .pin = SPI_R_SCK_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_ext_pc0 = {.port = GPIOC, .pin = LL_GPIO_PIN_0}; | ||||
| const GpioPin gpio_ext_pc1 = {.port = GPIOC, .pin = LL_GPIO_PIN_1}; | ||||
| const GpioPin gpio_ext_pc3 = {.port = GPIOC, .pin = LL_GPIO_PIN_3}; | ||||
| const GpioPin gpio_ext_pb2 = {.port = GPIOB, .pin = LL_GPIO_PIN_2}; | ||||
| const GpioPin gpio_ext_pb3 = {.port = GPIOB, .pin = LL_GPIO_PIN_3}; | ||||
| const GpioPin gpio_ext_pa4 = {.port = GPIOA, .pin = LL_GPIO_PIN_4}; | ||||
| const GpioPin gpio_ext_pa6 = {.port = GPIOA, .pin = LL_GPIO_PIN_6}; | ||||
| const GpioPin gpio_ext_pa7 = {.port = GPIOA, .pin = LL_GPIO_PIN_7}; | ||||
| 
 | ||||
| const GpioPin gpio_rfid_pull = {.port = RFID_PULL_GPIO_Port, .pin = RFID_PULL_Pin}; | ||||
| const GpioPin gpio_rfid_carrier_out = {.port = RFID_OUT_GPIO_Port, .pin = RFID_OUT_Pin}; | ||||
| const GpioPin gpio_rfid_data_in = {.port = RFID_RF_IN_GPIO_Port, .pin = RFID_RF_IN_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_infrared_rx = {.port = IR_RX_GPIO_Port, .pin = IR_RX_Pin}; | ||||
| const GpioPin gpio_infrared_tx = {.port = IR_TX_GPIO_Port, .pin = IR_TX_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_usart_tx = {.port = USART1_TX_Port, .pin = USART1_TX_Pin}; | ||||
| const GpioPin gpio_usart_rx = {.port = USART1_RX_Port, .pin = USART1_RX_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_i2c_power_sda = {.port = GPIOA, .pin = LL_GPIO_PIN_10}; | ||||
| const GpioPin gpio_i2c_power_scl = {.port = GPIOA, .pin = LL_GPIO_PIN_9}; | ||||
| @ -1,73 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <furi_hal_gpio.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Input Keys */ | ||||
| typedef enum { | ||||
|     InputKeyUp, | ||||
|     InputKeyDown, | ||||
|     InputKeyRight, | ||||
|     InputKeyLeft, | ||||
|     InputKeyOk, | ||||
|     InputKeyBack, | ||||
| } InputKey; | ||||
| 
 | ||||
| /* Light */ | ||||
| typedef enum { | ||||
|     LightRed, | ||||
|     LightGreen, | ||||
|     LightBlue, | ||||
|     LightBacklight, | ||||
| } Light; | ||||
| 
 | ||||
| extern const GpioPin vibro_gpio; | ||||
| extern const GpioPin ibutton_gpio; | ||||
| 
 | ||||
| extern const GpioPin gpio_cc1101_g0; | ||||
| extern const GpioPin gpio_rf_sw_0; | ||||
| 
 | ||||
| extern const GpioPin gpio_subghz_cs; | ||||
| extern const GpioPin gpio_display_cs; | ||||
| extern const GpioPin gpio_display_rst; | ||||
| extern const GpioPin gpio_display_di; | ||||
| extern const GpioPin gpio_sdcard_cs; | ||||
| extern const GpioPin gpio_nfc_cs; | ||||
| 
 | ||||
| extern const GpioPin gpio_spi_d_miso; | ||||
| extern const GpioPin gpio_spi_d_mosi; | ||||
| extern const GpioPin gpio_spi_d_sck; | ||||
| extern const GpioPin gpio_spi_r_miso; | ||||
| extern const GpioPin gpio_spi_r_mosi; | ||||
| extern const GpioPin gpio_spi_r_sck; | ||||
| 
 | ||||
| extern const GpioPin gpio_ext_pc0; | ||||
| extern const GpioPin gpio_ext_pc1; | ||||
| extern const GpioPin gpio_ext_pc3; | ||||
| extern const GpioPin gpio_ext_pb2; | ||||
| extern const GpioPin gpio_ext_pb3; | ||||
| extern const GpioPin gpio_ext_pa4; | ||||
| extern const GpioPin gpio_ext_pa6; | ||||
| extern const GpioPin gpio_ext_pa7; | ||||
| 
 | ||||
| extern const GpioPin gpio_rfid_pull; | ||||
| extern const GpioPin gpio_rfid_carrier_out; | ||||
| extern const GpioPin gpio_rfid_data_in; | ||||
| 
 | ||||
| extern const GpioPin gpio_infrared_rx; | ||||
| extern const GpioPin gpio_infrared_tx; | ||||
| 
 | ||||
| extern const GpioPin gpio_usart_tx; | ||||
| extern const GpioPin gpio_usart_rx; | ||||
| 
 | ||||
| extern const GpioPin gpio_i2c_power_sda; | ||||
| extern const GpioPin gpio_i2c_power_scl; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,151 +0,0 @@ | ||||
| #include "furi_hal_spi.h" | ||||
| #include "furi_hal_resources.h" | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <string.h> | ||||
| #include <assert.h> | ||||
| 
 | ||||
| #include <stm32wbxx_ll_spi.h> | ||||
| #include <stm32wbxx_ll_utils.h> | ||||
| #include <stm32wbxx_ll_cortex.h> | ||||
| 
 | ||||
| void furi_hal_spi_init() { | ||||
|     furi_hal_spi_bus_init(&furi_hal_spi_bus_r); | ||||
|     furi_hal_spi_bus_init(&furi_hal_spi_bus_d); | ||||
| 
 | ||||
|     furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_subghz); | ||||
|     furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_nfc); | ||||
|     furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_display); | ||||
|     furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_sd_fast); | ||||
|     furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_sd_slow); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_spi_bus_init(FuriHalSpiBus* bus) { | ||||
|     assert(bus); | ||||
|     bus->callback(bus, FuriHalSpiBusEventInit); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_spi_bus_deinit(FuriHalSpiBus* bus) { | ||||
|     assert(bus); | ||||
|     bus->callback(bus, FuriHalSpiBusEventDeinit); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_spi_bus_handle_init(FuriHalSpiBusHandle* handle) { | ||||
|     assert(handle); | ||||
|     handle->callback(handle, FuriHalSpiBusHandleEventInit); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_spi_bus_handle_deinit(FuriHalSpiBusHandle* handle) { | ||||
|     assert(handle); | ||||
|     handle->callback(handle, FuriHalSpiBusHandleEventDeinit); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_spi_acquire(FuriHalSpiBusHandle* handle) { | ||||
|     assert(handle); | ||||
| 
 | ||||
|     handle->bus->callback(handle->bus, FuriHalSpiBusEventLock); | ||||
|     handle->bus->callback(handle->bus, FuriHalSpiBusEventActivate); | ||||
| 
 | ||||
|     assert(handle->bus->current_handle == NULL); | ||||
| 
 | ||||
|     handle->bus->current_handle = handle; | ||||
|     handle->callback(handle, FuriHalSpiBusHandleEventActivate); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_spi_release(FuriHalSpiBusHandle* handle) { | ||||
|     assert(handle); | ||||
|     assert(handle->bus->current_handle == handle); | ||||
| 
 | ||||
|     // Handle event and unset handle
 | ||||
|     handle->callback(handle, FuriHalSpiBusHandleEventDeactivate); | ||||
|     handle->bus->current_handle = NULL; | ||||
| 
 | ||||
|     // Bus events
 | ||||
|     handle->bus->callback(handle->bus, FuriHalSpiBusEventDeactivate); | ||||
|     handle->bus->callback(handle->bus, FuriHalSpiBusEventUnlock); | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_spi_bus_end_txrx(FuriHalSpiBusHandle* handle, uint32_t timeout) { | ||||
|     while(LL_SPI_GetTxFIFOLevel(handle->bus->spi) != LL_SPI_TX_FIFO_EMPTY) | ||||
|         ; | ||||
|     while(LL_SPI_IsActiveFlag_BSY(handle->bus->spi)) | ||||
|         ; | ||||
|     while(LL_SPI_GetRxFIFOLevel(handle->bus->spi) != LL_SPI_RX_FIFO_EMPTY) { | ||||
|         LL_SPI_ReceiveData8(handle->bus->spi); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_spi_bus_rx( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     uint8_t* buffer, | ||||
|     size_t size, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
|     assert(handle->bus->current_handle == handle); | ||||
|     assert(buffer); | ||||
|     assert(size > 0); | ||||
| 
 | ||||
|     return furi_hal_spi_bus_trx(handle, buffer, buffer, size, timeout); | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_spi_bus_tx( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     uint8_t* buffer, | ||||
|     size_t size, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
|     assert(handle->bus->current_handle == handle); | ||||
|     assert(buffer); | ||||
|     assert(size > 0); | ||||
|     bool ret = true; | ||||
| 
 | ||||
|     while(size > 0) { | ||||
|         if(LL_SPI_IsActiveFlag_TXE(handle->bus->spi)) { | ||||
|             LL_SPI_TransmitData8(handle->bus->spi, *buffer); | ||||
|             buffer++; | ||||
|             size--; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     furi_hal_spi_bus_end_txrx(handle, timeout); | ||||
|     LL_SPI_ClearFlag_OVR(handle->bus->spi); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_spi_bus_trx( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     uint8_t* tx_buffer, | ||||
|     uint8_t* rx_buffer, | ||||
|     size_t size, | ||||
|     uint32_t timeout) { | ||||
|     assert(handle); | ||||
|     assert(handle->bus->current_handle == handle); | ||||
|     assert(tx_buffer); | ||||
|     assert(rx_buffer); | ||||
|     assert(size > 0); | ||||
| 
 | ||||
|     bool ret = true; | ||||
|     size_t tx_size = size; | ||||
|     bool tx_allowed = true; | ||||
| 
 | ||||
|     while(size > 0) { | ||||
|         if(tx_size > 0 && LL_SPI_IsActiveFlag_TXE(handle->bus->spi) && tx_allowed) { | ||||
|             LL_SPI_TransmitData8(handle->bus->spi, *tx_buffer); | ||||
|             tx_buffer++; | ||||
|             tx_size--; | ||||
|             tx_allowed = false; | ||||
|         } | ||||
| 
 | ||||
|         if(LL_SPI_IsActiveFlag_RXNE(handle->bus->spi)) { | ||||
|             *rx_buffer = LL_SPI_ReceiveData8(handle->bus->spi); | ||||
|             rx_buffer++; | ||||
|             size--; | ||||
|             tx_allowed = true; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     furi_hal_spi_bus_end_txrx(handle, timeout); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| @ -1,290 +0,0 @@ | ||||
| #include <furi_hal_spi_config.h> | ||||
| #include <furi_hal_resources.h> | ||||
| 
 | ||||
| /* SPI Presets */ | ||||
| 
 | ||||
| const LL_SPI_InitTypeDef furi_hal_spi_preset_2edge_low_8m = { | ||||
|     .Mode = LL_SPI_MODE_MASTER, | ||||
|     .TransferDirection = LL_SPI_FULL_DUPLEX, | ||||
|     .DataWidth = LL_SPI_DATAWIDTH_8BIT, | ||||
|     .ClockPolarity = LL_SPI_POLARITY_LOW, | ||||
|     .ClockPhase = LL_SPI_PHASE_2EDGE, | ||||
|     .NSS = LL_SPI_NSS_SOFT, | ||||
|     .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8, | ||||
|     .BitOrder = LL_SPI_MSB_FIRST, | ||||
|     .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE, | ||||
|     .CRCPoly = 7, | ||||
| }; | ||||
| 
 | ||||
| const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_8m = { | ||||
|     .Mode = LL_SPI_MODE_MASTER, | ||||
|     .TransferDirection = LL_SPI_FULL_DUPLEX, | ||||
|     .DataWidth = LL_SPI_DATAWIDTH_8BIT, | ||||
|     .ClockPolarity = LL_SPI_POLARITY_LOW, | ||||
|     .ClockPhase = LL_SPI_PHASE_1EDGE, | ||||
|     .NSS = LL_SPI_NSS_SOFT, | ||||
|     .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8, | ||||
|     .BitOrder = LL_SPI_MSB_FIRST, | ||||
|     .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE, | ||||
|     .CRCPoly = 7, | ||||
| }; | ||||
| 
 | ||||
| const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_4m = { | ||||
|     .Mode = LL_SPI_MODE_MASTER, | ||||
|     .TransferDirection = LL_SPI_FULL_DUPLEX, | ||||
|     .DataWidth = LL_SPI_DATAWIDTH_8BIT, | ||||
|     .ClockPolarity = LL_SPI_POLARITY_LOW, | ||||
|     .ClockPhase = LL_SPI_PHASE_1EDGE, | ||||
|     .NSS = LL_SPI_NSS_SOFT, | ||||
|     .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV16, | ||||
|     .BitOrder = LL_SPI_MSB_FIRST, | ||||
|     .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE, | ||||
|     .CRCPoly = 7, | ||||
| }; | ||||
| 
 | ||||
| const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_16m = { | ||||
|     .Mode = LL_SPI_MODE_MASTER, | ||||
|     .TransferDirection = LL_SPI_FULL_DUPLEX, | ||||
|     .DataWidth = LL_SPI_DATAWIDTH_8BIT, | ||||
|     .ClockPolarity = LL_SPI_POLARITY_LOW, | ||||
|     .ClockPhase = LL_SPI_PHASE_1EDGE, | ||||
|     .NSS = LL_SPI_NSS_SOFT, | ||||
|     .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2, | ||||
|     .BitOrder = LL_SPI_MSB_FIRST, | ||||
|     .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE, | ||||
|     .CRCPoly = 7, | ||||
| }; | ||||
| 
 | ||||
| const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_2m = { | ||||
|     .Mode = LL_SPI_MODE_MASTER, | ||||
|     .TransferDirection = LL_SPI_FULL_DUPLEX, | ||||
|     .DataWidth = LL_SPI_DATAWIDTH_8BIT, | ||||
|     .ClockPolarity = LL_SPI_POLARITY_LOW, | ||||
|     .ClockPhase = LL_SPI_PHASE_1EDGE, | ||||
|     .NSS = LL_SPI_NSS_SOFT, | ||||
|     .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV32, | ||||
|     .BitOrder = LL_SPI_MSB_FIRST, | ||||
|     .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE, | ||||
|     .CRCPoly = 7, | ||||
| }; | ||||
| 
 | ||||
| /* SPI Buses */ | ||||
| 
 | ||||
| static void furi_hal_spi_bus_r_event_callback(FuriHalSpiBus* bus, FuriHalSpiBusEvent event) { | ||||
|     if(event == FuriHalSpiBusEventInit) { | ||||
|         LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1); | ||||
|         LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1); | ||||
|         bus->current_handle = NULL; | ||||
|     } else if(event == FuriHalSpiBusEventDeinit) { | ||||
|     } else if(event == FuriHalSpiBusEventLock) { | ||||
|     } else if(event == FuriHalSpiBusEventUnlock) { | ||||
|     } else if(event == FuriHalSpiBusEventActivate) { | ||||
|         LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI1); | ||||
|     } else if(event == FuriHalSpiBusEventDeactivate) { | ||||
|         LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBus furi_hal_spi_bus_r = { | ||||
|     .spi = SPI1, | ||||
|     .callback = furi_hal_spi_bus_r_event_callback, | ||||
| }; | ||||
| 
 | ||||
| static void furi_hal_spi_bus_d_event_callback(FuriHalSpiBus* bus, FuriHalSpiBusEvent event) { | ||||
|     if(event == FuriHalSpiBusEventInit) { | ||||
|         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2); | ||||
|         LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2); | ||||
|         bus->current_handle = NULL; | ||||
|     } else if(event == FuriHalSpiBusEventDeinit) { | ||||
|     } else if(event == FuriHalSpiBusEventLock) { | ||||
|     } else if(event == FuriHalSpiBusEventUnlock) { | ||||
|     } else if(event == FuriHalSpiBusEventActivate) { | ||||
|         LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI2); | ||||
|     } else if(event == FuriHalSpiBusEventDeactivate) { | ||||
|         LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBus furi_hal_spi_bus_d = { | ||||
|     .spi = SPI2, | ||||
|     .callback = furi_hal_spi_bus_d_event_callback, | ||||
| }; | ||||
| 
 | ||||
| /* SPI Bus Handles */ | ||||
| 
 | ||||
| inline static void furi_hal_spi_bus_r_handle_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event, | ||||
|     const LL_SPI_InitTypeDef* preset) { | ||||
|     if(event == FuriHalSpiBusHandleEventInit) { | ||||
|         hal_gpio_write(handle->cs, true); | ||||
|         hal_gpio_init(handle->cs, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); | ||||
|     } else if(event == FuriHalSpiBusHandleEventDeinit) { | ||||
|         hal_gpio_write(handle->cs, true); | ||||
|         hal_gpio_init(handle->cs, GpioModeAnalog, GpioPullNo, GpioSpeedLow); | ||||
|     } else if(event == FuriHalSpiBusHandleEventActivate) { | ||||
|         LL_SPI_Init(handle->bus->spi, (LL_SPI_InitTypeDef*)preset); | ||||
|         LL_SPI_SetRxFIFOThreshold(handle->bus->spi, LL_SPI_RX_FIFO_TH_QUARTER); | ||||
|         LL_SPI_Enable(handle->bus->spi); | ||||
| 
 | ||||
|         hal_gpio_init_ex( | ||||
|             handle->miso, | ||||
|             GpioModeAltFunctionPushPull, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedVeryHigh, | ||||
|             GpioAltFn5SPI1); | ||||
|         hal_gpio_init_ex( | ||||
|             handle->mosi, | ||||
|             GpioModeAltFunctionPushPull, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedVeryHigh, | ||||
|             GpioAltFn5SPI1); | ||||
|         hal_gpio_init_ex( | ||||
|             handle->sck, | ||||
|             GpioModeAltFunctionPushPull, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedVeryHigh, | ||||
|             GpioAltFn5SPI1); | ||||
| 
 | ||||
|         hal_gpio_write(handle->cs, false); | ||||
|     } else if(event == FuriHalSpiBusHandleEventDeactivate) { | ||||
|         hal_gpio_write(handle->cs, true); | ||||
| 
 | ||||
|         hal_gpio_init(handle->miso, GpioModeAnalog, GpioPullNo, GpioSpeedLow); | ||||
|         hal_gpio_init(handle->mosi, GpioModeAnalog, GpioPullNo, GpioSpeedLow); | ||||
|         hal_gpio_init(handle->sck, GpioModeAnalog, GpioPullNo, GpioSpeedLow); | ||||
| 
 | ||||
|         LL_SPI_Disable(handle->bus->spi); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_spi_bus_handle_subghz_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event) { | ||||
|     furi_hal_spi_bus_r_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_8m); | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBusHandle furi_hal_spi_bus_handle_subghz = { | ||||
|     .bus = &furi_hal_spi_bus_r, | ||||
|     .callback = furi_hal_spi_bus_handle_subghz_event_callback, | ||||
|     .miso = &gpio_spi_r_miso, | ||||
|     .mosi = &gpio_spi_r_mosi, | ||||
|     .sck = &gpio_spi_r_sck, | ||||
|     .cs = &gpio_subghz_cs, | ||||
| }; | ||||
| 
 | ||||
| static void furi_hal_spi_bus_handle_nfc_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event) { | ||||
|     furi_hal_spi_bus_r_handle_event_callback(handle, event, &furi_hal_spi_preset_2edge_low_8m); | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBusHandle furi_hal_spi_bus_handle_nfc = { | ||||
|     .bus = &furi_hal_spi_bus_r, | ||||
|     .callback = furi_hal_spi_bus_handle_nfc_event_callback, | ||||
|     .miso = &gpio_spi_r_miso, | ||||
|     .mosi = &gpio_spi_r_mosi, | ||||
|     .sck = &gpio_spi_r_sck, | ||||
|     .cs = &gpio_nfc_cs, | ||||
| }; | ||||
| 
 | ||||
| static void furi_hal_spi_bus_handle_external_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event) { | ||||
|     furi_hal_spi_bus_r_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_2m); | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBusHandle furi_hal_spi_bus_handle_external = { | ||||
|     .bus = &furi_hal_spi_bus_r, | ||||
|     .callback = furi_hal_spi_bus_handle_external_event_callback, | ||||
|     .miso = &gpio_ext_pa6, | ||||
|     .mosi = &gpio_ext_pa7, | ||||
|     .sck = &gpio_ext_pb3, | ||||
|     .cs = &gpio_ext_pa4, | ||||
| }; | ||||
| 
 | ||||
| inline static void furi_hal_spi_bus_d_handle_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event, | ||||
|     const LL_SPI_InitTypeDef* preset) { | ||||
|     if(event == FuriHalSpiBusHandleEventInit) { | ||||
|         hal_gpio_write(handle->cs, true); | ||||
|         hal_gpio_init(handle->cs, GpioModeOutputPushPull, GpioPullUp, GpioSpeedVeryHigh); | ||||
| 
 | ||||
|         hal_gpio_init_ex( | ||||
|             handle->miso, | ||||
|             GpioModeAltFunctionPushPull, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedVeryHigh, | ||||
|             GpioAltFn5SPI2); | ||||
|         hal_gpio_init_ex( | ||||
|             handle->mosi, | ||||
|             GpioModeAltFunctionPushPull, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedVeryHigh, | ||||
|             GpioAltFn5SPI2); | ||||
|         hal_gpio_init_ex( | ||||
|             handle->sck, | ||||
|             GpioModeAltFunctionPushPull, | ||||
|             GpioPullNo, | ||||
|             GpioSpeedVeryHigh, | ||||
|             GpioAltFn5SPI2); | ||||
| 
 | ||||
|     } else if(event == FuriHalSpiBusHandleEventDeinit) { | ||||
|         hal_gpio_write(handle->cs, true); | ||||
|         hal_gpio_init(handle->cs, GpioModeAnalog, GpioPullUp, GpioSpeedLow); | ||||
|     } else if(event == FuriHalSpiBusHandleEventActivate) { | ||||
|         LL_SPI_Init(handle->bus->spi, (LL_SPI_InitTypeDef*)preset); | ||||
|         LL_SPI_SetRxFIFOThreshold(handle->bus->spi, LL_SPI_RX_FIFO_TH_QUARTER); | ||||
|         LL_SPI_Enable(handle->bus->spi); | ||||
|         hal_gpio_write(handle->cs, false); | ||||
|     } else if(event == FuriHalSpiBusHandleEventDeactivate) { | ||||
|         hal_gpio_write(handle->cs, true); | ||||
|         LL_SPI_Disable(handle->bus->spi); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_spi_bus_handle_display_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event) { | ||||
|     furi_hal_spi_bus_d_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_4m); | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBusHandle furi_hal_spi_bus_handle_display = { | ||||
|     .bus = &furi_hal_spi_bus_d, | ||||
|     .callback = furi_hal_spi_bus_handle_display_event_callback, | ||||
|     .miso = &gpio_spi_d_miso, | ||||
|     .mosi = &gpio_spi_d_mosi, | ||||
|     .sck = &gpio_spi_d_sck, | ||||
|     .cs = &gpio_display_cs, | ||||
| }; | ||||
| 
 | ||||
| static void furi_hal_spi_bus_handle_sd_fast_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event) { | ||||
|     furi_hal_spi_bus_d_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_16m); | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_fast = { | ||||
|     .bus = &furi_hal_spi_bus_d, | ||||
|     .callback = furi_hal_spi_bus_handle_sd_fast_event_callback, | ||||
|     .miso = &gpio_spi_d_miso, | ||||
|     .mosi = &gpio_spi_d_mosi, | ||||
|     .sck = &gpio_spi_d_sck, | ||||
|     .cs = &gpio_sdcard_cs, | ||||
| }; | ||||
| 
 | ||||
| static void furi_hal_spi_bus_handle_sd_slow_event_callback( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event) { | ||||
|     furi_hal_spi_bus_d_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_2m); | ||||
| } | ||||
| 
 | ||||
| FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_slow = { | ||||
|     .bus = &furi_hal_spi_bus_d, | ||||
|     .callback = furi_hal_spi_bus_handle_sd_slow_event_callback, | ||||
|     .miso = &gpio_spi_d_miso, | ||||
|     .mosi = &gpio_spi_d_mosi, | ||||
|     .sck = &gpio_spi_d_sck, | ||||
|     .cs = &gpio_sdcard_cs, | ||||
| }; | ||||
| @ -1,61 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <furi_hal_spi_types.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /** Preset for ST25R916 */ | ||||
| extern const LL_SPI_InitTypeDef furi_hal_spi_preset_2edge_low_8m; | ||||
| 
 | ||||
| /** Preset for CC1101 */ | ||||
| extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_8m; | ||||
| 
 | ||||
| /** Preset for ST7567 (Display) */ | ||||
| extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_4m; | ||||
| 
 | ||||
| /** Preset for SdCard in fast mode */ | ||||
| extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_16m; | ||||
| 
 | ||||
| /** Preset for SdCard in slow mode */ | ||||
| extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_2m; | ||||
| 
 | ||||
| /** Furi Hal Spi Bus R (Radio: CC1101, Nfc, External)*/ | ||||
| extern FuriHalSpiBus furi_hal_spi_bus_r; | ||||
| 
 | ||||
| /** Furi Hal Spi Bus D (Display, SdCard) */ | ||||
| extern FuriHalSpiBus furi_hal_spi_bus_d; | ||||
| 
 | ||||
| /** CC1101 on `furi_hal_spi_bus_r` */ | ||||
| extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_subghz; | ||||
| 
 | ||||
| /** ST25R3916 on `furi_hal_spi_bus_r` */ | ||||
| extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_nfc; | ||||
| 
 | ||||
| /** External on `furi_hal_spi_bus_r`
 | ||||
|  * Preset: `furi_hal_spi_preset_1edge_low_2m` | ||||
|  *  | ||||
|  * miso: pa6 | ||||
|  * mosi: pa7 | ||||
|  * sck: pb3 | ||||
|  * cs:  pa4 (software controlled) | ||||
|  *  | ||||
|  * @warning not initialized by default, call `furi_hal_spi_bus_handle_init` to initialize | ||||
|  * Bus pins are floating on inactive state, CS high after initialization | ||||
|  *  | ||||
|  */ | ||||
| extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_external; | ||||
| 
 | ||||
| /** ST7567(Display) on `furi_hal_spi_bus_d` */ | ||||
| extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_display; | ||||
| 
 | ||||
| /** SdCard in fast mode on `furi_hal_spi_bus_d` */ | ||||
| extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_fast; | ||||
| 
 | ||||
| /** SdCard in slow mode on `furi_hal_spi_bus_d` */ | ||||
| extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_slow; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,64 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| #include <furi_hal_gpio.h> | ||||
| 
 | ||||
| #include <stm32wbxx_ll_spi.h> | ||||
| #include <stm32wbxx_ll_rcc.h> | ||||
| #include <stm32wbxx_ll_bus.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef struct FuriHalSpiBus FuriHalSpiBus; | ||||
| typedef struct FuriHalSpiBusHandle FuriHalSpiBusHandle; | ||||
| 
 | ||||
| /** FuriHal spi bus states */ | ||||
| typedef enum { | ||||
|     FuriHalSpiBusEventInit, /**< Bus initialization event, called on system start */ | ||||
|     FuriHalSpiBusEventDeinit, /**< Bus deinitialization event, called on system stop */ | ||||
|     FuriHalSpiBusEventLock, /**< Bus lock event, called before activation */ | ||||
|     FuriHalSpiBusEventUnlock, /**< Bus unlock event, called after deactivation */ | ||||
|     FuriHalSpiBusEventActivate, /**< Bus activation event, called before handle activation */ | ||||
|     FuriHalSpiBusEventDeactivate, /**< Bus deactivation event, called after handle deactivation  */ | ||||
| } FuriHalSpiBusEvent; | ||||
| 
 | ||||
| /** FuriHal spi bus event callback */ | ||||
| typedef void (*FuriHalSpiBusEventCallback)(FuriHalSpiBus* bus, FuriHalSpiBusEvent event); | ||||
| 
 | ||||
| /** FuriHal spi bus */ | ||||
| struct FuriHalSpiBus { | ||||
|     SPI_TypeDef* spi; | ||||
|     FuriHalSpiBusEventCallback callback; | ||||
|     FuriHalSpiBusHandle* current_handle; | ||||
| }; | ||||
| 
 | ||||
| /** FuriHal spi handle states */ | ||||
| typedef enum { | ||||
|     FuriHalSpiBusHandleEventInit, /**< Handle init, called on system start, initialize gpio for idle state */ | ||||
|     FuriHalSpiBusHandleEventDeinit, /**< Handle deinit, called on system stop, deinitialize gpio for default state */ | ||||
|     FuriHalSpiBusHandleEventActivate, /**< Handle activate: connect gpio and apply bus config */ | ||||
|     FuriHalSpiBusHandleEventDeactivate, /**< Handle deactivate: disconnect gpio and reset bus config */ | ||||
| } FuriHalSpiBusHandleEvent; | ||||
| 
 | ||||
| /** FuriHal spi handle event callback */ | ||||
| typedef void (*FuriHalSpiBusHandleEventCallback)( | ||||
|     FuriHalSpiBusHandle* handle, | ||||
|     FuriHalSpiBusHandleEvent event); | ||||
| 
 | ||||
| /** FuriHal spi handle */ | ||||
| struct FuriHalSpiBusHandle { | ||||
|     FuriHalSpiBus* bus; | ||||
|     FuriHalSpiBusHandleEventCallback callback; | ||||
|     const GpioPin* miso; | ||||
|     const GpioPin* mosi; | ||||
|     const GpioPin* sck; | ||||
|     const GpioPin* cs; | ||||
| }; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,268 +0,0 @@ | ||||
| #include <furi_hal_version.h> | ||||
| 
 | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_rtc.h> | ||||
| #include <stm32wbxx_ll_system.h> | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| #define FURI_HAL_VERSION_OTP_HEADER_MAGIC 0xBABE | ||||
| #define FURI_HAL_VERSION_OTP_ADDRESS OTP_AREA_BASE | ||||
| 
 | ||||
| /** OTP V0 Structure: prototypes and early EVT */ | ||||
| typedef struct { | ||||
|     uint8_t board_version; | ||||
|     uint8_t board_target; | ||||
|     uint8_t board_body; | ||||
|     uint8_t board_connect; | ||||
|     uint32_t header_timestamp; | ||||
|     char name[FURI_HAL_VERSION_NAME_LENGTH]; | ||||
| } FuriHalVersionOTPv0; | ||||
| 
 | ||||
| /** OTP V1 Structure: late EVT, DVT */ | ||||
| typedef struct { | ||||
|     /* First 64 bits: header */ | ||||
|     uint16_t header_magic; | ||||
|     uint8_t header_version; | ||||
|     uint8_t header_reserved; | ||||
|     uint32_t header_timestamp; | ||||
| 
 | ||||
|     /* Second 64 bits: board info */ | ||||
|     uint8_t board_version; /** Board version */ | ||||
|     uint8_t board_target; /** Board target firmware */ | ||||
|     uint8_t board_body; /** Board body */ | ||||
|     uint8_t board_connect; /** Board interconnect */ | ||||
|     uint8_t board_color; /** Board color */ | ||||
|     uint8_t board_region; /** Board region */ | ||||
|     uint16_t board_reserved; /** Reserved for future use, 0x0000 */ | ||||
| 
 | ||||
|     /* Third 64 bits: Unique Device Name */ | ||||
|     char name[FURI_HAL_VERSION_NAME_LENGTH]; /** Unique Device Name */ | ||||
| } FuriHalVersionOTPv1; | ||||
| 
 | ||||
| /** OTP V2 Structure: DVT2, PVT, Production */ | ||||
| typedef struct { | ||||
|     /* Early First 64 bits: header */ | ||||
|     uint16_t header_magic; | ||||
|     uint8_t header_version; | ||||
|     uint8_t header_reserved; | ||||
|     uint32_t header_timestamp; | ||||
| 
 | ||||
|     /* Early Second 64 bits: board info */ | ||||
|     uint8_t board_version; /** Board version */ | ||||
|     uint8_t board_target; /** Board target firmware */ | ||||
|     uint8_t board_body; /** Board body */ | ||||
|     uint8_t board_connect; /** Board interconnect */ | ||||
|     uint8_t board_display; /** Board display */ | ||||
|     uint8_t board_reserved2_0; /** Reserved for future use, 0x00 */ | ||||
|     uint16_t board_reserved2_1; /** Reserved for future use, 0x0000 */ | ||||
| 
 | ||||
|     /* Late Third 64 bits: device info */ | ||||
|     uint8_t board_color; /** Board color */ | ||||
|     uint8_t board_region; /** Board region */ | ||||
|     uint16_t board_reserved3_0; /** Reserved for future use, 0x0000 */ | ||||
|     uint32_t board_reserved3_1; /** Reserved for future use, 0x00000000 */ | ||||
| 
 | ||||
|     /* Late Fourth 64 bits: Unique Device Name */ | ||||
|     char name[FURI_HAL_VERSION_NAME_LENGTH]; /** Unique Device Name */ | ||||
| } FuriHalVersionOTPv2; | ||||
| 
 | ||||
| /** Represenation Model: */ | ||||
| typedef struct { | ||||
|     uint32_t timestamp; | ||||
| 
 | ||||
|     uint8_t board_version; /** Board version */ | ||||
|     uint8_t board_target; /** Board target firmware */ | ||||
|     uint8_t board_body; /** Board body */ | ||||
|     uint8_t board_connect; /** Board interconnect */ | ||||
|     uint8_t board_color; /** Board color */ | ||||
|     uint8_t board_region; /** Board region */ | ||||
|     uint8_t board_display; /** Board display */ | ||||
| 
 | ||||
|     char name[FURI_HAL_VERSION_ARRAY_NAME_LENGTH]; /** \0 terminated name */ | ||||
|     char device_name[FURI_HAL_VERSION_DEVICE_NAME_LENGTH]; /** device name for special needs */ | ||||
|     uint8_t ble_mac[6]; | ||||
| } FuriHalVersion; | ||||
| 
 | ||||
| static FuriHalVersion furi_hal_version = {0}; | ||||
| 
 | ||||
| static void furi_hal_version_set_name(const char* name) { | ||||
|     furi_hal_version.device_name[0] = 0; | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_version_load_otp_default() { | ||||
|     furi_hal_version_set_name(NULL); | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_version_load_otp_v0() { | ||||
|     const FuriHalVersionOTPv0* otp = (FuriHalVersionOTPv0*)FURI_HAL_VERSION_OTP_ADDRESS; | ||||
| 
 | ||||
|     furi_hal_version.timestamp = otp->header_timestamp; | ||||
|     furi_hal_version.board_version = otp->board_version; | ||||
|     furi_hal_version.board_target = otp->board_target; | ||||
|     furi_hal_version.board_body = otp->board_body; | ||||
|     furi_hal_version.board_connect = otp->board_connect; | ||||
| 
 | ||||
|     furi_hal_version_set_name(otp->name); | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_version_load_otp_v1() { | ||||
|     const FuriHalVersionOTPv1* otp = (FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS; | ||||
| 
 | ||||
|     furi_hal_version.timestamp = otp->header_timestamp; | ||||
|     furi_hal_version.board_version = otp->board_version; | ||||
|     furi_hal_version.board_target = otp->board_target; | ||||
|     furi_hal_version.board_body = otp->board_body; | ||||
|     furi_hal_version.board_connect = otp->board_connect; | ||||
|     furi_hal_version.board_color = otp->board_color; | ||||
|     furi_hal_version.board_region = otp->board_region; | ||||
| 
 | ||||
|     furi_hal_version_set_name(otp->name); | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_version_load_otp_v2() { | ||||
|     const FuriHalVersionOTPv2* otp = (FuriHalVersionOTPv2*)FURI_HAL_VERSION_OTP_ADDRESS; | ||||
| 
 | ||||
|     // 1st block, programmed afer baking
 | ||||
|     furi_hal_version.timestamp = otp->header_timestamp; | ||||
| 
 | ||||
|     // 2nd block, programmed afer baking
 | ||||
|     furi_hal_version.board_version = otp->board_version; | ||||
|     furi_hal_version.board_target = otp->board_target; | ||||
|     furi_hal_version.board_body = otp->board_body; | ||||
|     furi_hal_version.board_connect = otp->board_connect; | ||||
|     furi_hal_version.board_display = otp->board_display; | ||||
| 
 | ||||
|     // 3rd and 4th blocks, programmed on FATP stage
 | ||||
|     if(otp->board_color != 0xFF) { | ||||
|         furi_hal_version.board_color = otp->board_color; | ||||
|         furi_hal_version.board_region = otp->board_region; | ||||
|         furi_hal_version_set_name(otp->name); | ||||
|     } else { | ||||
|         furi_hal_version.board_color = 0; | ||||
|         furi_hal_version.board_region = 0; | ||||
|         furi_hal_version_set_name(NULL); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void furi_hal_version_init() { | ||||
|     switch(furi_hal_version_get_otp_version()) { | ||||
|     case FuriHalVersionOtpVersionUnknown: | ||||
|         furi_hal_version_load_otp_default(); | ||||
|         break; | ||||
|     case FuriHalVersionOtpVersionEmpty: | ||||
|         furi_hal_version_load_otp_default(); | ||||
|         break; | ||||
|     case FuriHalVersionOtpVersion0: | ||||
|         furi_hal_version_load_otp_v0(); | ||||
|         break; | ||||
|     case FuriHalVersionOtpVersion1: | ||||
|         furi_hal_version_load_otp_v1(); | ||||
|         break; | ||||
|     case FuriHalVersionOtpVersion2: | ||||
|         furi_hal_version_load_otp_v2(); | ||||
|         break; | ||||
|     default: | ||||
|         furi_hal_version_load_otp_default(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_version_do_i_belong_here() { | ||||
|     return furi_hal_version_get_hw_target() == 7; | ||||
| } | ||||
| 
 | ||||
| const char* furi_hal_version_get_model_name() { | ||||
|     return "Flipper Zero"; | ||||
| } | ||||
| 
 | ||||
| const FuriHalVersionOtpVersion furi_hal_version_get_otp_version() { | ||||
|     if(*(uint64_t*)FURI_HAL_VERSION_OTP_ADDRESS == 0xFFFFFFFF) { | ||||
|         return FuriHalVersionOtpVersionEmpty; | ||||
|     } else { | ||||
|         if(((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_magic == | ||||
|            FURI_HAL_VERSION_OTP_HEADER_MAGIC) { | ||||
|             // Version 1+
 | ||||
|             uint8_t version = ((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_version; | ||||
|             if(version >= FuriHalVersionOtpVersion1 && version <= FuriHalVersionOtpVersion2) { | ||||
|                 return version; | ||||
|             } else { | ||||
|                 return FuriHalVersionOtpVersionUnknown; | ||||
|             } | ||||
|         } else if(((FuriHalVersionOTPv0*)FURI_HAL_VERSION_OTP_ADDRESS)->board_version <= 10) { | ||||
|             // Version 0
 | ||||
|             return FuriHalVersionOtpVersion0; | ||||
|         } else { | ||||
|             // Version Unknown
 | ||||
|             return FuriHalVersionOtpVersionUnknown; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| const uint8_t furi_hal_version_get_hw_version() { | ||||
|     return furi_hal_version.board_version; | ||||
| } | ||||
| 
 | ||||
| const uint8_t furi_hal_version_get_hw_target() { | ||||
|     return furi_hal_version.board_target; | ||||
| } | ||||
| 
 | ||||
| const uint8_t furi_hal_version_get_hw_body() { | ||||
|     return furi_hal_version.board_body; | ||||
| } | ||||
| 
 | ||||
| const FuriHalVersionColor furi_hal_version_get_hw_color() { | ||||
|     return furi_hal_version.board_color; | ||||
| } | ||||
| 
 | ||||
| const uint8_t furi_hal_version_get_hw_connect() { | ||||
|     return furi_hal_version.board_connect; | ||||
| } | ||||
| 
 | ||||
| const FuriHalVersionRegion furi_hal_version_get_hw_region() { | ||||
|     return furi_hal_version.board_region; | ||||
| } | ||||
| 
 | ||||
| const FuriHalVersionDisplay furi_hal_version_get_hw_display() { | ||||
|     return furi_hal_version.board_display; | ||||
| } | ||||
| 
 | ||||
| const uint32_t furi_hal_version_get_hw_timestamp() { | ||||
|     return furi_hal_version.timestamp; | ||||
| } | ||||
| 
 | ||||
| const char* furi_hal_version_get_name_ptr() { | ||||
|     return *furi_hal_version.name == 0x00 ? NULL : furi_hal_version.name; | ||||
| } | ||||
| 
 | ||||
| const char* furi_hal_version_get_device_name_ptr() { | ||||
|     return furi_hal_version.device_name + 1; | ||||
| } | ||||
| 
 | ||||
| const char* furi_hal_version_get_ble_local_device_name_ptr() { | ||||
|     return furi_hal_version.device_name; | ||||
| } | ||||
| 
 | ||||
| const uint8_t* furi_hal_version_get_ble_mac() { | ||||
|     return furi_hal_version.ble_mac; | ||||
| } | ||||
| 
 | ||||
| const struct Version* furi_hal_version_get_firmware_version(void) { | ||||
|     return version_get(); | ||||
| } | ||||
| 
 | ||||
| const struct Version* furi_hal_version_get_bootloader_version(void) { | ||||
| #ifdef NO_BOOTLOADER | ||||
|     return 0; | ||||
| #else | ||||
|     /* Backup register which points to structure in flash memory */ | ||||
|     return (const struct Version*)LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR1); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| size_t furi_hal_version_uid_size() { | ||||
|     return 64 / 8; | ||||
| } | ||||
| 
 | ||||
| const uint8_t* furi_hal_version_uid() { | ||||
|     return (const uint8_t*)UID64_BASE; | ||||
| } | ||||
| @ -1,108 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_ll_spi.h> | ||||
| 
 | ||||
| #define BUTTON_BACK_GPIO_Port GPIOC | ||||
| #define BUTTON_BACK_Pin LL_GPIO_PIN_13 | ||||
| #define BUTTON_DOWN_GPIO_Port GPIOC | ||||
| #define BUTTON_DOWN_Pin LL_GPIO_PIN_6 | ||||
| #define BUTTON_LEFT_GPIO_Port GPIOB | ||||
| #define BUTTON_LEFT_Pin LL_GPIO_PIN_11 | ||||
| #define BUTTON_OK_GPIO_Port GPIOH | ||||
| #define BUTTON_OK_Pin LL_GPIO_PIN_3 | ||||
| #define BUTTON_RIGHT_GPIO_Port GPIOB | ||||
| #define BUTTON_RIGHT_Pin LL_GPIO_PIN_12 | ||||
| #define BUTTON_UP_GPIO_Port GPIOB | ||||
| #define BUTTON_UP_Pin LL_GPIO_PIN_10 | ||||
| 
 | ||||
| #define CC1101_CS_GPIO_Port GPIOD | ||||
| #define CC1101_CS_Pin LL_GPIO_PIN_0 | ||||
| #define CC1101_G0_GPIO_Port GPIOA | ||||
| #define CC1101_G0_Pin LL_GPIO_PIN_1 | ||||
| 
 | ||||
| #define DISPLAY_CS_GPIO_Port GPIOC | ||||
| #define DISPLAY_CS_Pin LL_GPIO_PIN_11 | ||||
| #define DISPLAY_DI_GPIO_Port GPIOB | ||||
| #define DISPLAY_DI_Pin LL_GPIO_PIN_1 | ||||
| #define DISPLAY_RST_GPIO_Port GPIOB | ||||
| #define DISPLAY_RST_Pin LL_GPIO_PIN_0 | ||||
| 
 | ||||
| #define IR_RX_GPIO_Port GPIOA | ||||
| #define IR_RX_Pin LL_GPIO_PIN_0 | ||||
| #define IR_TX_GPIO_Port GPIOB | ||||
| #define IR_TX_Pin LL_GPIO_PIN_9 | ||||
| 
 | ||||
| #define NFC_CS_GPIO_Port GPIOE | ||||
| #define NFC_CS_Pin LL_GPIO_PIN_4 | ||||
| 
 | ||||
| #define PA4_GPIO_Port GPIOA | ||||
| #define PA4_Pin LL_GPIO_PIN_4 | ||||
| #define PA6_GPIO_Port GPIOA | ||||
| #define PA6_Pin LL_GPIO_PIN_6 | ||||
| #define PA7_GPIO_Port GPIOA | ||||
| #define PA7_Pin LL_GPIO_PIN_7 | ||||
| #define PB2_GPIO_Port GPIOB | ||||
| #define PB2_Pin LL_GPIO_PIN_2 | ||||
| #define PB3_GPIO_Port GPIOB | ||||
| #define PB3_Pin LL_GPIO_PIN_3 | ||||
| #define PC0_GPIO_Port GPIOC | ||||
| #define PC0_Pin LL_GPIO_PIN_0 | ||||
| #define PC1_GPIO_Port GPIOC | ||||
| #define PC1_Pin LL_GPIO_PIN_1 | ||||
| #define PC3_GPIO_Port GPIOC | ||||
| #define PC3_Pin LL_GPIO_PIN_3 | ||||
| 
 | ||||
| #define PERIPH_POWER_GPIO_Port GPIOA | ||||
| #define PERIPH_POWER_Pin LL_GPIO_PIN_3 | ||||
| 
 | ||||
| #define QUARTZ_32MHZ_IN_GPIO_Port GPIOC | ||||
| #define QUARTZ_32MHZ_IN_Pin LL_GPIO_PIN_14 | ||||
| #define QUARTZ_32MHZ_OUT_GPIO_Port GPIOC | ||||
| #define QUARTZ_32MHZ_OUT_Pin LL_GPIO_PIN_15 | ||||
| 
 | ||||
| #define RFID_OUT_GPIO_Port GPIOB | ||||
| #define RFID_OUT_Pin LL_GPIO_PIN_13 | ||||
| #define RFID_PULL_GPIO_Port GPIOA | ||||
| #define RFID_PULL_Pin LL_GPIO_PIN_2 | ||||
| #define RFID_RF_IN_GPIO_Port GPIOC | ||||
| #define RFID_RF_IN_Pin LL_GPIO_PIN_5 | ||||
| #define RFID_TUNE_GPIO_Port GPIOA | ||||
| #define RFID_TUNE_Pin LL_GPIO_PIN_8 | ||||
| 
 | ||||
| #define RF_SW_0_GPIO_Port GPIOC | ||||
| #define RF_SW_0_Pin LL_GPIO_PIN_4 | ||||
| 
 | ||||
| #define SD_CD_GPIO_Port GPIOC | ||||
| #define SD_CD_Pin LL_GPIO_PIN_10 | ||||
| #define SD_CS_GPIO_Port GPIOC | ||||
| #define SD_CS_Pin LL_GPIO_PIN_12 | ||||
| 
 | ||||
| #define SPEAKER_GPIO_Port GPIOB | ||||
| #define SPEAKER_Pin LL_GPIO_PIN_8 | ||||
| 
 | ||||
| #define VIBRO_GPIO_Port GPIOA | ||||
| #define VIBRO_Pin LL_GPIO_PIN_15 | ||||
| 
 | ||||
| #define iBTN_GPIO_Port GPIOB | ||||
| #define iBTN_Pin LL_GPIO_PIN_14 | ||||
| 
 | ||||
| #define USART1_TX_Pin LL_GPIO_PIN_6 | ||||
| #define USART1_TX_Port GPIOB | ||||
| #define USART1_RX_Pin LL_GPIO_PIN_7 | ||||
| #define USART1_RX_Port GPIOB | ||||
| 
 | ||||
| #define SPI_D_MISO_GPIO_Port GPIOC | ||||
| #define SPI_D_MISO_Pin LL_GPIO_PIN_2 | ||||
| #define SPI_D_MOSI_GPIO_Port GPIOB | ||||
| #define SPI_D_MOSI_Pin LL_GPIO_PIN_15 | ||||
| #define SPI_D_SCK_GPIO_Port GPIOD | ||||
| #define SPI_D_SCK_Pin LL_GPIO_PIN_1 | ||||
| 
 | ||||
| #define SPI_R_MISO_GPIO_Port GPIOB | ||||
| #define SPI_R_MISO_Pin LL_GPIO_PIN_4 | ||||
| #define SPI_R_MOSI_GPIO_Port GPIOB | ||||
| #define SPI_R_MOSI_Pin LL_GPIO_PIN_5 | ||||
| #define SPI_R_SCK_GPIO_Port GPIOA | ||||
| #define SPI_R_SCK_Pin LL_GPIO_PIN_5 | ||||
| @ -1,187 +0,0 @@ | ||||
| /** | ||||
| ***************************************************************************** | ||||
| ** | ||||
| **  File        : stm32wb55xx_flash_cm4.ld | ||||
| ** | ||||
| **  Abstract    : System Workbench Minimal System calls file | ||||
| ** | ||||
| ** 		          For more information about which c-functions | ||||
| **                need which of these lowlevel functions | ||||
| **                please consult the Newlib libc-manual | ||||
| ** | ||||
| **  Environment : System Workbench for MCU | ||||
| ** | ||||
| **  Distribution: The file is distributed “as is,” without any warranty | ||||
| **                of any kind. | ||||
| ** | ||||
| ***************************************************************************** | ||||
| ** | ||||
| ** <h2><center>© COPYRIGHT(c) 2019 Ac6</center></h2> | ||||
| ** | ||||
| ** Redistribution and use in source and binary forms, with or without modification, | ||||
| ** are permitted provided that the following conditions are met: | ||||
| **   1. Redistributions of source code must retain the above copyright notice, | ||||
| **      this list of conditions and the following disclaimer. | ||||
| **   2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| **      this list of conditions and the following disclaimer in the documentation | ||||
| **      and/or other materials provided with the distribution. | ||||
| **   3. Neither the name of Ac6 nor the names of its contributors | ||||
| **      may be used to endorse or promote products derived from this software | ||||
| **      without specific prior written permission. | ||||
| ** | ||||
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||
| ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
| ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
| ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
| ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||
| ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| ** | ||||
| ***************************************************************************** | ||||
| */ | ||||
| 
 | ||||
| /* Entry Point */ | ||||
| ENTRY(Reset_Handler) | ||||
| 
 | ||||
| /* Highest address of the user mode stack */ | ||||
| _estack = 0x20030000;    /* end of RAM */ | ||||
| /* Generate a link error if heap and stack don't fit into RAM */ | ||||
| _Min_Heap_Size = 0x200;      /* required amount of heap  */ | ||||
| _Min_Stack_Size = 0x400; /* required amount of stack */ | ||||
| 
 | ||||
| /* Specify the memory areas */ | ||||
| MEMORY | ||||
| { | ||||
| FLASH (rx)                 : ORIGIN = 0x08000000, LENGTH = 32K | ||||
| RAM1 (xrw)                 : ORIGIN = 0x20000008, LENGTH = 0x2FFF8 | ||||
| RAM_SHARED (xrw)           : ORIGIN = 0x20030000, LENGTH = 10K | ||||
| } | ||||
| 
 | ||||
| /* Define output sections */ | ||||
| SECTIONS | ||||
| { | ||||
|   /* The startup code goes first into FLASH */ | ||||
|   .isr_vector : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     KEEP(*(.isr_vector)) /* Startup code */ | ||||
|     . = ALIGN(4); | ||||
|   } >FLASH | ||||
| 
 | ||||
|   /* The program code and other data goes into FLASH */ | ||||
|   .text : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     *(.text)           /* .text sections (code) */ | ||||
|     *(.text*)          /* .text* sections (code) */ | ||||
|     *(.glue_7)         /* glue arm to thumb code */ | ||||
|     *(.glue_7t)        /* glue thumb to arm code */ | ||||
|     *(.eh_frame) | ||||
| 
 | ||||
|     KEEP (*(.init)) | ||||
|     KEEP (*(.fini)) | ||||
| 
 | ||||
|     . = ALIGN(4); | ||||
|     _etext = .;        /* define a global symbols at end of code */ | ||||
|   } >FLASH | ||||
| 
 | ||||
|   /* Constant data goes into FLASH */ | ||||
|   .rodata : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     *(.rodata)         /* .rodata sections (constants, strings, etc.) */ | ||||
|     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */ | ||||
|     . = ALIGN(4); | ||||
|   } >FLASH | ||||
| 
 | ||||
|   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH | ||||
|   .ARM : { | ||||
|     __exidx_start = .; | ||||
|     *(.ARM.exidx*) | ||||
|     __exidx_end = .; | ||||
|   } >FLASH | ||||
| 
 | ||||
|   .preinit_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array*)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } >FLASH | ||||
|   .init_array : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT(.init_array.*))) | ||||
|     KEEP (*(.init_array*)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } >FLASH | ||||
|   .fini_array : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT(.fini_array.*))) | ||||
|     KEEP (*(.fini_array*)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } >FLASH | ||||
| 
 | ||||
|   /* used by the startup to initialize data */ | ||||
|   _sidata = LOADADDR(.data); | ||||
| 
 | ||||
|   /* Initialized data sections goes into RAM, load LMA copy after code */ | ||||
|   .data :  | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     _sdata = .;        /* create a global symbol at data start */ | ||||
|     *(.data)           /* .data sections */ | ||||
|     *(.data*)          /* .data* sections */ | ||||
| 
 | ||||
|     . = ALIGN(4); | ||||
|     _edata = .;        /* define a global symbol at data end */ | ||||
|   } >RAM1 AT> FLASH | ||||
| 
 | ||||
|    | ||||
|   /* Uninitialized data section */ | ||||
|   . = ALIGN(4); | ||||
|   .bss : | ||||
|   { | ||||
|     /* This is used by the startup in order to initialize the .bss secion */ | ||||
|     _sbss = .;         /* define a global symbol at bss start */ | ||||
|     __bss_start__ = _sbss; | ||||
|     *(.bss) | ||||
|     *(.bss*) | ||||
|     *(COMMON) | ||||
| 
 | ||||
|     . = ALIGN(4); | ||||
|     _ebss = .;         /* define a global symbol at bss end */ | ||||
|     __bss_end__ = _ebss; | ||||
|   } >RAM1 | ||||
| 
 | ||||
|   /* User_heap_stack section, used to check that there is enough RAM left */ | ||||
|   ._user_heap_stack : | ||||
|   { | ||||
|     . = ALIGN(8); | ||||
|     PROVIDE ( end = . ); | ||||
|     PROVIDE ( _end = . ); | ||||
|     . = . + _Min_Heap_Size; | ||||
|     . = . + _Min_Stack_Size; | ||||
|     . = ALIGN(8); | ||||
|   } >RAM1 | ||||
| 
 | ||||
|    | ||||
| 
 | ||||
|   /* Remove information from the standard libraries */ | ||||
|   /DISCARD/ : | ||||
|   { | ||||
|     libc.a ( * ) | ||||
|     libm.a ( * ) | ||||
|     libgcc.a ( * ) | ||||
|   } | ||||
| 
 | ||||
|   .ARM.attributes 0       : { *(.ARM.attributes) } | ||||
|    MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED | ||||
|    MB_MEM1 (NOLOAD)       : { *(MB_MEM1) } >RAM_SHARED | ||||
|    MB_MEM2 (NOLOAD)       : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -1,264 +0,0 @@ | ||||
| #include <target.h> | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_system.h> | ||||
| #include <stm32wbxx_ll_bus.h> | ||||
| #include <stm32wbxx_ll_utils.h> | ||||
| #include <stm32wbxx_ll_rcc.h> | ||||
| #include <stm32wbxx_ll_rtc.h> | ||||
| #include <stm32wbxx_ll_pwr.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_hal_flash.h> | ||||
| 
 | ||||
| #include <lib/toolbox/version.h> | ||||
| #include <furi_hal.h> | ||||
| 
 | ||||
| #include <u8g2.h> | ||||
| #include <u8g2_glue.h> | ||||
| 
 | ||||
| const uint8_t I_DFU_128x50[] = { | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xC0, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x75, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0A, 0x00, 0x00, 0x0F, 0x60, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xE0, 0x0F, 0x00, 0xC0, 0xE0, 0x4F, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x1E, 0x90, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x8C, 0x01, 0xA0, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0xFF, 0x19, 0x00, 0x63, 0x00, 0xC0, 0xF0, 0x07, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, 0x5E, 0x1F, 0x80, 0x18, 0x00, 0xE0, 0x0E, 0x18, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0xAF, 0x0F, 0x40, 0x06, 0x00, 0xF8, 0x01, 0x20, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x57, 0x01, 0x20, 0x01, 0x00, 0x78, 0x00, 0x3E, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x81, 0xAF, 0x02, 0x90, 0x00, 0x00, 0x38, 0x80, 0x41, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x80, 0x57, 0x01, 0x48, 0x00, 0x00, 0x10, 0x60, 0x40, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x10, 0x80, 0xAB, 0x00, 0x24, 0x00, 0x00, 0x08, 0x10, 0x40, | ||||
|     0x3F, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0C, 0xC0, 0x57, 0x01, 0x12, 0x00, 0x00, 0x04, 0x08, 0x40, | ||||
|     0xC0, 0x0F, 0x00, 0x00, 0xC0, 0x07, 0x03, 0xF0, 0xAB, 0x00, 0x0A, 0x00, 0x00, 0x02, 0x04, 0x40, | ||||
|     0x00, 0xF0, 0x1F, 0x80, 0x3F, 0xC0, 0x00, 0xFC, 0x55, 0x01, 0x05, 0xE0, 0x00, 0x01, 0x04, 0x40, | ||||
|     0x00, 0x00, 0xE0, 0x7F, 0x00, 0x30, 0x00, 0xFF, 0xAB, 0x00, 0x05, 0xE0, 0x80, 0x00, 0x02, 0x40, | ||||
|     0x0F, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xE0, 0xCF, 0x55, 0x81, 0x02, 0xF0, 0x40, 0x00, 0x02, 0x40, | ||||
|     0xF0, 0x0F, 0x00, 0x00, 0x7F, 0x00, 0xFE, 0xC3, 0xAB, 0x80, 0x02, 0x78, 0x20, 0x00, 0x01, 0x40, | ||||
|     0x00, 0xF0, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xC0, 0xD5, 0x81, 0x01, 0x7E, 0x10, 0x80, 0x00, 0x20, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x0F, 0xE0, 0xFA, 0x83, 0xC1, 0x3F, 0x08, 0x80, 0x00, 0x20, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xD8, 0x07, 0x83, 0xF1, 0x1F, 0x04, 0x40, 0x00, 0x20, | ||||
|     0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x0F, 0x80, 0xC7, 0x01, 0x83, 0xF1, 0x0F, 0x00, 0x20, 0x00, 0x10, | ||||
|     0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0xC0, 0x7F, 0x40, 0x80, 0x83, 0xE1, 0x01, 0x00, 0x20, 0x00, 0x18, | ||||
|     0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0x3F, 0x00, 0x20, 0xFC, 0x83, 0x01, 0x00, 0x00, 0x10, 0x00, 0x18, | ||||
|     0xFF, 0xFF, 0xFF, 0x3F, 0xF0, 0x00, 0x00, 0x10, 0xD7, 0x01, 0x03, 0x00, 0x00, 0x08, 0x00, 0x1C, | ||||
|     0xFF, 0xFF, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x88, 0xAB, 0x02, 0xE3, 0x01, 0x00, 0x08, 0x00, 0x0C, | ||||
|     0xFF, 0x07, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xC4, 0x55, 0x05, 0x1E, 0x00, 0x00, 0x04, 0x00, 0x0E, | ||||
|     0x7F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xA3, 0xAB, 0x02, 0x06, 0x00, 0x00, 0x02, 0x00, 0x0F, | ||||
|     0x0F, 0x00, 0x80, 0x03, 0x00, 0x00, 0xC0, 0x10, 0x57, 0x05, 0x02, 0x00, 0x00, 0x01, 0x80, 0x07, | ||||
|     0x03, 0x00, 0x70, 0x00, 0x00, 0x00, 0x30, 0x08, 0xAB, 0x0A, 0x02, 0x00, 0xC0, 0x00, 0xC0, 0x07, | ||||
|     0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x84, 0x57, 0x15, 0x01, 0x00, 0x30, 0x00, 0xE0, 0x07, | ||||
|     0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0xC3, 0xFF, 0x2A, 0x01, 0x00, 0x0C, 0x00, 0xF0, 0x0F, | ||||
|     0x00, 0xC0, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0xE0, 0xFE, 0x55, 0x01, 0x82, 0x03, 0x00, 0xF8, 0x15, | ||||
|     0x00, 0x30, 0x00, 0x00, 0x00, 0x1C, 0x30, 0x78, 0xFE, 0xAA, 0x01, 0x7C, 0x00, 0x00, 0xFC, 0x23, | ||||
|     0x00, 0x0E, 0x00, 0x00, 0xC0, 0x03, 0x0C, 0x3C, 0x7F, 0x5D, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x45, | ||||
|     0xC0, 0x01, 0x00, 0x00, 0x3E, 0x00, 0x02, 0x8F, 0xBF, 0xAE, 0x03, 0x00, 0x00, 0xC0, 0xFF, 0x82, | ||||
|     0x30, 0x00, 0x00, 0xC0, 0x01, 0x80, 0xC1, 0x43, 0xFE, 0x5D, 0x01, 0x00, 0x00, 0xF0, 0xFF, 0x05, | ||||
|     0x0F, 0x00, 0x80, 0x3F, 0x00, 0x60, 0xF0, 0x31, 0xF6, 0xAE, 0x03, 0x00, 0x00, 0xFA, 0xAF, 0x02, | ||||
|     0xFC, 0xFF, 0x7F, 0x00, 0x00, 0x18, 0x7C, 0x08, 0x23, 0xFF, 0x05, 0x00, 0x00, 0xFD, 0x55, 0x01, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x1F, 0x84, 0x30, 0xFE, 0x0A, 0x00, 0x00, 0xAA, 0xAA, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x80, 0xF1, 0x07, 0x43, 0x18, 0xFF, 0x15, 0x00, 0x00, 0x54, 0x15, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x80, 0x20, 0x8C, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| }; | ||||
| 
 | ||||
| // Boot request enum
 | ||||
| #define BOOT_REQUEST_TAINTED 0x00000000 | ||||
| #define BOOT_REQUEST_CLEAN 0xDADEDADE | ||||
| #define BOOT_REQUEST_DFU 0xDF00B000 | ||||
| // Boot to DFU pin
 | ||||
| #define BOOT_DFU_PORT GPIOB | ||||
| #define BOOT_DFU_PIN LL_GPIO_PIN_11 | ||||
| // USB pins
 | ||||
| #define BOOT_USB_PORT GPIOA | ||||
| #define BOOT_USB_DM_PIN LL_GPIO_PIN_11 | ||||
| #define BOOT_USB_DP_PIN LL_GPIO_PIN_12 | ||||
| #define BOOT_USB_PIN (BOOT_USB_DM_PIN | BOOT_USB_DP_PIN) | ||||
| 
 | ||||
| #define RTC_CLOCK_IS_READY() (LL_RCC_LSE_IsReady() && LL_RCC_LSI1_IsReady()) | ||||
| 
 | ||||
| void target_led_control(char* c) { | ||||
|     furi_hal_light_set(LightRed, 0x00); | ||||
|     furi_hal_light_set(LightGreen, 0x00); | ||||
|     furi_hal_light_set(LightBlue, 0x00); | ||||
|     do { | ||||
|         if(*c == 'R') { | ||||
|             furi_hal_light_set(LightRed, 0xFF); | ||||
|         } else if(*c == 'G') { | ||||
|             furi_hal_light_set(LightGreen, 0xFF); | ||||
|         } else if(*c == 'B') { | ||||
|             furi_hal_light_set(LightBlue, 0xFF); | ||||
|         } else if(*c == '.') { | ||||
|             LL_mDelay(125); | ||||
|             furi_hal_light_set(LightRed, 0x00); | ||||
|             furi_hal_light_set(LightGreen, 0x00); | ||||
|             furi_hal_light_set(LightBlue, 0x00); | ||||
|             LL_mDelay(125); | ||||
|         } else if(*c == '-') { | ||||
|             LL_mDelay(250); | ||||
|             furi_hal_light_set(LightRed, 0x00); | ||||
|             furi_hal_light_set(LightGreen, 0x00); | ||||
|             furi_hal_light_set(LightBlue, 0x00); | ||||
|             LL_mDelay(250); | ||||
|         } else if(*c == '|') { | ||||
|             furi_hal_light_set(LightRed, 0x00); | ||||
|             furi_hal_light_set(LightGreen, 0x00); | ||||
|             furi_hal_light_set(LightBlue, 0x00); | ||||
|         } | ||||
|         c++; | ||||
|     } while(*c != 0); | ||||
| } | ||||
| 
 | ||||
| void target_clock_init() { | ||||
|     LL_Init1msTick(4000000); | ||||
|     LL_SetSystemCoreClock(4000000); | ||||
| 
 | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH); | ||||
| 
 | ||||
|     LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1); | ||||
|     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2); | ||||
| } | ||||
| 
 | ||||
| void target_gpio_init() { | ||||
|     // USB D+
 | ||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_MODE_OUTPUT); | ||||
|     LL_GPIO_SetPinSpeed(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH); | ||||
|     LL_GPIO_SetPinOutputType(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_OUTPUT_OPENDRAIN); | ||||
|     // USB D-
 | ||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_MODE_OUTPUT); | ||||
|     LL_GPIO_SetPinSpeed(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH); | ||||
|     LL_GPIO_SetPinOutputType(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_OUTPUT_OPENDRAIN); | ||||
|     // Button: back
 | ||||
|     LL_GPIO_SetPinMode(BOOT_DFU_PORT, BOOT_DFU_PIN, LL_GPIO_MODE_INPUT); | ||||
|     LL_GPIO_SetPinPull(BOOT_DFU_PORT, BOOT_DFU_PIN, LL_GPIO_PULL_UP); | ||||
| } | ||||
| 
 | ||||
| void target_rtc_init() { | ||||
|     // LSE and RTC
 | ||||
|     LL_PWR_EnableBkUpAccess(); | ||||
|     if(!RTC_CLOCK_IS_READY()) { | ||||
|         // Start LSI1 needed for CSS
 | ||||
|         LL_RCC_LSI1_Enable(); | ||||
|         // Try to start LSE normal way
 | ||||
|         LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_HIGH); | ||||
|         LL_RCC_LSE_Enable(); | ||||
|         uint32_t c = 0; | ||||
|         while(!RTC_CLOCK_IS_READY() && c < 200) { | ||||
|             LL_mDelay(10); | ||||
|             c++; | ||||
|         } | ||||
|         // Plan B: reset backup domain
 | ||||
|         if(!RTC_CLOCK_IS_READY()) { | ||||
|             target_led_control("-R.R.R."); | ||||
|             LL_RCC_ForceBackupDomainReset(); | ||||
|             LL_RCC_ReleaseBackupDomainReset(); | ||||
|             NVIC_SystemReset(); | ||||
|         } | ||||
|         // Set RTC domain clock to LSE
 | ||||
|         LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); | ||||
|         // Enable LSE CSS
 | ||||
|         LL_RCC_LSE_EnableCSS(); | ||||
|     } | ||||
|     // Enable clocking
 | ||||
|     LL_RCC_EnableRTC(); | ||||
|     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_RTCAPB); | ||||
| } | ||||
| 
 | ||||
| void target_version_save(void) { | ||||
|     LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR1, (uint32_t)version_get()); | ||||
| } | ||||
| 
 | ||||
| void target_usb_wire_reset() { | ||||
|     LL_GPIO_ResetOutputPin(BOOT_USB_PORT, BOOT_USB_PIN); | ||||
| } | ||||
| 
 | ||||
| void target_display_init() { | ||||
|     // Prepare gpio
 | ||||
|     hal_gpio_init_simple(&gpio_display_rst, GpioModeOutputPushPull); | ||||
|     hal_gpio_init_simple(&gpio_display_di, GpioModeOutputPushPull); | ||||
|     // Initialize
 | ||||
|     u8g2_t fb; | ||||
|     u8g2_Setup_st756x_flipper(&fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32); | ||||
|     u8g2_InitDisplay(&fb); | ||||
|     // Create payload
 | ||||
|     u8g2_ClearBuffer(&fb); | ||||
|     u8g2_SetDrawColor(&fb, 0x01); | ||||
|     u8g2_DrawXBM(&fb, 0, 64 - 50, 128, 50, I_DFU_128x50); | ||||
| #ifndef SLIM_BOOTLOADER | ||||
|     u8g2_SetFont(&fb, u8g2_font_helvB08_tf); | ||||
|     u8g2_DrawStr(&fb, 2, 8, "Update & Recovery Mode"); | ||||
|     u8g2_DrawStr(&fb, 2, 21, "DFU started"); | ||||
| #endif | ||||
|     // Send buffer
 | ||||
|     u8g2_SetPowerSave(&fb, 0); | ||||
|     u8g2_SendBuffer(&fb); | ||||
| } | ||||
| 
 | ||||
| void target_init() { | ||||
|     target_clock_init(); | ||||
|     target_gpio_init(); | ||||
|     furi_hal_init(); | ||||
|     target_led_control("RGB"); | ||||
|     target_rtc_init(); | ||||
|     target_version_save(); | ||||
|     target_usb_wire_reset(); | ||||
| 
 | ||||
|     // Errata 2.2.9, Flash OPTVERR flag is always set after system reset
 | ||||
|     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); | ||||
| } | ||||
| 
 | ||||
| int target_is_dfu_requested() { | ||||
|     if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) == BOOT_REQUEST_TAINTED) { | ||||
|         // Default system state is tainted
 | ||||
|         // We must ensure that MCU is cleanly booted
 | ||||
|         LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_CLEAN); | ||||
|         NVIC_SystemReset(); | ||||
|     } else if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) == BOOT_REQUEST_DFU) { | ||||
|         return 1; | ||||
|     } | ||||
|     LL_mDelay(100); | ||||
|     if(!LL_GPIO_IsInputPinSet(BOOT_DFU_PORT, BOOT_DFU_PIN)) { | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void target_switch(void* offset) { | ||||
|     asm volatile("ldr    r3, [%0]    \n" | ||||
|                  "msr    msp, r3     \n" | ||||
|                  "ldr    r3, [%1]    \n" | ||||
|                  "mov    pc, r3      \n" | ||||
|                  : | ||||
|                  : "r"(offset), "r"(offset + 0x4) | ||||
|                  : "r3"); | ||||
| } | ||||
| 
 | ||||
| void target_switch2dfu() { | ||||
|     target_led_control("B"); | ||||
|     furi_hal_light_set(LightBacklight, 0xFF); | ||||
|     target_display_init(); | ||||
|     // Mark system as tainted, it will be soon
 | ||||
|     LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_TAINTED); | ||||
|     // Remap memory to system bootloader
 | ||||
|     LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SYSTEMFLASH); | ||||
|     // Jump
 | ||||
|     target_switch(0x0); | ||||
| } | ||||
| 
 | ||||
| void target_switch2os() { | ||||
|     target_led_control("G"); | ||||
|     SCB->VTOR = OS_OFFSET; | ||||
|     target_switch((void*)(BOOT_ADDRESS + OS_OFFSET)); | ||||
| } | ||||
| @ -1,50 +0,0 @@ | ||||
| TOOLCHAIN = arm | ||||
| 
 | ||||
| BOOT_ADDRESS	= 0x08000000 | ||||
| FW_ADDRESS		= 0x08008000 | ||||
| OS_OFFSET		= 0x00008000 | ||||
| FLASH_ADDRESS	= 0x08000000 | ||||
| 
 | ||||
| OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f ../debug/stm32wbx.cfg -c "init" | ||||
| BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET) | ||||
| MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard | ||||
| 
 | ||||
| CFLAGS			+= $(MCU_FLAGS) $(BOOT_CFLAGS) -DSTM32WB55xx -Wall -fdata-sections -ffunction-sections | ||||
| LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs  | ||||
| 
 | ||||
| HARDWARE_TARGET = 6 | ||||
| 
 | ||||
| CUBE_DIR		= $(PROJECT_ROOT)/lib/STM32CubeWB | ||||
| 
 | ||||
| # ST HAL
 | ||||
| CFLAGS			+=  -DUSE_FULL_LL_DRIVER | ||||
| ASM_SOURCES		+= $(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Source/Templates/gcc/startup_stm32wb55xx_cm4.s | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Source/Templates/system_stm32wbxx.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_utils.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_gpio.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_i2c.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_spi.c | ||||
| 
 | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/CMSIS/Include | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Include | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Inc | ||||
| 
 | ||||
| LDFLAGS			+= -T$(TARGET_DIR)/stm32wb55xx_flash_cm4.ld | ||||
| 
 | ||||
| # Drivers
 | ||||
| DRIVERS_DIR		= $(PROJECT_ROOT)//lib/drivers | ||||
| CFLAGS			+= -I$(DRIVERS_DIR) | ||||
| C_SOURCES		+= $(DRIVERS_DIR)/lp5562.c | ||||
| 
 | ||||
| # API-HAL
 | ||||
| CFLAGS			+= -I$(TARGET_DIR)/furi_hal | ||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/furi_hal/*.c) | ||||
| 
 | ||||
| # Version generation
 | ||||
| C_SOURCES		+= $(PROJECT_ROOT)/lib/toolbox/version.c | ||||
| 
 | ||||
| ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s) | ||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) | ||||
| CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) | ||||
| 
 | ||||
| SVD_FILE		= $(PROJECT_ROOT)/debug/STM32WB55_CM4.svd | ||||
| @ -16,7 +16,6 @@ typedef void (*InterruptCallback)(void*, void*); | ||||
| 
 | ||||
| /** Interupt type */ | ||||
| typedef enum { | ||||
|     InterruptTypeComparatorTrigger, | ||||
|     InterruptTypeTimerUpdate, | ||||
|     InterruptTypeLast, | ||||
| } InterruptType; | ||||
|  | ||||
| @ -1,138 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) | ||||
| #include <stdint.h> | ||||
| extern uint32_t SystemCoreClock; | ||||
| #endif | ||||
| 
 | ||||
| #ifndef CMSIS_device_header | ||||
| #define CMSIS_device_header "stm32wbxx.h" | ||||
| #endif /* CMSIS_device_header */ | ||||
| 
 | ||||
| #define configENABLE_FPU 1 | ||||
| #define configENABLE_MPU 0 | ||||
| 
 | ||||
| #define configUSE_PREEMPTION 1 | ||||
| #define configSUPPORT_STATIC_ALLOCATION 0 | ||||
| #define configSUPPORT_DYNAMIC_ALLOCATION 1 | ||||
| #define configUSE_IDLE_HOOK 0 | ||||
| #define configUSE_TICK_HOOK 0 | ||||
| #define configCPU_CLOCK_HZ (SystemCoreClock) | ||||
| #define configTICK_RATE_HZ ((TickType_t)1024) | ||||
| #define configMAX_PRIORITIES (56) | ||||
| #define configMINIMAL_STACK_SIZE ((uint16_t)128) | ||||
| 
 | ||||
| /* Heap size determined automatically by linker */ | ||||
| // #define configTOTAL_HEAP_SIZE                    ((size_t)0)
 | ||||
| #define configMAX_TASK_NAME_LEN (16) | ||||
| #define configGENERATE_RUN_TIME_STATS 0 | ||||
| #define configUSE_TRACE_FACILITY 1 | ||||
| #define configUSE_16_BIT_TICKS 0 | ||||
| #define configUSE_MUTEXES 1 | ||||
| #define configQUEUE_REGISTRY_SIZE 8 | ||||
| #define configCHECK_FOR_STACK_OVERFLOW 1 | ||||
| #define configUSE_RECURSIVE_MUTEXES 1 | ||||
| #define configUSE_COUNTING_SEMAPHORES 1 | ||||
| #define configENABLE_BACKWARD_COMPATIBILITY 0 | ||||
| #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 | ||||
| #define configUSE_TICKLESS_IDLE 2 | ||||
| #define configRECORD_STACK_HIGH_ADDRESS 1 | ||||
| #define configUSE_NEWLIB_REENTRANT 0 | ||||
| 
 | ||||
| /* Defaults to size_t for backward compatibility, but can be changed
 | ||||
|    if lengths will always be less than the number of bytes in a size_t. */ | ||||
| #define configMESSAGE_BUFFER_LENGTH_TYPE size_t | ||||
| #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 1 | ||||
| #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 4 | ||||
| 
 | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES 0 | ||||
| 
 | ||||
| /* Software timer definitions. */ | ||||
| #define configUSE_TIMERS 1 | ||||
| #define configTIMER_TASK_PRIORITY (2) | ||||
| #define configTIMER_QUEUE_LENGTH 32 | ||||
| #define configTIMER_TASK_STACK_DEPTH 256 | ||||
| #define configTIMER_SERVICE_TASK_NAME "TimersSrv" | ||||
| 
 | ||||
| #define configIDLE_TASK_NAME "(-_-)" | ||||
| 
 | ||||
| /* Set the following definitions to 1 to include the API function, or zero
 | ||||
| to exclude the API function. */ | ||||
| #define INCLUDE_xTaskGetHandle 1 | ||||
| #define INCLUDE_eTaskGetState 1 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark 1 | ||||
| #define INCLUDE_uxTaskPriorityGet 1 | ||||
| #define INCLUDE_vTaskCleanUpResources 0 | ||||
| #define INCLUDE_vTaskDelay 1 | ||||
| #define INCLUDE_vTaskDelayUntil 1 | ||||
| #define INCLUDE_vTaskDelete 1 | ||||
| #define INCLUDE_vTaskPrioritySet 1 | ||||
| #define INCLUDE_vTaskSuspend 1 | ||||
| #define INCLUDE_xQueueGetMutexHolder 1 | ||||
| #define INCLUDE_xTaskGetCurrentTaskHandle 1 | ||||
| #define INCLUDE_xTaskGetSchedulerState 1 | ||||
| #define INCLUDE_xTimerPendFunctionCall 1 | ||||
| 
 | ||||
| /* CMSIS-RTOS V2 flags */ | ||||
| #define configUSE_OS2_THREAD_SUSPEND_RESUME 1 | ||||
| #define configUSE_OS2_THREAD_ENUMERATE 1 | ||||
| #define configUSE_OS2_EVENTFLAGS_FROM_ISR 1 | ||||
| #define configUSE_OS2_THREAD_FLAGS 1 | ||||
| #define configUSE_OS2_TIMER 1 | ||||
| #define configUSE_OS2_MUTEX 1 | ||||
| 
 | ||||
| /* CMSIS-RTOS */ | ||||
| #define configTASK_NOTIFICATION_ARRAY_ENTRIES 2 | ||||
| #define CMSIS_TASK_NOTIFY_INDEX 1 | ||||
| 
 | ||||
| /*
 | ||||
|  * The CMSIS-RTOS V2 FreeRTOS wrapper is dependent on the heap implementation used | ||||
|  * by the application thus the correct define need to be enabled below | ||||
|  */ | ||||
| #define USE_FreeRTOS_HEAP_4 | ||||
| 
 | ||||
| /* Cortex-M specific definitions. */ | ||||
| #ifdef __NVIC_PRIO_BITS | ||||
| /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ | ||||
| #define configPRIO_BITS __NVIC_PRIO_BITS | ||||
| #else | ||||
| #define configPRIO_BITS 4 | ||||
| #endif | ||||
| 
 | ||||
| /* The lowest interrupt priority that can be used in a call to a "set priority"
 | ||||
| function. */ | ||||
| #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 | ||||
| 
 | ||||
| /* The highest interrupt priority that can be used by any interrupt service
 | ||||
| routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL | ||||
| INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER | ||||
| PRIORITY THAN THIS! (higher priorities are lower numeric values. */ | ||||
| #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 | ||||
| 
 | ||||
| /* Interrupt priorities used by the kernel port layer itself.  These are generic
 | ||||
| to all Cortex-M ports, and do not rely on any particular library functions. */ | ||||
| #define configKERNEL_INTERRUPT_PRIORITY \ | ||||
|     (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) | ||||
| 
 | ||||
| /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
 | ||||
| See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
 | ||||
| #define configMAX_SYSCALL_INTERRUPT_PRIORITY \ | ||||
|     (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) | ||||
| 
 | ||||
| /* Normal assert() semantics without relying on the provision of an assert.h
 | ||||
| header file. */ | ||||
| #include <furi/check.h> | ||||
| #define configASSERT(x)                \ | ||||
|     if((x) == 0) {                     \ | ||||
|         furi_crash("FreeRTOS Assert"); \ | ||||
|     } | ||||
| 
 | ||||
| /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
 | ||||
| standard names. */ | ||||
| #define vPortSVCHandler SVC_Handler | ||||
| #define xPortPendSVHandler PendSV_Handler | ||||
| 
 | ||||
| #define USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION 1 | ||||
| #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION \ | ||||
|     1 /* required only for Keil but does not hurt otherwise */ | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    comp.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the comp.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __COMP_H__ | ||||
| #define __COMP_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_COMP1_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __COMP_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,49 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    gpio.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the gpio.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __GPIO_H__ | ||||
| #define __GPIO_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_GPIO_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif /*__ GPIO_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,149 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "stm32wbxx_hal.h" | ||||
| 
 | ||||
| void Error_Handler(void); | ||||
| 
 | ||||
| #define BUTTON_BACK_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define BUTTON_BACK_GPIO_Port GPIOC | ||||
| #define BUTTON_BACK_Pin GPIO_PIN_13 | ||||
| #define BUTTON_DOWN_EXTI_IRQn EXTI6_IRQn | ||||
| #define BUTTON_DOWN_GPIO_Port GPIOC | ||||
| #define BUTTON_DOWN_Pin GPIO_PIN_6 | ||||
| #define BUTTON_LEFT_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define BUTTON_LEFT_GPIO_Port GPIOB | ||||
| #define BUTTON_LEFT_Pin GPIO_PIN_11 | ||||
| #define BUTTON_OK_EXTI_IRQn EXTI3_IRQn | ||||
| #define BUTTON_OK_GPIO_Port GPIOH | ||||
| #define BUTTON_OK_Pin GPIO_PIN_3 | ||||
| #define BUTTON_RIGHT_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define BUTTON_RIGHT_GPIO_Port GPIOB | ||||
| #define BUTTON_RIGHT_Pin GPIO_PIN_12 | ||||
| #define BUTTON_UP_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define BUTTON_UP_GPIO_Port GPIOB | ||||
| #define BUTTON_UP_Pin GPIO_PIN_10 | ||||
| 
 | ||||
| #define CC1101_CS_GPIO_Port GPIOD | ||||
| #define CC1101_CS_Pin GPIO_PIN_0 | ||||
| #define CC1101_G0_GPIO_Port GPIOA | ||||
| #define CC1101_G0_Pin GPIO_PIN_1 | ||||
| 
 | ||||
| #define DISPLAY_CS_GPIO_Port GPIOC | ||||
| #define DISPLAY_CS_Pin GPIO_PIN_11 | ||||
| #define DISPLAY_DI_GPIO_Port GPIOB | ||||
| #define DISPLAY_DI_Pin GPIO_PIN_1 | ||||
| #define DISPLAY_RST_GPIO_Port GPIOB | ||||
| #define DISPLAY_RST_Pin GPIO_PIN_0 | ||||
| 
 | ||||
| #define IR_RX_GPIO_Port GPIOA | ||||
| #define IR_RX_Pin GPIO_PIN_0 | ||||
| #define IR_TX_GPIO_Port GPIOB | ||||
| #define IR_TX_Pin GPIO_PIN_9 | ||||
| 
 | ||||
| #define NFC_CS_GPIO_Port GPIOE | ||||
| #define NFC_CS_Pin GPIO_PIN_4 | ||||
| 
 | ||||
| #define PA4_GPIO_Port GPIOA | ||||
| #define PA4_Pin GPIO_PIN_4 | ||||
| #define PA6_GPIO_Port GPIOA | ||||
| #define PA6_Pin GPIO_PIN_6 | ||||
| #define PA7_GPIO_Port GPIOA | ||||
| #define PA7_Pin GPIO_PIN_7 | ||||
| #define PB2_GPIO_Port GPIOB | ||||
| #define PB2_Pin GPIO_PIN_2 | ||||
| #define PB3_GPIO_Port GPIOB | ||||
| #define PB3_Pin GPIO_PIN_3 | ||||
| #define PC0_GPIO_Port GPIOC | ||||
| #define PC0_Pin GPIO_PIN_0 | ||||
| #define PC1_GPIO_Port GPIOC | ||||
| #define PC1_Pin GPIO_PIN_1 | ||||
| #define PC3_GPIO_Port GPIOC | ||||
| #define PC3_Pin GPIO_PIN_3 | ||||
| 
 | ||||
| #define PERIPH_POWER_GPIO_Port GPIOA | ||||
| #define PERIPH_POWER_Pin GPIO_PIN_3 | ||||
| 
 | ||||
| #define QUARTZ_32MHZ_IN_GPIO_Port GPIOC | ||||
| #define QUARTZ_32MHZ_IN_Pin GPIO_PIN_14 | ||||
| #define QUARTZ_32MHZ_OUT_GPIO_Port GPIOC | ||||
| #define QUARTZ_32MHZ_OUT_Pin GPIO_PIN_15 | ||||
| 
 | ||||
| #define RFID_OUT_GPIO_Port GPIOB | ||||
| #define RFID_OUT_Pin GPIO_PIN_13 | ||||
| #define RFID_PULL_GPIO_Port GPIOA | ||||
| #define RFID_PULL_Pin GPIO_PIN_2 | ||||
| #define RFID_RF_IN_GPIO_Port GPIOC | ||||
| #define RFID_RF_IN_Pin GPIO_PIN_5 | ||||
| #define RFID_TUNE_GPIO_Port GPIOA | ||||
| #define RFID_TUNE_Pin GPIO_PIN_8 | ||||
| 
 | ||||
| #define RF_SW_0_GPIO_Port GPIOC | ||||
| #define RF_SW_0_Pin GPIO_PIN_4 | ||||
| 
 | ||||
| #define SD_CD_GPIO_Port GPIOC | ||||
| #define SD_CD_Pin GPIO_PIN_10 | ||||
| #define SD_CS_GPIO_Port GPIOC | ||||
| #define SD_CS_Pin GPIO_PIN_12 | ||||
| 
 | ||||
| #define SPEAKER_GPIO_Port GPIOB | ||||
| #define SPEAKER_Pin GPIO_PIN_8 | ||||
| 
 | ||||
| #define VIBRO_GPIO_Port GPIOA | ||||
| #define VIBRO_Pin GPIO_PIN_15 | ||||
| 
 | ||||
| #define iBTN_GPIO_Port GPIOB | ||||
| #define iBTN_Pin GPIO_PIN_14 | ||||
| 
 | ||||
| #define USART1_TX_Pin GPIO_PIN_6 | ||||
| #define USART1_TX_Port GPIOB | ||||
| #define USART1_RX_Pin GPIO_PIN_7 | ||||
| #define USART1_RX_Port GPIOB | ||||
| 
 | ||||
| #define SPI_D_MISO_GPIO_Port GPIOC | ||||
| #define SPI_D_MISO_Pin GPIO_PIN_2 | ||||
| #define SPI_D_MOSI_GPIO_Port GPIOB | ||||
| #define SPI_D_MOSI_Pin GPIO_PIN_15 | ||||
| #define SPI_D_SCK_GPIO_Port GPIOD | ||||
| #define SPI_D_SCK_Pin GPIO_PIN_1 | ||||
| 
 | ||||
| #define SPI_R_MISO_GPIO_Port GPIOB | ||||
| #define SPI_R_MISO_Pin GPIO_PIN_4 | ||||
| #define SPI_R_MOSI_GPIO_Port GPIOB | ||||
| #define SPI_R_MOSI_Pin GPIO_PIN_5 | ||||
| #define SPI_R_SCK_GPIO_Port GPIOA | ||||
| #define SPI_R_SCK_Pin GPIO_PIN_5 | ||||
| 
 | ||||
| extern TIM_HandleTypeDef htim1; | ||||
| extern TIM_HandleTypeDef htim2; | ||||
| extern TIM_HandleTypeDef htim16; | ||||
| 
 | ||||
| #define TIM_A htim1 | ||||
| #define TIM_B htim2 | ||||
| #define TIM_C htim16 | ||||
| 
 | ||||
| #define SPEAKER_TIM htim16 | ||||
| #define SPEAKER_CH TIM_CHANNEL_1 | ||||
| 
 | ||||
| #define LFRFID_TIM htim1 | ||||
| #define LFRFID_CH TIM_CHANNEL_1 | ||||
| 
 | ||||
| #define INFRARED_TX_TIM htim1 | ||||
| #define INFRARED_TX_CH TIM_CHANNEL_3 | ||||
| 
 | ||||
| // only for reference
 | ||||
| // INFRARED RX timer dont exist in F2
 | ||||
| // and timer need more data to init (NVIC IRQn to set priority)
 | ||||
| #define INFRARED_RX_TIM htim2 | ||||
| #define INFRARED_RX_FALLING_CH TIM_CHANNEL_1 | ||||
| #define INFRARED_RX_RISING_CH TIM_CHANNEL_2 | ||||
| 
 | ||||
| #define NFC_IRQ_Pin RFID_PULL_Pin | ||||
| #define NFC_IRQ_GPIO_Port RFID_PULL_GPIO_Port | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,51 +0,0 @@ | ||||
| #ifndef _STM32_H_ | ||||
| #define _STM32_H_ | ||||
| 
 | ||||
| /* modify bitfield */ | ||||
| #define _BMD(reg, msk, val) (reg) = (((reg) & ~(msk)) | (val)) | ||||
| /* set bitfield */ | ||||
| #define _BST(reg, bits) (reg) = ((reg) | (bits)) | ||||
| /* clear bitfield */ | ||||
| #define _BCL(reg, bits) (reg) = ((reg) & ~(bits)) | ||||
| /* wait until bitfield set */ | ||||
| #define _WBS(reg, bits) while(((reg) & (bits)) == 0) | ||||
| /* wait until bitfield clear */ | ||||
| #define _WBC(reg, bits) while(((reg) & (bits)) != 0) | ||||
| /* wait for bitfield value */ | ||||
| #define _WVL(reg, msk, val) while(((reg) & (msk)) != (val)) | ||||
| /* bit value */ | ||||
| #define _BV(bit) (0x01 << (bit)) | ||||
| 
 | ||||
| #if defined(STM32F0) | ||||
| #include "STM32F0xx/Include/stm32f0xx.h" | ||||
| #elif defined(STM32F1) | ||||
| #include "STM32F1xx/Include/stm32f1xx.h" | ||||
| #elif defined(STM32F2) | ||||
| #include "STM32F2xx/Include/stm32f2xx.h" | ||||
| #elif defined(STM32F3) | ||||
| #include "STM32F3xx/Include/stm32f3xx.h" | ||||
| #elif defined(STM32F4) | ||||
| #include "STM32F4xx/Include/stm32f4xx.h" | ||||
| #elif defined(STM32F7) | ||||
| #include "STM32F7xx/Include/stm32f7xx.h" | ||||
| #elif defined(STM32H7) | ||||
| #include "STM32H7xx/Include/stm32h7xx.h" | ||||
| #elif defined(STM32L0) | ||||
| #include "STM32L0xx/Include/stm32l0xx.h" | ||||
| #elif defined(STM32L1) | ||||
| #include "STM32L1xx/Include/stm32l1xx.h" | ||||
| #elif defined(STM32L4) | ||||
| #include "STM32L4xx/Include/stm32l4xx.h" | ||||
| #elif defined(STM32L5) | ||||
| #include "STM32L5xx/Include/stm32l5xx.h" | ||||
| #elif defined(STM32G0) | ||||
| #include "STM32G0xx/Include/stm32g0xx.h" | ||||
| #elif defined(STM32G4) | ||||
| #include "STM32G4xx/Include/stm32g4xx.h" | ||||
| #elif defined(STM32WB) | ||||
| #include "STM32WBxx/Include/stm32wbxx.h" | ||||
| #else | ||||
| #error "STM32 family not defined" | ||||
| #endif | ||||
| 
 | ||||
| #endif // _STM32_H_
 | ||||
| @ -1,40 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32_assert.h | ||||
|   * @brief   STM32 assert file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32_ASSERT_H | ||||
| #define __STM32_ASSERT_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_FULL_ASSERT | ||||
| #define assert_param(expr) ((expr) ? (void)0U : assert_failed()) | ||||
| void assert_failed(); | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __STM32_ASSERT_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,345 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32wbxx_hal_conf.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   HAL configuration file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32WBxx_HAL_CONF_H | ||||
| #define __STM32WBxx_HAL_CONF_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| 
 | ||||
| /* ########################## Module Selection ############################## */ | ||||
| /**
 | ||||
|   * @brief This is the list of modules to be used in the HAL driver | ||||
|   */ | ||||
| #define HAL_MODULE_ENABLED | ||||
| /*#define HAL_ADC_MODULE_ENABLED    */ | ||||
| #define HAL_CRYP_MODULE_ENABLED | ||||
| #define HAL_COMP_MODULE_ENABLED | ||||
| /*#define HAL_CRC_MODULE_ENABLED    */ | ||||
| #define HAL_HSEM_MODULE_ENABLED | ||||
| /*#define HAL_I2C_MODULE_ENABLED    */ | ||||
| /*#define HAL_IPCC_MODULE_ENABLED   */ | ||||
| /*#define HAL_IRDA_MODULE_ENABLED   */ | ||||
| /*#define HAL_IWDG_MODULE_ENABLED   */ | ||||
| /*#define HAL_LCD_MODULE_ENABLED    */ | ||||
| /*#define HAL_LPTIM_MODULE_ENABLED  */ | ||||
| #define HAL_PCD_MODULE_ENABLED | ||||
| #define HAL_PKA_MODULE_ENABLED | ||||
| /*#define HAL_QSPI_MODULE_ENABLED   */ | ||||
| #define HAL_RNG_MODULE_ENABLED | ||||
| /*#define HAL_RTC_MODULE_ENABLED    */ | ||||
| /*#define HAL_SAI_MODULE_ENABLED    */ | ||||
| /*#define HAL_SMBUS_MODULE_ENABLED  */ | ||||
| /*#define HAL_SMARTCARD_MODULE_ENABLED   */ | ||||
| /*#define HAL_SPI_MODULE_ENABLED    */ | ||||
| #define HAL_TIM_MODULE_ENABLED | ||||
| /*#define HAL_TSC_MODULE_ENABLED    */ | ||||
| /*#define HAL_UART_MODULE_ENABLED   */ | ||||
| /*#define HAL_USART_MODULE_ENABLED  */ | ||||
| /*#define HAL_WWDG_MODULE_ENABLED   */ | ||||
| #define HAL_EXTI_MODULE_ENABLED | ||||
| #define HAL_CORTEX_MODULE_ENABLED | ||||
| #define HAL_DMA_MODULE_ENABLED | ||||
| #define HAL_FLASH_MODULE_ENABLED | ||||
| #define HAL_GPIO_MODULE_ENABLED | ||||
| #define HAL_PWR_MODULE_ENABLED | ||||
| #define HAL_RCC_MODULE_ENABLED | ||||
| 
 | ||||
| #define USE_HAL_ADC_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_COMP_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_CRYP_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_I2C_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_IRDA_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_PCD_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_PKA_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_QSPI_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_RNG_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_RTC_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SAI_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SPI_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_TIM_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_TSC_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_UART_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_USART_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_WWDG_REGISTER_CALLBACKS 0u | ||||
| 
 | ||||
| /* ########################## Oscillator Values adaptation ####################*/ | ||||
| /**
 | ||||
|   * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. | ||||
|   *        This value is used by the RCC HAL module to compute the system frequency | ||||
|   *        (when HSE is used as system clock source, directly or through the PLL). | ||||
|   */ | ||||
| #if !defined(HSE_VALUE) | ||||
| #define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */ | ||||
| #endif /* HSE_VALUE */ | ||||
| 
 | ||||
| #if !defined(HSE_STARTUP_TIMEOUT) | ||||
| #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ | ||||
| #endif /* HSE_STARTUP_TIMEOUT */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal Multiple Speed oscillator (MSI) default value. | ||||
|   *        This value is the default MSI range value after Reset. | ||||
|   */ | ||||
| #if !defined(MSI_VALUE) | ||||
| #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* MSI_VALUE */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal High Speed oscillator (HSI) value. | ||||
|   *        This value is used by the RCC HAL module to compute the system frequency | ||||
|   *        (when HSI is used as system clock source, directly or through the PLL). | ||||
|   */ | ||||
| #if !defined(HSI_VALUE) | ||||
| #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* HSI_VALUE */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal Low Speed oscillator (LSI1) value. | ||||
|   */ | ||||
| #if !defined(LSI1_VALUE) | ||||
| #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/ | ||||
| #endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz | ||||
|                                              The real value may vary depending on the variations | ||||
|                                              in voltage and temperature.*/ | ||||
| /**
 | ||||
|   * @brief Internal Low Speed oscillator (LSI2) value. | ||||
|   */ | ||||
| #if !defined(LSI2_VALUE) | ||||
| #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/ | ||||
| #endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz | ||||
|                                              The real value may vary depending on the variations | ||||
|                                              in voltage and temperature.*/ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief External Low Speed oscillator (LSE) value. | ||||
|   *        This value is used by the UART, RTC HAL module to compute the system frequency | ||||
|   */ | ||||
| #if !defined(LSE_VALUE) | ||||
| #define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/ | ||||
| #endif /* LSE_VALUE */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal Multiple Speed oscillator (HSI48) default value. | ||||
|   *        This value is the default HSI48 range value after Reset. | ||||
|   */ | ||||
| #if !defined(HSI48_VALUE) | ||||
| #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* HSI48_VALUE */ | ||||
| 
 | ||||
| #if !defined(LSE_STARTUP_TIMEOUT) | ||||
| #define LSE_STARTUP_TIMEOUT 1000U /*!< Time out for LSE start up, in ms */ | ||||
| #endif /* HSE_STARTUP_TIMEOUT */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief External clock source for SAI1 peripheral | ||||
|   *        This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source | ||||
|   *        frequency. | ||||
|   */ | ||||
| #if !defined(EXTERNAL_SAI1_CLOCK_VALUE) | ||||
| #define EXTERNAL_SAI1_CLOCK_VALUE \ | ||||
|     ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/ | ||||
| #endif /* EXTERNAL_SAI1_CLOCK_VALUE */ | ||||
| 
 | ||||
| /* Tip: To avoid modifying this file each time you need to use different HSE,
 | ||||
|    ===  you can define the HSE value in your toolchain compiler preprocessor. */ | ||||
| 
 | ||||
| /* ########################### System Configuration ######################### */ | ||||
| /**
 | ||||
|   * @brief This is the HAL system configuration section | ||||
|   */ | ||||
| 
 | ||||
| #define VDD_VALUE 3300U /*!< Value of VDD in mv */ | ||||
| #define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */ | ||||
| #define USE_RTOS 0U | ||||
| #define PREFETCH_ENABLE 1U | ||||
| #define INSTRUCTION_CACHE_ENABLE 1U | ||||
| #define DATA_CACHE_ENABLE 1U | ||||
| 
 | ||||
| /* ########################## Assert Selection ############################## */ | ||||
| /**
 | ||||
|   * @brief Uncomment the line below to expanse the "assert_param" macro in the | ||||
|   *        HAL drivers code | ||||
|   */ | ||||
| #define USE_FULL_ASSERT 1U | ||||
| 
 | ||||
| /* ################## SPI peripheral configuration ########################## */ | ||||
| 
 | ||||
| /* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
 | ||||
|  * Activated: CRC code is present inside driver | ||||
|  * Deactivated: CRC code cleaned from driver | ||||
|  */ | ||||
| 
 | ||||
| #define USE_SPI_CRC 0U | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| /**
 | ||||
|   * @brief Include module's header file | ||||
|   */ | ||||
| #ifdef HAL_DMA_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_dma.h" | ||||
| #endif /* HAL_DMA_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_ADC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_adc.h" | ||||
| #endif /* HAL_ADC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_COMP_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_comp.h" | ||||
| #endif /* HAL_COMP_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_CORTEX_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_cortex.h" | ||||
| #endif /* HAL_CORTEX_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_CRC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_crc.h" | ||||
| #endif /* HAL_CRC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_CRYP_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_cryp.h" | ||||
| #endif /* HAL_CRYP_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_EXTI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_exti.h" | ||||
| #endif /* HAL_EXTI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_FLASH_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_flash.h" | ||||
| #endif /* HAL_FLASH_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_GPIO_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_gpio.h" | ||||
| #endif /* HAL_GPIO_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_HSEM_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_hsem.h" | ||||
| #endif /* HAL_HSEM_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_I2C_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_i2c.h" | ||||
| #endif /* HAL_I2C_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_IPCC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_ipcc.h" | ||||
| #endif /* HAL_IPCC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_IRDA_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_irda.h" | ||||
| #endif /* HAL_IRDA_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_IWDG_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_iwdg.h" | ||||
| #endif /* HAL_IWDG_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_LCD_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_lcd.h" | ||||
| #endif /* HAL_LCD_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_LPTIM_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_lptim.h" | ||||
| #endif /* HAL_LPTIM_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_PCD_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_pcd.h" | ||||
| #endif /* HAL_PCD_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_PKA_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_pka.h" | ||||
| #endif /* HAL_PKA_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_PWR_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_pwr.h" | ||||
| #endif /* HAL_PWR_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_QSPI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_qspi.h" | ||||
| #endif /* HAL_QSPI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_RCC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_rcc.h" | ||||
| #endif /* HAL_RCC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_RNG_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_rng.h" | ||||
| #endif /* HAL_RNG_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_RTC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_rtc.h" | ||||
| #endif /* HAL_RTC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SAI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_sai.h" | ||||
| #endif /* HAL_SAI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SMARTCARD_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_smartcard.h" | ||||
| #endif /* HAL_SMARTCARD_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SMBUS_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_smbus.h" | ||||
| #endif /* HAL_SMBUS_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SPI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_spi.h" | ||||
| #endif /* HAL_SPI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_TIM_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_tim.h" | ||||
| #endif /* HAL_TIM_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_TSC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_tsc.h" | ||||
| #endif /* HAL_TSC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_UART_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_uart.h" | ||||
| #endif /* HAL_UART_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_USART_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_usart.h" | ||||
| #endif /* HAL_USART_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_WWDG_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_wwdg.h" | ||||
| #endif /* HAL_WWDG_MODULE_ENABLED */ | ||||
| 
 | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| #ifdef USE_FULL_ASSERT | ||||
| #define assert_param(expr) ((expr) ? (void)0U : assert_failed()) | ||||
| void assert_failed(); | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __STM32WBxx_HAL_CONF_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,69 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32wbxx_it.h | ||||
|   * @brief   This file contains the headers of the interrupt handlers. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|  ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32WBxx_IT_H | ||||
| #define __STM32WBxx_IT_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN ET */ | ||||
| 
 | ||||
| /* USER CODE END ET */ | ||||
| 
 | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN EC */ | ||||
| 
 | ||||
| /* USER CODE END EC */ | ||||
| 
 | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN EM */ | ||||
| 
 | ||||
| /* USER CODE END EM */ | ||||
| 
 | ||||
| /* Exported functions prototypes ---------------------------------------------*/ | ||||
| void SysTick_Handler(void); | ||||
| void ADC1_IRQHandler(void); | ||||
| void USB_LP_IRQHandler(void); | ||||
| void COMP_IRQHandler(void); | ||||
| void TIM1_UP_TIM16_IRQHandler(void); | ||||
| void TIM1_TRG_COM_TIM17_IRQHandler(void); | ||||
| void TIM1_CC_IRQHandler(void); | ||||
| void TIM2_IRQHandler(void); | ||||
| void HSEM_IRQHandler(void); | ||||
| /* USER CODE BEGIN EFP */ | ||||
| 
 | ||||
| /* USER CODE END EFP */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __STM32WBxx_IT_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,58 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    tim.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the tim.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __TIM_H__ | ||||
| #define __TIM_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern TIM_HandleTypeDef htim1; | ||||
| extern TIM_HandleTypeDef htim2; | ||||
| extern TIM_HandleTypeDef htim16; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_TIM1_Init(void); | ||||
| void MX_TIM2_Init(void); | ||||
| void MX_TIM16_Init(void); | ||||
| 
 | ||||
| void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __TIM_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,93 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    comp.c | ||||
|   * @brief   This file provides code for the configuration | ||||
|   *          of the COMP instances. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "comp.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN 0 */ | ||||
| 
 | ||||
| /* USER CODE END 0 */ | ||||
| 
 | ||||
| COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| /* COMP1 init function */ | ||||
| void MX_COMP1_Init(void) { | ||||
|     hcomp1.Instance = COMP1; | ||||
|     hcomp1.Init.InputMinus = COMP_INPUT_MINUS_1_4VREFINT; | ||||
|     hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1; | ||||
|     hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED; | ||||
|     hcomp1.Init.Hysteresis = COMP_HYSTERESIS_HIGH; | ||||
|     hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE; | ||||
|     hcomp1.Init.Mode = COMP_POWERMODE_MEDIUMSPEED; | ||||
|     hcomp1.Init.WindowMode = COMP_WINDOWMODE_DISABLE; | ||||
|     hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING_FALLING; | ||||
|     if(HAL_COMP_Init(&hcomp1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void HAL_COMP_MspInit(COMP_HandleTypeDef* compHandle) { | ||||
|     GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|     if(compHandle->Instance == COMP1) { | ||||
|         /* USER CODE BEGIN COMP1_MspInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END COMP1_MspInit 0 */ | ||||
| 
 | ||||
|         __HAL_RCC_GPIOC_CLK_ENABLE(); | ||||
|         /**COMP1 GPIO Configuration
 | ||||
|     PC5     ------> COMP1_INP | ||||
|     */ | ||||
|         GPIO_InitStruct.Pin = RFID_RF_IN_Pin; | ||||
|         GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | ||||
|         GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|         HAL_GPIO_Init(RFID_RF_IN_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|         /* COMP1 interrupt Init */ | ||||
|         HAL_NVIC_SetPriority(COMP_IRQn, 5, 0); | ||||
|         HAL_NVIC_EnableIRQ(COMP_IRQn); | ||||
|         /* USER CODE BEGIN COMP1_MspInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END COMP1_MspInit 1 */ | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void HAL_COMP_MspDeInit(COMP_HandleTypeDef* compHandle) { | ||||
|     if(compHandle->Instance == COMP1) { | ||||
|         /* USER CODE BEGIN COMP1_MspDeInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END COMP1_MspDeInit 0 */ | ||||
| 
 | ||||
|         /**COMP1 GPIO Configuration
 | ||||
|     PC5     ------> COMP1_INP | ||||
|     */ | ||||
|         HAL_GPIO_DeInit(RFID_RF_IN_GPIO_Port, RFID_RF_IN_Pin); | ||||
| 
 | ||||
|         /* COMP1 interrupt Deinit */ | ||||
|         HAL_NVIC_DisableIRQ(COMP_IRQn); | ||||
|         /* USER CODE BEGIN COMP1_MspDeInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END COMP1_MspDeInit 1 */ | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /* USER CODE BEGIN 1 */ | ||||
| 
 | ||||
| /* USER CODE END 1 */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,139 +0,0 @@ | ||||
| #include "gpio.h" | ||||
| 
 | ||||
| void MX_GPIO_Init(void) { | ||||
|     GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
| 
 | ||||
|     /* GPIO Ports Clock Enable */ | ||||
|     __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOC_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOD_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOE_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOH_CLK_ENABLE(); | ||||
| 
 | ||||
|     /*Configure GPIO pin : PtPin */ | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; | ||||
|     GPIO_InitStruct.Pull = GPIO_PULLUP; | ||||
|     GPIO_InitStruct.Pin = BUTTON_BACK_Pin; | ||||
|     HAL_GPIO_Init(BUTTON_BACK_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /*Configure GPIO pin : PtPin */ | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Pin = BUTTON_OK_Pin; | ||||
|     HAL_GPIO_Init(BUTTON_OK_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /*Configure GPIO pins : PCPin PCPin PCPin PCPin */ | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Pin = PC0_Pin; | ||||
|     HAL_GPIO_Init(PC0_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = PC1_Pin; | ||||
|     HAL_GPIO_Init(PC1_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = PC3_Pin; | ||||
|     HAL_GPIO_Init(PC3_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = VIBRO_Pin; | ||||
|     HAL_GPIO_Init(VIBRO_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /* RF_SW_0 */ | ||||
|     HAL_GPIO_WritePin(RF_SW_0_GPIO_Port, RF_SW_0_Pin, GPIO_PIN_RESET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Pin = RF_SW_0_Pin; | ||||
|     HAL_GPIO_Init(RF_SW_0_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /* PERIPH_POWER */ | ||||
|     HAL_GPIO_WritePin(PERIPH_POWER_GPIO_Port, PERIPH_POWER_Pin, GPIO_PIN_SET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Pin = PERIPH_POWER_Pin; | ||||
|     HAL_GPIO_Init(PERIPH_POWER_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /*Configure GPIO pins : PAPin PAPin PAPin */ | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Pin = PA4_Pin; | ||||
|     HAL_GPIO_Init(PA4_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = PA6_Pin; | ||||
|     HAL_GPIO_Init(PA6_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = PA7_Pin; | ||||
|     HAL_GPIO_Init(PA7_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /*Configure GPIO pin : PtPin */ | ||||
|     GPIO_InitStruct.Pin = RFID_PULL_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     HAL_GPIO_Init(RFID_PULL_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /*Configure GPIO pins : PBPin PBPin PBPin */ | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Pin = PB2_Pin; | ||||
|     HAL_GPIO_Init(PB2_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = iBTN_Pin; | ||||
|     HAL_GPIO_Init(iBTN_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = PB3_Pin; | ||||
|     HAL_GPIO_Init(PB3_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /*Configure GPIO pins : PBPin PBPin PBPin PBPin */ | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; | ||||
|     GPIO_InitStruct.Pull = GPIO_PULLUP; | ||||
|     GPIO_InitStruct.Pin = BUTTON_UP_Pin; | ||||
|     HAL_GPIO_Init(BUTTON_UP_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = BUTTON_LEFT_Pin; | ||||
|     HAL_GPIO_Init(BUTTON_LEFT_GPIO_Port, &GPIO_InitStruct); | ||||
|     GPIO_InitStruct.Pin = BUTTON_RIGHT_Pin; | ||||
|     HAL_GPIO_Init(BUTTON_RIGHT_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /*Configure GPIO pins : PBPin PBPin PBPin PBPin */ | ||||
|     GPIO_InitStruct.Pin = BUTTON_DOWN_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; | ||||
|     GPIO_InitStruct.Pull = GPIO_PULLUP; | ||||
|     HAL_GPIO_Init(BUTTON_DOWN_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /* DISPLAY_RST */ | ||||
|     HAL_GPIO_WritePin(DISPLAY_RST_GPIO_Port, DISPLAY_RST_Pin, GPIO_PIN_RESET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Pin = DISPLAY_RST_Pin; | ||||
|     HAL_GPIO_Init(DISPLAY_RST_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /* DISPLAY_DI */ | ||||
|     HAL_GPIO_WritePin(DISPLAY_DI_GPIO_Port, DISPLAY_DI_Pin, GPIO_PIN_RESET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Pin = DISPLAY_DI_Pin; | ||||
|     HAL_GPIO_Init(DISPLAY_DI_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /* SD_CD */ | ||||
|     GPIO_InitStruct.Pin = SD_CD_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_INPUT; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     HAL_GPIO_Init(SD_CD_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|     /* Enable all NVIC lines related to gpio */ | ||||
|     HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI0_IRQn); | ||||
| 
 | ||||
|     HAL_NVIC_SetPriority(EXTI1_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI1_IRQn); | ||||
| 
 | ||||
|     HAL_NVIC_SetPriority(EXTI2_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI2_IRQn); | ||||
| 
 | ||||
|     HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI3_IRQn); | ||||
| 
 | ||||
|     HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI4_IRQn); | ||||
| 
 | ||||
|     HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); | ||||
| 
 | ||||
|     HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); | ||||
| } | ||||
| @ -1,51 +0,0 @@ | ||||
| #include "main.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| #include <furi_hal.h> | ||||
| #include <flipper.h> | ||||
| 
 | ||||
| #define TAG "Main" | ||||
| 
 | ||||
| int main(void) { | ||||
|     // Flipper critical FURI HAL
 | ||||
|     furi_hal_init_critical(); | ||||
| 
 | ||||
|     // Initialize FURI layer
 | ||||
|     furi_init(); | ||||
| 
 | ||||
|     // Initialize ST HAL
 | ||||
|     HAL_Init(); | ||||
| 
 | ||||
|     // Flipper FURI HAL
 | ||||
|     furi_hal_init(); | ||||
| 
 | ||||
|     // CMSIS initialization
 | ||||
|     osKernelInitialize(); | ||||
|     FURI_LOG_I(TAG, "KERNEL OK"); | ||||
| 
 | ||||
|     // Init flipper
 | ||||
|     flipper_init(); | ||||
| 
 | ||||
|     // Start kernel
 | ||||
|     osKernelStart(); | ||||
| 
 | ||||
|     while(1) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Error_Handler(void) { | ||||
|     furi_crash("ErrorHandler"); | ||||
| } | ||||
| 
 | ||||
| #ifdef USE_FULL_ASSERT | ||||
| /**
 | ||||
|     * @brief  Reports the name of the source file and the source line number | ||||
|     *         where the assert_param error has occurred. | ||||
|     * @param  file: pointer to the source file name | ||||
|     * @param  line: assert_param error line source number | ||||
|     * @retval None | ||||
|     */ | ||||
| void assert_failed(uint8_t* file, uint32_t line) { | ||||
|     furi_crash("HAL assert failed"); | ||||
| } | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
| @ -1,92 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * File Name          : stm32wbxx_hal_msp.c | ||||
|   * Description        : This file provides code for the MSP Initialization | ||||
|   *                      and de-Initialization codes. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN TD */ | ||||
| 
 | ||||
| /* USER CODE END TD */ | ||||
| 
 | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Define */ | ||||
| 
 | ||||
| /* USER CODE END Define */ | ||||
| 
 | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Macro */ | ||||
| 
 | ||||
| /* USER CODE END Macro */ | ||||
| 
 | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PV */ | ||||
| 
 | ||||
| /* USER CODE END PV */ | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* USER CODE BEGIN PFP */ | ||||
| 
 | ||||
| /* USER CODE END PFP */ | ||||
| 
 | ||||
| /* External functions --------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN ExternalFunctions */ | ||||
| 
 | ||||
| /* USER CODE END ExternalFunctions */ | ||||
| 
 | ||||
| /* USER CODE BEGIN 0 */ | ||||
| 
 | ||||
| /* USER CODE END 0 */ | ||||
| /**
 | ||||
|   * Initializes the Global MSP. | ||||
|   */ | ||||
| void HAL_MspInit(void) { | ||||
|     /* USER CODE BEGIN MspInit 0 */ | ||||
| 
 | ||||
|     /* USER CODE END MspInit 0 */ | ||||
| 
 | ||||
|     __HAL_RCC_HSEM_CLK_ENABLE(); | ||||
| 
 | ||||
|     /* System interrupt init*/ | ||||
|     /* PendSV_IRQn interrupt configuration */ | ||||
|     HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); | ||||
| 
 | ||||
|     /* Peripheral interrupt init */ | ||||
|     /* RCC_IRQn interrupt configuration */ | ||||
|     HAL_NVIC_SetPriority(RCC_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(RCC_IRQn); | ||||
|     /* HSEM_IRQn interrupt configuration */ | ||||
|     HAL_NVIC_SetPriority(HSEM_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(HSEM_IRQn); | ||||
| 
 | ||||
|     /* USER CODE BEGIN MspInit 1 */ | ||||
| 
 | ||||
|     /* USER CODE END MspInit 1 */ | ||||
| } | ||||
| 
 | ||||
| /* USER CODE BEGIN 1 */ | ||||
| 
 | ||||
| /* USER CODE END 1 */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,48 +0,0 @@ | ||||
| #include "main.h" | ||||
| #include "stm32wbxx_it.h" | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "usbd_core.h" | ||||
| 
 | ||||
| extern usbd_device udev; | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| extern TIM_HandleTypeDef htim1; | ||||
| extern TIM_HandleTypeDef htim2; | ||||
| extern TIM_HandleTypeDef htim16; | ||||
| extern TIM_HandleTypeDef htim17; | ||||
| 
 | ||||
| extern void HW_TS_RTC_Wakeup_Handler(); | ||||
| extern void HW_IPCC_Tx_Handler(); | ||||
| extern void HW_IPCC_Rx_Handler(); | ||||
| 
 | ||||
| void SysTick_Handler(void) { | ||||
|     HAL_IncTick(); | ||||
| } | ||||
| 
 | ||||
| void USB_LP_IRQHandler(void) { | ||||
|     usbd_poll(&udev); | ||||
| } | ||||
| 
 | ||||
| void COMP_IRQHandler(void) { | ||||
|     HAL_COMP_IRQHandler(&hcomp1); | ||||
| } | ||||
| 
 | ||||
| void TIM1_TRG_COM_TIM17_IRQHandler(void) { | ||||
|     HAL_TIM_IRQHandler(&htim1); | ||||
| } | ||||
| 
 | ||||
| void TIM1_CC_IRQHandler(void) { | ||||
|     HAL_TIM_IRQHandler(&htim1); | ||||
| } | ||||
| 
 | ||||
| void HSEM_IRQHandler(void) { | ||||
|     HAL_HSEM_IRQHandler(); | ||||
| } | ||||
| 
 | ||||
| void IPCC_C1_TX_IRQHandler(void) { | ||||
|     HW_IPCC_Tx_Handler(); | ||||
| } | ||||
| 
 | ||||
| void IPCC_C1_RX_IRQHandler(void) { | ||||
|     HW_IPCC_Rx_Handler(); | ||||
| } | ||||
| @ -1,371 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    system_stm32wbxx.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   CMSIS Cortex Device Peripheral Access Layer System Source File | ||||
|   * | ||||
|   *   This file provides two functions and one global variable to be called from | ||||
|   *   user application: | ||||
|   *      - SystemInit(): This function is called at startup just after reset and | ||||
|   *                      before branch to main program. This call is made inside | ||||
|   *                      the "startup_stm32wbxx.s" file. | ||||
|   * | ||||
|   *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used | ||||
|   *                                  by the user application to setup the SysTick | ||||
|   *                                  timer or configure other parameters. | ||||
|   * | ||||
|   *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must | ||||
|   *                                 be called whenever the core clock is changed | ||||
|   *                                 during program execution. | ||||
|   * | ||||
|   *   After each device reset the MSI (4 MHz) is used as system clock source. | ||||
|   *   Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to | ||||
|   *   configure the system clock before to branch to main program. | ||||
|   * | ||||
|   *   This file configures the system clock as follows: | ||||
|   *============================================================================= | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        System Clock source                    | MSI | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        SYSCLK(Hz)                             | 4000000 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        HCLK(Hz)                               | 4000000 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        AHB Prescaler                          | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        APB1 Prescaler                         | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        APB2 Prescaler                         | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_M                                  | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_N                                  | 8 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_P                                  | 7 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_Q                                  | 2 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_R                                  | 2 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLLSAI1_P                              | NA | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLLSAI1_Q                              | NA | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLLSAI1_R                              | NA | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        Require 48MHz for USB OTG FS,          | Disabled | ||||
|   *        SDIO and RNG clock                     | | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *============================================================================= | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics.  | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the  | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup CMSIS
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup stm32WBxx_system
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup stm32WBxx_System_Private_Includes
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| #include "stm32wbxx.h" | ||||
| 
 | ||||
| #if !defined(HSE_VALUE) | ||||
| #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */ | ||||
| #endif /* HSE_VALUE */ | ||||
| 
 | ||||
| #if !defined(MSI_VALUE) | ||||
| #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* MSI_VALUE */ | ||||
| 
 | ||||
| #if !defined(HSI_VALUE) | ||||
| #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* HSI_VALUE */ | ||||
| 
 | ||||
| #if !defined(LSI_VALUE) | ||||
| #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/ | ||||
| #endif /* LSI_VALUE */ | ||||
| 
 | ||||
| #if !defined(LSE_VALUE) | ||||
| #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/ | ||||
| #endif /* LSE_VALUE */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup STM32WBxx_System_Private_TypesDefinitions
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup STM32WBxx_System_Private_Defines
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /*!< Uncomment the following line if you need to relocate your vector Table in
 | ||||
|      Internal SRAM. */ | ||||
| /* #define VECT_TAB_SRAM */ | ||||
| #define VECT_TAB_OFFSET \ | ||||
|     OS_OFFSET /*!< Vector Table base offset field.
 | ||||
|                                                      This value must be a multiple of 0x200. */ | ||||
| 
 | ||||
| #define VECT_TAB_BASE_ADDRESS \ | ||||
|     SRAM1_BASE /*!< Vector Table base offset field.
 | ||||
|                                                      This value must be a multiple of 0x200. */ | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup STM32WBxx_System_Private_Macros
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup STM32WBxx_System_Private_Variables
 | ||||
|   * @{ | ||||
|   */ | ||||
| /* The SystemCoreClock variable is updated in three ways:
 | ||||
|       1) by calling CMSIS function SystemCoreClockUpdate() | ||||
|       2) by calling HAL API function HAL_RCC_GetHCLKFreq() | ||||
|       3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency | ||||
|          Note: If you use this function to configure the system clock; then there | ||||
|                is no need to call the 2 first functions listed above, since SystemCoreClock | ||||
|                variable is updated automatically. | ||||
|   */ | ||||
| uint32_t SystemCoreClock = 4000000UL; /*CPU1: M4 on MSI clock after startup (4MHz)*/ | ||||
| 
 | ||||
| const uint32_t AHBPrescTable[16UL] = | ||||
|     {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL}; | ||||
| 
 | ||||
| const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL}; | ||||
| 
 | ||||
| const uint32_t MSIRangeTable[16UL] = { | ||||
|     100000UL, | ||||
|     200000UL, | ||||
|     400000UL, | ||||
|     800000UL, | ||||
|     1000000UL, | ||||
|     2000000UL, | ||||
|     4000000UL, | ||||
|     8000000UL, | ||||
|     16000000UL, | ||||
|     24000000UL, | ||||
|     32000000UL, | ||||
|     48000000UL, | ||||
|     0UL, | ||||
|     0UL, | ||||
|     0UL, | ||||
|     0UL}; /* 0UL values are incorrect cases */ | ||||
| 
 | ||||
| #if defined(STM32WB55xx) || defined(STM32WB5Mxx) || defined(STM32WB35xx) | ||||
| const uint32_t SmpsPrescalerTable[4UL][6UL] = { | ||||
|     {1UL, 3UL, 2UL, 2UL, 1UL, 2UL}, | ||||
|     {2UL, 6UL, 4UL, 3UL, 2UL, 4UL}, | ||||
|     {4UL, 12UL, 8UL, 6UL, 4UL, 8UL}, | ||||
|     {4UL, 12UL, 8UL, 6UL, 4UL, 8UL}}; | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @addtogroup STM32WBxx_System_Private_Functions
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Setup the microcontroller system. | ||||
|   * @param  None | ||||
|   * @retval None | ||||
|   */ | ||||
| void SystemInit(void) { | ||||
|     /* Configure the Vector Table location add offset address ------------------*/ | ||||
| #if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS) | ||||
|     /* program in SRAMx */ | ||||
|     SCB->VTOR = VECT_TAB_BASE_ADDRESS | | ||||
|                 VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */ | ||||
| #else /* program in FLASH */ | ||||
|     SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ | ||||
| #endif | ||||
| 
 | ||||
| /* FPU settings ------------------------------------------------------------*/ | ||||
| #if(__FPU_PRESENT == 1) && (__FPU_USED == 1) | ||||
|     SCB->CPACR |= | ||||
|         ((3UL << (10UL * 2UL)) | (3UL << (11UL * 2UL))); /* set CP10 and CP11 Full Access */ | ||||
| #endif | ||||
| 
 | ||||
|     /* Reset the RCC clock configuration to the default reset state ------------*/ | ||||
|     /* Set MSION bit */ | ||||
|     RCC->CR |= RCC_CR_MSION; | ||||
| 
 | ||||
|     /* Reset CFGR register */ | ||||
|     RCC->CFGR = 0x00070000U; | ||||
| 
 | ||||
|     /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */ | ||||
|     RCC->CR &= (uint32_t)0xFAF6FEFBU; | ||||
| 
 | ||||
|     /*!< Reset LSI1 and LSI2 bits */ | ||||
|     RCC->CSR &= (uint32_t)0xFFFFFFFAU; | ||||
| 
 | ||||
|     /*!< Reset HSI48ON  bit */ | ||||
|     RCC->CRRCR &= (uint32_t)0xFFFFFFFEU; | ||||
| 
 | ||||
|     /* Reset PLLCFGR register */ | ||||
|     RCC->PLLCFGR = 0x22041000U; | ||||
| 
 | ||||
| #if defined(STM32WB55xx) || defined(STM32WB5Mxx) | ||||
|     /* Reset PLLSAI1CFGR register */ | ||||
|     RCC->PLLSAI1CFGR = 0x22041000U; | ||||
| #endif | ||||
| 
 | ||||
|     /* Reset HSEBYP bit */ | ||||
|     RCC->CR &= 0xFFFBFFFFU; | ||||
| 
 | ||||
|     /* Disable all interrupts */ | ||||
|     RCC->CIER = 0x00000000; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Update SystemCoreClock variable according to Clock Register Values. | ||||
|   *         The SystemCoreClock variable contains the core clock (HCLK), it can | ||||
|   *         be used by the user application to setup the SysTick timer or configure | ||||
|   *         other parameters. | ||||
|   * | ||||
|   * @note   Each time the core clock (HCLK) changes, this function must be called | ||||
|   *         to update SystemCoreClock variable value. Otherwise, any configuration | ||||
|   *         based on this variable will be incorrect. | ||||
|   * | ||||
|   * @note   - The system frequency computed by this function is not the real | ||||
|   *           frequency in the chip. It is calculated based on the predefined | ||||
|   *           constant and the selected clock source: | ||||
|   * | ||||
|   *           - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*) | ||||
|   * | ||||
|   *           - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) | ||||
|   * | ||||
|   *           - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) | ||||
|   * | ||||
|   *           - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) | ||||
|   *             or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. | ||||
|   * | ||||
|   *         (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value | ||||
|   *             4 MHz) but the real value may vary depending on the variations | ||||
|   *             in voltage and temperature. | ||||
|   * | ||||
|   *         (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value | ||||
|   *              16 MHz) but the real value may vary depending on the variations | ||||
|   *              in voltage and temperature. | ||||
|   * | ||||
|   *         (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value | ||||
|   *              32 MHz), user has to ensure that HSE_VALUE is same as the real | ||||
|   *              frequency of the crystal used. Otherwise, this function may | ||||
|   *              have wrong result. | ||||
|   * | ||||
|   *         - The result of this function could be not correct when using fractional | ||||
|   *           value for HSE crystal. | ||||
|   * | ||||
|   * @param  None | ||||
|   * @retval None | ||||
|   */ | ||||
| void SystemCoreClockUpdate(void) { | ||||
|     uint32_t tmp, msirange, pllvco, pllr, pllsource, pllm; | ||||
| 
 | ||||
|     /* Get MSI Range frequency--------------------------------------------------*/ | ||||
| 
 | ||||
|     /*MSI frequency range in Hz*/ | ||||
|     msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos]; | ||||
| 
 | ||||
|     /* Get SYSCLK source -------------------------------------------------------*/ | ||||
|     switch(RCC->CFGR & RCC_CFGR_SWS) { | ||||
|     case 0x00: /* MSI used as system clock source */ | ||||
|         SystemCoreClock = msirange; | ||||
|         break; | ||||
| 
 | ||||
|     case 0x04: /* HSI used as system clock source */ | ||||
|         /* HSI used as system clock source */ | ||||
|         SystemCoreClock = HSI_VALUE; | ||||
|         break; | ||||
| 
 | ||||
|     case 0x08: /* HSE used as system clock source */ | ||||
|         SystemCoreClock = HSE_VALUE; | ||||
|         break; | ||||
| 
 | ||||
|     case 0x0C: /* PLL used as system clock  source */ | ||||
|         /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
 | ||||
|          SYSCLK = PLL_VCO / PLLR | ||||
|          */ | ||||
|         pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); | ||||
|         pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL; | ||||
| 
 | ||||
|         if(pllsource == 0x02UL) /* HSI used as PLL clock source */ | ||||
|         { | ||||
|             pllvco = (HSI_VALUE / pllm); | ||||
|         } else if(pllsource == 0x03UL) /* HSE used as PLL clock source */ | ||||
|         { | ||||
|             pllvco = (HSE_VALUE / pllm); | ||||
|         } else /* MSI used as PLL clock source */ | ||||
|         { | ||||
|             pllvco = (msirange / pllm); | ||||
|         } | ||||
| 
 | ||||
|         pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); | ||||
|         pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL); | ||||
| 
 | ||||
|         SystemCoreClock = pllvco / pllr; | ||||
|         break; | ||||
| 
 | ||||
|     default: | ||||
|         SystemCoreClock = msirange; | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     /* Compute HCLK clock frequency --------------------------------------------*/ | ||||
|     /* Get HCLK1 prescaler */ | ||||
|     tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)]; | ||||
|     /* HCLK clock frequency */ | ||||
|     SystemCoreClock = SystemCoreClock / tmp; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,317 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    tim.c | ||||
|   * @brief   This file provides code for the configuration | ||||
|   *          of the TIM instances. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "tim.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN 0 */ | ||||
| 
 | ||||
| /* USER CODE END 0 */ | ||||
| 
 | ||||
| TIM_HandleTypeDef htim1; | ||||
| TIM_HandleTypeDef htim2; | ||||
| TIM_HandleTypeDef htim16; | ||||
| 
 | ||||
| /* TIM1 init function */ | ||||
| void MX_TIM1_Init(void) { | ||||
|     TIM_ClockConfigTypeDef sClockSourceConfig = {0}; | ||||
|     TIM_MasterConfigTypeDef sMasterConfig = {0}; | ||||
|     TIM_OC_InitTypeDef sConfigOC = {0}; | ||||
|     TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; | ||||
| 
 | ||||
|     htim1.Instance = TIM1; | ||||
|     htim1.Init.Prescaler = 0; | ||||
|     htim1.Init.CounterMode = TIM_COUNTERMODE_UP; | ||||
|     htim1.Init.Period = 65535; | ||||
|     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(); | ||||
|     } | ||||
|     if(HAL_TIM_OC_Init(&htim1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     if(HAL_TIM_PWM_Init(&htim1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; | ||||
|     sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; | ||||
|     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; | ||||
|     if(HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sConfigOC.OCMode = TIM_OCMODE_TIMING; | ||||
|     sConfigOC.Pulse = 0; | ||||
|     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; | ||||
|     sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; | ||||
|     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; | ||||
|     sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; | ||||
|     sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; | ||||
|     if(HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sConfigOC.OCMode = TIM_OCMODE_PWM1; | ||||
|     if(HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; | ||||
|     sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; | ||||
|     sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; | ||||
|     sBreakDeadTimeConfig.DeadTime = 0; | ||||
|     sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; | ||||
|     sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; | ||||
|     sBreakDeadTimeConfig.BreakFilter = 0; | ||||
|     sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT; | ||||
|     sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE; | ||||
|     sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH; | ||||
|     sBreakDeadTimeConfig.Break2Filter = 0; | ||||
|     sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT; | ||||
|     sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; | ||||
|     if(HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     HAL_TIM_MspPostInit(&htim1); | ||||
| } | ||||
| /* TIM2 init function */ | ||||
| void MX_TIM2_Init(void) { | ||||
|     TIM_ClockConfigTypeDef sClockSourceConfig = {0}; | ||||
|     TIM_MasterConfigTypeDef sMasterConfig = {0}; | ||||
|     TIM_IC_InitTypeDef sConfigIC = {0}; | ||||
| 
 | ||||
|     htim2.Instance = TIM2; | ||||
|     htim2.Init.Prescaler = 64 - 1; | ||||
|     htim2.Init.CounterMode = TIM_COUNTERMODE_UP; | ||||
|     htim2.Init.Period = 4294967295; | ||||
|     htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; | ||||
|     htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; | ||||
|     if(HAL_TIM_Base_Init(&htim2) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; | ||||
|     if(HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     if(HAL_TIM_IC_Init(&htim2) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; | ||||
|     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; | ||||
|     if(HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; | ||||
|     sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; | ||||
|     sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; | ||||
|     sConfigIC.ICFilter = 0; | ||||
|     if(HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; | ||||
|     sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI; | ||||
|     if(HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| } | ||||
| /* TIM16 init function */ | ||||
| void MX_TIM16_Init(void) { | ||||
|     TIM_OC_InitTypeDef sConfigOC = {0}; | ||||
|     TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; | ||||
| 
 | ||||
|     htim16.Instance = TIM16; | ||||
|     htim16.Init.Prescaler = 500 - 1; | ||||
|     htim16.Init.CounterMode = TIM_COUNTERMODE_UP; | ||||
|     htim16.Init.Period = 291; | ||||
|     htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; | ||||
|     htim16.Init.RepetitionCounter = 0; | ||||
|     htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; | ||||
|     if(HAL_TIM_Base_Init(&htim16) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     if(HAL_TIM_PWM_Init(&htim16) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sConfigOC.OCMode = TIM_OCMODE_PWM1; | ||||
|     sConfigOC.Pulse = 145; | ||||
|     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; | ||||
|     sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; | ||||
|     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; | ||||
|     sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; | ||||
|     sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; | ||||
|     if(HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; | ||||
|     sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; | ||||
|     sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; | ||||
|     sBreakDeadTimeConfig.DeadTime = 0; | ||||
|     sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; | ||||
|     sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; | ||||
|     sBreakDeadTimeConfig.BreakFilter = 0; | ||||
|     sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; | ||||
|     if(HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     HAL_TIM_MspPostInit(&htim16); | ||||
| } | ||||
| 
 | ||||
| void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { | ||||
|     GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|     if(tim_baseHandle->Instance == TIM1) { | ||||
|         /* USER CODE BEGIN TIM1_MspInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM1_MspInit 0 */ | ||||
|         /* TIM1 clock enable */ | ||||
|         __HAL_RCC_TIM1_CLK_ENABLE(); | ||||
| 
 | ||||
|         /* TIM1 interrupt Init */ | ||||
|         HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 0, 0); | ||||
|         HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn); | ||||
|         /* USER CODE BEGIN TIM1_MspInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM1_MspInit 1 */ | ||||
|     } else if(tim_baseHandle->Instance == TIM2) { | ||||
|         /* USER CODE BEGIN TIM2_MspInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM2_MspInit 0 */ | ||||
|         /* TIM2 clock enable */ | ||||
|         __HAL_RCC_TIM2_CLK_ENABLE(); | ||||
| 
 | ||||
|         __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
|         /**TIM2 GPIO Configuration
 | ||||
|     PA0     ------> TIM2_CH1 | ||||
|     */ | ||||
|         GPIO_InitStruct.Pin = IR_RX_Pin; | ||||
|         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|         GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|         GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; | ||||
|         HAL_GPIO_Init(IR_RX_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|         /* TIM2 interrupt Init */ | ||||
|         HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0); | ||||
|         HAL_NVIC_EnableIRQ(TIM2_IRQn); | ||||
|         /* USER CODE BEGIN TIM2_MspInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM2_MspInit 1 */ | ||||
|     } else if(tim_baseHandle->Instance == TIM16) { | ||||
|         /* USER CODE BEGIN TIM16_MspInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM16_MspInit 0 */ | ||||
|         /* TIM16 clock enable */ | ||||
|         __HAL_RCC_TIM16_CLK_ENABLE(); | ||||
|         /* USER CODE BEGIN TIM16_MspInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM16_MspInit 1 */ | ||||
|     } | ||||
| } | ||||
| void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) { | ||||
|     GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|     if(timHandle->Instance == TIM1) { | ||||
|         /* USER CODE BEGIN TIM1_MspPostInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM1_MspPostInit 0 */ | ||||
|         __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|         /**TIM1 GPIO Configuration
 | ||||
|     PB9     ------> TIM1_CH3N | ||||
|     PB13     ------> TIM1_CH1N | ||||
|     */ | ||||
|         GPIO_InitStruct.Pin = IR_TX_Pin | RFID_OUT_Pin; | ||||
|         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|         GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|         GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; | ||||
|         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | ||||
| 
 | ||||
|         /* USER CODE BEGIN TIM1_MspPostInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM1_MspPostInit 1 */ | ||||
|     } else if(timHandle->Instance == TIM16) { | ||||
|         /* USER CODE BEGIN TIM16_MspPostInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM16_MspPostInit 0 */ | ||||
| 
 | ||||
|         __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|         /**TIM16 GPIO Configuration
 | ||||
|     PB8     ------> TIM16_CH1 | ||||
|     */ | ||||
|         GPIO_InitStruct.Pin = SPEAKER_Pin; | ||||
|         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|         GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|         GPIO_InitStruct.Alternate = GPIO_AF14_TIM16; | ||||
|         HAL_GPIO_Init(SPEAKER_GPIO_Port, &GPIO_InitStruct); | ||||
| 
 | ||||
|         /* USER CODE BEGIN TIM16_MspPostInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM16_MspPostInit 1 */ | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { | ||||
|     if(tim_baseHandle->Instance == TIM1) { | ||||
|         /* USER CODE BEGIN TIM1_MspDeInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM1_MspDeInit 0 */ | ||||
|         /* Peripheral clock disable */ | ||||
|         __HAL_RCC_TIM1_CLK_DISABLE(); | ||||
| 
 | ||||
|         /* TIM1 interrupt Deinit */ | ||||
|         HAL_NVIC_DisableIRQ(TIM1_TRG_COM_TIM17_IRQn); | ||||
|         /* USER CODE BEGIN TIM1_MspDeInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM1_MspDeInit 1 */ | ||||
|     } else if(tim_baseHandle->Instance == TIM2) { | ||||
|         /* USER CODE BEGIN TIM2_MspDeInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM2_MspDeInit 0 */ | ||||
|         /* Peripheral clock disable */ | ||||
|         __HAL_RCC_TIM2_CLK_DISABLE(); | ||||
| 
 | ||||
|         /**TIM2 GPIO Configuration
 | ||||
|     PA0     ------> TIM2_CH1 | ||||
|     */ | ||||
|         HAL_GPIO_DeInit(IR_RX_GPIO_Port, IR_RX_Pin); | ||||
| 
 | ||||
|         /* TIM2 interrupt Deinit */ | ||||
|         HAL_NVIC_DisableIRQ(TIM2_IRQn); | ||||
|         /* USER CODE BEGIN TIM2_MspDeInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM2_MspDeInit 1 */ | ||||
|     } else if(tim_baseHandle->Instance == TIM16) { | ||||
|         /* USER CODE BEGIN TIM16_MspDeInit 0 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM16_MspDeInit 0 */ | ||||
|         /* Peripheral clock disable */ | ||||
|         __HAL_RCC_TIM16_CLK_DISABLE(); | ||||
|         /* USER CODE BEGIN TIM16_MspDeInit 1 */ | ||||
| 
 | ||||
|         /* USER CODE END TIM16_MspDeInit 1 */ | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /* USER CODE BEGIN 1 */ | ||||
| 
 | ||||
| /* USER CODE END 1 */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,39 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : app_common.h | ||||
|   * Description        : App Common application configuration file for STM32WPAN Middleware. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef APP_COMMON_H | ||||
| #define APP_COMMON_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdarg.h> | ||||
| 
 | ||||
| #include <furi/common_defines.h> | ||||
| 
 | ||||
| #include "app_conf.h" | ||||
| 
 | ||||
| #endif | ||||
| @ -1,465 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include "hw.h" | ||||
| #include "hw_conf.h" | ||||
| #include "hw_if.h" | ||||
| #include "ble_bufsize.h" | ||||
| 
 | ||||
| #define CFG_TX_POWER (0x19) /* +0dBm */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Define Advertising parameters | ||||
|  */ | ||||
| #define CFG_ADV_BD_ADDRESS (0x7257acd87a6c) | ||||
| #define CFG_FAST_CONN_ADV_INTERVAL_MIN (0x80) /**< 80ms */ | ||||
| #define CFG_FAST_CONN_ADV_INTERVAL_MAX (0xa0) /**< 100ms */ | ||||
| #define CFG_LP_CONN_ADV_INTERVAL_MIN (0x640) /**< 1s */ | ||||
| #define CFG_LP_CONN_ADV_INTERVAL_MAX (0xfa0) /**< 2.5s */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Define IO Authentication | ||||
|  */ | ||||
| #define CFG_BONDING_MODE (1) | ||||
| #define CFG_FIXED_PIN (111111) | ||||
| #define CFG_USED_FIXED_PIN (1) | ||||
| #define CFG_ENCRYPTION_KEY_SIZE_MAX (16) | ||||
| #define CFG_ENCRYPTION_KEY_SIZE_MIN (8) | ||||
| 
 | ||||
| /**
 | ||||
|  * Define IO capabilities | ||||
|  */ | ||||
| #define CFG_IO_CAPABILITY_DISPLAY_ONLY (0x00) | ||||
| #define CFG_IO_CAPABILITY_DISPLAY_YES_NO (0x01) | ||||
| #define CFG_IO_CAPABILITY_KEYBOARD_ONLY (0x02) | ||||
| #define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03) | ||||
| #define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04) | ||||
| 
 | ||||
| #define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_YES_NO | ||||
| 
 | ||||
| /**
 | ||||
|  * Define MITM modes | ||||
|  */ | ||||
| #define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00) | ||||
| #define CFG_MITM_PROTECTION_REQUIRED (0x01) | ||||
| 
 | ||||
| #define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED | ||||
| 
 | ||||
| /**
 | ||||
|  * Define Secure Connections Support | ||||
|  */ | ||||
| #define CFG_SECURE_NOT_SUPPORTED (0x00) | ||||
| #define CFG_SECURE_OPTIONAL (0x01) | ||||
| #define CFG_SECURE_MANDATORY (0x02) | ||||
| 
 | ||||
| #define CFG_SC_SUPPORT CFG_SECURE_OPTIONAL | ||||
| 
 | ||||
| /**
 | ||||
|  * Define Keypress Notification Support | ||||
|  */ | ||||
| #define CFG_KEYPRESS_NOT_SUPPORTED (0x00) | ||||
| #define CFG_KEYPRESS_SUPPORTED (0x01) | ||||
| 
 | ||||
| #define CFG_KEYPRESS_NOTIFICATION_SUPPORT CFG_KEYPRESS_NOT_SUPPORTED | ||||
| 
 | ||||
| /**
 | ||||
|  * Numeric Comparison Answers | ||||
|  */ | ||||
| #define YES (0x01) | ||||
| #define NO (0x00) | ||||
| 
 | ||||
| /**
 | ||||
|  * Device name configuration for Generic Access Service | ||||
|  */ | ||||
| #define CFG_GAP_DEVICE_NAME "TEMPLATE" | ||||
| #define CFG_GAP_DEVICE_NAME_LENGTH (8) | ||||
| 
 | ||||
| /**
 | ||||
|  * Define PHY | ||||
|  */ | ||||
| #define ALL_PHYS_PREFERENCE 0x00 | ||||
| #define RX_2M_PREFERRED 0x02 | ||||
| #define TX_2M_PREFERRED 0x02 | ||||
| #define TX_1M 0x01 | ||||
| #define TX_2M 0x02 | ||||
| #define RX_1M 0x01 | ||||
| #define RX_2M 0x02 | ||||
| 
 | ||||
| /**
 | ||||
| *   Identity root key used to derive LTK and CSRK | ||||
| */ | ||||
| #define CFG_BLE_IRK                                                                               \ | ||||
|     {                                                                                             \ | ||||
|         0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, \ | ||||
|             0xf0                                                                                  \ | ||||
|     } | ||||
| 
 | ||||
| /**
 | ||||
| * Encryption root key used to derive LTK and CSRK | ||||
| */ | ||||
| #define CFG_BLE_ERK                                                                               \ | ||||
|     {                                                                                             \ | ||||
|         0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21, 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, \ | ||||
|             0x21                                                                                  \ | ||||
|     } | ||||
| 
 | ||||
| /* USER CODE BEGIN Generic_Parameters */ | ||||
| /**
 | ||||
|  * SMPS supply | ||||
|  * SMPS not used when Set to 0 | ||||
|  * SMPS used when Set to 1 | ||||
|  */ | ||||
| #define CFG_USE_SMPS 1 | ||||
| /* USER CODE END Generic_Parameters */ | ||||
| 
 | ||||
| /**< specific parameters */ | ||||
| /*****************************************************/ | ||||
| 
 | ||||
| /**
 | ||||
| * AD Element - Group B Feature | ||||
| */ | ||||
| /* LSB - Second Byte */ | ||||
| #define CFG_FEATURE_OTA_REBOOT (0x20) | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * BLE Stack | ||||
|  ******************************************************************************/ | ||||
| /**
 | ||||
|  * Maximum number of simultaneous connections that the device will support. | ||||
|  * Valid values are from 1 to 8 | ||||
|  */ | ||||
| #define CFG_BLE_NUM_LINK 2 | ||||
| 
 | ||||
| /**
 | ||||
|  * Maximum number of Services that can be stored in the GATT database. | ||||
|  * Note that the GAP and GATT services are automatically added so this parameter should be 2 plus the number of user services | ||||
|  */ | ||||
| #define CFG_BLE_NUM_GATT_SERVICES 8 | ||||
| 
 | ||||
| /**
 | ||||
|  * Maximum number of Attributes | ||||
|  * (i.e. the number of characteristic + the number of characteristic values + the number of descriptors, excluding the services) | ||||
|  * that can be stored in the GATT database. | ||||
|  * Note that certain characteristics and relative descriptors are added automatically during device initialization | ||||
|  * so this parameters should be 9 plus the number of user Attributes | ||||
|  */ | ||||
| #define CFG_BLE_NUM_GATT_ATTRIBUTES 68 | ||||
| 
 | ||||
| /**
 | ||||
|  * Maximum supported ATT_MTU size | ||||
|  */ | ||||
| #define CFG_BLE_MAX_ATT_MTU (256 + 128 + 16 + 8 + 4 + 2) | ||||
| 
 | ||||
| /**
 | ||||
|  * Size of the storage area for Attribute values | ||||
|  *  This value depends on the number of attributes used by application. In particular the sum of the following quantities (in octets) should be made for each attribute: | ||||
|  *  - attribute value length | ||||
|  *  - 5, if UUID is 16 bit; 19, if UUID is 128 bit | ||||
|  *  - 2, if server configuration descriptor is used | ||||
|  *  - 2*DTM_NUM_LINK, if client configuration descriptor is used | ||||
|  *  - 2, if extended properties is used | ||||
|  *  The total amount of memory needed is the sum of the above quantities for each attribute. | ||||
|  */ | ||||
| #define CFG_BLE_ATT_VALUE_ARRAY_SIZE (1344) | ||||
| 
 | ||||
| /**
 | ||||
|  * Prepare Write List size in terms of number of packet | ||||
|  */ | ||||
| #define CFG_BLE_PREPARE_WRITE_LIST_SIZE BLE_PREP_WRITE_X_ATT(CFG_BLE_MAX_ATT_MTU) | ||||
| 
 | ||||
| /**
 | ||||
|  * Number of allocated memory blocks | ||||
|  */ | ||||
| #define CFG_BLE_MBLOCK_COUNT \ | ||||
|     (BLE_MBLOCKS_CALC(CFG_BLE_PREPARE_WRITE_LIST_SIZE, CFG_BLE_MAX_ATT_MTU, CFG_BLE_NUM_LINK)) | ||||
| 
 | ||||
| /**
 | ||||
|  * Enable or disable the Extended Packet length feature. Valid values are 0 or 1. | ||||
|  */ | ||||
| #define CFG_BLE_DATA_LENGTH_EXTENSION 1 | ||||
| 
 | ||||
| /**
 | ||||
|  * Sleep clock accuracy in Slave mode (ppm value) | ||||
|  */ | ||||
| #define CFG_BLE_SLAVE_SCA 500 | ||||
| 
 | ||||
| /**
 | ||||
|  * Sleep clock accuracy in Master mode | ||||
|  * 0 : 251 ppm to 500 ppm | ||||
|  * 1 : 151 ppm to 250 ppm | ||||
|  * 2 : 101 ppm to 150 ppm | ||||
|  * 3 : 76 ppm to 100 ppm | ||||
|  * 4 : 51 ppm to 75 ppm | ||||
|  * 5 : 31 ppm to 50 ppm | ||||
|  * 6 : 21 ppm to 30 ppm | ||||
|  * 7 : 0 ppm to 20 ppm | ||||
|  */ | ||||
| #define CFG_BLE_MASTER_SCA 0 | ||||
| 
 | ||||
| /**
 | ||||
|  *  Source for the low speed clock for RF wake-up | ||||
|  *  1 : external high speed crystal HSE/32/32 | ||||
|  *  0 : external low speed crystal ( no calibration ) | ||||
|  */ | ||||
| #define CFG_BLE_LSE_SOURCE 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * Start up time of the high speed (16 or 32 MHz) crystal oscillator in units of 625/256 us (~2.44 us) | ||||
|  */ | ||||
| #define CFG_BLE_HSE_STARTUP_TIME 0x148 | ||||
| 
 | ||||
| /**
 | ||||
|  * Maximum duration of the connection event when the device is in Slave mode in units of 625/256 us (~2.44 us) | ||||
|  */ | ||||
| #define CFG_BLE_MAX_CONN_EVENT_LENGTH (0xFFFFFFFF) | ||||
| 
 | ||||
| /**
 | ||||
|  * Viterbi Mode | ||||
|  * 1 : enabled | ||||
|  * 0 : disabled | ||||
|  */ | ||||
| #define CFG_BLE_VITERBI_MODE 1 | ||||
| 
 | ||||
| /**
 | ||||
|  * BLE stack Options flags to be configured with: | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_LL_ONLY | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_LL_HOST | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_NO_SVC_CHANGE_DESC | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_WITH_SVC_CHANGE_DESC | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_DEVICE_NAME_RO | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_DEVICE_NAME_RW | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_EXT_ADV | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_NO_EXT_ADV | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_CS_ALGO2 | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_NO_CS_ALGO2 | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_POWER_CLASS_1 | ||||
|  * - SHCI_C2_BLE_INIT_OPTIONS_POWER_CLASS_2_3 | ||||
|  * which are used to set following configuration bits: | ||||
|  * (bit 0): 1: LL only | ||||
|  *          0: LL + host | ||||
|  * (bit 1): 1: no service change desc. | ||||
|  *          0: with service change desc. | ||||
|  * (bit 2): 1: device name Read-Only | ||||
|  *          0: device name R/W | ||||
|  * (bit 3): 1: extended advertizing supported       [NOT SUPPORTED] | ||||
|  *          0: extended advertizing not supported   [NOT SUPPORTED] | ||||
|  * (bit 4): 1: CS Algo #2 supported | ||||
|  *          0: CS Algo #2 not supported | ||||
|  * (bit 7): 1: LE Power Class 1 | ||||
|  *          0: LE Power Class 2-3 | ||||
|  * other bits: reserved (shall be set to 0) | ||||
|  */ | ||||
| #define CFG_BLE_OPTIONS                                                                 \ | ||||
|     (SHCI_C2_BLE_INIT_OPTIONS_LL_HOST | SHCI_C2_BLE_INIT_OPTIONS_WITH_SVC_CHANGE_DESC | \ | ||||
|      SHCI_C2_BLE_INIT_OPTIONS_DEVICE_NAME_RW | SHCI_C2_BLE_INIT_OPTIONS_NO_EXT_ADV |    \ | ||||
|      SHCI_C2_BLE_INIT_OPTIONS_NO_CS_ALGO2 | SHCI_C2_BLE_INIT_OPTIONS_POWER_CLASS_2_3) | ||||
| 
 | ||||
| /**
 | ||||
|  * Queue length of BLE Event | ||||
|  * This parameter defines the number of asynchronous events that can be stored in the HCI layer before | ||||
|  * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer | ||||
|  * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large | ||||
|  * enough to store all asynchronous events received in between. | ||||
|  * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events | ||||
|  * between the HCI command and its event. | ||||
|  * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small, | ||||
|  * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting | ||||
|  * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate | ||||
|  * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout). | ||||
|  */ | ||||
| #define CFG_TLBLE_EVT_QUEUE_LENGTH 5 | ||||
| /**
 | ||||
|  * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element | ||||
|  * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager. | ||||
|  * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will | ||||
|  * never be used) | ||||
|  * With the current wireless firmware implementation, this parameter shall be kept to 255 | ||||
|  * | ||||
|  */ | ||||
| #define CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE \ | ||||
|     255 /**< Set to 255 with the memory manager and the mailbox */ | ||||
| 
 | ||||
| #define TL_BLE_EVENT_FRAME_SIZE (TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE) | ||||
| /******************************************************************************
 | ||||
|  * UART interfaces | ||||
|  ******************************************************************************/ | ||||
| 
 | ||||
| /**
 | ||||
|  * Select UART interfaces | ||||
|  */ | ||||
| #define CFG_DEBUG_TRACE_UART hw_uart1 | ||||
| #define CFG_CONSOLE_MENU 0 | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * Low Power | ||||
|  ******************************************************************************/ | ||||
| /**
 | ||||
|  *  When set to 1, the low power mode is enable | ||||
|  *  When set to 0, the device stays in RUN mode | ||||
|  */ | ||||
| #define CFG_LPM_SUPPORTED 1 | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * Timer Server | ||||
|  ******************************************************************************/ | ||||
| /**
 | ||||
|  *  CFG_RTC_WUCKSEL_DIVIDER:  This sets the RTCCLK divider to the wakeup timer. | ||||
|  *  The lower is the value, the better is the power consumption and the accuracy of the timerserver | ||||
|  *  The higher is the value, the finest is the granularity | ||||
|  * | ||||
|  *  CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput | ||||
|  *  clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding | ||||
|  *  the wakeup timer. A lower clock speed would impact the accuracy of the timer server. | ||||
|  * | ||||
|  *  CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC. | ||||
|  *  When the 1Hz calendar clock is required, it shall be sets according to other settings | ||||
|  *  When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE) | ||||
|  * | ||||
|  *  CFG_RTCCLK_DIVIDER_CONF: | ||||
|  *  Shall be set to either 0,2,4,8,16 | ||||
|  *  When set to either 2,4,8,16, the 1Hhz calendar is supported | ||||
|  *  When set to 0, the user sets its own configuration | ||||
|  * | ||||
|  *  The following settings are computed with LSI as input to the RTC | ||||
|  */ | ||||
| #define CFG_RTCCLK_DIVIDER_CONF 0 | ||||
| 
 | ||||
| #if(CFG_RTCCLK_DIVIDER_CONF == 0) | ||||
| /**
 | ||||
|  * Custom configuration | ||||
|  * It does not support 1Hz calendar | ||||
|  * It divides the RTC CLK by 16 | ||||
|  */ | ||||
| #define CFG_RTCCLK_DIV (16) | ||||
| #define CFG_RTC_WUCKSEL_DIVIDER (0) | ||||
| #define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1) | ||||
| #define CFG_RTC_SYNCH_PRESCALER (0x7FFF) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| #if(CFG_RTCCLK_DIVIDER_CONF == 2) | ||||
| /**
 | ||||
|  * It divides the RTC CLK by 2 | ||||
|  */ | ||||
| #define CFG_RTC_WUCKSEL_DIVIDER (3) | ||||
| #endif | ||||
| 
 | ||||
| #if(CFG_RTCCLK_DIVIDER_CONF == 4) | ||||
| /**
 | ||||
|  * It divides the RTC CLK by 4 | ||||
|  */ | ||||
| #define CFG_RTC_WUCKSEL_DIVIDER (2) | ||||
| #endif | ||||
| 
 | ||||
| #if(CFG_RTCCLK_DIVIDER_CONF == 8) | ||||
| /**
 | ||||
|  * It divides the RTC CLK by 8 | ||||
|  */ | ||||
| #define CFG_RTC_WUCKSEL_DIVIDER (1) | ||||
| #endif | ||||
| 
 | ||||
| #if(CFG_RTCCLK_DIVIDER_CONF == 16) | ||||
| /**
 | ||||
|  * It divides the RTC CLK by 16 | ||||
|  */ | ||||
| #define CFG_RTC_WUCKSEL_DIVIDER (0) | ||||
| #endif | ||||
| 
 | ||||
| #define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF | ||||
| #define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1) | ||||
| #define CFG_RTC_SYNCH_PRESCALER (DIVR(LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER + 1)) - 1) | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /** tick timer value in us */ | ||||
| #define CFG_TS_TICK_VAL DIVR((CFG_RTCCLK_DIV * 1000000), LSE_VALUE) | ||||
| 
 | ||||
| typedef enum { | ||||
|     CFG_TIM_PROC_ID_ISR, | ||||
|     /* USER CODE BEGIN CFG_TimProcID_t */ | ||||
| 
 | ||||
|     /* USER CODE END CFG_TimProcID_t */ | ||||
| } CFG_TimProcID_t; | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * Debug | ||||
|  ******************************************************************************/ | ||||
| /**
 | ||||
|  * When set, this resets some hw resources to set the device in the same state than the power up | ||||
|  * The FW resets only register that may prevent the FW to run properly | ||||
|  * | ||||
|  * This shall be set to 0 in a final product | ||||
|  * | ||||
|  */ | ||||
| #define CFG_HW_RESET_BY_FW 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * keep debugger enabled while in any low power mode when set to 1 | ||||
|  * should be set to 0 in production | ||||
|  */ | ||||
| #define CFG_DEBUGGER_SUPPORTED 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * When set to 1, the traces are enabled in the BLE services | ||||
|  */ | ||||
| #define CFG_DEBUG_BLE_TRACE 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * Enable or Disable traces in application | ||||
|  */ | ||||
| #define CFG_DEBUG_APP_TRACE 0 | ||||
| 
 | ||||
| #if(CFG_DEBUG_APP_TRACE != 0) | ||||
| #define APP_DBG_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define APP_DBG_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if((CFG_DEBUG_BLE_TRACE != 0) || (CFG_DEBUG_APP_TRACE != 0)) | ||||
| #define CFG_DEBUG_TRACE 1 | ||||
| #endif | ||||
| 
 | ||||
| #if(CFG_DEBUG_TRACE != 0) | ||||
| #undef CFG_LPM_SUPPORTED | ||||
| #undef CFG_DEBUGGER_SUPPORTED | ||||
| #define CFG_LPM_SUPPORTED 0 | ||||
| #define CFG_DEBUGGER_SUPPORTED 1 | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number | ||||
|  * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output | ||||
|  * | ||||
|  * When both are set to 0, no trace are output | ||||
|  * When both are set to 1,  CFG_DEBUG_TRACE_FULL is selected | ||||
|  */ | ||||
| #define CFG_DEBUG_TRACE_LIGHT 0 | ||||
| #define CFG_DEBUG_TRACE_FULL 0 | ||||
| 
 | ||||
| #if((CFG_DEBUG_TRACE != 0) && (CFG_DEBUG_TRACE_LIGHT == 0) && (CFG_DEBUG_TRACE_FULL == 0)) | ||||
| #undef CFG_DEBUG_TRACE_FULL | ||||
| #undef CFG_DEBUG_TRACE_LIGHT | ||||
| #define CFG_DEBUG_TRACE_FULL 0 | ||||
| #define CFG_DEBUG_TRACE_LIGHT 1 | ||||
| #endif | ||||
| 
 | ||||
| #if(CFG_DEBUG_TRACE == 0) | ||||
| #undef CFG_DEBUG_TRACE_FULL | ||||
| #undef CFG_DEBUG_TRACE_LIGHT | ||||
| #define CFG_DEBUG_TRACE_FULL 0 | ||||
| #define CFG_DEBUG_TRACE_LIGHT 0 | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * When not set, the traces is looping on sending the trace over UART | ||||
|  */ | ||||
| #define DBG_TRACE_USE_CIRCULAR_QUEUE 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * max buffer Size to queue data traces and max data trace allowed. | ||||
|  * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined | ||||
|  */ | ||||
| #define DBG_TRACE_MSG_QUEUE_SIZE 4096 | ||||
| #define MAX_DBG_TRACE_MSG_SIZE 1024 | ||||
| 
 | ||||
| #define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE | ||||
| #define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR | ||||
| @ -1,357 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : app_debug.c | ||||
|   * Description        : Debug capabilities source file for STM32WPAN Middleware | ||||
|  ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|  ****************************************************************************** | ||||
|  */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
| #include "utilities_common.h" | ||||
| 
 | ||||
| #include "app_common.h" | ||||
| #include "app_debug.h" | ||||
| #include "shci.h" | ||||
| #include "tl.h" | ||||
| #include "dbg_trace.h" | ||||
| #include <furi_hal.h> | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PTD */ | ||||
| typedef PACKED_STRUCT { | ||||
|     GPIO_TypeDef* port; | ||||
|     uint16_t pin; | ||||
|     uint8_t enable; | ||||
|     uint8_t reserved; | ||||
| } | ||||
| APPD_GpioConfig_t; | ||||
| /* USER CODE END PTD */ | ||||
| 
 | ||||
| /* Private defines -----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PD */ | ||||
| #define GPIO_NBR_OF_RF_SIGNALS 9 | ||||
| #define GPIO_CFG_NBR_OF_FEATURES 34 | ||||
| #define NBR_OF_TRACES_CONFIG_PARAMETERS 4 | ||||
| #define NBR_OF_GENERAL_CONFIG_PARAMETERS 4 | ||||
| 
 | ||||
| /**
 | ||||
|  * THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT | ||||
|  */ | ||||
| #define BLE_DTB_CFG 7 | ||||
| #define SYS_DBG_CFG1 (SHCI_C2_DEBUG_OPTIONS_IPCORE_LP | SHCI_C2_DEBUG_OPTIONS_CPU2_STOP_EN) | ||||
| /* USER CODE END PD */ | ||||
| 
 | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PV */ | ||||
| PLACE_IN_SECTION("MB_MEM2") | ||||
| ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig = {0, 0, 0, 0}; | ||||
| PLACE_IN_SECTION("MB_MEM2") | ||||
| ALIGN(4) | ||||
| static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig = {BLE_DTB_CFG, SYS_DBG_CFG1, {0, 0}}; | ||||
| 
 | ||||
| /**
 | ||||
|  * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT | ||||
|  * It provides timing information on the CPU2 activity. | ||||
|  * All configuration of (port, pin) is supported for each features and can be selected by the user | ||||
|  * depending on the availability | ||||
|  */ | ||||
| static const APPD_GpioConfig_t aGpioConfigList[GPIO_CFG_NBR_OF_FEATURES] = { | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ISR - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_7, 1, 0}, /* BLE_STACK_TICK - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_CMD_PROCESS - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ACL_DATA_PROCESS - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* SYS_CMD_PROCESS - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* RNG_PROCESS - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVM_PROCESS - Set on Entry / Reset on Exit */ | ||||
|     {GPIOB, LL_GPIO_PIN_3, 1, 0}, /* IPCC_GENERAL - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_CMD_RX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_EVT_TX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_ACL_DATA_RX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_CMD_RX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_EVT_TX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_CMD_RX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_CMD_RX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_ACK_TX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_ACK_TX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_MEM_MANAGER_RX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_TRACES_TX - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_6, 1, 0}, /* HARD_FAULT - Set on Entry / Reset on Exit */ | ||||
|     /* From v1.1.1 */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IP_CORE_LP_STATUS - Set on Entry / Reset on Exit */ | ||||
|     /* From v1.2.0 */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* END_OF_CONNECTION_EVENT - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* TIMER_SERVER_CALLBACK - Toggle on Entry */ | ||||
|     {GPIOA, LL_GPIO_PIN_4, 1, 0}, /* PES_ACTIVITY - Set on Entry / Reset on Exit */ | ||||
|     {GPIOB, LL_GPIO_PIN_2, 1, 0}, /* MB_BLE_SEND_EVT - Set on Entry / Reset on Exit */ | ||||
|     /* From v1.3.0 */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_NO_DELAY - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_STORE_NVM_CB - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_ONGOING - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_COMPLETE - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_CLEANUP - Set on Entry / Reset on Exit */ | ||||
|     /* From v1.4.0 */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_START - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_EOP - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_WRITE - Set on Entry / Reset on Exit */ | ||||
|     {GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_ERASE - Set on Entry / Reset on Exit */ | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT | ||||
|  * This table is relevant only for BLE | ||||
|  * It provides timing information on BLE RF activity. | ||||
|  * New signals may be allocated at any location when requested by ST | ||||
|  * The GPIO allocated to each signal depend on the BLE_DTB_CFG value and cannot be changed | ||||
|  */ | ||||
| #if(BLE_DTB_CFG == 7) | ||||
| static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] = { | ||||
|     {GPIOB, LL_GPIO_PIN_2, 0, 0}, /* DTB10 - Tx/Rx SPI */ | ||||
|     {GPIOB, LL_GPIO_PIN_7, 0, 0}, /* DTB11 - Tx/Tx SPI Clk */ | ||||
|     {GPIOA, LL_GPIO_PIN_8, 0, 0}, /* DTB12 - Tx/Rx Ready & SPI Select */ | ||||
|     {GPIOA, LL_GPIO_PIN_9, 0, 0}, /* DTB13 - Tx/Rx Start */ | ||||
|     {GPIOA, LL_GPIO_PIN_10, 0, 0}, /* DTB14 - FSM0 */ | ||||
|     {GPIOA, LL_GPIO_PIN_11, 0, 0}, /* DTB15 - FSM1 */ | ||||
|     {GPIOB, LL_GPIO_PIN_8, 0, 0}, /* DTB16 - FSM2 */ | ||||
|     {GPIOB, LL_GPIO_PIN_11, 0, 0}, /* DTB17 - FSM3 */ | ||||
|     {GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */ | ||||
| }; | ||||
| #endif | ||||
| /* USER CODE END PV */ | ||||
| 
 | ||||
| /* Global variables ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN GV */ | ||||
| /* USER CODE END GV */ | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* USER CODE BEGIN PFP */ | ||||
| static void APPD_SetCPU2GpioConfig(void); | ||||
| static void APPD_BleDtbCfg(void); | ||||
| /* USER CODE END PFP */ | ||||
| 
 | ||||
| /* Functions Definition ------------------------------------------------------*/ | ||||
| void APPD_Init(void) { | ||||
| /* USER CODE BEGIN APPD_Init */ | ||||
| #if(CFG_DEBUGGER_SUPPORTED == 1) | ||||
|     /**
 | ||||
|    * Keep debugger enabled while in any low power mode | ||||
|    */ | ||||
|     HAL_DBGMCU_EnableDBGSleepMode(); | ||||
|     HAL_DBGMCU_EnableDBGStopMode(); | ||||
| 
 | ||||
|     /***************** ENABLE DEBUGGER *************************************/ | ||||
|     LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48); | ||||
| 
 | ||||
| #else | ||||
|     GPIO_InitTypeDef gpio_config = {0}; | ||||
| 
 | ||||
|     gpio_config.Pull = GPIO_NOPULL; | ||||
|     gpio_config.Mode = GPIO_MODE_ANALOG; | ||||
| 
 | ||||
|     gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13; | ||||
|     __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
|     HAL_GPIO_Init(GPIOA, &gpio_config); | ||||
|     __HAL_RCC_GPIOA_CLK_DISABLE(); | ||||
| 
 | ||||
|     gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3; | ||||
|     __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|     HAL_GPIO_Init(GPIOB, &gpio_config); | ||||
|     __HAL_RCC_GPIOB_CLK_DISABLE(); | ||||
| 
 | ||||
|     HAL_DBGMCU_DisableDBGSleepMode(); | ||||
|     HAL_DBGMCU_DisableDBGStopMode(); | ||||
|     HAL_DBGMCU_DisableDBGStandbyMode(); | ||||
| 
 | ||||
| #endif /* (CFG_DEBUGGER_SUPPORTED == 1) */ | ||||
| 
 | ||||
| #if(CFG_DEBUG_TRACE != 0) | ||||
|     DbgTraceInit(); | ||||
| #endif | ||||
| 
 | ||||
|     APPD_SetCPU2GpioConfig(); | ||||
|     APPD_BleDtbCfg(); | ||||
| 
 | ||||
|     /* USER CODE END APPD_Init */ | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void APPD_EnableCPU2(void) { | ||||
|     /* USER CODE BEGIN APPD_EnableCPU2 */ | ||||
|     SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket = { | ||||
|         {{0, 0, 0}}, /**< Does not need to be initialized */ | ||||
|         {(uint8_t*)aGpioConfigList, | ||||
|          (uint8_t*)&APPD_TracesConfig, | ||||
|          (uint8_t*)&APPD_GeneralConfig, | ||||
|          GPIO_CFG_NBR_OF_FEATURES, | ||||
|          NBR_OF_TRACES_CONFIG_PARAMETERS, | ||||
|          NBR_OF_GENERAL_CONFIG_PARAMETERS}}; | ||||
| 
 | ||||
|     /**< Traces channel initialization */ | ||||
|     TL_TRACES_Init(); | ||||
| 
 | ||||
|     /** GPIO DEBUG Initialization */ | ||||
|     SHCI_C2_DEBUG_Init(&DebugCmdPacket); | ||||
| 
 | ||||
|     // GPIO_InitTypeDef  GPIO_InitStruct;
 | ||||
|     // GPIO_InitStruct.Pull = GPIO_NOPULL;
 | ||||
|     // GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | ||||
|     // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | ||||
|     // GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
 | ||||
|     // HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | ||||
|     // SHCI_C2_ExtpaConfig((uint32_t)GPIOC, LL_GPIO_PIN_3, EXT_PA_ENABLED_LOW, EXT_PA_ENABLED);
 | ||||
| 
 | ||||
|     /* USER CODE END APPD_EnableCPU2 */ | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| /*************************************************************
 | ||||
|  * | ||||
|  * LOCAL FUNCTIONS | ||||
|  * | ||||
|  *************************************************************/ | ||||
| static void APPD_SetCPU2GpioConfig(void) { | ||||
|     /* USER CODE BEGIN APPD_SetCPU2GpioConfig */ | ||||
|     GPIO_InitTypeDef gpio_config = {0}; | ||||
|     uint8_t local_loop; | ||||
|     uint16_t gpioa_pin_list; | ||||
|     uint16_t gpiob_pin_list; | ||||
|     uint16_t gpioc_pin_list; | ||||
| 
 | ||||
|     gpioa_pin_list = 0; | ||||
|     gpiob_pin_list = 0; | ||||
|     gpioc_pin_list = 0; | ||||
| 
 | ||||
|     for(local_loop = 0; local_loop < GPIO_CFG_NBR_OF_FEATURES; local_loop++) { | ||||
|         if(aGpioConfigList[local_loop].enable != 0) { | ||||
|             switch((uint32_t)aGpioConfigList[local_loop].port) { | ||||
|             case(uint32_t)GPIOA: | ||||
|                 gpioa_pin_list |= aGpioConfigList[local_loop].pin; | ||||
|                 break; | ||||
| 
 | ||||
|             case(uint32_t)GPIOB: | ||||
|                 gpiob_pin_list |= aGpioConfigList[local_loop].pin; | ||||
|                 break; | ||||
| 
 | ||||
|             case(uint32_t)GPIOC: | ||||
|                 gpioc_pin_list |= aGpioConfigList[local_loop].pin; | ||||
|                 break; | ||||
| 
 | ||||
|             default: | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     gpio_config.Pull = GPIO_NOPULL; | ||||
|     gpio_config.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
| 
 | ||||
|     if(gpioa_pin_list != 0) { | ||||
|         gpio_config.Pin = gpioa_pin_list; | ||||
|         __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
|         __HAL_RCC_C2GPIOA_CLK_ENABLE(); | ||||
|         HAL_GPIO_Init(GPIOA, &gpio_config); | ||||
|         HAL_GPIO_WritePin(GPIOA, gpioa_pin_list, GPIO_PIN_RESET); | ||||
|     } | ||||
| 
 | ||||
|     if(gpiob_pin_list != 0) { | ||||
|         gpio_config.Pin = gpiob_pin_list; | ||||
|         __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|         __HAL_RCC_C2GPIOB_CLK_ENABLE(); | ||||
|         HAL_GPIO_Init(GPIOB, &gpio_config); | ||||
|         HAL_GPIO_WritePin(GPIOB, gpiob_pin_list, GPIO_PIN_RESET); | ||||
|     } | ||||
| 
 | ||||
|     if(gpioc_pin_list != 0) { | ||||
|         gpio_config.Pin = gpioc_pin_list; | ||||
|         __HAL_RCC_GPIOC_CLK_ENABLE(); | ||||
|         __HAL_RCC_C2GPIOC_CLK_ENABLE(); | ||||
|         HAL_GPIO_Init(GPIOC, &gpio_config); | ||||
|         HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET); | ||||
|     } | ||||
| 
 | ||||
|     /* USER CODE END APPD_SetCPU2GpioConfig */ | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void APPD_BleDtbCfg(void) { | ||||
| /* USER CODE BEGIN APPD_BleDtbCfg */ | ||||
| #if(BLE_DTB_CFG != 0) | ||||
|     GPIO_InitTypeDef gpio_config = {0}; | ||||
|     uint8_t local_loop; | ||||
|     uint16_t gpioa_pin_list; | ||||
|     uint16_t gpiob_pin_list; | ||||
| 
 | ||||
|     gpioa_pin_list = 0; | ||||
|     gpiob_pin_list = 0; | ||||
| 
 | ||||
|     for(local_loop = 0; local_loop < GPIO_NBR_OF_RF_SIGNALS; local_loop++) { | ||||
|         if(aRfConfigList[local_loop].enable != 0) { | ||||
|             switch((uint32_t)aRfConfigList[local_loop].port) { | ||||
|             case(uint32_t)GPIOA: | ||||
|                 gpioa_pin_list |= aRfConfigList[local_loop].pin; | ||||
|                 break; | ||||
| 
 | ||||
|             case(uint32_t)GPIOB: | ||||
|                 gpiob_pin_list |= aRfConfigList[local_loop].pin; | ||||
|                 break; | ||||
| 
 | ||||
|             default: | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     gpio_config.Pull = GPIO_NOPULL; | ||||
|     gpio_config.Mode = GPIO_MODE_AF_PP; | ||||
|     gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|     gpio_config.Alternate = GPIO_AF6_RF_DTB7; | ||||
| 
 | ||||
|     if(gpioa_pin_list != 0) { | ||||
|         gpio_config.Pin = gpioa_pin_list; | ||||
|         __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
|         __HAL_RCC_C2GPIOA_CLK_ENABLE(); | ||||
|         HAL_GPIO_Init(GPIOA, &gpio_config); | ||||
|     } | ||||
| 
 | ||||
|     if(gpiob_pin_list != 0) { | ||||
|         gpio_config.Pin = gpiob_pin_list; | ||||
|         __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|         __HAL_RCC_C2GPIOB_CLK_ENABLE(); | ||||
|         HAL_GPIO_Init(GPIOB, &gpio_config); | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     /* USER CODE END APPD_BleDtbCfg */ | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| /*************************************************************
 | ||||
|  * | ||||
|  * WRAP FUNCTIONS | ||||
|  * | ||||
| *************************************************************/ | ||||
| #if(CFG_DEBUG_TRACE != 0) | ||||
| void DbgOutputInit(void) { | ||||
| } | ||||
| 
 | ||||
| void DbgOutputTraces(uint8_t* p_data, uint16_t size, void (*cb)(void)) { | ||||
|     furi_hal_console_tx(p_data, size); | ||||
|     cb(); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,38 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : app_debug.h | ||||
|   * Description        : Header for app_debug.c module | ||||
|  ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __APP_DEBUG_H | ||||
| #define __APP_DEBUG_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| void APPD_Init(void); | ||||
| void APPD_EnableCPU2(void); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /*__APP_DEBUG_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,81 +0,0 @@ | ||||
| #include "battery_service.h" | ||||
| #include "app_common.h" | ||||
| #include "ble.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| 
 | ||||
| #define TAG "BtBatterySvc" | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint16_t svc_handle; | ||||
|     uint16_t char_level_handle; | ||||
| } BatterySvc; | ||||
| 
 | ||||
| static BatterySvc* battery_svc = NULL; | ||||
| 
 | ||||
| static const uint16_t service_uuid = BATTERY_SERVICE_UUID; | ||||
| static const uint16_t char_battery_level_uuid = BATTERY_LEVEL_CHAR_UUID; | ||||
| 
 | ||||
| void battery_svc_start() { | ||||
|     battery_svc = malloc(sizeof(BatterySvc)); | ||||
|     tBleStatus status; | ||||
| 
 | ||||
|     // Add Battery service
 | ||||
|     status = aci_gatt_add_service( | ||||
|         UUID_TYPE_16, (Service_UUID_t*)&service_uuid, PRIMARY_SERVICE, 4, &battery_svc->svc_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add Battery service: %d", status); | ||||
|     } | ||||
|     // Add Battery level characteristic
 | ||||
|     status = aci_gatt_add_char( | ||||
|         battery_svc->svc_handle, | ||||
|         UUID_TYPE_16, | ||||
|         (Char_UUID_t*)&char_battery_level_uuid, | ||||
|         1, | ||||
|         CHAR_PROP_READ | CHAR_PROP_NOTIFY, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &battery_svc->char_level_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add Battery level characteristic: %d", status); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void battery_svc_stop() { | ||||
|     tBleStatus status; | ||||
|     if(battery_svc) { | ||||
|         // Delete Battery level characteristic
 | ||||
|         status = aci_gatt_del_char(battery_svc->svc_handle, battery_svc->char_level_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Battery level characteristic: %d", status); | ||||
|         } | ||||
|         // Delete Battery service
 | ||||
|         status = aci_gatt_del_service(battery_svc->svc_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Battery service: %d", status); | ||||
|         } | ||||
|         free(battery_svc); | ||||
|         battery_svc = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool battery_svc_is_started() { | ||||
|     return battery_svc != NULL; | ||||
| } | ||||
| 
 | ||||
| bool battery_svc_update_level(uint8_t battery_charge) { | ||||
|     // Check if service was started
 | ||||
|     if(battery_svc == NULL) { | ||||
|         return false; | ||||
|     } | ||||
|     // Update battery level characteristic
 | ||||
|     FURI_LOG_I(TAG, "Updating battery level characteristic"); | ||||
|     tBleStatus result = aci_gatt_update_char_value( | ||||
|         battery_svc->svc_handle, battery_svc->char_level_handle, 0, 1, &battery_charge); | ||||
|     if(result) { | ||||
|         FURI_LOG_E(TAG, "Failed updating RX characteristic: %d", result); | ||||
|     } | ||||
|     return result != BLE_STATUS_SUCCESS; | ||||
| } | ||||
| @ -1,20 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| void battery_svc_start(); | ||||
| 
 | ||||
| void battery_svc_stop(); | ||||
| 
 | ||||
| bool battery_svc_is_started(); | ||||
| 
 | ||||
| bool battery_svc_update_level(uint8_t battery_level); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,185 +0,0 @@ | ||||
| #include "ble_app.h" | ||||
| 
 | ||||
| #include "hci_tl.h" | ||||
| #include "ble.h" | ||||
| #include "shci.h" | ||||
| #include "gap.h" | ||||
| 
 | ||||
| #include <furi_hal.h> | ||||
| 
 | ||||
| #define TAG "Bt" | ||||
| 
 | ||||
| #define BLE_APP_FLAG_HCI_EVENT (1UL << 0) | ||||
| #define BLE_APP_FLAG_KILL_THREAD (1UL << 1) | ||||
| #define BLE_APP_FLAG_ALL (BLE_APP_FLAG_HCI_EVENT | BLE_APP_FLAG_KILL_THREAD) | ||||
| 
 | ||||
| PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t ble_app_cmd_buffer; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint32_t ble_app_nvm[BLE_NVM_SRAM_SIZE]; | ||||
| 
 | ||||
| _Static_assert( | ||||
|     sizeof(SHCI_C2_Ble_Init_Cmd_Packet_t) == 49, | ||||
|     "Ble stack config structure size mismatch"); | ||||
| 
 | ||||
| typedef struct { | ||||
|     osMutexId_t hci_mtx; | ||||
|     osSemaphoreId_t hci_sem; | ||||
|     FuriThread* thread; | ||||
|     osEventFlagsId_t event_flags; | ||||
| } BleApp; | ||||
| 
 | ||||
| static BleApp* ble_app = NULL; | ||||
| 
 | ||||
| static int32_t ble_app_hci_thread(void* context); | ||||
| static void ble_app_hci_event_handler(void* pPayload); | ||||
| static void ble_app_hci_status_not_handler(HCI_TL_CmdStatus_t status); | ||||
| 
 | ||||
| bool ble_app_init() { | ||||
|     SHCI_CmdStatus_t status; | ||||
|     ble_app = malloc(sizeof(BleApp)); | ||||
|     // Allocate semafore and mutex for ble command buffer access
 | ||||
|     ble_app->hci_mtx = osMutexNew(NULL); | ||||
|     ble_app->hci_sem = osSemaphoreNew(1, 0, NULL); | ||||
|     ble_app->event_flags = osEventFlagsNew(NULL); | ||||
|     // HCI transport layer thread to handle user asynch events
 | ||||
|     ble_app->thread = furi_thread_alloc(); | ||||
|     furi_thread_set_name(ble_app->thread, "BleHciDriver"); | ||||
|     furi_thread_set_stack_size(ble_app->thread, 1024); | ||||
|     furi_thread_set_context(ble_app->thread, ble_app); | ||||
|     furi_thread_set_callback(ble_app->thread, ble_app_hci_thread); | ||||
|     furi_thread_start(ble_app->thread); | ||||
| 
 | ||||
|     // Initialize Ble Transport Layer
 | ||||
|     HCI_TL_HciInitConf_t hci_tl_config = { | ||||
|         .p_cmdbuffer = (uint8_t*)&ble_app_cmd_buffer, | ||||
|         .StatusNotCallBack = ble_app_hci_status_not_handler, | ||||
|     }; | ||||
|     hci_init(ble_app_hci_event_handler, (void*)&hci_tl_config); | ||||
| 
 | ||||
|     // Configure NVM store for pairing data
 | ||||
|     SHCI_C2_CONFIG_Cmd_Param_t config_param = { | ||||
|         .PayloadCmdSize = SHCI_C2_CONFIG_PAYLOAD_CMD_SIZE, | ||||
|         .Config1 = SHCI_C2_CONFIG_CONFIG1_BIT0_BLE_NVM_DATA_TO_SRAM, | ||||
|         .BleNvmRamAddress = (uint32_t)ble_app_nvm, | ||||
|         .EvtMask1 = SHCI_C2_CONFIG_EVTMASK1_BIT1_BLE_NVM_RAM_UPDATE_ENABLE, | ||||
|     }; | ||||
|     status = SHCI_C2_Config(&config_param); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to configure 2nd core: %d", status); | ||||
|     } | ||||
| 
 | ||||
|     // Start ble stack on 2nd core
 | ||||
|     SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet = { | ||||
|         .Header = {{0, 0, 0}}, // Header unused
 | ||||
|         .Param = { | ||||
|             .pBleBufferAddress = 0, // pBleBufferAddress not used
 | ||||
|             .BleBufferSize = 0, // BleBufferSize not used
 | ||||
|             .NumAttrRecord = CFG_BLE_NUM_GATT_ATTRIBUTES, | ||||
|             .NumAttrServ = CFG_BLE_NUM_GATT_SERVICES, | ||||
|             .AttrValueArrSize = CFG_BLE_ATT_VALUE_ARRAY_SIZE, | ||||
|             .NumOfLinks = CFG_BLE_NUM_LINK, | ||||
|             .ExtendedPacketLengthEnable = CFG_BLE_DATA_LENGTH_EXTENSION, | ||||
|             .PrWriteListSize = CFG_BLE_PREPARE_WRITE_LIST_SIZE, | ||||
|             .MblockCount = CFG_BLE_MBLOCK_COUNT, | ||||
|             .AttMtu = CFG_BLE_MAX_ATT_MTU, | ||||
|             .SlaveSca = CFG_BLE_SLAVE_SCA, | ||||
|             .MasterSca = CFG_BLE_MASTER_SCA, | ||||
|             .LsSource = CFG_BLE_LSE_SOURCE, | ||||
|             .MaxConnEventLength = CFG_BLE_MAX_CONN_EVENT_LENGTH, | ||||
|             .HsStartupTime = CFG_BLE_HSE_STARTUP_TIME, | ||||
|             .ViterbiEnable = CFG_BLE_VITERBI_MODE, | ||||
|             .Options = CFG_BLE_OPTIONS, | ||||
|             .HwVersion = 0, | ||||
|             .max_coc_initiator_nbr = 32, | ||||
|             .min_tx_power = 0, | ||||
|             .max_tx_power = 0, | ||||
|             .rx_model_config = 1, | ||||
|         }}; | ||||
|     status = SHCI_C2_BLE_Init(&ble_init_cmd_packet); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to start ble stack: %d", status); | ||||
|     } | ||||
|     return status == SHCI_Success; | ||||
| } | ||||
| 
 | ||||
| void ble_app_get_key_storage_buff(uint8_t** addr, uint16_t* size) { | ||||
|     *addr = (uint8_t*)ble_app_nvm; | ||||
|     *size = sizeof(ble_app_nvm); | ||||
| } | ||||
| 
 | ||||
| void ble_app_thread_stop() { | ||||
|     if(ble_app) { | ||||
|         osEventFlagsSet(ble_app->event_flags, BLE_APP_FLAG_KILL_THREAD); | ||||
|         furi_thread_join(ble_app->thread); | ||||
|         furi_thread_free(ble_app->thread); | ||||
|         // Wait to make sure that EventFlags delivers pending events before memory free
 | ||||
|         osDelay(50); | ||||
|         // Free resources
 | ||||
|         osMutexDelete(ble_app->hci_mtx); | ||||
|         osSemaphoreDelete(ble_app->hci_sem); | ||||
|         osEventFlagsDelete(ble_app->event_flags); | ||||
|         free(ble_app); | ||||
|         ble_app = NULL; | ||||
|         memset(&ble_app_cmd_buffer, 0, sizeof(ble_app_cmd_buffer)); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static int32_t ble_app_hci_thread(void* arg) { | ||||
|     uint32_t flags = 0; | ||||
|     while(1) { | ||||
|         flags = osEventFlagsWait( | ||||
|             ble_app->event_flags, BLE_APP_FLAG_ALL, osFlagsWaitAny, osWaitForever); | ||||
|         if(flags & BLE_APP_FLAG_KILL_THREAD) { | ||||
|             break; | ||||
|         } | ||||
|         if(flags & BLE_APP_FLAG_HCI_EVENT) { | ||||
|             hci_user_evt_proc(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| // Called by WPAN lib
 | ||||
| void hci_notify_asynch_evt(void* pdata) { | ||||
|     if(ble_app) { | ||||
|         osEventFlagsSet(ble_app->event_flags, BLE_APP_FLAG_HCI_EVENT); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void hci_cmd_resp_release(uint32_t flag) { | ||||
|     if(ble_app) { | ||||
|         osSemaphoreRelease(ble_app->hci_sem); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void hci_cmd_resp_wait(uint32_t timeout) { | ||||
|     if(ble_app) { | ||||
|         osSemaphoreAcquire(ble_app->hci_sem, osWaitForever); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void ble_app_hci_event_handler(void* pPayload) { | ||||
|     SVCCTL_UserEvtFlowStatus_t svctl_return_status; | ||||
|     tHCI_UserEvtRxParam* pParam = (tHCI_UserEvtRxParam*)pPayload; | ||||
| 
 | ||||
|     if(ble_app) { | ||||
|         svctl_return_status = SVCCTL_UserEvtRx((void*)&(pParam->pckt->evtserial)); | ||||
|         if(svctl_return_status != SVCCTL_UserEvtFlowDisable) { | ||||
|             pParam->status = HCI_TL_UserEventFlow_Enable; | ||||
|         } else { | ||||
|             pParam->status = HCI_TL_UserEventFlow_Disable; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void ble_app_hci_status_not_handler(HCI_TL_CmdStatus_t status) { | ||||
|     if(status == HCI_TL_CmdBusy) { | ||||
|         osMutexAcquire(ble_app->hci_mtx, osWaitForever); | ||||
|     } else if(status == HCI_TL_CmdAvailable) { | ||||
|         osMutexRelease(ble_app->hci_mtx); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void SVCCTL_ResumeUserEventFlow(void) { | ||||
|     hci_resume_flow(); | ||||
| } | ||||
| @ -1,16 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| bool ble_app_init(); | ||||
| void ble_app_get_key_storage_buff(uint8_t** addr, uint16_t* size); | ||||
| void ble_app_thread_stop(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,69 +0,0 @@ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : App/ble_conf.h | ||||
|   * Description        : Configuration file for BLE Middleware. | ||||
|   * | ||||
|  ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef BLE_CONF_H | ||||
| #define BLE_CONF_H | ||||
| 
 | ||||
| #include "app_conf.h" | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * | ||||
|  * BLE SERVICES CONFIGURATION | ||||
|  * blesvc | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
| 
 | ||||
| /**
 | ||||
|  * This setting shall be set to '1' if the device needs to support the Peripheral Role | ||||
|  * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1' | ||||
|  */ | ||||
| #define BLE_CFG_PERIPHERAL 1 | ||||
| 
 | ||||
| /**
 | ||||
|  * This setting shall be set to '1' if the device needs to support the Central Role | ||||
|  * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1' | ||||
|  */ | ||||
| #define BLE_CFG_CENTRAL 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * There is one handler per service enabled | ||||
|  * Note: There is no handler for the Device Information Service | ||||
|  * | ||||
|  * This shall take into account all registered handlers | ||||
|  * (from either the provided services or the custom services) | ||||
|  */ | ||||
| #define BLE_CFG_SVC_MAX_NBR_CB 7 | ||||
| 
 | ||||
| #define BLE_CFG_CLT_MAX_NBR_CB 0 | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * GAP Service - Apprearance | ||||
|  ******************************************************************************/ | ||||
| 
 | ||||
| #define BLE_CFG_UNKNOWN_APPEARANCE (0) | ||||
| #define BLE_CFG_GAP_APPEARANCE (0x0086) | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * Over The Air Feature (OTA) - STM Proprietary | ||||
|  ******************************************************************************/ | ||||
| #define BLE_CFG_OTA_REBOOT_CHAR 0 /**< REBOOT OTA MODE CHARACTERISTIC */ | ||||
| 
 | ||||
| #endif /*BLE_CONF_H */ | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,199 +0,0 @@ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : App/ble_dbg_conf.h | ||||
|   * Description        : Debug configuration file for BLE Middleware. | ||||
|   * | ||||
|  ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __BLE_DBG_CONF_H | ||||
| #define __BLE_DBG_CONF_H | ||||
| 
 | ||||
| /**
 | ||||
|  * Enable or Disable traces from BLE | ||||
|  */ | ||||
| 
 | ||||
| #define BLE_DBG_APP_EN 1 | ||||
| #define BLE_DBG_DIS_EN 1 | ||||
| #define BLE_DBG_HRS_EN 1 | ||||
| #define BLE_DBG_SVCCTL_EN 1 | ||||
| #define BLE_DBG_BLS_EN 1 | ||||
| #define BLE_DBG_HTS_EN 1 | ||||
| #define BLE_DBG_P2P_STM_EN 1 | ||||
| 
 | ||||
| /**
 | ||||
|  * Macro definition | ||||
|  */ | ||||
| #if(BLE_DBG_APP_EN != 0) | ||||
| #define BLE_DBG_APP_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_APP_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_DIS_EN != 0) | ||||
| #define BLE_DBG_DIS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_DIS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_HRS_EN != 0) | ||||
| #define BLE_DBG_HRS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_HRS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_P2P_STM_EN != 0) | ||||
| #define BLE_DBG_P2P_STM_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_P2P_STM_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_TEMPLATE_STM_EN != 0) | ||||
| #define BLE_DBG_TEMPLATE_STM_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_TEMPLATE_STM_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_EDS_STM_EN != 0) | ||||
| #define BLE_DBG_EDS_STM_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_EDS_STM_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_LBS_STM_EN != 0) | ||||
| #define BLE_DBG_LBS_STM_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_LBS_STM_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_SVCCTL_EN != 0) | ||||
| #define BLE_DBG_SVCCTL_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_SVCCTL_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_CTS_EN != 0) | ||||
| #define BLE_DBG_CTS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_CTS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_HIDS_EN != 0) | ||||
| #define BLE_DBG_HIDS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_HIDS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_PASS_EN != 0) | ||||
| #define BLE_DBG_PASS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_PASS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_BLS_EN != 0) | ||||
| #define BLE_DBG_BLS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_BLS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_HTS_EN != 0) | ||||
| #define BLE_DBG_HTS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_HTS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_ANS_EN != 0) | ||||
| #define BLE_DBG_ANS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_ANS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_ESS_EN != 0) | ||||
| #define BLE_DBG_ESS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_ESS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_GLS_EN != 0) | ||||
| #define BLE_DBG_GLS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_GLS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_BAS_EN != 0) | ||||
| #define BLE_DBG_BAS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_BAS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_RTUS_EN != 0) | ||||
| #define BLE_DBG_RTUS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_RTUS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_HPS_EN != 0) | ||||
| #define BLE_DBG_HPS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_HPS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_TPS_EN != 0) | ||||
| #define BLE_DBG_TPS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_TPS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_LLS_EN != 0) | ||||
| #define BLE_DBG_LLS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_LLS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_IAS_EN != 0) | ||||
| #define BLE_DBG_IAS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_IAS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_WSS_EN != 0) | ||||
| #define BLE_DBG_WSS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_WSS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_LNS_EN != 0) | ||||
| #define BLE_DBG_LNS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_LNS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_SCPS_EN != 0) | ||||
| #define BLE_DBG_SCPS_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define BLE_DBG_SCPS_MSG PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #if(BLE_DBG_DTS_EN != 0) | ||||
| #define BLE_DBG_DTS_MSG PRINT_MESG_DBG | ||||
| #define BLE_DBG_DTS_BUF PRINT_LOG_BUFF_DBG | ||||
| #else | ||||
| #define BLE_DBG_DTS_MSG PRINT_NO_MESG | ||||
| #define BLE_DBG_DTS_BUF PRINT_NO_MESG | ||||
| #endif | ||||
| 
 | ||||
| #endif /*__BLE_DBG_CONF_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,312 +0,0 @@ | ||||
| #include "ble_glue.h" | ||||
| #include "app_common.h" | ||||
| #include "main.h" | ||||
| #include "ble_app.h" | ||||
| #include "ble.h" | ||||
| #include "tl.h" | ||||
| #include "shci.h" | ||||
| #include "shci_tl.h" | ||||
| #include "app_debug.h" | ||||
| #include <furi_hal.h> | ||||
| 
 | ||||
| #define TAG "Core2" | ||||
| 
 | ||||
| #define BLE_GLUE_FLAG_SHCI_EVENT (1UL << 0) | ||||
| #define BLE_GLUE_FLAG_KILL_THREAD (1UL << 1) | ||||
| #define BLE_GLUE_FLAG_ALL (BLE_GLUE_FLAG_SHCI_EVENT | BLE_GLUE_FLAG_KILL_THREAD) | ||||
| 
 | ||||
| #define POOL_SIZE                      \ | ||||
|     (CFG_TLBLE_EVT_QUEUE_LENGTH * 4U * \ | ||||
|      DIVC((sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE), 4U)) | ||||
| 
 | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ble_glue_event_pool[POOL_SIZE]; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ble_glue_system_cmd_buff; | ||||
| PLACE_IN_SECTION("MB_MEM2") | ||||
| ALIGN(4) | ||||
| static uint8_t ble_glue_system_spare_event_buff[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U]; | ||||
| PLACE_IN_SECTION("MB_MEM2") | ||||
| ALIGN(4) | ||||
| static uint8_t ble_glue_ble_spare_event_buff[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255]; | ||||
| 
 | ||||
| typedef enum { | ||||
|     // Stage 1: core2 startup and FUS
 | ||||
|     BleGlueStatusStartup, | ||||
|     BleGlueStatusBroken, | ||||
|     BleGlueStatusFusStarted, | ||||
|     // Stage 2: radio stack
 | ||||
|     BleGlueStatusRadioStackStarted, | ||||
|     BleGlueStatusRadioStackMissing | ||||
| } BleGlueStatus; | ||||
| 
 | ||||
| typedef struct { | ||||
|     osMutexId_t shci_mtx; | ||||
|     osSemaphoreId_t shci_sem; | ||||
|     osEventFlagsId_t event_flags; | ||||
|     FuriThread* thread; | ||||
|     BleGlueStatus status; | ||||
|     BleGlueKeyStorageChangedCallback callback; | ||||
|     void* context; | ||||
| } BleGlue; | ||||
| 
 | ||||
| static BleGlue* ble_glue = NULL; | ||||
| 
 | ||||
| static int32_t ble_glue_shci_thread(void* argument); | ||||
| static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status); | ||||
| static void ble_glue_sys_user_event_callback(void* pPayload); | ||||
| 
 | ||||
| void ble_glue_set_key_storage_changed_callback( | ||||
|     BleGlueKeyStorageChangedCallback callback, | ||||
|     void* context) { | ||||
|     furi_assert(ble_glue); | ||||
|     furi_assert(callback); | ||||
|     ble_glue->callback = callback; | ||||
|     ble_glue->context = context; | ||||
| } | ||||
| 
 | ||||
| void ble_glue_init() { | ||||
|     ble_glue = malloc(sizeof(BleGlue)); | ||||
|     ble_glue->status = BleGlueStatusStartup; | ||||
| 
 | ||||
|     // Configure the system Power Mode
 | ||||
|     // Select HSI as system clock source after Wake Up from Stop mode
 | ||||
|     LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI); | ||||
|     /* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */ | ||||
|     LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); | ||||
|     furi_hal_power_insomnia_enter(); | ||||
| 
 | ||||
|     // APPD_Init();
 | ||||
| 
 | ||||
|     // Initialize all transport layers
 | ||||
|     TL_MM_Config_t tl_mm_config; | ||||
|     SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf; | ||||
|     // Reference table initialization
 | ||||
|     TL_Init(); | ||||
| 
 | ||||
|     ble_glue->shci_mtx = osMutexNew(NULL); | ||||
|     ble_glue->shci_sem = osSemaphoreNew(1, 0, NULL); | ||||
|     ble_glue->event_flags = osEventFlagsNew(NULL); | ||||
| 
 | ||||
|     // FreeRTOS system task creation
 | ||||
|     ble_glue->thread = furi_thread_alloc(); | ||||
|     furi_thread_set_name(ble_glue->thread, "BleShciDriver"); | ||||
|     furi_thread_set_stack_size(ble_glue->thread, 1024); | ||||
|     furi_thread_set_context(ble_glue->thread, ble_glue); | ||||
|     furi_thread_set_callback(ble_glue->thread, ble_glue_shci_thread); | ||||
|     furi_thread_start(ble_glue->thread); | ||||
| 
 | ||||
|     // System channel initialization
 | ||||
|     SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&ble_glue_system_cmd_buff; | ||||
|     SHci_Tl_Init_Conf.StatusNotCallBack = ble_glue_sys_status_not_callback; | ||||
|     shci_init(ble_glue_sys_user_event_callback, (void*)&SHci_Tl_Init_Conf); | ||||
| 
 | ||||
|     /**< Memory Manager channel initialization */ | ||||
|     tl_mm_config.p_BleSpareEvtBuffer = ble_glue_ble_spare_event_buff; | ||||
|     tl_mm_config.p_SystemSpareEvtBuffer = ble_glue_system_spare_event_buff; | ||||
|     tl_mm_config.p_AsynchEvtPool = ble_glue_event_pool; | ||||
|     tl_mm_config.AsynchEvtPoolSize = POOL_SIZE; | ||||
|     TL_MM_Init(&tl_mm_config); | ||||
|     TL_Enable(); | ||||
| 
 | ||||
|     /*
 | ||||
|      * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready ) | ||||
|      * received on the system channel before starting the Stack | ||||
|      * This system event is received with ble_glue_sys_user_event_callback() | ||||
|      */ | ||||
| } | ||||
| 
 | ||||
| bool ble_glue_wait_for_fus_start(WirelessFwInfo_t* info) { | ||||
|     bool ret = false; | ||||
| 
 | ||||
|     size_t countdown = 1000; | ||||
|     while(countdown > 0) { | ||||
|         if(ble_glue->status == BleGlueStatusFusStarted) { | ||||
|             ret = true; | ||||
|             break; | ||||
|         } | ||||
|         countdown--; | ||||
|         osDelay(1); | ||||
|     } | ||||
| 
 | ||||
|     if(ble_glue->status == BleGlueStatusFusStarted) { | ||||
|         SHCI_GetWirelessFwInfo(info); | ||||
|     } else { | ||||
|         FURI_LOG_E(TAG, "Failed to start FUS"); | ||||
|         ble_glue->status = BleGlueStatusBroken; | ||||
|     } | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool ble_glue_start() { | ||||
|     furi_assert(ble_glue); | ||||
| 
 | ||||
|     if(ble_glue->status != BleGlueStatusFusStarted) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     bool ret = false; | ||||
|     furi_hal_power_insomnia_enter(); | ||||
|     if(ble_app_init()) { | ||||
|         FURI_LOG_I(TAG, "Radio stack started"); | ||||
|         ble_glue->status = BleGlueStatusRadioStackStarted; | ||||
|         ret = true; | ||||
|         if(SHCI_C2_SetFlashActivityControl(FLASH_ACTIVITY_CONTROL_SEM7) == SHCI_Success) { | ||||
|             FURI_LOG_I(TAG, "Flash activity control switched to SEM7"); | ||||
|         } else { | ||||
|             FURI_LOG_E(TAG, "Failed to switch flash activity control to SEM7"); | ||||
|         } | ||||
|     } else { | ||||
|         FURI_LOG_E(TAG, "Radio stack startup failed"); | ||||
|         ble_glue->status = BleGlueStatusRadioStackMissing; | ||||
|         ble_app_thread_stop(); | ||||
|     } | ||||
|     furi_hal_power_insomnia_exit(); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool ble_glue_is_alive() { | ||||
|     if(!ble_glue) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     return ble_glue->status >= BleGlueStatusFusStarted; | ||||
| } | ||||
| 
 | ||||
| bool ble_glue_is_radio_stack_ready() { | ||||
|     if(!ble_glue) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     return ble_glue->status == BleGlueStatusRadioStackStarted; | ||||
| } | ||||
| 
 | ||||
| bool ble_glue_radio_stack_fw_launch_started() { | ||||
|     bool ret = false; | ||||
|     // Get FUS status
 | ||||
|     SHCI_FUS_GetState_ErrorCode_t err_code = 0; | ||||
|     uint8_t state = SHCI_C2_FUS_GetState(&err_code); | ||||
|     if(state == FUS_STATE_VALUE_IDLE) { | ||||
|         // When FUS is running we can't read radio stack version correctly
 | ||||
|         // Trying to start radio stack fw, which leads to reset
 | ||||
|         FURI_LOG_W(TAG, "FUS is running. Restart to launch Radio Stack"); | ||||
|         SHCI_CmdStatus_t status = SHCI_C2_FUS_StartWs(); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to start Radio Stack with status: %02X", status); | ||||
|         } else { | ||||
|             ret = true; | ||||
|         } | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status) { | ||||
|     switch(status) { | ||||
|     case SHCI_TL_CmdBusy: | ||||
|         osMutexAcquire(ble_glue->shci_mtx, osWaitForever); | ||||
|         break; | ||||
|     case SHCI_TL_CmdAvailable: | ||||
|         osMutexRelease(ble_glue->shci_mtx); | ||||
|         break; | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * The type of the payload for a system user event is tSHCI_UserEvtRxParam | ||||
|  * When the system event is both : | ||||
|  *    - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY) | ||||
|  *    - reported by the FUS (sysevt_ready_rsp == FUS_FW_RUNNING) | ||||
|  * The buffer shall not be released | ||||
|  * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable ) | ||||
|  * When the status is not filled, the buffer is released by default | ||||
|  */ | ||||
| static void ble_glue_sys_user_event_callback(void* pPayload) { | ||||
|     UNUSED(pPayload); | ||||
|     /* Traces channel initialization */ | ||||
|     // APPD_EnableCPU2( );
 | ||||
| 
 | ||||
|     TL_AsynchEvt_t* p_sys_event = | ||||
|         (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload); | ||||
| 
 | ||||
|     if(p_sys_event->subevtcode == SHCI_SUB_EVT_CODE_READY) { | ||||
|         FURI_LOG_I(TAG, "Fus started"); | ||||
|         ble_glue->status = BleGlueStatusFusStarted; | ||||
|         furi_hal_power_insomnia_exit(); | ||||
|     } else if(p_sys_event->subevtcode == SHCI_SUB_EVT_ERROR_NOTIF) { | ||||
|         FURI_LOG_E(TAG, "Error during initialization"); | ||||
|         furi_hal_power_insomnia_exit(); | ||||
|     } else if(p_sys_event->subevtcode == SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE) { | ||||
|         SHCI_C2_BleNvmRamUpdate_Evt_t* p_sys_ble_nvm_ram_update_event = | ||||
|             (SHCI_C2_BleNvmRamUpdate_Evt_t*)p_sys_event->payload; | ||||
|         if(ble_glue->callback) { | ||||
|             ble_glue->callback( | ||||
|                 (uint8_t*)p_sys_ble_nvm_ram_update_event->StartAddress, | ||||
|                 p_sys_ble_nvm_ram_update_event->Size, | ||||
|                 ble_glue->context); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void ble_glue_clear_shared_memory() { | ||||
|     memset(ble_glue_event_pool, 0, sizeof(ble_glue_event_pool)); | ||||
|     memset(&ble_glue_system_cmd_buff, 0, sizeof(ble_glue_system_cmd_buff)); | ||||
|     memset(ble_glue_system_spare_event_buff, 0, sizeof(ble_glue_system_spare_event_buff)); | ||||
|     memset(ble_glue_ble_spare_event_buff, 0, sizeof(ble_glue_ble_spare_event_buff)); | ||||
| } | ||||
| 
 | ||||
| void ble_glue_thread_stop() { | ||||
|     if(ble_glue) { | ||||
|         osEventFlagsSet(ble_glue->event_flags, BLE_GLUE_FLAG_KILL_THREAD); | ||||
|         furi_thread_join(ble_glue->thread); | ||||
|         furi_thread_free(ble_glue->thread); | ||||
|         // Wait to make sure that EventFlags delivers pending events before memory free
 | ||||
|         osDelay(50); | ||||
|         // Free resources
 | ||||
|         osMutexDelete(ble_glue->shci_mtx); | ||||
|         osSemaphoreDelete(ble_glue->shci_sem); | ||||
|         osEventFlagsDelete(ble_glue->event_flags); | ||||
|         ble_glue_clear_shared_memory(); | ||||
|         free(ble_glue); | ||||
|         ble_glue = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // Wrap functions
 | ||||
| static int32_t ble_glue_shci_thread(void* context) { | ||||
|     uint32_t flags = 0; | ||||
|     while(true) { | ||||
|         flags = osEventFlagsWait( | ||||
|             ble_glue->event_flags, BLE_GLUE_FLAG_ALL, osFlagsWaitAny, osWaitForever); | ||||
|         if(flags & BLE_GLUE_FLAG_SHCI_EVENT) { | ||||
|             shci_user_evt_proc(); | ||||
|         } | ||||
|         if(flags & BLE_GLUE_FLAG_KILL_THREAD) { | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void shci_notify_asynch_evt(void* pdata) { | ||||
|     UNUSED(pdata); | ||||
|     if(ble_glue) { | ||||
|         osEventFlagsSet(ble_glue->event_flags, BLE_GLUE_FLAG_SHCI_EVENT); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void shci_cmd_resp_release(uint32_t flag) { | ||||
|     UNUSED(flag); | ||||
|     if(ble_glue) { | ||||
|         osSemaphoreRelease(ble_glue->shci_sem); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void shci_cmd_resp_wait(uint32_t timeout) { | ||||
|     UNUSED(timeout); | ||||
|     if(ble_glue) { | ||||
|         osSemaphoreAcquire(ble_glue->shci_sem, osWaitForever); | ||||
|     } | ||||
| } | ||||
| @ -1,57 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include <shci/shci.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef void ( | ||||
|     *BleGlueKeyStorageChangedCallback)(uint8_t* change_addr_start, uint16_t size, void* context); | ||||
| 
 | ||||
| /** Initialize start core2 and initialize transport */ | ||||
| void ble_glue_init(); | ||||
| 
 | ||||
| /** Start Core2 Radio stack
 | ||||
|  * | ||||
|  * @return     true on success | ||||
|  */ | ||||
| bool ble_glue_start(); | ||||
| 
 | ||||
| /** Is core2 alive and at least FUS is running
 | ||||
|  *  | ||||
|  * @return     true if core2 is alive | ||||
|  */ | ||||
| bool ble_glue_is_alive(); | ||||
| 
 | ||||
| bool ble_glue_wait_for_fus_start(WirelessFwInfo_t* info); | ||||
| 
 | ||||
| /** Is core2 radio stack present and ready
 | ||||
|  * | ||||
|  * @return     true if present and ready | ||||
|  */ | ||||
| bool ble_glue_is_radio_stack_ready(); | ||||
| 
 | ||||
| /** Set callback for NVM in RAM changes
 | ||||
|  * | ||||
|  * @param[in]  callback  The callback to call on NVM change | ||||
|  * @param      context   The context for callback | ||||
|  */ | ||||
| void ble_glue_set_key_storage_changed_callback( | ||||
|     BleGlueKeyStorageChangedCallback callback, | ||||
|     void* context); | ||||
| 
 | ||||
| /** Stop SHCI thread */ | ||||
| void ble_glue_thread_stop(); | ||||
| 
 | ||||
| /** Restart MCU to launch radio stack firmware if necessary
 | ||||
|  * | ||||
|  * @return      true on radio stack start command | ||||
|  */ | ||||
| bool ble_glue_radio_stack_fw_launch_started(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,213 +0,0 @@ | ||||
| #include "dev_info_service.h" | ||||
| #include "app_common.h" | ||||
| #include "ble.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| #include <m-string.h> | ||||
| #include <protobuf_version.h> | ||||
| 
 | ||||
| #define TAG "BtDevInfoSvc" | ||||
| 
 | ||||
| #define DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE (10) | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint16_t service_handle; | ||||
|     uint16_t man_name_char_handle; | ||||
|     uint16_t serial_num_char_handle; | ||||
|     uint16_t firmware_rev_char_handle; | ||||
|     uint16_t software_rev_char_handle; | ||||
|     uint16_t rpc_version_char_handle; | ||||
| } DevInfoSvc; | ||||
| 
 | ||||
| static DevInfoSvc* dev_info_svc = NULL; | ||||
| 
 | ||||
| static const char dev_info_man_name[] = "Flipper Devices Inc."; | ||||
| static const char dev_info_serial_num[] = "1.0"; | ||||
| static const char dev_info_firmware_rev_num[] = TOSTRING(TARGET); | ||||
| static const char dev_info_software_rev_num[] = GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM | ||||
|                                                            " " BUILD_DATE; | ||||
| 
 | ||||
| static const uint8_t dev_info_rpc_version_uuid[] = | ||||
|     {0x33, 0xa9, 0xb5, 0x3e, 0x87, 0x5d, 0x1a, 0x8e, 0xc8, 0x47, 0x5e, 0xae, 0x6d, 0x66, 0xf6, 0x03}; | ||||
| 
 | ||||
| void dev_info_svc_start() { | ||||
|     dev_info_svc = malloc(sizeof(DevInfoSvc)); | ||||
|     tBleStatus status; | ||||
| 
 | ||||
|     // Add Device Information Service
 | ||||
|     uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID; | ||||
|     status = aci_gatt_add_service( | ||||
|         UUID_TYPE_16, (Service_UUID_t*)&uuid, PRIMARY_SERVICE, 11, &dev_info_svc->service_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status); | ||||
|     } | ||||
| 
 | ||||
|     // Add characteristics
 | ||||
|     uuid = MANUFACTURER_NAME_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         dev_info_svc->service_handle, | ||||
|         UUID_TYPE_16, | ||||
|         (Char_UUID_t*)&uuid, | ||||
|         strlen(dev_info_man_name), | ||||
|         CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &dev_info_svc->man_name_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add manufacturer name char: %d", status); | ||||
|     } | ||||
|     uuid = SERIAL_NUMBER_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         dev_info_svc->service_handle, | ||||
|         UUID_TYPE_16, | ||||
|         (Char_UUID_t*)&uuid, | ||||
|         strlen(dev_info_serial_num), | ||||
|         CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &dev_info_svc->serial_num_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add serial number char: %d", status); | ||||
|     } | ||||
|     uuid = FIRMWARE_REVISION_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         dev_info_svc->service_handle, | ||||
|         UUID_TYPE_16, | ||||
|         (Char_UUID_t*)&uuid, | ||||
|         strlen(dev_info_firmware_rev_num), | ||||
|         CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &dev_info_svc->firmware_rev_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add firmware revision char: %d", status); | ||||
|     } | ||||
|     uuid = SOFTWARE_REVISION_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         dev_info_svc->service_handle, | ||||
|         UUID_TYPE_16, | ||||
|         (Char_UUID_t*)&uuid, | ||||
|         strlen(dev_info_software_rev_num), | ||||
|         CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &dev_info_svc->software_rev_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add software revision char: %d", status); | ||||
|     } | ||||
|     status = aci_gatt_add_char( | ||||
|         dev_info_svc->service_handle, | ||||
|         UUID_TYPE_128, | ||||
|         (const Char_UUID_t*)dev_info_rpc_version_uuid, | ||||
|         DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE, | ||||
|         CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &dev_info_svc->rpc_version_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add rpc version characteristic: %d", status); | ||||
|     } | ||||
| 
 | ||||
|     // Update characteristics
 | ||||
|     status = aci_gatt_update_char_value( | ||||
|         dev_info_svc->service_handle, | ||||
|         dev_info_svc->man_name_char_handle, | ||||
|         0, | ||||
|         strlen(dev_info_man_name), | ||||
|         (uint8_t*)dev_info_man_name); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to update manufacturer name char: %d", status); | ||||
|     } | ||||
|     status = aci_gatt_update_char_value( | ||||
|         dev_info_svc->service_handle, | ||||
|         dev_info_svc->serial_num_char_handle, | ||||
|         0, | ||||
|         strlen(dev_info_serial_num), | ||||
|         (uint8_t*)dev_info_serial_num); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to update serial number char: %d", status); | ||||
|     } | ||||
|     status = aci_gatt_update_char_value( | ||||
|         dev_info_svc->service_handle, | ||||
|         dev_info_svc->firmware_rev_char_handle, | ||||
|         0, | ||||
|         strlen(dev_info_firmware_rev_num), | ||||
|         (uint8_t*)dev_info_firmware_rev_num); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to update firmware revision char: %d", status); | ||||
|     } | ||||
|     status = aci_gatt_update_char_value( | ||||
|         dev_info_svc->service_handle, | ||||
|         dev_info_svc->software_rev_char_handle, | ||||
|         0, | ||||
|         strlen(dev_info_software_rev_num), | ||||
|         (uint8_t*)dev_info_software_rev_num); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to update software revision char: %d", status); | ||||
|     } | ||||
|     string_t rpc_version; | ||||
|     string_init_printf(rpc_version, "%d.%d", PROTOBUF_MAJOR_VERSION, PROTOBUF_MINOR_VERSION); | ||||
|     status = aci_gatt_update_char_value( | ||||
|         dev_info_svc->service_handle, | ||||
|         dev_info_svc->rpc_version_char_handle, | ||||
|         0, | ||||
|         strlen(string_get_cstr(rpc_version)), | ||||
|         (uint8_t*)string_get_cstr(rpc_version)); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to update rpc version char: %d", status); | ||||
|     } | ||||
|     string_clear(rpc_version); | ||||
| } | ||||
| 
 | ||||
| void dev_info_svc_stop() { | ||||
|     tBleStatus status; | ||||
|     if(dev_info_svc) { | ||||
|         // Delete service characteristics
 | ||||
|         status = | ||||
|             aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->man_name_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete manufacturer name char: %d", status); | ||||
|         } | ||||
|         status = | ||||
|             aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->serial_num_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete serial number char: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char( | ||||
|             dev_info_svc->service_handle, dev_info_svc->firmware_rev_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete firmware revision char: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char( | ||||
|             dev_info_svc->service_handle, dev_info_svc->software_rev_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete software revision char: %d", status); | ||||
|         } | ||||
|         status = | ||||
|             aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->rpc_version_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete rpc version char: %d", status); | ||||
|         } | ||||
|         // Delete service
 | ||||
|         status = aci_gatt_del_service(dev_info_svc->service_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete device info service: %d", status); | ||||
|         } | ||||
|         free(dev_info_svc); | ||||
|         dev_info_svc = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool dev_info_svc_is_started() { | ||||
|     return dev_info_svc != NULL; | ||||
| } | ||||
| @ -1,24 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #define DEV_INFO_MANUFACTURER_NAME "Flipper Devices Inc." | ||||
| #define DEV_INFO_SERIAL_NUMBER "1.0" | ||||
| #define DEV_INFO_FIRMWARE_REVISION_NUMBER TARGET | ||||
| #define DEV_INFO_SOFTWARE_REVISION_NUMBER \ | ||||
|     GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM " " BUILD_DATE | ||||
| 
 | ||||
| void dev_info_svc_start(); | ||||
| 
 | ||||
| void dev_info_svc_stop(); | ||||
| 
 | ||||
| bool dev_info_svc_is_started(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,581 +0,0 @@ | ||||
| #include "gap.h" | ||||
| 
 | ||||
| #include "ble.h" | ||||
| 
 | ||||
| #include <furi_hal.h> | ||||
| #include <furi.h> | ||||
| 
 | ||||
| #define TAG "BtGap" | ||||
| 
 | ||||
| #define FAST_ADV_TIMEOUT 30000 | ||||
| #define INITIAL_ADV_TIMEOUT 60000 | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint16_t gap_svc_handle; | ||||
|     uint16_t dev_name_char_handle; | ||||
|     uint16_t appearance_char_handle; | ||||
|     uint16_t connection_handle; | ||||
|     uint8_t adv_svc_uuid_len; | ||||
|     uint8_t adv_svc_uuid[20]; | ||||
|     char* adv_name; | ||||
| } GapSvc; | ||||
| 
 | ||||
| typedef struct { | ||||
|     GapSvc service; | ||||
|     GapConfig* config; | ||||
|     GapState state; | ||||
|     osMutexId_t state_mutex; | ||||
|     GapEventCallback on_event_cb; | ||||
|     void* context; | ||||
|     osTimerId_t advertise_timer; | ||||
|     FuriThread* thread; | ||||
|     osMessageQueueId_t command_queue; | ||||
|     bool enable_adv; | ||||
| } Gap; | ||||
| 
 | ||||
| typedef enum { | ||||
|     GapCommandAdvFast, | ||||
|     GapCommandAdvLowPower, | ||||
|     GapCommandAdvStop, | ||||
|     GapCommandKillThread, | ||||
| } GapCommand; | ||||
| 
 | ||||
| typedef struct { | ||||
|     GapScanCallback callback; | ||||
|     void* context; | ||||
| } GapScan; | ||||
| 
 | ||||
| // Identity root key
 | ||||
| static const uint8_t gap_irk[16] = | ||||
|     {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0}; | ||||
| // Encryption root key
 | ||||
| static const uint8_t gap_erk[16] = | ||||
|     {0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21, 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21}; | ||||
| 
 | ||||
| static Gap* gap = NULL; | ||||
| static GapScan* gap_scan = NULL; | ||||
| 
 | ||||
| static void gap_advertise_start(GapState new_state); | ||||
| static int32_t gap_app(void* context); | ||||
| 
 | ||||
| SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification(void* pckt) { | ||||
|     hci_event_pckt* event_pckt; | ||||
|     evt_le_meta_event* meta_evt; | ||||
|     evt_blue_aci* blue_evt; | ||||
|     hci_le_phy_update_complete_event_rp0* evt_le_phy_update_complete; | ||||
|     uint8_t tx_phy; | ||||
|     uint8_t rx_phy; | ||||
|     tBleStatus ret = BLE_STATUS_INVALID_PARAMS; | ||||
| 
 | ||||
|     event_pckt = (hci_event_pckt*)((hci_uart_pckt*)pckt)->data; | ||||
| 
 | ||||
|     if(gap) { | ||||
|         osMutexAcquire(gap->state_mutex, osWaitForever); | ||||
|     } | ||||
|     switch(event_pckt->evt) { | ||||
|     case EVT_DISCONN_COMPLETE: { | ||||
|         hci_disconnection_complete_event_rp0* disconnection_complete_event = | ||||
|             (hci_disconnection_complete_event_rp0*)event_pckt->data; | ||||
|         if(disconnection_complete_event->Connection_Handle == gap->service.connection_handle) { | ||||
|             gap->service.connection_handle = 0; | ||||
|             gap->state = GapStateIdle; | ||||
|             FURI_LOG_I( | ||||
|                 TAG, "Disconnect from client. Reason: %02X", disconnection_complete_event->Reason); | ||||
|         } | ||||
|         if(gap->enable_adv) { | ||||
|             // Restart advertising
 | ||||
|             gap_advertise_start(GapStateAdvFast); | ||||
|             furi_hal_power_insomnia_exit(); | ||||
|         } | ||||
|         GapEvent event = {.type = GapEventTypeDisconnected}; | ||||
|         gap->on_event_cb(event, gap->context); | ||||
|     } break; | ||||
| 
 | ||||
|     case EVT_LE_META_EVENT: | ||||
|         meta_evt = (evt_le_meta_event*)event_pckt->data; | ||||
|         switch(meta_evt->subevent) { | ||||
|         case EVT_LE_CONN_UPDATE_COMPLETE: { | ||||
|             hci_le_connection_update_complete_event_rp0* event = | ||||
|                 (hci_le_connection_update_complete_event_rp0*)meta_evt->data; | ||||
|             FURI_LOG_I( | ||||
|                 TAG, | ||||
|                 "Connection interval: %d, latency: %d, supervision timeout: %d", | ||||
|                 event->Conn_Interval, | ||||
|                 event->Conn_Latency, | ||||
|                 event->Supervision_Timeout); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case EVT_LE_PHY_UPDATE_COMPLETE: | ||||
|             evt_le_phy_update_complete = (hci_le_phy_update_complete_event_rp0*)meta_evt->data; | ||||
|             if(evt_le_phy_update_complete->Status) { | ||||
|                 FURI_LOG_E( | ||||
|                     TAG, "Update PHY failed, status %d", evt_le_phy_update_complete->Status); | ||||
|             } else { | ||||
|                 FURI_LOG_I(TAG, "Update PHY succeed"); | ||||
|             } | ||||
|             ret = hci_le_read_phy(gap->service.connection_handle, &tx_phy, &rx_phy); | ||||
|             if(ret) { | ||||
|                 FURI_LOG_E(TAG, "Read PHY failed, status: %d", ret); | ||||
|             } else { | ||||
|                 FURI_LOG_I(TAG, "PHY Params TX = %d, RX = %d ", tx_phy, rx_phy); | ||||
|             } | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_LE_CONN_COMPLETE: | ||||
|             furi_hal_power_insomnia_enter(); | ||||
|             hci_le_connection_complete_event_rp0* connection_complete_event = | ||||
|                 (hci_le_connection_complete_event_rp0*)meta_evt->data; | ||||
|             FURI_LOG_I( | ||||
|                 TAG, | ||||
|                 "Connection complete for connection handle 0x%x", | ||||
|                 connection_complete_event->Connection_Handle); | ||||
| 
 | ||||
|             // Stop advertising as connection completed
 | ||||
|             osTimerStop(gap->advertise_timer); | ||||
| 
 | ||||
|             // Update connection status and handle
 | ||||
|             gap->state = GapStateConnected; | ||||
|             gap->service.connection_handle = connection_complete_event->Connection_Handle; | ||||
|             GapConnectionParams* params = &gap->config->conn_param; | ||||
|             if(aci_l2cap_connection_parameter_update_req( | ||||
|                    gap->service.connection_handle, | ||||
|                    params->conn_int_min, | ||||
|                    params->conn_int_max, | ||||
|                    params->slave_latency, | ||||
|                    params->supervisor_timeout)) { | ||||
|                 FURI_LOG_W(TAG, "Failed to request connection parameters update"); | ||||
|             } | ||||
| 
 | ||||
|             // Start pairing by sending security request
 | ||||
|             aci_gap_slave_security_req(connection_complete_event->Connection_Handle); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_LE_ADVERTISING_REPORT: { | ||||
|             if(gap_scan) { | ||||
|                 GapAddress address; | ||||
|                 hci_le_advertising_report_event_rp0* evt = | ||||
|                     (hci_le_advertising_report_event_rp0*)meta_evt->data; | ||||
|                 for(uint8_t i = 0; i < evt->Num_Reports; i++) { | ||||
|                     Advertising_Report_t* rep = &evt->Advertising_Report[i]; | ||||
|                     address.type = rep->Address_Type; | ||||
|                     // Original MAC addres is in inverted order
 | ||||
|                     for(uint8_t j = 0; j < sizeof(address.mac); j++) { | ||||
|                         address.mac[j] = rep->Address[sizeof(address.mac) - j - 1]; | ||||
|                     } | ||||
|                     gap_scan->callback(address, gap_scan->context); | ||||
|                 } | ||||
|             } | ||||
|         } break; | ||||
| 
 | ||||
|         default: | ||||
|             break; | ||||
|         } | ||||
|         break; | ||||
| 
 | ||||
|     case EVT_VENDOR: | ||||
|         blue_evt = (evt_blue_aci*)event_pckt->data; | ||||
|         switch(blue_evt->ecode) { | ||||
|             aci_gap_pairing_complete_event_rp0* pairing_complete; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_LIMITED_DISCOVERABLE: | ||||
|             FURI_LOG_I(TAG, "Limited discoverable event"); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_PASS_KEY_REQUEST: { | ||||
|             // Generate random PIN code
 | ||||
|             uint32_t pin = rand() % 999999; | ||||
|             aci_gap_pass_key_resp(gap->service.connection_handle, pin); | ||||
|             if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { | ||||
|                 FURI_LOG_I(TAG, "Pass key request event. Pin: ******"); | ||||
|             } else { | ||||
|                 FURI_LOG_I(TAG, "Pass key request event. Pin: %06d", pin); | ||||
|             } | ||||
|             GapEvent event = {.type = GapEventTypePinCodeShow, .data.pin_code = pin}; | ||||
|             gap->on_event_cb(event, gap->context); | ||||
|         } break; | ||||
| 
 | ||||
|         case EVT_BLUE_ATT_EXCHANGE_MTU_RESP: { | ||||
|             aci_att_exchange_mtu_resp_event_rp0* pr = (void*)blue_evt->data; | ||||
|             FURI_LOG_I(TAG, "Rx MTU size: %d", pr->Server_RX_MTU); | ||||
|             // Set maximum packet size given header size is 3 bytes
 | ||||
|             GapEvent event = { | ||||
|                 .type = GapEventTypeUpdateMTU, .data.max_packet_size = pr->Server_RX_MTU - 3}; | ||||
|             gap->on_event_cb(event, gap->context); | ||||
|         } break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_AUTHORIZATION_REQUEST: | ||||
|             FURI_LOG_D(TAG, "Authorization request event"); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED: | ||||
|             FURI_LOG_D(TAG, "Slave security initiated"); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_BOND_LOST: | ||||
|             FURI_LOG_D(TAG, "Bond lost event. Start rebonding"); | ||||
|             aci_gap_allow_rebond(gap->service.connection_handle); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_DEVICE_FOUND: | ||||
|             FURI_LOG_D(TAG, "Device found event"); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_ADDR_NOT_RESOLVED: | ||||
|             FURI_LOG_D(TAG, "Address not resolved event"); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_KEYPRESS_NOTIFICATION: | ||||
|             FURI_LOG_D(TAG, "Key press notification event"); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE: { | ||||
|             uint32_t pin = | ||||
|                 ((aci_gap_numeric_comparison_value_event_rp0*)(blue_evt->data))->Numeric_Value; | ||||
|             FURI_LOG_I(TAG, "Verify numeric comparison: %06d", pin); | ||||
|             GapEvent event = {.type = GapEventTypePinCodeVerify, .data.pin_code = pin}; | ||||
|             bool result = gap->on_event_cb(event, gap->context); | ||||
|             aci_gap_numeric_comparison_value_confirm_yesno(gap->service.connection_handle, result); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_PAIRING_CMPLT: | ||||
|             pairing_complete = (aci_gap_pairing_complete_event_rp0*)blue_evt->data; | ||||
|             if(pairing_complete->Status) { | ||||
|                 FURI_LOG_E( | ||||
|                     TAG, | ||||
|                     "Pairing failed with status: %d. Terminating connection", | ||||
|                     pairing_complete->Status); | ||||
|                 aci_gap_terminate(gap->service.connection_handle, 5); | ||||
|             } else { | ||||
|                 FURI_LOG_I(TAG, "Pairing complete"); | ||||
|                 GapEvent event = {.type = GapEventTypeConnected}; | ||||
|                 gap->on_event_cb(event, gap->context); | ||||
|             } | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_GAP_PROCEDURE_COMPLETE: | ||||
|             FURI_LOG_D(TAG, "Procedure complete event"); | ||||
|             break; | ||||
| 
 | ||||
|         case EVT_BLUE_L2CAP_CONNECTION_UPDATE_RESP: { | ||||
|             uint16_t result = | ||||
|                 ((aci_l2cap_connection_update_resp_event_rp0*)(blue_evt->data))->Result; | ||||
|             if(result == 0) { | ||||
|                 FURI_LOG_D(TAG, "Connection parameters accepted"); | ||||
|             } else if(result == 1) { | ||||
|                 FURI_LOG_D(TAG, "Connection parameters denied"); | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|         } | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
|     if(gap) { | ||||
|         osMutexRelease(gap->state_mutex); | ||||
|     } | ||||
|     return SVCCTL_UserEvtFlowEnable; | ||||
| } | ||||
| 
 | ||||
| static void set_advertisment_service_uid(uint8_t* uid, uint8_t uid_len) { | ||||
|     if(uid_len == 2) { | ||||
|         gap->service.adv_svc_uuid[0] = AD_TYPE_16_BIT_SERV_UUID; | ||||
|     } else if(uid_len == 4) { | ||||
|         gap->service.adv_svc_uuid[0] = AD_TYPE_32_BIT_SERV_UUID; | ||||
|     } else if(uid_len == 16) { | ||||
|         gap->service.adv_svc_uuid[0] = AD_TYPE_128_BIT_SERV_UUID_CMPLT_LIST; | ||||
|     } | ||||
|     memcpy(&gap->service.adv_svc_uuid[gap->service.adv_svc_uuid_len], uid, uid_len); | ||||
|     gap->service.adv_svc_uuid_len += uid_len; | ||||
| } | ||||
| 
 | ||||
| static void gap_init_svc(Gap* gap) { | ||||
|     tBleStatus status; | ||||
|     uint32_t srd_bd_addr[2]; | ||||
| 
 | ||||
|     // HCI Reset to synchronise BLE Stack
 | ||||
|     hci_reset(); | ||||
|     // Configure mac address
 | ||||
|     aci_hal_write_config_data( | ||||
|         CONFIG_DATA_PUBADDR_OFFSET, CONFIG_DATA_PUBADDR_LEN, gap->config->mac_address); | ||||
| 
 | ||||
|     /* Static random Address
 | ||||
|      * The two upper bits shall be set to 1 | ||||
|      * The lowest 32bits is read from the UDN to differentiate between devices | ||||
|      * The RNG may be used to provide a random number on each power on | ||||
|      */ | ||||
|     srd_bd_addr[1] = 0x0000ED6E; | ||||
|     srd_bd_addr[0] = LL_FLASH_GetUDN(); | ||||
|     aci_hal_write_config_data( | ||||
|         CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr); | ||||
|     // Set Identity root key used to derive LTK and CSRK
 | ||||
|     aci_hal_write_config_data(CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)gap_irk); | ||||
|     // Set Encryption root key used to derive LTK and CSRK
 | ||||
|     aci_hal_write_config_data(CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)gap_erk); | ||||
|     // Set TX Power to 0 dBm
 | ||||
|     aci_hal_set_tx_power_level(1, 0x19); | ||||
|     // Initialize GATT interface
 | ||||
|     aci_gatt_init(); | ||||
|     // Initialize GAP interface
 | ||||
|     // Skip fist symbol AD_TYPE_COMPLETE_LOCAL_NAME
 | ||||
|     char* name = gap->service.adv_name + 1; | ||||
|     aci_gap_init( | ||||
|         GAP_PERIPHERAL_ROLE, | ||||
|         0, | ||||
|         strlen(name), | ||||
|         &gap->service.gap_svc_handle, | ||||
|         &gap->service.dev_name_char_handle, | ||||
|         &gap->service.appearance_char_handle); | ||||
| 
 | ||||
|     // Set GAP characteristics
 | ||||
|     status = aci_gatt_update_char_value( | ||||
|         gap->service.gap_svc_handle, | ||||
|         gap->service.dev_name_char_handle, | ||||
|         0, | ||||
|         strlen(name), | ||||
|         (uint8_t*)name); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed updating name characteristic: %d", status); | ||||
|     } | ||||
|     uint8_t gap_appearence_char_uuid[2] = { | ||||
|         gap->config->appearance_char & 0xff, gap->config->appearance_char >> 8}; | ||||
|     status = aci_gatt_update_char_value( | ||||
|         gap->service.gap_svc_handle, | ||||
|         gap->service.appearance_char_handle, | ||||
|         0, | ||||
|         2, | ||||
|         gap_appearence_char_uuid); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed updating appearence characteristic: %d", status); | ||||
|     } | ||||
|     // Set default PHY
 | ||||
|     hci_le_set_default_phy(ALL_PHYS_PREFERENCE, TX_2M_PREFERRED, RX_2M_PREFERRED); | ||||
|     // Set I/O capability
 | ||||
|     bool keypress_supported = false; | ||||
|     if(gap->config->pairing_method == GapPairingPinCodeShow) { | ||||
|         aci_gap_set_io_capability(IO_CAP_DISPLAY_ONLY); | ||||
|     } else if(gap->config->pairing_method == GapPairingPinCodeVerifyYesNo) { | ||||
|         aci_gap_set_io_capability(IO_CAP_DISPLAY_YES_NO); | ||||
|         keypress_supported = true; | ||||
|     } | ||||
|     // Setup  authentication
 | ||||
|     aci_gap_set_authentication_requirement( | ||||
|         gap->config->bonding_mode, | ||||
|         CFG_MITM_PROTECTION, | ||||
|         CFG_SC_SUPPORT, | ||||
|         keypress_supported, | ||||
|         CFG_ENCRYPTION_KEY_SIZE_MIN, | ||||
|         CFG_ENCRYPTION_KEY_SIZE_MAX, | ||||
|         CFG_USED_FIXED_PIN, | ||||
|         0, | ||||
|         PUBLIC_ADDR); | ||||
|     // Configure whitelist
 | ||||
|     aci_gap_configure_whitelist(); | ||||
| } | ||||
| 
 | ||||
| static void gap_advertise_start(GapState new_state) { | ||||
|     tBleStatus status; | ||||
|     uint16_t min_interval; | ||||
|     uint16_t max_interval; | ||||
| 
 | ||||
|     if(new_state == GapStateAdvFast) { | ||||
|         min_interval = 0x80; // 80 ms
 | ||||
|         max_interval = 0xa0; // 100 ms
 | ||||
|     } else { | ||||
|         min_interval = 0x0640; // 1 s
 | ||||
|         max_interval = 0x0fa0; // 2.5 s
 | ||||
|     } | ||||
|     // Stop advertising timer
 | ||||
|     osTimerStop(gap->advertise_timer); | ||||
| 
 | ||||
|     if((new_state == GapStateAdvLowPower) && | ||||
|        ((gap->state == GapStateAdvFast) || (gap->state == GapStateAdvLowPower))) { | ||||
|         // Stop advertising
 | ||||
|         status = aci_gap_set_non_discoverable(); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Stop Advertising Failed, result: %d", status); | ||||
|         } | ||||
|     } | ||||
|     // Configure advertising
 | ||||
|     status = aci_gap_set_discoverable( | ||||
|         ADV_IND, | ||||
|         min_interval, | ||||
|         max_interval, | ||||
|         PUBLIC_ADDR, | ||||
|         0, | ||||
|         strlen(gap->service.adv_name), | ||||
|         (uint8_t*)gap->service.adv_name, | ||||
|         gap->service.adv_svc_uuid_len, | ||||
|         gap->service.adv_svc_uuid, | ||||
|         0, | ||||
|         0); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Set discoverable err: %d", status); | ||||
|     } | ||||
|     gap->state = new_state; | ||||
|     GapEvent event = {.type = GapEventTypeStartAdvertising}; | ||||
|     gap->on_event_cb(event, gap->context); | ||||
|     osTimerStart(gap->advertise_timer, INITIAL_ADV_TIMEOUT); | ||||
| } | ||||
| 
 | ||||
| static void gap_advertise_stop() { | ||||
|     if(gap->state > GapStateIdle) { | ||||
|         if(gap->state == GapStateConnected) { | ||||
|             // Terminate connection
 | ||||
|             aci_gap_terminate(gap->service.connection_handle, 0x13); | ||||
|         } | ||||
|         // Stop advertising
 | ||||
|         osTimerStop(gap->advertise_timer); | ||||
|         aci_gap_set_non_discoverable(); | ||||
|         gap->state = GapStateIdle; | ||||
|     } | ||||
|     GapEvent event = {.type = GapEventTypeStopAdvertising}; | ||||
|     gap->on_event_cb(event, gap->context); | ||||
| } | ||||
| 
 | ||||
| void gap_start_advertising() { | ||||
|     osMutexAcquire(gap->state_mutex, osWaitForever); | ||||
|     if(gap->state == GapStateIdle) { | ||||
|         gap->state = GapStateStartingAdv; | ||||
|         FURI_LOG_I(TAG, "Start advertising"); | ||||
|         gap->enable_adv = true; | ||||
|         GapCommand command = GapCommandAdvFast; | ||||
|         furi_check(osMessageQueuePut(gap->command_queue, &command, 0, 0) == osOK); | ||||
|     } | ||||
|     osMutexRelease(gap->state_mutex); | ||||
| } | ||||
| 
 | ||||
| void gap_stop_advertising() { | ||||
|     osMutexAcquire(gap->state_mutex, osWaitForever); | ||||
|     if(gap->state > GapStateIdle) { | ||||
|         FURI_LOG_I(TAG, "Stop advertising"); | ||||
|         gap->enable_adv = false; | ||||
|         GapCommand command = GapCommandAdvStop; | ||||
|         furi_check(osMessageQueuePut(gap->command_queue, &command, 0, 0) == osOK); | ||||
|     } | ||||
|     osMutexRelease(gap->state_mutex); | ||||
| } | ||||
| 
 | ||||
| static void gap_advetise_timer_callback(void* context) { | ||||
|     GapCommand command = GapCommandAdvLowPower; | ||||
|     furi_check(osMessageQueuePut(gap->command_queue, &command, 0, 0) == osOK); | ||||
| } | ||||
| 
 | ||||
| bool gap_init(GapConfig* config, GapEventCallback on_event_cb, void* context) { | ||||
|     if(!ble_glue_is_radio_stack_ready()) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     gap = malloc(sizeof(Gap)); | ||||
|     gap->config = config; | ||||
|     srand(DWT->CYCCNT); | ||||
|     // Create advertising timer
 | ||||
|     gap->advertise_timer = osTimerNew(gap_advetise_timer_callback, osTimerOnce, NULL, NULL); | ||||
|     // Initialization of GATT & GAP layer
 | ||||
|     gap->service.adv_name = config->adv_name; | ||||
|     gap_init_svc(gap); | ||||
|     // Initialization of the BLE Services
 | ||||
|     SVCCTL_Init(); | ||||
|     // Initialization of the GAP state
 | ||||
|     gap->state_mutex = osMutexNew(NULL); | ||||
|     gap->state = GapStateIdle; | ||||
|     gap->service.connection_handle = 0xFFFF; | ||||
|     gap->enable_adv = true; | ||||
| 
 | ||||
|     // Thread configuration
 | ||||
|     gap->thread = furi_thread_alloc(); | ||||
|     furi_thread_set_name(gap->thread, "BleGapDriver"); | ||||
|     furi_thread_set_stack_size(gap->thread, 1024); | ||||
|     furi_thread_set_context(gap->thread, gap); | ||||
|     furi_thread_set_callback(gap->thread, gap_app); | ||||
|     furi_thread_start(gap->thread); | ||||
| 
 | ||||
|     // Command queue allocation
 | ||||
|     gap->command_queue = osMessageQueueNew(8, sizeof(GapCommand), NULL); | ||||
| 
 | ||||
|     uint8_t adv_service_uid[2]; | ||||
|     gap->service.adv_svc_uuid_len = 1; | ||||
|     adv_service_uid[0] = gap->config->adv_service_uuid & 0xff; | ||||
|     adv_service_uid[1] = gap->config->adv_service_uuid >> 8; | ||||
|     set_advertisment_service_uid(adv_service_uid, sizeof(adv_service_uid)); | ||||
| 
 | ||||
|     // Set callback
 | ||||
|     gap->on_event_cb = on_event_cb; | ||||
|     gap->context = context; | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| GapState gap_get_state() { | ||||
|     GapState state; | ||||
|     if(gap) { | ||||
|         osMutexAcquire(gap->state_mutex, osWaitForever); | ||||
|         state = gap->state; | ||||
|         osMutexRelease(gap->state_mutex); | ||||
|     } else { | ||||
|         state = GapStateUninitialized; | ||||
|     } | ||||
|     return state; | ||||
| } | ||||
| 
 | ||||
| void gap_start_scan(GapScanCallback callback, void* context) { | ||||
|     furi_assert(callback); | ||||
|     gap_scan = malloc(sizeof(GapScan)); | ||||
|     gap_scan->callback = callback; | ||||
|     gap_scan->context = context; | ||||
|     // Scan interval 250 ms
 | ||||
|     hci_le_set_scan_parameters(1, 4000, 200, 0, 0); | ||||
|     hci_le_set_scan_enable(1, 1); | ||||
| } | ||||
| 
 | ||||
| void gap_stop_scan() { | ||||
|     furi_assert(gap_scan); | ||||
|     hci_le_set_scan_enable(0, 1); | ||||
|     free(gap_scan); | ||||
|     gap_scan = NULL; | ||||
| } | ||||
| 
 | ||||
| void gap_thread_stop() { | ||||
|     if(gap) { | ||||
|         osMutexAcquire(gap->state_mutex, osWaitForever); | ||||
|         gap->enable_adv = false; | ||||
|         GapCommand command = GapCommandKillThread; | ||||
|         osMessageQueuePut(gap->command_queue, &command, 0, osWaitForever); | ||||
|         osMutexRelease(gap->state_mutex); | ||||
|         furi_thread_join(gap->thread); | ||||
|         furi_thread_free(gap->thread); | ||||
|         // Free resources
 | ||||
|         osMutexDelete(gap->state_mutex); | ||||
|         osMessageQueueDelete(gap->command_queue); | ||||
|         osTimerStop(gap->advertise_timer); | ||||
|         while(xTimerIsTimerActive(gap->advertise_timer) == pdTRUE) osDelay(1); | ||||
|         furi_check(osTimerDelete(gap->advertise_timer) == osOK); | ||||
|         free(gap); | ||||
|         gap = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static int32_t gap_app(void* context) { | ||||
|     GapCommand command; | ||||
|     while(1) { | ||||
|         osStatus_t status = osMessageQueueGet(gap->command_queue, &command, NULL, osWaitForever); | ||||
|         if(status != osOK) { | ||||
|             FURI_LOG_E(TAG, "Message queue get error: %d", status); | ||||
|             continue; | ||||
|         } | ||||
|         osMutexAcquire(gap->state_mutex, osWaitForever); | ||||
|         if(command == GapCommandKillThread) { | ||||
|             break; | ||||
|         } | ||||
|         if(command == GapCommandAdvFast) { | ||||
|             gap_advertise_start(GapStateAdvFast); | ||||
|         } else if(command == GapCommandAdvLowPower) { | ||||
|             gap_advertise_start(GapStateAdvLowPower); | ||||
|         } else if(command == GapCommandAdvStop) { | ||||
|             gap_advertise_stop(); | ||||
|         } | ||||
|         osMutexRelease(gap->state_mutex); | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| @ -1,91 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| #include <furi_hal_version.h> | ||||
| 
 | ||||
| #define GAP_MAC_ADDR_SIZE (6) | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef enum { | ||||
|     GapEventTypeConnected, | ||||
|     GapEventTypeDisconnected, | ||||
|     GapEventTypeStartAdvertising, | ||||
|     GapEventTypeStopAdvertising, | ||||
|     GapEventTypePinCodeShow, | ||||
|     GapEventTypePinCodeVerify, | ||||
|     GapEventTypeUpdateMTU, | ||||
| } GapEventType; | ||||
| 
 | ||||
| typedef union { | ||||
|     uint32_t pin_code; | ||||
|     uint16_t max_packet_size; | ||||
| } GapEventData; | ||||
| 
 | ||||
| typedef struct { | ||||
|     GapEventType type; | ||||
|     GapEventData data; | ||||
| } GapEvent; | ||||
| 
 | ||||
| typedef bool (*GapEventCallback)(GapEvent event, void* context); | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint8_t type; | ||||
|     uint8_t mac[6]; | ||||
| } GapAddress; | ||||
| 
 | ||||
| typedef void (*GapScanCallback)(GapAddress address, void* context); | ||||
| 
 | ||||
| typedef enum { | ||||
|     GapStateUninitialized, | ||||
|     GapStateIdle, | ||||
|     GapStateStartingAdv, | ||||
|     GapStateAdvFast, | ||||
|     GapStateAdvLowPower, | ||||
|     GapStateConnected, | ||||
| } GapState; | ||||
| 
 | ||||
| typedef enum { | ||||
|     GapPairingNone, | ||||
|     GapPairingPinCodeShow, | ||||
|     GapPairingPinCodeVerifyYesNo, | ||||
| } GapPairing; | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint16_t conn_int_min; | ||||
|     uint16_t conn_int_max; | ||||
|     uint16_t slave_latency; | ||||
|     uint16_t supervisor_timeout; | ||||
| } GapConnectionParams; | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint16_t adv_service_uuid; | ||||
|     uint16_t appearance_char; | ||||
|     bool bonding_mode; | ||||
|     GapPairing pairing_method; | ||||
|     uint8_t mac_address[GAP_MAC_ADDR_SIZE]; | ||||
|     char adv_name[FURI_HAL_VERSION_DEVICE_NAME_LENGTH]; | ||||
|     GapConnectionParams conn_param; | ||||
| } GapConfig; | ||||
| 
 | ||||
| bool gap_init(GapConfig* config, GapEventCallback on_event_cb, void* context); | ||||
| 
 | ||||
| void gap_start_advertising(); | ||||
| 
 | ||||
| void gap_stop_advertising(); | ||||
| 
 | ||||
| GapState gap_get_state(); | ||||
| 
 | ||||
| void gap_thread_stop(); | ||||
| 
 | ||||
| void gap_start_scan(GapScanCallback callback, void* context); | ||||
| 
 | ||||
| void gap_stop_scan(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,260 +0,0 @@ | ||||
| #include "hid_service.h" | ||||
| #include "app_common.h" | ||||
| #include "ble.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| 
 | ||||
| #define TAG "BtHid" | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint16_t svc_handle; | ||||
|     uint16_t protocol_mode_char_handle; | ||||
|     uint16_t report_char_handle; | ||||
|     uint16_t report_ref_desc_handle; | ||||
|     uint16_t report_map_char_handle; | ||||
|     uint16_t keyboard_boot_char_handle; | ||||
|     uint16_t info_char_handle; | ||||
|     uint16_t ctrl_point_char_handle; | ||||
| } HIDSvc; | ||||
| 
 | ||||
| static HIDSvc* hid_svc = NULL; | ||||
| 
 | ||||
| static SVCCTL_EvtAckStatus_t hid_svc_event_handler(void* event) { | ||||
|     SVCCTL_EvtAckStatus_t ret = SVCCTL_EvtNotAck; | ||||
|     hci_event_pckt* event_pckt = (hci_event_pckt*)(((hci_uart_pckt*)event)->data); | ||||
|     evt_blecore_aci* blecore_evt = (evt_blecore_aci*)event_pckt->data; | ||||
|     // aci_gatt_attribute_modified_event_rp0* attribute_modified;
 | ||||
|     if(event_pckt->evt == HCI_VENDOR_SPECIFIC_DEBUG_EVT_CODE) { | ||||
|         if(blecore_evt->ecode == ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE) { | ||||
|             // Process modification events
 | ||||
|             ret = SVCCTL_EvtAckFlowEnable; | ||||
|         } else if(blecore_evt->ecode == ACI_GATT_SERVER_CONFIRMATION_VSEVT_CODE) { | ||||
|             // Process notification confirmation
 | ||||
|             ret = SVCCTL_EvtAckFlowEnable; | ||||
|         } | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| void hid_svc_start() { | ||||
|     tBleStatus status; | ||||
|     hid_svc = malloc(sizeof(HIDSvc)); | ||||
|     Service_UUID_t svc_uuid = {}; | ||||
|     Char_Desc_Uuid_t desc_uuid = {}; | ||||
|     Char_UUID_t char_uuid = {}; | ||||
| 
 | ||||
|     // Register event handler
 | ||||
|     SVCCTL_RegisterSvcHandler(hid_svc_event_handler); | ||||
|     // Add service
 | ||||
|     svc_uuid.Service_UUID_16 = HUMAN_INTERFACE_DEVICE_SERVICE_UUID; | ||||
|     status = | ||||
|         aci_gatt_add_service(UUID_TYPE_16, &svc_uuid, PRIMARY_SERVICE, 30, &hid_svc->svc_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add HID service: %d", status); | ||||
|     } | ||||
|     // Add Protocol mode characterstics
 | ||||
|     char_uuid.Char_UUID_16 = PROTOCOL_MODE_CHAR_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         hid_svc->svc_handle, | ||||
|         UUID_TYPE_16, | ||||
|         &char_uuid, | ||||
|         1, | ||||
|         CHAR_PROP_READ | CHAR_PROP_WRITE_WITHOUT_RESP, | ||||
|         ATTR_PERMISSION_NONE, | ||||
|         GATT_NOTIFY_ATTRIBUTE_WRITE, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &hid_svc->protocol_mode_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add protocol mode characteristic: %d", status); | ||||
|     } | ||||
|     // Update Protocol mode characteristic
 | ||||
|     uint8_t protocol_mode = 1; | ||||
|     status = aci_gatt_update_char_value( | ||||
|         hid_svc->svc_handle, hid_svc->protocol_mode_char_handle, 0, 1, &protocol_mode); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to update protocol mode characteristic: %d", status); | ||||
|     } | ||||
|     // Add Report characterstics
 | ||||
|     char_uuid.Char_UUID_16 = REPORT_CHAR_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         hid_svc->svc_handle, | ||||
|         UUID_TYPE_16, | ||||
|         &char_uuid, | ||||
|         HID_SVC_REPORT_MAX_LEN, | ||||
|         CHAR_PROP_READ | CHAR_PROP_NOTIFY, | ||||
|         ATTR_PERMISSION_NONE, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_VARIABLE, | ||||
|         &hid_svc->report_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add report characteristic: %d", status); | ||||
|     } | ||||
|     // Add Report descriptor
 | ||||
|     uint8_t desc_val[] = {0x00, 0x01}; | ||||
|     desc_uuid.Char_UUID_16 = REPORT_REFERENCE_DESCRIPTOR_UUID; | ||||
|     status = aci_gatt_add_char_desc( | ||||
|         hid_svc->svc_handle, | ||||
|         hid_svc->report_char_handle, | ||||
|         UUID_TYPE_16, | ||||
|         &desc_uuid, | ||||
|         HID_SVC_REPORT_REF_LEN, | ||||
|         HID_SVC_REPORT_REF_LEN, | ||||
|         desc_val, | ||||
|         ATTR_PERMISSION_NONE, | ||||
|         ATTR_ACCESS_READ_ONLY, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         MIN_ENCRY_KEY_SIZE, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &hid_svc->report_ref_desc_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add report reference descriptor: %d", status); | ||||
|     } | ||||
|     // Add Report Map characteristic
 | ||||
|     char_uuid.Char_UUID_16 = REPORT_MAP_CHAR_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         hid_svc->svc_handle, | ||||
|         UUID_TYPE_16, | ||||
|         &char_uuid, | ||||
|         HID_SVC_REPORT_MAP_MAX_LEN, | ||||
|         CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_NONE, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_VARIABLE, | ||||
|         &hid_svc->report_map_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add report map characteristic: %d", status); | ||||
|     } | ||||
|     // Add Boot Keyboard characteristic
 | ||||
|     char_uuid.Char_UUID_16 = BOOT_KEYBOARD_INPUT_REPORT_CHAR_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         hid_svc->svc_handle, | ||||
|         UUID_TYPE_16, | ||||
|         &char_uuid, | ||||
|         HID_SVC_BOOT_KEYBOARD_INPUT_REPORT_MAX_LEN, | ||||
|         CHAR_PROP_READ | CHAR_PROP_NOTIFY, | ||||
|         ATTR_PERMISSION_NONE, | ||||
|         GATT_NOTIFY_WRITE_REQ_AND_WAIT_FOR_APPL_RESP, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_VARIABLE, | ||||
|         &hid_svc->keyboard_boot_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add report map characteristic: %d", status); | ||||
|     } | ||||
|     // Add Information characteristic
 | ||||
|     char_uuid.Char_UUID_16 = HID_INFORMATION_CHAR_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         hid_svc->svc_handle, | ||||
|         UUID_TYPE_16, | ||||
|         &char_uuid, | ||||
|         HID_SVC_INFO_LEN, | ||||
|         CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_NONE, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &hid_svc->info_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add information characteristic: %d", status); | ||||
|     } | ||||
|     // Add Control Point characteristic
 | ||||
|     char_uuid.Char_UUID_16 = HID_CONTROL_POINT_CHAR_UUID; | ||||
|     status = aci_gatt_add_char( | ||||
|         hid_svc->svc_handle, | ||||
|         UUID_TYPE_16, | ||||
|         &char_uuid, | ||||
|         HID_SVC_CONTROL_POINT_LEN, | ||||
|         CHAR_PROP_WRITE_WITHOUT_RESP, | ||||
|         ATTR_PERMISSION_NONE, | ||||
|         GATT_NOTIFY_ATTRIBUTE_WRITE, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &hid_svc->ctrl_point_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add control point characteristic: %d", status); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool hid_svc_update_report_map(uint8_t* data, uint16_t len) { | ||||
|     furi_assert(data); | ||||
|     furi_assert(hid_svc); | ||||
| 
 | ||||
|     tBleStatus status = aci_gatt_update_char_value( | ||||
|         hid_svc->svc_handle, hid_svc->report_map_char_handle, 0, len, data); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed updating report map characteristic"); | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool hid_svc_update_input_report(uint8_t* data, uint16_t len) { | ||||
|     furi_assert(data); | ||||
|     furi_assert(hid_svc); | ||||
| 
 | ||||
|     tBleStatus status = | ||||
|         aci_gatt_update_char_value(hid_svc->svc_handle, hid_svc->report_char_handle, 0, len, data); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed updating report characteristic"); | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool hid_svc_update_info(uint8_t* data, uint16_t len) { | ||||
|     furi_assert(data); | ||||
|     furi_assert(hid_svc); | ||||
| 
 | ||||
|     tBleStatus status = | ||||
|         aci_gatt_update_char_value(hid_svc->svc_handle, hid_svc->info_char_handle, 0, len, data); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed updating info characteristic"); | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool hid_svc_is_started() { | ||||
|     return hid_svc != NULL; | ||||
| } | ||||
| 
 | ||||
| void hid_svc_stop() { | ||||
|     tBleStatus status; | ||||
|     if(hid_svc) { | ||||
|         // Delete characteristics
 | ||||
|         status = aci_gatt_del_char(hid_svc->svc_handle, hid_svc->report_map_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Report Map characteristic: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char(hid_svc->svc_handle, hid_svc->report_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Report characteristic: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char(hid_svc->svc_handle, hid_svc->protocol_mode_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Protocol Mode characteristic: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char(hid_svc->svc_handle, hid_svc->keyboard_boot_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Keyboard Boot characteristic: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char(hid_svc->svc_handle, hid_svc->info_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Information characteristic: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char(hid_svc->svc_handle, hid_svc->ctrl_point_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Control Point characteristic: %d", status); | ||||
|         } | ||||
|         // Delete service
 | ||||
|         status = aci_gatt_del_service(hid_svc->svc_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete HID service: %d", status); | ||||
|         } | ||||
|         // Delete buffer size mutex
 | ||||
|         free(hid_svc); | ||||
|         hid_svc = NULL; | ||||
|     } | ||||
| } | ||||
| @ -1,23 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| #define HID_SVC_REPORT_MAP_MAX_LEN (120) | ||||
| #define HID_SVC_REPORT_MAX_LEN (9) | ||||
| #define HID_SVC_BOOT_KEYBOARD_INPUT_REPORT_MAX_LEN (8) | ||||
| #define HID_SVC_REPORT_REF_LEN (2) | ||||
| #define HID_SVC_INFO_LEN (4) | ||||
| #define HID_SVC_CONTROL_POINT_LEN (1) | ||||
| 
 | ||||
| void hid_svc_start(); | ||||
| 
 | ||||
| void hid_svc_stop(); | ||||
| 
 | ||||
| bool hid_svc_is_started(); | ||||
| 
 | ||||
| bool hid_svc_update_report_map(uint8_t* data, uint16_t len); | ||||
| 
 | ||||
| bool hid_svc_update_input_report(uint8_t* data, uint16_t len); | ||||
| 
 | ||||
| bool hid_svc_update_info(uint8_t* data, uint16_t len); | ||||
| @ -1,231 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|  * @file    hw_conf.h | ||||
|  * @author  MCD Application Team | ||||
|  * @brief   Configuration of hardware interface | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|  * <h2><center>© Copyright (c) 2019 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license  | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with  | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef HW_CONF_H | ||||
| #define HW_CONF_H | ||||
| 
 | ||||
| #include "FreeRTOSConfig.h" | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * Semaphores | ||||
|  * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+ | ||||
|  *****************************************************************************/ | ||||
| /**
 | ||||
| * Index of the semaphore used the prevent conflicts after standby sleep. | ||||
| * Each CPUs takes this semaphore at standby wakeup until conclicting elements are restored. | ||||
| */ | ||||
| #define CFG_HW_PWR_STANDBY_SEMID 10 | ||||
| /**
 | ||||
| *  The CPU2 may be configured to store the Thread persistent data either in internal NVM storage on CPU2 or in | ||||
| *  SRAM2 buffer provided by the user application. This can be configured with the system command SHCI_C2_Config() | ||||
| *  When the CPU2 is requested to store persistent data in SRAM2, it can write data in this buffer at any time when needed. | ||||
| *  In order to read consistent data with the CPU1 from the SRAM2 buffer, the flow should be: | ||||
| *  + CPU1 takes CFG_HW_THREAD_NVM_SRAM_SEMID semaphore | ||||
| *  + CPU1 reads all persistent data from SRAM2 (most of the time, the goal is to write these data into an NVM managed by CPU1) | ||||
| *  + CPU1 releases CFG_HW_THREAD_NVM_SRAM_SEMID semaphore | ||||
| *  CFG_HW_THREAD_NVM_SRAM_SEMID semaphore makes sure CPU2 does not update the persistent data in SRAM2 at the same time CPU1 is reading them. | ||||
| *  There is no timing constraint on how long this semaphore can be kept. | ||||
| */ | ||||
| #define CFG_HW_THREAD_NVM_SRAM_SEMID 9 | ||||
| 
 | ||||
| /**
 | ||||
| *  The CPU2 may be configured to store the BLE persistent data either in internal NVM storage on CPU2 or in | ||||
| *  SRAM2 buffer provided by the user application. This can be configured with the system command SHCI_C2_Config() | ||||
| *  When the CPU2 is requested to store persistent data in SRAM2, it can write data in this buffer at any time when needed. | ||||
| *  In order to read consistent data with the CPU1 from the SRAM2 buffer, the flow should be: | ||||
| *  + CPU1 takes CFG_HW_BLE_NVM_SRAM_SEMID semaphore | ||||
| *  + CPU1 reads all persistent data from SRAM2 (most of the time, the goal is to write these data into an NVM managed by CPU1) | ||||
| *  + CPU1 releases CFG_HW_BLE_NVM_SRAM_SEMID semaphore | ||||
| *  CFG_HW_BLE_NVM_SRAM_SEMID semaphore makes sure CPU2 does not update the persistent data in SRAM2 at the same time CPU1 is reading them. | ||||
| *  There is no timing constraint on how long this semaphore can be kept. | ||||
| */ | ||||
| #define CFG_HW_BLE_NVM_SRAM_SEMID 8 | ||||
| 
 | ||||
| /**
 | ||||
| *  Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash | ||||
| *  The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2 | ||||
| *  When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just | ||||
| *  after writing a raw (64bits data) or erasing one sector. | ||||
| *  Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required | ||||
| *  to give the opportunity to CPU2 to take it. | ||||
| *  On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit. | ||||
| *  By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore | ||||
| *  instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl() | ||||
| */ | ||||
| #define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7 | ||||
| 
 | ||||
| /**
 | ||||
| *  Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash | ||||
| *  In order to protect its timing, the CPU1 may get this semaphore to prevent the  CPU2 to either | ||||
| *  write or erase in flash (as this will stall both CPUs) | ||||
| *  The PES bit shall not be used as this may stall the CPU2 in some cases. | ||||
| */ | ||||
| #define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6 | ||||
| 
 | ||||
| /**
 | ||||
| *  Index of the semaphore used to manage the CLK48 clock configuration | ||||
| *  When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB | ||||
| *  and should be released after the application switch OFF the clock when the USB is not used anymore | ||||
| *  When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48. | ||||
| *  More details in AN5289 | ||||
| */ | ||||
| #define CFG_HW_CLK48_CONFIG_SEMID 5 | ||||
| 
 | ||||
| /* Index of the semaphore used to manage the entry Stop Mode procedure */ | ||||
| #define CFG_HW_ENTRY_STOP_MODE_SEMID 4 | ||||
| 
 | ||||
| /* Index of the semaphore used to access the RCC */ | ||||
| #define CFG_HW_RCC_SEMID 3 | ||||
| 
 | ||||
| /* Index of the semaphore used to access the FLASH */ | ||||
| #define CFG_HW_FLASH_SEMID 2 | ||||
| 
 | ||||
| /* Index of the semaphore used to access the PKA */ | ||||
| #define CFG_HW_PKA_SEMID 1 | ||||
| 
 | ||||
| /* Index of the semaphore used to access the RNG */ | ||||
| #define CFG_HW_RNG_SEMID 0 | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * HW TIMER SERVER | ||||
|  *****************************************************************************/ | ||||
| /**
 | ||||
|  * The user may define the maximum number of virtual timers supported. | ||||
|  * It shall not exceed 255 | ||||
|  */ | ||||
| #define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6 | ||||
| 
 | ||||
| /**
 | ||||
|  * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the | ||||
|  * wakeup timer. | ||||
|  * This setting is the preemptpriority part of the NVIC. | ||||
|  */ | ||||
| #define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO \ | ||||
|     (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1) /* FreeRTOS requirement */ | ||||
| 
 | ||||
| /**
 | ||||
|  * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the | ||||
|  * wakeup timer. | ||||
|  * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported | ||||
|  * on the CPU, the setting is ignored | ||||
|  */ | ||||
| #define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0 | ||||
| 
 | ||||
| /**
 | ||||
|  *  Define a critical section in the Timer server | ||||
|  *  The Timer server does not support the API to be nested | ||||
|  *  The  Application shall either: | ||||
|  *    a) Ensure this will never happen | ||||
|  *    b) Define the critical section | ||||
|  *  The default implementations is masking all interrupts using the PRIMASK bit | ||||
|  *  The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro | ||||
|  *  TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set | ||||
|  *  to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI | ||||
|  *  register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall | ||||
|  *  re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer | ||||
|  *  API are called when the TIMER critical section is entered | ||||
|  */ | ||||
| #define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1 | ||||
| 
 | ||||
| /**
 | ||||
|    * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt | ||||
|    * is generated by the Hardware and the time when the  RTC interrupt handler is called. This time is measured in | ||||
|    * number of RTCCLK ticks. | ||||
|    * A relaxed timing would be 10ms | ||||
|    * When the value is too short, the timerserver will not be able to count properly and all timeout may be random. | ||||
|    * When the value is too long, the device may wake up more often than the most optimal configuration. However, the | ||||
|    * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly | ||||
|    * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system | ||||
|    * as this will have marginal impact on low power mode | ||||
|    */ | ||||
| #define CFG_HW_TS_RTC_HANDLER_MAX_DELAY (10 * (LSI_VALUE / 1000)) | ||||
| 
 | ||||
| /**
 | ||||
|    * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler | ||||
|    * It shall be type of IRQn_Type | ||||
|    */ | ||||
| #define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * HW UART | ||||
|  *****************************************************************************/ | ||||
| #define CFG_HW_LPUART1_ENABLED 0 | ||||
| #define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0 | ||||
| 
 | ||||
| #define CFG_HW_USART1_ENABLED 1 | ||||
| #define CFG_HW_USART1_DMA_TX_SUPPORTED 1 | ||||
| 
 | ||||
| /**
 | ||||
|  * UART1 | ||||
|  */ | ||||
| #define CFG_HW_USART1_PREEMPTPRIORITY 0x0F | ||||
| #define CFG_HW_USART1_SUBPRIORITY 0 | ||||
| 
 | ||||
| /** < The application shall check the selected source clock is enable */ | ||||
| #define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK | ||||
| 
 | ||||
| #define CFG_HW_USART1_BAUDRATE 115200 | ||||
| #define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B | ||||
| #define CFG_HW_USART1_STOPBITS UART_STOPBITS_1 | ||||
| #define CFG_HW_USART1_PARITY UART_PARITY_NONE | ||||
| #define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE | ||||
| #define CFG_HW_USART1_MODE UART_MODE_TX_RX | ||||
| #define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT | ||||
| #define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8 | ||||
| 
 | ||||
| #define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE | ||||
| #define CFG_HW_USART1_TX_PORT GPIOB | ||||
| #define CFG_HW_USART1_TX_PIN GPIO_PIN_6 | ||||
| #define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP | ||||
| #define CFG_HW_USART1_TX_PULL GPIO_NOPULL | ||||
| #define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH | ||||
| #define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1 | ||||
| 
 | ||||
| #define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE | ||||
| #define CFG_HW_USART1_RX_PORT GPIOB | ||||
| #define CFG_HW_USART1_RX_PIN GPIO_PIN_7 | ||||
| #define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP | ||||
| #define CFG_HW_USART1_RX_PULL GPIO_NOPULL | ||||
| #define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH | ||||
| #define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1 | ||||
| 
 | ||||
| #define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE | ||||
| #define CFG_HW_USART1_CTS_PORT GPIOA | ||||
| #define CFG_HW_USART1_CTS_PIN GPIO_PIN_11 | ||||
| #define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP | ||||
| #define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN | ||||
| #define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH | ||||
| #define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1 | ||||
| 
 | ||||
| #define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F | ||||
| #define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0 | ||||
| 
 | ||||
| #define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE | ||||
| #define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE | ||||
| #define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX | ||||
| #define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_Channel4 | ||||
| #define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn | ||||
| #define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler | ||||
| 
 | ||||
| #endif /*HW_CONF_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,102 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    hw_if.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Hardware Interface | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef HW_IF_H | ||||
| #define HW_IF_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32wbxx.h" | ||||
| #include "stm32wbxx_ll_exti.h" | ||||
| #include "stm32wbxx_ll_system.h" | ||||
| #include "stm32wbxx_ll_rcc.h" | ||||
| #include "stm32wbxx_ll_ipcc.h" | ||||
| #include "stm32wbxx_ll_bus.h" | ||||
| #include "stm32wbxx_ll_pwr.h" | ||||
| #include "stm32wbxx_ll_cortex.h" | ||||
| #include "stm32wbxx_ll_utils.h" | ||||
| #include "stm32wbxx_ll_hsem.h" | ||||
| #include "stm32wbxx_ll_gpio.h" | ||||
| #include "stm32wbxx_ll_rtc.h" | ||||
| 
 | ||||
| #ifdef USE_STM32WBXX_USB_DONGLE | ||||
| #include "stm32wbxx_usb_dongle.h" | ||||
| #endif | ||||
| #ifdef USE_STM32WBXX_NUCLEO | ||||
| #include "stm32wbxx_nucleo.h" | ||||
| #endif | ||||
| #ifdef USE_X_NUCLEO_EPD | ||||
| #include "x_nucleo_epd.h" | ||||
| #endif | ||||
| 
 | ||||
| /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|    * HW UART | ||||
|    ******************************************************************************/ | ||||
| typedef enum { | ||||
|     hw_uart1, | ||||
|     hw_uart2, | ||||
|     hw_lpuart1, | ||||
| } hw_uart_id_t; | ||||
| 
 | ||||
| typedef enum { | ||||
|     hw_uart_ok, | ||||
|     hw_uart_error, | ||||
|     hw_uart_busy, | ||||
|     hw_uart_to, | ||||
| } hw_status_t; | ||||
| 
 | ||||
| void HW_UART_Init(hw_uart_id_t hw_uart_id); | ||||
| void HW_UART_Receive_IT( | ||||
|     hw_uart_id_t hw_uart_id, | ||||
|     uint8_t* pData, | ||||
|     uint16_t Size, | ||||
|     void (*Callback)(void)); | ||||
| void HW_UART_Transmit_IT( | ||||
|     hw_uart_id_t hw_uart_id, | ||||
|     uint8_t* pData, | ||||
|     uint16_t Size, | ||||
|     void (*Callback)(void)); | ||||
| hw_status_t | ||||
|     HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t* p_data, uint16_t size, uint32_t timeout); | ||||
| hw_status_t HW_UART_Transmit_DMA( | ||||
|     hw_uart_id_t hw_uart_id, | ||||
|     uint8_t* p_data, | ||||
|     uint16_t size, | ||||
|     void (*Callback)(void)); | ||||
| void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id); | ||||
| void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /*HW_IF_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,597 +0,0 @@ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : Target/hw_ipcc.c | ||||
|   * Description        : Hardware IPCC source file for STM32WPAN Middleware. | ||||
|   * | ||||
|  ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "app_common.h" | ||||
| #include "mbox_def.h" | ||||
| 
 | ||||
| /* Global variables ---------------------------------------------------------*/ | ||||
| /* Private defines -----------------------------------------------------------*/ | ||||
| #define HW_IPCC_TX_PENDING(channel) \ | ||||
|     (!(LL_C1_IPCC_IsActiveFlag_CHx(IPCC, channel))) && (((~(IPCC->C1MR)) & (channel << 16U))) | ||||
| #define HW_IPCC_RX_PENDING(channel) \ | ||||
|     (LL_C2_IPCC_IsActiveFlag_CHx(IPCC, channel)) && (((~(IPCC->C1MR)) & (channel << 0U))) | ||||
| 
 | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| static void (*FreeBufCb)(void); | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| static void HW_IPCC_BLE_EvtHandler(void); | ||||
| static void HW_IPCC_BLE_AclDataEvtHandler(void); | ||||
| static void HW_IPCC_MM_FreeBufHandler(void); | ||||
| static void HW_IPCC_SYS_CmdEvtHandler(void); | ||||
| static void HW_IPCC_SYS_EvtHandler(void); | ||||
| static void HW_IPCC_TRACES_EvtHandler(void); | ||||
| 
 | ||||
| #ifdef THREAD_WB | ||||
| static void HW_IPCC_OT_CmdEvtHandler(void); | ||||
| static void HW_IPCC_THREAD_NotEvtHandler(void); | ||||
| static void HW_IPCC_THREAD_CliNotEvtHandler(void); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef LLD_TESTS_WB | ||||
| static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler(void); | ||||
| static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler(void); | ||||
| #endif | ||||
| #ifdef LLD_BLE_WB | ||||
| /*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/ | ||||
| static void HW_IPCC_LLD_BLE_ReceiveRspHandler(void); | ||||
| static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler(void); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef MAC_802_15_4_WB | ||||
| static void HW_IPCC_MAC_802_15_4_CmdEvtHandler(void); | ||||
| static void HW_IPCC_MAC_802_15_4_NotEvtHandler(void); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef ZIGBEE_WB | ||||
| static void HW_IPCC_ZIGBEE_CmdEvtHandler(void); | ||||
| static void HW_IPCC_ZIGBEE_StackNotifEvtHandler(void); | ||||
| static void HW_IPCC_ZIGBEE_StackM0RequestHandler(void); | ||||
| #endif | ||||
| 
 | ||||
| /* Public function definition -----------------------------------------------*/ | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * INTERRUPT HANDLER | ||||
|  ******************************************************************************/ | ||||
| void HW_IPCC_Rx_Handler(void) { | ||||
|     if(HW_IPCC_RX_PENDING(HW_IPCC_SYSTEM_EVENT_CHANNEL)) { | ||||
|         HW_IPCC_SYS_EvtHandler(); | ||||
|     } | ||||
| #ifdef MAC_802_15_4_WB | ||||
|     else if(HW_IPCC_RX_PENDING(HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL)) { | ||||
|         HW_IPCC_MAC_802_15_4_NotEvtHandler(); | ||||
|     } | ||||
| #endif /* MAC_802_15_4_WB */ | ||||
| #ifdef THREAD_WB | ||||
|     else if(HW_IPCC_RX_PENDING(HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL)) { | ||||
|         HW_IPCC_THREAD_NotEvtHandler(); | ||||
|     } else if(HW_IPCC_RX_PENDING(HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL)) { | ||||
|         HW_IPCC_THREAD_CliNotEvtHandler(); | ||||
|     } | ||||
| #endif /* THREAD_WB */ | ||||
| #ifdef LLD_TESTS_WB | ||||
|     else if(HW_IPCC_RX_PENDING(HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL)) { | ||||
|         HW_IPCC_LLDTESTS_ReceiveCliRspHandler(); | ||||
|     } else if(HW_IPCC_RX_PENDING(HW_IPCC_LLDTESTS_M0_CMD_CHANNEL)) { | ||||
|         HW_IPCC_LLDTESTS_ReceiveM0CmdHandler(); | ||||
|     } | ||||
| #endif /* LLD_TESTS_WB */ | ||||
| #ifdef LLD_BLE_WB | ||||
|     else if(HW_IPCC_RX_PENDING(HW_IPCC_LLD_BLE_RSP_CHANNEL)) { | ||||
|         HW_IPCC_LLD_BLE_ReceiveRspHandler(); | ||||
|     } else if(HW_IPCC_RX_PENDING(HW_IPCC_LLD_BLE_M0_CMD_CHANNEL)) { | ||||
|         HW_IPCC_LLD_BLE_ReceiveM0CmdHandler(); | ||||
|     } | ||||
| #endif /* LLD_TESTS_WB */ | ||||
| #ifdef ZIGBEE_WB | ||||
|     else if(HW_IPCC_RX_PENDING(HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL)) { | ||||
|         HW_IPCC_ZIGBEE_StackNotifEvtHandler(); | ||||
|     } else if(HW_IPCC_RX_PENDING(HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL)) { | ||||
|         HW_IPCC_ZIGBEE_StackM0RequestHandler(); | ||||
|     } | ||||
| #endif /* ZIGBEE_WB */ | ||||
|     else if(HW_IPCC_RX_PENDING(HW_IPCC_BLE_EVENT_CHANNEL)) { | ||||
|         HW_IPCC_BLE_EvtHandler(); | ||||
|     } else if(HW_IPCC_RX_PENDING(HW_IPCC_TRACES_CHANNEL)) { | ||||
|         HW_IPCC_TRACES_EvtHandler(); | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_Tx_Handler(void) { | ||||
|     if(HW_IPCC_TX_PENDING(HW_IPCC_SYSTEM_CMD_RSP_CHANNEL)) { | ||||
|         HW_IPCC_SYS_CmdEvtHandler(); | ||||
|     } | ||||
| #ifdef MAC_802_15_4_WB | ||||
|     else if(HW_IPCC_TX_PENDING(HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL)) { | ||||
|         HW_IPCC_MAC_802_15_4_CmdEvtHandler(); | ||||
|     } | ||||
| #endif /* MAC_802_15_4_WB */ | ||||
| #ifdef THREAD_WB | ||||
|     else if(HW_IPCC_TX_PENDING(HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL)) { | ||||
|         HW_IPCC_OT_CmdEvtHandler(); | ||||
|     } | ||||
| #endif /* THREAD_WB */ | ||||
| #ifdef LLD_TESTS_WB | ||||
| // No TX handler for LLD tests
 | ||||
| #endif /* LLD_TESTS_WB */ | ||||
| #ifdef ZIGBEE_WB | ||||
|     if(HW_IPCC_TX_PENDING(HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL)) { | ||||
|         HW_IPCC_ZIGBEE_CmdEvtHandler(); | ||||
|     } | ||||
| #endif /* ZIGBEE_WB */ | ||||
|     else if(HW_IPCC_TX_PENDING(HW_IPCC_SYSTEM_CMD_RSP_CHANNEL)) { | ||||
|         HW_IPCC_SYS_CmdEvtHandler(); | ||||
|     } else if(HW_IPCC_TX_PENDING(HW_IPCC_MM_RELEASE_BUFFER_CHANNEL)) { | ||||
|         HW_IPCC_MM_FreeBufHandler(); | ||||
|     } else if(HW_IPCC_TX_PENDING(HW_IPCC_HCI_ACL_DATA_CHANNEL)) { | ||||
|         HW_IPCC_BLE_AclDataEvtHandler(); | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| /******************************************************************************
 | ||||
|  * GENERAL | ||||
|  ******************************************************************************/ | ||||
| void HW_IPCC_Enable(void) { | ||||
|     /**
 | ||||
|   * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running | ||||
|     when FUS is running on CPU2 and CPU1 enters deep sleep mode | ||||
|   */ | ||||
|     LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC); | ||||
| 
 | ||||
|     /**
 | ||||
|    * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2 | ||||
|    */ | ||||
|     LL_C2_EXTI_EnableEvent_32_63(LL_EXTI_LINE_41); | ||||
|     LL_EXTI_EnableRisingTrig_32_63(LL_EXTI_LINE_41); | ||||
| 
 | ||||
|     /**
 | ||||
|    * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2. | ||||
|    * In that case, to keep the mechanism transparent to the user application, it shall call the system command | ||||
|    * SHCI_C2_Reinit( ) before jumping to the application. | ||||
|    * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware. | ||||
|    * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect. | ||||
|    * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect | ||||
|    * So, by default, the application shall both set the event flag and set the C2BOOT bit. | ||||
|    */ | ||||
|     __SEV(); /* Set the internal event flag and send an event to the CPU2 */ | ||||
|     __WFE(); /* Clear the internal event flag */ | ||||
|     LL_PWR_EnableBootC2(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_Init(void) { | ||||
|     LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC); | ||||
| 
 | ||||
|     LL_C1_IPCC_EnableIT_RXO(IPCC); | ||||
|     LL_C1_IPCC_EnableIT_TXF(IPCC); | ||||
| 
 | ||||
|     HAL_NVIC_SetPriority(IPCC_C1_RX_IRQn, 6, 0); | ||||
|     HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn); | ||||
|     HAL_NVIC_SetPriority(IPCC_C1_TX_IRQn, 6, 0); | ||||
|     HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * BLE | ||||
|  ******************************************************************************/ | ||||
| void HW_IPCC_BLE_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_BLE_EVENT_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_BLE_SendCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_BLE_CMD_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_BLE_EvtHandler(void) { | ||||
|     HW_IPCC_BLE_RxEvtNot(); | ||||
| 
 | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_BLE_EVENT_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_BLE_SendAclData(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL); | ||||
|     LL_C1_IPCC_EnableTransmitChannel(IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_BLE_AclDataEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableTransmitChannel(IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_BLE_AclDataAckNot(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| __weak void HW_IPCC_BLE_AclDataAckNot(void){}; | ||||
| __weak void HW_IPCC_BLE_RxEvtNot(void){}; | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * SYSTEM | ||||
|  ******************************************************************************/ | ||||
| void HW_IPCC_SYS_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_SYS_SendCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableTransmitChannel(IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_SYS_CmdEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableTransmitChannel(IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_SYS_CmdEvtNot(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_SYS_EvtHandler(void) { | ||||
|     HW_IPCC_SYS_EvtNot(); | ||||
| 
 | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| __weak void HW_IPCC_SYS_CmdEvtNot(void){}; | ||||
| __weak void HW_IPCC_SYS_EvtNot(void){}; | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * MAC 802.15.4 | ||||
|  ******************************************************************************/ | ||||
| #ifdef MAC_802_15_4_WB | ||||
| void HW_IPCC_MAC_802_15_4_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_MAC_802_15_4_SendCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableTransmitChannel(IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_MAC_802_15_4_SendAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_MAC_802_15_4_CmdEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableTransmitChannel(IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_MAC_802_15_4_CmdEvtNot(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_MAC_802_15_4_NotEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_MAC_802_15_4_EvtNot(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| __weak void HW_IPCC_MAC_802_15_4_CmdEvtNot(void){}; | ||||
| __weak void HW_IPCC_MAC_802_15_4_EvtNot(void){}; | ||||
| #endif | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * THREAD | ||||
|  ******************************************************************************/ | ||||
| #ifdef THREAD_WB | ||||
| void HW_IPCC_THREAD_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_OT_SendCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableTransmitChannel(IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_CLI_SendCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_THREAD_SendAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_THREAD_CliSendAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_OT_CmdEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableTransmitChannel(IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_OT_CmdEvtNot(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_THREAD_NotEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_THREAD_EvtNot(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_THREAD_CliNotEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_THREAD_CliEvtNot(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| __weak void HW_IPCC_OT_CmdEvtNot(void){}; | ||||
| __weak void HW_IPCC_CLI_CmdEvtNot(void){}; | ||||
| __weak void HW_IPCC_THREAD_EvtNot(void){}; | ||||
| 
 | ||||
| #endif /* THREAD_WB */ | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * LLD TESTS | ||||
|  ******************************************************************************/ | ||||
| #ifdef LLD_TESTS_WB | ||||
| void HW_IPCC_LLDTESTS_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_LLDTESTS_SendCliCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL); | ||||
|     HW_IPCC_LLDTESTS_ReceiveCliRsp(); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_LLDTESTS_SendCliRspAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL); | ||||
|     HW_IPCC_LLDTESTS_ReceiveM0Cmd(); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_LLDTESTS_SendM0CmdAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| __weak void HW_IPCC_LLDTESTS_ReceiveCliRsp(void){}; | ||||
| __weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd(void){}; | ||||
| #endif /* LLD_TESTS_WB */ | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * LLD BLE | ||||
|  ******************************************************************************/ | ||||
| #ifdef LLD_BLE_WB | ||||
| void HW_IPCC_LLD_BLE_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_LLD_BLE_SendCliCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| /*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
 | ||||
| { | ||||
|   LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL ); | ||||
|   HW_IPCC_LLD_BLE_ReceiveCliRsp(); | ||||
|   return; | ||||
| }*/ | ||||
| 
 | ||||
| void HW_IPCC_LLD_BLE_SendCliRspAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler(void) { | ||||
|     //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
 | ||||
|     HW_IPCC_LLD_BLE_ReceiveM0Cmd(); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_LLD_BLE_SendM0CmdAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL); | ||||
|     //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
 | ||||
|     return; | ||||
| } | ||||
| __weak void HW_IPCC_LLD_BLE_ReceiveCliRsp(void){}; | ||||
| __weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd(void){}; | ||||
| 
 | ||||
| /* Transparent Mode */ | ||||
| void HW_IPCC_LLD_BLE_SendCmd(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_LLD_BLE_ReceiveRspHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL); | ||||
|     HW_IPCC_LLD_BLE_ReceiveRsp(); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_LLD_BLE_SendRspAck(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| #endif /* LLD_BLE_WB */ | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * ZIGBEE | ||||
|  ******************************************************************************/ | ||||
| #ifdef ZIGBEE_WB | ||||
| void HW_IPCC_ZIGBEE_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_ZIGBEE_SendM4RequestToM0(void) { | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL); | ||||
|     LL_C1_IPCC_EnableTransmitChannel(IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_ZIGBEE_SendM4AckToM0Notify(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_ZIGBEE_CmdEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableTransmitChannel(IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_ZIGBEE_RecvAppliAckFromM0(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_ZIGBEE_StackNotifEvtHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_ZIGBEE_RecvM0NotifyToM4(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_ZIGBEE_StackM0RequestHandler(void) { | ||||
|     LL_C1_IPCC_DisableReceiveChannel(IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL); | ||||
| 
 | ||||
|     HW_IPCC_ZIGBEE_RecvM0RequestToM4(); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| void HW_IPCC_ZIGBEE_SendM4AckToM0Request(void) { | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL); | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| __weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0(void){}; | ||||
| __weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4(void){}; | ||||
| __weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4(void){}; | ||||
| #endif /* ZIGBEE_WB */ | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * MEMORY MANAGER | ||||
|  ******************************************************************************/ | ||||
| void HW_IPCC_MM_SendFreeBuf(void (*cb)(void)) { | ||||
|     if(LL_C1_IPCC_IsActiveFlag_CHx(IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL)) { | ||||
|         FreeBufCb = cb; | ||||
|         LL_C1_IPCC_EnableTransmitChannel(IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL); | ||||
|     } else { | ||||
|         cb(); | ||||
| 
 | ||||
|         LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL); | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_MM_FreeBufHandler(void) { | ||||
|     LL_C1_IPCC_DisableTransmitChannel(IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL); | ||||
| 
 | ||||
|     FreeBufCb(); | ||||
| 
 | ||||
|     LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * TRACES | ||||
|  ******************************************************************************/ | ||||
| void HW_IPCC_TRACES_Init(void) { | ||||
|     LL_C1_IPCC_EnableReceiveChannel(IPCC, HW_IPCC_TRACES_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| static void HW_IPCC_TRACES_EvtHandler(void) { | ||||
|     HW_IPCC_TRACES_EvtNot(); | ||||
| 
 | ||||
|     LL_C1_IPCC_ClearFlag_CHx(IPCC, HW_IPCC_TRACES_CHANNEL); | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| __weak void HW_IPCC_TRACES_EvtNot(void){}; | ||||
| 
 | ||||
| /******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,242 +0,0 @@ | ||||
| #include "serial_service.h" | ||||
| #include "app_common.h" | ||||
| #include "ble.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| 
 | ||||
| #define TAG "BtSerialSvc" | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint16_t svc_handle; | ||||
|     uint16_t rx_char_handle; | ||||
|     uint16_t tx_char_handle; | ||||
|     uint16_t flow_ctrl_char_handle; | ||||
|     osMutexId_t buff_size_mtx; | ||||
|     uint32_t buff_size; | ||||
|     uint16_t bytes_ready_to_receive; | ||||
|     SerialServiceEventCallback callback; | ||||
|     void* context; | ||||
| } SerialSvc; | ||||
| 
 | ||||
| static SerialSvc* serial_svc = NULL; | ||||
| 
 | ||||
| static const uint8_t service_uuid[] = | ||||
|     {0x00, 0x00, 0xfe, 0x60, 0xcc, 0x7a, 0x48, 0x2a, 0x98, 0x4a, 0x7f, 0x2e, 0xd5, 0xb3, 0xe5, 0x8f}; | ||||
| static const uint8_t char_tx_uuid[] = | ||||
|     {0x00, 0x00, 0xfe, 0x61, 0x8e, 0x22, 0x45, 0x41, 0x9d, 0x4c, 0x21, 0xed, 0xae, 0x82, 0xed, 0x19}; | ||||
| static const uint8_t char_rx_uuid[] = | ||||
|     {0x00, 0x00, 0xfe, 0x62, 0x8e, 0x22, 0x45, 0x41, 0x9d, 0x4c, 0x21, 0xed, 0xae, 0x82, 0xed, 0x19}; | ||||
| static const uint8_t flow_ctrl_uuid[] = | ||||
|     {0x00, 0x00, 0xfe, 0x63, 0x8e, 0x22, 0x45, 0x41, 0x9d, 0x4c, 0x21, 0xed, 0xae, 0x82, 0xed, 0x19}; | ||||
| 
 | ||||
| static SVCCTL_EvtAckStatus_t serial_svc_event_handler(void* event) { | ||||
|     SVCCTL_EvtAckStatus_t ret = SVCCTL_EvtNotAck; | ||||
|     hci_event_pckt* event_pckt = (hci_event_pckt*)(((hci_uart_pckt*)event)->data); | ||||
|     evt_blecore_aci* blecore_evt = (evt_blecore_aci*)event_pckt->data; | ||||
|     aci_gatt_attribute_modified_event_rp0* attribute_modified; | ||||
|     if(event_pckt->evt == HCI_VENDOR_SPECIFIC_DEBUG_EVT_CODE) { | ||||
|         if(blecore_evt->ecode == ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE) { | ||||
|             attribute_modified = (aci_gatt_attribute_modified_event_rp0*)blecore_evt->data; | ||||
|             if(attribute_modified->Attr_Handle == serial_svc->rx_char_handle + 2) { | ||||
|                 // Descriptor handle
 | ||||
|                 ret = SVCCTL_EvtAckFlowEnable; | ||||
|                 FURI_LOG_D(TAG, "RX descriptor event"); | ||||
|             } else if(attribute_modified->Attr_Handle == serial_svc->rx_char_handle + 1) { | ||||
|                 FURI_LOG_D(TAG, "Received %d bytes", attribute_modified->Attr_Data_Length); | ||||
|                 if(serial_svc->callback) { | ||||
|                     furi_check(osMutexAcquire(serial_svc->buff_size_mtx, osWaitForever) == osOK); | ||||
|                     if(attribute_modified->Attr_Data_Length > serial_svc->bytes_ready_to_receive) { | ||||
|                         FURI_LOG_W( | ||||
|                             TAG, | ||||
|                             "Received %d, while was ready to receive %d bytes. Can lead to buffer overflow!", | ||||
|                             attribute_modified->Attr_Data_Length, | ||||
|                             serial_svc->bytes_ready_to_receive); | ||||
|                     } | ||||
|                     serial_svc->bytes_ready_to_receive -= MIN( | ||||
|                         serial_svc->bytes_ready_to_receive, attribute_modified->Attr_Data_Length); | ||||
|                     SerialServiceEvent event = { | ||||
|                         .event = SerialServiceEventTypeDataReceived, | ||||
|                         .data = { | ||||
|                             .buffer = attribute_modified->Attr_Data, | ||||
|                             .size = attribute_modified->Attr_Data_Length, | ||||
|                         }}; | ||||
|                     uint32_t buff_free_size = serial_svc->callback(event, serial_svc->context); | ||||
|                     FURI_LOG_D(TAG, "Available buff size: %d", buff_free_size); | ||||
|                     furi_check(osMutexRelease(serial_svc->buff_size_mtx) == osOK); | ||||
|                 } | ||||
|                 ret = SVCCTL_EvtAckFlowEnable; | ||||
|             } | ||||
|         } else if(blecore_evt->ecode == ACI_GATT_SERVER_CONFIRMATION_VSEVT_CODE) { | ||||
|             FURI_LOG_T(TAG, "Ack received", blecore_evt->ecode); | ||||
|             if(serial_svc->callback) { | ||||
|                 SerialServiceEvent event = { | ||||
|                     .event = SerialServiceEventTypeDataSent, | ||||
|                 }; | ||||
|                 serial_svc->callback(event, serial_svc->context); | ||||
|             } | ||||
|             ret = SVCCTL_EvtAckFlowEnable; | ||||
|         } | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| void serial_svc_start() { | ||||
|     tBleStatus status; | ||||
|     serial_svc = malloc(sizeof(SerialSvc)); | ||||
|     // Register event handler
 | ||||
|     SVCCTL_RegisterSvcHandler(serial_svc_event_handler); | ||||
| 
 | ||||
|     // Add service
 | ||||
|     status = aci_gatt_add_service( | ||||
|         UUID_TYPE_128, (Service_UUID_t*)service_uuid, PRIMARY_SERVICE, 10, &serial_svc->svc_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add Serial service: %d", status); | ||||
|     } | ||||
| 
 | ||||
|     // Add RX characteristics
 | ||||
|     status = aci_gatt_add_char( | ||||
|         serial_svc->svc_handle, | ||||
|         UUID_TYPE_128, | ||||
|         (const Char_UUID_t*)char_rx_uuid, | ||||
|         SERIAL_SVC_DATA_LEN_MAX, | ||||
|         CHAR_PROP_WRITE_WITHOUT_RESP | CHAR_PROP_WRITE | CHAR_PROP_READ, | ||||
|         ATTR_PERMISSION_AUTHEN_READ | ATTR_PERMISSION_AUTHEN_WRITE, | ||||
|         GATT_NOTIFY_ATTRIBUTE_WRITE, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_VARIABLE, | ||||
|         &serial_svc->rx_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add RX characteristic: %d", status); | ||||
|     } | ||||
| 
 | ||||
|     // Add TX characteristic
 | ||||
|     status = aci_gatt_add_char( | ||||
|         serial_svc->svc_handle, | ||||
|         UUID_TYPE_128, | ||||
|         (const Char_UUID_t*)char_tx_uuid, | ||||
|         SERIAL_SVC_DATA_LEN_MAX, | ||||
|         CHAR_PROP_READ | CHAR_PROP_INDICATE, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_VARIABLE, | ||||
|         &serial_svc->tx_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add TX characteristic: %d", status); | ||||
|     } | ||||
|     // Add Flow Control characteristic
 | ||||
|     status = aci_gatt_add_char( | ||||
|         serial_svc->svc_handle, | ||||
|         UUID_TYPE_128, | ||||
|         (const Char_UUID_t*)flow_ctrl_uuid, | ||||
|         sizeof(uint32_t), | ||||
|         CHAR_PROP_READ | CHAR_PROP_NOTIFY, | ||||
|         ATTR_PERMISSION_AUTHEN_READ, | ||||
|         GATT_DONT_NOTIFY_EVENTS, | ||||
|         10, | ||||
|         CHAR_VALUE_LEN_CONSTANT, | ||||
|         &serial_svc->flow_ctrl_char_handle); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(TAG, "Failed to add Flow Control characteristic: %d", status); | ||||
|     } | ||||
|     // Allocate buffer size mutex
 | ||||
|     serial_svc->buff_size_mtx = osMutexNew(NULL); | ||||
| } | ||||
| 
 | ||||
| void serial_svc_set_callbacks( | ||||
|     uint16_t buff_size, | ||||
|     SerialServiceEventCallback callback, | ||||
|     void* context) { | ||||
|     furi_assert(serial_svc); | ||||
|     serial_svc->callback = callback; | ||||
|     serial_svc->context = context; | ||||
|     serial_svc->buff_size = buff_size; | ||||
|     serial_svc->bytes_ready_to_receive = buff_size; | ||||
|     uint32_t buff_size_reversed = REVERSE_BYTES_U32(serial_svc->buff_size); | ||||
|     aci_gatt_update_char_value( | ||||
|         serial_svc->svc_handle, | ||||
|         serial_svc->flow_ctrl_char_handle, | ||||
|         0, | ||||
|         sizeof(uint32_t), | ||||
|         (uint8_t*)&buff_size_reversed); | ||||
| } | ||||
| 
 | ||||
| void serial_svc_notify_buffer_is_empty() { | ||||
|     furi_assert(serial_svc); | ||||
|     furi_assert(serial_svc->buff_size_mtx); | ||||
| 
 | ||||
|     furi_check(osMutexAcquire(serial_svc->buff_size_mtx, osWaitForever) == osOK); | ||||
|     if(serial_svc->bytes_ready_to_receive == 0) { | ||||
|         FURI_LOG_D(TAG, "Buffer is empty. Notifying client"); | ||||
|         serial_svc->bytes_ready_to_receive = serial_svc->buff_size; | ||||
|         uint32_t buff_size_reversed = REVERSE_BYTES_U32(serial_svc->buff_size); | ||||
|         aci_gatt_update_char_value( | ||||
|             serial_svc->svc_handle, | ||||
|             serial_svc->flow_ctrl_char_handle, | ||||
|             0, | ||||
|             sizeof(uint32_t), | ||||
|             (uint8_t*)&buff_size_reversed); | ||||
|     } | ||||
|     furi_check(osMutexRelease(serial_svc->buff_size_mtx) == osOK); | ||||
| } | ||||
| 
 | ||||
| void serial_svc_stop() { | ||||
|     tBleStatus status; | ||||
|     if(serial_svc) { | ||||
|         // Delete characteristics
 | ||||
|         status = aci_gatt_del_char(serial_svc->svc_handle, serial_svc->tx_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete TX characteristic: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char(serial_svc->svc_handle, serial_svc->rx_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete RX characteristic: %d", status); | ||||
|         } | ||||
|         status = aci_gatt_del_char(serial_svc->svc_handle, serial_svc->flow_ctrl_char_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Flow Control characteristic: %d", status); | ||||
|         } | ||||
|         // Delete service
 | ||||
|         status = aci_gatt_del_service(serial_svc->svc_handle); | ||||
|         if(status) { | ||||
|             FURI_LOG_E(TAG, "Failed to delete Serial service: %d", status); | ||||
|         } | ||||
|         // Delete buffer size mutex
 | ||||
|         osMutexDelete(serial_svc->buff_size_mtx); | ||||
|         free(serial_svc); | ||||
|         serial_svc = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool serial_svc_is_started() { | ||||
|     return serial_svc != NULL; | ||||
| } | ||||
| 
 | ||||
| bool serial_svc_update_tx(uint8_t* data, uint16_t data_len) { | ||||
|     if(data_len > SERIAL_SVC_DATA_LEN_MAX) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     for(uint16_t remained = data_len; remained > 0;) { | ||||
|         uint8_t value_len = MIN(SERIAL_SVC_CHAR_VALUE_LEN_MAX, remained); | ||||
|         uint16_t value_offset = data_len - remained; | ||||
|         remained -= value_len; | ||||
| 
 | ||||
|         tBleStatus result = aci_gatt_update_char_value_ext( | ||||
|             0, | ||||
|             serial_svc->svc_handle, | ||||
|             serial_svc->tx_char_handle, | ||||
|             remained ? 0x00 : 0x02, | ||||
|             data_len, | ||||
|             value_offset, | ||||
|             value_len, | ||||
|             data + value_offset); | ||||
| 
 | ||||
|         if(result) { | ||||
|             FURI_LOG_E(TAG, "Failed updating TX characteristic: %d", result); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| @ -1,47 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| #define SERIAL_SVC_DATA_LEN_MAX (486) | ||||
| #define SERIAL_SVC_CHAR_VALUE_LEN_MAX (243) | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef enum { | ||||
|     SerialServiceEventTypeDataReceived, | ||||
|     SerialServiceEventTypeDataSent, | ||||
| } SerialServiceEventType; | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint8_t* buffer; | ||||
|     uint16_t size; | ||||
| } SerialServiceData; | ||||
| 
 | ||||
| typedef struct { | ||||
|     SerialServiceEventType event; | ||||
|     SerialServiceData data; | ||||
| } SerialServiceEvent; | ||||
| 
 | ||||
| typedef uint16_t (*SerialServiceEventCallback)(SerialServiceEvent event, void* context); | ||||
| 
 | ||||
| void serial_svc_start(); | ||||
| 
 | ||||
| void serial_svc_set_callbacks( | ||||
|     uint16_t buff_size, | ||||
|     SerialServiceEventCallback callback, | ||||
|     void* context); | ||||
| 
 | ||||
| void serial_svc_notify_buffer_is_empty(); | ||||
| 
 | ||||
| void serial_svc_stop(); | ||||
| 
 | ||||
| bool serial_svc_is_started(); | ||||
| 
 | ||||
| bool serial_svc_update_tx(uint8_t* data, uint16_t data_len); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,136 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : App/tl_dbg_conf.h | ||||
|   * Description        : Debug configuration file for stm32wpan transport layer interface. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __TL_DBG_CONF_H | ||||
| #define __TL_DBG_CONF_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* USER CODE BEGIN Tl_Conf */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */ | ||||
| #include "dbg_trace.h" | ||||
| #include "hw_if.h" | ||||
| #include <furi_hal.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * Enable or Disable traces | ||||
|  * The raw data output is the hci binary packet format as specified by the BT specification * | ||||
|  */ | ||||
| #define TL_SHCI_CMD_DBG_EN 1 /* Reports System commands sent to CPU2 and the command response */ | ||||
| #define TL_SHCI_CMD_DBG_RAW_EN \ | ||||
|     0 /* Reports raw data System commands sent to CPU2 and the command response */ | ||||
| #define TL_SHCI_EVT_DBG_EN 1 /* Reports System Asynchronous Events received from CPU2 */ | ||||
| #define TL_SHCI_EVT_DBG_RAW_EN \ | ||||
|     0 /* Reports raw data System Asynchronous Events received from CPU2 */ | ||||
| 
 | ||||
| #define TL_HCI_CMD_DBG_EN 1 /* Reports BLE command sent to CPU2 and the command response */ | ||||
| #define TL_HCI_CMD_DBG_RAW_EN \ | ||||
|     0 /* Reports raw data BLE command sent to CPU2 and the command response */ | ||||
| #define TL_HCI_EVT_DBG_EN 1 /* Reports BLE Asynchronous Events received from CPU2 */ | ||||
| #define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */ | ||||
| 
 | ||||
| #define TL_MM_DBG_EN 1 /* Reports the informations of the buffer released to CPU2 */ | ||||
| 
 | ||||
| /**
 | ||||
|  * System Transport Layer | ||||
|  */ | ||||
| #if(TL_SHCI_CMD_DBG_EN != 0) | ||||
| #define TL_SHCI_CMD_DBG_MSG PRINT_MESG_DBG | ||||
| #define TL_SHCI_CMD_DBG_BUF PRINT_LOG_BUFF_DBG | ||||
| #else | ||||
| #define TL_SHCI_CMD_DBG_MSG(...) | ||||
| #define TL_SHCI_CMD_DBG_BUF(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(TL_SHCI_CMD_DBG_RAW_EN != 0) | ||||
| #define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_) furi_hal_console_tx_with_new_line(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_SHCI_CMD_DBG_RAW(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(TL_SHCI_EVT_DBG_EN != 0) | ||||
| #define TL_SHCI_EVT_DBG_MSG PRINT_MESG_DBG | ||||
| #define TL_SHCI_EVT_DBG_BUF PRINT_LOG_BUFF_DBG | ||||
| #else | ||||
| #define TL_SHCI_EVT_DBG_MSG(...) | ||||
| #define TL_SHCI_EVT_DBG_BUF(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(TL_SHCI_EVT_DBG_RAW_EN != 0) | ||||
| #define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_) furi_hal_console_tx_with_new_line(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_SHCI_EVT_DBG_RAW(...) | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * BLE Transport Layer | ||||
|  */ | ||||
| #if(TL_HCI_CMD_DBG_EN != 0) | ||||
| #define TL_HCI_CMD_DBG_MSG PRINT_MESG_DBG | ||||
| #define TL_HCI_CMD_DBG_BUF PRINT_LOG_BUFF_DBG | ||||
| #else | ||||
| #define TL_HCI_CMD_DBG_MSG(...) | ||||
| #define TL_HCI_CMD_DBG_BUF(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(TL_HCI_CMD_DBG_RAW_EN != 0) | ||||
| #define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_) furi_hal_console_tx_with_new_line(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_HCI_CMD_DBG_RAW(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(TL_HCI_EVT_DBG_EN != 0) | ||||
| #define TL_HCI_EVT_DBG_MSG PRINT_MESG_DBG | ||||
| #define TL_HCI_EVT_DBG_BUF PRINT_LOG_BUFF_DBG | ||||
| #else | ||||
| #define TL_HCI_EVT_DBG_MSG(...) | ||||
| #define TL_HCI_EVT_DBG_BUF(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(TL_HCI_EVT_DBG_RAW_EN != 0) | ||||
| #define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_) furi_hal_console_tx_with_new_line(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_HCI_EVT_DBG_RAW(...) | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Memory Manager - Released buffer tracing | ||||
|  */ | ||||
| #if(TL_MM_DBG_EN != 0) | ||||
| #define TL_MM_DBG_MSG PRINT_MESG_DBG | ||||
| #else | ||||
| #define TL_MM_DBG_MSG(...) | ||||
| #endif | ||||
| 
 | ||||
| /* USER CODE END Tl_Conf */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /*__TL_DBG_CONF_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,69 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * File Name          : utilities_conf.h | ||||
|   * Description        : Configuration file for STM32 Utilities. | ||||
|   * | ||||
|  ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef UTILITIES_CONF_H | ||||
| #define UTILITIES_CONF_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "cmsis_compiler.h" | ||||
| #include "string.h" | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * common | ||||
|  ******************************************************************************/ | ||||
| #define UTILS_ENTER_CRITICAL_SECTION()      \ | ||||
|     uint32_t primask_bit = __get_PRIMASK(); \ | ||||
|     __disable_irq() | ||||
| 
 | ||||
| #define UTILS_EXIT_CRITICAL_SECTION() __set_PRIMASK(primask_bit) | ||||
| 
 | ||||
| #define UTILS_MEMSET8(dest, value, size) memset(dest, value, size); | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * tiny low power manager | ||||
|  * (any macro that does not need to be modified can be removed) | ||||
|  ******************************************************************************/ | ||||
| #define UTIL_LPM_INIT_CRITICAL_SECTION() | ||||
| #define UTIL_LPM_ENTER_CRITICAL_SECTION() UTILS_ENTER_CRITICAL_SECTION() | ||||
| #define UTIL_LPM_EXIT_CRITICAL_SECTION() UTILS_EXIT_CRITICAL_SECTION() | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * sequencer | ||||
|  * (any macro that does not need to be modified can be removed) | ||||
|  ******************************************************************************/ | ||||
| #define UTIL_SEQ_INIT_CRITICAL_SECTION() | ||||
| #define UTIL_SEQ_ENTER_CRITICAL_SECTION() UTILS_ENTER_CRITICAL_SECTION() | ||||
| #define UTIL_SEQ_EXIT_CRITICAL_SECTION() UTILS_EXIT_CRITICAL_SECTION() | ||||
| #define UTIL_SEQ_CONF_TASK_NBR (32) | ||||
| #define UTIL_SEQ_CONF_PRIO_NBR (2) | ||||
| #define UTIL_SEQ_MEMSET8(dest, value, size) UTILS_MEMSET8(dest, value, size) | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /*UTILITIES_CONF_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,193 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /*
 | ||||
|  * FreeRTOS Kernel V10.3.1 | ||||
|  * Portion Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * Portion Copyright (C) 2019 StMicroelectronics, Inc.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org
 | ||||
|  * http://aws.amazon.com/freertos
 | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| #ifndef FREERTOS_CONFIG_H | ||||
| #define FREERTOS_CONFIG_H | ||||
| 
 | ||||
| /*-----------------------------------------------------------
 | ||||
|  * Application specific definitions. | ||||
|  * | ||||
|  * These definitions should be adjusted for your particular hardware and | ||||
|  * application requirements. | ||||
|  * | ||||
|  * These parameters and more are described within the 'configuration' section of the | ||||
|  * FreeRTOS API documentation available on the FreeRTOS.org web site. | ||||
|  * | ||||
|  * See http://www.freertos.org/a00110.html
 | ||||
|  *----------------------------------------------------------*/ | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| /* Section where include file can be added */ | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Ensure definitions are only used by the compiler, and not by the assembler. */ | ||||
| #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) | ||||
| #include <stdint.h> | ||||
| extern uint32_t SystemCoreClock; | ||||
| void xPortSysTickHandler(void); | ||||
| /* USER CODE BEGIN 0 */ | ||||
| extern void configureTimerForRunTimeStats(void); | ||||
| extern unsigned long getRunTimeCounterValue(void); | ||||
| /* USER CODE END 0 */ | ||||
| #endif | ||||
| #ifndef CMSIS_device_header | ||||
| #define CMSIS_device_header "stm32wbxx.h" | ||||
| #endif /* CMSIS_device_header */ | ||||
| 
 | ||||
| #define configENABLE_FPU 1 | ||||
| #define configENABLE_MPU 0 | ||||
| 
 | ||||
| #define configUSE_PREEMPTION 1 | ||||
| #define configSUPPORT_STATIC_ALLOCATION 1 | ||||
| #define configSUPPORT_DYNAMIC_ALLOCATION 1 | ||||
| #define configUSE_IDLE_HOOK 1 | ||||
| #define configUSE_TICK_HOOK 0 | ||||
| #define configCPU_CLOCK_HZ (SystemCoreClock) | ||||
| #define configTICK_RATE_HZ ((TickType_t)1000) | ||||
| #define configMAX_PRIORITIES (56) | ||||
| #define configMINIMAL_STACK_SIZE ((uint16_t)128) | ||||
| #define configTOTAL_HEAP_SIZE ((size_t)40960) | ||||
| #define configMAX_TASK_NAME_LEN (16) | ||||
| #define configGENERATE_RUN_TIME_STATS 1 | ||||
| #define configUSE_TRACE_FACILITY 1 | ||||
| #define configUSE_16_BIT_TICKS 0 | ||||
| #define configUSE_MUTEXES 1 | ||||
| #define configQUEUE_REGISTRY_SIZE 8 | ||||
| #define configCHECK_FOR_STACK_OVERFLOW 1 | ||||
| #define configUSE_RECURSIVE_MUTEXES 1 | ||||
| #define configUSE_COUNTING_SEMAPHORES 1 | ||||
| #define configENABLE_BACKWARD_COMPATIBILITY 0 | ||||
| #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 | ||||
| #define configUSE_TICKLESS_IDLE 2 | ||||
| #define configRECORD_STACK_HIGH_ADDRESS 1 | ||||
| /* USER CODE BEGIN MESSAGE_BUFFER_LENGTH_TYPE */ | ||||
| /* Defaults to size_t for backward compatibility, but can be changed
 | ||||
|    if lengths will always be less than the number of bytes in a size_t. */ | ||||
| #define configMESSAGE_BUFFER_LENGTH_TYPE size_t | ||||
| /* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */ | ||||
| 
 | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES 0 | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES (2) | ||||
| 
 | ||||
| /* Software timer definitions. */ | ||||
| #define configUSE_TIMERS 1 | ||||
| #define configTIMER_TASK_PRIORITY (2) | ||||
| #define configTIMER_QUEUE_LENGTH 10 | ||||
| #define configTIMER_TASK_STACK_DEPTH 256 | ||||
| 
 | ||||
| /* CMSIS-RTOS V2 flags */ | ||||
| #define configUSE_OS2_THREAD_SUSPEND_RESUME 1 | ||||
| #define configUSE_OS2_THREAD_ENUMERATE 1 | ||||
| #define configUSE_OS2_EVENTFLAGS_FROM_ISR 1 | ||||
| #define configUSE_OS2_THREAD_FLAGS 1 | ||||
| #define configUSE_OS2_TIMER 1 | ||||
| #define configUSE_OS2_MUTEX 1 | ||||
| 
 | ||||
| /* Set the following definitions to 1 to include the API function, or zero
 | ||||
| to exclude the API function. */ | ||||
| #define INCLUDE_vTaskPrioritySet 1 | ||||
| #define INCLUDE_uxTaskPriorityGet 1 | ||||
| #define INCLUDE_vTaskDelete 1 | ||||
| #define INCLUDE_vTaskCleanUpResources 1 | ||||
| #define INCLUDE_vTaskSuspend 1 | ||||
| #define INCLUDE_vTaskDelayUntil 1 | ||||
| #define INCLUDE_vTaskDelay 1 | ||||
| #define INCLUDE_xTaskGetSchedulerState 1 | ||||
| #define INCLUDE_xTimerPendFunctionCall 1 | ||||
| #define INCLUDE_xQueueGetMutexHolder 1 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark 1 | ||||
| #define INCLUDE_xTaskGetCurrentTaskHandle 1 | ||||
| #define INCLUDE_eTaskGetState 1 | ||||
| 
 | ||||
| /*
 | ||||
|  * The CMSIS-RTOS V2 FreeRTOS wrapper is dependent on the heap implementation used | ||||
|  * by the application thus the correct define need to be enabled below | ||||
|  */ | ||||
| #define USE_FreeRTOS_HEAP_4 | ||||
| 
 | ||||
| /* Cortex-M specific definitions. */ | ||||
| #ifdef __NVIC_PRIO_BITS | ||||
| /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ | ||||
| #define configPRIO_BITS __NVIC_PRIO_BITS | ||||
| #else | ||||
| #define configPRIO_BITS 4 | ||||
| #endif | ||||
| 
 | ||||
| /* The lowest interrupt priority that can be used in a call to a "set priority"
 | ||||
| function. */ | ||||
| #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 | ||||
| 
 | ||||
| /* The highest interrupt priority that can be used by any interrupt service
 | ||||
| routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL | ||||
| INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER | ||||
| PRIORITY THAN THIS! (higher priorities are lower numeric values. */ | ||||
| #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 | ||||
| 
 | ||||
| /* Interrupt priorities used by the kernel port layer itself.  These are generic
 | ||||
| to all Cortex-M ports, and do not rely on any particular library functions. */ | ||||
| #define configKERNEL_INTERRUPT_PRIORITY \ | ||||
|     (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) | ||||
| /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
 | ||||
| See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
 | ||||
| #define configMAX_SYSCALL_INTERRUPT_PRIORITY \ | ||||
|     (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) | ||||
| 
 | ||||
| /* Normal assert() semantics without relying on the provision of an assert.h
 | ||||
| header file. */ | ||||
| /* USER CODE BEGIN 1 */ | ||||
| #define configASSERT(x)           \ | ||||
|     if((x) == 0) {                \ | ||||
|         taskDISABLE_INTERRUPTS(); \ | ||||
|         for(;;)                   \ | ||||
|             ;                     \ | ||||
|     } | ||||
| /* USER CODE END 1 */ | ||||
| 
 | ||||
| /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
 | ||||
| standard names. */ | ||||
| #define vPortSVCHandler SVC_Handler | ||||
| #define xPortPendSVHandler PendSV_Handler | ||||
| 
 | ||||
| /* IMPORTANT: After 10.3.1 update, Systick_Handler comes from NVIC (if SYS timebase = systick), otherwise from cmsis_os2.c */ | ||||
| 
 | ||||
| #define USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION 1 | ||||
| 
 | ||||
| /* USER CODE BEGIN 2 */ | ||||
| /* Definitions needed when configGENERATE_RUN_TIME_STATS is on */ | ||||
| #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats | ||||
| #define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue | ||||
| /* USER CODE END 2 */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Defines */ | ||||
| /* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */ | ||||
| /* USER CODE END Defines */ | ||||
| 
 | ||||
| #endif /* FREERTOS_CONFIG_H */ | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    adc.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the adc.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __ADC_H__ | ||||
| #define __ADC_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern ADC_HandleTypeDef hadc1; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_ADC1_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __ADC_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,54 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    aes.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the aes.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __AES_H__ | ||||
| #define __AES_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern CRYP_HandleTypeDef hcryp1; | ||||
| extern CRYP_HandleTypeDef hcryp2; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_AES1_Init(void); | ||||
| void MX_AES2_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __AES_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    comp.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the comp.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __COMP_H__ | ||||
| #define __COMP_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_COMP1_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __COMP_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    crc.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the crc.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __CRC_H__ | ||||
| #define __CRC_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern CRC_HandleTypeDef hcrc; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_CRC_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __CRC_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,49 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    gpio.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the gpio.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __GPIO_H__ | ||||
| #define __GPIO_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_GPIO_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif /*__ GPIO_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,50 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    i2c.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the i2c.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __I2C_H__ | ||||
| #define __I2C_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_I2C1_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __I2C_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,175 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file           : main.h | ||||
|   * @brief          : Header for main.c file. | ||||
|   *                   This file contains the common defines of the application. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __MAIN_H | ||||
| #define __MAIN_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32wbxx_hal.h" | ||||
| 
 | ||||
| #include "stm32wbxx_ll_i2c.h" | ||||
| #include "stm32wbxx_ll_crs.h" | ||||
| #include "stm32wbxx_ll_rcc.h" | ||||
| #include "stm32wbxx_ll_bus.h" | ||||
| #include "stm32wbxx_ll_system.h" | ||||
| #include "stm32wbxx_ll_exti.h" | ||||
| #include "stm32wbxx_ll_cortex.h" | ||||
| #include "stm32wbxx_ll_utils.h" | ||||
| #include "stm32wbxx_ll_pwr.h" | ||||
| #include "stm32wbxx_ll_dma.h" | ||||
| #include "stm32wbxx_ll_usart.h" | ||||
| #include "stm32wbxx_ll_gpio.h" | ||||
| 
 | ||||
| /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN ET */ | ||||
| 
 | ||||
| /* USER CODE END ET */ | ||||
| 
 | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN EC */ | ||||
| 
 | ||||
| /* USER CODE END EC */ | ||||
| 
 | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN EM */ | ||||
| 
 | ||||
| /* USER CODE END EM */ | ||||
| 
 | ||||
| /* Exported functions prototypes ---------------------------------------------*/ | ||||
| void Error_Handler(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN EFP */ | ||||
| 
 | ||||
| /* USER CODE END EFP */ | ||||
| 
 | ||||
| /* Private defines -----------------------------------------------------------*/ | ||||
| #define BUTTON_BACK_Pin GPIO_PIN_13 | ||||
| #define BUTTON_BACK_GPIO_Port GPIOC | ||||
| #define BUTTON_BACK_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define QUARTZ_32MHZ_IN_Pin GPIO_PIN_14 | ||||
| #define QUARTZ_32MHZ_IN_GPIO_Port GPIOC | ||||
| #define QUARTZ_32MHZ_OUT_Pin GPIO_PIN_15 | ||||
| #define QUARTZ_32MHZ_OUT_GPIO_Port GPIOC | ||||
| #define BUTTON_OK_Pin GPIO_PIN_3 | ||||
| #define BUTTON_OK_GPIO_Port GPIOH | ||||
| #define BUTTON_OK_EXTI_IRQn EXTI3_IRQn | ||||
| #define SPEAKER_Pin GPIO_PIN_8 | ||||
| #define SPEAKER_GPIO_Port GPIOB | ||||
| #define IR_TX_Pin GPIO_PIN_9 | ||||
| #define IR_TX_GPIO_Port GPIOB | ||||
| #define PC0_Pin GPIO_PIN_0 | ||||
| #define PC0_GPIO_Port GPIOC | ||||
| #define PC1_Pin GPIO_PIN_1 | ||||
| #define PC1_GPIO_Port GPIOC | ||||
| #define SPI_D_MISO_Pin GPIO_PIN_2 | ||||
| #define SPI_D_MISO_GPIO_Port GPIOC | ||||
| #define PC3_Pin GPIO_PIN_3 | ||||
| #define PC3_GPIO_Port GPIOC | ||||
| #define IR_RX_Pin GPIO_PIN_0 | ||||
| #define IR_RX_GPIO_Port GPIOA | ||||
| #define CC1101_G0_Pin GPIO_PIN_1 | ||||
| #define CC1101_G0_GPIO_Port GPIOA | ||||
| #define RFID_PULL_Pin GPIO_PIN_2 | ||||
| #define RFID_PULL_GPIO_Port GPIOA | ||||
| #define PERIPH_POWER_Pin GPIO_PIN_3 | ||||
| #define PERIPH_POWER_GPIO_Port GPIOA | ||||
| #define PA4_Pin GPIO_PIN_4 | ||||
| #define PA4_GPIO_Port GPIOA | ||||
| #define SPI_R_SCK_Pin GPIO_PIN_5 | ||||
| #define SPI_R_SCK_GPIO_Port GPIOA | ||||
| #define PA6_Pin GPIO_PIN_6 | ||||
| #define PA6_GPIO_Port GPIOA | ||||
| #define PA7_Pin GPIO_PIN_7 | ||||
| #define PA7_GPIO_Port GPIOA | ||||
| #define RFID_TUNE_Pin GPIO_PIN_8 | ||||
| #define RFID_TUNE_GPIO_Port GPIOA | ||||
| #define I2C_SCL_Pin GPIO_PIN_9 | ||||
| #define I2C_SCL_GPIO_Port GPIOA | ||||
| #define RF_SW_0_Pin GPIO_PIN_4 | ||||
| #define RF_SW_0_GPIO_Port GPIOC | ||||
| #define RFID_RF_IN_Pin GPIO_PIN_5 | ||||
| #define RFID_RF_IN_GPIO_Port GPIOC | ||||
| #define PB2_Pin GPIO_PIN_2 | ||||
| #define PB2_GPIO_Port GPIOB | ||||
| #define BUTTON_UP_Pin GPIO_PIN_10 | ||||
| #define BUTTON_UP_GPIO_Port GPIOB | ||||
| #define BUTTON_UP_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define BUTTON_LEFT_Pin GPIO_PIN_11 | ||||
| #define BUTTON_LEFT_GPIO_Port GPIOB | ||||
| #define BUTTON_LEFT_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define DISPLAY_RST_Pin GPIO_PIN_0 | ||||
| #define DISPLAY_RST_GPIO_Port GPIOB | ||||
| #define DISPLAY_DI_Pin GPIO_PIN_1 | ||||
| #define DISPLAY_DI_GPIO_Port GPIOB | ||||
| #define NFC_CS_Pin GPIO_PIN_4 | ||||
| #define NFC_CS_GPIO_Port GPIOE | ||||
| #define BUTTON_RIGHT_Pin GPIO_PIN_12 | ||||
| #define BUTTON_RIGHT_GPIO_Port GPIOB | ||||
| #define BUTTON_RIGHT_EXTI_IRQn EXTI15_10_IRQn | ||||
| #define RFID_OUT_Pin GPIO_PIN_13 | ||||
| #define RFID_OUT_GPIO_Port GPIOB | ||||
| #define iBTN_Pin GPIO_PIN_14 | ||||
| #define iBTN_GPIO_Port GPIOB | ||||
| #define SPI_D_MOSI_Pin GPIO_PIN_15 | ||||
| #define SPI_D_MOSI_GPIO_Port GPIOB | ||||
| #define BUTTON_DOWN_Pin GPIO_PIN_6 | ||||
| #define BUTTON_DOWN_GPIO_Port GPIOC | ||||
| #define I2C_SDA_Pin GPIO_PIN_10 | ||||
| #define I2C_SDA_GPIO_Port GPIOA | ||||
| #define VIBRO_Pin GPIO_PIN_15 | ||||
| #define VIBRO_GPIO_Port GPIOA | ||||
| #define SD_CD_Pin GPIO_PIN_10 | ||||
| #define SD_CD_GPIO_Port GPIOC | ||||
| #define DISPLAY_CS_Pin GPIO_PIN_11 | ||||
| #define DISPLAY_CS_GPIO_Port GPIOC | ||||
| #define SD_CS_Pin GPIO_PIN_12 | ||||
| #define SD_CS_GPIO_Port GPIOC | ||||
| #define CC1101_CS_Pin GPIO_PIN_0 | ||||
| #define CC1101_CS_GPIO_Port GPIOD | ||||
| #define SPI_D_SCK_Pin GPIO_PIN_1 | ||||
| #define SPI_D_SCK_GPIO_Port GPIOD | ||||
| #define PB3_Pin GPIO_PIN_3 | ||||
| #define PB3_GPIO_Port GPIOB | ||||
| #define SPI_R_MISO_Pin GPIO_PIN_4 | ||||
| #define SPI_R_MISO_GPIO_Port GPIOB | ||||
| #define SPI_R_MOSI_Pin GPIO_PIN_5 | ||||
| #define SPI_R_MOSI_GPIO_Port GPIOB | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __MAIN_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    pka.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the pka.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __PKA_H__ | ||||
| #define __PKA_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern PKA_HandleTypeDef hpka; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_PKA_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __PKA_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,50 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    rf.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the rf.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __RF_H__ | ||||
| #define __RF_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_RF_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __RF_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    rng.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the rng.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __RNG_H__ | ||||
| #define __RNG_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern RNG_HandleTypeDef hrng; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_RNG_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __RNG_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    rtc.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the rtc.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __RTC_H__ | ||||
| #define __RTC_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern RTC_HandleTypeDef hrtc; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_RTC_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __RTC_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,54 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    spi.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the spi.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __SPI_H__ | ||||
| #define __SPI_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern SPI_HandleTypeDef hspi1; | ||||
| extern SPI_HandleTypeDef hspi2; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_SPI1_Init(void); | ||||
| void MX_SPI2_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __SPI_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,53 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32_assert.h | ||||
|   * @brief   STM32 assert file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32_ASSERT_H | ||||
| #define __STM32_ASSERT_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| #ifdef USE_FULL_ASSERT | ||||
| /**
 | ||||
|   * @brief  The assert_param macro is used for function's parameters check. | ||||
|   * @param  expr: If expr is false, it calls assert_failed function | ||||
|   *         which reports the name of the source file and the source | ||||
|   *         line number of the call that failed. | ||||
|   *         If expr is true, it returns no value. | ||||
|   * @retval None | ||||
|   */ | ||||
| #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t*)__FILE__, __LINE__)) | ||||
| /* Exported functions ------------------------------------------------------- */ | ||||
| void assert_failed(uint8_t* file, uint32_t line); | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __STM32_ASSERT_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,354 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32wbxx_hal_conf.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   HAL configuration file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32WBxx_HAL_CONF_H | ||||
| #define __STM32WBxx_HAL_CONF_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| 
 | ||||
| /* ########################## Module Selection ############################## */ | ||||
| /**
 | ||||
|   * @brief This is the list of modules to be used in the HAL driver | ||||
|   */ | ||||
| #define HAL_MODULE_ENABLED | ||||
| #define HAL_ADC_MODULE_ENABLED | ||||
| #define HAL_CRYP_MODULE_ENABLED | ||||
| #define HAL_COMP_MODULE_ENABLED | ||||
| #define HAL_CRC_MODULE_ENABLED | ||||
| #define HAL_HSEM_MODULE_ENABLED | ||||
| /*#define HAL_I2C_MODULE_ENABLED   */ | ||||
| /*#define HAL_IPCC_MODULE_ENABLED   */ | ||||
| /*#define HAL_IRDA_MODULE_ENABLED   */ | ||||
| /*#define HAL_IWDG_MODULE_ENABLED   */ | ||||
| /*#define HAL_LCD_MODULE_ENABLED   */ | ||||
| /*#define HAL_LPTIM_MODULE_ENABLED   */ | ||||
| #define HAL_PCD_MODULE_ENABLED | ||||
| #define HAL_PKA_MODULE_ENABLED | ||||
| /*#define HAL_QSPI_MODULE_ENABLED   */ | ||||
| #define HAL_RNG_MODULE_ENABLED | ||||
| #define HAL_RTC_MODULE_ENABLED | ||||
| /*#define HAL_SAI_MODULE_ENABLED   */ | ||||
| /*#define HAL_SMBUS_MODULE_ENABLED   */ | ||||
| /*#define HAL_SMARTCARD_MODULE_ENABLED   */ | ||||
| #define HAL_SPI_MODULE_ENABLED | ||||
| #define HAL_TIM_MODULE_ENABLED | ||||
| /*#define HAL_TSC_MODULE_ENABLED   */ | ||||
| /*#define HAL_UART_MODULE_ENABLED   */ | ||||
| /*#define HAL_USART_MODULE_ENABLED   */ | ||||
| /*#define HAL_WWDG_MODULE_ENABLED   */ | ||||
| #define HAL_EXTI_MODULE_ENABLED | ||||
| #define HAL_CORTEX_MODULE_ENABLED | ||||
| #define HAL_DMA_MODULE_ENABLED | ||||
| #define HAL_FLASH_MODULE_ENABLED | ||||
| #define HAL_GPIO_MODULE_ENABLED | ||||
| #define HAL_PWR_MODULE_ENABLED | ||||
| #define HAL_RCC_MODULE_ENABLED | ||||
| 
 | ||||
| #define USE_HAL_ADC_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_COMP_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_CRYP_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_I2C_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_IRDA_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_PCD_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_PKA_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_QSPI_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_RNG_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_RTC_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SAI_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_SPI_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_TIM_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_TSC_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_UART_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_USART_REGISTER_CALLBACKS 0u | ||||
| #define USE_HAL_WWDG_REGISTER_CALLBACKS 0u | ||||
| 
 | ||||
| /* ########################## Oscillator Values adaptation ####################*/ | ||||
| /**
 | ||||
|   * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. | ||||
|   *        This value is used by the RCC HAL module to compute the system frequency | ||||
|   *        (when HSE is used as system clock source, directly or through the PLL). | ||||
|   */ | ||||
| #if !defined(HSE_VALUE) | ||||
| #define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */ | ||||
| #endif /* HSE_VALUE */ | ||||
| 
 | ||||
| #if !defined(HSE_STARTUP_TIMEOUT) | ||||
| #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ | ||||
| #endif /* HSE_STARTUP_TIMEOUT */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal Multiple Speed oscillator (MSI) default value. | ||||
|   *        This value is the default MSI range value after Reset. | ||||
|   */ | ||||
| #if !defined(MSI_VALUE) | ||||
| #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* MSI_VALUE */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal High Speed oscillator (HSI) value. | ||||
|   *        This value is used by the RCC HAL module to compute the system frequency | ||||
|   *        (when HSI is used as system clock source, directly or through the PLL). | ||||
|   */ | ||||
| #if !defined(HSI_VALUE) | ||||
| #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* HSI_VALUE */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal Low Speed oscillator (LSI1) value. | ||||
|   */ | ||||
| #if !defined(LSI1_VALUE) | ||||
| #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/ | ||||
| #endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz | ||||
|                                              The real value may vary depending on the variations | ||||
|                                              in voltage and temperature.*/ | ||||
| /**
 | ||||
|   * @brief Internal Low Speed oscillator (LSI2) value. | ||||
|   */ | ||||
| #if !defined(LSI2_VALUE) | ||||
| #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/ | ||||
| #endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz | ||||
|                                              The real value may vary depending on the variations | ||||
|                                              in voltage and temperature.*/ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief External Low Speed oscillator (LSE) value. | ||||
|   *        This value is used by the UART, RTC HAL module to compute the system frequency | ||||
|   */ | ||||
| #if !defined(LSE_VALUE) | ||||
| #define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/ | ||||
| #endif /* LSE_VALUE */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief Internal Multiple Speed oscillator (HSI48) default value. | ||||
|   *        This value is the default HSI48 range value after Reset. | ||||
|   */ | ||||
| #if !defined(HSI48_VALUE) | ||||
| #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* HSI48_VALUE */ | ||||
| 
 | ||||
| #if !defined(LSE_STARTUP_TIMEOUT) | ||||
| #define LSE_STARTUP_TIMEOUT 1000U /*!< Time out for LSE start up, in ms */ | ||||
| #endif /* HSE_STARTUP_TIMEOUT */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief External clock source for SAI1 peripheral | ||||
|   *        This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source | ||||
|   *        frequency. | ||||
|   */ | ||||
| #if !defined(EXTERNAL_SAI1_CLOCK_VALUE) | ||||
| #define EXTERNAL_SAI1_CLOCK_VALUE \ | ||||
|     ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/ | ||||
| #endif /* EXTERNAL_SAI1_CLOCK_VALUE */ | ||||
| 
 | ||||
| /* Tip: To avoid modifying this file each time you need to use different HSE,
 | ||||
|    ===  you can define the HSE value in your toolchain compiler preprocessor. */ | ||||
| 
 | ||||
| /* ########################### System Configuration ######################### */ | ||||
| /**
 | ||||
|   * @brief This is the HAL system configuration section | ||||
|   */ | ||||
| 
 | ||||
| #define VDD_VALUE 3300U /*!< Value of VDD in mv */ | ||||
| #define TICK_INT_PRIORITY 15U /*!< tick interrupt priority */ | ||||
| #define USE_RTOS 0U | ||||
| #define PREFETCH_ENABLE 1U | ||||
| #define INSTRUCTION_CACHE_ENABLE 1U | ||||
| #define DATA_CACHE_ENABLE 1U | ||||
| 
 | ||||
| /* ########################## Assert Selection ############################## */ | ||||
| /**
 | ||||
|   * @brief Uncomment the line below to expanse the "assert_param" macro in the | ||||
|   *        HAL drivers code | ||||
|   */ | ||||
| /* #define USE_FULL_ASSERT    1U */ | ||||
| 
 | ||||
| /* ################## SPI peripheral configuration ########################## */ | ||||
| 
 | ||||
| /* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
 | ||||
|  * Activated: CRC code is present inside driver | ||||
|  * Deactivated: CRC code cleaned from driver | ||||
|  */ | ||||
| 
 | ||||
| #define USE_SPI_CRC 0U | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| /**
 | ||||
|   * @brief Include module's header file | ||||
|   */ | ||||
| #ifdef HAL_DMA_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_dma.h" | ||||
| #endif /* HAL_DMA_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_ADC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_adc.h" | ||||
| #endif /* HAL_ADC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_COMP_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_comp.h" | ||||
| #endif /* HAL_COMP_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_CORTEX_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_cortex.h" | ||||
| #endif /* HAL_CORTEX_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_CRC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_crc.h" | ||||
| #endif /* HAL_CRC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_CRYP_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_cryp.h" | ||||
| #endif /* HAL_CRYP_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_EXTI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_exti.h" | ||||
| #endif /* HAL_EXTI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_FLASH_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_flash.h" | ||||
| #endif /* HAL_FLASH_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_GPIO_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_gpio.h" | ||||
| #endif /* HAL_GPIO_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_HSEM_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_hsem.h" | ||||
| #endif /* HAL_HSEM_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_I2C_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_i2c.h" | ||||
| #endif /* HAL_I2C_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_IPCC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_ipcc.h" | ||||
| #endif /* HAL_IPCC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_IRDA_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_irda.h" | ||||
| #endif /* HAL_IRDA_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_IWDG_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_iwdg.h" | ||||
| #endif /* HAL_IWDG_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_LCD_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_lcd.h" | ||||
| #endif /* HAL_LCD_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_LPTIM_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_lptim.h" | ||||
| #endif /* HAL_LPTIM_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_PCD_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_pcd.h" | ||||
| #endif /* HAL_PCD_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_PKA_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_pka.h" | ||||
| #endif /* HAL_PKA_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_PWR_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_pwr.h" | ||||
| #endif /* HAL_PWR_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_QSPI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_qspi.h" | ||||
| #endif /* HAL_QSPI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_RCC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_rcc.h" | ||||
| #endif /* HAL_RCC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_RNG_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_rng.h" | ||||
| #endif /* HAL_RNG_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_RTC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_rtc.h" | ||||
| #endif /* HAL_RTC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SAI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_sai.h" | ||||
| #endif /* HAL_SAI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SMARTCARD_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_smartcard.h" | ||||
| #endif /* HAL_SMARTCARD_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SMBUS_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_smbus.h" | ||||
| #endif /* HAL_SMBUS_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_SPI_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_spi.h" | ||||
| #endif /* HAL_SPI_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_TIM_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_tim.h" | ||||
| #endif /* HAL_TIM_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_TSC_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_tsc.h" | ||||
| #endif /* HAL_TSC_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_UART_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_uart.h" | ||||
| #endif /* HAL_UART_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_USART_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_usart.h" | ||||
| #endif /* HAL_USART_MODULE_ENABLED */ | ||||
| 
 | ||||
| #ifdef HAL_WWDG_MODULE_ENABLED | ||||
| #include "stm32wbxx_hal_wwdg.h" | ||||
| #endif /* HAL_WWDG_MODULE_ENABLED */ | ||||
| 
 | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| #ifdef USE_FULL_ASSERT | ||||
| /**
 | ||||
|   * @brief  The assert_param macro is used for function's parameters check. | ||||
|   * @param expr If expr is false, it calls assert_failed function | ||||
|   *         which reports the name of the source file and the source | ||||
|   *         line number of the call that failed. | ||||
|   *         If expr is true, it returns no value. | ||||
|   * @retval None | ||||
|   */ | ||||
| #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t*)__FILE__, __LINE__)) | ||||
| /* Exported functions ------------------------------------------------------- */ | ||||
| void assert_failed(uint8_t* file, uint32_t line); | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __STM32WBxx_HAL_CONF_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,77 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32wbxx_it.h | ||||
|   * @brief   This file contains the headers of the interrupt handlers. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|  ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32WBxx_IT_H | ||||
| #define __STM32WBxx_IT_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN ET */ | ||||
| 
 | ||||
| /* USER CODE END ET */ | ||||
| 
 | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN EC */ | ||||
| 
 | ||||
| /* USER CODE END EC */ | ||||
| 
 | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN EM */ | ||||
| 
 | ||||
| /* USER CODE END EM */ | ||||
| 
 | ||||
| /* Exported functions prototypes ---------------------------------------------*/ | ||||
| void NMI_Handler(void); | ||||
| void HardFault_Handler(void); | ||||
| void MemManage_Handler(void); | ||||
| void BusFault_Handler(void); | ||||
| void UsageFault_Handler(void); | ||||
| void DebugMon_Handler(void); | ||||
| void SysTick_Handler(void); | ||||
| void TAMP_STAMP_LSECSS_IRQHandler(void); | ||||
| void RCC_IRQHandler(void); | ||||
| void EXTI3_IRQHandler(void); | ||||
| void ADC1_IRQHandler(void); | ||||
| void USB_LP_IRQHandler(void); | ||||
| void COMP_IRQHandler(void); | ||||
| void TIM1_TRG_COM_TIM17_IRQHandler(void); | ||||
| void TIM2_IRQHandler(void); | ||||
| void EXTI15_10_IRQHandler(void); | ||||
| void HSEM_IRQHandler(void); | ||||
| /* USER CODE BEGIN EFP */ | ||||
| 
 | ||||
| /* USER CODE END EFP */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __STM32WBxx_IT_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,58 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    tim.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the tim.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __TIM_H__ | ||||
| #define __TIM_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern TIM_HandleTypeDef htim1; | ||||
| extern TIM_HandleTypeDef htim2; | ||||
| extern TIM_HandleTypeDef htim16; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_TIM1_Init(void); | ||||
| void MX_TIM2_Init(void); | ||||
| void MX_TIM16_Init(void); | ||||
| 
 | ||||
| void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __TIM_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,50 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    usart.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the usart.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USART_H__ | ||||
| #define __USART_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_USART1_UART_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USART_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,105 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file           : usb_device.h | ||||
|   * @version        : v3.0_Cube | ||||
|   * @brief          : Header for usb_device.c file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USB_DEVICE__H__ | ||||
| #define __USB_DEVICE__H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32wbxx.h" | ||||
| #include "stm32wbxx_hal.h" | ||||
| #include "usbd_def.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN INCLUDE */ | ||||
| 
 | ||||
| /* USER CODE END INCLUDE */ | ||||
| 
 | ||||
| /** @addtogroup USBD_OTG_DRIVER
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DEVICE USBD_DEVICE
 | ||||
|   * @brief Device file for Usb otg low level driver. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DEVICE_Exported_Variables USBD_DEVICE_Exported_Variables
 | ||||
|   * @brief Public variables. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PV */ | ||||
| 
 | ||||
| /* USER CODE END PV */ | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* USER CODE BEGIN PFP */ | ||||
| 
 | ||||
| /* USER CODE END PFP */ | ||||
| 
 | ||||
| /*
 | ||||
|  * -- Insert your variables declaration here -- | ||||
|  */ | ||||
| /* USER CODE BEGIN VARIABLES */ | ||||
| 
 | ||||
| /* USER CODE END VARIABLES */ | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DEVICE_Exported_FunctionsPrototype USBD_DEVICE_Exported_FunctionsPrototype
 | ||||
|   * @brief Declaration of public functions for Usb device. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** USB Device initialization function. */ | ||||
| void MX_USB_Device_Init(void); | ||||
| 
 | ||||
| /*
 | ||||
|  * -- Insert functions declaration here -- | ||||
|  */ | ||||
| /* USER CODE BEGIN FD */ | ||||
| 
 | ||||
| /* USER CODE END FD */ | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USB_DEVICE__H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,133 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file           : usbd_cdc_if.h | ||||
|   * @version        : v3.0_Cube | ||||
|   * @brief          : Header for usbd_cdc_if.c file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USBD_CDC_IF_H__ | ||||
| #define __USBD_CDC_IF_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "usbd_cdc.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN INCLUDE */ | ||||
| 
 | ||||
| /* USER CODE END INCLUDE */ | ||||
| 
 | ||||
| /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
 | ||||
|   * @brief For Usb device. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CDC_IF USBD_CDC_IF
 | ||||
|   * @brief Usb VCP device module | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines
 | ||||
|   * @brief Defines. | ||||
|   * @{ | ||||
|   */ | ||||
| /* Define size for the receive and transmit buffer over CDC */ | ||||
| #define APP_RX_DATA_SIZE 512 | ||||
| #define APP_TX_DATA_SIZE 512 | ||||
| /* USER CODE BEGIN EXPORTED_DEFINES */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_DEFINES */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types
 | ||||
|   * @brief Types. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_TYPES */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_TYPES */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros
 | ||||
|   * @brief Aliases. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_MACRO */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_MACRO */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
 | ||||
|   * @brief Public variables. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** CDC Interface callback. */ | ||||
| extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_VARIABLES */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_VARIABLES */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype
 | ||||
|   * @brief Public functions declaration. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_FUNCTIONS */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_FUNCTIONS */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USBD_CDC_IF_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,179 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file           : usbd_conf.h | ||||
|   * @version        : v3.0_Cube | ||||
|   * @brief          : Header for usbd_conf.c file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USBD_CONF__H__ | ||||
| #define __USBD_CONF__H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "stm32wbxx.h" | ||||
| #include "stm32wbxx_hal.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN INCLUDE */ | ||||
| 
 | ||||
| /* USER CODE END INCLUDE */ | ||||
| 
 | ||||
| /** @addtogroup USBD_OTG_DRIVER
 | ||||
|   * @brief Driver for Usb device. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CONF USBD_CONF
 | ||||
|   * @brief Configuration file for Usb otg low level driver. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CONF_Exported_Variables USBD_CONF_Exported_Variables
 | ||||
|   * @brief Public variables. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PV */ | ||||
| /* USER CODE END PV */ | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines
 | ||||
|   * @brief Defines for configuration of the Usb device. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /*---------- -----------*/ | ||||
| #define USBD_MAX_NUM_INTERFACES 1U | ||||
| /*---------- -----------*/ | ||||
| #define USBD_MAX_NUM_CONFIGURATION 1U | ||||
| /*---------- -----------*/ | ||||
| #define USBD_MAX_STR_DESC_SIZ 512U | ||||
| /*---------- -----------*/ | ||||
| #define USBD_DEBUG_LEVEL 0U | ||||
| /*---------- -----------*/ | ||||
| #define USBD_LPM_ENABLED 1U | ||||
| /*---------- -----------*/ | ||||
| #define USBD_SELF_POWERED 1U | ||||
| 
 | ||||
| /****************************************/ | ||||
| /* #define for FS and HS identification */ | ||||
| #define DEVICE_FS 0 | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CONF_Exported_Macros USBD_CONF_Exported_Macros
 | ||||
|   * @brief Aliases. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* Memory management macros */ | ||||
| 
 | ||||
| /** Alias for memory allocation. */ | ||||
| #define USBD_malloc (void*)USBD_static_malloc | ||||
| 
 | ||||
| /** Alias for memory release. */ | ||||
| #define USBD_free USBD_static_free | ||||
| 
 | ||||
| /** Alias for memory set. */ | ||||
| #define USBD_memset memset | ||||
| 
 | ||||
| /** Alias for memory copy. */ | ||||
| #define USBD_memcpy memcpy | ||||
| 
 | ||||
| /** Alias for delay. */ | ||||
| #define USBD_Delay HAL_Delay | ||||
| /* DEBUG macros */ | ||||
| 
 | ||||
| #if(USBD_DEBUG_LEVEL > 0) | ||||
| #define USBD_UsrLog(...) \ | ||||
|     printf(__VA_ARGS__); \ | ||||
|     printf("\n"); | ||||
| #else | ||||
| #define USBD_UsrLog(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(USBD_DEBUG_LEVEL > 1) | ||||
| 
 | ||||
| #define USBD_ErrLog(...) \ | ||||
|     printf("ERROR: ");   \ | ||||
|     printf(__VA_ARGS__); \ | ||||
|     printf("\n"); | ||||
| #else | ||||
| #define USBD_ErrLog(...) | ||||
| #endif | ||||
| 
 | ||||
| #if(USBD_DEBUG_LEVEL > 2) | ||||
| #define USBD_DbgLog(...) \ | ||||
|     printf("DEBUG : ");  \ | ||||
|     printf(__VA_ARGS__); \ | ||||
|     printf("\n"); | ||||
| #else | ||||
| #define USBD_DbgLog(...) | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CONF_Exported_Types USBD_CONF_Exported_Types
 | ||||
|   * @brief Types. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_CONF_Exported_FunctionsPrototype USBD_CONF_Exported_FunctionsPrototype
 | ||||
|   * @brief Declaration of public functions for Usb device. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* Exported functions -------------------------------------------------------*/ | ||||
| void* USBD_static_malloc(uint32_t size); | ||||
| void USBD_static_free(void* p); | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USBD_CONF__H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,145 +0,0 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file           : usbd_desc.c | ||||
|   * @version        : v3.0_Cube | ||||
|   * @brief          : Header for usbd_conf.c file. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USBD_DESC__C__ | ||||
| #define __USBD_DESC__C__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "usbd_def.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN INCLUDE */ | ||||
| 
 | ||||
| /* USER CODE END INCLUDE */ | ||||
| 
 | ||||
| /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
 | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DESC USBD_DESC
 | ||||
|   * @brief Usb device descriptors module. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants
 | ||||
|   * @brief Constants. | ||||
|   * @{ | ||||
|   */ | ||||
| #define DEVICE_ID1 (UID_BASE) | ||||
| #define DEVICE_ID2 (UID_BASE + 0x4) | ||||
| #define DEVICE_ID3 (UID_BASE + 0x8) | ||||
| 
 | ||||
| #define USB_SIZ_STRING_SERIAL 0x1A | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_CONSTANTS */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_CONSTANTS */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DESC_Exported_Defines USBD_DESC_Exported_Defines
 | ||||
|   * @brief Defines. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_DEFINES */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_DEFINES */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DESC_Exported_TypesDefinitions USBD_DESC_Exported_TypesDefinitions
 | ||||
|   * @brief Types. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_TYPES */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_TYPES */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DESC_Exported_Macros USBD_DESC_Exported_Macros
 | ||||
|   * @brief Aliases. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_MACRO */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_MACRO */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DESC_Exported_Variables USBD_DESC_Exported_Variables
 | ||||
|   * @brief Public variables. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| extern USBD_DescriptorsTypeDef CDC_Desc; | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_VARIABLES */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_VARIABLES */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /** @defgroup USBD_DESC_Exported_FunctionsPrototype USBD_DESC_Exported_FunctionsPrototype
 | ||||
|   * @brief Public functions declaration. | ||||
|   * @{ | ||||
|   */ | ||||
| 
 | ||||
| /* USER CODE BEGIN EXPORTED_FUNCTIONS */ | ||||
| 
 | ||||
| /* USER CODE END EXPORTED_FUNCTIONS */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USBD_DESC__C__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,253 +0,0 @@ | ||||
| ##########################################################################################################################
 | ||||
| # File automatically-generated by tool: [projectgenerator] version: [3.14.1] date: [Fri Sep 10 04:51:15 MSK 2021]
 | ||||
| ##########################################################################################################################
 | ||||
| 
 | ||||
| # ------------------------------------------------
 | ||||
| # Generic Makefile (based on gcc)
 | ||||
| #
 | ||||
| # ChangeLog :
 | ||||
| #	2017-02-10 - Several enhancements + project update mode
 | ||||
| #   2015-07-22 - first version
 | ||||
| # ------------------------------------------------
 | ||||
| 
 | ||||
| ######################################
 | ||||
| # target
 | ||||
| ######################################
 | ||||
| TARGET = f6 | ||||
| 
 | ||||
| 
 | ||||
| ######################################
 | ||||
| # building variables
 | ||||
| ######################################
 | ||||
| # debug build?
 | ||||
| DEBUG = 1 | ||||
| # optimization
 | ||||
| OPT = -Og | ||||
| 
 | ||||
| 
 | ||||
| #######################################
 | ||||
| # paths
 | ||||
| #######################################
 | ||||
| # Build path
 | ||||
| BUILD_DIR = build | ||||
| 
 | ||||
| ######################################
 | ||||
| # source
 | ||||
| ######################################
 | ||||
| # C sources
 | ||||
| C_SOURCES =  \
 | ||||
| Src/main.c \ | ||||
| Src/gpio.c \ | ||||
| Src/app_freertos.c \ | ||||
| Src/adc.c \ | ||||
| Src/aes.c \ | ||||
| Src/comp.c \ | ||||
| Src/crc.c \ | ||||
| Src/i2c.c \ | ||||
| Src/pka.c \ | ||||
| Src/rf.c \ | ||||
| Src/rng.c \ | ||||
| Src/rtc.c \ | ||||
| Src/spi.c \ | ||||
| Src/tim.c \ | ||||
| Src/usart.c \ | ||||
| Src/usb_device.c \ | ||||
| Src/usbd_conf.c \ | ||||
| Src/usbd_desc.c \ | ||||
| Src/usbd_cdc_if.c \ | ||||
| Src/stm32wbxx_it.c \ | ||||
| Src/stm32wbxx_hal_msp.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_utils.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_exti.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_adc.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cryp.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cryp_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_comp.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_crc.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_crc_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_i2c.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_gpio.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_dma.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pka.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rng.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usart.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_rcc.c \ | ||||
| Src/system_stm32wbxx.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/croutine.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/list.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/queue.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/tasks.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/timers.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c \ | ||||
| /Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c   | ||||
| 
 | ||||
| # ASM sources
 | ||||
| ASM_SOURCES =  \
 | ||||
| startup_stm32wb55xx_cm4.s | ||||
| 
 | ||||
| 
 | ||||
| #######################################
 | ||||
| # binaries
 | ||||
| #######################################
 | ||||
| PREFIX = arm-none-eabi- | ||||
| # The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
 | ||||
| # either it can be added to the PATH environment variable.
 | ||||
| ifdef GCC_PATH | ||||
| CC = $(GCC_PATH)/$(PREFIX)gcc | ||||
| AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp | ||||
| CP = $(GCC_PATH)/$(PREFIX)objcopy | ||||
| SZ = $(GCC_PATH)/$(PREFIX)size | ||||
| else | ||||
| CC = $(PREFIX)gcc | ||||
| AS = $(PREFIX)gcc -x assembler-with-cpp | ||||
| CP = $(PREFIX)objcopy | ||||
| SZ = $(PREFIX)size | ||||
| endif | ||||
| HEX = $(CP) -O ihex | ||||
| BIN = $(CP) -O binary -S | ||||
|   | ||||
| #######################################
 | ||||
| # CFLAGS
 | ||||
| #######################################
 | ||||
| # cpu
 | ||||
| CPU = -mcpu=cortex-m4 | ||||
| 
 | ||||
| # fpu
 | ||||
| FPU = -mfpu=fpv4-sp-d16 | ||||
| 
 | ||||
| # float-abi
 | ||||
| FLOAT-ABI = -mfloat-abi=hard | ||||
| 
 | ||||
| # mcu
 | ||||
| MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) | ||||
| 
 | ||||
| # macros for gcc
 | ||||
| # AS defines
 | ||||
| AS_DEFS =  | ||||
| 
 | ||||
| # C defines
 | ||||
| C_DEFS =  \
 | ||||
| -DUSE_FULL_LL_DRIVER \ | ||||
| -DUSE_HAL_DRIVER \ | ||||
| -DSTM32WB55xx | ||||
| 
 | ||||
| 
 | ||||
| # AS includes
 | ||||
| AS_INCLUDES =  \
 | ||||
| -IInc | ||||
| 
 | ||||
| # C includes
 | ||||
| C_INCLUDES =  \
 | ||||
| -IInc \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc/Legacy \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/include \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/ST/STM32_USB_Device_Library/Core/Inc \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/CMSIS/Device/ST/STM32WBxx/Include \ | ||||
| -I/Users/aku/Work/flipper/flipperzero-firmware/lib/STM32CubeWB/Drivers/CMSIS/Include | ||||
| 
 | ||||
| 
 | ||||
| # compile gcc flags
 | ||||
| ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections | ||||
| 
 | ||||
| CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections | ||||
| 
 | ||||
| ifeq ($(DEBUG), 1) | ||||
| CFLAGS += -g -gdwarf-2 | ||||
| endif | ||||
| 
 | ||||
| 
 | ||||
| # Generate dependency information
 | ||||
| CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" | ||||
| 
 | ||||
| 
 | ||||
| #######################################
 | ||||
| # LDFLAGS
 | ||||
| #######################################
 | ||||
| # link script
 | ||||
| LDSCRIPT = stm32wb55xx_flash_cm4.ld | ||||
| 
 | ||||
| # libraries
 | ||||
| LIBS = -lc -lm -lnosys  | ||||
| LIBDIR =  | ||||
| LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections | ||||
| 
 | ||||
| # default action: build all
 | ||||
| all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin | ||||
| 
 | ||||
| 
 | ||||
| #######################################
 | ||||
| # build the application
 | ||||
| #######################################
 | ||||
| # list of objects
 | ||||
| OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) | ||||
| vpath %.c $(sort $(dir $(C_SOURCES))) | ||||
| # list of ASM program objects
 | ||||
| OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) | ||||
| vpath %.s $(sort $(dir $(ASM_SOURCES))) | ||||
| 
 | ||||
| $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)  | ||||
| 	$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ | ||||
| 
 | ||||
| $(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) | ||||
| 	$(AS) -c $(CFLAGS) $< -o $@ | ||||
| 
 | ||||
| $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile | ||||
| 	$(CC) $(OBJECTS) $(LDFLAGS) -o $@ | ||||
| 	$(SZ) $@ | ||||
| 
 | ||||
| $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) | ||||
| 	$(HEX) $< $@ | ||||
| 	 | ||||
| $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) | ||||
| 	$(BIN) $< $@	 | ||||
| 	 | ||||
| $(BUILD_DIR): | ||||
| 	mkdir $@		 | ||||
| 
 | ||||
| #######################################
 | ||||
| # clean up
 | ||||
| #######################################
 | ||||
| clean: | ||||
| 	-rm -fR $(BUILD_DIR) | ||||
|    | ||||
| #######################################
 | ||||
| # dependencies
 | ||||
| #######################################
 | ||||
| -include $(wildcard $(BUILD_DIR)/*.d) | ||||
| 
 | ||||
| # *** EOF ***
 | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく