From eb2679b982b69b10b783cb9fd21ad6eb23a1aa6a Mon Sep 17 00:00:00 2001 From: coreglitch Date: Fri, 6 Nov 2020 14:31:59 +0600 Subject: [PATCH] Refactor F2/local before F3 merge (#220) * add files from f3 * rollback lfs * Move assets from LFS * remove lfs from build Co-authored-by: Aleksandr Kutuzov --- .gitattributes | 6 +- .github/workflows/ci.yml | 1 - applications/applications.h | 6 +- .../backlight-control/backlight-control.c | 15 +- applications/cc1101-workaround/cc1101.cpp | 27 +- .../coreglitch_demo_0/coreglitch_demo_0.c | 5 +- applications/display-u8g2/display-u8g2.c | 5 +- applications/examples/blink.c | 2 +- applications/examples/fatfs_list.c | 39 +- applications/examples/input_dump.c | 2 + applications/gui/u8g2_periphery.c | 5 +- applications/input/input.c | 12 +- applications/irda/irda.c | 9 +- applications/irda/irda_nec.c | 8 +- applications/irda/irda_protocols.h | 2 +- applications/irda/irda_samsung.c | 8 +- applications/lf-rfid/lf-rfid.c | 8 +- .../icons/IrukaGotchi/Flipper_idle_76x52.png | Bin 128 -> 652 bytes .../icons/IrukaGotchi/Flipper_young_80x60.png | Bin 129 -> 2653 bytes assets/icons/MainMenu/125khz_14/frame_01.png | Bin 128 -> 257 bytes assets/icons/MainMenu/125khz_14/frame_02.png | Bin 128 -> 257 bytes assets/icons/MainMenu/125khz_14/frame_03.png | Bin 128 -> 249 bytes assets/icons/MainMenu/125khz_14/frame_04.png | Bin 128 -> 255 bytes .../icons/MainMenu/Bluetooth_14/frame_01.png | Bin 128 -> 252 bytes .../icons/MainMenu/Bluetooth_14/frame_02.png | Bin 128 -> 251 bytes .../icons/MainMenu/Bluetooth_14/frame_03.png | Bin 128 -> 251 bytes .../icons/MainMenu/Bluetooth_14/frame_04.png | Bin 128 -> 248 bytes .../icons/MainMenu/Bluetooth_14/frame_05.png | Bin 128 -> 249 bytes .../icons/MainMenu/Bluetooth_14/frame_06.png | Bin 128 -> 251 bytes .../MainMenu/FileManager_14/frame_01.png | Bin 128 -> 254 bytes .../MainMenu/FileManager_14/frame_02.png | Bin 128 -> 255 bytes .../MainMenu/FileManager_14/frame_03.png | Bin 128 -> 249 bytes .../MainMenu/FileManager_14/frame_04.png | Bin 128 -> 249 bytes .../MainMenu/FileManager_14/frame_05.png | Bin 128 -> 249 bytes .../MainMenu/FileManager_14/frame_06.png | Bin 128 -> 237 bytes .../MainMenu/FileManager_14/frame_07.png | Bin 128 -> 249 bytes .../MainMenu/FileManager_14/frame_08.png | Bin 128 -> 249 bytes .../MainMenu/FileManager_14/frame_09.png | Bin 128 -> 249 bytes .../MainMenu/FileManager_14/frame_10.png | Bin 128 -> 255 bytes assets/icons/MainMenu/GPIO_14/frame_01.png | Bin 128 -> 242 bytes assets/icons/MainMenu/GPIO_14/frame_02.png | Bin 128 -> 237 bytes assets/icons/MainMenu/GPIO_14/frame_03.png | Bin 128 -> 236 bytes assets/icons/MainMenu/GPIO_14/frame_04.png | Bin 128 -> 235 bytes assets/icons/MainMenu/GPIO_14/frame_05.png | Bin 128 -> 231 bytes assets/icons/MainMenu/GPIO_14/frame_06.png | Bin 128 -> 235 bytes assets/icons/MainMenu/GPIO_14/frame_07.png | Bin 128 -> 235 bytes assets/icons/MainMenu/GPIO_14/frame_08.png | Bin 128 -> 237 bytes .../icons/MainMenu/Infrared_14/frame_01.png | Bin 128 -> 250 bytes .../icons/MainMenu/Infrared_14/frame_02.png | Bin 128 -> 247 bytes .../icons/MainMenu/Infrared_14/frame_03.png | Bin 128 -> 243 bytes .../icons/MainMenu/Infrared_14/frame_04.png | Bin 128 -> 235 bytes .../icons/MainMenu/Infrared_14/frame_05.png | Bin 128 -> 235 bytes .../icons/MainMenu/Infrared_14/frame_06.png | Bin 128 -> 243 bytes assets/icons/MainMenu/NFC_14/frame_01.png | Bin 128 -> 256 bytes assets/icons/MainMenu/NFC_14/frame_02.png | Bin 128 -> 250 bytes assets/icons/MainMenu/NFC_14/frame_03.png | Bin 128 -> 244 bytes assets/icons/MainMenu/NFC_14/frame_04.png | Bin 128 -> 247 bytes assets/icons/MainMenu/Sub1ghz_14/frame_01.png | Bin 128 -> 249 bytes assets/icons/MainMenu/Sub1ghz_14/frame_02.png | Bin 128 -> 248 bytes assets/icons/MainMenu/Sub1ghz_14/frame_03.png | Bin 128 -> 242 bytes assets/icons/MainMenu/Sub1ghz_14/frame_04.png | Bin 128 -> 228 bytes assets/icons/MainMenu/Sub1ghz_14/frame_05.png | Bin 128 -> 231 bytes assets/icons/MainMenu/Sub1ghz_14/frame_06.png | Bin 128 -> 242 bytes .../icons/MainMenu/Tamagotchi_14/frame_01.png | Bin 128 -> 258 bytes .../icons/MainMenu/Tamagotchi_14/frame_02.png | Bin 128 -> 258 bytes .../icons/MainMenu/Tamagotchi_14/frame_03.png | Bin 128 -> 258 bytes .../icons/MainMenu/Tamagotchi_14/frame_04.png | Bin 128 -> 258 bytes .../icons/MainMenu/Tamagotchi_14/frame_05.png | Bin 128 -> 258 bytes .../icons/MainMenu/Tamagotchi_14/frame_06.png | Bin 128 -> 258 bytes assets/icons/MainMenu/U2F_14/frame_01.png | Bin 128 -> 256 bytes assets/icons/MainMenu/U2F_14/frame_02.png | Bin 128 -> 255 bytes assets/icons/MainMenu/U2F_14/frame_03.png | Bin 128 -> 254 bytes assets/icons/MainMenu/U2F_14/frame_04.png | Bin 128 -> 255 bytes assets/icons/MainMenu/iButton_14/frame_01.png | Bin 128 -> 256 bytes assets/icons/MainMenu/iButton_14/frame_02.png | Bin 128 -> 260 bytes assets/icons/MainMenu/iButton_14/frame_03.png | Bin 128 -> 256 bytes assets/icons/MainMenu/iButton_14/frame_04.png | Bin 128 -> 260 bytes assets/icons/MainMenu/iButton_14/frame_05.png | Bin 128 -> 252 bytes assets/icons/MainMenu/iButton_14/frame_06.png | Bin 128 -> 255 bytes assets/icons/MainMenu/iButton_14/frame_07.png | Bin 128 -> 262 bytes assets/icons/StatusBar/BadUsb_9x8.png | Bin 128 -> 235 bytes assets/icons/StatusBar/Battery_19x8.png | Bin 128 -> 233 bytes assets/icons/StatusBar/Bluetooth_5x8.png | Bin 128 -> 231 bytes assets/icons/StatusBar/SDcardFail_11x8.png | Bin 128 -> 233 bytes assets/icons/StatusBar/SDcardMounted_11x8.png | Bin 128 -> 226 bytes assets/icons/StatusBar/USBConnected_15x8.png | Bin 128 -> 237 bytes core/flipper_v2.h | 1 + firmware/targets/f2/Inc/main.h | 302 +++--- firmware/targets/f2/Inc/spi.h | 5 +- firmware/targets/f2/Src/fatfs/spi_sd_hal.c | 43 - .../targets/f2/Src/fatfs/stm32_adafruit_sd.c | 5 +- firmware/targets/f2/Src/main.c | 1 - firmware/targets/f2/Src/spi.c | 95 ++ firmware/targets/f2/api-hal/api-hal-pwm.c | 8 + firmware/targets/f2/api-hal/api-hal-pwm.h | 3 + .../api-hal-resources.c} | 17 +- .../targets/f2/api-hal/api-hal-resources.h | 12 + firmware/targets/f2/cube.ioc | 956 +++++++++--------- firmware/targets/f2/target.mk | 2 + .../targets/local/api-hal/api-hal-resources.h | 0 lib/ST25RFAL002/doc/_htmresc/st_logo.png | Bin 130 -> 18616 bytes lib/ST25RFAL002/platform.c | 30 +- lib/ST25RFAL002/platform.h | 6 +- make/base.mk | 7 +- make/rules.mk | 22 +- make/toolchain.mk | 6 +- 106 files changed, 879 insertions(+), 802 deletions(-) rename firmware/targets/f2/{Inc/input_priv.h => api-hal/api-hal-resources.c} (65%) create mode 100644 firmware/targets/f2/api-hal/api-hal-resources.h create mode 100644 firmware/targets/local/api-hal/api-hal-resources.h diff --git a/.gitattributes b/.gitattributes index 47fe4d76..8b137891 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1 @@ -*.pdf filter=lfs diff=lfs merge=lfs -text -*.gif filter=lfs diff=lfs merge=lfs -text -*.png filter=lfs diff=lfs merge=lfs -text -*.jpg filter=lfs diff=lfs merge=lfs -text -*.jpeg filter=lfs diff=lfs merge=lfs -text + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 57c4a427..1c2a0d1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,6 @@ jobs: uses: actions/checkout@v2 with: submodules: true - lfs: true - uses: satackey/action-docker-layer-caching@v0.0.8 continue-on-error: true diff --git a/applications/applications.h b/applications/applications.h index f06407fe..50098f73 100644 --- a/applications/applications.h +++ b/applications/applications.h @@ -46,6 +46,10 @@ const FlipperStartupApp FLIPPER_STARTUP[] = { {.app = input_task, .name = "input_task", .libs = {0}}, #endif +#ifdef APP_EXAMPLE_INPUT_DUMP + {.app = application_input_dump, .name = "input dump", .libs = {1, FURI_LIB{"input_task"}}}, +#endif + #ifdef APP_GUI {.app = backlight_control, .name = "backlight_control", .libs = {1, FURI_LIB{"input_task"}}}, {.app = gui_task, .name = "gui_task", .libs = {0}}, @@ -102,7 +106,7 @@ const FlipperStartupApp FLIPPER_STARTUP[] = { #endif #ifdef APP_SPEAKER_DEMO - {.app = coreglitch_demo_0, .name = "coreglitch_demo_0", .libs = ""}, + {.app = coreglitch_demo_0, .name = "coreglitch_demo_0", .libs = {0}}, #endif }; diff --git a/applications/backlight-control/backlight-control.c b/applications/backlight-control/backlight-control.c index 3ef42a90..16810c45 100644 --- a/applications/backlight-control/backlight-control.c +++ b/applications/backlight-control/backlight-control.c @@ -7,8 +7,15 @@ static void event_cb(const void* value, void* ctx) { const uint32_t BACKLIGHT_TIME = 10000; void backlight_control(void* p) { - // TODO use FURI - HAL_GPIO_WritePin(DISPLAY_BACKLIGHT_GPIO_Port, DISPLAY_BACKLIGHT_Pin, GPIO_PIN_SET); + // create pin + GpioPin backlight = backlight_gpio; + + // TODO open record + GpioPin* backlight_record = &backlight; + + // configure pin + gpio_init(backlight_record, GpioModeOutputPushPull); + gpio_write(backlight_record, true); StaticSemaphore_t event_descriptor; SemaphoreHandle_t update = xSemaphoreCreateCountingStatic(255, 0, &event_descriptor); @@ -24,9 +31,9 @@ void backlight_control(void* p) { while(1) { // wait for event if(xSemaphoreTake(update, BACKLIGHT_TIME) == pdTRUE) { - HAL_GPIO_WritePin(DISPLAY_BACKLIGHT_GPIO_Port, DISPLAY_BACKLIGHT_Pin, GPIO_PIN_SET); + gpio_write(backlight_record, true); } else { - HAL_GPIO_WritePin(DISPLAY_BACKLIGHT_GPIO_Port, DISPLAY_BACKLIGHT_Pin, GPIO_PIN_RESET); + gpio_write(backlight_record, false); } } } \ No newline at end of file diff --git a/applications/cc1101-workaround/cc1101.cpp b/applications/cc1101-workaround/cc1101.cpp index 1feae6b1..0f064a74 100644 --- a/applications/cc1101-workaround/cc1101.cpp +++ b/applications/cc1101-workaround/cc1101.cpp @@ -1,5 +1,6 @@ #include "flipper_v2.h" #include "cc1101-workaround/cc1101.h" +#include "spi.h" // ****************************************************************************** #define WRITE_BURST 0x40 @@ -27,34 +28,14 @@ CC1101::CC1101(GpioPin* ss_pin) { //****************************************************************************** //SpiInit /******************************************************************************/ -extern SPI_HandleTypeDef hspi3; +extern SPI_HandleTypeDef SPI_R; void CC1101::SpiInit(void) { //initialize spi pins //Enable spi master, MSB, SPI mode 0, FOSC/4 SpiMode(0); - if(HAL_SPI_DeInit(&hspi3) != HAL_OK) { - Error_Handler(); - } - - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_8BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 7; - hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - - if(HAL_SPI_Init(&hspi3) != HAL_OK) { - Error_Handler(); - } + CC1101_SPI_Reconfigure(); } void CC1101::SpiEnd(void) { @@ -99,7 +80,7 @@ uint8_t CC1101::SpiTransfer(uint8_t value) { uint8_t buf[1] = {value}; uint8_t rxbuf[1] = {0}; - HAL_SPI_TransmitReceive(&hspi3, buf, rxbuf, 1, HAL_MAX_DELAY); + HAL_SPI_TransmitReceive(&SPI_R, buf, rxbuf, 1, HAL_MAX_DELAY); return rxbuf[0]; } diff --git a/applications/coreglitch_demo_0/coreglitch_demo_0.c b/applications/coreglitch_demo_0/coreglitch_demo_0.c index d5f04900..12e1ebd1 100644 --- a/applications/coreglitch_demo_0/coreglitch_demo_0.c +++ b/applications/coreglitch_demo_0/coreglitch_demo_0.c @@ -1,7 +1,7 @@ #include "flipper.h" #include "u8g2/u8g2.h" -extern TIM_HandleTypeDef htim5; +extern TIM_HandleTypeDef SPEAKER_TIM; void coreglitch_demo_0(void* p) { FuriRecordSubscriber* log = get_default_log(); @@ -40,7 +40,8 @@ void coreglitch_demo_0(void* p) { } // TODO get sound from FURI - hal_pwm_set(width, freq, &htim5, TIM_CHANNEL_4); + hal_pwm_set(width, freq, &SPEAKER_TIM, SPEAKER_CH); + // delay(1); cnt++; diff --git a/applications/display-u8g2/display-u8g2.c b/applications/display-u8g2/display-u8g2.c index c5f38aea..c51cb1ca 100644 --- a/applications/display-u8g2/display-u8g2.c +++ b/applications/display-u8g2/display-u8g2.c @@ -1,7 +1,8 @@ #include "u8g2/u8g2.h" #include "flipper.h" +#include "main.h" -extern SPI_HandleTypeDef hspi1; +extern SPI_HandleTypeDef SPI_D; // TODO: fix log #ifdef DEBUG @@ -63,7 +64,7 @@ static uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, voi #endif // TODO change it to FuriRecord SPI - HAL_SPI_Transmit(&hspi1, (uint8_t*)arg_ptr, arg_int, 10000); + HAL_SPI_Transmit(&SPI_D, (uint8_t*)arg_ptr, arg_int, 10000); break; case U8X8_MSG_BYTE_SET_DC: diff --git a/applications/examples/blink.c b/applications/examples/blink.c index abd0dd1c..a46c1859 100644 --- a/applications/examples/blink.c +++ b/applications/examples/blink.c @@ -3,7 +3,7 @@ void application_blink(void* p) { // create pin - GpioPin led = {.pin = GPIO_PIN_8, .port = GPIOA}; + GpioPin led = led_gpio[0]; // TODO open record GpioPin* led_record = &led; diff --git a/applications/examples/fatfs_list.c b/applications/examples/fatfs_list.c index afb7fd63..04c6fd69 100644 --- a/applications/examples/fatfs_list.c +++ b/applications/examples/fatfs_list.c @@ -50,55 +50,37 @@ void fatfs_list(void* p) { QueueHandle_t event_queue = xQueueCreate(2, sizeof(AppEvent)); furi_log = get_default_log(); + fuprintf(furi_log, "[fatfs_list] app start\n"); FuriRecordSubscriber* fb_record = furi_open_deprecated("u8g2_fb", false, false, NULL, NULL, NULL); if(fb_record == NULL) { - fuprintf(furi_log, "[widget][fatfs_list] cannot create fb record\n"); + fuprintf(furi_log, "[fatfs_list] cannot create fb record\n"); furiac_exit(NULL); } PubSub* event_record = furi_open("input_events"); if(event_record == NULL) { - fuprintf(furi_log, "[widget][fatfs_list] cannot open input_events record\n"); + fuprintf(furi_log, "[fatfs_list] cannot open input_events record\n"); furiac_exit(NULL); } PubSubItem* subscription = subscribe_pubsub(event_record, event_cb, event_queue); if(subscription == NULL) { - fuprintf(furi_log, "[widget][fatfs_list] cannot register input_events callback\n"); + fuprintf(furi_log, "[fatfs_list] cannot register input_events callback\n"); furiac_exit(NULL); } - // clear display - u8g2_t* fb = furi_take(fb_record); - u8g2_ClearBuffer(fb); - furi_commit(fb_record); - bsp_result = BSP_SD_Init(); if(bsp_result != 0) { - furi_take(fb_record); - - u8g2_SetFont(fb, u8g2_font_6x10_mf); - u8g2_SetDrawColor(fb, 1); - u8g2_SetFontMode(fb, 1); - u8g2_DrawStr(fb, 0, 12, "SD card init error"); - - furi_commit(fb_record); + fuprintf(furi_log, "[fatfs_list] SD card init error\n"); furiac_exit(NULL); } result = f_mount(&SD_FatFs, (TCHAR const*)SD_Path, 1); if(result != FR_OK) { - furi_take(fb_record); - - u8g2_SetFont(fb, u8g2_font_6x10_mf); - u8g2_SetDrawColor(fb, 1); - u8g2_SetFontMode(fb, 1); - u8g2_DrawStr(fb, 0, 12, "SD card mount error"); - - furi_commit(fb_record); + fuprintf(furi_log, "[fatfs_list] SD card mount error\n"); furiac_exit(NULL); } @@ -123,12 +105,6 @@ void fatfs_list(void* p) { } } - // get display and draw - furi_take(fb_record); - u8g2_ClearBuffer(fb); - u8g2_SetFont(fb, u8g2_font_6x10_mf); - u8g2_SetDrawColor(fb, 1); - u8g2_SetFontMode(fb, 1); line_current = 1; // open root dir @@ -156,8 +132,7 @@ void fatfs_list(void* p) { } else { snprintf(str_buffer, STR_BUFFER_SIZE, "FIL %s\n", fno.fname); } - - u8g2_DrawStr(fb, 0, line_size * (line_current - line_position), str_buffer); + fuprintf(furi_log, str_buffer); } line_current++; diff --git a/applications/examples/input_dump.c b/applications/examples/input_dump.c index fc794620..caaeca0c 100644 --- a/applications/examples/input_dump.c +++ b/applications/examples/input_dump.c @@ -29,6 +29,8 @@ void application_input_dump(void* p) { furi_check(event_record); subscribe_pubsub(event_record, event_cb, NULL); + printf("Example app [input dump]\n"); + for(;;) { delay(100); } diff --git a/applications/gui/u8g2_periphery.c b/applications/gui/u8g2_periphery.c index db12c506..d39071da 100644 --- a/applications/gui/u8g2_periphery.c +++ b/applications/gui/u8g2_periphery.c @@ -1,7 +1,8 @@ #include "u8g2/u8g2.h" #include "flipper.h" +#include -extern SPI_HandleTypeDef hspi1; +extern SPI_HandleTypeDef SPI_D; // TODO: fix log #ifdef DEBUG @@ -60,7 +61,7 @@ uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ #endif // TODO change it to FuriRecord SPI - HAL_SPI_Transmit(&hspi1, (uint8_t*)arg_ptr, arg_int, 10000); + HAL_SPI_Transmit(&SPI_D, (uint8_t*)arg_ptr, arg_int, 10000); break; case U8X8_MSG_BYTE_SET_DC: diff --git a/applications/input/input.c b/applications/input/input.c index 1a848c97..b03b3808 100644 --- a/applications/input/input.c +++ b/applications/input/input.c @@ -1,5 +1,4 @@ #include -#include #include #include @@ -54,7 +53,14 @@ void input_task(void* p) { for(;;) { bool changed = false; for(uint32_t i = 0; i < INPUT_COUNT; i++) { - bool input_state = gpio_read(&input_gpio[i]) ^ input_invert[i]; + bool input_state = false; + + // dirty hack, f3 has no CHARGING pin + // TODO rewrite this + if(i < GPIO_INPUT_PINS_COUNT) { + input_state = gpio_read(&input_gpio[i]) ^ input_invert[i]; + } + if(input_state) { if(debounce_counters[i] < DEBOUNCE_TICKS) { debounce_counters[i] += 1; @@ -103,7 +109,7 @@ void input_task(void* p) { void HAL_GPIO_EXTI_Callback(uint16_t pin) { #ifdef APP_NFC - if(pin == RFID_PULL_Pin) { + if(pin == NFC_IRQ_Pin) { nfc_isr(); return; } diff --git a/applications/irda/irda.c b/applications/irda/irda.c index 9dd8fec2..a63d72cb 100644 --- a/applications/irda/irda.c +++ b/applications/irda/irda.c @@ -7,6 +7,7 @@ typedef enum { EventTypeTick, EventTypeKey, + EventTypeLed, } EventType; typedef struct { @@ -121,13 +122,9 @@ void render_samsung(CanvasApi* canvas, State* state) { void input_carrier(AppEvent* event, State* state) { if(event->value.input.input == InputOk) { if(event->value.input.state) { - hal_pwm_set( - duty_cycles[state->carrier_duty_cycle_id], - state->carrier_freq, - &htim2, - TIM_CHANNEL_4); + irda_pwm_set(duty_cycles[state->carrier_duty_cycle_id], state->carrier_freq); } else { - hal_pwm_stop(&htim2, TIM_CHANNEL_4); + irda_pwm_stop(); } } diff --git a/applications/irda/irda_nec.c b/applications/irda/irda_nec.c index be5252d7..17cc4b14 100644 --- a/applications/irda/irda_nec.c +++ b/applications/irda/irda_nec.c @@ -4,18 +4,18 @@ void ir_nec_preambula(void) { // 9ms carrier + 4.5ms pause - hal_pwm_set(NEC_DUTY_CYCLE, NEC_CARRIER_FREQUENCY, &htim2, TIM_CHANNEL_4); + irda_pwm_set(NEC_DUTY_CYCLE, NEC_CARRIER_FREQUENCY); delay_us(9000); - hal_pwm_stop(&htim2, TIM_CHANNEL_4); + irda_pwm_stop(); delay_us(4500); } void ir_nec_send_bit(bool bit) { // 0 is 562.5us carrier + 1687.5us pause // 1 is 562.5us carrier + 562.5us pause - hal_pwm_set(NEC_DUTY_CYCLE, NEC_CARRIER_FREQUENCY, &htim2, TIM_CHANNEL_4); + irda_pwm_set(NEC_DUTY_CYCLE, NEC_CARRIER_FREQUENCY); delay_us(562.5); - hal_pwm_stop(&htim2, TIM_CHANNEL_4); + irda_pwm_stop(); if(bit) { delay_us(562.5); } else { diff --git a/applications/irda/irda_protocols.h b/applications/irda/irda_protocols.h index 686ff219..ceb96535 100644 --- a/applications/irda/irda_protocols.h +++ b/applications/irda/irda_protocols.h @@ -1,7 +1,7 @@ #pragma once // our tx pin is TIM2_CH4 -extern TIM_HandleTypeDef htim2; +extern TIM_HandleTypeDef TIM_A; #define RC5_CARRIER_FREQUENCY 36000 #define RC5_DUTY_CYCLE 0.33 diff --git a/applications/irda/irda_samsung.c b/applications/irda/irda_samsung.c index 03eea7f8..9227c77c 100644 --- a/applications/irda/irda_samsung.c +++ b/applications/irda/irda_samsung.c @@ -3,16 +3,16 @@ #include "irda_protocols.h" void ir_samsung_preambula(void) { - hal_pwm_set(SAMSUNG_DUTY_CYCLE, SAMSUNG_CARRIER_FREQUENCY, &htim2, TIM_CHANNEL_4); + irda_pwm_set(SAMSUNG_DUTY_CYCLE, SAMSUNG_CARRIER_FREQUENCY); delay_us(4500); - hal_pwm_stop(&htim2, TIM_CHANNEL_4); + irda_pwm_stop(); delay_us(4500); } void ir_samsung_send_bit(bool bit) { - hal_pwm_set(SAMSUNG_DUTY_CYCLE, SAMSUNG_CARRIER_FREQUENCY, &htim2, TIM_CHANNEL_4); + irda_pwm_set(SAMSUNG_DUTY_CYCLE, SAMSUNG_CARRIER_FREQUENCY); delay_us(560); - hal_pwm_stop(&htim2, TIM_CHANNEL_4); + irda_pwm_stop(); if(bit) { delay_us(1590); } else { diff --git a/applications/lf-rfid/lf-rfid.c b/applications/lf-rfid/lf-rfid.c index cc7f6253..9afde95d 100644 --- a/applications/lf-rfid/lf-rfid.c +++ b/applications/lf-rfid/lf-rfid.c @@ -43,7 +43,7 @@ static void input_callback(InputEvent* input_event, void* ctx) { osMessageQueuePut(event_queue, &event, 0, 0); } -extern TIM_HandleTypeDef htim15; +extern TIM_HandleTypeDef TIM_C; void em4100_emulation(uint8_t* data, GpioPin* pin); void prepare_data(uint32_t ID, uint32_t VENDOR, uint8_t* data); @@ -51,7 +51,7 @@ void lf_rfid_workaround(void* p) { osMessageQueueId_t event_queue = osMessageQueueNew(1, sizeof(AppEvent), NULL); // create pin - GpioPin pull_pin = {.pin = GPIO_PIN_15, .port = GPIOB}; + GpioPin pull_pin = {.pin = RFID_PULL_Pin, .port = RFID_PULL_GPIO_Port}; // TODO open record GpioPin* pull_pin_record = &pull_pin; @@ -92,7 +92,7 @@ void lf_rfid_workaround(void* p) { if(event.type == EventTypeKey) { // press events if(event.value.input.state && event.value.input.input == InputBack) { - hal_pwmn_stop(&htim15, TIM_CHANNEL_1); // TODO: move to furiac_onexit + hal_pwmn_stop(&TIM_C, TIM_CHANNEL_1); // TODO: move to furiac_onexit gpio_init(pull_pin_record, GpioModeInput); // TODO remove all widgets create by app widget_enabled_set(widget, false); @@ -122,7 +122,7 @@ void lf_rfid_workaround(void* p) { } hal_pwmn_set( - state->on ? 0.5 : 0.0, (float)(state->freq_khz * 1000), &htim15, TIM_CHANNEL_1); + state->on ? 0.5 : 0.0, (float)(state->freq_khz * 1000), &LFRFID_TIM, LFRFID_CH); if(!state->on) { em4100_emulation(emulation_data, pull_pin_record); diff --git a/assets/icons/IrukaGotchi/Flipper_idle_76x52.png b/assets/icons/IrukaGotchi/Flipper_idle_76x52.png index 90a0c556c1ae9e5d8627f962114b7ce822e4470f..60696d745522d31c0f5ac975476328ba4ff3610d 100644 GIT binary patch literal 652 zcmeAS@N?(olHy`uVBq!ia0vp^K0s{3#0(^3JIq9Y6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZQ-$_=LFr|NkGzw9rwK z6J*t1Qhfu+VNCLNcVXyYmGuB}I14-?iy0WWg+Q3`(%rg0Ktc8rPhVH|CtOlO(nelk z8?%6VGCW-zLo81B207*(QQ+C4TFlNFchO&>b8j%`zst+NslUB3A!pH-0PoI8i8gXM z!jV%fmtWG|AzjDbzBg^B6XVSJ3wpWRd@`GVd_9*|v+T;s9dEb}UXEJ6&fN8bNyanj zYjGwmKLx%V4vCl<^6=k;<~W8Uwi>e+zu2R*#L$J|;9WzT?+u4@z8eQ_6<)EjV7rV7 zvue>y*>5W*Tx?kAa@;!Dg*AWn^c5Do--LVHjN*?7Eel({&h4{z@e%h+Pm{h!KboVw z>O0TcnA*UEM|=}@Noki(;naz4RV`0=W-s%2a@X$8KGWb`33fd@pPHrFFPBL_d`#}u zwCoSdox*ocNxG@EJf`|&+|=zcUZ(S`lXzv!=B;vHbyVZn?Z?~sq&G^fmtDE9OhT(7 zdfkt-Yv+y`?|idTt%0-gdFPfMpZFf#?Ojsla(ldAoUC5I_Wt)iPFtlf{~f-xRMyz*7rUyk1FeF z`=ph}Q_EghA9fi%D`^psHUwfIcSABUCTpMq1~w4NS#ZqO73AzwPQhX1L~yOvS&#qK L(<1#_6d^1>i=8IH diff --git a/assets/icons/IrukaGotchi/Flipper_young_80x60.png b/assets/icons/IrukaGotchi/Flipper_young_80x60.png index bc84e7a8afae8dfb2c6096eaee67905aa9f7734c..e031154dfded6fe916c168ac0f4ed742a94f2231 100644 GIT binary patch literal 2653 zcmai0d0Z1`8jeP&AcAKVTy;81i;HAJQUV#1Aci0T0+d4#MK>f9GBU};$pivbJn(ia zN(qX1LAm6x1+m-JrGNd~YX4@5H`S7|7m z;(6;eQdt5*0&z$@s^)`_PSt<_D(8by9ulTRBSe&_e+q$wrvyjHQW9ibIp{60<>_Hc zK!uP}K(E5oT3F8qExIuE-TW8=0Skpp;DgbUP(X+i2;jl+U@$>}Ex;q>3OLNyZ!nlz z@j)d?YG4RTN=jlRu^BiK54m%>T!_hnSS&Y+;igSilTy8#T06%qF`(g#Xk`SdAyHfn zm^GzwxQ^t5AcX^i;&R!Lwnj%_7G=2%LNG*ys7Wp4&Txl@^ASDzJ{z@m&@Re2$c#{Q z<_J28D*l9SMn0fxlsJiNmAGaosS#TY!5;)tc7HrXFV%dEERp<{IG?920FqABL`LkOAIx)0gOr2@qAG4CPx%f9Y%rzM5Q52LP6Wf~7L^eegjIfy;F=L~e1A%6tIT;tDcJ zN+3S*R4wsAAB6&?ZY~)JH8%<15}?BXHWM(LHg9BLk`kdr|J+Sz_=(*M21O_SE`FWW3k{efe1Dx=2h`A$P-*2Jv6cQ58Y4R|TI7wB}Sz1?wp?45%T zHjTYi-!S*?i^r_mZRb~{IOc~eiD-KCw&`%3h?trkX{((7?Oc(4dU5j6S$p?Q;4|h( z>P&AtfBtQIZe3W9_3SGGr^W=&E2`5`Elh#E-Cg4Z%t3Rgyz6^YeRs}-h8_1h==b3R zDLH<^Sm=8H}?D2HoJf6cjTq5XIi~9Q0qj+!>C+p2 z=iG@4mv40z`gtz9rb7|~ISXCAOFCW87;n!qY`Q6p`5{fz&2T8an&#~mW5``=$~G?N zTX)#~{*RT`?7|-T6Pw~3yY*Yuj!S?L>~L1?rVTUPG!Uvk5-SclBo3ra&)hA|aa2!c zd{U4{?@dk+^)QWHy&Nm@$*Ql`BZdsRi@ey$smM?&3AJCAn}aw8%3L#v&GgckQe!~# z%gMHF!Z$ktSMRyCWUuoAhvpa}c%QgHcPup}y7FMqb$RSHxH`rEvaag{V9o4*cQo~<-SktB?^{<)bcha$4L>0jLKl}O zr*=2inXsw)G&-w!`>!^pA}gbMrt{9^RTJZ%@zdHvb}lYSUvZq}v9=`6yZaK>uW4?7 z-r)4Gut9h|N`aOOtlkEFUBq3Pcx7Jj>fk!m>T|(sDVukr6hD^wMIYNcC~(7Ko?UI@ z-OH1fJq1d%R!`?&xN_dFaI)cZ_NNKYipTYrZZ=hRbsn657M|8FxAzL%m2_}LVIE}v z7bSN?RK@a`b5FXNGMU5rhgF%QP2AY8w;Vmb>p>*)dcvcYbAGed#Y1_{J#Xv3`LV{k zLRfirTlbsXU0L$kSye&RB|)lu&wOWVJ7xLUOKYWNg$08A$e855x<_LwR-L~WGbusA zYiXOD-N5_TuUUB)ZCyR9#jhLaec6C&$uD=tTglq=)oCyInCOX3)z$gw{PQLo2YPsz z^3BewZQ(1UtRFdsb1}zqj`qlcdu_MjtJ!hA4dDgp(e<1ue-D{=nvmxQEcku8(_WX0 z5m9Sa+`paBFu$U8*3Z7{+fRMx{73EgV4E0vxNu%SEAc|kk{xH%HzAufU0APE?QM2; z<}&&h1m~Y~G*|1w4GTv1W_0-eVYPf>eUN$-R-G03;N!5CFhCuiyiQby)Hn7(l2}NjW43UvDnmSN+nMAKuqGXcyu+*5lP^yYFY- zaJ~f{6~(349EDR)8r+V)XoQktj^LdE6(Z_dt%u^JgH*k;t+wnX LjK;5W?ZB`<)2t`i diff --git a/assets/icons/MainMenu/125khz_14/frame_01.png b/assets/icons/MainMenu/125khz_14/frame_01.png index 783689b918a60451fc689b56ec235fd1fd0205c6..5b861db4e2df5856983b3076e1ed3cc73e34969e 100644 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q!I7{YNq`G@-95C3@&*9*7(H<$Po zZy>TSp<{Kziu;E*6!RZ8GuXAW{b3#N;bwb=`RpQM{dz= literal 128 zcmWN?K@!3s3;@78uiyig5<+qM8xj&>Mx`UP2Vbvy*-Jj7^|!5a9%Faz(dO-`WBFfC zTDZU5IE3BhO>f1Hnjvnx1iB}T>N&6i1&S+#f-4hf5%5_HAu5V$5R97u6_l*ROg^bM KqkY9fOy&pCHz>sb diff --git a/assets/icons/MainMenu/125khz_14/frame_02.png b/assets/icons/MainMenu/125khz_14/frame_02.png index e5aa9059e4171ab1389896e6ce7312a484afadc5..d0edfbeb772caaf6d137d91e53b0c29d2c1c08bd 100644 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q!I7{YNq`G@-95C3@&|JUdFUvKc` ze}cxJg970P1NOHkK9_6DO(-emKm1p!jlG^>|8`L^hNjjhK)tFZt`Q|Ei6yC4$wjF^ ziowXh$UxW7K-b79#L&#j$k58bRNKJ7%D~`}wDw~Z4Y~O#nQ4`{HB5G!91qmM;OXk; Jvd$@?2>{r7N2CA% literal 128 zcmWN?OA^8$3;@tQr{DsXf+3XNhEF2QsB{eN!qe;9yo)~4$6L2K57~`*^m%)-EdSe? zmoi>P4l3rdYV@k5CFgO+>VN>evrxE1q>3@78W_3wh)Br9>y`r39aF6kB89v>Ks~A@t`Q|Ei6yC4$wjF^iowXh$UxW7 zK-b79#L&#j$k58bRNKJ7%D~`}wDw~Z4Y~O#nQ4`{HB5G!91qmM;OXk;vd$@?2>^lD BMKS;Y literal 128 zcmWN_!41P83;@7CQ?NioY=VJo0|p9GTcSep==9C&q`UHWwEmHG&SUIKJ==V|%2;me z85izvHIB^c0?}KNqXsmzqb=Yq=nx^VWzaK;rR<_v)& MB{AABOWeHp1ANsc#{d8T diff --git a/assets/icons/MainMenu/125khz_14/frame_04.png b/assets/icons/MainMenu/125khz_14/frame_04.png index f312414ed53846f0f61be88e2ca92199f3d8a9c4..932800518882e327b02205a433776fd706a73f1c 100644 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QgTe~ HDWM4f;xk4) literal 128 zcmWN@%MpVh5CG6SRnS007M73Qz=DC9Bsf|0km}>-n!U*he;6-SwY+EhziBT7;dOH!?pi&B9UgOP!e zfv%x}u8~oQp_!GDp_PHDwt<0_fx#nb?Z+q@a`RI%(<*UmnCvz=9;kuA)78&qol`;+ E0N2|@{r~^~ literal 128 zcmWN?%MpVh5CG6SRnR~Lb^*n1_$+~$Bsf|0km}>*y^Frw$49m~58jn}_W5{KUhdnO zmOS2y56bE?V)P=pMR0z%t1dN!kaL2~pwk3~HeX!@19*#>sJL1HgDDnWteEtQR%7rG Li{Snv2@b>`iGL=T diff --git a/assets/icons/MainMenu/Bluetooth_14/frame_02.png b/assets/icons/MainMenu/Bluetooth_14/frame_02.png index 5224d101a507cef93dab21d03cc4297c9ec3334a..cbcc779d40422b7fd1c22652c9655744515ab9c1 100644 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QbP0l+XkK DUW@VLzO1z+}`Avp^w$YsG`#@(esDCD}L3()I@GQY~?fC`m~yNwrEYN(E93Mg~R( zx`qb2Mn)lqW>!XqRtBcp1_o9J29Kn*AERi<%}>cptHiBgvfJc%paup{S3j3^P6!5CFhCuiyiQeMx@9FoRH~l5#KyU$1@Xi{3ouOZK%+K9stTb$c}4{`U`T zbv_lJRMlm~94NUL8{!dD!=#-h2N4QtTP$V@8BE)&L!(Pd7Q@Uvt!d}|{|pR5y^{V(f6`t6wWyZ3MwFx^mZVxG7o`Fz1|tI_16@M{ zT_d9qLo+KQLn{MQZ36=<1A|A>+K*8*mdKI;Vst033Nn A4FCWD literal 128 zcmWN_$qmCG5CFhGRnR~TEG&n+;aCDv60CszNcHh+q`Bxj`}pv-)-iV>o_#%Db#Axq zOj{mrF%Qb(Qf&0XXN!P#4>o|p>Wqb0pqN^!M4hU2L^=j_mo1dYJFk$GL^KJ#4xvIe M1tgpOM;wf2e~%m{vj6}9 diff --git a/assets/icons/MainMenu/Bluetooth_14/frame_05.png b/assets/icons/MainMenu/Bluetooth_14/frame_05.png index 9e8936a0fd9fda073260bb4ec2ac8f84025a9fbc..b6bf8b3771613c027a9b4067aef5407bf1870943 100644 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QRdP`(kYX@0Ff!0J zG|)9N3NbXZGBUI>Fx56Nure@sB(41zMMG|WN@iLmZVi*&CdUIcFnGH9xvX!XqRtBcp1_o9J29Kn*AERi<%}>cptHiBgvfJc%paup{S3j3^P6^iBGbp!tKP-m(fUW!IghbR`E2v?Dr3E^ zXIiPh2u=FAO#(rfQQHyh!qe;9yi4D`9WPtQIQ#D0y^Y(W^yz>7 z$drz!>!&7n1#`4)du2e{v*?OZy+_JXwy2A!@B+w0o{8765)vd31;5P5%2A+1FG-|q L!Swc33pkq}r#vTg diff --git a/assets/icons/MainMenu/FileManager_14/frame_02.png b/assets/icons/MainMenu/FileManager_14/frame_02.png index 2df6a39d86298c165e039402ee2ab4693ad4a7cb..d0a410bdfda90adeff8b6e23b1968de9881e4db8 100644 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QF})&O;?mbgZgq$HN4S|t~y0x1R~ z10w@nLjzqSqYy(gD&Ug*fz~JfX=d#Wz Gp$PzsctM>2 literal 128 zcmWN?K@!3s3;@78uiyg~2n1|@6KEpLsC0z(;OliSd+}$q{?>KQV{FDe+PpnwEdT47 zm(pKm99+!hRByW;l>p-=$)+giiuJTRMgdtVTN~4woeMxd0fa*2DTM5qAc1gM1Kn*b Lf@-ucYd};#l(i=k diff --git a/assets/icons/MainMenu/FileManager_14/frame_03.png b/assets/icons/MainMenu/FileManager_14/frame_03.png index 158d121b452fbe55b4228074aa79d17f5c1477e1..618d81bdc016570e9bcdcedb2b3613d579641857 100644 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q3T(cw$m!GFBY%{&Z?x&$v>_55`is7JNLHKHUXu_V|~P#{eDn?Mp_Mx`UQ2Vbvy*-PHDkC$oZdCc9~dp~avo$LSh zDQg{1I}fS$^2_LKW}_{^&IOZ_5GzNLf}Bf&TD()pgfVdf1r9ZPM0Nn^0>=QNo4P7Q L%j{n!5CFhCuiyiQWmxl@aTtUum6VVie7*LiFaFFv-maPF?x}+q4i<6Ar^E97@Q`D(IeWTL#;*oNSVoK(8)k#T_ZqD7$6bnK)|`0 LEN1_*v@VMuly4@{ diff --git a/assets/icons/MainMenu/FileManager_14/frame_05.png b/assets/icons/MainMenu/FileManager_14/frame_05.png index f2a0a502f44944452b25a71077e4a65f058378dd..b8a42ab6df256167fdca42b696d1594512acfc24 100644 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qo>z40H_* zbd8Kc49%>J46O`Iv<(cb3=CXy6v9z7mdKI;Vst00;j; A$N&HU literal 128 zcmWN?K@!3s3;@78uiyigfdYa41`;C7sB{eW;OliSd$qTW`O>f9(y diff --git a/assets/icons/MainMenu/FileManager_14/frame_06.png b/assets/icons/MainMenu/FileManager_14/frame_06.png index b0f3874639f2daa00cd395cfad0eadd65f641fcf..c68776ffbbc09f55ba9575866032e77073a2fa7d 100644 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QFg>V!Nx%nxXX_dG&m>SM_4b;Hk>FVdQ&MBb@0Dr(ecmMzZ literal 128 zcmWN?K@!3s3;@78uiyg~QreL8HxNLWQRxWw;OliSd*%0N{iW-i=QxbHw|RS%vHY)} zxJZARab__WsNRwuHLN=xfHpJp21Hv)7z8B)le57^$CAVYdm=#MND{?H=MiGw5d@@o LHQG1p)p_*;fet3Q diff --git a/assets/icons/MainMenu/FileManager_14/frame_07.png b/assets/icons/MainMenu/FileManager_14/frame_07.png index f2a0a502f44944452b25a71077e4a65f058378dd..b8a42ab6df256167fdca42b696d1594512acfc24 100644 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qo>z40H_* zbd8Kc49%>J46O`Iv<(cb3=CXy6v9z7mdKI;Vst00;j; A$N&HU literal 128 zcmWN?K@!3s3;@78uiyigfdYa41`;C7sB{eW;OliSd$qTW`O>f9(y diff --git a/assets/icons/MainMenu/FileManager_14/frame_08.png b/assets/icons/MainMenu/FileManager_14/frame_08.png index 924a533cc6c68f899ab112583575e27d2fbd7fd0..e22b2357c8fb6e5105be038fb2b8e13f2b3fd1df 100644 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q!5CFhCuiyiQWmxl@aTtUum6VVie7*LiFaFFv-maPF?x}+q4i<6Ar^E97@Q`D(IeWTL#;*oNSVoK(8)k#T_ZqD7$6bnK)|`0 LEN1_*v@VMuly4@{ diff --git a/assets/icons/MainMenu/FileManager_14/frame_09.png b/assets/icons/MainMenu/FileManager_14/frame_09.png index 158d121b452fbe55b4228074aa79d17f5c1477e1..618d81bdc016570e9bcdcedb2b3613d579641857 100644 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q3T(cw$m!GFBY%{&Z?x&$v>_55`is7JNLHKHUXu_V|~P#{eDn?Mp_Mx`UQ2Vbvy*-PHDkC$oZdCc9~dp~avo$LSh zDQg{1I}fS$^2_LKW}_{^&IOZ_5GzNLf}Bf&TD()pgfVdf1r9ZPM0Nn^0>=QNo4P7Q L%j{nF})&O;?mbgZgq$HN4S|t~y0x1R~ z10w@nLjzqSqYy(gD&Ug*fz~JfX=d#Wz Gp$PzsctM>2 literal 128 zcmWN?K@!3s3;@78uiyg~2n1|@6KEpLsC0z(;OliSd+}$q{?>KQV{FDe+PpnwEdT47 zm(pKm99+!hRByW;l>p-=$)+giiuJTRMgdtVTN~4woeMxd0fa*2DTM5qAc1gM1Kn*b Lf@-ucYd};#l(i=k diff --git a/assets/icons/MainMenu/GPIO_14/frame_01.png b/assets/icons/MainMenu/GPIO_14/frame_01.png index 2fe46fb433ba7cdebcac50628914d468f4ca3079..2b9b4db429c0f520e2d5f1fd818faca9971054ce 100644 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qk$z zFxX%)Wx7F28-pjqq`QJS;d>{7^sAP*MwFx^mZVxG7o`Fz1|tI_16@M{T_d9qLo+KQ sLn{LlZ36=<0|S>Fg>V!Nx%nxXX_dG&m>SM_4b;Hk>FVdQ&MBb@080Wr?f?J) literal 128 zcmWN?K@!3s3;@78uiyg~2oy?xLqa0VsC1#}JO|$vdjs8Jn!C1UU3g95@sZ zcSt~rNriE`te}?pzTz7|b*d$<5hW>!C8<`)MX5lF!N|bKK-bVf*T^Wu(9Fun(8|C> o+rYrez`!L(Asj_RZhlH;S|x4`riL?K12r&sy85}Sb4q9e03q-?Y5)KL literal 128 zcmWN_Q4WJ33;@u7Pr(Hy76BV?Q%V^m+b}EovD445m%K~9+WN=TF%I3WeYWv<6`gPE znP%>9tB0_?VCpR!t>i-717e}Xz;R6(5du+(z?d*a+5}MwIC8KQWLdnh@cn_k5P8gb L()JVM)@}L&&Cw`+ diff --git a/assets/icons/MainMenu/GPIO_14/frame_03.png b/assets/icons/MainMenu/GPIO_14/frame_03.png index a27976755ed78ecec2d36a71c6c3f0a2a2248404..25750041ad78160106fabce3c6b998b67d269c23 100644 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q2OC7#SED=o%X68X1KcnpqhcS{ayX o8yHv_7(9~JevG0aH$NpatrE9}$!?S5ff^V*UHx3vIVCg!05WYoJOBUy literal 128 zcmWN^%MrpL5CG6SRnUL|7Wt(cSXg03CF5caR&P#k-q}7p=3Dl)4&Ie|jCFewZcTM?-ZQF-Mi$GdRC{Ux5OqV9-QOp=G$Hb0$O7N+b_1-Z4_C0d3NRHCy9d!nC}Q!>*kach|DHaQ-sfx*+&&t;ucLK6V{3p)4! literal 128 zcmWN?NfN>!5CFhCuiyg)hRm?!H^U}WsiXvR@b%i4zRG*{@se$=a~?|F`?@{q-2S&u z+|qced6uLu5Tj=~8ym7mMn+vJKtRsX2A?RdP`(kYX@0Ff!0JG|)9N3NbXZGBUI>Fx56Nure@s iB(41zMMG|WN@iLmZVi*&CdUIcFnGH9xvXSRdP`(kYX@0Ff!0JG|)9N3NbXZGBUI>Fx56N mure@sB(41zMMG|WN@iLmZVi*&CdUIcFnGH9xvX5Beahr*)@Ysa6&x5s=cz!oDaBx1(VSzz Ml*Q~{mS9o*0LRTI!2kdN diff --git a/assets/icons/MainMenu/GPIO_14/frame_07.png b/assets/icons/MainMenu/GPIO_14/frame_07.png index 263102c8e98d5a709271ec7f92e97466046d4488..9c5bb11de14c1f6545f8533403a3c52cb6d620e4 100644 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q;CnC}Q!>*kach|DHaQ-sfx*+&&t;ucLK6VR@j8qE literal 128 zcmWN?OA^8$3;@tQr{DsX62hmw4JARCQRx`$!qe;9yo=w`$4j?4PuY#R_j!9%S^l@r zv6S&Na&j@3Ril%ZmcfS|kt=S#}JO|$vdjs8T+iN1UQrq9XJ#a zcSt~rNriFVO+hVfvxRqo>QqZyBT7;dOH!?pi&B9UgOP!efv%x}u8~oQp_!GDp_PG& owt<0_fq_eoLO6Obute25MmNboFyt=akR{08KYK#sB~S literal 128 zcmWN?OA^8$3;@tQr{DsX1_-ph4WC4qQRx`$!qe;9yo=t_$4j?4PdSXa_j!A;EdSdl zFJ(N9oK(yOYV@k5C5z!$k#-*#utuOnfLJgE@3un8Gp34x*ujc1a^7}NnXtI*fp@ZG Ly^{VVZCzA9qhTj$ diff --git a/assets/icons/MainMenu/Infrared_14/frame_01.png b/assets/icons/MainMenu/Infrared_14/frame_01.png index 0937f9dabf4354cf8c3953f566907830005de4c3..ddffd29ba3a14fac1063524f8bf554a602b5b78f 100644 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q4}1G$h90E~rF3;MXG?5!oBVljmr LP;mcNX*`G@bwDOu diff --git a/assets/icons/MainMenu/Infrared_14/frame_02.png b/assets/icons/MainMenu/Infrared_14/frame_02.png index b053b0a54475c34e121c2d9ec5fc684fca5a1ecb..21603a7ec094843f42c9595e527d19a2c68604ab 100644 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q|mee(B#1CaO403!+ulYqAy$i{{-q#Epd$~Nl7e8wMs5Z1yT$~21W+Dh6cJu yMj?h~Rz`+a2Bz8u237_JkEFF9qiD#@PsvQH#I0en+vIql1_n=8KbLh*2~7a~Z9xnG literal 128 zcmWN_OAf*y5CG6Ur{Dq>XXp&2x8W-!Dvg6(czU~f$vewO`grR$=OMc>k3MhDD$8a2 z#wCrHk)tGYf*L(*X#t6MvWOAVYMJBaEo8XDV{%|&t9LByh{$nf ML?!)KG_Fql0a1e{3;+NC diff --git a/assets/icons/MainMenu/Infrared_14/frame_03.png b/assets/icons/MainMenu/Infrared_14/frame_03.png index 0f61802d06d5c34233de87966c72232c267601e6..1aa8399ed75b5305863de419c0b48fdc5455deb3 100644 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qn~jF zmullT<8fehIC6l2;qFqA!hZ`JegIXgmbgZgq$HN4S|t~y0x1R~10w@nLjzqSqYy(g uD|~AwbjiH-UgKqqbwP2Vbvy*{i&@A1~9!ICZ!7-pB1xb^hNz zY0k&f>RGbA+;ns?+8E=q3$F}<5F-<>KBf{dNm(kn#3+u)0gHzf!EIrw2}m|VpzN{u M9477GVlepW2b%XLtN;K2 diff --git a/assets/icons/MainMenu/Infrared_14/frame_04.png b/assets/icons/MainMenu/Infrared_14/frame_04.png index 356d3ca7261f444670b0a1eca09a5336a6651c0f..8edaa2c88be3b939f1a318f4bc696df38fb10293 100644 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QpqVX}Gu!kM$RgDe*NBpo#FA92Ck lWnl0~TKh4IhTQy=%(P0}8Ya6 literal 128 zcmWN{K@!3s3;@78uiyigG!iKNjR7LesB}!*gRi%zz3f@P+Q-MXecyC-?%DU-OLV$y z2Tystoo+R|b2g(FtL=dlR`ASo3`-QxKoQxCl$awTWCn=fDR819Y4J&zs0M@rcqOSd Md87STE#Are0fuTO*Z=?k diff --git a/assets/icons/MainMenu/Infrared_14/frame_05.png b/assets/icons/MainMenu/Infrared_14/frame_05.png index ffe9aeefef3ae1b78a5c1e9203d04ab6887ab6bc..26bf497ce89683b3d34aa706d3f92a11671cfbe0 100644 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QRdP`(kYX@0Ff!0JG|)9N3NbXZGBUI>Fx56N mure@sB(41zMMG|WN@iLmZVi*&CdUIcFnGH9xvXR*hctYz!VZD_kX5zz~xlROaX@0iz@K*0DpI@5Dk5S)v0X$~9Dgf_W{H L)a+l;uzK|arGY1E diff --git a/assets/icons/MainMenu/Infrared_14/frame_06.png b/assets/icons/MainMenu/Infrared_14/frame_06.png index 5d7cd0ce10e5fc03cdf6d380614717ea2b7ad2e5..f035b9a5ad6171a61cfe5a1a8889e65dd8a054e2 100644 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QDx5@E94Gf;HelF{r5}E+fn?Fwg literal 128 zcmWN?K@!3s3;@78uiyig5=dJ58xla6QRxWw;OliSd*%0N{iW-i=QxbHw|RS%vHY(e zUZg+GIJ20`s@{?wH3HI+aTmudB@6DzPy(#H5^tV-;^=^O!p&MF!4N$GVZsmqKsM)W LRHJ>f2Jh4lmzpL& diff --git a/assets/icons/MainMenu/NFC_14/frame_01.png b/assets/icons/MainMenu/NFC_14/frame_01.png index 2e916723c28f902071b0cdbd73017650abca81f6..78f349cc08902b17efb59139d63225e70ebe531a 100644 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QvmNanPV_>*kCl=|nS;-ryRkg%5q9i4;B-JXpC>2OC z7#SED=o%X68X1KcnpqhcS{ayV8yHv_7`WspgrjK4%}>cptHiCr)NsaYpaup{S3j3^ HP6$nYPVHl4_#P)AsVgZh3Dl%o;u=wsl30>zm0Xkxq!^40j0|)Q z4Rno+LJZBUj0~*|OtcLQtPBiXaumW*H00)|WTsW()?jKl<26tNgQu&X%Q~loCIDzB BKp+4B literal 128 zcmWN^$qmCG5CFhGRnR~TESGUN97{k-f|bR7r26n0&5d8`_gYs>2J%axKXJGixCsBDK?Wzw@xoU}PL`h0wNvc(HQ7VvPFfuSQ&^0vBH8Kh@ vG_x`?v@$T!HZZU!5CFhCuiyiQVHuYEW>^%eR8kJ+;Oot)tNLso9`h~xS_kh+J;u5{@4Q|1 zZ{Es$DLz_JrxtTm$(;=P9iUJF3s$E{CKDy&YzF6j3yAef2N7ea!4@4;LTe~`YB?Z9 MC@6URnlvtmKWuR(3jhEB diff --git a/assets/icons/MainMenu/Sub1ghz_14/frame_01.png b/assets/icons/MainMenu/Sub1ghz_14/frame_01.png index f587edb54b89fd2cdf6f485a4309e1337aaab6c6..7e0a208e7562e0ed5065fea27e6cd3b8192678e7 100644 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QPt9< zH3&?YSlpa=UcAjZU*g}NMrDST9HK8cihkGt^{AG(MwFx^mZVxG7o`Fz1|tI_16@M{ zT_d9qLo+KQLn{MQZ36=<1A|A>+K*8*mdKI;Vst0EIX~ ASpWb4 literal 128 zcmWN?%MrpL5CG77s-OV_EZPsXY z;5cz&=fMrnxew1Z=c)g9K#*YvgILA1V%8%-EvhB15hW>!C8<`)MX5lF!N|bKK-bVf z*T^Wu(9Fun(8|D6+rYrez~GUz_G1(cx%nxXX_dG&Om>?b57fZm>FVdQ&MBb@006;4 AZvX%Q literal 128 zcmWN?NfN>!5CFhCuiyiQZ3vLxu*?WmDk%qZ@b%i4zVOXszGPqPA1 zR_9akiB(-j%+VzGZ2f*&w|~^x&&sD;AGK5s*k7lF8XpGAKB(Scvb4z=i^m*xou}z zaJ&^Cgz7S4^j&h>Y=|oqQ-TABH3ItV3cy|wL$U^f$3&>n8zPF%)ns(Yl!FGO`*yP+ Kxc^96Z^a*!G$yA2 diff --git a/assets/icons/MainMenu/Sub1ghz_14/frame_04.png b/assets/icons/MainMenu/Sub1ghz_14/frame_04.png index 4a50926f3da7f618968d3620bb4bd40bb4b4a717..efdeae43a86a7e95395f9ec0d4626e0d977b4ed4 100644 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qy#Y$AmbgZgq$HN4S|t~y0x1R~10w@nLjzqSqYy(gD5jaW! literal 128 zcmWN?K@!3s3;@78uiyg~2oRh8hCmQz)OLjS;OliSd&y_?{jJ-a$JmT{^m%*MvHWi* zFL{5NaY#0oQ+qFZv;+}1b|BVgOM*lxhJc*1O9k&-st*E0j8Os+MZ_T9a$d!SXl*Hg LRgL}?4X~;om2M{4 diff --git a/assets/icons/MainMenu/Sub1ghz_14/frame_05.png b/assets/icons/MainMenu/Sub1ghz_14/frame_05.png index 96d371019b0a70aed9ec97d57a89d43f0278ec5a..687263361335c5acd9f00b603e2d79470e098e64 100644 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QRdP`(kYX@0Ff!0JG|)9N3NbXZ uGBUI>Fx56Nure@sB(41zMMG|WN@iLmZVi*&CdUIcFnGH9xvX|~A(9mO8-yUtsB{eW;OliSd&*n;c$qfmp}V#BJ}-}|>;Lw- zt$94H9+K_pmeGsRmXLUl1Qk6{s3jr?UmY_E2B@2dEX*jdg#y+@x$sM4et2K&pk0XPSdUku?Y5tJ zEAuVrz#=Zi=BS)HXyn^Ft*wN)t%<4a7e7z5u*5g}M2q`}KRB{66h;X0Y;Eo51!`6;ag8WRNi0dVN-jzT zQVd20Mh3cu2D(N@A%RdP`( zkYX@0Ff!0JG|)9N3NbXZGBUI>Fx56Nure@sB(41zMMG|WN@iLmZVi*&CdUIcFnGH9 KxvX?)F zK#IZ0z{o(?&_LJ7D8$gr%E-{lz*O77z{6b-rgDVb@NxHU|6n;Z|+z~JfX K=d#Wzp$PzW-9;Jz literal 128 zcmWN?%MrpL5CG6SRnUNeh)dT#h=;7Teh{1xhwVP>-N0Q?SDIQ zqw!MnU{V)|(W{)T7$0^djA$u`;w=ytpDa^`SWM71BC&Q1Q9II{1L+)UN?0Mdl%ZNo LV)idf53@@$bf^o7o)KLC1E^WG#5JNMC9x#cD!C{X zNHG{07#Zjq8t57sg&3My85vp`m}(msSQ!{RlGc8Vq9HdwB{QuOw}#1XljDIJ7(8A5 KT-G@yGywqZjzjtY literal 128 zcmWN?K@!3s3;@7;U%>|~X^=wun`~1J0 zJWG4oeyG@MnOaSz7ec@8s2crBfSEyngKpVx5xr=H1Q3~1PP#w}&Lu`qiX=kfgfwKn LPrZKCppVlJ#&0N? diff --git a/assets/icons/MainMenu/Tamagotchi_14/frame_06.png b/assets/icons/MainMenu/Tamagotchi_14/frame_06.png index e953a157548435495dfcec13c7536cd6e398640d..5345418b7bbc569d782d9c476974d1a4ae8ca2a0 100644 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QEVDJ-E4W~u5GEvoETtf;i6!tteoMrzu2`=w LLvLRT8EE(c!+Iz} diff --git a/assets/icons/MainMenu/U2F_14/frame_01.png b/assets/icons/MainMenu/U2F_14/frame_01.png index 1b8d0a0c03f0ef7b0898170d9b56aa6fe7ef6abd..f59d2431b4e66f993bca633d8812cafd12f7799f 100644 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4QQ literal 128 zcmWN}OA>=13;@u*r{DsWpNZmafP}(KTbu@6^z?Q0cJJb^wEj_bj6-&jt?9>}6snG%M)|$nmvB5(E!^RnoxH_gS#*K&)XTXTTK}_Uw!d#e2K*+H0 M>eD3c$LgM@Ka-&+uK)l5 diff --git a/assets/icons/MainMenu/U2F_14/frame_02.png b/assets/icons/MainMenu/U2F_14/frame_02.png index 0e971469143cb414aefb8a0d97fe8f7ed68a85f7..bc674a97bdf7b7f0b04177dfa7419538cbfbd331 100644 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qf8P+m z%&Ug*fz~JfX=d#Wz Gp$P!vs6YY$ literal 128 zcmWN?OA^8$3;@tQr|1PNpAtU34GD=bqtcPug{RlIc^AKDAFrjI=P`G!@BO?zWUl|) z2Ui+TJr5>*Sv7iHW-AWDUa%(QfWov%Aq+VcN6se+ED^+bYpZ9DP>fK3Ekh=#CZewe Mfz|9^UL1h>0qq+oh5!Hn diff --git a/assets/icons/MainMenu/U2F_14/frame_03.png b/assets/icons/MainMenu/U2F_14/frame_03.png index 9f52d3e67374f1a25a03bf297b0eeabf0f9b468d..1304ae1081dac5b2d96568d05e182363f95fe3de 100644 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q!5CFh?Ucmf8P+m z%&Ug*fz~JfX=d#Wz Gp$P!vs6YY$ literal 128 zcmWN?OA^8$3;@tQr|1PNpAtU34GD=bqtcPug{RlIc^AKDAFrjI=P`G!@BO?zWUl|) z2Ui+TJr5>*Sv7iHW-AWDUa%(QfWov%Aq+VcN6se+ED^+bYpZ9DP>fK3Ekh=#CZewe Mfz|9^UL1h>0qq+oh5!Hn diff --git a/assets/icons/MainMenu/iButton_14/frame_01.png b/assets/icons/MainMenu/iButton_14/frame_01.png index df89fe825fbe805f90133786bc441c1865cf5818..94f7f9ac56694528338d56ce74cd7882cddf9d35 100644 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q!XqRtBcp1_o9J29Kn*AERi<%}>cptHiBgvfJc%paup{S3j3^ HP6)utq+{Z_@IS<~IdiMEvRbFn} znU*}>ijR`j1!8oP+#))^Bj!XVxoWco!a`+DTOc5dfYngcX{ES`!VN@)N9 literal 128 zcmWN?K@!3s3;@7;U%>|~C6GY-8weoGsB{eW;OliSdzH8J@ltKhQx2`~ecm2b*8lC3 zRvu3+XJLJrW%R71ML;^JddwlE5FG=P4~QFDj=q#!fr|&XTc5yDvAMvBa{g1~2|4cKkcM;V-}QKY6yw2~rG?mWbYLY~Jk!)T&zI8c~vxSdwa$T$Bo= z7>o>z40H_*bd8Kc49%>J46O`IwG9lc3=AGgYd=QOkei>9nO2Eg!(_L~@jwj>p00i_ I>zopr0EnYWUjP6A literal 128 zcmWN}K^DUh5CG7Jt$$>l^BB8Q&o&>gGM3wV zrX}~c8V6@}t)e%Qqeg>nN8>qh1V9HSvEE#PL}>IDi%mXx$Y|MxkU1imjo1-riey*P MAxAOVkL5jyKdNjeyZ`_I diff --git a/assets/icons/MainMenu/iButton_14/frame_04.png b/assets/icons/MainMenu/iButton_14/frame_04.png index 94e0effeb3211369f0b91c559c4461118553a797..1fec6a9499408f4db14240d8ecc3bb8922e7ffd8 100644 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Q+K*8*mdKI;Vst0Dl}x9RL6T literal 128 zcmWN_OAf*y5CG79Pr(H&zX3~c12cn=s5B0C;py$_CGX^q^zl}0&O>&sAAR1QRo2V) zEh~w2fujV)LEX@E1+Zo#Dt8wVe9ep|k;lSU M@gn`l%0;vM0nm^rdjJ3c diff --git a/assets/icons/MainMenu/iButton_14/frame_05.png b/assets/icons/MainMenu/iButton_14/frame_05.png index c877ddb32fe08e78f71e2ea9eb1e13ceb28566d5..8d6cc88a036d51fcd2929f133fd22f9092c78936 100644 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qh?11Vl2ohYqEsNoU}Ruq zplfKLYh)B+Xl7+(Xk}okZD3$!VDLy<`!R}!-29Zxv`X9>Cc90J2WnvOboFyt=akR{ E0C99gj{pDw literal 128 zcmWN?OA^8$3;@u5Pr(H&BoKT-70RTpCozOpfivfUsUD#5@OOavx} M6c*`UR!F$~0F^ic%`_aZQ(P1XXAjg@(d3GMGx#em-ZH@Q?2OC z7#SED=o%X68X1KcnpqhcS{ayX8yHv_7(9~JevG0aH$NpatrE9}$!?S5ff^V*UHx3v IIVCg!0Hr`lwg3PC literal 128 zcmWN?K@!3s3;@78uiyigk`My@4MGrRR65f3;OliSd&y_^@z(7)_PH7J=*R6@=kmXu z_a%>)nY(0jSv7jmvn3$EMa+SH;V2nw#^?YMBUF#%3%Hd-TwMybIxk2r2}R4q5V)@F Lgw^a{(LkhrQQ;*= diff --git a/assets/icons/MainMenu/iButton_14/frame_07.png b/assets/icons/MainMenu/iButton_14/frame_07.png index 09084806791dcd895ca50202b9f7e62aa7775b7d..1a36c6a979417f8fccfff7a60e3e3848cb23485b 100644 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sSBpA$%1!{m4Qc*s+J9tcD@8h9SI$!S4@)?;nQdKj*VV_%`l8cM52LYKdz^NlIc# zs#S7PDv)9@GB7gGH8jvQG72#?vobQYGBDLPFt9Q(cqFa;7)3*FeoAIqC2kFq-6qEa PH86O(`njxgN@xNA1QkgY literal 128 zcmWN?OA^8$3;@tQr{DsXgioNojRYdhsC1<5!qe;9ysLg@A8*}`W1pKbkAB>qGME4D z%nOf~nR{h(p&GsD+3q&bwgP5~juICvLJ}!j00xT{6L=ew1El0vk{SxLPZ>g%fWi#o LlA8TnwI!>5W@RQk diff --git a/assets/icons/StatusBar/BadUsb_9x8.png b/assets/icons/StatusBar/BadUsb_9x8.png index 06cd7957f49c56c0a5813517378016f239858b6b..2ba9167a922e254ba70b2d9915019f5b9161cf3b 100644 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRM2qYMox4n=6QcOwS?k)_Bce{j_0C}7R9+AZi z4BSE>%y{W;-5;PJdx@v7EBg~JF+m<-Zygn9ppcZOi(?4K_2d=l2?0q785s-!5CFhCuiyiQeJ12LEQ3&`l5#KyU$1@Xi{3ouOZK%+K9stTb$c}4{`XJb z%6uw5si@0{IjZEIY=9$Esv!YF&^BU=5hHq!4YMuTThJvNN4qn+rae)>N`d^w~mT4P)Nel#W95AdU8gBN5YE#`x&~V7f2jp zKgG!KSc=bd)eGSwpc>T@*NBpo#FA92}p$9n=4M z@|63_ja{<4X46}-qb68r3xuT<511q>0;Bq`d^w~mT4P)N+v#W95Adh(8g4-OhMK4cN_W7w3( zz@R>X6jPG7y9)#3-7euJKptm-M`STj zl@JIsUb#37424kFd9niZf71!qdeugyVX0LPCN-5(A?p8=EVe#)KLM z2G)g)-XiZ0E(fYnEpd$~Nl7e8wMs5Z1yT$~21W+Dh6cJuMj?h~Rz`+a1}54D237_J iE;$O}C>nC}Q!>*kaceL&obei{fx*+&&t;ucLK6Uoa5R7b literal 128 zcmWN?NfN>!5CFh?UcmBqY3WC_;7fYbI_(lmB6`75UfQaaHaX$N=Vg{SCMpVjv_RtRlxw5ZAxHT L-gtab7;Cp5oiZnI diff --git a/assets/icons/StatusBar/SDcardMounted_11x8.png b/assets/icons/StatusBar/SDcardMounted_11x8.png index 8eb9282c489433193e1eda3e05e0e62e5911d756..8d55d502d4c98daca5ea593c273c433b0c7e1bb3 100644 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^+(6912qYNToh?*>6jPG7y9)#3-7euJKptm-M`STj zl@JIsUb#37424kFd9niZf71(9^{+gyVX00z(rsPsWlb%nWi_%vOD> zt_y&YswJ)wB`Jv|saDBFsX&Us$iT=z*U&)M$SB0n%*x2n%D_b1z`)ADz$Hf^97RKJ beoAIqC2kF-hBICRH86O(`njxgN@xNAPyI6n literal 128 zcmWN?NfN>!5CFhCuiyiQWRh8u-!Lpfl}bu52Vbv!=_|c^Z7*BKIQ!w;y^h->_vwH6 z=oH%1^)m%`EvD6Id+~sD1j@R46y~TLS4uD=#Z5di%TC@?Ktb5j%)5sqQB(qI$crM% L4yM;{vH)a$nQ$iX diff --git a/assets/icons/StatusBar/USBConnected_15x8.png b/assets/icons/StatusBar/USBConnected_15x8.png index b8860343191ee1ca428bcd21601ea096535bfb5b..e91f02103b5be11c62c82254da307500eb0cdb26 100644 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^{6NgX2qYNzR?LV8QcOwS?k)_Bce{j_0C}7R9+AZi z4BSE>%y{W;-5;PJdx@v7EBg~JF+m<-Zygn9ppcBGi(?4K_2eH4$3OgIIQ-X|=To=? z#|efa`xA@|P5E5cb4&erf$CICTq8$=YbS7IJG2SOX9Sml#6K5uyi%4ISjl-WLi4 MD=Fz;))sg51Dc8^)Bpeg diff --git a/core/flipper_v2.h b/core/flipper_v2.h index e0de77b4..f2e344be 100644 --- a/core/flipper_v2.h +++ b/core/flipper_v2.h @@ -18,6 +18,7 @@ extern "C" { #include "api-basic/check.h" #include "api-hal/api-gpio.h" +#include "api-hal-resources.h" #include "gui/gui.h" diff --git a/firmware/targets/f2/Inc/main.h b/firmware/targets/f2/Inc/main.h index c86f631f..7ea00148 100644 --- a/firmware/targets/f2/Inc/main.h +++ b/firmware/targets/f2/Inc/main.h @@ -1,139 +1,163 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

- * - * 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 "stm32l4xx_hal.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 CHRG_Pin GPIO_PIN_2 -#define CHRG_GPIO_Port GPIOC -#define CHRG_EXTI_IRQn EXTI2_IRQn -#define BATT_V_Pin GPIO_PIN_3 -#define BATT_V_GPIO_Port GPIOC -#define IR_RX_Pin GPIO_PIN_0 -#define IR_RX_GPIO_Port GPIOA -#define BUTTON_DOWN_Pin GPIO_PIN_1 -#define BUTTON_DOWN_GPIO_Port GPIOA -#define BUTTON_DOWN_EXTI_IRQn EXTI1_IRQn -#define DISPLAY_DI_Pin GPIO_PIN_2 -#define DISPLAY_DI_GPIO_Port GPIOA -#define SPEAKER_Pin GPIO_PIN_3 -#define SPEAKER_GPIO_Port GPIOA -#define NFC_CS_Pin GPIO_PIN_4 -#define NFC_CS_GPIO_Port GPIOC -#define RFID_RF_IN_Pin GPIO_PIN_5 -#define RFID_RF_IN_GPIO_Port GPIOC -#define BUTTON_UP_Pin GPIO_PIN_0 -#define BUTTON_UP_GPIO_Port GPIOB -#define BUTTON_UP_EXTI_IRQn EXTI0_IRQn -#define LED_BLUE_Pin GPIO_PIN_1 -#define LED_BLUE_GPIO_Port GPIOB -#define DISPLAY_RST_Pin GPIO_PIN_10 -#define DISPLAY_RST_GPIO_Port GPIOB -#define IR_TX_Pin GPIO_PIN_11 -#define IR_TX_GPIO_Port GPIOB -#define RFID_OUT_Pin GPIO_PIN_13 -#define RFID_OUT_GPIO_Port GPIOB -#define LED_GREEN_Pin GPIO_PIN_14 -#define LED_GREEN_GPIO_Port GPIOB -#define RFID_PULL_Pin GPIO_PIN_15 -#define RFID_PULL_GPIO_Port GPIOB -#define RFID_PULL_EXTI_IRQn EXTI15_10_IRQn -#define VIBRO_Pin GPIO_PIN_6 -#define VIBRO_GPIO_Port GPIOC -#define iButton_Pin GPIO_PIN_7 -#define iButton_GPIO_Port GPIOC -#define DISPLAY_CS_Pin GPIO_PIN_8 -#define DISPLAY_CS_GPIO_Port GPIOC -#define SD_CS_Pin GPIO_PIN_9 -#define SD_CS_GPIO_Port GPIOC -#define LED_RED_Pin GPIO_PIN_8 -#define LED_RED_GPIO_Port GPIOA -#define TMS_Pin GPIO_PIN_13 -#define TMS_GPIO_Port GPIOA -#define TCK_Pin GPIO_PIN_14 -#define TCK_GPIO_Port GPIOA -#define CC1101_CS_Pin GPIO_PIN_15 -#define CC1101_CS_GPIO_Port GPIOA -#define BUTTON_LEFT_Pin GPIO_PIN_4 -#define BUTTON_LEFT_GPIO_Port GPIOB -#define BUTTON_LEFT_EXTI_IRQn EXTI4_IRQn -#define DISPLAY_BACKLIGHT_Pin GPIO_PIN_6 -#define DISPLAY_BACKLIGHT_GPIO_Port GPIOB -#define CC1101_G0_Pin GPIO_PIN_7 -#define CC1101_G0_GPIO_Port GPIOB -#define BUTTON_RIGHT_Pin GPIO_PIN_8 -#define BUTTON_RIGHT_GPIO_Port GPIOB -#define BUTTON_RIGHT_EXTI_IRQn EXTI9_5_IRQn -#define BUTTON_OK_Pin GPIO_PIN_9 -#define BUTTON_OK_GPIO_Port GPIOB -#define BUTTON_OK_EXTI_IRQn EXTI9_5_IRQn -/* USER CODE BEGIN Private defines */ - -#define MISO_PIN GpioPin{.port = GPIOC, .pin = GPIO_PIN_11} - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * 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 "stm32l4xx_hal.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 CHRG_Pin GPIO_PIN_2 +#define CHRG_GPIO_Port GPIOC +#define CHRG_EXTI_IRQn EXTI2_IRQn +#define BATT_V_Pin GPIO_PIN_3 +#define BATT_V_GPIO_Port GPIOC +#define IR_RX_Pin GPIO_PIN_0 +#define IR_RX_GPIO_Port GPIOA +#define BUTTON_DOWN_Pin GPIO_PIN_1 +#define BUTTON_DOWN_GPIO_Port GPIOA +#define BUTTON_DOWN_EXTI_IRQn EXTI1_IRQn +#define DISPLAY_DI_Pin GPIO_PIN_2 +#define DISPLAY_DI_GPIO_Port GPIOA +#define SPEAKER_Pin GPIO_PIN_3 +#define SPEAKER_GPIO_Port GPIOA +#define NFC_CS_Pin GPIO_PIN_4 +#define NFC_CS_GPIO_Port GPIOC +#define RFID_RF_IN_Pin GPIO_PIN_5 +#define RFID_RF_IN_GPIO_Port GPIOC +#define BUTTON_UP_Pin GPIO_PIN_0 +#define BUTTON_UP_GPIO_Port GPIOB +#define BUTTON_UP_EXTI_IRQn EXTI0_IRQn +#define LED_BLUE_Pin GPIO_PIN_1 +#define LED_BLUE_GPIO_Port GPIOB +#define DISPLAY_RST_Pin GPIO_PIN_10 +#define DISPLAY_RST_GPIO_Port GPIOB +#define IR_TX_Pin GPIO_PIN_11 +#define IR_TX_GPIO_Port GPIOB +#define RFID_OUT_Pin GPIO_PIN_13 +#define RFID_OUT_GPIO_Port GPIOB +#define LED_GREEN_Pin GPIO_PIN_14 +#define LED_GREEN_GPIO_Port GPIOB +#define RFID_PULL_Pin GPIO_PIN_15 +#define RFID_PULL_GPIO_Port GPIOB +#define RFID_PULL_EXTI_IRQn EXTI15_10_IRQn +#define VIBRO_Pin GPIO_PIN_6 +#define VIBRO_GPIO_Port GPIOC +#define iButton_Pin GPIO_PIN_7 +#define iButton_GPIO_Port GPIOC +#define DISPLAY_CS_Pin GPIO_PIN_8 +#define DISPLAY_CS_GPIO_Port GPIOC +#define SD_CS_Pin GPIO_PIN_9 +#define SD_CS_GPIO_Port GPIOC +#define LED_RED_Pin GPIO_PIN_8 +#define LED_RED_GPIO_Port GPIOA +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA +#define CC1101_CS_Pin GPIO_PIN_15 +#define CC1101_CS_GPIO_Port GPIOA +#define BUTTON_LEFT_Pin GPIO_PIN_4 +#define BUTTON_LEFT_GPIO_Port GPIOB +#define BUTTON_LEFT_EXTI_IRQn EXTI4_IRQn +#define DISPLAY_BACKLIGHT_Pin GPIO_PIN_6 +#define DISPLAY_BACKLIGHT_GPIO_Port GPIOB +#define CC1101_G0_Pin GPIO_PIN_7 +#define CC1101_G0_GPIO_Port GPIOB +#define BUTTON_RIGHT_Pin GPIO_PIN_8 +#define BUTTON_RIGHT_GPIO_Port GPIOB +#define BUTTON_RIGHT_EXTI_IRQn EXTI9_5_IRQn +#define BUTTON_OK_Pin GPIO_PIN_9 +#define BUTTON_OK_GPIO_Port GPIOB +#define BUTTON_OK_EXTI_IRQn EXTI9_5_IRQn +/* USER CODE BEGIN Private defines */ + +#define MISO_PIN GpioPin{.port = GPIOC, .pin = GPIO_PIN_11} + +#define SPI_R hspi3 +#define SPI_D hspi1 +#define SPI_SD_HANDLE SPI_R + +extern TIM_HandleTypeDef htim2; +extern TIM_HandleTypeDef htim5; +extern TIM_HandleTypeDef htim15; + +#define TIM_A htim2 +#define TIM_B htim5 +#define TIM_C htim15 + +#define SPEAKER_TIM htim5 +#define SPEAKER_CH TIM_CHANNEL_4 + +#define LFRFID_TIM htim15 +#define LFRFID_CH TIM_CHANNEL_1 + +#define IRDA_TIM htim2 +#define IRDA_CH TIM_CHANNEL_4 + +#define NFC_IRQ_Pin RFID_PULL_Pin +#define NFC_IRQ_GPIO_Port RFID_PULL_GPIO_Port + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/firmware/targets/f2/Inc/spi.h b/firmware/targets/f2/Inc/spi.h index 86d8b746..8c064f36 100644 --- a/firmware/targets/f2/Inc/spi.h +++ b/firmware/targets/f2/Inc/spi.h @@ -41,7 +41,10 @@ void MX_SPI1_Init(void); void MX_SPI3_Init(void); /* USER CODE BEGIN Prototypes */ - +void NFC_SPI_Reconfigure(); +void SD_SPI_Reconfigure_Slow(); +void SD_SPI_Reconfigure_Fast(); +void CC1101_SPI_Reconfigure(); /* USER CODE END Prototypes */ #ifdef __cplusplus diff --git a/firmware/targets/f2/Src/fatfs/spi_sd_hal.c b/firmware/targets/f2/Src/fatfs/spi_sd_hal.c index 8b6ae579..0cad29f7 100644 --- a/firmware/targets/f2/Src/fatfs/spi_sd_hal.c +++ b/firmware/targets/f2/Src/fatfs/spi_sd_hal.c @@ -4,9 +4,6 @@ #define SD_CS_LOW() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_RESET) #define SD_CS_HIGH() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_SET) -#define SPI_SD_INSTANCE SPI3 -#define SPI_SD_HANDLE hspi3 - const uint32_t SpiTimeout = 1000; extern SPI_HandleTypeDef SPI_SD_HANDLE; uint8_t SD_IO_WriteByte(uint8_t Data); @@ -64,46 +61,6 @@ __attribute__((unused)) static void SPIx_Write(uint8_t Value) { } } -void SD_SPI_Slow_Init(void) { - SPI_SD_HANDLE.Instance = SPI_SD_INSTANCE; - SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; - SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; - SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; - SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; - SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; - SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; - SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; - SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; - SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; - SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - SPI_SD_HANDLE.Init.CRCPolynomial = 7; - SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { - Error_Handler(); - } -} - -void SD_SPI_Fast_Init(void) { - SPI_SD_HANDLE.Instance = SPI_SD_INSTANCE; - SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; - SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; - SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; - SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; - SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; - SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; - SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; - SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; - SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - SPI_SD_HANDLE.Init.CRCPolynomial = 7; - SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { - Error_Handler(); - } -} - /****************************************************************************** LINK OPERATIONS *******************************************************************************/ diff --git a/firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.c b/firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.c index 85358d87..cc71e98b 100644 --- a/firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.c +++ b/firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.c @@ -91,6 +91,7 @@ #include "stdlib.h" #include "string.h" #include "stdio.h" +#include "spi.h" /** @addtogroup BSP * @{ @@ -290,7 +291,7 @@ static uint8_t SD_ReadData(void); */ uint8_t BSP_SD_Init(void) { /* Init to maximum slow speed */ - SD_SPI_Slow_Init(); + SD_SPI_Reconfigure_Slow(); /* Configure IO functionalities for SD pin */ SD_IO_Init(); @@ -300,7 +301,7 @@ uint8_t BSP_SD_Init(void) { uint8_t res = SD_GoIdleState(); /* Init to maximum fastest speed */ - SD_SPI_Fast_Init(); + SD_SPI_Reconfigure_Fast(); /* SD initialized and set to SPI mode properly */ return res; diff --git a/firmware/targets/f2/Src/main.c b/firmware/targets/f2/Src/main.c index 4780056f..bf0c980e 100644 --- a/firmware/targets/f2/Src/main.c +++ b/firmware/targets/f2/Src/main.c @@ -88,7 +88,6 @@ int main(void) SystemClock_Config(); /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ /* Initialize all configured peripherals */ diff --git a/firmware/targets/f2/Src/spi.c b/firmware/targets/f2/Src/spi.c index fc261570..7e767e11 100644 --- a/firmware/targets/f2/Src/spi.c +++ b/firmware/targets/f2/Src/spi.c @@ -175,6 +175,101 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) /* USER CODE BEGIN 1 */ +void NFC_SPI_Reconfigure() { + if (HAL_SPI_DeInit(&SPI_R) != HAL_OK) { + Error_Handler(); + } + + SPI_R.Init.Mode = SPI_MODE_MASTER; + SPI_R.Init.Direction = SPI_DIRECTION_2LINES; + SPI_R.Init.DataSize = SPI_DATASIZE_8BIT; + SPI_R.Init.CLKPolarity = SPI_POLARITY_LOW; + SPI_R.Init.CLKPhase = SPI_PHASE_2EDGE; + SPI_R.Init.NSS = SPI_NSS_SOFT; + SPI_R.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; + SPI_R.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPI_R.Init.TIMode = SPI_TIMODE_DISABLE; + SPI_R.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPI_R.Init.CRCPolynomial = 7; + SPI_R.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + SPI_R.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + + if (HAL_SPI_Init(&SPI_R) != HAL_OK) { + Error_Handler(); + } +} + +void SD_SPI_Reconfigure_Slow(void) { + if (HAL_SPI_DeInit(&SPI_SD_HANDLE) != HAL_OK) { + Error_Handler(); + } + + SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; + SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; + SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; + SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; + SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; + SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; + SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; + SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; + SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPI_SD_HANDLE.Init.CRCPolynomial = 7; + SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + + if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { + Error_Handler(); + } +} + +void SD_SPI_Reconfigure_Fast(void) { + if (HAL_SPI_DeInit(&SPI_SD_HANDLE) != HAL_OK) { + Error_Handler(); + } + + SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; + SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; + SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; + SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; + SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; + SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; + SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; + SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPI_SD_HANDLE.Init.CRCPolynomial = 7; + SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + + if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { + Error_Handler(); + } +} + +void CC1101_SPI_Reconfigure(void) { + if(HAL_SPI_DeInit(&SPI_R) != HAL_OK) { + Error_Handler(); + } + + SPI_R.Init.Mode = SPI_MODE_MASTER; + SPI_R.Init.Direction = SPI_DIRECTION_2LINES; + SPI_R.Init.DataSize = SPI_DATASIZE_8BIT; + SPI_R.Init.CLKPolarity = SPI_POLARITY_LOW; + SPI_R.Init.CLKPhase = SPI_PHASE_1EDGE; + SPI_R.Init.NSS = SPI_NSS_SOFT; + SPI_R.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; + SPI_R.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPI_R.Init.TIMode = SPI_TIMODE_DISABLE; + SPI_R.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPI_R.Init.CRCPolynomial = 7; + SPI_R.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + SPI_R.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + + if(HAL_SPI_Init(&SPI_R) != HAL_OK) { + Error_Handler(); + } +} /* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/firmware/targets/f2/api-hal/api-hal-pwm.c b/firmware/targets/f2/api-hal/api-hal-pwm.c index 2c3c312f..ee8bf879 100644 --- a/firmware/targets/f2/api-hal/api-hal-pwm.c +++ b/firmware/targets/f2/api-hal/api-hal-pwm.c @@ -40,4 +40,12 @@ void hal_pwm_stop(TIM_HandleTypeDef* tim, uint32_t channel) { void hal_pwmn_stop(TIM_HandleTypeDef* tim, uint32_t channel) { HAL_TIMEx_PWMN_Stop(tim, channel); +} + +void irda_pwm_set(float value, float freq){ + hal_pwm_set(value, freq, &IRDA_TIM, IRDA_CH); +} + +void irda_pwm_stop(){ + hal_pwm_stop(&IRDA_TIM, IRDA_CH); } \ No newline at end of file diff --git a/firmware/targets/f2/api-hal/api-hal-pwm.h b/firmware/targets/f2/api-hal/api-hal-pwm.h index 8e30bec7..e712ca16 100644 --- a/firmware/targets/f2/api-hal/api-hal-pwm.h +++ b/firmware/targets/f2/api-hal/api-hal-pwm.h @@ -6,3 +6,6 @@ void hal_pwm_set(float value, float freq, TIM_HandleTypeDef* tim, uint32_t chann void hal_pwmn_set(float value, float freq, TIM_HandleTypeDef* tim, uint32_t channel); void hal_pwm_stop(TIM_HandleTypeDef* tim, uint32_t channel); void hal_pwmn_stop(TIM_HandleTypeDef* tim, uint32_t channel); + +void irda_pwm_set(float value, float freq); +void irda_pwm_stop(); \ No newline at end of file diff --git a/firmware/targets/f2/Inc/input_priv.h b/firmware/targets/f2/api-hal/api-hal-resources.c similarity index 65% rename from firmware/targets/f2/Inc/input_priv.h rename to firmware/targets/f2/api-hal/api-hal-resources.c index 86ba658d..4c7e4d46 100644 --- a/firmware/targets/f2/Inc/input_priv.h +++ b/firmware/targets/f2/api-hal/api-hal-resources.c @@ -1,22 +1,18 @@ -#ifndef __INPUT_PRIV_H -#define __INPUT_PRIV_H - #include "main.h" #include "flipper_v2.h" #define DEBOUNCE_TICKS 10 -const GpioPin input_gpio[] = { +const GpioPin input_gpio[GPIO_INPUT_PINS_COUNT] = { {BUTTON_UP_GPIO_Port, BUTTON_UP_Pin}, {BUTTON_DOWN_GPIO_Port, BUTTON_DOWN_Pin}, {BUTTON_RIGHT_GPIO_Port, BUTTON_RIGHT_Pin}, {BUTTON_LEFT_GPIO_Port, BUTTON_LEFT_Pin}, {BUTTON_OK_GPIO_Port, BUTTON_OK_Pin}, {BUTTON_BACK_GPIO_Port, BUTTON_BACK_Pin}, - {CHRG_GPIO_Port, CHRG_Pin} -}; + {CHRG_GPIO_Port, CHRG_Pin}}; -const bool input_invert[] = { +const bool input_invert[GPIO_INPUT_PINS_COUNT] = { false, // {BUTTON_UP_GPIO_Port, BUTTON_UP_Pin}, false, // {BUTTON_DOWN_GPIO_Port, BUTTON_DOWN_Pin}, false, // {BUTTON_RIGHT_GPIO_Port, BUTTON_RIGHT_Pin}, @@ -26,4 +22,9 @@ const bool input_invert[] = { true, // {CHRG_GPIO_Port, CHRG_Pin} }; -#endif /* __INPUT_PRIV_H */ +const GpioPin led_gpio[3] = { + {LED_RED_GPIO_Port, LED_RED_Pin}, + {LED_GREEN_GPIO_Port, LED_GREEN_Pin}, + {LED_BLUE_GPIO_Port, LED_BLUE_Pin}}; + +const GpioPin backlight_gpio = {DISPLAY_BACKLIGHT_GPIO_Port, DISPLAY_BACKLIGHT_Pin}; \ No newline at end of file diff --git a/firmware/targets/f2/api-hal/api-hal-resources.h b/firmware/targets/f2/api-hal/api-hal-resources.h new file mode 100644 index 00000000..9e2ea425 --- /dev/null +++ b/firmware/targets/f2/api-hal/api-hal-resources.h @@ -0,0 +1,12 @@ +#pragma once +#include "main.h" +#include "flipper_v2.h" + +#define DEBOUNCE_TICKS 10 +#define GPIO_INPUT_PINS_COUNT 7 + +extern const GpioPin input_gpio[GPIO_INPUT_PINS_COUNT]; +extern const bool input_invert[GPIO_INPUT_PINS_COUNT]; + +extern const GpioPin led_gpio[3]; +extern const GpioPin backlight_gpio; \ No newline at end of file diff --git a/firmware/targets/f2/cube.ioc b/firmware/targets/f2/cube.ioc index d8b739ee..718ed2b2 100644 --- a/firmware/targets/f2/cube.ioc +++ b/firmware/targets/f2/cube.ioc @@ -1,506 +1,506 @@ #MicroXplorer Configuration settings - do not modify -PB13.GPIOParameters=GPIO_Label -PC7.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label -PA15\ (JTDI).GPIOParameters=PinState,GPIO_Label -RCC.USART1Freq_Value=64000000 -TIM8.ICPolarity_CH2=TIM_INPUTCHANNELPOLARITY_BOTHEDGE -SPI3.Direction=SPI_DIRECTION_2LINES -PC10.GPIO_PuPd=GPIO_PULLDOWN -SPI3.VirtualType=VM_MASTER -SPI1.VirtualType=VM_MASTER -VP_ADC1_TempSens_Input.Mode=IN-TempSens -PC12.Locked=true -SH.GPXTI9.0=GPIO_EXTI9 -PC12.Signal=SPI3_MOSI -PB14.GPIO_Label=LED_GREEN -PC7.Locked=true -PA13\ (JTMS-SWDIO).Locked=true -PC6.GPIO_Label=VIBRO -PC3.Locked=true -PA3.GPIOParameters=GPIO_Label -PB6.GPIO_Label=DISPLAY_BACKLIGHT -PA15\ (JTDI).Signal=GPIO_Output -PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator -PC5.Mode=INP -USART1.IPParameters=VirtualMode-Asynchronous -PB13.Signal=TIM15_CH1N -VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT -PA2.GPIOParameters=GPIO_Label -PinOutPanel.RotationAngle=0 -RCC.MCO1PinFreq_Value=64000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -TIM15.Channel-Output\ Compare1\ CH1N=TIM_CHANNEL_1 -PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator -SH.GPXTI13.0=GPIO_EXTI13 -PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK -RCC.LPTIM1Freq_Value=64000000 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false -NVIC.EXTI1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true -PB4\ (NJTRST).GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING -RCC.ADCCLockSelection=RCC_ADCCLKSOURCE_SYSCLK -SPI1.Direction=SPI_DIRECTION_2LINES -RCC.APB2TimFreq_Value=64000000 -PB6.Signal=GPIO_Output -PC7.Signal=S_TIM8_CH2 -SPI1.CalculateBaudRate=4.0 MBits/s -PC3.Signal=ADCx_IN4 -RCC.SAI2Freq_Value=13714285.714285715 -PA1.GPIO_PuPd=GPIO_PULLDOWN -RCC.PREFETCH_ENABLE=1 -PB13.Locked=true -RCC.USART3Freq_Value=64000000 -NVIC.EXTI15_10_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true -ProjectManager.ProjectBuild=false -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -PA0.Locked=true -PB2.Signal=GPIO_Analog -PA8.Locked=true -PA4.Locked=true -ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.16.0 -VP_ADC1_Vref_Input.Mode=IN-Vrefint -MxDb.Version=DB.6.0.0 -PB0.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -PA1.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -ProjectManager.BackupPrevious=false -VP_SYS_VS_tim17.Signal=SYS_VS_tim17 -PC4.GPIO_Label=NFC_CS -PB1.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM -FREERTOS.HEAP_NUMBER=4 -PB1.GPIO_Label=LED_BLUE -SPI1.DataSize=SPI_DATASIZE_8BIT -PC7.GPIO_ModeDefaultPP=GPIO_MODE_AF_OD -PA8.Signal=GPIO_Output -PA8.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD -RCC.PLLRCLKFreq_Value=64000000 -SH.ADCx_IN4.ConfNb=1 -PB6.Locked=true -NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false -ProjectManager.HalAssertFull=false -ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 -PA0.Signal=ADCx_IN5 -PC8.GPIOParameters=GPIO_Label -Mcu.Package=LQFP64 -PB9.Signal=GPXTI9 -PB1.Signal=GPIO_Output -PA5.Locked=true -NVIC.TimeBase=TIM1_TRG_COM_TIM17_IRQn -SPI3.Mode=SPI_MODE_MASTER -SH.GPXTI8.0=GPIO_EXTI8 -SH.GPXTI8.ConfNb=1 -NVIC.TimeBaseIP=TIM17 -RCC.LSCOPinFreq_Value=32000 -PA10.Signal=USART1_RX -PB9.GPIO_PuPd=GPIO_PULLDOWN -FREERTOS.FootprintOK=true -RCC.DFSDMFreq_Value=64000000 -PC11.Mode=Full_Duplex_Master -PB14.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP -NVIC.EXTI2_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true -RCC.PLLPoutputFreq_Value=18285714.285714287 -RCC.APB1TimFreq_Value=64000000 -FREERTOS.configGENERATE_RUN_TIME_STATS=1 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -RCC.LPUART1Freq_Value=64000000 -USB_OTG_FS.IPParameters=VirtualMode -PB13.Mode=Output Compare1 CH1N -PB10.GPIOParameters=GPIO_Label -PC12.GPIO_PuPd=GPIO_PULLDOWN -PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO -PA13\ (JTMS-SWDIO).GPIOParameters=GPIO_Label -PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator -PA8.GPIO_Speed=GPIO_SPEED_FREQ_HIGH -ProjectManager.CustomerFirmwarePackage=../../../lib/STM32CubeL4 -PC4.GPIOParameters=PinState,GPIO_Label -PC2.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING -NVIC.EXTI4_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true -RCC.PLLQoutputFreq_Value=64000000 -ProjectManager.ProjectFileName=cube.ioc -FREERTOS.Tasks01=defaultTask,24,1024,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;app_main,8,128,app,As external,NULL,Dynamic,NULL,NULL -ADC1.Rank-0\#ChannelRegularConversion=1 -TIM5.IPParameters=Prescaler,Period,Channel-PWM Generation4 CH4,Pulse-PWM Generation4 CH4 -Mcu.PinsNb=58 -PC4.PinState=GPIO_PIN_SET -PC11.Locked=true -VP_SYS_VS_tim17.Mode=TIM17 +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_4 ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,NbrOfConversion -PC13.Locked=true -ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE -PC13.Signal=GPXTI13 -RCC.SWPMI1Freq_Value=64000000 -FREERTOS.configCHECK_FOR_STACK_OVERFLOW=1 -PB8.GPIO_PuPd=GPIO_PULLDOWN -PC6.Signal=GPIO_Output -PC2.Signal=GPXTI2 -PB11.GPIO_Label=IR_TX -PC9.PinState=GPIO_PIN_SET -SH.GPXTI0.ConfNb=1 -SPI1.CLKPhase=SPI_PHASE_1EDGE -PC0.Signal=GPIO_Analog -PB14.Locked=true -PC11.GPIOParameters=GPIO_PuPd -SH.S_TIM8_CH2.0=TIM8_CH2,Input_Capture2_from_TI2 -PC3.GPIOParameters=GPIO_Label -PB8.GPIO_Label=BUTTON_RIGHT -PA11.Locked=true -PA8.GPIO_Label=LED_RED -SH.GPXTI2.ConfNb=1 -Mcu.Pin57=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS -PB14.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM -Mcu.Pin51=VP_ADC1_TempSens_Input -Mcu.Pin52=VP_ADC1_Vref_Input -Mcu.Pin50=PB9 -Mcu.Pin55=VP_SYS_VS_tim17 -Mcu.Pin56=VP_TIM8_VS_ClockSourceINT -Mcu.Pin53=VP_COMP1_VS_VREFINT12 -Mcu.Pin54=VP_FREERTOS_VS_CMSIS_V2 -PC6.Locked=true -PA9.Signal=USART1_TX -PB11.GPIOParameters=GPIO_Label -PB5.Locked=true -PB9.Locked=true -VP_TIM8_VS_ClockSourceINT.Mode=Internal -PC7.GPIO_PuPd=GPIO_NOPULL -Mcu.Pin48=PB7 -Mcu.Pin49=PB8 -RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 -Mcu.Pin46=PB5 -Mcu.Pin47=PB6 -PB10.Signal=GPIO_Output -PB14.Signal=GPIO_Output -RCC.PLLSAI2RoutputFreq_Value=32000000 -PA5.Signal=GPIO_Analog -Mcu.Pin40=PC10 -Mcu.Pin41=PC11 -PC12.Mode=Full_Duplex_Master -Mcu.Pin44=PB3 (JTDO-TRACESWO) -Mcu.Pin45=PB4 (NJTRST) -Mcu.Pin42=PC12 -Mcu.Pin43=PD2 -ProjectManager.LastFirmware=true -Mcu.Pin37=PA13 (JTMS-SWDIO) -Mcu.Pin38=PA14 (JTCK-SWCLK) -PB15.GPIO_Label=RFID_PULL -Mcu.Pin35=PA11 -RCC.I2C1Freq_Value=64000000 -Mcu.Pin36=PA12 -SPI1.Mode=SPI_MODE_MASTER -Mcu.Pin39=PA15 (JTDI) -PB3\ (JTDO-TRACESWO).Mode=TX_Only_Simplex_Unidirect_Master -RCC.RNGFreq_Value=48000000 -PC2.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -VP_ADC1_TempSens_Input.Signal=ADC1_TempSens_Input -Mcu.Pin30=PC8 -PA1.GPIO_Label=BUTTON_DOWN -Mcu.Pin33=PA9 -Mcu.Pin34=PA10 -Mcu.Pin31=PC9 -SH.ADCx_IN4.0=ADC1_IN4,IN4-Single-Ended -Mcu.Pin32=PA8 -PA9.Locked=true -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -PC10.GPIOParameters=GPIO_PuPd -SH.S_TIM5_CH4.ConfNb=1 -ProjectManager.FreePins=false -PC9.GPIOParameters=PinState,GPIO_Label -RCC.LPTIM2Freq_Value=64000000 -Mcu.Pin26=PB14 -Mcu.Pin27=PB15 -Mcu.Pin24=PB12 -ProjectManager.UnderRoot=false -Mcu.Pin25=PB13 -TIM8.Period=32768-1 -Mcu.Pin28=PC6 -PC7.GPIO_Label=iButton -Mcu.Pin29=PC7 -PA13\ (JTMS-SWDIO).Mode=Serial_Wire -PA4.Signal=GPIO_Analog -Mcu.Pin22=PB10 -PB5.Signal=SPI1_MOSI -Mcu.Pin23=PB11 -Mcu.Pin20=PB1 ADC1.master=1 -PA3.Locked=true -Mcu.Pin21=PB2 -PA10.Locked=true -PA14\ (JTCK-SWCLK).Locked=true -NVIC.ForceEnableDMAVector=true -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -ProjectManager.CompilerOptimize=6 -PA11.Signal=USB_OTG_FS_DM -ProjectManager.HeapSize=0x200 -PA0.GPIOParameters=GPIO_Label -Mcu.Pin15=PA6 -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -Mcu.Pin16=PA7 -Mcu.Pin13=PA4 -Mcu.Pin14=PA5 -Mcu.Pin19=PB0 -SH.GPXTI15.ConfNb=1 -ProjectManager.ComputerToolchain=false -Mcu.Pin17=PC4 -Mcu.Pin18=PC5 -SH.ADCx_IN5.0=ADC1_IN5,IN5-Single-Ended -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -Mcu.Pin11=PA2 -Mcu.Pin12=PA3 -Mcu.Pin10=PA1 -PC3.GPIO_Label=BATT_V -RCC.PWRFreq_Value=64000000 -PA15\ (JTDI).PinState=GPIO_PIN_SET -SH.ADCx_IN5.ConfNb=1 -PB4\ (NJTRST).GPIO_Label=BUTTON_LEFT -PB1.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD -SH.GPXTI1.ConfNb=1 -PD2.Signal=GPIO_Analog -PB6.GPIO_Speed=GPIO_SPEED_FREQ_LOW -RCC.I2C2Freq_Value=64000000 -PB0.Signal=GPXTI0 -PB4\ (NJTRST).GPIO_PuPd=GPIO_PULLDOWN -PC0.Locked=true -PC1.Signal=GPIO_Analog +ADC1.NbrOfConversion=1 +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +board=NUCLEO-L476RG +boardIOC=true +File.Version=6 +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=1 +FREERTOS.configGENERATE_RUN_TIME_STATS=1 +FREERTOS.configRECORD_STACK_HIGH_ADDRESS=1 +FREERTOS.configTOTAL_HEAP_SIZE=40960 +FREERTOS.configUSE_IDLE_HOOK=1 +FREERTOS.configUSE_TIMERS=1 +FREERTOS.FootprintOK=true +FREERTOS.HEAP_NUMBER=4 +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,HEAP_NUMBER,configUSE_TIMERS,configUSE_IDLE_HOOK,FootprintOK,configCHECK_FOR_STACK_OVERFLOW,configRECORD_STACK_HIGH_ADDRESS,configGENERATE_RUN_TIME_STATS +FREERTOS.Tasks01=defaultTask,24,1024,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;app_main,8,128,app,As external,NULL,Dynamic,NULL,NULL +GPIO.groupedBy=Group By Peripherals +KeepUserPlacement=false Mcu.Family=STM32L4 -SH.GPXTI1.0=GPIO_EXTI1 -ProjectManager.MainLocation=Src -USB_DEVICE.CLASS_NAME_FS=CDC -RCC.SAI1Freq_Value=13714285.714285715 -RCC.CortexFreq_Value=64000000 -ProjectManager.KeepUserCode=true -Mcu.UserName=STM32L476RGTx -PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN -PH0-OSC_IN\ (PH0).Locked=true -PC10.Locked=true -PC10.Signal=SPI3_SCK -RCC.PLLSAI1RoutputFreq_Value=48000000 -PA0.GPIO_Label=IR_RX -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_SPI1_Init-SPI1-false-HAL-true,4-MX_SPI3_Init-SPI3-false-HAL-true,5-MX_ADC1_Init-ADC1-false-HAL-true,6-MX_COMP1_Init-COMP1-false-HAL-true,7-MX_TIM5_Init-TIM5-false-HAL-true,8-MX_TIM15_Init-TIM15-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,11-MX_TIM8_Init-TIM8-false-HAL-true -PA11.Mode=Device_Only -PC9.Locked=true -TIM5.Pulse-PWM\ Generation4\ CH4=145 -PB0.GPIO_Label=BUTTON_UP -RCC.USART2Freq_Value=64000000 -PD2.Locked=true -VP_COMP1_VS_VREFINT12.Signal=COMP1_VS_VREFINT12 -PC13.GPIO_Label=BUTTON_BACK -PC1.Locked=true -PB13.GPIO_Label=RFID_OUT -PB11.Signal=GPIO_Output -PB15.Signal=GPXTI15 -ProjectManager.StackSize=0x400 -PB3\ (JTDO-TRACESWO).Signal=SPI1_SCK -VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 -SH.GPXTI2.0=GPIO_EXTI2 -RCC.I2C3Freq_Value=64000000 -Mcu.IP4=RCC -RCC.FCLKCortexFreq_Value=64000000 -Mcu.IP5=SPI1 +Mcu.IP0=ADC1 +Mcu.IP10=TIM15 +Mcu.IP11=USART1 +Mcu.IP12=USB_DEVICE +Mcu.IP13=USB_OTG_FS +Mcu.IP1=COMP1 Mcu.IP2=FREERTOS Mcu.IP3=NVIC -PC11.GPIO_PuPd=GPIO_PULLDOWN -Mcu.IP0=ADC1 -Mcu.IP1=COMP1 -PA12.Locked=true -PA12.Signal=USB_OTG_FS_DP -PB8.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING -SPI1.CLKPolarity=SPI_POLARITY_LOW -Mcu.UserConstants= -RCC.VCOSAI1OutputFreq_Value=96000000 -SPI3.CLKPolarity=SPI_POLARITY_LOW -RCC.SDMMCFreq_Value=48000000 -PA14\ (JTCK-SWCLK).GPIOParameters=GPIO_Label -SH.GPXTI13.ConfNb=1 -Mcu.ThirdPartyNb=0 -RCC.HCLKFreq_Value=64000000 +Mcu.IP4=RCC +Mcu.IP5=SPI1 +Mcu.IP6=SPI3 +Mcu.IP7=SYS +Mcu.IP8=TIM5 +Mcu.IP9=TIM8 Mcu.IPNb=14 -ProjectManager.PreviousToolchain= -PA8.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +Mcu.Name=STM32L476R(C-E-G)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin10=PA1 +Mcu.Pin11=PA2 +Mcu.Pin12=PA3 +Mcu.Pin13=PA4 +Mcu.Pin14=PA5 +Mcu.Pin15=PA6 +Mcu.Pin16=PA7 +Mcu.Pin17=PC4 +Mcu.Pin18=PC5 +Mcu.Pin19=PB0 +Mcu.Pin1=PC14-OSC32_IN (PC14) +Mcu.Pin20=PB1 +Mcu.Pin21=PB2 +Mcu.Pin22=PB10 +Mcu.Pin23=PB11 +Mcu.Pin24=PB12 +Mcu.Pin25=PB13 +Mcu.Pin26=PB14 +Mcu.Pin27=PB15 +Mcu.Pin28=PC6 +Mcu.Pin29=PC7 +Mcu.Pin2=PC15-OSC32_OUT (PC15) +Mcu.Pin30=PC8 +Mcu.Pin31=PC9 +Mcu.Pin32=PA8 +Mcu.Pin33=PA9 +Mcu.Pin34=PA10 +Mcu.Pin35=PA11 +Mcu.Pin36=PA12 +Mcu.Pin37=PA13 (JTMS-SWDIO) +Mcu.Pin38=PA14 (JTCK-SWCLK) +Mcu.Pin39=PA15 (JTDI) +Mcu.Pin3=PH0-OSC_IN (PH0) +Mcu.Pin40=PC10 +Mcu.Pin41=PC11 +Mcu.Pin42=PC12 +Mcu.Pin43=PD2 +Mcu.Pin44=PB3 (JTDO-TRACESWO) +Mcu.Pin45=PB4 (NJTRST) +Mcu.Pin46=PB5 +Mcu.Pin47=PB6 +Mcu.Pin48=PB7 +Mcu.Pin49=PB8 +Mcu.Pin4=PH1-OSC_OUT (PH1) +Mcu.Pin50=PB9 +Mcu.Pin51=VP_ADC1_TempSens_Input +Mcu.Pin52=VP_ADC1_Vref_Input +Mcu.Pin53=VP_COMP1_VS_VREFINT12 +Mcu.Pin54=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin55=VP_SYS_VS_tim17 +Mcu.Pin56=VP_TIM8_VS_ClockSourceINT +Mcu.Pin57=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS +Mcu.Pin5=PC0 Mcu.Pin6=PC1 -PB9.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING Mcu.Pin7=PC2 Mcu.Pin8=PC3 Mcu.Pin9=PA0 -FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,HEAP_NUMBER,configUSE_TIMERS,configUSE_IDLE_HOOK,FootprintOK,configCHECK_FOR_STACK_OVERFLOW,configRECORD_STACK_HIGH_ADDRESS,configGENERATE_RUN_TIME_STATS -RCC.AHBFreq_Value=64000000 -Mcu.Pin0=PC13 -SPI3.DataSize=SPI_DATASIZE_8BIT -Mcu.Pin1=PC14-OSC32_IN (PC14) -TIM8.IPParameters=Channel-Input_Capture2_from_TI2,ICPolarity_CH2,Prescaler,Period -GPIO.groupedBy=Group By Peripherals -Mcu.Pin2=PC15-OSC32_OUT (PC15) -Mcu.Pin3=PH0-OSC_IN (PH0) -Mcu.Pin4=PH1-OSC_OUT (PH1) -Mcu.Pin5=PC0 -ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_4 -PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator -RCC.HSE_VALUE=16000000 -FREERTOS.configUSE_TIMERS=1 +Mcu.PinsNb=58 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L476RGTx +MxCube.Version=6.0.1 +MxDb.Version=DB.6.0.0 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -Mcu.IP10=TIM15 +NVIC.EXTI0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.EXTI15_10_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true +NVIC.EXTI1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.EXTI2_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.EXTI4_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.EXTI9_5_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.OTG_FS_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SavedPendsvIrqHandlerGenerated=true +NVIC.SavedSvcallIrqHandlerGenerated=true +NVIC.SavedSystickIrqHandlerGenerated=true +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:true\:false -Mcu.IP12=USB_DEVICE -Mcu.IP11=USART1 -PB0.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING NVIC.TIM1_TRG_COM_TIM17_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -Mcu.IP13=USB_OTG_FS -RCC.VCOInputFreq_Value=8000000 -TIM5.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -PB5.Mode=TX_Only_Simplex_Unidirect_Master -File.Version=6 -PC13.GPIO_PuPd=GPIO_PULLDOWN -PB7.Signal=GPIO_Input -PB8.Locked=true -PB6.GPIOParameters=GPIO_Speed,GPIO_Label -PB0.Locked=true -FREERTOS.configTOTAL_HEAP_SIZE=40960 -VP_COMP1_VS_VREFINT12.Mode=VREFINT_12 -ProjectManager.ProjectName=cube -PB1.PinState=GPIO_PIN_SET -PB7.GPIO_Label=CC1101_G0 -PB4\ (NJTRST).Locked=true +NVIC.TIM8_CC_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.TimeBase=TIM1_TRG_COM_TIM17_IRQn +NVIC.TimeBaseIP=TIM17 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA0.GPIOParameters=GPIO_Label +PA0.GPIO_Label=IR_RX +PA0.Locked=true +PA0.Signal=ADCx_IN5 +PA1.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PA1.GPIO_Label=BUTTON_DOWN +PA1.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING +PA1.GPIO_PuPd=GPIO_PULLDOWN +PA1.Locked=true +PA1.Signal=GPXTI1 +PA10.Locked=true +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA11.Locked=true +PA11.Mode=Device_Only +PA11.Signal=USB_OTG_FS_DM +PA12.Locked=true +PA12.Mode=Device_Only +PA12.Signal=USB_OTG_FS_DP +PA13\ (JTMS-SWDIO).GPIOParameters=GPIO_Label +PA13\ (JTMS-SWDIO).GPIO_Label=TMS +PA13\ (JTMS-SWDIO).Locked=true +PA13\ (JTMS-SWDIO).Mode=Serial_Wire +PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO +PA14\ (JTCK-SWCLK).GPIOParameters=GPIO_Label +PA14\ (JTCK-SWCLK).GPIO_Label=TCK +PA14\ (JTCK-SWCLK).Locked=true +PA14\ (JTCK-SWCLK).Mode=Serial_Wire +PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK +PA15\ (JTDI).GPIOParameters=PinState,GPIO_Label +PA15\ (JTDI).GPIO_Label=CC1101_CS +PA15\ (JTDI).Locked=true +PA15\ (JTDI).PinState=GPIO_PIN_SET +PA15\ (JTDI).Signal=GPIO_Output +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=DISPLAY_DI +PA2.Locked=true +PA2.Signal=GPIO_Output +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=SPEAKER +PA3.Locked=true +PA3.Signal=S_TIM5_CH4 +PA4.Locked=true +PA4.Signal=GPIO_Analog +PA5.Locked=true +PA5.Signal=GPIO_Analog +PA6.Locked=true PA6.Signal=GPIO_Analog PA7.Locked=true -PB15.GPIO_PuPd=GPIO_PULLDOWN -NVIC.OTG_FS_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true -ProjectManager.ToolChainLocation= -PA2.GPIO_Label=DISPLAY_DI -RCC.LSI_VALUE=32000 -SH.GPXTI0.0=GPIO_EXTI0 -USB_OTG_FS.VirtualMode=Device_Only -VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS -PC14-OSC32_IN\ (PC14).Locked=true -TIM8.Prescaler=64-1 -PC4.Locked=true -SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler,CLKPolarity,CLKPhase -PC5.Signal=COMP1_INP -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 -PA1.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING -PC2.GPIO_Label=CHRG +PA7.Signal=GPIO_Analog +PA8.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PA8.GPIO_Label=LED_RED +PA8.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD +PA8.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA8.Locked=true PA8.PinState=GPIO_PIN_SET -PB15.Locked=true -PB3\ (JTDO-TRACESWO).Locked=true -RCC.PLLSAI1N=12 -PA3.Signal=S_TIM5_CH4 -PA2.Locked=true -RCC.MSI_VALUE=4000000 -RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -PA14\ (JTCK-SWCLK).Mode=Serial_Wire -PB8.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -PB9.GPIO_Label=BUTTON_OK -PA10.Mode=Asynchronous -PC9.GPIO_Label=SD_CS -ProjectManager.NoMain=false -SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler,CLKPolarity,CLKPhase -USB_DEVICE.VirtualModeFS=Cdc_FS -NVIC.SavedSvcallIrqHandlerGenerated=true -PC11.Signal=SPI3_MISO -PC8.Signal=GPIO_Output -PC4.Signal=GPIO_Output -PC10.Mode=Full_Duplex_Master -ProjectManager.DefaultFWLocation=false -PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT -PB12.Locked=true -PA14\ (JTCK-SWCLK).GPIO_Label=TCK -ProjectManager.DeletePrevious=true -PB10.Locked=true -RCC.VCOSAI2OutputFreq_Value=64000000 -boardIOC=true -USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS -RCC.FamilyName=M -PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT -PB9.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -PC8.GPIO_Label=DISPLAY_CS -PC12.GPIOParameters=GPIO_PuPd -USART1.VirtualMode-Asynchronous=VM_ASYNC -FREERTOS.configUSE_IDLE_HOOK=1 +PA8.Signal=GPIO_Output +PA9.Locked=true PA9.Mode=Asynchronous -PB4\ (NJTRST).GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -NVIC.TIM8_CC_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true -PB14.PinState=GPIO_PIN_SET -FREERTOS.configRECORD_STACK_HIGH_ADDRESS=1 -ProjectManager.TargetToolchain=Makefile -PB10.GPIO_Label=DISPLAY_RST -PB7.GPIOParameters=GPIO_Label -VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS -PC5.GPIOParameters=GPIO_Label -PC2.Locked=true -ProjectManager.RegisterCallBack= -PC15-OSC32_OUT\ (PC15).Locked=true -RCC.USBFreq_Value=48000000 -TIM15.IPParameters=Channel-Output Compare1 CH1N -PB14.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD -PA1.Signal=GPXTI1 +PA9.Signal=USART1_TX +PB0.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PB0.GPIO_Label=BUTTON_UP +PB0.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING +PB0.GPIO_PuPd=GPIO_PULLDOWN +PB0.Locked=true +PB0.Signal=GPXTI0 +PB1.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PB1.GPIO_Label=LED_BLUE +PB1.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD +PB1.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM PB1.Locked=true -PB15.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING -PH1-OSC_OUT\ (PH1).Locked=true -board=NUCLEO-L476RG -SPI3.CLKPhase=SPI_PHASE_2EDGE -PC7.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM -RCC.VCOOutputFreq_Value=128000000 -NVIC.SavedSystickIrqHandlerGenerated=true -RCC.APB2Freq_Value=64000000 -RCC.UART4Freq_Value=64000000 -SPI3.CalculateBaudRate=1000.0 KBits/s -MxCube.Version=6.0.1 -PA13\ (JTMS-SWDIO).GPIO_Label=TMS -PC13.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -RCC.PLLSAI1QoutputFreq_Value=48000000 -RCC.ADCFreq_Value=64000000 -SPI3.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_64 -VP_ADC1_Vref_Input.Signal=ADC1_Vref_Input -SH.S_TIM5_CH4.0=TIM5_CH4,PWM Generation4 CH4 -PC2.GPIO_PuPd=GPIO_PULLUP -RCC.UART5Freq_Value=64000000 +PB1.PinState=GPIO_PIN_SET +PB1.Signal=GPIO_Output +PB10.GPIOParameters=GPIO_Label +PB10.GPIO_Label=DISPLAY_RST +PB10.Locked=true +PB10.Signal=GPIO_Output +PB11.GPIOParameters=GPIO_Label +PB11.GPIO_Label=IR_TX +PB11.Locked=true +PB11.Signal=GPIO_Output +PB12.Locked=true +PB12.Signal=GPIO_Analog +PB13.GPIOParameters=GPIO_Label +PB13.GPIO_Label=RFID_OUT +PB13.Locked=true +PB13.Mode=Output Compare1 CH1N +PB13.Signal=TIM15_CH1N +PB14.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PB14.GPIO_Label=LED_GREEN +PB14.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD +PB14.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM +PB14.Locked=true +PB14.PinState=GPIO_PIN_SET +PB14.Signal=GPIO_Output PB15.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI -ADC1.NbrOfConversion=1 -PA15\ (JTDI).GPIO_Label=CC1101_CS -RCC.IPParameters=ADCCLockSelection,ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLM,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PREFETCH_ENABLE,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value -ProjectManager.AskForMigrate=true -Mcu.Name=STM32L476R(C-E-G)Tx -NVIC.SavedPendsvIrqHandlerGenerated=true -PA2.Signal=GPIO_Output +PB15.GPIO_Label=RFID_PULL +PB15.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING +PB15.GPIO_PuPd=GPIO_PULLDOWN +PB15.Locked=true +PB15.Signal=GPXTI15 PB2.Locked=true -Mcu.IP8=TIM5 -VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 -Mcu.IP9=TIM8 -Mcu.IP6=SPI3 -Mcu.IP7=SYS -ProjectManager.CoupleFile=true -NVIC.EXTI0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true -RCC.SYSCLKFreq_VALUE=64000000 -PA1.Locked=true -PA12.Mode=Device_Only -SH.GPXTI4.0=GPIO_EXTI4 -RCC.PLLSAI2PoutputFreq_Value=9142857.142857144 -KeepUserPlacement=false -TIM5.Prescaler=500 - 1 +PB2.Signal=GPIO_Analog +PB3\ (JTDO-TRACESWO).Locked=true +PB3\ (JTDO-TRACESWO).Mode=TX_Only_Simplex_Unidirect_Master +PB3\ (JTDO-TRACESWO).Signal=SPI1_SCK +PB4\ (NJTRST).GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PB4\ (NJTRST).GPIO_Label=BUTTON_LEFT +PB4\ (NJTRST).GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING +PB4\ (NJTRST).GPIO_PuPd=GPIO_PULLDOWN +PB4\ (NJTRST).Locked=true +PB4\ (NJTRST).Signal=GPXTI4 +PB5.Locked=true +PB5.Mode=TX_Only_Simplex_Unidirect_Master +PB5.Signal=SPI1_MOSI +PB6.GPIOParameters=GPIO_Speed,GPIO_Label +PB6.GPIO_Label=DISPLAY_BACKLIGHT +PB6.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PB6.Locked=true +PB6.Signal=GPIO_Output +PB7.GPIOParameters=GPIO_Label +PB7.GPIO_Label=CC1101_G0 +PB7.Locked=true +PB7.Signal=GPIO_Input +PB8.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PB8.GPIO_Label=BUTTON_RIGHT +PB8.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING +PB8.GPIO_PuPd=GPIO_PULLDOWN +PB8.Locked=true +PB8.Signal=GPXTI8 +PB9.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PB9.GPIO_Label=BUTTON_OK +PB9.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING +PB9.GPIO_PuPd=GPIO_PULLDOWN +PB9.Locked=true +PB9.Signal=GPXTI9 +PC0.Locked=true +PC0.Signal=GPIO_Analog +PC1.Locked=true +PC1.Signal=GPIO_Analog +PC10.GPIOParameters=GPIO_PuPd +PC10.GPIO_PuPd=GPIO_PULLDOWN +PC10.Locked=true +PC10.Mode=Full_Duplex_Master +PC10.Signal=SPI3_SCK +PC11.GPIOParameters=GPIO_PuPd +PC11.GPIO_PuPd=GPIO_PULLDOWN +PC11.Locked=true +PC11.Mode=Full_Duplex_Master +PC11.Signal=SPI3_MISO +PC12.GPIOParameters=GPIO_PuPd +PC12.GPIO_PuPd=GPIO_PULLDOWN +PC12.Locked=true +PC12.Mode=Full_Duplex_Master +PC12.Signal=SPI3_MOSI +PC13.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PC13.GPIO_Label=BUTTON_BACK PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING -PC5.GPIO_Label=RFID_RF_IN +PC13.GPIO_PuPd=GPIO_PULLDOWN +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN -SH.GPXTI9.ConfNb=1 -NVIC.EXTI9_5_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true -SH.GPXTI4.ConfNb=1 +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PC2.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PC2.GPIO_Label=CHRG +PC2.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING +PC2.GPIO_PuPd=GPIO_PULLUP +PC2.Locked=true +PC2.Signal=GPXTI2 +PC3.GPIOParameters=GPIO_Label +PC3.GPIO_Label=BATT_V +PC3.Locked=true +PC3.Signal=ADCx_IN4 +PC4.GPIOParameters=PinState,GPIO_Label +PC4.GPIO_Label=NFC_CS +PC4.Locked=true +PC4.PinState=GPIO_PIN_SET +PC4.Signal=GPIO_Output +PC5.GPIOParameters=GPIO_Label +PC5.GPIO_Label=RFID_RF_IN +PC5.Mode=INP +PC5.Signal=COMP1_INP PC6.GPIOParameters=GPIO_Label +PC6.GPIO_Label=VIBRO +PC6.Locked=true +PC6.Signal=GPIO_Output +PC7.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label +PC7.GPIO_Label=iButton +PC7.GPIO_ModeDefaultPP=GPIO_MODE_AF_OD +PC7.GPIO_PuPd=GPIO_NOPULL +PC7.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM +PC7.Locked=true +PC7.Signal=S_TIM8_CH2 +PC8.GPIOParameters=GPIO_Label +PC8.GPIO_Label=DISPLAY_CS +PC8.Locked=true +PC8.Signal=GPIO_Output +PC9.GPIOParameters=PinState,GPIO_Label +PC9.GPIO_Label=SD_CS +PC9.Locked=true +PC9.PinState=GPIO_PIN_SET +PC9.Signal=GPIO_Output +PD2.Locked=true +PD2.Signal=GPIO_Analog +PH0-OSC_IN\ (PH0).Locked=true +PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +PH1-OSC_OUT\ (PH1).Locked=true +PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator +PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=true +ProjectManager.CustomerFirmwarePackage=../../../lib/STM32CubeL4 +ProjectManager.DefaultFWLocation=false +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L476RGTx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.16.0 +ProjectManager.FreePins=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_SPI1_Init-SPI1-false-HAL-true,4-MX_SPI3_Init-SPI3-false-HAL-true,5-MX_ADC1_Init-ADC1-false-HAL-true,6-MX_COMP1_Init-COMP1-false-HAL-true,7-MX_TIM5_Init-TIM5-false-HAL-true,8-MX_TIM15_Init-TIM15-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,11-MX_TIM8_Init-TIM8-false-HAL-true +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=2 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=cube.ioc +ProjectManager.ProjectName=cube +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=Makefile +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +RCC.ADCCLockSelection=RCC_ADCCLKSOURCE_SYSCLK +RCC.ADCFreq_Value=64000000 +RCC.AHBFreq_Value=64000000 +RCC.APB1Freq_Value=64000000 +RCC.APB1TimFreq_Value=64000000 +RCC.APB2Freq_Value=64000000 +RCC.APB2TimFreq_Value=64000000 +RCC.CortexFreq_Value=64000000 +RCC.DFSDMFreq_Value=64000000 +RCC.FamilyName=M +RCC.FCLKCortexFreq_Value=64000000 +RCC.HCLKFreq_Value=64000000 +RCC.HSE_VALUE=16000000 RCC.HSI_VALUE=16000000 -ADC1.NbrOfConversionFlag=1 -SH.GPXTI15.0=GPIO_EXTI15 +RCC.I2C1Freq_Value=64000000 +RCC.I2C2Freq_Value=64000000 +RCC.I2C3Freq_Value=64000000 +RCC.IPParameters=ADCCLockSelection,ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLM,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PREFETCH_ENABLE,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.LPTIM1Freq_Value=64000000 +RCC.LPTIM2Freq_Value=64000000 +RCC.LPUART1Freq_Value=64000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=64000000 +RCC.MSI_VALUE=4000000 RCC.PLLM=2 RCC.PLLN=16 -TIM8.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2 -PB7.Locked=true -PB8.Signal=GPXTI8 -PC8.Locked=true -TIM5.Period=291 -PC9.Signal=GPIO_Output -PA15\ (JTDI).Locked=true -RCC.APB1Freq_Value=64000000 -USB_DEVICE.VirtualMode=Cdc -PB11.Locked=true -ProjectManager.DeviceId=STM32L476RGTx +RCC.PLLPoutputFreq_Value=18285714.285714287 +RCC.PLLQoutputFreq_Value=64000000 +RCC.PLLRCLKFreq_Value=64000000 +RCC.PLLSAI1N=12 +RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 +RCC.PLLSAI1QoutputFreq_Value=48000000 +RCC.PLLSAI1RoutputFreq_Value=48000000 +RCC.PLLSAI2PoutputFreq_Value=9142857.142857144 +RCC.PLLSAI2RoutputFreq_Value=32000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.PREFETCH_ENABLE=1 +RCC.PWRFreq_Value=64000000 +RCC.RNGFreq_Value=48000000 +RCC.SAI1Freq_Value=13714285.714285715 +RCC.SAI2Freq_Value=13714285.714285715 +RCC.SDMMCFreq_Value=48000000 +RCC.SWPMI1Freq_Value=64000000 +RCC.SYSCLKFreq_VALUE=64000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=64000000 +RCC.UART5Freq_Value=64000000 +RCC.USART1Freq_Value=64000000 +RCC.USART2Freq_Value=64000000 +RCC.USART3Freq_Value=64000000 +RCC.USBFreq_Value=48000000 +RCC.VCOInputFreq_Value=8000000 +RCC.VCOOutputFreq_Value=128000000 +RCC.VCOSAI1OutputFreq_Value=96000000 +RCC.VCOSAI2OutputFreq_Value=64000000 +SH.ADCx_IN4.0=ADC1_IN4,IN4-Single-Ended +SH.ADCx_IN4.ConfNb=1 +SH.ADCx_IN5.0=ADC1_IN5,IN5-Single-Ended +SH.ADCx_IN5.ConfNb=1 +SH.GPXTI0.0=GPIO_EXTI0 +SH.GPXTI0.ConfNb=1 +SH.GPXTI1.0=GPIO_EXTI1 +SH.GPXTI1.ConfNb=1 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +SH.GPXTI15.0=GPIO_EXTI15 +SH.GPXTI15.ConfNb=1 +SH.GPXTI2.0=GPIO_EXTI2 +SH.GPXTI2.ConfNb=1 +SH.GPXTI4.0=GPIO_EXTI4 +SH.GPXTI4.ConfNb=1 +SH.GPXTI8.0=GPIO_EXTI8 +SH.GPXTI8.ConfNb=1 +SH.GPXTI9.0=GPIO_EXTI9 +SH.GPXTI9.ConfNb=1 +SH.S_TIM5_CH4.0=TIM5_CH4,PWM Generation4 CH4 +SH.S_TIM5_CH4.ConfNb=1 +SH.S_TIM8_CH2.0=TIM8_CH2,Input_Capture2_from_TI2 SH.S_TIM8_CH2.ConfNb=1 -PB12.Signal=GPIO_Analog -ProjectManager.LibraryCopy=2 -PB0.GPIO_PuPd=GPIO_PULLDOWN -PA3.GPIO_Label=SPEAKER -PB1.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP -PA7.Signal=GPIO_Analog -PB4\ (NJTRST).Signal=GPXTI4 -PA6.Locked=true +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 +SPI1.CalculateBaudRate=4.0 MBits/s +SPI1.CLKPhase=SPI_PHASE_1EDGE +SPI1.CLKPolarity=SPI_POLARITY_LOW +SPI1.DataSize=SPI_DATASIZE_8BIT +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler,CLKPolarity,CLKPhase +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +SPI3.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_64 +SPI3.CalculateBaudRate=1000.0 KBits/s +SPI3.CLKPhase=SPI_PHASE_2EDGE +SPI3.CLKPolarity=SPI_POLARITY_LOW +SPI3.DataSize=SPI_DATASIZE_8BIT +SPI3.Direction=SPI_DIRECTION_2LINES +SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler,CLKPolarity,CLKPhase +SPI3.Mode=SPI_MODE_MASTER +SPI3.VirtualType=VM_MASTER +TIM15.Channel-Output\ Compare1\ CH1N=TIM_CHANNEL_1 +TIM15.IPParameters=Channel-Output Compare1 CH1N +TIM5.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 +TIM5.IPParameters=Prescaler,Period,Channel-PWM Generation4 CH4,Pulse-PWM Generation4 CH4 +TIM5.Period=291 +TIM5.Prescaler=500 - 1 +TIM5.Pulse-PWM\ Generation4\ CH4=145 +TIM8.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2 +TIM8.ICPolarity_CH2=TIM_INPUTCHANNELPOLARITY_BOTHEDGE +TIM8.IPParameters=Channel-Input_Capture2_from_TI2,ICPolarity_CH2,Prescaler,Period +TIM8.Period=32768-1 +TIM8.Prescaler=64-1 +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +USB_DEVICE.CLASS_NAME_FS=CDC +USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS +USB_DEVICE.VirtualMode=Cdc +USB_DEVICE.VirtualModeFS=Cdc_FS +USB_OTG_FS.IPParameters=VirtualMode +USB_OTG_FS.VirtualMode=Device_Only +VP_ADC1_TempSens_Input.Mode=IN-TempSens +VP_ADC1_TempSens_Input.Signal=ADC1_TempSens_Input +VP_ADC1_Vref_Input.Mode=IN-Vrefint +VP_ADC1_Vref_Input.Signal=ADC1_Vref_Input +VP_COMP1_VS_VREFINT12.Mode=VREFINT_12 +VP_COMP1_VS_VREFINT12.Signal=COMP1_VS_VREFINT12 +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_SYS_VS_tim17.Mode=TIM17 +VP_SYS_VS_tim17.Signal=SYS_VS_tim17 +VP_TIM8_VS_ClockSourceINT.Mode=Internal +VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT +VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS +VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS diff --git a/firmware/targets/f2/target.mk b/firmware/targets/f2/target.mk index 2359df93..e10c4013 100644 --- a/firmware/targets/f2/target.mk +++ b/firmware/targets/f2/target.mk @@ -1,5 +1,7 @@ TOOLCHAIN = arm +DEBUG_AGENT = set -m; st-util -n --semihosting + BOOT_ADDRESS = 0x08000000 FW_ADDRESS = 0x08008000 OS_OFFSET = 0x00008000 diff --git a/firmware/targets/local/api-hal/api-hal-resources.h b/firmware/targets/local/api-hal/api-hal-resources.h new file mode 100644 index 00000000..e69de29b diff --git a/lib/ST25RFAL002/doc/_htmresc/st_logo.png b/lib/ST25RFAL002/doc/_htmresc/st_logo.png index 068f0346286e8c4b94aebbfd1e363f7f96d0fcb2..8b80057fd3a454a97de1c9d732b7fede82c83227 100755 GIT binary patch literal 18616 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 literal 130 zcmWN{I}*Ym5CG7gQ*Z$T3kxi{4PRkKB_kw-r#IDW-c`P{j}LEa9dj4r+1KM$=XTr9 zxTWzH^C(GNz(&t}wxEpNBRPU(OO_rZf(wA57IIE0n+cPwma^0ewJL~2cgzG{8xy=% NDYMysg#%fz><`P`Cba+n diff --git a/lib/ST25RFAL002/platform.c b/lib/ST25RFAL002/platform.c index 49126b8f..aa0e235f 100644 --- a/lib/ST25RFAL002/platform.c +++ b/lib/ST25RFAL002/platform.c @@ -1,14 +1,16 @@ #include "platform.h" #include +#include +#include HAL_StatusTypeDef platformSpiTxRx(const uint8_t *txBuf, uint8_t *rxBuf, uint16_t len) { HAL_StatusTypeDef ret; if (txBuf && rxBuf) { - ret = HAL_SPI_TransmitReceive(&hspi3, (uint8_t*)txBuf, rxBuf, len, HAL_MAX_DELAY); + ret = HAL_SPI_TransmitReceive(&SPI_R, (uint8_t*)txBuf, rxBuf, len, HAL_MAX_DELAY); } else if (txBuf) { - ret = HAL_SPI_Transmit(&hspi3, (uint8_t*)txBuf, len, HAL_MAX_DELAY); + ret = HAL_SPI_Transmit(&SPI_R, (uint8_t*)txBuf, len, HAL_MAX_DELAY); } else if (rxBuf) { - ret = HAL_SPI_Receive(&hspi3, (uint8_t*)rxBuf, len, HAL_MAX_DELAY); + ret = HAL_SPI_Receive(&SPI_R, (uint8_t*)rxBuf, len, HAL_MAX_DELAY); } if(ret != HAL_OK) { @@ -20,27 +22,7 @@ HAL_StatusTypeDef platformSpiTxRx(const uint8_t *txBuf, uint8_t *rxBuf, uint16_t void platformProtectST25RComm() { - if (HAL_SPI_DeInit(&hspi3) != HAL_OK) { - Error_Handler(); - } - - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_8BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi3.Init.CLKPhase = SPI_PHASE_2EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 7; - hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - - if (HAL_SPI_Init(&hspi3) != HAL_OK) { - Error_Handler(); - } + NFC_SPI_Reconfigure(); } void platformUnprotectST25RComm() diff --git a/lib/ST25RFAL002/platform.h b/lib/ST25RFAL002/platform.h index 119eb225..6db86393 100644 --- a/lib/ST25RFAL002/platform.h +++ b/lib/ST25RFAL002/platform.h @@ -5,7 +5,7 @@ #include #include #include -#include "stm32l4xx_hal.h" +#include #include "timer.h" #include "math.h" #include "spi.h" @@ -18,8 +18,8 @@ void platformUnprotectST25RComm(); #define ST25R_SS_PIN NFC_CS_Pin #define ST25R_SS_PORT NFC_CS_GPIO_Port -#define ST25R_INT_PIN RFID_PULL_Pin -#define ST25R_INT_PORT RFID_PULL_GPIO_Port +#define ST25R_INT_PIN NFC_IRQ_Pin +#define ST25R_INT_PORT NFC_IRQ_GPIO_Port #define RFAL_FEATURE_LISTEN_MODE true /*!< Enable/Disable RFAL support for Listen Mode */ #define RFAL_FEATURE_WAKEUP_MODE true /*!< Enable/Disable RFAL support for the Wake-Up mode */ diff --git a/make/base.mk b/make/base.mk index 332671fb..60df6840 100644 --- a/make/base.mk +++ b/make/base.mk @@ -2,4 +2,9 @@ OBJ_DIR = .obj ASM_SOURCES = C_SOURCES = CPP_SOURCES = -ASSETS = \ No newline at end of file +ASSETS = +DEBUG_AGENT = + +CFLAGS = +CPPFLAGS = +LDFLAGS = \ No newline at end of file diff --git a/make/rules.mk b/make/rules.mk index a018ec80..c5b229d6 100644 --- a/make/rules.mk +++ b/make/rules.mk @@ -11,7 +11,7 @@ OBJECTS += $(addprefix $(OBJ_DIR)/, $(notdir $(CPP_SOURCES:.cpp=.o))) # Generate dependencies DEPS = $(OBJECTS:.o=.d) -$(shell mkdir -p $(OBJ_DIR)) +$(shell test -d $(OBJ_DIR) || mkdir -p $(OBJ_DIR)) BUILD_FLAGS_SHELL=\ echo "$(CFLAGS)" > $(OBJ_DIR)/BUILD_FLAGS.tmp; \ @@ -71,14 +71,27 @@ flash: $(OBJ_DIR)/flash upload: $(OBJ_DIR)/upload debug: flash - set -m; st-util -n --semihosting & echo $$! > $(OBJ_DIR)/st-util.PID + $(DEBUG_AGENT) & echo $$! > $(OBJ_DIR)/agent.PID arm-none-eabi-gdb \ -ex "target extended-remote 127.0.0.1:4242" \ -ex "set confirm off" \ -ex "source ../debug/FreeRTOS/FreeRTOS.py" \ $(OBJ_DIR)/$(PROJECT).elf; \ - kill `cat $(OBJ_DIR)/st-util.PID`; \ - rm $(OBJ_DIR)/st-util.PID + kill `cat $(OBJ_DIR)/agent.PID`; \ + rm $(OBJ_DIR)/agent.PID + +bm_debug: flash + set -m; blackmagic & echo $$! > $(OBJ_DIR)/agent.PID + arm-none-eabi-gdb \ + -ex "target extended-remote 127.0.0.1:2000" \ + -ex "set confirm off" \ + -ex "monitor debug_bmp enable"\ + -ex "monitor swdp_scan"\ + -ex "attach 1"\ + -ex "source ../debug/FreeRTOS/FreeRTOS.py" \ + $(OBJ_DIR)/$(PROJECT).elf; \ + kill `cat $(OBJ_DIR)/agent.PID`; \ + rm $(OBJ_DIR)/agent.PID clean: @echo "\tCLEAN\t" @@ -95,6 +108,7 @@ zzz: clean $(MAKE) debug FORMAT_SOURCES := $(shell find ../applications -iname "*.h" -o -iname "*.c" -o -iname "*.cpp") +FORMAT_SOURCES += $(shell find ../bootloader -iname "*.h" -o -iname "*.c" -o -iname "*.cpp") FORMAT_SOURCES += $(shell find ../core -iname "*.h" -o -iname "*.c" -o -iname "*.cpp") format: diff --git a/make/toolchain.mk b/make/toolchain.mk index ef660c0e..84e113b9 100644 --- a/make/toolchain.mk +++ b/make/toolchain.mk @@ -21,6 +21,6 @@ else CFLAGS += -DNDEBUG -Os endif -CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -CPPFLAGS = -fno-threadsafe-statics -LDFLAGS += -Wl,-Map=$(OBJ_DIR)/$(PROJECT).map,--cref -Wl,--gc-sections -Wl,--undefined=uxTopUsedPriority +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" +CPPFLAGS += -fno-threadsafe-statics +LDFLAGS += -Wl,-Map=$(OBJ_DIR)/$(PROJECT).map,--cref -Wl,--gc-sections -Wl,--undefined=uxTopUsedPriority