[FL-2733] multitarget support for fbt (#2209)
* First part of multitarget porting * Delete firmware/targets/f7/Inc directory * Delete firmware/targets/f7/Src directory * gpio: cli fixes; about: using version from HAL * sdk: path fixes * gui: include fixes * applications: more include fixes * gpio: ported to new apis * hal: introduced furi_hal_target_hw.h; libs: added one_wire * hal: f18 target * github: also build f18 by default * typo fix * fbt: removed extra checks on app list * api: explicitly bundling select mlib headers with sdk * hal: f18: changed INPUT_DEBOUNCE_TICKS to match f7 * cleaned up commented out code * docs: added info on hw targets * docs: targets: formatting fixes * f18: fixed link error * f18: fixed API version to match f7 * docs: hardware: minor wording fixes * faploader: added fw target check * docs: typo fixes * github: not building komi target by default * fbt: support for `targets` field for built-in apps * github: reworked build flow to exclude app_set; fbt: removed komi-specific appset; added additional target buildset check * github: fixed build; nfc: fixed pvs warnings * attempt to fix target id * f7, f18: removed certain HAL function from public API * apps: debug: enabled bt_debug_app for f18 * Targets: backport input pins configuration routine from F7 to F18 Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									1eda913367
								
							
						
					
					
						commit
						224d0aefe4
					
				
							
								
								
									
										11
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@ -10,7 +10,7 @@ on:
 | 
				
			|||||||
  pull_request:
 | 
					  pull_request:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
env:
 | 
					env:
 | 
				
			||||||
  TARGETS: f7
 | 
					  TARGETS: f7 f18
 | 
				
			||||||
  DEFAULT_TARGET: f7
 | 
					  DEFAULT_TARGET: f7
 | 
				
			||||||
  FBT_TOOLCHAIN_PATH: /runner/_work
 | 
					  FBT_TOOLCHAIN_PATH: /runner/_work
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -60,8 +60,9 @@ jobs:
 | 
				
			|||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          set -e
 | 
					          set -e
 | 
				
			||||||
          for TARGET in ${TARGETS}; do
 | 
					          for TARGET in ${TARGETS}; do
 | 
				
			||||||
                ./fbt TARGET_HW="$(echo "${TARGET}" | sed 's/f//')" \
 | 
					            TARGET="$(echo "${TARGET}" | sed 's/f//')"; \
 | 
				
			||||||
                copro_dist updater_package ${{ startsWith(github.ref, 'refs/tags') && 'DEBUG=0 COMPACT=1' || '' }}
 | 
					            ./fbt TARGET_HW=$TARGET copro_dist updater_package \
 | 
				
			||||||
 | 
					            ${{ startsWith(github.ref, 'refs/tags') && 'DEBUG=0 COMPACT=1' || '' }}
 | 
				
			||||||
          done
 | 
					          done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: 'Move upload files'
 | 
					      - name: 'Move upload files'
 | 
				
			||||||
@ -186,6 +187,6 @@ jobs:
 | 
				
			|||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          set -e
 | 
					          set -e
 | 
				
			||||||
          for TARGET in ${TARGETS}; do
 | 
					          for TARGET in ${TARGETS}; do
 | 
				
			||||||
                ./fbt TARGET_HW="$(echo "${TARGET}" | sed 's/f//')" \
 | 
					            TARGET="$(echo "${TARGET}" | sed 's/f//')"; \
 | 
				
			||||||
                updater_package DEBUG=0 COMPACT=1
 | 
					            ./fbt TARGET_HW=$TARGET DEBUG=0 COMPACT=1 updater_package 
 | 
				
			||||||
          done
 | 
					          done
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/pvs_studio.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/pvs_studio.yml
									
									
									
									
										vendored
									
									
								
							@ -89,6 +89,6 @@ jobs:
 | 
				
			|||||||
      - name: 'Raise exception'
 | 
					      - name: 'Raise exception'
 | 
				
			||||||
        if: ${{ steps.pvs-warn.outputs.warnings != 0 }}
 | 
					        if: ${{ steps.pvs-warn.outputs.warnings != 0 }}
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          echo "Please fix all PVS varnings before merge"
 | 
					          echo "Please fix all PVS warnings before merge"
 | 
				
			||||||
          exit 1
 | 
					          exit 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							@ -11,5 +11,8 @@
 | 
				
			|||||||
		"augustocdias.tasks-shell-input"
 | 
							"augustocdias.tasks-shell-input"
 | 
				
			||||||
	],
 | 
						],
 | 
				
			||||||
	// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
 | 
						// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
 | 
				
			||||||
	"unwantedRecommendations": []
 | 
						"unwantedRecommendations": [
 | 
				
			||||||
 | 
							"twxs.cmake",
 | 
				
			||||||
 | 
							"ms-vscode.cmake-tools"
 | 
				
			||||||
 | 
						]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="accessor",
 | 
					    appid="accessor",
 | 
				
			||||||
    name="Accessor",
 | 
					    name="Accessor",
 | 
				
			||||||
    apptype=FlipperAppType.DEBUG,
 | 
					    apptype=FlipperAppType.DEBUG,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="accessor_app",
 | 
					    entry_point="accessor_app",
 | 
				
			||||||
    cdefines=["APP_ACCESSOR"],
 | 
					    cdefines=["APP_ACCESSOR"],
 | 
				
			||||||
    requires=["gui"],
 | 
					    requires=["gui"],
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include "bt_carrier_test.h"
 | 
					#include "bt_carrier_test.h"
 | 
				
			||||||
#include "bt_test.h"
 | 
					#include "bt_test.h"
 | 
				
			||||||
#include "bt_test_types.h"
 | 
					#include "bt_test_types.h"
 | 
				
			||||||
#include "furi_hal_bt.h"
 | 
					#include <furi_hal_bt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct BtCarrierTest {
 | 
					struct BtCarrierTest {
 | 
				
			||||||
    BtTest* bt_test;
 | 
					    BtTest* bt_test;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include "bt_packet_test.h"
 | 
					#include "bt_packet_test.h"
 | 
				
			||||||
#include "bt_test.h"
 | 
					#include "bt_test.h"
 | 
				
			||||||
#include "bt_test_types.h"
 | 
					#include "bt_test_types.h"
 | 
				
			||||||
#include "furi_hal_bt.h"
 | 
					#include <furi_hal_bt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct BtPacketTest {
 | 
					struct BtPacketTest {
 | 
				
			||||||
    BtTest* bt_test;
 | 
					    BtTest* bt_test;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,11 @@
 | 
				
			|||||||
#include <file_browser_test_icons.h>
 | 
					 | 
				
			||||||
#include "file_browser_app_i.h"
 | 
					#include "file_browser_app_i.h"
 | 
				
			||||||
#include "gui/modules/file_browser.h"
 | 
					#include <file_browser_test_icons.h>
 | 
				
			||||||
#include <furi.h>
 | 
					
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <gui/modules/file_browser.h>
 | 
				
			||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
#include <lib/toolbox/path.h>
 | 
					#include <lib/toolbox/path.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <furi_hal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool file_browser_app_custom_event_callback(void* context, uint32_t event) {
 | 
					static bool file_browser_app_custom_event_callback(void* context, uint32_t event) {
 | 
				
			||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="lfrfid_debug",
 | 
					    appid="lfrfid_debug",
 | 
				
			||||||
    name="LF-RFID Debug",
 | 
					    name="LF-RFID Debug",
 | 
				
			||||||
    apptype=FlipperAppType.DEBUG,
 | 
					    apptype=FlipperAppType.DEBUG,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="lfrfid_debug_app",
 | 
					    entry_point="lfrfid_debug_app",
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
        "gui",
 | 
					        "gui",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,11 @@
 | 
				
			|||||||
#include <archive/views/archive_browser_view.h>
 | 
					 | 
				
			||||||
#include "archive_files.h"
 | 
					#include "archive_files.h"
 | 
				
			||||||
#include "archive_apps.h"
 | 
					#include "archive_apps.h"
 | 
				
			||||||
#include "archive_browser.h"
 | 
					#include "archive_browser.h"
 | 
				
			||||||
 | 
					#include "../views/archive_browser_view.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <core/common_defines.h>
 | 
					#include <core/common_defines.h>
 | 
				
			||||||
#include <core/log.h>
 | 
					#include <core/log.h>
 | 
				
			||||||
#include "gui/modules/file_browser_worker.h"
 | 
					#include <gui/modules/file_browser_worker.h>
 | 
				
			||||||
#include <fap_loader/fap_loader_app.h>
 | 
					#include <fap_loader/fap_loader_app.h>
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,15 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../helpers/archive_files.h"
 | 
				
			||||||
 | 
					#include "../helpers/archive_favorites.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gui/gui_i.h>
 | 
					#include <gui/gui_i.h>
 | 
				
			||||||
#include <gui/view.h>
 | 
					#include <gui/view.h>
 | 
				
			||||||
#include <gui/canvas.h>
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
#include <furi.h>
 | 
					#include <gui/modules/file_browser_worker.h>
 | 
				
			||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
#include "../helpers/archive_files.h"
 | 
					#include <furi.h>
 | 
				
			||||||
#include "../helpers/archive_favorites.h"
 | 
					 | 
				
			||||||
#include "gui/modules/file_browser_worker.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_LEN_PX 110
 | 
					#define MAX_LEN_PX 110
 | 
				
			||||||
#define MAX_NAME_LEN 255
 | 
					#define MAX_NAME_LEN 255
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
#include "../bad_usb_app_i.h"
 | 
					#include "../bad_usb_app_i.h"
 | 
				
			||||||
#include "furi_hal_power.h"
 | 
					#include <furi_hal_power.h>
 | 
				
			||||||
#include "furi_hal_usb.h"
 | 
					#include <furi_hal_usb.h>
 | 
				
			||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool bad_usb_file_select(BadUsbApp* bad_usb) {
 | 
					static bool bad_usb_file_select(BadUsbApp* bad_usb) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include "../bad_usb_script.h"
 | 
					#include "../bad_usb_script.h"
 | 
				
			||||||
#include "../bad_usb_app_i.h"
 | 
					#include "../bad_usb_app_i.h"
 | 
				
			||||||
#include "../views/bad_usb_view.h"
 | 
					#include "../views/bad_usb_view.h"
 | 
				
			||||||
#include "furi_hal.h"
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include "toolbox/path.h"
 | 
					#include "toolbox/path.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void bad_usb_scene_work_ok_callback(InputType type, void* context) {
 | 
					void bad_usb_scene_work_ok_callback(InputType type, void* context) {
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,7 @@ GpioApp* gpio_app_alloc() {
 | 
				
			|||||||
    GpioApp* app = malloc(sizeof(GpioApp));
 | 
					    GpioApp* app = malloc(sizeof(GpioApp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app->gui = furi_record_open(RECORD_GUI);
 | 
					    app->gui = furi_record_open(RECORD_GUI);
 | 
				
			||||||
 | 
					    app->gpio_items = gpio_items_alloc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app->view_dispatcher = view_dispatcher_alloc();
 | 
					    app->view_dispatcher = view_dispatcher_alloc();
 | 
				
			||||||
    app->scene_manager = scene_manager_alloc(&gpio_scene_handlers, app);
 | 
					    app->scene_manager = scene_manager_alloc(&gpio_scene_handlers, app);
 | 
				
			||||||
@ -47,7 +48,7 @@ GpioApp* gpio_app_alloc() {
 | 
				
			|||||||
        app->view_dispatcher,
 | 
					        app->view_dispatcher,
 | 
				
			||||||
        GpioAppViewVarItemList,
 | 
					        GpioAppViewVarItemList,
 | 
				
			||||||
        variable_item_list_get_view(app->var_item_list));
 | 
					        variable_item_list_get_view(app->var_item_list));
 | 
				
			||||||
    app->gpio_test = gpio_test_alloc();
 | 
					    app->gpio_test = gpio_test_alloc(app->gpio_items);
 | 
				
			||||||
    view_dispatcher_add_view(
 | 
					    view_dispatcher_add_view(
 | 
				
			||||||
        app->view_dispatcher, GpioAppViewGpioTest, gpio_test_get_view(app->gpio_test));
 | 
					        app->view_dispatcher, GpioAppViewGpioTest, gpio_test_get_view(app->gpio_test));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -91,6 +92,7 @@ void gpio_app_free(GpioApp* app) {
 | 
				
			|||||||
    furi_record_close(RECORD_GUI);
 | 
					    furi_record_close(RECORD_GUI);
 | 
				
			||||||
    furi_record_close(RECORD_NOTIFICATION);
 | 
					    furi_record_close(RECORD_NOTIFICATION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gpio_items_free(app->gpio_items);
 | 
				
			||||||
    free(app);
 | 
					    free(app);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "gpio_app.h"
 | 
					#include "gpio_app.h"
 | 
				
			||||||
#include "gpio_item.h"
 | 
					#include "gpio_items.h"
 | 
				
			||||||
#include "scenes/gpio_scene.h"
 | 
					#include "scenes/gpio_scene.h"
 | 
				
			||||||
#include "gpio_custom_event.h"
 | 
					#include "gpio_custom_event.h"
 | 
				
			||||||
#include "usb_uart_bridge.h"
 | 
					#include "usb_uart_bridge.h"
 | 
				
			||||||
@ -28,6 +28,7 @@ struct GpioApp {
 | 
				
			|||||||
    VariableItem* var_item_flow;
 | 
					    VariableItem* var_item_flow;
 | 
				
			||||||
    GpioTest* gpio_test;
 | 
					    GpioTest* gpio_test;
 | 
				
			||||||
    GpioUsbUart* gpio_usb_uart;
 | 
					    GpioUsbUart* gpio_usb_uart;
 | 
				
			||||||
 | 
					    GPIOItems* gpio_items;
 | 
				
			||||||
    UsbUartBridge* usb_uart_bridge;
 | 
					    UsbUartBridge* usb_uart_bridge;
 | 
				
			||||||
    UsbUartConfig* usb_uart_cfg;
 | 
					    UsbUartConfig* usb_uart_cfg;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -1,51 +0,0 @@
 | 
				
			|||||||
#include "gpio_item.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <furi_hal_resources.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct {
 | 
					 | 
				
			||||||
    const char* name;
 | 
					 | 
				
			||||||
    const GpioPin* pin;
 | 
					 | 
				
			||||||
} GpioItem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const GpioItem gpio_item[GPIO_ITEM_COUNT] = {
 | 
					 | 
				
			||||||
    {"1.2: PA7", &gpio_ext_pa7},
 | 
					 | 
				
			||||||
    {"1.3: PA6", &gpio_ext_pa6},
 | 
					 | 
				
			||||||
    {"1.4: PA4", &gpio_ext_pa4},
 | 
					 | 
				
			||||||
    {"1.5: PB3", &gpio_ext_pb3},
 | 
					 | 
				
			||||||
    {"1.6: PB2", &gpio_ext_pb2},
 | 
					 | 
				
			||||||
    {"1.7: PC3", &gpio_ext_pc3},
 | 
					 | 
				
			||||||
    {"2.7: PC1", &gpio_ext_pc1},
 | 
					 | 
				
			||||||
    {"2.8: PC0", &gpio_ext_pc0},
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_configure_pin(uint8_t index, GpioMode mode) {
 | 
					 | 
				
			||||||
    furi_assert(index < GPIO_ITEM_COUNT);
 | 
					 | 
				
			||||||
    furi_hal_gpio_write(gpio_item[index].pin, false);
 | 
					 | 
				
			||||||
    furi_hal_gpio_init(gpio_item[index].pin, mode, GpioPullNo, GpioSpeedVeryHigh);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_configure_all_pins(GpioMode mode) {
 | 
					 | 
				
			||||||
    for(uint8_t i = 0; i < GPIO_ITEM_COUNT; i++) {
 | 
					 | 
				
			||||||
        gpio_item_configure_pin(i, mode);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_set_pin(uint8_t index, bool level) {
 | 
					 | 
				
			||||||
    furi_assert(index < GPIO_ITEM_COUNT);
 | 
					 | 
				
			||||||
    furi_hal_gpio_write(gpio_item[index].pin, level);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_set_all_pins(bool level) {
 | 
					 | 
				
			||||||
    for(uint8_t i = 0; i < GPIO_ITEM_COUNT; i++) {
 | 
					 | 
				
			||||||
        gpio_item_set_pin(i, level);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const char* gpio_item_get_pin_name(uint8_t index) {
 | 
					 | 
				
			||||||
    furi_assert(index < GPIO_ITEM_COUNT + 1);
 | 
					 | 
				
			||||||
    if(index == GPIO_ITEM_COUNT) {
 | 
					 | 
				
			||||||
        return "ALL";
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        return gpio_item[index].name;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,15 +0,0 @@
 | 
				
			|||||||
#pragma once
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <furi_hal_gpio.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GPIO_ITEM_COUNT 8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_configure_pin(uint8_t index, GpioMode mode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_configure_all_pins(GpioMode mode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_set_pin(uint8_t index, bool level);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpio_item_set_all_pins(bool level);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const char* gpio_item_get_pin_name(uint8_t index);
 | 
					 | 
				
			||||||
							
								
								
									
										69
									
								
								applications/main/gpio/gpio_items.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								applications/main/gpio/gpio_items.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					#include "gpio_items.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct GPIOItems {
 | 
				
			||||||
 | 
					    GpioPinRecord* pins;
 | 
				
			||||||
 | 
					    size_t count;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GPIOItems* gpio_items_alloc() {
 | 
				
			||||||
 | 
					    GPIOItems* items = malloc(sizeof(GPIOItems));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    items->count = 0;
 | 
				
			||||||
 | 
					    for(size_t i = 0; i < gpio_pins_count; i++) {
 | 
				
			||||||
 | 
					        if(!gpio_pins[i].debug) {
 | 
				
			||||||
 | 
					            items->count++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    items->pins = malloc(sizeof(GpioPinRecord) * items->count);
 | 
				
			||||||
 | 
					    for(size_t i = 0; i < items->count; i++) {
 | 
				
			||||||
 | 
					        if(!gpio_pins[i].debug) {
 | 
				
			||||||
 | 
					            items->pins[i].pin = gpio_pins[i].pin;
 | 
				
			||||||
 | 
					            items->pins[i].name = gpio_pins[i].name;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return items;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_free(GPIOItems* items) {
 | 
				
			||||||
 | 
					    free(items->pins);
 | 
				
			||||||
 | 
					    free(items);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t gpio_items_get_count(GPIOItems* items) {
 | 
				
			||||||
 | 
					    return items->count;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_configure_pin(GPIOItems* items, uint8_t index, GpioMode mode) {
 | 
				
			||||||
 | 
					    furi_assert(index < items->count);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(items->pins[index].pin, false);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(items->pins[index].pin, mode, GpioPullNo, GpioSpeedVeryHigh);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_configure_all_pins(GPIOItems* items, GpioMode mode) {
 | 
				
			||||||
 | 
					    for(uint8_t i = 0; i < items->count; i++) {
 | 
				
			||||||
 | 
					        gpio_items_configure_pin(items, i, mode);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_set_pin(GPIOItems* items, uint8_t index, bool level) {
 | 
				
			||||||
 | 
					    furi_assert(index < items->count);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(items->pins[index].pin, level);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_set_all_pins(GPIOItems* items, bool level) {
 | 
				
			||||||
 | 
					    for(uint8_t i = 0; i < items->count; i++) {
 | 
				
			||||||
 | 
					        gpio_items_set_pin(items, i, level);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char* gpio_items_get_pin_name(GPIOItems* items, uint8_t index) {
 | 
				
			||||||
 | 
					    furi_assert(index < items->count + 1);
 | 
				
			||||||
 | 
					    if(index == items->count) {
 | 
				
			||||||
 | 
					        return "ALL";
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        return items->pins[index].name;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										29
									
								
								applications/main/gpio/gpio_items.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								applications/main/gpio/gpio_items.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <furi_hal_gpio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct GPIOItems GPIOItems;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GPIOItems* gpio_items_alloc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_free(GPIOItems* items);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t gpio_items_get_count(GPIOItems* items);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_configure_pin(GPIOItems* items, uint8_t index, GpioMode mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_configure_all_pins(GPIOItems* items, GpioMode mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_set_pin(GPIOItems* items, uint8_t index, bool level);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void gpio_items_set_all_pins(GPIOItems* items, bool level);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char* gpio_items_get_pin_name(GPIOItems* items, uint8_t index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
#include "../gpio_app_i.h"
 | 
					#include "../gpio_app_i.h"
 | 
				
			||||||
#include "furi_hal_power.h"
 | 
					#include <furi_hal_power.h>
 | 
				
			||||||
#include "furi_hal_usb.h"
 | 
					#include <furi_hal_usb.h>
 | 
				
			||||||
#include <dolphin/dolphin.h>
 | 
					#include <dolphin/dolphin.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum GpioItem {
 | 
					enum GpioItem {
 | 
				
			||||||
 | 
				
			|||||||
@ -12,8 +12,9 @@ void gpio_scene_test_ok_callback(InputType type, void* context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void gpio_scene_test_on_enter(void* context) {
 | 
					void gpio_scene_test_on_enter(void* context) {
 | 
				
			||||||
 | 
					    furi_assert(context);
 | 
				
			||||||
    GpioApp* app = context;
 | 
					    GpioApp* app = context;
 | 
				
			||||||
    gpio_item_configure_all_pins(GpioModeOutputPushPull);
 | 
					    gpio_items_configure_all_pins(app->gpio_items, GpioModeOutputPushPull);
 | 
				
			||||||
    gpio_test_set_ok_callback(app->gpio_test, gpio_scene_test_ok_callback, app);
 | 
					    gpio_test_set_ok_callback(app->gpio_test, gpio_scene_test_ok_callback, app);
 | 
				
			||||||
    view_dispatcher_switch_to_view(app->view_dispatcher, GpioAppViewGpioTest);
 | 
					    view_dispatcher_switch_to_view(app->view_dispatcher, GpioAppViewGpioTest);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -25,6 +26,7 @@ bool gpio_scene_test_on_event(void* context, SceneManagerEvent event) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void gpio_scene_test_on_exit(void* context) {
 | 
					void gpio_scene_test_on_exit(void* context) {
 | 
				
			||||||
    UNUSED(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
    gpio_item_configure_all_pins(GpioModeAnalog);
 | 
					    GpioApp* app = context;
 | 
				
			||||||
 | 
					    gpio_items_configure_all_pins(app->gpio_items, GpioModeAnalog);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
#include "../usb_uart_bridge.h"
 | 
					#include "../usb_uart_bridge.h"
 | 
				
			||||||
#include "../gpio_app_i.h"
 | 
					#include "../gpio_app_i.h"
 | 
				
			||||||
#include "furi_hal.h"
 | 
					#include <furi_hal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
    UsbUartLineIndexVcp,
 | 
					    UsbUartLineIndexVcp,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
#include "usb_uart_bridge.h"
 | 
					#include "usb_uart_bridge.h"
 | 
				
			||||||
#include "furi_hal.h"
 | 
					 | 
				
			||||||
#include <furi_hal_usb_cdc.h>
 | 
					 | 
				
			||||||
#include "usb_cdc.h"
 | 
					#include "usb_cdc.h"
 | 
				
			||||||
#include "cli/cli_vcp.h"
 | 
					#include <cli/cli_vcp.h>
 | 
				
			||||||
 | 
					#include <cli/cli.h>
 | 
				
			||||||
#include <toolbox/api_lock.h>
 | 
					#include <toolbox/api_lock.h>
 | 
				
			||||||
#include "cli/cli.h"
 | 
					#include <furi_hal.h>
 | 
				
			||||||
 | 
					#include <furi_hal_usb_cdc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define USB_CDC_PKT_LEN CDC_DATA_SZ
 | 
					#define USB_CDC_PKT_LEN CDC_DATA_SZ
 | 
				
			||||||
#define USB_UART_RX_BUF_SIZE (USB_CDC_PKT_LEN * 5)
 | 
					#define USB_UART_RX_BUF_SIZE (USB_CDC_PKT_LEN * 5)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "gpio_test.h"
 | 
					#include "gpio_test.h"
 | 
				
			||||||
#include "../gpio_item.h"
 | 
					#include "../gpio_items.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -11,6 +11,7 @@ struct GpioTest {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
    uint8_t pin_idx;
 | 
					    uint8_t pin_idx;
 | 
				
			||||||
 | 
					    GPIOItems* gpio_items;
 | 
				
			||||||
} GpioTestModel;
 | 
					} GpioTestModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool gpio_test_process_left(GpioTest* gpio_test);
 | 
					static bool gpio_test_process_left(GpioTest* gpio_test);
 | 
				
			||||||
@ -25,7 +26,12 @@ static void gpio_test_draw_callback(Canvas* canvas, void* _model) {
 | 
				
			|||||||
    elements_multiline_text_aligned(
 | 
					    elements_multiline_text_aligned(
 | 
				
			||||||
        canvas, 64, 16, AlignCenter, AlignTop, "Press < or > to change pin");
 | 
					        canvas, 64, 16, AlignCenter, AlignTop, "Press < or > to change pin");
 | 
				
			||||||
    elements_multiline_text_aligned(
 | 
					    elements_multiline_text_aligned(
 | 
				
			||||||
        canvas, 64, 32, AlignCenter, AlignTop, gpio_item_get_pin_name(model->pin_idx));
 | 
					        canvas,
 | 
				
			||||||
 | 
					        64,
 | 
				
			||||||
 | 
					        32,
 | 
				
			||||||
 | 
					        AlignCenter,
 | 
				
			||||||
 | 
					        AlignTop,
 | 
				
			||||||
 | 
					        gpio_items_get_pin_name(model->gpio_items, model->pin_idx));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool gpio_test_input_callback(InputEvent* event, void* context) {
 | 
					static bool gpio_test_input_callback(InputEvent* event, void* context) {
 | 
				
			||||||
@ -64,7 +70,7 @@ static bool gpio_test_process_right(GpioTest* gpio_test) {
 | 
				
			|||||||
        gpio_test->view,
 | 
					        gpio_test->view,
 | 
				
			||||||
        GpioTestModel * model,
 | 
					        GpioTestModel * model,
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if(model->pin_idx < GPIO_ITEM_COUNT) {
 | 
					            if(model->pin_idx < gpio_items_get_count(model->gpio_items)) {
 | 
				
			||||||
                model->pin_idx++;
 | 
					                model->pin_idx++;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
@ -80,17 +86,17 @@ static bool gpio_test_process_ok(GpioTest* gpio_test, InputEvent* event) {
 | 
				
			|||||||
        GpioTestModel * model,
 | 
					        GpioTestModel * model,
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if(event->type == InputTypePress) {
 | 
					            if(event->type == InputTypePress) {
 | 
				
			||||||
                if(model->pin_idx < GPIO_ITEM_COUNT) {
 | 
					                if(model->pin_idx < gpio_items_get_count(model->gpio_items)) {
 | 
				
			||||||
                    gpio_item_set_pin(model->pin_idx, true);
 | 
					                    gpio_items_set_pin(model->gpio_items, model->pin_idx, true);
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    gpio_item_set_all_pins(true);
 | 
					                    gpio_items_set_all_pins(model->gpio_items, true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                consumed = true;
 | 
					                consumed = true;
 | 
				
			||||||
            } else if(event->type == InputTypeRelease) {
 | 
					            } else if(event->type == InputTypeRelease) {
 | 
				
			||||||
                if(model->pin_idx < GPIO_ITEM_COUNT) {
 | 
					                if(model->pin_idx < gpio_items_get_count(model->gpio_items)) {
 | 
				
			||||||
                    gpio_item_set_pin(model->pin_idx, false);
 | 
					                    gpio_items_set_pin(model->gpio_items, model->pin_idx, false);
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    gpio_item_set_all_pins(false);
 | 
					                    gpio_items_set_all_pins(model->gpio_items, false);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                consumed = true;
 | 
					                consumed = true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -101,11 +107,15 @@ static bool gpio_test_process_ok(GpioTest* gpio_test, InputEvent* event) {
 | 
				
			|||||||
    return consumed;
 | 
					    return consumed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GpioTest* gpio_test_alloc() {
 | 
					GpioTest* gpio_test_alloc(GPIOItems* gpio_items) {
 | 
				
			||||||
    GpioTest* gpio_test = malloc(sizeof(GpioTest));
 | 
					    GpioTest* gpio_test = malloc(sizeof(GpioTest));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gpio_test->view = view_alloc();
 | 
					    gpio_test->view = view_alloc();
 | 
				
			||||||
    view_allocate_model(gpio_test->view, ViewModelTypeLocking, sizeof(GpioTestModel));
 | 
					    view_allocate_model(gpio_test->view, ViewModelTypeLocking, sizeof(GpioTestModel));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with_view_model(
 | 
				
			||||||
 | 
					        gpio_test->view, GpioTestModel * model, { model->gpio_items = gpio_items; }, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    view_set_context(gpio_test->view, gpio_test);
 | 
					    view_set_context(gpio_test->view, gpio_test);
 | 
				
			||||||
    view_set_draw_callback(gpio_test->view, gpio_test_draw_callback);
 | 
					    view_set_draw_callback(gpio_test->view, gpio_test_draw_callback);
 | 
				
			||||||
    view_set_input_callback(gpio_test->view, gpio_test_input_callback);
 | 
					    view_set_input_callback(gpio_test->view, gpio_test_input_callback);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,13 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../gpio_items.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gui/view.h>
 | 
					#include <gui/view.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct GpioTest GpioTest;
 | 
					typedef struct GpioTest GpioTest;
 | 
				
			||||||
typedef void (*GpioTestOkCallback)(InputType type, void* context);
 | 
					typedef void (*GpioTestOkCallback)(InputType type, void* context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GpioTest* gpio_test_alloc();
 | 
					GpioTest* gpio_test_alloc(GPIOItems* gpio_items);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void gpio_test_free(GpioTest* gpio_test);
 | 
					void gpio_test_free(GpioTest* gpio_test);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
#include "../usb_uart_bridge.h"
 | 
					#include "../usb_uart_bridge.h"
 | 
				
			||||||
#include "../gpio_app_i.h"
 | 
					#include "../gpio_app_i.h"
 | 
				
			||||||
#include "furi_hal.h"
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct GpioUsbUart {
 | 
					struct GpioUsbUart {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="ibutton",
 | 
					    appid="ibutton",
 | 
				
			||||||
    name="iButton",
 | 
					    name="iButton",
 | 
				
			||||||
    apptype=FlipperAppType.APP,
 | 
					    apptype=FlipperAppType.APP,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="ibutton_app",
 | 
					    entry_point="ibutton_app",
 | 
				
			||||||
    cdefines=["APP_IBUTTON"],
 | 
					    cdefines=["APP_IBUTTON"],
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,7 @@ App(
 | 
				
			|||||||
    name="Infrared",
 | 
					    name="Infrared",
 | 
				
			||||||
    apptype=FlipperAppType.APP,
 | 
					    apptype=FlipperAppType.APP,
 | 
				
			||||||
    entry_point="infrared_app",
 | 
					    entry_point="infrared_app",
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    cdefines=["APP_INFRARED"],
 | 
					    cdefines=["APP_INFRARED"],
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
        "gui",
 | 
					        "gui",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "../infrared_i.h"
 | 
					#include "../infrared_i.h"
 | 
				
			||||||
#include "gui/canvas.h"
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
    InfraredRpcStateIdle,
 | 
					    InfraredRpcStateIdle,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,11 @@
 | 
				
			|||||||
#include "infrared_debug_view.h"
 | 
					#include "infrared_debug_view.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <gui/canvas.h>
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define INFRARED_DEBUG_TEXT_LENGTH 64
 | 
					#define INFRARED_DEBUG_TEXT_LENGTH 64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct InfraredDebugView {
 | 
					struct InfraredDebugView {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,15 @@
 | 
				
			|||||||
#include <core/check.h>
 | 
					 | 
				
			||||||
#include "furi_hal_resources.h"
 | 
					 | 
				
			||||||
#include "assets_icons.h"
 | 
					 | 
				
			||||||
#include "gui/canvas.h"
 | 
					 | 
				
			||||||
#include "gui/view.h"
 | 
					 | 
				
			||||||
#include "input/input.h"
 | 
					 | 
				
			||||||
#include <gui/elements.h>
 | 
					 | 
				
			||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include "infrared_progress_view.h"
 | 
					#include "infrared_progress_view.h"
 | 
				
			||||||
#include "gui/modules/button_panel.h"
 | 
					
 | 
				
			||||||
 | 
					#include <assets_icons.h>
 | 
				
			||||||
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
 | 
					#include <gui/view.h>
 | 
				
			||||||
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					#include <gui/modules/button_panel.h>
 | 
				
			||||||
 | 
					#include <input/input.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
 | 
					#include <core/check.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct InfraredProgressView {
 | 
					struct InfraredProgressView {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="lfrfid",
 | 
					    appid="lfrfid",
 | 
				
			||||||
    name="125 kHz RFID",
 | 
					    name="125 kHz RFID",
 | 
				
			||||||
    apptype=FlipperAppType.APP,
 | 
					    apptype=FlipperAppType.APP,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="lfrfid_app",
 | 
					    entry_point="lfrfid_app",
 | 
				
			||||||
    cdefines=["APP_LF_RFID"],
 | 
					    cdefines=["APP_LF_RFID"],
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="nfc",
 | 
					    appid="nfc",
 | 
				
			||||||
    name="NFC",
 | 
					    name="NFC",
 | 
				
			||||||
    apptype=FlipperAppType.APP,
 | 
					    apptype=FlipperAppType.APP,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="nfc_app",
 | 
					    entry_point="nfc_app",
 | 
				
			||||||
    cdefines=["APP_NFC"],
 | 
					    cdefines=["APP_NFC"],
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "nfc_i.h"
 | 
					#include "nfc_i.h"
 | 
				
			||||||
#include "furi_hal_nfc.h"
 | 
					#include <furi_hal_nfc.h>
 | 
				
			||||||
#include <dolphin/dolphin.h>
 | 
					#include <dolphin/dolphin.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool nfc_custom_event_callback(void* context, uint32_t event) {
 | 
					bool nfc_custom_event_callback(void* context, uint32_t event) {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="subghz",
 | 
					    appid="subghz",
 | 
				
			||||||
    name="Sub-GHz",
 | 
					    name="Sub-GHz",
 | 
				
			||||||
    apptype=FlipperAppType.APP,
 | 
					    apptype=FlipperAppType.APP,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="subghz_app",
 | 
					    entry_point="subghz_app",
 | 
				
			||||||
    cdefines=["APP_SUBGHZ"],
 | 
					    cdefines=["APP_SUBGHZ"],
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include "../u2f_app_i.h"
 | 
					#include "../u2f_app_i.h"
 | 
				
			||||||
#include "../views/u2f_view.h"
 | 
					#include "../views/u2f_view.h"
 | 
				
			||||||
#include <dolphin/dolphin.h>
 | 
					#include <dolphin/dolphin.h>
 | 
				
			||||||
#include "furi_hal.h"
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include "../u2f.h"
 | 
					#include "../u2f.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define U2F_REQUEST_TIMEOUT 500
 | 
					#define U2F_REQUEST_TIMEOUT 500
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@
 | 
				
			|||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
#include <lib/flipper_format/flipper_format.h>
 | 
					#include <lib/flipper_format/flipper_format.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
#include <m-array.h>
 | 
					#include <m-array.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "MusicPlayerWorker"
 | 
					#define TAG "MusicPlayerWorker"
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="nfc_magic",
 | 
					    appid="nfc_magic",
 | 
				
			||||||
    name="Nfc Magic",
 | 
					    name="Nfc Magic",
 | 
				
			||||||
    apptype=FlipperAppType.EXTERNAL,
 | 
					    apptype=FlipperAppType.EXTERNAL,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="nfc_magic_app",
 | 
					    entry_point="nfc_magic_app",
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
        "storage",
 | 
					        "storage",
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="picopass",
 | 
					    appid="picopass",
 | 
				
			||||||
    name="PicoPass Reader",
 | 
					    name="PicoPass Reader",
 | 
				
			||||||
    apptype=FlipperAppType.EXTERNAL,
 | 
					    apptype=FlipperAppType.EXTERNAL,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="picopass_app",
 | 
					    entry_point="picopass_app",
 | 
				
			||||||
    requires=[
 | 
					    requires=[
 | 
				
			||||||
        "storage",
 | 
					        "storage",
 | 
				
			||||||
 | 
				
			|||||||
@ -2,8 +2,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "scenes/signal_gen_scene.h"
 | 
					#include "scenes/signal_gen_scene.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "furi_hal_clock.h"
 | 
					#include <furi_hal_clock.h>
 | 
				
			||||||
#include "furi_hal_pwm.h"
 | 
					#include <furi_hal_pwm.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gui/gui.h>
 | 
					#include <gui/gui.h>
 | 
				
			||||||
#include <gui/view_dispatcher.h>
 | 
					#include <gui/view_dispatcher.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "../signal_gen_app_i.h"
 | 
					#include "../signal_gen_app_i.h"
 | 
				
			||||||
#include "furi_hal.h"
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
#include <signal_generator_icons.h>
 | 
					#include <signal_generator_icons.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ App(
 | 
				
			|||||||
    appid="weather_station",
 | 
					    appid="weather_station",
 | 
				
			||||||
    name="Weather Station",
 | 
					    name="Weather Station",
 | 
				
			||||||
    apptype=FlipperAppType.PLUGIN,
 | 
					    apptype=FlipperAppType.PLUGIN,
 | 
				
			||||||
 | 
					    targets=["f7"],
 | 
				
			||||||
    entry_point="weather_station_app",
 | 
					    entry_point="weather_station_app",
 | 
				
			||||||
    cdefines=["APP_WEATHER_STATION"],
 | 
					    cdefines=["APP_WEATHER_STATION"],
 | 
				
			||||||
    requires=["gui"],
 | 
					    requires=["gui"],
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <lib/flipper_format/flipper_format.h>
 | 
					#include <lib/flipper_format/flipper_format.h>
 | 
				
			||||||
#include "furi.h"
 | 
					#include "furi.h"
 | 
				
			||||||
#include "furi_hal.h"
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <lib/subghz/types.h>
 | 
					#include <lib/subghz/types.h>
 | 
				
			||||||
#include <locale/locale.h>
 | 
					#include <locale/locale.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,28 +5,6 @@
 | 
				
			|||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <lib/toolbox/args.h>
 | 
					#include <lib/toolbox/args.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					 | 
				
			||||||
    const GpioPin* pin;
 | 
					 | 
				
			||||||
    const char* name;
 | 
					 | 
				
			||||||
    const bool debug;
 | 
					 | 
				
			||||||
} CliCommandGpio;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const CliCommandGpio cli_command_gpio_pins[] = {
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pc0, .name = "PC0", .debug = false},
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pc1, .name = "PC1", .debug = false},
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pc3, .name = "PC3", .debug = false},
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pb2, .name = "PB2", .debug = false},
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pb3, .name = "PB3", .debug = false},
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pa4, .name = "PA4", .debug = false},
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pa6, .name = "PA6", .debug = false},
 | 
					 | 
				
			||||||
    {.pin = &gpio_ext_pa7, .name = "PA7", .debug = false},
 | 
					 | 
				
			||||||
    /* Dangerous pins, may damage hardware */
 | 
					 | 
				
			||||||
    {.pin = &gpio_infrared_rx, .name = "PA0", .debug = true},
 | 
					 | 
				
			||||||
    {.pin = &gpio_usart_rx, .name = "PB7", .debug = true},
 | 
					 | 
				
			||||||
    {.pin = &gpio_speaker, .name = "PB8", .debug = true},
 | 
					 | 
				
			||||||
    {.pin = &gpio_infrared_tx, .name = "PB9", .debug = true},
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void cli_command_gpio_print_usage() {
 | 
					void cli_command_gpio_print_usage() {
 | 
				
			||||||
    printf("Usage:\r\n");
 | 
					    printf("Usage:\r\n");
 | 
				
			||||||
    printf("gpio <cmd> <args>\r\n");
 | 
					    printf("gpio <cmd> <args>\r\n");
 | 
				
			||||||
@ -38,9 +16,9 @@ void cli_command_gpio_print_usage() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static bool pin_name_to_int(FuriString* pin_name, size_t* result) {
 | 
					static bool pin_name_to_int(FuriString* pin_name, size_t* result) {
 | 
				
			||||||
    bool is_debug_mode = furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug);
 | 
					    bool is_debug_mode = furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug);
 | 
				
			||||||
    for(size_t i = 0; i < COUNT_OF(cli_command_gpio_pins); i++) {
 | 
					    for(size_t i = 0; i < gpio_pins_count; i++) {
 | 
				
			||||||
        if(furi_string_equal(pin_name, cli_command_gpio_pins[i].name)) {
 | 
					        if(furi_string_equal(pin_name, gpio_pins[i].name)) {
 | 
				
			||||||
            if(!cli_command_gpio_pins[i].debug || is_debug_mode) {
 | 
					            if(!gpio_pins[i].debug || is_debug_mode) {
 | 
				
			||||||
                *result = i;
 | 
					                *result = i;
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -53,9 +31,9 @@ static bool pin_name_to_int(FuriString* pin_name, size_t* result) {
 | 
				
			|||||||
static void gpio_print_pins(void) {
 | 
					static void gpio_print_pins(void) {
 | 
				
			||||||
    printf("Wrong pin name. Available pins: ");
 | 
					    printf("Wrong pin name. Available pins: ");
 | 
				
			||||||
    bool is_debug_mode = furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug);
 | 
					    bool is_debug_mode = furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug);
 | 
				
			||||||
    for(size_t i = 0; i < COUNT_OF(cli_command_gpio_pins); i++) {
 | 
					    for(size_t i = 0; i < gpio_pins_count; i++) {
 | 
				
			||||||
        if(!cli_command_gpio_pins[i].debug || is_debug_mode) {
 | 
					        if(!gpio_pins[i].debug || is_debug_mode) {
 | 
				
			||||||
            printf("%s ", cli_command_gpio_pins[i].name);
 | 
					            printf("%s ", gpio_pins[i].name);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -113,7 +91,7 @@ void cli_command_gpio_mode(Cli* cli, FuriString* args, void* context) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(cli_command_gpio_pins[num].debug) { //-V779
 | 
					    if(gpio_pins[num].debug) { //-V779
 | 
				
			||||||
        printf(
 | 
					        printf(
 | 
				
			||||||
            "Changing this pin mode may damage hardware. Are you sure you want to continue? (y/n)?\r\n");
 | 
					            "Changing this pin mode may damage hardware. Are you sure you want to continue? (y/n)?\r\n");
 | 
				
			||||||
        char c = cli_getc(cli);
 | 
					        char c = cli_getc(cli);
 | 
				
			||||||
@ -124,12 +102,12 @@ void cli_command_gpio_mode(Cli* cli, FuriString* args, void* context) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(value == 1) { // output
 | 
					    if(value == 1) { // output
 | 
				
			||||||
        furi_hal_gpio_write(cli_command_gpio_pins[num].pin, false);
 | 
					        furi_hal_gpio_write(gpio_pins[num].pin, false);
 | 
				
			||||||
        furi_hal_gpio_init_simple(cli_command_gpio_pins[num].pin, GpioModeOutputPushPull);
 | 
					        furi_hal_gpio_init_simple(gpio_pins[num].pin, GpioModeOutputPushPull);
 | 
				
			||||||
        printf("Pin %s is now an output (low)", cli_command_gpio_pins[num].name);
 | 
					        printf("Pin %s is now an output (low)", gpio_pins[num].name);
 | 
				
			||||||
    } else { // input
 | 
					    } else { // input
 | 
				
			||||||
        furi_hal_gpio_init_simple(cli_command_gpio_pins[num].pin, GpioModeInput);
 | 
					        furi_hal_gpio_init_simple(gpio_pins[num].pin, GpioModeInput);
 | 
				
			||||||
        printf("Pin %s is now an input", cli_command_gpio_pins[num].name);
 | 
					        printf("Pin %s is now an input", gpio_pins[num].name);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -144,15 +122,14 @@ void cli_command_gpio_read(Cli* cli, FuriString* args, void* context) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(LL_GPIO_MODE_INPUT != //-V779
 | 
					    if(LL_GPIO_MODE_INPUT != //-V779
 | 
				
			||||||
       LL_GPIO_GetPinMode(
 | 
					       LL_GPIO_GetPinMode(gpio_pins[num].pin->port, gpio_pins[num].pin->pin)) {
 | 
				
			||||||
           cli_command_gpio_pins[num].pin->port, cli_command_gpio_pins[num].pin->pin)) {
 | 
					        printf("Err: pin %s is not set as an input.", gpio_pins[num].name);
 | 
				
			||||||
        printf("Err: pin %s is not set as an input.", cli_command_gpio_pins[num].name);
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint8_t val = !!furi_hal_gpio_read(cli_command_gpio_pins[num].pin);
 | 
					    uint8_t val = !!furi_hal_gpio_read(gpio_pins[num].pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    printf("Pin %s <= %u", cli_command_gpio_pins[num].name, val);
 | 
					    printf("Pin %s <= %u", gpio_pins[num].name, val);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void cli_command_gpio_set(Cli* cli, FuriString* args, void* context) {
 | 
					void cli_command_gpio_set(Cli* cli, FuriString* args, void* context) {
 | 
				
			||||||
@ -174,14 +151,13 @@ void cli_command_gpio_set(Cli* cli, FuriString* args, void* context) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(LL_GPIO_MODE_OUTPUT != //-V779
 | 
					    if(LL_GPIO_MODE_OUTPUT != //-V779
 | 
				
			||||||
       LL_GPIO_GetPinMode(
 | 
					       LL_GPIO_GetPinMode(gpio_pins[num].pin->port, gpio_pins[num].pin->pin)) {
 | 
				
			||||||
           cli_command_gpio_pins[num].pin->port, cli_command_gpio_pins[num].pin->pin)) {
 | 
					        printf("Err: pin %s is not set as an output.", gpio_pins[num].name);
 | 
				
			||||||
        printf("Err: pin %s is not set as an output.", cli_command_gpio_pins[num].name);
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Extra check if debug pins used
 | 
					    // Extra check if debug pins used
 | 
				
			||||||
    if(cli_command_gpio_pins[num].debug) {
 | 
					    if(gpio_pins[num].debug) {
 | 
				
			||||||
        printf(
 | 
					        printf(
 | 
				
			||||||
            "Setting this pin may damage hardware. Are you sure you want to continue? (y/n)?\r\n");
 | 
					            "Setting this pin may damage hardware. Are you sure you want to continue? (y/n)?\r\n");
 | 
				
			||||||
        char c = cli_getc(cli);
 | 
					        char c = cli_getc(cli);
 | 
				
			||||||
@ -191,8 +167,8 @@ void cli_command_gpio_set(Cli* cli, FuriString* args, void* context) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    furi_hal_gpio_write(cli_command_gpio_pins[num].pin, !!value);
 | 
					    furi_hal_gpio_write(gpio_pins[num].pin, !!value);
 | 
				
			||||||
    printf("Pin %s => %u", cli_command_gpio_pins[num].name, !!value);
 | 
					    printf("Pin %s => %u", gpio_pins[num].name, !!value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void cli_command_gpio(Cli* cli, FuriString* args, void* context) {
 | 
					void cli_command_gpio(Cli* cli, FuriString* args, void* context) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "dialogs/dialogs_message.h"
 | 
					#include "dialogs_message.h"
 | 
				
			||||||
#include "dialogs_i.h"
 | 
					#include "dialogs_i.h"
 | 
				
			||||||
#include <toolbox/api_lock.h>
 | 
					#include <toolbox/api_lock.h>
 | 
				
			||||||
#include <assets_icons.h>
 | 
					#include <assets_icons.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
#include "dialogs_i.h"
 | 
					#include "dialogs_i.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gui/modules/file_browser.h>
 | 
				
			||||||
#include <toolbox/api_lock.h>
 | 
					#include <toolbox/api_lock.h>
 | 
				
			||||||
#include "gui/modules/file_browser.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
    FuriApiLock lock;
 | 
					    FuriApiLock lock;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <core/pubsub.h>
 | 
					 | 
				
			||||||
#include "gui/view.h"
 | 
					 | 
				
			||||||
#include "helpers/dolphin_deed.h"
 | 
					#include "helpers/dolphin_deed.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gui/view.h>
 | 
				
			||||||
 | 
					#include <core/pubsub.h>
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,17 @@
 | 
				
			|||||||
#include "elements.h"
 | 
					#include "elements.h"
 | 
				
			||||||
#include "m-core.h"
 | 
					#include <m-core.h>
 | 
				
			||||||
#include <assets_icons.h>
 | 
					#include <assets_icons.h>
 | 
				
			||||||
#include "furi_hal_resources.h"
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include "gui/canvas.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include <gui/icon_i.h>
 | 
					#include <gui/icon_i.h>
 | 
				
			||||||
#include <gui/icon_animation_i.h>
 | 
					#include <gui/icon_animation_i.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include "canvas_i.h"
 | 
					#include "canvas_i.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,3 @@
 | 
				
			|||||||
#include "gui/canvas.h"
 | 
					 | 
				
			||||||
#include "gui_i.h"
 | 
					#include "gui_i.h"
 | 
				
			||||||
#include <assets_icons.h>
 | 
					#include <assets_icons.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,15 @@
 | 
				
			|||||||
#include "button_menu.h"
 | 
					#include "button_menu.h"
 | 
				
			||||||
#include "gui/canvas.h"
 | 
					
 | 
				
			||||||
#include "gui/elements.h"
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include "input/input.h"
 | 
					#include <gui/elements.h>
 | 
				
			||||||
#include <m-array.h>
 | 
					#include <input/input.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <assets_icons.h>
 | 
					#include <assets_icons.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <m-array.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ITEM_FIRST_OFFSET 17
 | 
					#define ITEM_FIRST_OFFSET 17
 | 
				
			||||||
#define ITEM_NEXT_OFFSET 4
 | 
					#define ITEM_NEXT_OFFSET 4
 | 
				
			||||||
#define ITEM_HEIGHT 14
 | 
					#define ITEM_HEIGHT 14
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,15 @@
 | 
				
			|||||||
#include "button_panel.h"
 | 
					#include "button_panel.h"
 | 
				
			||||||
#include "furi_hal_resources.h"
 | 
					
 | 
				
			||||||
#include "gui/canvas.h"
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <m-array.h>
 | 
					#include <m-array.h>
 | 
				
			||||||
#include <m-i-list.h>
 | 
					#include <m-i-list.h>
 | 
				
			||||||
#include <m-list.h>
 | 
					#include <m-list.h>
 | 
				
			||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include <gui/elements.h>
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
    // uint16_t to support multi-screen, wide button panel
 | 
					    // uint16_t to support multi-screen, wide button panel
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include <gui/elements.h>
 | 
					 | 
				
			||||||
#include <assets_icons.h>
 | 
					 | 
				
			||||||
#include "byte_input.h"
 | 
					#include "byte_input.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <assets_icons.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ByteInput {
 | 
					struct ByteInput {
 | 
				
			||||||
    View* view;
 | 
					    View* view;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,17 @@
 | 
				
			|||||||
#include "file_browser.h"
 | 
					#include "file_browser.h"
 | 
				
			||||||
#include "assets_icons.h"
 | 
					 | 
				
			||||||
#include "file_browser_worker.h"
 | 
					#include "file_browser_worker.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					#include <assets_icons.h>
 | 
				
			||||||
 | 
					#include <toolbox/path.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <core/check.h>
 | 
					#include <core/check.h>
 | 
				
			||||||
#include <core/common_defines.h>
 | 
					#include <core/common_defines.h>
 | 
				
			||||||
#include <core/log.h>
 | 
					#include <core/log.h>
 | 
				
			||||||
#include "furi_hal_resources.h"
 | 
					 | 
				
			||||||
#include <m-array.h>
 | 
					#include <m-array.h>
 | 
				
			||||||
#include <gui/elements.h>
 | 
					 | 
				
			||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include "toolbox/path.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LIST_ITEMS 5u
 | 
					#define LIST_ITEMS 5u
 | 
				
			||||||
#define MAX_LEN_PX 110
 | 
					#define MAX_LEN_PX 110
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,16 @@
 | 
				
			|||||||
#include "file_browser_worker.h"
 | 
					#include "file_browser_worker.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <storage/filesystem_api_defines.h>
 | 
				
			||||||
 | 
					#include <storage/storage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <toolbox/path.h>
 | 
				
			||||||
#include <core/check.h>
 | 
					#include <core/check.h>
 | 
				
			||||||
#include <core/common_defines.h>
 | 
					#include <core/common_defines.h>
 | 
				
			||||||
#include "storage/filesystem_api_defines.h"
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <m-array.h>
 | 
					#include <m-array.h>
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <storage/storage.h>
 | 
					 | 
				
			||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include <stddef.h>
 | 
					#include <stddef.h>
 | 
				
			||||||
#include "toolbox/path.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "BrowserWorker"
 | 
					#define TAG "BrowserWorker"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,14 @@
 | 
				
			|||||||
#include <stdint.h>
 | 
					#include "loading.h"
 | 
				
			||||||
#include <furi.h>
 | 
					
 | 
				
			||||||
#include <assets_icons.h>
 | 
					 | 
				
			||||||
#include <gui/icon_animation.h>
 | 
					#include <gui/icon_animation.h>
 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
#include <gui/canvas.h>
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include <gui/view.h>
 | 
					#include <gui/view.h>
 | 
				
			||||||
#include <input/input.h>
 | 
					#include <input/input.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "loading.h"
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <assets_icons.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Loading {
 | 
					struct Loading {
 | 
				
			||||||
    View* view;
 | 
					    View* view;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
#include "menu.h"
 | 
					#include "menu.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <m-array.h>
 | 
					 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
#include <assets_icons.h>
 | 
					#include <assets_icons.h>
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <m-array.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Menu {
 | 
					struct Menu {
 | 
				
			||||||
    View* view;
 | 
					    View* view;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
#include "submenu.h"
 | 
					#include "submenu.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <m-array.h>
 | 
					 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <m-array.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Submenu {
 | 
					struct Submenu {
 | 
				
			||||||
    View* view;
 | 
					    View* view;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include "text_box.h"
 | 
					#include "text_box.h"
 | 
				
			||||||
#include "gui/canvas.h"
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct TextBox {
 | 
					struct TextBox {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include "validators.h"
 | 
					#include "validators.h"
 | 
				
			||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ValidatorIsFile {
 | 
					struct ValidatorIsFile {
 | 
				
			||||||
    char* app_path_folder;
 | 
					    char* app_path_folder;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <core/common_defines.h>
 | 
					#include <core/common_defines.h>
 | 
				
			||||||
 | 
					#include <core/string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
#include "variable_item_list.h"
 | 
					#include "variable_item_list.h"
 | 
				
			||||||
#include "gui/canvas.h"
 | 
					 | 
				
			||||||
#include <m-array.h>
 | 
					 | 
				
			||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <m-array.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct VariableItem {
 | 
					struct VariableItem {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include "widget.h"
 | 
					#include "widget.h"
 | 
				
			||||||
#include <m-array.h>
 | 
					 | 
				
			||||||
#include "widget_elements/widget_element_i.h"
 | 
					#include "widget_elements/widget_element_i.h"
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					#include <m-array.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARRAY_DEF(ElementArray, WidgetElement*, M_PTR_OPLIST);
 | 
					ARRAY_DEF(ElementArray, WidgetElement*, M_PTR_OPLIST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
#include "gui/view.h"
 | 
					 | 
				
			||||||
#include <core/memmgr.h>
 | 
					 | 
				
			||||||
#include "view_stack.h"
 | 
					#include "view_stack.h"
 | 
				
			||||||
#include "view_i.h"
 | 
					#include "view_i.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gui/view.h>
 | 
				
			||||||
 | 
					#include <core/memmgr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_VIEWS 3
 | 
					#define MAX_VIEWS 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_light.h"
 | 
					#include <furi_hal_light.h>
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_resources.h"
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
#include "notification.h"
 | 
					#include "notification.h"
 | 
				
			||||||
#include "notification_messages_notes.h"
 | 
					#include "notification_messages_notes.h"
 | 
				
			||||||
#include <stddef.h>
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -13,17 +13,29 @@ typedef DialogMessageButton (*AboutDialogScreen)(DialogsApp* dialogs, DialogMess
 | 
				
			|||||||
static DialogMessageButton product_screen(DialogsApp* dialogs, DialogMessage* message) {
 | 
					static DialogMessageButton product_screen(DialogsApp* dialogs, DialogMessage* message) {
 | 
				
			||||||
    DialogMessageButton result;
 | 
					    DialogMessageButton result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const char* screen_header = "Product: Flipper Zero\n"
 | 
					    FuriString* screen_header = furi_string_alloc_printf(
 | 
				
			||||||
                                "Model: FZ.1\n";
 | 
					        "Product: %s\n"
 | 
				
			||||||
    const char* screen_text = "FCC ID: 2A2V6-FZ\n"
 | 
					        "Model: %s",
 | 
				
			||||||
                              "IC: 27624-FZ";
 | 
					        furi_hal_version_get_model_name(),
 | 
				
			||||||
 | 
					        furi_hal_version_get_model_code());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dialog_message_set_header(message, screen_header, 0, 0, AlignLeft, AlignTop);
 | 
					    FuriString* screen_text = furi_string_alloc_printf(
 | 
				
			||||||
    dialog_message_set_text(message, screen_text, 0, 26, AlignLeft, AlignTop);
 | 
					        "FCC ID: %s\n"
 | 
				
			||||||
 | 
					        "IC: %s",
 | 
				
			||||||
 | 
					        furi_hal_version_get_fcc_id(),
 | 
				
			||||||
 | 
					        furi_hal_version_get_ic_id());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dialog_message_set_header(
 | 
				
			||||||
 | 
					        message, furi_string_get_cstr(screen_header), 0, 0, AlignLeft, AlignTop);
 | 
				
			||||||
 | 
					    dialog_message_set_text(
 | 
				
			||||||
 | 
					        message, furi_string_get_cstr(screen_text), 0, 26, AlignLeft, AlignTop);
 | 
				
			||||||
    result = dialog_message_show(dialogs, message);
 | 
					    result = dialog_message_show(dialogs, message);
 | 
				
			||||||
    dialog_message_set_header(message, NULL, 0, 0, AlignLeft, AlignTop);
 | 
					    dialog_message_set_header(message, NULL, 0, 0, AlignLeft, AlignTop);
 | 
				
			||||||
    dialog_message_set_text(message, NULL, 0, 0, AlignLeft, AlignTop);
 | 
					    dialog_message_set_text(message, NULL, 0, 0, AlignLeft, AlignTop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_string_free(screen_header);
 | 
				
			||||||
 | 
					    furi_string_free(screen_text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "../bt_settings_app.h"
 | 
					#include "../bt_settings_app.h"
 | 
				
			||||||
#include "furi_hal_bt.h"
 | 
					#include <furi_hal_bt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void bt_settings_scene_forget_dev_confirm_dialog_callback(DialogExResult result, void* context) {
 | 
					void bt_settings_scene_forget_dev_confirm_dialog_callback(DialogExResult result, void* context) {
 | 
				
			||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "../bt_settings_app.h"
 | 
					#include "../bt_settings_app.h"
 | 
				
			||||||
#include "furi_hal_bt.h"
 | 
					#include <furi_hal_bt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void bt_settings_app_scene_forget_dev_success_popup_callback(void* context) {
 | 
					void bt_settings_app_scene_forget_dev_success_popup_callback(void* context) {
 | 
				
			||||||
    BtSettingsApp* app = context;
 | 
					    BtSettingsApp* app = context;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "../bt_settings_app.h"
 | 
					#include "../bt_settings_app.h"
 | 
				
			||||||
#include "furi_hal_bt.h"
 | 
					#include <furi_hal_bt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum BtSetting {
 | 
					enum BtSetting {
 | 
				
			||||||
    BtSettingOff,
 | 
					    BtSettingOff,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include "../storage_move_to_sd.h"
 | 
					#include "../storage_move_to_sd.h"
 | 
				
			||||||
#include "gui/canvas.h"
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include "gui/modules/widget_elements/widget_element_i.h"
 | 
					#include <gui/modules/widget_elements/widget_element_i.h>
 | 
				
			||||||
#include "storage/storage.h"
 | 
					#include <storage/storage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void storage_move_to_sd_scene_confirm_widget_callback(
 | 
					static void storage_move_to_sd_scene_confirm_widget_callback(
 | 
				
			||||||
    GuiButtonType result,
 | 
					    GuiButtonType result,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,16 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
#include "gui/modules/widget_elements/widget_element_i.h"
 | 
					 | 
				
			||||||
#include <furi.h>
 | 
					 | 
				
			||||||
#include <gui/gui.h>
 | 
					#include <gui/gui.h>
 | 
				
			||||||
#include <gui/view.h>
 | 
					#include <gui/view.h>
 | 
				
			||||||
#include <gui/view_dispatcher.h>
 | 
					#include <gui/view_dispatcher.h>
 | 
				
			||||||
#include <gui/scene_manager.h>
 | 
					#include <gui/scene_manager.h>
 | 
				
			||||||
#include <notification/notification_messages.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <gui/modules/widget.h>
 | 
					#include <gui/modules/widget.h>
 | 
				
			||||||
#include <gui/modules/popup.h>
 | 
					#include <gui/modules/popup.h>
 | 
				
			||||||
 | 
					#include <gui/modules/widget_elements/widget_element_i.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <notification/notification_messages.h>
 | 
				
			||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
#include <storage/storage_sd_api.h>
 | 
					#include <storage/storage_sd_api.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "scenes/storage_move_to_sd_scene.h"
 | 
					#include "scenes/storage_move_to_sd_scene.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -76,8 +76,8 @@ static void updater_cli_ep(Cli* cli, FuriString* args, void* context) {
 | 
				
			|||||||
    for(size_t idx = 0; idx < COUNT_OF(update_cli_subcommands); ++idx) {
 | 
					    for(size_t idx = 0; idx < COUNT_OF(update_cli_subcommands); ++idx) {
 | 
				
			||||||
        const CliSubcommand* subcmd_def = &update_cli_subcommands[idx];
 | 
					        const CliSubcommand* subcmd_def = &update_cli_subcommands[idx];
 | 
				
			||||||
        if(furi_string_cmp_str(subcommand, subcmd_def->command) == 0) {
 | 
					        if(furi_string_cmp_str(subcommand, subcmd_def->command) == 0) {
 | 
				
			||||||
            furi_string_free(subcommand);
 | 
					 | 
				
			||||||
            subcmd_def->handler(args);
 | 
					            subcmd_def->handler(args);
 | 
				
			||||||
 | 
					            furi_string_free(subcommand);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -287,7 +287,9 @@ bool update_task_parse_manifest(UpdateTask* update_task) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        update_task_set_progress(update_task, UpdateTaskStageProgress, 50);
 | 
					        update_task_set_progress(update_task, UpdateTaskStageProgress, 50);
 | 
				
			||||||
        if(manifest->target != furi_hal_version_get_hw_target()) {
 | 
					        /* Check target only if it's set - skipped for pre-production samples */
 | 
				
			||||||
 | 
					        if(furi_hal_version_get_hw_target() &&
 | 
				
			||||||
 | 
					           (manifest->target != furi_hal_version_get_hw_target())) {
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										44
									
								
								documentation/HardwareTargets.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								documentation/HardwareTargets.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					## What a Firmware Target is
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Flipper's firmware is modular and supports different hardware configurations in a common code base. It encapsulates hardware-specific differences in `furi_hal`, board initialization code, linker files, SDK data and other information in a _target definition_.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Target-specific files are placed in a single sub-folder in `firmware/targets`. It must contain a target definition file, `target.json`, and may contain other files if they are referenced by current target's definition. By default, `fbt` gathers all source files in target folder, unless they are explicitly excluded.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Targets can inherit most code parts from other targets, to reduce common code duplication.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Target Definition File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A target definition file, `target.json`, is a JSON file that can contain the following fields:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `include_paths`: list of strings, folder paths relative to current target folder to add to global C/C++ header path lookup list.
 | 
				
			||||||
 | 
					* `sdk_header_paths`: list of strings, folder paths relative to current target folder to gather headers from for including in SDK.
 | 
				
			||||||
 | 
					* `startup_script`: filename of a startup script, performing initial hardware initialization.
 | 
				
			||||||
 | 
					* `linker_script_flash`: filename of a linker script for creating the main firmware image.
 | 
				
			||||||
 | 
					* `linker_script_ram`: filename of a linker script to use in "updater" build configuration.
 | 
				
			||||||
 | 
					* `linker_script_app`: filename of a linker script to use for linking .fap files.
 | 
				
			||||||
 | 
					* `sdk_symbols`: filename of a .csv file containing current SDK configuration for this target.
 | 
				
			||||||
 | 
					* `linker_dependencies`: list of libraries to link the firmware with. Note that those not in the list won't be built by `fbt`. Also several link passes might be needed, in such case you may need to specify same library name twice.
 | 
				
			||||||
 | 
					* `inherit`: string, specifies hardware target to borrow main configuration from. Current configuration may specify additional values for parameters that are lists of strings, or override values that are not lists.
 | 
				
			||||||
 | 
					* `excluded_sources`: list of filenames from the inherited configuration(s) NOT to be built.
 | 
				
			||||||
 | 
					* `excluded_headers`: list of headers from the inherited configuration(s) NOT to be included in generated SDK.
 | 
				
			||||||
 | 
					* `excluded_modules`: list of strings specifying fbt library (module) names to exclude from being used to configure build environment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Applications & Hardware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Not all applications are available on different hardware targets. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* For applications built into the firmware, you have to specify a compatible application set using `FIRMWARE_APP_SET=...` fbt option. See [fbt docs](./fbt.md#firmware-application-set) for details on build configurations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* For applications built as external .faps, you have to explicitly specify compatible targets in application's manifest, `application.fam`. For example, to limit application to a single target, add `targets=["f7"],` to the manifest. It won't be built for other targets.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For details on application manifests, check out [their docs page](./AppManifests.md).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Building Firmware for a Specific Target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You have to specify TARGET_HW (and, optionally, FIRMWARE_APP_SET) for `fbt` to build firmware for non-default target. For example, building and flashing debug firmware for f18 can be done with
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ./fbt TARGET_HW=18 flash_usb_full
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,6 +16,7 @@ env = ENV.Clone(
 | 
				
			|||||||
        "fwbin",
 | 
					        "fwbin",
 | 
				
			||||||
        "fbt_apps",
 | 
					        "fbt_apps",
 | 
				
			||||||
        "pvsstudio",
 | 
					        "pvsstudio",
 | 
				
			||||||
 | 
					        "fbt_hwtarget",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    COMPILATIONDB_USE_ABSPATH=False,
 | 
					    COMPILATIONDB_USE_ABSPATH=False,
 | 
				
			||||||
    BUILD_DIR=fw_build_meta["build_dir"],
 | 
					    BUILD_DIR=fw_build_meta["build_dir"],
 | 
				
			||||||
@ -31,10 +32,6 @@ env = ENV.Clone(
 | 
				
			|||||||
    CPPPATH=[
 | 
					    CPPPATH=[
 | 
				
			||||||
        "#/furi",
 | 
					        "#/furi",
 | 
				
			||||||
        *(f"#/{app_dir[0]}" for app_dir in ENV["APPDIRS"] if app_dir[1]),
 | 
					        *(f"#/{app_dir[0]}" for app_dir in ENV["APPDIRS"] if app_dir[1]),
 | 
				
			||||||
        "#/firmware/targets/f${TARGET_HW}/ble_glue",
 | 
					 | 
				
			||||||
        "#/firmware/targets/f${TARGET_HW}/fatfs",
 | 
					 | 
				
			||||||
        "#/firmware/targets/f${TARGET_HW}/furi_hal",
 | 
					 | 
				
			||||||
        "#/firmware/targets/f${TARGET_HW}/Inc",
 | 
					 | 
				
			||||||
        "#/firmware/targets/furi_hal_include",
 | 
					        "#/firmware/targets/furi_hal_include",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    # Specific flags for building libraries - always do optimized builds
 | 
					    # Specific flags for building libraries - always do optimized builds
 | 
				
			||||||
@ -74,20 +71,6 @@ env = ENV.Clone(
 | 
				
			|||||||
    _APP_ICONS=None,
 | 
					    _APP_ICONS=None,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
def ApplyLibFlags(env):
 | 
					 | 
				
			||||||
    flags_to_apply = env["FW_LIB_OPTS"].get(
 | 
					 | 
				
			||||||
        env.get("FW_LIB_NAME"),
 | 
					 | 
				
			||||||
        env["FW_LIB_OPTS"]["Default"],
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    # print("Flags for ", env.get("FW_LIB_NAME", "Default"), flags_to_apply)
 | 
					 | 
				
			||||||
    env.MergeFlags(flags_to_apply)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
env.AddMethod(ApplyLibFlags)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Export("env")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if env["IS_BASE_FIRMWARE"]:
 | 
					if env["IS_BASE_FIRMWARE"]:
 | 
				
			||||||
    env.Append(
 | 
					    env.Append(
 | 
				
			||||||
        FIRMWARE_BUILD_CFG="firmware",
 | 
					        FIRMWARE_BUILD_CFG="firmware",
 | 
				
			||||||
@ -102,7 +85,11 @@ else:
 | 
				
			|||||||
        ],
 | 
					        ],
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Invoke child SConscripts to populate global `env` + build their own part of the code
 | 
					env.ConfigureForTarget(env.subst("${TARGET_HW}"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Export("env")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Invoke child SCopscripts to populate global `env` + build their own part of the code
 | 
				
			||||||
lib_targets = env.BuildModules(
 | 
					lib_targets = env.BuildModules(
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        "lib",
 | 
					        "lib",
 | 
				
			||||||
@ -131,7 +118,7 @@ if extra_int_apps := GetOption("extra_int_apps"):
 | 
				
			|||||||
    fwenv.Append(APPS=extra_int_apps.split(","))
 | 
					    fwenv.Append(APPS=extra_int_apps.split(","))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for app_dir, _ in env["APPDIRS"]:
 | 
					for app_dir, _ in fwenv["APPDIRS"]:
 | 
				
			||||||
    app_dir_node = env.Dir("#").Dir(app_dir)
 | 
					    app_dir_node = env.Dir("#").Dir(app_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for entry in app_dir_node.glob("*"):
 | 
					    for entry in app_dir_node.glob("*"):
 | 
				
			||||||
@ -196,37 +183,11 @@ sources.extend(
 | 
				
			|||||||
fwelf = fwenv["FW_ELF"] = fwenv.Program(
 | 
					fwelf = fwenv["FW_ELF"] = fwenv.Program(
 | 
				
			||||||
    "${FIRMWARE_BUILD_CFG}",
 | 
					    "${FIRMWARE_BUILD_CFG}",
 | 
				
			||||||
    sources,
 | 
					    sources,
 | 
				
			||||||
    LIBS=[
 | 
					    LIBS=fwenv["TARGET_CFG"].linker_dependencies,
 | 
				
			||||||
        "print",
 | 
					 | 
				
			||||||
        "flipper${TARGET_HW}",
 | 
					 | 
				
			||||||
        "furi",
 | 
					 | 
				
			||||||
        "freertos",
 | 
					 | 
				
			||||||
        "stm32cubewb",
 | 
					 | 
				
			||||||
        "hwdrivers",
 | 
					 | 
				
			||||||
        "fatfs",
 | 
					 | 
				
			||||||
        "littlefs",
 | 
					 | 
				
			||||||
        "subghz",
 | 
					 | 
				
			||||||
        "flipperformat",
 | 
					 | 
				
			||||||
        "toolbox",
 | 
					 | 
				
			||||||
        "nfc",
 | 
					 | 
				
			||||||
        "microtar",
 | 
					 | 
				
			||||||
        "usb_stm32",
 | 
					 | 
				
			||||||
        "st25rfal002",
 | 
					 | 
				
			||||||
        "infrared",
 | 
					 | 
				
			||||||
        "appframe",
 | 
					 | 
				
			||||||
        "assets",
 | 
					 | 
				
			||||||
        "misc",
 | 
					 | 
				
			||||||
        "mbedtls",
 | 
					 | 
				
			||||||
        "lfrfid",
 | 
					 | 
				
			||||||
        "flipper_application",
 | 
					 | 
				
			||||||
        # 2nd round
 | 
					 | 
				
			||||||
        "flipperformat",
 | 
					 | 
				
			||||||
        "toolbox",
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Firmware depends on everything child builders returned
 | 
					# Firmware depends on everything child builders returned
 | 
				
			||||||
Depends(fwelf, lib_targets)
 | 
					# Depends(fwelf, lib_targets)
 | 
				
			||||||
# Output extra details after building firmware
 | 
					# Output extra details after building firmware
 | 
				
			||||||
AddPostAction(fwelf, fwenv["APPBUILD_DUMP"])
 | 
					AddPostAction(fwelf, fwenv["APPBUILD_DUMP"])
 | 
				
			||||||
AddPostAction(
 | 
					AddPostAction(
 | 
				
			||||||
 | 
				
			|||||||
@ -2,15 +2,6 @@ Import("env")
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
env.Append(
 | 
					env.Append(
 | 
				
			||||||
    LINT_SOURCES=[Dir(".")],
 | 
					    LINT_SOURCES=[Dir(".")],
 | 
				
			||||||
    SDK_HEADERS=[
 | 
					 | 
				
			||||||
        *env.GlobRecursive("*.h", "targets/furi_hal_include", "*_i.h"),
 | 
					 | 
				
			||||||
        *env.GlobRecursive("*.h", "targets/f${TARGET_HW}/furi_hal", "*_i.h"),
 | 
					 | 
				
			||||||
        File("targets/f7/platform_specific/intrinsic_export.h"),
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
env.SetDefault(
 | 
					 | 
				
			||||||
    SDK_DEFINITION=env.File("./targets/f${TARGET_HW}/api_symbols.csv").srcnode()
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libenv = env.Clone(FW_LIB_NAME="flipper${TARGET_HW}")
 | 
					libenv = env.Clone(FW_LIB_NAME="flipper${TARGET_HW}")
 | 
				
			||||||
@ -22,9 +13,9 @@ libenv.Append(
 | 
				
			|||||||
libenv.ApplyLibFlags()
 | 
					libenv.ApplyLibFlags()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sources = ["targets/f${TARGET_HW}/startup_stm32wb55xx_cm4.s"]
 | 
					lib = libenv.StaticLibrary(
 | 
				
			||||||
sources += libenv.GlobRecursive("*.c")
 | 
					    "${FW_LIB_NAME}",
 | 
				
			||||||
 | 
					    env.get("TARGET_CFG").gatherSources(),
 | 
				
			||||||
lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources)
 | 
					)
 | 
				
			||||||
libenv.Install("${LIB_DIST_DIR}", lib)
 | 
					libenv.Install("${LIB_DIST_DIR}", lib)
 | 
				
			||||||
Return("lib")
 | 
					Return("lib")
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2307
									
								
								firmware/targets/f18/api_symbols.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2307
									
								
								firmware/targets/f18/api_symbols.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										91
									
								
								firmware/targets/f18/furi_hal/furi_hal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								firmware/targets/f18/furi_hal/furi_hal.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					#include <furi_hal.h>
 | 
				
			||||||
 | 
					#include <furi_hal_mpu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stm32wbxx_ll_cortex.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <fatfs.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TAG "FuriHal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_init_early() {
 | 
				
			||||||
 | 
					    furi_hal_cortex_init_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_clock_init_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_resources_init_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_os_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_spi_config_init_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_i2c_init_early();
 | 
				
			||||||
 | 
					    furi_hal_light_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_rtc_init_early();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_deinit_early() {
 | 
				
			||||||
 | 
					    furi_hal_rtc_deinit_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_i2c_deinit_early();
 | 
				
			||||||
 | 
					    furi_hal_spi_config_deinit_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_resources_deinit_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_clock_deinit_early();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_init() {
 | 
				
			||||||
 | 
					    furi_hal_mpu_init();
 | 
				
			||||||
 | 
					    furi_hal_clock_init();
 | 
				
			||||||
 | 
					    furi_hal_console_init();
 | 
				
			||||||
 | 
					    furi_hal_rtc_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_interrupt_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_flash_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_resources_init();
 | 
				
			||||||
 | 
					    FURI_LOG_I(TAG, "GPIO OK");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_version_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_spi_config_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_speaker_init();
 | 
				
			||||||
 | 
					    FURI_LOG_I(TAG, "Speaker OK");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_crypto_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // USB
 | 
				
			||||||
 | 
					#ifndef FURI_RAM_EXEC
 | 
				
			||||||
 | 
					    furi_hal_usb_init();
 | 
				
			||||||
 | 
					    FURI_LOG_I(TAG, "USB OK");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_i2c_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // High Level
 | 
				
			||||||
 | 
					    furi_hal_power_init();
 | 
				
			||||||
 | 
					    furi_hal_light_init();
 | 
				
			||||||
 | 
					#ifndef FURI_RAM_EXEC
 | 
				
			||||||
 | 
					    furi_hal_vibro_init();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    furi_hal_bt_init();
 | 
				
			||||||
 | 
					    furi_hal_compress_icon_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // FatFS driver initialization
 | 
				
			||||||
 | 
					    MX_FATFS_Init();
 | 
				
			||||||
 | 
					    FURI_LOG_I(TAG, "FATFS OK");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_switch(void* address) {
 | 
				
			||||||
 | 
					    __set_BASEPRI(0);
 | 
				
			||||||
 | 
					    asm volatile("ldr    r3, [%0]    \n"
 | 
				
			||||||
 | 
					                 "msr    msp, r3     \n"
 | 
				
			||||||
 | 
					                 "ldr    r3, [%1]    \n"
 | 
				
			||||||
 | 
					                 "mov    pc, r3      \n"
 | 
				
			||||||
 | 
					                 :
 | 
				
			||||||
 | 
					                 : "r"(address), "r"(address + 0x4)
 | 
				
			||||||
 | 
					                 : "r3");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										201
									
								
								firmware/targets/f18/furi_hal/furi_hal_resources.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								firmware/targets/f18/furi_hal/furi_hal_resources.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,201 @@
 | 
				
			|||||||
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stm32wbxx_ll_rcc.h>
 | 
				
			||||||
 | 
					#include <stm32wbxx_ll_pwr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin vibro_gpio = {.port = GPIOA, .pin = LL_GPIO_PIN_8};
 | 
				
			||||||
 | 
					const GpioPin ibutton_gpio = {.port = GPIOB, .pin = LL_GPIO_PIN_14};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_display_cs = {.port = GPIOC, .pin = LL_GPIO_PIN_11};
 | 
				
			||||||
 | 
					const GpioPin gpio_display_rst_n = {.port = GPIOB, .pin = LL_GPIO_PIN_0};
 | 
				
			||||||
 | 
					const GpioPin gpio_display_di = {.port = GPIOB, .pin = LL_GPIO_PIN_1};
 | 
				
			||||||
 | 
					const GpioPin gpio_sdcard_cs = {.port = GPIOC, .pin = LL_GPIO_PIN_12};
 | 
				
			||||||
 | 
					const GpioPin gpio_sdcard_cd = {.port = GPIOC, .pin = LL_GPIO_PIN_10};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_button_up = {.port = GPIOB, .pin = LL_GPIO_PIN_10};
 | 
				
			||||||
 | 
					const GpioPin gpio_button_down = {.port = GPIOC, .pin = LL_GPIO_PIN_6};
 | 
				
			||||||
 | 
					const GpioPin gpio_button_right = {.port = GPIOB, .pin = LL_GPIO_PIN_12};
 | 
				
			||||||
 | 
					const GpioPin gpio_button_left = {.port = GPIOB, .pin = LL_GPIO_PIN_11};
 | 
				
			||||||
 | 
					const GpioPin gpio_button_ok = {.port = GPIOH, .pin = LL_GPIO_PIN_3};
 | 
				
			||||||
 | 
					const GpioPin gpio_button_back = {.port = GPIOC, .pin = LL_GPIO_PIN_13};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_spi_d_miso = {.port = GPIOC, .pin = LL_GPIO_PIN_2};
 | 
				
			||||||
 | 
					const GpioPin gpio_spi_d_mosi = {.port = GPIOB, .pin = LL_GPIO_PIN_15};
 | 
				
			||||||
 | 
					const GpioPin gpio_spi_d_sck = {.port = GPIOD, .pin = LL_GPIO_PIN_1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pc0 = {.port = GPIOC, .pin = LL_GPIO_PIN_0};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pc1 = {.port = GPIOC, .pin = LL_GPIO_PIN_1};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pc3 = {.port = GPIOC, .pin = LL_GPIO_PIN_3};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pb2 = {.port = GPIOB, .pin = LL_GPIO_PIN_2};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pb3 = {.port = GPIOB, .pin = LL_GPIO_PIN_3};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa4 = {.port = GPIOA, .pin = LL_GPIO_PIN_4};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa6 = {.port = GPIOA, .pin = LL_GPIO_PIN_6};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa7 = {.port = GPIOA, .pin = LL_GPIO_PIN_7};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pc5 = {.port = GPIOC, .pin = LL_GPIO_PIN_5};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pc4 = {.port = GPIOC, .pin = LL_GPIO_PIN_4};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa5 = {.port = GPIOA, .pin = LL_GPIO_PIN_5};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pb9 = {.port = GPIOB, .pin = LL_GPIO_PIN_9};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa0 = {.port = GPIOA, .pin = LL_GPIO_PIN_0};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa1 = {.port = GPIOA, .pin = LL_GPIO_PIN_1};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa15 = {.port = GPIOA, .pin = LL_GPIO_PIN_15};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pe4 = {.port = GPIOE, .pin = LL_GPIO_PIN_4};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pa2 = {.port = GPIOA, .pin = LL_GPIO_PIN_2};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pb4 = {.port = GPIOB, .pin = LL_GPIO_PIN_4};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pb5 = {.port = GPIOB, .pin = LL_GPIO_PIN_5};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pd0 = {.port = GPIOD, .pin = LL_GPIO_PIN_0};
 | 
				
			||||||
 | 
					const GpioPin gpio_ext_pb13 = {.port = GPIOB, .pin = LL_GPIO_PIN_13};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_usart_tx = {.port = GPIOB, .pin = LL_GPIO_PIN_6};
 | 
				
			||||||
 | 
					const GpioPin gpio_usart_rx = {.port = GPIOB, .pin = LL_GPIO_PIN_7};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_i2c_power_sda = {.port = GPIOA, .pin = LL_GPIO_PIN_10};
 | 
				
			||||||
 | 
					const GpioPin gpio_i2c_power_scl = {.port = GPIOA, .pin = LL_GPIO_PIN_9};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_speaker = {.port = GPIOB, .pin = LL_GPIO_PIN_8};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin periph_power = {.port = GPIOA, .pin = LL_GPIO_PIN_3};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPin gpio_usb_dm = {.port = GPIOA, .pin = LL_GPIO_PIN_11};
 | 
				
			||||||
 | 
					const GpioPin gpio_usb_dp = {.port = GPIOA, .pin = LL_GPIO_PIN_12};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPinRecord gpio_pins[] = {
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa7, .name = "PA7", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa6, .name = "PA6", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa4, .name = "PA4", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb3, .name = "PB3", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb2, .name = "PB2", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc3, .name = "PC3", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc1, .name = "PC1", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc0, .name = "PC0", .debug = false},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc5, .name = "PC5", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc4, .name = "PC4", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa5, .name = "PA5", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb9, .name = "PB9", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa0, .name = "PA0", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa1, .name = "PA1", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa15, .name = "PA15", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pe4, .name = "PE4", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa2, .name = "PA2", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb4, .name = "PB4", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb5, .name = "PB5", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pd0, .name = "PD0", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb13, .name = "PB13", .debug = false},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Dangerous pins, may damage hardware */
 | 
				
			||||||
 | 
					    {.pin = &gpio_usart_rx, .name = "PB7", .debug = true},
 | 
				
			||||||
 | 
					    {.pin = &gpio_speaker, .name = "PB8", .debug = true},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const size_t gpio_pins_count = sizeof(gpio_pins) / sizeof(GpioPinRecord);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const InputPin input_pins[] = {
 | 
				
			||||||
 | 
					    {.gpio = &gpio_button_up, .key = InputKeyUp, .inverted = true, .name = "Up"},
 | 
				
			||||||
 | 
					    {.gpio = &gpio_button_down, .key = InputKeyDown, .inverted = true, .name = "Down"},
 | 
				
			||||||
 | 
					    {.gpio = &gpio_button_right, .key = InputKeyRight, .inverted = true, .name = "Right"},
 | 
				
			||||||
 | 
					    {.gpio = &gpio_button_left, .key = InputKeyLeft, .inverted = true, .name = "Left"},
 | 
				
			||||||
 | 
					    {.gpio = &gpio_button_ok, .key = InputKeyOk, .inverted = false, .name = "OK"},
 | 
				
			||||||
 | 
					    {.gpio = &gpio_button_back, .key = InputKeyBack, .inverted = true, .name = "Back"},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const size_t input_pins_count = sizeof(input_pins) / sizeof(InputPin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void furi_hal_resources_init_input_pins(GpioMode mode) {
 | 
				
			||||||
 | 
					    for(size_t i = 0; i < input_pins_count; i++) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(
 | 
				
			||||||
 | 
					            input_pins[i].gpio,
 | 
				
			||||||
 | 
					            mode,
 | 
				
			||||||
 | 
					            (input_pins[i].inverted) ? GpioPullUp : GpioPullDown,
 | 
				
			||||||
 | 
					            GpioSpeedLow);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_resources_init_early() {
 | 
				
			||||||
 | 
					    furi_hal_resources_init_input_pins(GpioModeInput);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // SD Card stepdown control
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&periph_power, 1);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&periph_power, GpioModeOutputOpenDrain, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Display pins
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_display_rst_n, 1);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init_simple(&gpio_display_rst_n, GpioModeOutputPushPull);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_display_di, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Pullup display reset pin for shutdown
 | 
				
			||||||
 | 
					    SET_BIT(PWR->PUCRB, gpio_display_rst_n.pin);
 | 
				
			||||||
 | 
					    CLEAR_BIT(PWR->PDCRB, gpio_display_rst_n.pin);
 | 
				
			||||||
 | 
					    SET_BIT(PWR->CR3, PWR_CR3_APC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Hard reset USB
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dm, 1);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dp, 1);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init_simple(&gpio_usb_dm, GpioModeOutputOpenDrain);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init_simple(&gpio_usb_dp, GpioModeOutputOpenDrain);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dm, 0);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dp, 0);
 | 
				
			||||||
 | 
					    furi_delay_us(5); // Device Driven disconnect: 2.5us + extra to compensate cables
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dm, 1);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dp, 1);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init_simple(&gpio_usb_dm, GpioModeAnalog);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init_simple(&gpio_usb_dp, GpioModeAnalog);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dm, 0);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_usb_dp, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // External header pins
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pc0, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pc1, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pc3, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pb2, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pb3, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pa4, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pa6, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_ext_pa7, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_resources_deinit_early() {
 | 
				
			||||||
 | 
					    furi_hal_resources_init_input_pins(GpioModeAnalog);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_resources_init() {
 | 
				
			||||||
 | 
					    // Button pins
 | 
				
			||||||
 | 
					    furi_hal_resources_init_input_pins(GpioModeInterruptRiseFall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Display pins
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_display_rst_n, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_display_rst_n, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_display_di, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_display_di, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // SD pins
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&gpio_sdcard_cd, GpioModeInput, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    furi_hal_gpio_write(&gpio_sdcard_cd, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&vibro_gpio, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    furi_hal_gpio_init(&ibutton_gpio, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_SetPriority(EXTI0_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ(EXTI0_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_SetPriority(EXTI1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ(EXTI1_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_SetPriority(EXTI2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ(EXTI2_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_SetPriority(EXTI3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ(EXTI3_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_SetPriority(EXTI4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ(EXTI4_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ(EXTI9_5_IRQn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
 | 
				
			||||||
 | 
					    NVIC_EnableIRQ(EXTI15_10_IRQn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										116
									
								
								firmware/targets/f18/furi_hal/furi_hal_resources.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								firmware/targets/f18/furi_hal/furi_hal_resources.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,116 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stm32wbxx.h>
 | 
				
			||||||
 | 
					#include <stm32wbxx_ll_gpio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Input Related Constants */
 | 
				
			||||||
 | 
					#define INPUT_DEBOUNCE_TICKS 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Input Keys */
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    InputKeyUp,
 | 
				
			||||||
 | 
					    InputKeyDown,
 | 
				
			||||||
 | 
					    InputKeyRight,
 | 
				
			||||||
 | 
					    InputKeyLeft,
 | 
				
			||||||
 | 
					    InputKeyOk,
 | 
				
			||||||
 | 
					    InputKeyBack,
 | 
				
			||||||
 | 
					    InputKeyMAX, /**< Special value */
 | 
				
			||||||
 | 
					} InputKey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Light */
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    LightRed = (1 << 0),
 | 
				
			||||||
 | 
					    LightGreen = (1 << 1),
 | 
				
			||||||
 | 
					    LightBlue = (1 << 2),
 | 
				
			||||||
 | 
					    LightBacklight = (1 << 3),
 | 
				
			||||||
 | 
					} Light;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    const GpioPin* gpio;
 | 
				
			||||||
 | 
					    const InputKey key;
 | 
				
			||||||
 | 
					    const bool inverted;
 | 
				
			||||||
 | 
					    const char* name;
 | 
				
			||||||
 | 
					} InputPin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    const GpioPin* pin;
 | 
				
			||||||
 | 
					    const char* name;
 | 
				
			||||||
 | 
					    const bool debug;
 | 
				
			||||||
 | 
					} GpioPinRecord;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const InputPin input_pins[];
 | 
				
			||||||
 | 
					extern const size_t input_pins_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPinRecord gpio_pins[];
 | 
				
			||||||
 | 
					extern const size_t gpio_pins_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin vibro_gpio;
 | 
				
			||||||
 | 
					extern const GpioPin ibutton_gpio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_display_cs;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_display_rst_n;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_display_di;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_sdcard_cs;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_sdcard_cd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_button_up;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_button_down;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_button_right;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_button_left;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_button_ok;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_button_back;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_spi_d_miso;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_spi_d_mosi;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_spi_d_sck;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pc0;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pc1;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pc3;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pb2;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pb3;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa4;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa6;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pc5;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pc4;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa5;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pb9;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa0;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa1;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa15;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pe4;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pa2;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pb4;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pb5;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pd0;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_ext_pb13;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_usart_tx;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_usart_rx;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_i2c_power_sda;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_i2c_power_scl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_speaker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin periph_power;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPin gpio_usb_dm;
 | 
				
			||||||
 | 
					extern const GpioPin gpio_usb_dp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_resources_init_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_resources_deinit_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_resources_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										377
									
								
								firmware/targets/f18/furi_hal/furi_hal_spi_config.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										377
									
								
								firmware/targets/f18/furi_hal/furi_hal_spi_config.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,377 @@
 | 
				
			|||||||
 | 
					#include <furi_hal_spi_config.h>
 | 
				
			||||||
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
 | 
					#include <furi_hal_spi.h>
 | 
				
			||||||
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TAG "FuriHalSpiConfig"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SPI Presets */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const LL_SPI_InitTypeDef furi_hal_spi_preset_2edge_low_8m = {
 | 
				
			||||||
 | 
					    .Mode = LL_SPI_MODE_MASTER,
 | 
				
			||||||
 | 
					    .TransferDirection = LL_SPI_FULL_DUPLEX,
 | 
				
			||||||
 | 
					    .DataWidth = LL_SPI_DATAWIDTH_8BIT,
 | 
				
			||||||
 | 
					    .ClockPolarity = LL_SPI_POLARITY_LOW,
 | 
				
			||||||
 | 
					    .ClockPhase = LL_SPI_PHASE_2EDGE,
 | 
				
			||||||
 | 
					    .NSS = LL_SPI_NSS_SOFT,
 | 
				
			||||||
 | 
					    .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8,
 | 
				
			||||||
 | 
					    .BitOrder = LL_SPI_MSB_FIRST,
 | 
				
			||||||
 | 
					    .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE,
 | 
				
			||||||
 | 
					    .CRCPoly = 7,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_8m = {
 | 
				
			||||||
 | 
					    .Mode = LL_SPI_MODE_MASTER,
 | 
				
			||||||
 | 
					    .TransferDirection = LL_SPI_FULL_DUPLEX,
 | 
				
			||||||
 | 
					    .DataWidth = LL_SPI_DATAWIDTH_8BIT,
 | 
				
			||||||
 | 
					    .ClockPolarity = LL_SPI_POLARITY_LOW,
 | 
				
			||||||
 | 
					    .ClockPhase = LL_SPI_PHASE_1EDGE,
 | 
				
			||||||
 | 
					    .NSS = LL_SPI_NSS_SOFT,
 | 
				
			||||||
 | 
					    .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8,
 | 
				
			||||||
 | 
					    .BitOrder = LL_SPI_MSB_FIRST,
 | 
				
			||||||
 | 
					    .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE,
 | 
				
			||||||
 | 
					    .CRCPoly = 7,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_4m = {
 | 
				
			||||||
 | 
					    .Mode = LL_SPI_MODE_MASTER,
 | 
				
			||||||
 | 
					    .TransferDirection = LL_SPI_FULL_DUPLEX,
 | 
				
			||||||
 | 
					    .DataWidth = LL_SPI_DATAWIDTH_8BIT,
 | 
				
			||||||
 | 
					    .ClockPolarity = LL_SPI_POLARITY_LOW,
 | 
				
			||||||
 | 
					    .ClockPhase = LL_SPI_PHASE_1EDGE,
 | 
				
			||||||
 | 
					    .NSS = LL_SPI_NSS_SOFT,
 | 
				
			||||||
 | 
					    .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV16,
 | 
				
			||||||
 | 
					    .BitOrder = LL_SPI_MSB_FIRST,
 | 
				
			||||||
 | 
					    .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE,
 | 
				
			||||||
 | 
					    .CRCPoly = 7,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_16m = {
 | 
				
			||||||
 | 
					    .Mode = LL_SPI_MODE_MASTER,
 | 
				
			||||||
 | 
					    .TransferDirection = LL_SPI_FULL_DUPLEX,
 | 
				
			||||||
 | 
					    .DataWidth = LL_SPI_DATAWIDTH_8BIT,
 | 
				
			||||||
 | 
					    .ClockPolarity = LL_SPI_POLARITY_LOW,
 | 
				
			||||||
 | 
					    .ClockPhase = LL_SPI_PHASE_1EDGE,
 | 
				
			||||||
 | 
					    .NSS = LL_SPI_NSS_SOFT,
 | 
				
			||||||
 | 
					    .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2,
 | 
				
			||||||
 | 
					    .BitOrder = LL_SPI_MSB_FIRST,
 | 
				
			||||||
 | 
					    .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE,
 | 
				
			||||||
 | 
					    .CRCPoly = 7,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_2m = {
 | 
				
			||||||
 | 
					    .Mode = LL_SPI_MODE_MASTER,
 | 
				
			||||||
 | 
					    .TransferDirection = LL_SPI_FULL_DUPLEX,
 | 
				
			||||||
 | 
					    .DataWidth = LL_SPI_DATAWIDTH_8BIT,
 | 
				
			||||||
 | 
					    .ClockPolarity = LL_SPI_POLARITY_LOW,
 | 
				
			||||||
 | 
					    .ClockPhase = LL_SPI_PHASE_1EDGE,
 | 
				
			||||||
 | 
					    .NSS = LL_SPI_NSS_SOFT,
 | 
				
			||||||
 | 
					    .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV32,
 | 
				
			||||||
 | 
					    .BitOrder = LL_SPI_MSB_FIRST,
 | 
				
			||||||
 | 
					    .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE,
 | 
				
			||||||
 | 
					    .CRCPoly = 7,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SPI Buses */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriMutex* furi_hal_spi_bus_r_mutex = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_spi_config_init_early() {
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_init(&furi_hal_spi_bus_d);
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_display);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_spi_config_deinit_early() {
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_handle_deinit(&furi_hal_spi_bus_handle_display);
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_deinit(&furi_hal_spi_bus_d);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_hal_spi_config_init() {
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_sd_fast);
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_sd_slow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FURI_LOG_I(TAG, "Init OK");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void furi_hal_spi_bus_r_event_callback(FuriHalSpiBus* bus, FuriHalSpiBusEvent event) {
 | 
				
			||||||
 | 
					    if(event == FuriHalSpiBusEventInit) {
 | 
				
			||||||
 | 
					        furi_hal_spi_bus_r_mutex = furi_mutex_alloc(FuriMutexTypeNormal);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					        bus->current_handle = NULL;
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventDeinit) {
 | 
				
			||||||
 | 
					        furi_mutex_free(furi_hal_spi_bus_r_mutex);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1);
 | 
				
			||||||
 | 
					        LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI1);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventLock) {
 | 
				
			||||||
 | 
					        furi_check(furi_mutex_acquire(furi_hal_spi_bus_r_mutex, FuriWaitForever) == FuriStatusOk);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventUnlock) {
 | 
				
			||||||
 | 
					        furi_check(furi_mutex_release(furi_hal_spi_bus_r_mutex) == FuriStatusOk);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventActivate) {
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI1);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventDeactivate) {
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriHalSpiBus furi_hal_spi_bus_r = {
 | 
				
			||||||
 | 
					    .spi = SPI1,
 | 
				
			||||||
 | 
					    .callback = furi_hal_spi_bus_r_event_callback,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriMutex* furi_hal_spi_bus_d_mutex = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void furi_hal_spi_bus_d_event_callback(FuriHalSpiBus* bus, FuriHalSpiBusEvent event) {
 | 
				
			||||||
 | 
					    if(event == FuriHalSpiBusEventInit) {
 | 
				
			||||||
 | 
					        furi_hal_spi_bus_d_mutex = furi_mutex_alloc(FuriMutexTypeNormal);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					        bus->current_handle = NULL;
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventDeinit) {
 | 
				
			||||||
 | 
					        furi_mutex_free(furi_hal_spi_bus_d_mutex);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2);
 | 
				
			||||||
 | 
					        LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI2);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventLock) {
 | 
				
			||||||
 | 
					        furi_check(furi_mutex_acquire(furi_hal_spi_bus_d_mutex, FuriWaitForever) == FuriStatusOk);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventUnlock) {
 | 
				
			||||||
 | 
					        furi_check(furi_mutex_release(furi_hal_spi_bus_d_mutex) == FuriStatusOk);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventActivate) {
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI2);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusEventDeactivate) {
 | 
				
			||||||
 | 
					        FURI_CRITICAL_ENTER();
 | 
				
			||||||
 | 
					        LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2);
 | 
				
			||||||
 | 
					        FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriHalSpiBus furi_hal_spi_bus_d = {
 | 
				
			||||||
 | 
					    .spi = SPI2,
 | 
				
			||||||
 | 
					    .callback = furi_hal_spi_bus_d_event_callback,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SPI Bus Handles */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline static void furi_hal_spi_bus_r_handle_event_callback(
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandle* handle,
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandleEvent event,
 | 
				
			||||||
 | 
					    const LL_SPI_InitTypeDef* preset) {
 | 
				
			||||||
 | 
					    if(event == FuriHalSpiBusHandleEventInit) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, true);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->cs, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventDeinit) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, true);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->cs, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventActivate) {
 | 
				
			||||||
 | 
					        LL_SPI_Init(handle->bus->spi, (LL_SPI_InitTypeDef*)preset);
 | 
				
			||||||
 | 
					        LL_SPI_SetRxFIFOThreshold(handle->bus->spi, LL_SPI_RX_FIFO_TH_QUARTER);
 | 
				
			||||||
 | 
					        LL_SPI_Enable(handle->bus->spi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->miso,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->mosi,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->sck,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, false);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventDeactivate) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->miso, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->mosi, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->sck, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LL_SPI_Disable(handle->bus->spi);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline static void furi_hal_spi_bus_nfc_handle_event_callback(
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandle* handle,
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandleEvent event,
 | 
				
			||||||
 | 
					    const LL_SPI_InitTypeDef* preset) {
 | 
				
			||||||
 | 
					    if(event == FuriHalSpiBusHandleEventInit) {
 | 
				
			||||||
 | 
					        // Configure GPIOs in normal SPI mode
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->miso,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->mosi,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->sck,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, true);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->cs, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventDeinit) {
 | 
				
			||||||
 | 
					        // Configure GPIOs for st25r3916 Transparent mode
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->sck, GpioModeInput, GpioPullUp, GpioSpeedLow);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->miso, GpioModeInput, GpioPullUp, GpioSpeedLow);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->cs, GpioModeInput, GpioPullUp, GpioSpeedLow);
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->mosi, false);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->mosi, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventActivate) {
 | 
				
			||||||
 | 
					        LL_SPI_Init(handle->bus->spi, (LL_SPI_InitTypeDef*)preset);
 | 
				
			||||||
 | 
					        LL_SPI_SetRxFIFOThreshold(handle->bus->spi, LL_SPI_RX_FIFO_TH_QUARTER);
 | 
				
			||||||
 | 
					        LL_SPI_Enable(handle->bus->spi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->miso,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->mosi,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->sck,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventDeactivate) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->miso, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->mosi, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->sck, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LL_SPI_Disable(handle->bus->spi);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void furi_hal_spi_bus_handle_external_event_callback(
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandle* handle,
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandleEvent event) {
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_r_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_2m);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriHalSpiBusHandle furi_hal_spi_bus_handle_external = {
 | 
				
			||||||
 | 
					    .bus = &furi_hal_spi_bus_r,
 | 
				
			||||||
 | 
					    .callback = furi_hal_spi_bus_handle_external_event_callback,
 | 
				
			||||||
 | 
					    .miso = &gpio_ext_pa6,
 | 
				
			||||||
 | 
					    .mosi = &gpio_ext_pa7,
 | 
				
			||||||
 | 
					    .sck = &gpio_ext_pb3,
 | 
				
			||||||
 | 
					    .cs = &gpio_ext_pa4,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline static void furi_hal_spi_bus_d_handle_event_callback(
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandle* handle,
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandleEvent event,
 | 
				
			||||||
 | 
					    const LL_SPI_InitTypeDef* preset) {
 | 
				
			||||||
 | 
					    if(event == FuriHalSpiBusHandleEventInit) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, true);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->cs, GpioModeOutputPushPull, GpioPullUp, GpioSpeedVeryHigh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->miso,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI2);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->mosi,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI2);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init_ex(
 | 
				
			||||||
 | 
					            handle->sck,
 | 
				
			||||||
 | 
					            GpioModeAltFunctionPushPull,
 | 
				
			||||||
 | 
					            GpioPullNo,
 | 
				
			||||||
 | 
					            GpioSpeedVeryHigh,
 | 
				
			||||||
 | 
					            GpioAltFn5SPI2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventDeinit) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, true);
 | 
				
			||||||
 | 
					        furi_hal_gpio_init(handle->cs, GpioModeAnalog, GpioPullUp, GpioSpeedLow);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventActivate) {
 | 
				
			||||||
 | 
					        LL_SPI_Init(handle->bus->spi, (LL_SPI_InitTypeDef*)preset);
 | 
				
			||||||
 | 
					        LL_SPI_SetRxFIFOThreshold(handle->bus->spi, LL_SPI_RX_FIFO_TH_QUARTER);
 | 
				
			||||||
 | 
					        LL_SPI_Enable(handle->bus->spi);
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, false);
 | 
				
			||||||
 | 
					    } else if(event == FuriHalSpiBusHandleEventDeactivate) {
 | 
				
			||||||
 | 
					        furi_hal_gpio_write(handle->cs, true);
 | 
				
			||||||
 | 
					        LL_SPI_Disable(handle->bus->spi);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void furi_hal_spi_bus_handle_display_event_callback(
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandle* handle,
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandleEvent event) {
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_d_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_4m);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriHalSpiBusHandle furi_hal_spi_bus_handle_display = {
 | 
				
			||||||
 | 
					    .bus = &furi_hal_spi_bus_d,
 | 
				
			||||||
 | 
					    .callback = furi_hal_spi_bus_handle_display_event_callback,
 | 
				
			||||||
 | 
					    .miso = &gpio_spi_d_miso,
 | 
				
			||||||
 | 
					    .mosi = &gpio_spi_d_mosi,
 | 
				
			||||||
 | 
					    .sck = &gpio_spi_d_sck,
 | 
				
			||||||
 | 
					    .cs = &gpio_display_cs,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void furi_hal_spi_bus_handle_sd_fast_event_callback(
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandle* handle,
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandleEvent event) {
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_d_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_16m);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_fast = {
 | 
				
			||||||
 | 
					    .bus = &furi_hal_spi_bus_d,
 | 
				
			||||||
 | 
					    .callback = furi_hal_spi_bus_handle_sd_fast_event_callback,
 | 
				
			||||||
 | 
					    .miso = &gpio_spi_d_miso,
 | 
				
			||||||
 | 
					    .mosi = &gpio_spi_d_mosi,
 | 
				
			||||||
 | 
					    .sck = &gpio_spi_d_sck,
 | 
				
			||||||
 | 
					    .cs = &gpio_sdcard_cs,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void furi_hal_spi_bus_handle_sd_slow_event_callback(
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandle* handle,
 | 
				
			||||||
 | 
					    FuriHalSpiBusHandleEvent event) {
 | 
				
			||||||
 | 
					    furi_hal_spi_bus_d_handle_event_callback(handle, event, &furi_hal_spi_preset_1edge_low_2m);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_slow = {
 | 
				
			||||||
 | 
					    .bus = &furi_hal_spi_bus_d,
 | 
				
			||||||
 | 
					    .callback = furi_hal_spi_bus_handle_sd_slow_event_callback,
 | 
				
			||||||
 | 
					    .miso = &gpio_spi_d_miso,
 | 
				
			||||||
 | 
					    .mosi = &gpio_spi_d_mosi,
 | 
				
			||||||
 | 
					    .sck = &gpio_spi_d_sck,
 | 
				
			||||||
 | 
					    .cs = &gpio_sdcard_cs,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										55
									
								
								firmware/targets/f18/furi_hal/furi_hal_spi_config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								firmware/targets/f18/furi_hal/furi_hal_spi_config.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <furi_hal_spi_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Preset for ST25R916 */
 | 
				
			||||||
 | 
					extern const LL_SPI_InitTypeDef furi_hal_spi_preset_2edge_low_8m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Preset for CC1101 */
 | 
				
			||||||
 | 
					extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_8m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Preset for ST7567 (Display) */
 | 
				
			||||||
 | 
					extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_4m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Preset for SdCard in fast mode */
 | 
				
			||||||
 | 
					extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_16m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Preset for SdCard in slow mode */
 | 
				
			||||||
 | 
					extern const LL_SPI_InitTypeDef furi_hal_spi_preset_1edge_low_2m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Furi Hal Spi Bus R (External) */
 | 
				
			||||||
 | 
					extern FuriHalSpiBus furi_hal_spi_bus_r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Furi Hal Spi Bus D (Display, SdCard) */
 | 
				
			||||||
 | 
					extern FuriHalSpiBus furi_hal_spi_bus_d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** External on `furi_hal_spi_bus_r`
 | 
				
			||||||
 | 
					 * Preset: `furi_hal_spi_preset_1edge_low_2m`
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * miso: pa6
 | 
				
			||||||
 | 
					 * mosi: pa7
 | 
				
			||||||
 | 
					 * sck: pb3
 | 
				
			||||||
 | 
					 * cs:  pa4 (software controlled)
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @warning not initialized by default, call `furi_hal_spi_bus_handle_init` to initialize
 | 
				
			||||||
 | 
					 * Bus pins are floating on inactive state, CS high after initialization
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_external;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** ST7567(Display) on `furi_hal_spi_bus_d` */
 | 
				
			||||||
 | 
					extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_display;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** SdCard in fast mode on `furi_hal_spi_bus_d` */
 | 
				
			||||||
 | 
					extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_fast;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** SdCard in slow mode on `furi_hal_spi_bus_d` */
 | 
				
			||||||
 | 
					extern FuriHalSpiBusHandle furi_hal_spi_bus_handle_sd_slow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										1
									
								
								firmware/targets/f18/furi_hal/furi_hal_target_hw.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								firmware/targets/f18/furi_hal/furi_hal_target_hw.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
							
								
								
									
										21
									
								
								firmware/targets/f18/furi_hal/furi_hal_version_device.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								firmware/targets/f18/furi_hal/furi_hal_version_device.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					#include <furi_hal_version.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool furi_hal_version_do_i_belong_here() {
 | 
				
			||||||
 | 
					    return (furi_hal_version_get_hw_target() == 18) || (furi_hal_version_get_hw_target() == 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char* furi_hal_version_get_model_name() {
 | 
				
			||||||
 | 
					    return "Komi";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char* furi_hal_version_get_model_code() {
 | 
				
			||||||
 | 
					    return "N/A";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char* furi_hal_version_get_fcc_id() {
 | 
				
			||||||
 | 
					    return "N/A";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char* furi_hal_version_get_ic_id() {
 | 
				
			||||||
 | 
					    return "N/A";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										55
									
								
								firmware/targets/f18/target.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								firmware/targets/f18/target.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "inherit": "7",
 | 
				
			||||||
 | 
					    "include_paths": [
 | 
				
			||||||
 | 
					        "furi_hal"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sdk_header_paths": [
 | 
				
			||||||
 | 
					        "../furi_hal_include",
 | 
				
			||||||
 | 
					        "furi_hal",
 | 
				
			||||||
 | 
					        "platform_specific"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sdk_symbols": "api_symbols.csv",
 | 
				
			||||||
 | 
					    "linker_dependencies": [
 | 
				
			||||||
 | 
					        "print",
 | 
				
			||||||
 | 
					        "flipper18",
 | 
				
			||||||
 | 
					        "furi",
 | 
				
			||||||
 | 
					        "freertos",
 | 
				
			||||||
 | 
					        "stm32cubewb",
 | 
				
			||||||
 | 
					        "hwdrivers",
 | 
				
			||||||
 | 
					        "fatfs",
 | 
				
			||||||
 | 
					        "littlefs",
 | 
				
			||||||
 | 
					        "flipperformat",
 | 
				
			||||||
 | 
					        "toolbox",
 | 
				
			||||||
 | 
					        "microtar",
 | 
				
			||||||
 | 
					        "usb_stm32",
 | 
				
			||||||
 | 
					        "appframe",
 | 
				
			||||||
 | 
					        "assets",
 | 
				
			||||||
 | 
					        "misc",
 | 
				
			||||||
 | 
					        "flipper_application",
 | 
				
			||||||
 | 
					        "flipperformat",
 | 
				
			||||||
 | 
					        "toolbox",
 | 
				
			||||||
 | 
					        "flipper18"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "excluded_sources": [
 | 
				
			||||||
 | 
					        "furi_hal_infrared.c",
 | 
				
			||||||
 | 
					        "furi_hal_nfc.c",
 | 
				
			||||||
 | 
					        "furi_hal_rfid.c",
 | 
				
			||||||
 | 
					        "furi_hal_subghz.c"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "excluded_headers": [
 | 
				
			||||||
 | 
					        "furi_hal_infrared.h",
 | 
				
			||||||
 | 
					        "furi_hal_nfc.h",
 | 
				
			||||||
 | 
					        "furi_hal_rfid.h",
 | 
				
			||||||
 | 
					        "furi_hal_subghz.h",
 | 
				
			||||||
 | 
					        "furi_hal_ibutton.h",
 | 
				
			||||||
 | 
					        "furi_hal_subghz_configs.h"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "excluded_modules": [
 | 
				
			||||||
 | 
					        "one_wire",
 | 
				
			||||||
 | 
					        "nfc",
 | 
				
			||||||
 | 
					        "lfrfid",
 | 
				
			||||||
 | 
					        "subghz",
 | 
				
			||||||
 | 
					        "infrared",
 | 
				
			||||||
 | 
					        "st25rfal002"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
entry,status,name,type,params
 | 
					entry,status,name,type,params
 | 
				
			||||||
Version,+,11.10,,
 | 
					Version,+,12.1,,
 | 
				
			||||||
Header,+,applications/services/bt/bt_service/bt.h,,
 | 
					Header,+,applications/services/bt/bt_service/bt.h,,
 | 
				
			||||||
Header,+,applications/services/cli/cli.h,,
 | 
					Header,+,applications/services/cli/cli.h,,
 | 
				
			||||||
Header,+,applications/services/cli/cli_vcp.h,,
 | 
					Header,+,applications/services/cli/cli_vcp.h,,
 | 
				
			||||||
@ -41,14 +41,19 @@ Header,+,firmware/targets/f7/furi_hal/furi_hal_flash.h,,
 | 
				
			|||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_gpio.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_gpio.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_i2c_config.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_i2c_config.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_i2c_types.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_i2c_types.h,,
 | 
				
			||||||
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_ibutton.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_idle_timer.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_idle_timer.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_interrupt.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_interrupt.h,,
 | 
				
			||||||
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_nfc.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_os.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_os.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_pwm.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_pwm.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_resources.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_resources.h,,
 | 
				
			||||||
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_rfid.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_spi_config.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_spi_config.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_spi_types.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_spi_types.h,,
 | 
				
			||||||
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_subghz.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_subghz_configs.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_subghz_configs.h,,
 | 
				
			||||||
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_target_hw.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_uart.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_uart.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/furi_hal/furi_hal_usb_cdc.h,,
 | 
					Header,+,firmware/targets/f7/furi_hal/furi_hal_usb_cdc.h,,
 | 
				
			||||||
Header,+,firmware/targets/f7/platform_specific/intrinsic_export.h,,
 | 
					Header,+,firmware/targets/f7/platform_specific/intrinsic_export.h,,
 | 
				
			||||||
@ -61,22 +66,18 @@ Header,+,firmware/targets/furi_hal_include/furi_hal_cortex.h,,
 | 
				
			|||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_crypto.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_crypto.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_debug.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_debug.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_i2c.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_i2c.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_ibutton.h,,
 | 
					 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_info.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_info.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_infrared.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_infrared.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_light.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_light.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_memory.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_memory.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_mpu.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_mpu.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_nfc.h,,
 | 
					 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_power.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_power.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_random.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_random.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_region.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_region.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_rfid.h,,
 | 
					 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_rtc.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_rtc.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_sd.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_sd.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_speaker.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_speaker.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_spi.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_spi.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_subghz.h,,
 | 
					 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_usb.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_usb.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid.h,,
 | 
				
			||||||
Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid_u2f.h,,
 | 
					Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid_u2f.h,,
 | 
				
			||||||
@ -150,6 +151,16 @@ Header,+,lib/libusb_stm32/inc/usbd_core.h,,
 | 
				
			|||||||
Header,+,lib/mbedtls/include/mbedtls/des.h,,
 | 
					Header,+,lib/mbedtls/include/mbedtls/des.h,,
 | 
				
			||||||
Header,+,lib/mbedtls/include/mbedtls/sha1.h,,
 | 
					Header,+,lib/mbedtls/include/mbedtls/sha1.h,,
 | 
				
			||||||
Header,+,lib/micro-ecc/uECC.h,,
 | 
					Header,+,lib/micro-ecc/uECC.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-algo.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-array.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-bptree.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-core.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-deque.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-dict.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-list.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-rbtree.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-tuple.h,,
 | 
				
			||||||
 | 
					Header,+,lib/mlib/m-variant.h,,
 | 
				
			||||||
Header,+,lib/nfc/nfc_device.h,,
 | 
					Header,+,lib/nfc/nfc_device.h,,
 | 
				
			||||||
Header,+,lib/one_wire/ibutton/ibutton_worker.h,,
 | 
					Header,+,lib/one_wire/ibutton/ibutton_worker.h,,
 | 
				
			||||||
Header,+,lib/one_wire/maxim_crc.h,,
 | 
					Header,+,lib/one_wire/maxim_crc.h,,
 | 
				
			||||||
@ -852,6 +863,7 @@ Function,+,flipper_application_free,void,FlipperApplication*
 | 
				
			|||||||
Function,+,flipper_application_get_manifest,const FlipperApplicationManifest*,FlipperApplication*
 | 
					Function,+,flipper_application_get_manifest,const FlipperApplicationManifest*,FlipperApplication*
 | 
				
			||||||
Function,+,flipper_application_load_status_to_string,const char*,FlipperApplicationLoadStatus
 | 
					Function,+,flipper_application_load_status_to_string,const char*,FlipperApplicationLoadStatus
 | 
				
			||||||
Function,+,flipper_application_manifest_is_compatible,_Bool,"const FlipperApplicationManifest*, const ElfApiInterface*"
 | 
					Function,+,flipper_application_manifest_is_compatible,_Bool,"const FlipperApplicationManifest*, const ElfApiInterface*"
 | 
				
			||||||
 | 
					Function,+,flipper_application_manifest_is_target_compatible,_Bool,const FlipperApplicationManifest*
 | 
				
			||||||
Function,+,flipper_application_manifest_is_valid,_Bool,const FlipperApplicationManifest*
 | 
					Function,+,flipper_application_manifest_is_valid,_Bool,const FlipperApplicationManifest*
 | 
				
			||||||
Function,+,flipper_application_map_to_memory,FlipperApplicationLoadStatus,FlipperApplication*
 | 
					Function,+,flipper_application_map_to_memory,FlipperApplicationLoadStatus,FlipperApplication*
 | 
				
			||||||
Function,+,flipper_application_preload,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*"
 | 
					Function,+,flipper_application_preload,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*"
 | 
				
			||||||
@ -1022,7 +1034,7 @@ Function,+,furi_hal_cdc_get_port_settings,usb_cdc_line_coding*,uint8_t
 | 
				
			|||||||
Function,+,furi_hal_cdc_receive,int32_t,"uint8_t, uint8_t*, uint16_t"
 | 
					Function,+,furi_hal_cdc_receive,int32_t,"uint8_t, uint8_t*, uint16_t"
 | 
				
			||||||
Function,+,furi_hal_cdc_send,void,"uint8_t, uint8_t*, uint16_t"
 | 
					Function,+,furi_hal_cdc_send,void,"uint8_t, uint8_t*, uint16_t"
 | 
				
			||||||
Function,+,furi_hal_cdc_set_callbacks,void,"uint8_t, CdcCallbacks*, void*"
 | 
					Function,+,furi_hal_cdc_set_callbacks,void,"uint8_t, CdcCallbacks*, void*"
 | 
				
			||||||
Function,+,furi_hal_clock_deinit_early,void,
 | 
					Function,-,furi_hal_clock_deinit_early,void,
 | 
				
			||||||
Function,-,furi_hal_clock_init,void,
 | 
					Function,-,furi_hal_clock_init,void,
 | 
				
			||||||
Function,-,furi_hal_clock_init_early,void,
 | 
					Function,-,furi_hal_clock_init_early,void,
 | 
				
			||||||
Function,+,furi_hal_clock_mco_disable,void,
 | 
					Function,+,furi_hal_clock_mco_disable,void,
 | 
				
			||||||
@ -1103,7 +1115,7 @@ Function,+,furi_hal_hid_u2f_is_connected,_Bool,
 | 
				
			|||||||
Function,+,furi_hal_hid_u2f_send_response,void,"uint8_t*, uint8_t"
 | 
					Function,+,furi_hal_hid_u2f_send_response,void,"uint8_t*, uint8_t"
 | 
				
			||||||
Function,+,furi_hal_hid_u2f_set_callback,void,"HidU2fCallback, void*"
 | 
					Function,+,furi_hal_hid_u2f_set_callback,void,"HidU2fCallback, void*"
 | 
				
			||||||
Function,+,furi_hal_i2c_acquire,void,FuriHalI2cBusHandle*
 | 
					Function,+,furi_hal_i2c_acquire,void,FuriHalI2cBusHandle*
 | 
				
			||||||
Function,+,furi_hal_i2c_deinit_early,void,
 | 
					Function,-,furi_hal_i2c_deinit_early,void,
 | 
				
			||||||
Function,-,furi_hal_i2c_init,void,
 | 
					Function,-,furi_hal_i2c_init,void,
 | 
				
			||||||
Function,-,furi_hal_i2c_init_early,void,
 | 
					Function,-,furi_hal_i2c_init_early,void,
 | 
				
			||||||
Function,+,furi_hal_i2c_is_device_ready,_Bool,"FuriHalI2cBusHandle*, uint8_t, uint32_t"
 | 
					Function,+,furi_hal_i2c_is_device_ready,_Bool,"FuriHalI2cBusHandle*, uint8_t, uint32_t"
 | 
				
			||||||
@ -1241,7 +1253,7 @@ Function,-,furi_hal_region_init,void,
 | 
				
			|||||||
Function,+,furi_hal_region_is_frequency_allowed,_Bool,uint32_t
 | 
					Function,+,furi_hal_region_is_frequency_allowed,_Bool,uint32_t
 | 
				
			||||||
Function,+,furi_hal_region_is_provisioned,_Bool,
 | 
					Function,+,furi_hal_region_is_provisioned,_Bool,
 | 
				
			||||||
Function,+,furi_hal_region_set,void,FuriHalRegion*
 | 
					Function,+,furi_hal_region_set,void,FuriHalRegion*
 | 
				
			||||||
Function,+,furi_hal_resources_deinit_early,void,
 | 
					Function,-,furi_hal_resources_deinit_early,void,
 | 
				
			||||||
Function,-,furi_hal_resources_init,void,
 | 
					Function,-,furi_hal_resources_init,void,
 | 
				
			||||||
Function,-,furi_hal_resources_init_early,void,
 | 
					Function,-,furi_hal_resources_init_early,void,
 | 
				
			||||||
Function,+,furi_hal_rfid_change_read_config,void,"float, float"
 | 
					Function,+,furi_hal_rfid_change_read_config,void,"float, float"
 | 
				
			||||||
@ -1270,7 +1282,7 @@ Function,+,furi_hal_rfid_tim_read_start,void,
 | 
				
			|||||||
Function,+,furi_hal_rfid_tim_read_stop,void,
 | 
					Function,+,furi_hal_rfid_tim_read_stop,void,
 | 
				
			||||||
Function,+,furi_hal_rfid_tim_reset,void,
 | 
					Function,+,furi_hal_rfid_tim_reset,void,
 | 
				
			||||||
Function,+,furi_hal_rtc_datetime_to_timestamp,uint32_t,FuriHalRtcDateTime*
 | 
					Function,+,furi_hal_rtc_datetime_to_timestamp,uint32_t,FuriHalRtcDateTime*
 | 
				
			||||||
Function,+,furi_hal_rtc_deinit_early,void,
 | 
					Function,-,furi_hal_rtc_deinit_early,void,
 | 
				
			||||||
Function,+,furi_hal_rtc_get_boot_mode,FuriHalRtcBootMode,
 | 
					Function,+,furi_hal_rtc_get_boot_mode,FuriHalRtcBootMode,
 | 
				
			||||||
Function,+,furi_hal_rtc_get_datetime,void,FuriHalRtcDateTime*
 | 
					Function,+,furi_hal_rtc_get_datetime,void,FuriHalRtcDateTime*
 | 
				
			||||||
Function,+,furi_hal_rtc_get_fault_data,uint32_t,
 | 
					Function,+,furi_hal_rtc_get_fault_data,uint32_t,
 | 
				
			||||||
@ -1314,9 +1326,9 @@ Function,+,furi_hal_spi_bus_init,void,FuriHalSpiBus*
 | 
				
			|||||||
Function,+,furi_hal_spi_bus_rx,_Bool,"FuriHalSpiBusHandle*, uint8_t*, size_t, uint32_t"
 | 
					Function,+,furi_hal_spi_bus_rx,_Bool,"FuriHalSpiBusHandle*, uint8_t*, size_t, uint32_t"
 | 
				
			||||||
Function,+,furi_hal_spi_bus_trx,_Bool,"FuriHalSpiBusHandle*, uint8_t*, uint8_t*, size_t, uint32_t"
 | 
					Function,+,furi_hal_spi_bus_trx,_Bool,"FuriHalSpiBusHandle*, uint8_t*, uint8_t*, size_t, uint32_t"
 | 
				
			||||||
Function,+,furi_hal_spi_bus_tx,_Bool,"FuriHalSpiBusHandle*, uint8_t*, size_t, uint32_t"
 | 
					Function,+,furi_hal_spi_bus_tx,_Bool,"FuriHalSpiBusHandle*, uint8_t*, size_t, uint32_t"
 | 
				
			||||||
Function,+,furi_hal_spi_deinit_early,void,
 | 
					Function,-,furi_hal_spi_config_deinit_early,void,
 | 
				
			||||||
Function,-,furi_hal_spi_init,void,
 | 
					Function,-,furi_hal_spi_config_init,void,
 | 
				
			||||||
Function,+,furi_hal_spi_init_early,void,
 | 
					Function,-,furi_hal_spi_config_init_early,void,
 | 
				
			||||||
Function,+,furi_hal_spi_release,void,FuriHalSpiBusHandle*
 | 
					Function,+,furi_hal_spi_release,void,FuriHalSpiBusHandle*
 | 
				
			||||||
Function,-,furi_hal_subghz_dump_state,void,
 | 
					Function,-,furi_hal_subghz_dump_state,void,
 | 
				
			||||||
Function,+,furi_hal_subghz_flush_rx,void,
 | 
					Function,+,furi_hal_subghz_flush_rx,void,
 | 
				
			||||||
@ -1370,6 +1382,7 @@ Function,+,furi_hal_version_do_i_belong_here,_Bool,
 | 
				
			|||||||
Function,+,furi_hal_version_get_ble_local_device_name_ptr,const char*,
 | 
					Function,+,furi_hal_version_get_ble_local_device_name_ptr,const char*,
 | 
				
			||||||
Function,+,furi_hal_version_get_ble_mac,const uint8_t*,
 | 
					Function,+,furi_hal_version_get_ble_mac,const uint8_t*,
 | 
				
			||||||
Function,+,furi_hal_version_get_device_name_ptr,const char*,
 | 
					Function,+,furi_hal_version_get_device_name_ptr,const char*,
 | 
				
			||||||
 | 
					Function,+,furi_hal_version_get_fcc_id,const char*,
 | 
				
			||||||
Function,+,furi_hal_version_get_firmware_version,const Version*,
 | 
					Function,+,furi_hal_version_get_firmware_version,const Version*,
 | 
				
			||||||
Function,+,furi_hal_version_get_hw_body,uint8_t,
 | 
					Function,+,furi_hal_version_get_hw_body,uint8_t,
 | 
				
			||||||
Function,+,furi_hal_version_get_hw_color,FuriHalVersionColor,
 | 
					Function,+,furi_hal_version_get_hw_color,FuriHalVersionColor,
 | 
				
			||||||
@ -1380,6 +1393,8 @@ Function,+,furi_hal_version_get_hw_region_name,const char*,
 | 
				
			|||||||
Function,+,furi_hal_version_get_hw_target,uint8_t,
 | 
					Function,+,furi_hal_version_get_hw_target,uint8_t,
 | 
				
			||||||
Function,+,furi_hal_version_get_hw_timestamp,uint32_t,
 | 
					Function,+,furi_hal_version_get_hw_timestamp,uint32_t,
 | 
				
			||||||
Function,+,furi_hal_version_get_hw_version,uint8_t,
 | 
					Function,+,furi_hal_version_get_hw_version,uint8_t,
 | 
				
			||||||
 | 
					Function,+,furi_hal_version_get_ic_id,const char*,
 | 
				
			||||||
 | 
					Function,+,furi_hal_version_get_model_code,const char*,
 | 
				
			||||||
Function,+,furi_hal_version_get_model_name,const char*,
 | 
					Function,+,furi_hal_version_get_model_name,const char*,
 | 
				
			||||||
Function,+,furi_hal_version_get_name_ptr,const char*,
 | 
					Function,+,furi_hal_version_get_name_ptr,const char*,
 | 
				
			||||||
Function,+,furi_hal_version_get_otp_version,FuriHalVersionOtpVersion,
 | 
					Function,+,furi_hal_version_get_otp_version,FuriHalVersionOtpVersion,
 | 
				
			||||||
@ -3026,6 +3041,8 @@ Variable,+,gpio_infrared_rx,const GpioPin,
 | 
				
			|||||||
Variable,+,gpio_infrared_tx,const GpioPin,
 | 
					Variable,+,gpio_infrared_tx,const GpioPin,
 | 
				
			||||||
Variable,+,gpio_nfc_cs,const GpioPin,
 | 
					Variable,+,gpio_nfc_cs,const GpioPin,
 | 
				
			||||||
Variable,+,gpio_nfc_irq_rfid_pull,const GpioPin,
 | 
					Variable,+,gpio_nfc_irq_rfid_pull,const GpioPin,
 | 
				
			||||||
 | 
					Variable,+,gpio_pins,const GpioPinRecord[],
 | 
				
			||||||
 | 
					Variable,+,gpio_pins_count,const size_t,
 | 
				
			||||||
Variable,+,gpio_rf_sw_0,const GpioPin,
 | 
					Variable,+,gpio_rf_sw_0,const GpioPin,
 | 
				
			||||||
Variable,+,gpio_rfid_carrier,const GpioPin,
 | 
					Variable,+,gpio_rfid_carrier,const GpioPin,
 | 
				
			||||||
Variable,+,gpio_rfid_carrier_out,const GpioPin,
 | 
					Variable,+,gpio_rfid_carrier_out,const GpioPin,
 | 
				
			||||||
 | 
				
			|||||||
		
		
			
  | 
@ -17,7 +17,7 @@ void furi_hal_init_early() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    furi_hal_os_init();
 | 
					    furi_hal_os_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    furi_hal_spi_init_early();
 | 
					    furi_hal_spi_config_init_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    furi_hal_i2c_init_early();
 | 
					    furi_hal_i2c_init_early();
 | 
				
			||||||
    furi_hal_light_init();
 | 
					    furi_hal_light_init();
 | 
				
			||||||
@ -29,7 +29,7 @@ void furi_hal_deinit_early() {
 | 
				
			|||||||
    furi_hal_rtc_deinit_early();
 | 
					    furi_hal_rtc_deinit_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    furi_hal_i2c_deinit_early();
 | 
					    furi_hal_i2c_deinit_early();
 | 
				
			||||||
    furi_hal_spi_deinit_early();
 | 
					    furi_hal_spi_config_deinit_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    furi_hal_resources_deinit_early();
 | 
					    furi_hal_resources_deinit_early();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -52,7 +52,7 @@ void furi_hal_init() {
 | 
				
			|||||||
    furi_hal_version_init();
 | 
					    furi_hal_version_init();
 | 
				
			||||||
    furi_hal_region_init();
 | 
					    furi_hal_region_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    furi_hal_spi_init();
 | 
					    furi_hal_spi_config_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    furi_hal_ibutton_init();
 | 
					    furi_hal_ibutton_init();
 | 
				
			||||||
    FURI_LOG_I(TAG, "iButton OK");
 | 
					    FURI_LOG_I(TAG, "iButton OK");
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "furi_hal_bt_hid.h"
 | 
					#include <furi_hal_bt_hid.h>
 | 
				
			||||||
#include "furi_hal_usb_hid.h"
 | 
					#include <furi_hal_usb_hid.h>
 | 
				
			||||||
#include "usb_hid.h"
 | 
					#include "usb_hid.h"
 | 
				
			||||||
#include "dev_info_service.h"
 | 
					#include "dev_info_service.h"
 | 
				
			||||||
#include "battery_service.h"
 | 
					#include "battery_service.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_bt_serial.h"
 | 
					#include <furi_hal_bt_serial.h>
 | 
				
			||||||
#include "dev_info_service.h"
 | 
					#include "dev_info_service.h"
 | 
				
			||||||
#include "battery_service.h"
 | 
					#include "battery_service.h"
 | 
				
			||||||
#include "serial_service.h"
 | 
					#include "serial_service.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_cortex.h"
 | 
					#include <furi_hal_cortex.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stm32wbxx.h>
 | 
					#include <stm32wbxx.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_i2c_config.h"
 | 
					#include <furi_hal_i2c_config.h>
 | 
				
			||||||
#include <furi_hal_resources.h>
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
#include <furi_hal_version.h>
 | 
					#include <furi_hal_version.h>
 | 
				
			||||||
#include <stm32wbxx_ll_bus.h>
 | 
					#include <stm32wbxx_ll_bus.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include "furi_hal_gpio.h"
 | 
					#include <furi_hal_gpio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_infrared.h"
 | 
					#include <furi_hal_infrared.h>
 | 
				
			||||||
#include <core/check.h>
 | 
					#include <core/check.h>
 | 
				
			||||||
#include "stm32wbxx_ll_dma.h"
 | 
					#include "stm32wbxx_ll_dma.h"
 | 
				
			||||||
#include "sys/_stdint.h"
 | 
					#include "sys/_stdint.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include "furi_hal_interrupt.h"
 | 
					#include <furi_hal_interrupt.h>
 | 
				
			||||||
#include "furi_hal_os.h"
 | 
					#include <furi_hal_os.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include <core/common_defines.h>
 | 
					#include <core/common_defines.h>
 | 
				
			||||||
#include "furi_hal_resources.h"
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
#include <furi_hal_light.h>
 | 
					#include <furi_hal_light.h>
 | 
				
			||||||
#include <lp5562.h>
 | 
					#include <lp5562.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
#include <limits.h>
 | 
					#include <limits.h>
 | 
				
			||||||
#include "furi_hal_nfc.h"
 | 
					#include <furi_hal_nfc.h>
 | 
				
			||||||
#include <st25r3916.h>
 | 
					#include <st25r3916.h>
 | 
				
			||||||
#include <st25r3916_irq.h>
 | 
					#include <st25r3916_irq.h>
 | 
				
			||||||
#include <rfal_rf.h>
 | 
					#include <rfal_rf.h>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_pwm.h"
 | 
					#include <furi_hal_pwm.h>
 | 
				
			||||||
#include <core/check.h>
 | 
					#include <core/check.h>
 | 
				
			||||||
#include <furi_hal_resources.h>
 | 
					#include <furi_hal_resources.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
#include "furi_hal_random.h"
 | 
					#include <furi_hal_random.h>
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -62,6 +62,23 @@ const GpioPin periph_power = {.port = GPIOA, .pin = LL_GPIO_PIN_3};
 | 
				
			|||||||
const GpioPin gpio_usb_dm = {.port = GPIOA, .pin = LL_GPIO_PIN_11};
 | 
					const GpioPin gpio_usb_dm = {.port = GPIOA, .pin = LL_GPIO_PIN_11};
 | 
				
			||||||
const GpioPin gpio_usb_dp = {.port = GPIOA, .pin = LL_GPIO_PIN_12};
 | 
					const GpioPin gpio_usb_dp = {.port = GPIOA, .pin = LL_GPIO_PIN_12};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const GpioPinRecord gpio_pins[] = {
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa7, .name = "PA7", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa6, .name = "PA6", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pa4, .name = "PA4", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb3, .name = "PB3", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pb2, .name = "PB2", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc3, .name = "PC3", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc1, .name = "PC1", .debug = false},
 | 
				
			||||||
 | 
					    {.pin = &gpio_ext_pc0, .name = "PC0", .debug = false},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Dangerous pins, may damage hardware */
 | 
				
			||||||
 | 
					    {.pin = &gpio_usart_rx, .name = "PB7", .debug = true},
 | 
				
			||||||
 | 
					    {.pin = &gpio_speaker, .name = "PB8", .debug = true},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const size_t gpio_pins_count = sizeof(gpio_pins) / sizeof(GpioPinRecord);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const InputPin input_pins[] = {
 | 
					const InputPin input_pins[] = {
 | 
				
			||||||
    {.gpio = &gpio_button_up, .key = InputKeyUp, .inverted = true, .name = "Up"},
 | 
					    {.gpio = &gpio_button_up, .key = InputKeyUp, .inverted = true, .name = "Up"},
 | 
				
			||||||
    {.gpio = &gpio_button_down, .key = InputKeyDown, .inverted = true, .name = "Down"},
 | 
					    {.gpio = &gpio_button_down, .key = InputKeyDown, .inverted = true, .name = "Down"},
 | 
				
			||||||
 | 
				
			|||||||
@ -38,9 +38,18 @@ typedef struct {
 | 
				
			|||||||
    const char* name;
 | 
					    const char* name;
 | 
				
			||||||
} InputPin;
 | 
					} InputPin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    const GpioPin* pin;
 | 
				
			||||||
 | 
					    const char* name;
 | 
				
			||||||
 | 
					    const bool debug;
 | 
				
			||||||
 | 
					} GpioPinRecord;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const InputPin input_pins[];
 | 
					extern const InputPin input_pins[];
 | 
				
			||||||
extern const size_t input_pins_count;
 | 
					extern const size_t input_pins_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern const GpioPinRecord gpio_pins[];
 | 
				
			||||||
 | 
					extern const size_t gpio_pins_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const GpioPin vibro_gpio;
 | 
					extern const GpioPin vibro_gpio;
 | 
				
			||||||
extern const GpioPin ibutton_gpio;
 | 
					extern const GpioPin ibutton_gpio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user