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 ] | - [ Describe how to verify changes ] | ||||||
| 
 | 
 | ||||||
| # Checklist (do not modify) | # Checklist (For Reviewer) | ||||||
| 
 | 
 | ||||||
| - [ ] PR has description of feature/bug or link to Confluence/Jira task | - [ ] PR has description of feature/bug or link to Confluence/Jira task | ||||||
| - [ ] Description contains actions to verify feature/bugfix | - [ ] 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: |   pull_request: | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   TARGETS: f6 f7 |   TARGETS: f7 | ||||||
|   DEFAULT_TARGET: f7 |   DEFAULT_TARGET: f7 | ||||||
| 
 | 
 | ||||||
| jobs: | jobs: | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								.github/workflows/lint_c.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/lint_c.yml
									
									
									
									
										vendored
									
									
								
							| @ -10,7 +10,7 @@ on: | |||||||
|   pull_request: |   pull_request: | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   TARGETS: f6 f7 |   TARGETS: f7 | ||||||
| 
 | 
 | ||||||
| jobs: | jobs: | ||||||
|   lint_c_cpp: |   lint_c_cpp: | ||||||
|  | |||||||
| @ -3,8 +3,6 @@ | |||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
| #include <maxim_crc.h> | #include <maxim_crc.h> | ||||||
| 
 | 
 | ||||||
| extern COMP_HandleTypeDef hcomp1; |  | ||||||
| 
 |  | ||||||
| KeyReader::Error KeyReader::read(iButtonKey* key) { | KeyReader::Error KeyReader::read(iButtonKey* key) { | ||||||
|     uint8_t tmp_key_data[8] = {0, 0, 0, 0, 0, 0, 0, 0}; |     uint8_t tmp_key_data[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||||
|     iButtonKeyType key_type; |     iButtonKeyType key_type; | ||||||
| @ -116,9 +114,9 @@ void KeyReader::start_comaparator(void) { | |||||||
| 
 | 
 | ||||||
|     comparator_callback_pointer = |     comparator_callback_pointer = | ||||||
|         cbc::obtain_connector(this, &KeyReader::comparator_trigger_callback); |         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; |     last_dwt_value = DWT->CYCCNT; | ||||||
|     HAL_COMP_Start(&hcomp1); |     furi_hal_rfid_comp_start(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void KeyReader::stop_comaparator(void) { | void KeyReader::stop_comaparator(void) { | ||||||
| @ -127,23 +125,19 @@ void KeyReader::stop_comaparator(void) { | |||||||
|     // rfid_pins_reset will disable ibutton pin
 |     // rfid_pins_reset will disable ibutton pin
 | ||||||
|     furi_hal_ibutton_start(); |     furi_hal_ibutton_start(); | ||||||
| 
 | 
 | ||||||
|     HAL_COMP_Stop(&hcomp1); |     furi_hal_rfid_comp_stop(); | ||||||
|     api_interrupt_remove(comparator_callback_pointer, InterruptTypeComparatorTrigger); |     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); |     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( |     _this->cyfral_decoder.process_front(level, current_dwt_value - last_dwt_value); | ||||||
|             hal_gpio_get_rfid_in_level(), current_dwt_value - last_dwt_value); |     _this->metakom_decoder.process_front(level, current_dwt_value - last_dwt_value); | ||||||
|         _this->metakom_decoder.process_front( |  | ||||||
|             hal_gpio_get_rfid_in_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) { | 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); |     bool verify_key(iButtonKeyType key_type, const uint8_t* const data, uint8_t data_size); | ||||||
| 
 | 
 | ||||||
|     // cyfral and metakom readers data
 |     // cyfral and metakom readers data
 | ||||||
|     void comparator_trigger_callback(void* hcomp, void* comp_ctx); |     void comparator_trigger_callback(bool level, void* comp_ctx); | ||||||
|     void (*comparator_callback_pointer)(void* hcomp, void* comp_ctx); |     void (*comparator_callback_pointer)(bool level, void* comp_ctx); | ||||||
| 
 | 
 | ||||||
|     void start_comaparator(void); |     void start_comaparator(void); | ||||||
|     void stop_comaparator(void); |     void stop_comaparator(void); | ||||||
|  | |||||||
| @ -2,8 +2,6 @@ | |||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
| #include <maxim_crc.h> | #include <maxim_crc.h> | ||||||
| 
 | 
 | ||||||
| extern COMP_HandleTypeDef hcomp1; |  | ||||||
| 
 |  | ||||||
| KeyReader::Error KeyWorker::read(iButtonKey* key) { | KeyReader::Error KeyWorker::read(iButtonKey* key) { | ||||||
|     KeyReader::Error result = key_reader.read(key); |     KeyReader::Error result = key_reader.read(key); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,8 +4,6 @@ | |||||||
| #include <stm32wbxx_ll_cortex.h> | #include <stm32wbxx_ll_cortex.h> | ||||||
| #include <tim.h> | #include <tim.h> | ||||||
| 
 | 
 | ||||||
| extern COMP_HandleTypeDef hcomp1; |  | ||||||
| 
 |  | ||||||
| /**
 | /**
 | ||||||
|  * @brief private violation assistant for RfidReader |  * @brief private violation assistant for RfidReader | ||||||
|  */ |  */ | ||||||
| @ -63,14 +61,10 @@ void RfidReader::switch_mode() { | |||||||
|     switch_timer_reset(); |     switch_timer_reset(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void comparator_trigger_callback(void* hcomp, void* comp_ctx) { | static void comparator_trigger_callback(bool level, void* comp_ctx) { | ||||||
|     COMP_HandleTypeDef* _hcomp = static_cast<COMP_HandleTypeDef*>(hcomp); |  | ||||||
|     RfidReader* _this = static_cast<RfidReader*>(comp_ctx); |     RfidReader* _this = static_cast<RfidReader*>(comp_ctx); | ||||||
| 
 | 
 | ||||||
|     if(hcomp == &hcomp1) { |     RfidReaderAccessor::decode(*_this, !level); | ||||||
|         RfidReaderAccessor::decode( |  | ||||||
|             *_this, (HAL_COMP_GetOutputLevel(_hcomp) == COMP_OUTPUT_LEVEL_HIGH)); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RfidReader::RfidReader() { | RfidReader::RfidReader() { | ||||||
| @ -163,25 +157,13 @@ bool RfidReader::any_read() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RfidReader::start_comparator(void) { | 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; |     last_dwt_value = DWT->CYCCNT; | ||||||
| 
 | 
 | ||||||
|     hcomp1.Init.InputMinus = COMP_INPUT_MINUS_1_2VREFINT; |     furi_hal_rfid_comp_start(); | ||||||
|     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); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RfidReader::stop_comparator(void) { | void RfidReader::stop_comparator(void) { | ||||||
|     HAL_COMP_Stop(&hcomp1); |     furi_hal_rfid_comp_stop(); | ||||||
|     api_interrupt_remove(comparator_trigger_callback, InterruptTypeComparatorTrigger); |     furi_hal_rfid_comp_set_callback(NULL, NULL); | ||||||
| } | } | ||||||
| @ -4,8 +4,6 @@ | |||||||
| #include "protocols/protocol_hid_h10301.h" | #include "protocols/protocol_hid_h10301.h" | ||||||
| #include "protocols/protocol_indala_40134.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) |  * @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 "lfrfid_debug_app_scene_tune.h" | ||||||
| #include <furi_hal.h> | #include <furi_hal.h> | ||||||
| 
 | 
 | ||||||
| extern COMP_HandleTypeDef hcomp1; | static void comparator_trigger_callback(bool level, void* comp_ctx) { | ||||||
| 
 |     hal_gpio_write(&gpio_ext_pa7, !level); | ||||||
| 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); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void LfRfidDebugAppSceneTune::on_enter(LfRfidDebugApp* app, bool need_restore) { | void LfRfidDebugAppSceneTune::on_enter(LfRfidDebugApp* app, bool need_restore) { | ||||||
|     app->view_controller.switch_to<LfRfidViewTuneVM>(); |     app->view_controller.switch_to<LfRfidViewTuneVM>(); | ||||||
|     hal_gpio_init_simple(&gpio_ext_pa7, GpioModeOutputPushPull); |     hal_gpio_init_simple(&gpio_ext_pa7, GpioModeOutputPushPull); | ||||||
| 
 | 
 | ||||||
|     api_interrupt_add(comparator_trigger_callback, InterruptTypeComparatorTrigger, this); |     furi_hal_rfid_comp_set_callback(comparator_trigger_callback, this); | ||||||
| 
 |     furi_hal_rfid_comp_start(); | ||||||
|     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_pins_read(); |     furi_hal_rfid_pins_read(); | ||||||
|     furi_hal_rfid_tim_read(125000, 0.5); |     furi_hal_rfid_tim_read(125000, 0.5); | ||||||
| @ -50,8 +31,8 @@ bool LfRfidDebugAppSceneTune::on_event(LfRfidDebugApp* app, LfRfidDebugApp::Even | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void LfRfidDebugAppSceneTune::on_exit(LfRfidDebugApp* app) { | void LfRfidDebugAppSceneTune::on_exit(LfRfidDebugApp* app) { | ||||||
|     HAL_COMP_Stop(&hcomp1); |     furi_hal_rfid_comp_stop(); | ||||||
|     api_interrupt_remove(comparator_trigger_callback, InterruptTypeComparatorTrigger); |     furi_hal_rfid_comp_set_callback(NULL, NULL); | ||||||
| 
 | 
 | ||||||
|     hal_gpio_init_simple(&gpio_ext_pa7, GpioModeAnalog); |     hal_gpio_init_simple(&gpio_ext_pa7, GpioModeAnalog); | ||||||
|     furi_hal_rfid_tim_read_stop(); |     furi_hal_rfid_tim_read_stop(); | ||||||
|  | |||||||
| @ -102,7 +102,7 @@ typedef struct { | |||||||
|     uint8_t volume_id_max; |     uint8_t volume_id_max; | ||||||
| } State; | } 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) { | bool is_white_note(const MelodyEventRecord* note_record, uint8_t id) { | ||||||
|     if(note_record == NULL) return false; |     if(note_record == NULL) return false; | ||||||
| @ -332,10 +332,10 @@ void process_note( | |||||||
|     // play note
 |     // play note
 | ||||||
|     float note_delay = bar_length_ms / (float)note_record->length; |     float note_delay = bar_length_ms / (float)note_record->length; | ||||||
|     if(note_record->note != N) { |     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); |     delay(note_delay); | ||||||
|     hal_pwm_stop(&SPEAKER_TIM, SPEAKER_CH); |     furi_hal_speaker_stop(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void music_player_thread(void* p) { | void music_player_thread(void* p) { | ||||||
| @ -447,7 +447,7 @@ int32_t music_player_app(void* p) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     osThreadTerminate(player); |     osThreadTerminate(player); | ||||||
|     hal_pwm_stop(&SPEAKER_TIM, SPEAKER_CH); |     furi_hal_speaker_stop(); | ||||||
|     view_port_enabled_set(view_port, false); |     view_port_enabled_set(view_port, false); | ||||||
|     gui_remove_view_port(gui, view_port); |     gui_remove_view_port(gui, view_port); | ||||||
|     furi_record_close("gui"); |     furi_record_close("gui"); | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ extern "C" { | |||||||
| typedef struct NotificationApp NotificationApp; | typedef struct NotificationApp NotificationApp; | ||||||
| typedef struct { | typedef struct { | ||||||
|     float frequency; |     float frequency; | ||||||
|     float pwm; |     float volume; | ||||||
| } NotificationMessageDataSound; | } NotificationMessageDataSound; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  | |||||||
| @ -139,12 +139,12 @@ void notification_vibro_off() { | |||||||
|     furi_hal_vibro_on(false); |     furi_hal_vibro_on(false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void notification_sound_on(float pwm, float freq) { | void notification_sound_on(float freq, float volume) { | ||||||
|     hal_pwm_set(pwm, freq, &SPEAKER_TIM, SPEAKER_CH); |     furi_hal_speaker_start(freq, volume); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void notification_sound_off() { | void notification_sound_off() { | ||||||
|     hal_pwm_stop(&SPEAKER_TIM, SPEAKER_CH); |     furi_hal_speaker_stop(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // display timer
 | // display timer
 | ||||||
| @ -236,8 +236,8 @@ void notification_process_notification_message( | |||||||
|             break; |             break; | ||||||
|         case NotificationMessageTypeSoundOn: |         case NotificationMessageTypeSoundOn: | ||||||
|             notification_sound_on( |             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; |             reset_mask |= reset_sound_mask; | ||||||
|             break; |             break; | ||||||
|         case NotificationMessageTypeSoundOff: |         case NotificationMessageTypeSoundOff: | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ for octave in range(9): | |||||||
|         print(f"const NotificationMessage message_note_{name}{octave}" + " = {\n" |         print(f"const NotificationMessage message_note_{name}{octave}" + " = {\n" | ||||||
|               "\t.type = NotificationMessageTypeSoundOn,\n" |               "\t.type = NotificationMessageTypeSoundOn,\n" | ||||||
|               f"\t.data.sound.frequency = {round(note, 2)}f,\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 |         note = note * cf | ||||||
| 
 | 
 | ||||||
| @ -29,545 +29,545 @@ for octave in range(9): | |||||||
| const NotificationMessage message_click = { | const NotificationMessage message_click = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1.0f, |     .data.sound.frequency = 1.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c0 = { | const NotificationMessage message_note_c0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 16.35f, |     .data.sound.frequency = 16.35f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs0 = { | const NotificationMessage message_note_cs0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 17.32f, |     .data.sound.frequency = 17.32f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d0 = { | const NotificationMessage message_note_d0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 18.35f, |     .data.sound.frequency = 18.35f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds0 = { | const NotificationMessage message_note_ds0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 19.45f, |     .data.sound.frequency = 19.45f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e0 = { | const NotificationMessage message_note_e0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 20.6f, |     .data.sound.frequency = 20.6f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f0 = { | const NotificationMessage message_note_f0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 21.83f, |     .data.sound.frequency = 21.83f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs0 = { | const NotificationMessage message_note_fs0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 23.12f, |     .data.sound.frequency = 23.12f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g0 = { | const NotificationMessage message_note_g0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 24.5f, |     .data.sound.frequency = 24.5f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs0 = { | const NotificationMessage message_note_gs0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 25.96f, |     .data.sound.frequency = 25.96f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a0 = { | const NotificationMessage message_note_a0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 27.5f, |     .data.sound.frequency = 27.5f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as0 = { | const NotificationMessage message_note_as0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 29.14f, |     .data.sound.frequency = 29.14f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b0 = { | const NotificationMessage message_note_b0 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 30.87f, |     .data.sound.frequency = 30.87f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c1 = { | const NotificationMessage message_note_c1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 32.7f, |     .data.sound.frequency = 32.7f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs1 = { | const NotificationMessage message_note_cs1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 34.65f, |     .data.sound.frequency = 34.65f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d1 = { | const NotificationMessage message_note_d1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 36.71f, |     .data.sound.frequency = 36.71f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds1 = { | const NotificationMessage message_note_ds1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 38.89f, |     .data.sound.frequency = 38.89f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e1 = { | const NotificationMessage message_note_e1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 41.2f, |     .data.sound.frequency = 41.2f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f1 = { | const NotificationMessage message_note_f1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 43.65f, |     .data.sound.frequency = 43.65f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs1 = { | const NotificationMessage message_note_fs1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 46.25f, |     .data.sound.frequency = 46.25f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g1 = { | const NotificationMessage message_note_g1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 49.0f, |     .data.sound.frequency = 49.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs1 = { | const NotificationMessage message_note_gs1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 51.91f, |     .data.sound.frequency = 51.91f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a1 = { | const NotificationMessage message_note_a1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 55.0f, |     .data.sound.frequency = 55.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as1 = { | const NotificationMessage message_note_as1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 58.27f, |     .data.sound.frequency = 58.27f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b1 = { | const NotificationMessage message_note_b1 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 61.74f, |     .data.sound.frequency = 61.74f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c2 = { | const NotificationMessage message_note_c2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 65.41f, |     .data.sound.frequency = 65.41f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs2 = { | const NotificationMessage message_note_cs2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 69.3f, |     .data.sound.frequency = 69.3f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d2 = { | const NotificationMessage message_note_d2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 73.42f, |     .data.sound.frequency = 73.42f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds2 = { | const NotificationMessage message_note_ds2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 77.78f, |     .data.sound.frequency = 77.78f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e2 = { | const NotificationMessage message_note_e2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 82.41f, |     .data.sound.frequency = 82.41f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f2 = { | const NotificationMessage message_note_f2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 87.31f, |     .data.sound.frequency = 87.31f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs2 = { | const NotificationMessage message_note_fs2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 92.5f, |     .data.sound.frequency = 92.5f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g2 = { | const NotificationMessage message_note_g2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 98.0f, |     .data.sound.frequency = 98.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs2 = { | const NotificationMessage message_note_gs2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 103.83f, |     .data.sound.frequency = 103.83f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a2 = { | const NotificationMessage message_note_a2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 110.0f, |     .data.sound.frequency = 110.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as2 = { | const NotificationMessage message_note_as2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 116.54f, |     .data.sound.frequency = 116.54f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b2 = { | const NotificationMessage message_note_b2 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 123.47f, |     .data.sound.frequency = 123.47f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c3 = { | const NotificationMessage message_note_c3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 130.81f, |     .data.sound.frequency = 130.81f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs3 = { | const NotificationMessage message_note_cs3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 138.59f, |     .data.sound.frequency = 138.59f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d3 = { | const NotificationMessage message_note_d3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 146.83f, |     .data.sound.frequency = 146.83f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds3 = { | const NotificationMessage message_note_ds3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 155.56f, |     .data.sound.frequency = 155.56f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e3 = { | const NotificationMessage message_note_e3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 164.81f, |     .data.sound.frequency = 164.81f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f3 = { | const NotificationMessage message_note_f3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 174.61f, |     .data.sound.frequency = 174.61f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs3 = { | const NotificationMessage message_note_fs3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 185.0f, |     .data.sound.frequency = 185.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g3 = { | const NotificationMessage message_note_g3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 196.0f, |     .data.sound.frequency = 196.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs3 = { | const NotificationMessage message_note_gs3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 207.65f, |     .data.sound.frequency = 207.65f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a3 = { | const NotificationMessage message_note_a3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 220.0f, |     .data.sound.frequency = 220.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as3 = { | const NotificationMessage message_note_as3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 233.08f, |     .data.sound.frequency = 233.08f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b3 = { | const NotificationMessage message_note_b3 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 246.94f, |     .data.sound.frequency = 246.94f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c4 = { | const NotificationMessage message_note_c4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 261.63f, |     .data.sound.frequency = 261.63f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs4 = { | const NotificationMessage message_note_cs4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 277.18f, |     .data.sound.frequency = 277.18f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d4 = { | const NotificationMessage message_note_d4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 293.66f, |     .data.sound.frequency = 293.66f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds4 = { | const NotificationMessage message_note_ds4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 311.13f, |     .data.sound.frequency = 311.13f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e4 = { | const NotificationMessage message_note_e4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 329.63f, |     .data.sound.frequency = 329.63f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f4 = { | const NotificationMessage message_note_f4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 349.23f, |     .data.sound.frequency = 349.23f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs4 = { | const NotificationMessage message_note_fs4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 369.99f, |     .data.sound.frequency = 369.99f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g4 = { | const NotificationMessage message_note_g4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 392.0f, |     .data.sound.frequency = 392.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs4 = { | const NotificationMessage message_note_gs4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 415.3f, |     .data.sound.frequency = 415.3f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a4 = { | const NotificationMessage message_note_a4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 440.0f, |     .data.sound.frequency = 440.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as4 = { | const NotificationMessage message_note_as4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 466.16f, |     .data.sound.frequency = 466.16f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b4 = { | const NotificationMessage message_note_b4 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 493.88f, |     .data.sound.frequency = 493.88f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c5 = { | const NotificationMessage message_note_c5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 523.25f, |     .data.sound.frequency = 523.25f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs5 = { | const NotificationMessage message_note_cs5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 554.37f, |     .data.sound.frequency = 554.37f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d5 = { | const NotificationMessage message_note_d5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 587.33f, |     .data.sound.frequency = 587.33f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds5 = { | const NotificationMessage message_note_ds5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 622.25f, |     .data.sound.frequency = 622.25f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e5 = { | const NotificationMessage message_note_e5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 659.26f, |     .data.sound.frequency = 659.26f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f5 = { | const NotificationMessage message_note_f5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 698.46f, |     .data.sound.frequency = 698.46f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs5 = { | const NotificationMessage message_note_fs5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 739.99f, |     .data.sound.frequency = 739.99f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g5 = { | const NotificationMessage message_note_g5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 783.99f, |     .data.sound.frequency = 783.99f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs5 = { | const NotificationMessage message_note_gs5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 830.61f, |     .data.sound.frequency = 830.61f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a5 = { | const NotificationMessage message_note_a5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 880.0f, |     .data.sound.frequency = 880.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as5 = { | const NotificationMessage message_note_as5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 932.33f, |     .data.sound.frequency = 932.33f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b5 = { | const NotificationMessage message_note_b5 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 987.77f, |     .data.sound.frequency = 987.77f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c6 = { | const NotificationMessage message_note_c6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1046.5f, |     .data.sound.frequency = 1046.5f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs6 = { | const NotificationMessage message_note_cs6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1108.73f, |     .data.sound.frequency = 1108.73f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d6 = { | const NotificationMessage message_note_d6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1174.66f, |     .data.sound.frequency = 1174.66f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds6 = { | const NotificationMessage message_note_ds6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1244.51f, |     .data.sound.frequency = 1244.51f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e6 = { | const NotificationMessage message_note_e6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1318.51f, |     .data.sound.frequency = 1318.51f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f6 = { | const NotificationMessage message_note_f6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1396.91f, |     .data.sound.frequency = 1396.91f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs6 = { | const NotificationMessage message_note_fs6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1479.98f, |     .data.sound.frequency = 1479.98f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g6 = { | const NotificationMessage message_note_g6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1567.98f, |     .data.sound.frequency = 1567.98f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs6 = { | const NotificationMessage message_note_gs6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1661.22f, |     .data.sound.frequency = 1661.22f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a6 = { | const NotificationMessage message_note_a6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1760.0f, |     .data.sound.frequency = 1760.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as6 = { | const NotificationMessage message_note_as6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1864.66f, |     .data.sound.frequency = 1864.66f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b6 = { | const NotificationMessage message_note_b6 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 1975.53f, |     .data.sound.frequency = 1975.53f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c7 = { | const NotificationMessage message_note_c7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 2093.0f, |     .data.sound.frequency = 2093.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs7 = { | const NotificationMessage message_note_cs7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 2217.46f, |     .data.sound.frequency = 2217.46f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d7 = { | const NotificationMessage message_note_d7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 2349.32f, |     .data.sound.frequency = 2349.32f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds7 = { | const NotificationMessage message_note_ds7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 2489.02f, |     .data.sound.frequency = 2489.02f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e7 = { | const NotificationMessage message_note_e7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 2637.02f, |     .data.sound.frequency = 2637.02f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f7 = { | const NotificationMessage message_note_f7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 2793.83f, |     .data.sound.frequency = 2793.83f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs7 = { | const NotificationMessage message_note_fs7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 2959.96f, |     .data.sound.frequency = 2959.96f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g7 = { | const NotificationMessage message_note_g7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 3135.96f, |     .data.sound.frequency = 3135.96f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs7 = { | const NotificationMessage message_note_gs7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 3322.44f, |     .data.sound.frequency = 3322.44f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a7 = { | const NotificationMessage message_note_a7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 3520.0f, |     .data.sound.frequency = 3520.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as7 = { | const NotificationMessage message_note_as7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 3729.31f, |     .data.sound.frequency = 3729.31f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b7 = { | const NotificationMessage message_note_b7 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 3951.07f, |     .data.sound.frequency = 3951.07f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_c8 = { | const NotificationMessage message_note_c8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 4186.01f, |     .data.sound.frequency = 4186.01f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_cs8 = { | const NotificationMessage message_note_cs8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 4434.92f, |     .data.sound.frequency = 4434.92f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_d8 = { | const NotificationMessage message_note_d8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 4698.64f, |     .data.sound.frequency = 4698.64f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_ds8 = { | const NotificationMessage message_note_ds8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 4978.03f, |     .data.sound.frequency = 4978.03f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_e8 = { | const NotificationMessage message_note_e8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 5274.04f, |     .data.sound.frequency = 5274.04f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_f8 = { | const NotificationMessage message_note_f8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 5587.65f, |     .data.sound.frequency = 5587.65f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_fs8 = { | const NotificationMessage message_note_fs8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 5919.91f, |     .data.sound.frequency = 5919.91f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_g8 = { | const NotificationMessage message_note_g8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 6271.93f, |     .data.sound.frequency = 6271.93f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_gs8 = { | const NotificationMessage message_note_gs8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 6644.88f, |     .data.sound.frequency = 6644.88f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_a8 = { | const NotificationMessage message_note_a8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 7040.0f, |     .data.sound.frequency = 7040.0f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_as8 = { | const NotificationMessage message_note_as8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 7458.62f, |     .data.sound.frequency = 7458.62f, | ||||||
|     .data.sound.pwm = 0.5f, |     .data.sound.volume = 1.0f, | ||||||
| }; | }; | ||||||
| const NotificationMessage message_note_b8 = { | const NotificationMessage message_note_b8 = { | ||||||
|     .type = NotificationMessageTypeSoundOn, |     .type = NotificationMessageTypeSoundOn, | ||||||
|     .data.sound.frequency = 7902.13f, |     .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%", |     "75%", | ||||||
|     "100%", |     "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 | #define DELAY_COUNT 6 | ||||||
| const char* const delay_text[DELAY_COUNT] = { | 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 */ | /** Interupt type */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     InterruptTypeComparatorTrigger, |  | ||||||
|     InterruptTypeTimerUpdate, |     InterruptTypeTimerUpdate, | ||||||
|     InterruptTypeLast, |     InterruptTypeLast, | ||||||
| } InterruptType; | } 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
	 あく
						あく