[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…
Reference in New Issue
Block a user