Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AVR_ISP]: add AVR ISP Programmer FAP #2475

Merged
merged 56 commits into from
Apr 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
c3532c6
[AVR_ISP]: add AVR ISP Programmer FAP
Skorpionm Mar 9, 2023
6b4991b
[AVR_ISP]: fix syntax
Skorpionm Mar 9, 2023
92288d8
[AVR_ISP]: refactoring
Skorpionm Mar 10, 2023
d660f1f
[AVR_ISP]: refactoring
Skorpionm Mar 10, 2023
85ad336
[AVR_ISP]: add auto detect AVR chip
Skorpionm Mar 10, 2023
e3b6c23
[AVR_ISP]: fix auto detect chip
Skorpionm Mar 10, 2023
327fdcd
[AVR_ISP]: fix syntax
Skorpionm Mar 10, 2023
1319dbd
[AVR_ISP]: refactoring
Skorpionm Mar 13, 2023
0160d70
[AVR_ISP]: fix fast write flash
Skorpionm Mar 14, 2023
afebd2a
AVR_ISP: auto set SPI speed
Skorpionm Mar 14, 2023
d4a0643
AVR_ISP: add clock 4Mhz on &gpio_ext_pa4
Skorpionm Mar 14, 2023
29413f8
AVR_ISP: fix PVS
Skorpionm Mar 14, 2023
9c98444
AVR_ISP: fix "[CRASH][ISR 4] NULL pointer dereference" with no AVR ch…
Skorpionm Mar 15, 2023
c79c70a
AVR_ISP: add AVR ISP Reader
Skorpionm Mar 16, 2023
c0a728d
AVR_ISP: add read and check I32HEX file
Skorpionm Mar 17, 2023
5de80da
AVR_ISP: add write eerom, flash, fuse, lock byte
Skorpionm Mar 19, 2023
2280dc4
AVR_ISP: add gui Reader, Writer
Skorpionm Mar 20, 2023
c718689
Merge branch 'dev' into skorp/avr_isp_prog_fap
Skorpionm Mar 20, 2023
980ba86
Github: unshallow on decontamination
skotopes Mar 21, 2023
3335cc9
AVR_ISP: refactoring
Skorpionm Mar 21, 2023
2263bd5
Merge branch 'skorp/avr_isp_prog_fap' of github.com:Flipper-Zero/flip…
Skorpionm Mar 21, 2023
831f917
AVR_ISP: move to externel
Skorpionm Mar 21, 2023
fb62c99
Merge branch 'dev' into skorp/avr_isp_prog_fap
Skorpionm Mar 21, 2023
31c9365
API: fix api_symbols
Skorpionm Mar 21, 2023
b279bb7
AVR_ISP: add wiring scene
Skorpionm Mar 21, 2023
e8b6ee1
AVR_ISP: refactoring
Skorpionm Mar 21, 2023
9dc0229
GUI: model mutex FuriMutexTypeNormal -> FuriMutexTypeRecursive
Skorpionm Mar 21, 2023
53d5395
AVR_ISP: add chip_detect view
Skorpionm Mar 21, 2023
793de2b
AVR_ISP: refactoring gui ISP Programmer
Skorpionm Mar 22, 2023
9c95bb1
AVR_ISP: add gui "Dump AVR"
Skorpionm Mar 22, 2023
daa3c0f
AVR_ISP: add gui "Flash AVR"
Skorpionm Mar 23, 2023
918d1ca
SubGhz: fix
Skorpionm Mar 23, 2023
efccf0b
AVR_ISP: fix navigation gui
Skorpionm Mar 23, 2023
21019fc
AVR_ISP: refactoring
Skorpionm Mar 24, 2023
aaeab83
GUI: model mutex FuriMutexTypeRecursive -> FuriMutexTypeNormal
Skorpionm Mar 24, 2023
9ac5311
AVR_ISP: fix conflicts
Skorpionm Mar 24, 2023
f0bc579
Merge branch 'dev' into skorp/avr_isp_prog_fap
Skorpionm Mar 24, 2023
8382efe
AVR_ISP: fix build
Skorpionm Mar 24, 2023
822e6be
AVR_ISP: delete images
Skorpionm Mar 24, 2023
d1e18fc
AVR_ISP: add images
Skorpionm Mar 24, 2023
9f78cae
AVR_ISP: fix PVS
Skorpionm Mar 24, 2023
04cca7a
AVR_ISP: fix PVS
Skorpionm Mar 24, 2023
b7730ef
AVR_ISP: fix gui
Skorpionm Mar 24, 2023
f15a567
AVR_ISP: fix stuck in navigation
Skorpionm Mar 24, 2023
9b88e20
AVR_ISP: fix PVS
Skorpionm Mar 24, 2023
4ccb164
AVR_ISP: changing the Fuse bit recording logic
Skorpionm Mar 28, 2023
25452bf
AVR_ISP: fix PVS
Skorpionm Mar 28, 2023
4bbe9ec
AVR_ISP: fix read/write chips with memory greater than 64Kb
Skorpionm Mar 28, 2023
5f63fa0
AVR_ISP: fix auto set speed spi
Skorpionm Mar 28, 2023
1eaf629
AVR_ISP: fix gui
Skorpionm Mar 28, 2023
24edb93
Merge branch 'dev' into skorp/avr_isp_prog_fap
Skorpionm Mar 28, 2023
d6883fc
AVR_ISP: fix PVS
Skorpionm Mar 28, 2023
25f9b70
AVR_ISP: fix PVS
Skorpionm Mar 29, 2023
f327db7
ISP: switching on +5 volts to an external comb
Skorpionm Apr 4, 2023
8834982
ISP: fix syntax
Skorpionm Apr 4, 2023
e395e8b
Merge branch 'dev' into skorp/avr_isp_prog_fap
skotopes Apr 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions applications/external/avr_isp_programmer/application.fam
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
App(
appid="avr_isp",
name="AVR Flasher",
apptype=FlipperAppType.EXTERNAL,
entry_point="avr_isp_app",
requires=["gui"],
stack_size=4 * 1024,
order=20,
fap_icon="avr_app_icon_10x10.png",
fap_category="GPIO",
fap_icon_assets="images",
fap_private_libs=[
Lib(
name="driver",
),
],
)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
179 changes: 179 additions & 0 deletions applications/external/avr_isp_programmer/avr_isp_app.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
#include "avr_isp_app_i.h"

static bool avr_isp_app_custom_event_callback(void* context, uint32_t event) {
furi_assert(context);
AvrIspApp* app = context;
return scene_manager_handle_custom_event(app->scene_manager, event);
}

static bool avr_isp_app_back_event_callback(void* context) {
furi_assert(context);
AvrIspApp* app = context;
return scene_manager_handle_back_event(app->scene_manager);
}

static void avr_isp_app_tick_event_callback(void* context) {
furi_assert(context);
AvrIspApp* app = context;
scene_manager_handle_tick_event(app->scene_manager);
}

AvrIspApp* avr_isp_app_alloc() {
AvrIspApp* app = malloc(sizeof(AvrIspApp));

app->file_path = furi_string_alloc();
furi_string_set(app->file_path, STORAGE_APP_DATA_PATH_PREFIX);
app->error = AvrIspErrorNoError;

// GUI
app->gui = furi_record_open(RECORD_GUI);

// View Dispatcher
app->view_dispatcher = view_dispatcher_alloc();
app->scene_manager = scene_manager_alloc(&avr_isp_scene_handlers, app);
view_dispatcher_enable_queue(app->view_dispatcher);

view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
view_dispatcher_set_custom_event_callback(
app->view_dispatcher, avr_isp_app_custom_event_callback);
view_dispatcher_set_navigation_event_callback(
app->view_dispatcher, avr_isp_app_back_event_callback);
view_dispatcher_set_tick_event_callback(
app->view_dispatcher, avr_isp_app_tick_event_callback, 100);

view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);

// Open Notification record
app->notifications = furi_record_open(RECORD_NOTIFICATION);

// SubMenu
app->submenu = submenu_alloc();
view_dispatcher_add_view(
app->view_dispatcher, AvrIspViewSubmenu, submenu_get_view(app->submenu));

// Widget
app->widget = widget_alloc();
view_dispatcher_add_view(app->view_dispatcher, AvrIspViewWidget, widget_get_view(app->widget));

// Text Input
app->text_input = text_input_alloc();
view_dispatcher_add_view(
app->view_dispatcher, AvrIspViewTextInput, text_input_get_view(app->text_input));

// Popup
app->popup = popup_alloc();
view_dispatcher_add_view(app->view_dispatcher, AvrIspViewPopup, popup_get_view(app->popup));

//Dialog
app->dialogs = furi_record_open(RECORD_DIALOGS);

// Programmer view
app->avr_isp_programmer_view = avr_isp_programmer_view_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
AvrIspViewProgrammer,
avr_isp_programmer_view_get_view(app->avr_isp_programmer_view));

// Reader view
app->avr_isp_reader_view = avr_isp_reader_view_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
AvrIspViewReader,
avr_isp_reader_view_get_view(app->avr_isp_reader_view));

// Writer view
app->avr_isp_writer_view = avr_isp_writer_view_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
AvrIspViewWriter,
avr_isp_writer_view_get_view(app->avr_isp_writer_view));

// Chip detect view
app->avr_isp_chip_detect_view = avr_isp_chip_detect_view_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
AvrIspViewChipDetect,
avr_isp_chip_detect_view_get_view(app->avr_isp_chip_detect_view));

// Enable 5v power, multiple attempts to avoid issues with power chip protection false triggering
uint8_t attempts = 0;
while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
furi_hal_power_enable_otg();
furi_delay_ms(10);
}

scene_manager_next_scene(app->scene_manager, AvrIspSceneStart);

return app;
} //-V773

void avr_isp_app_free(AvrIspApp* app) {
furi_assert(app);

// Disable 5v power
if(furi_hal_power_is_otg_enabled()) {
furi_hal_power_disable_otg();
}

// Submenu
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewSubmenu);
submenu_free(app->submenu);

// Widget
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewWidget);
widget_free(app->widget);

// TextInput
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewTextInput);
text_input_free(app->text_input);

// Popup
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewPopup);
popup_free(app->popup);

//Dialog
furi_record_close(RECORD_DIALOGS);

// Programmer view
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewProgrammer);
avr_isp_programmer_view_free(app->avr_isp_programmer_view);

// Reader view
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewReader);
avr_isp_reader_view_free(app->avr_isp_reader_view);

// Writer view
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewWriter);
avr_isp_writer_view_free(app->avr_isp_writer_view);

// Chip detect view
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewChipDetect);
avr_isp_chip_detect_view_free(app->avr_isp_chip_detect_view);

// View dispatcher
view_dispatcher_free(app->view_dispatcher);
scene_manager_free(app->scene_manager);

// Notifications
furi_record_close(RECORD_NOTIFICATION);
app->notifications = NULL;

// Close records
furi_record_close(RECORD_GUI);

// Path strings
furi_string_free(app->file_path);

free(app);
}

int32_t avr_isp_app(void* p) {
UNUSED(p);
AvrIspApp* avr_isp_app = avr_isp_app_alloc();

view_dispatcher_run(avr_isp_app->view_dispatcher);

avr_isp_app_free(avr_isp_app);

return 0;
}
31 changes: 31 additions & 0 deletions applications/external/avr_isp_programmer/avr_isp_app_i.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include "avr_isp_app_i.h"
#include <lib/toolbox/path.h>
#include <flipper_format/flipper_format_i.h>

#define TAG "AvrIsp"

bool avr_isp_load_from_file(AvrIspApp* app) {
furi_assert(app);

FuriString* file_path = furi_string_alloc();
FuriString* file_name = furi_string_alloc();

DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options(
&browser_options, AVR_ISP_APP_EXTENSION, &I_avr_app_icon_10x10);
browser_options.base_path = STORAGE_APP_DATA_PATH_PREFIX;

// Input events and views are managed by file_select
bool res = dialog_file_browser_show(app->dialogs, file_path, app->file_path, &browser_options);

if(res) {
path_extract_dirname(furi_string_get_cstr(file_path), app->file_path);
path_extract_filename(file_path, file_name, true);
strncpy(app->file_name_tmp, furi_string_get_cstr(file_name), AVR_ISP_MAX_LEN_NAME);
}

furi_string_free(file_name);
furi_string_free(file_path);

return res;
}
44 changes: 44 additions & 0 deletions applications/external/avr_isp_programmer/avr_isp_app_i.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#pragma once

#include "helpers/avr_isp_types.h"
#include <avr_isp_icons.h>

#include "scenes/avr_isp_scene.h"
#include <gui/gui.h>
#include <gui/view_dispatcher.h>
#include <gui/scene_manager.h>
#include <gui/modules/submenu.h>
#include <gui/modules/widget.h>
#include <notification/notification_messages.h>
#include <gui/modules/text_input.h>
#include <dialogs/dialogs.h>
#include <storage/storage.h>
#include <gui/modules/popup.h>

#include "views/avr_isp_view_programmer.h"
#include "views/avr_isp_view_reader.h"
#include "views/avr_isp_view_writer.h"
#include "views/avr_isp_view_chip_detect.h"

#define AVR_ISP_MAX_LEN_NAME 64

typedef struct {
Gui* gui;
ViewDispatcher* view_dispatcher;
SceneManager* scene_manager;
NotificationApp* notifications;
DialogsApp* dialogs;
Popup* popup;
Submenu* submenu;
Widget* widget;
TextInput* text_input;
FuriString* file_path;
char file_name_tmp[AVR_ISP_MAX_LEN_NAME];
AvrIspProgrammerView* avr_isp_programmer_view;
AvrIspReaderView* avr_isp_reader_view;
AvrIspWriterView* avr_isp_writer_view;
AvrIspChipDetectView* avr_isp_chip_detect_view;
AvrIspError error;
} AvrIspApp;

bool avr_isp_load_from_file(AvrIspApp* app);
Loading