1pub mod erase_flash;
2mod ram_stub;
3pub mod read_flash;
4pub mod reset;
5pub mod speed;
6pub mod utils;
7pub mod write_flash;
8
9pub mod error;
10
11pub mod progress;
13
14pub mod common;
16
17pub mod sf32lb52;
19pub mod sf32lb56;
20pub mod sf32lb58;
21
22pub use crate::erase_flash::EraseFlashTrait;
24pub use crate::read_flash::ReadFlashTrait;
25pub use crate::write_flash::WriteFlashTrait;
26pub use error::{Error, Result};
27
28use crate::progress::{ProgressCallbackArc, ProgressHelper, no_op_progress_callback};
29use serialport::SerialPort;
30use std::sync::Arc;
31
32#[derive(Debug, Clone, PartialEq, Eq)]
33#[cfg_attr(feature = "cli", derive(clap::ValueEnum))]
34pub enum Operation {
35 #[cfg_attr(feature = "cli", clap(name = "no_reset"))]
36 None,
37 #[cfg_attr(feature = "cli", clap(name = "soft_reset"))]
38 SoftReset,
39 #[cfg_attr(feature = "cli", clap(name = "default_reset"))]
40 DefaultReset,
41}
42
43#[derive(Debug, Clone, PartialEq, Eq)]
44#[cfg_attr(feature = "cli", derive(clap::ValueEnum))]
45pub enum ChipType {
46 #[cfg_attr(feature = "cli", clap(name = "SF32LB52"))]
47 SF32LB52,
48 #[cfg_attr(feature = "cli", clap(name = "SF32LB56"))]
49 SF32LB56,
50 #[cfg_attr(feature = "cli", clap(name = "SF32LB58"))]
51 SF32LB58,
52}
53
54#[derive(Clone)]
55pub struct SifliToolBase {
56 pub port_name: String,
57 pub before: Operation,
58 pub memory_type: String,
59 pub baud: u32,
60 pub connect_attempts: i8,
61 pub compat: bool,
62 pub progress_callback: ProgressCallbackArc,
63 pub progress_helper: Arc<ProgressHelper>,
64}
65
66impl SifliToolBase {
67 pub fn new_with_no_progress(
69 port_name: String,
70 before: Operation,
71 memory_type: String,
72 baud: u32,
73 connect_attempts: i8,
74 compat: bool,
75 ) -> Self {
76 let progress_callback = no_op_progress_callback();
77 let progress_helper = Arc::new(ProgressHelper::new(progress_callback.clone(), 0));
78 Self {
79 port_name,
80 before,
81 memory_type,
82 baud,
83 connect_attempts,
84 compat,
85 progress_callback,
86 progress_helper,
87 }
88 }
89
90 pub fn new_with_progress(
92 port_name: String,
93 before: Operation,
94 memory_type: String,
95 baud: u32,
96 connect_attempts: i8,
97 compat: bool,
98 progress_callback: ProgressCallbackArc,
99 ) -> Self {
100 let progress_helper = Arc::new(ProgressHelper::new(progress_callback.clone(), 0));
101 Self {
102 port_name,
103 before,
104 memory_type,
105 baud,
106 connect_attempts,
107 compat,
108 progress_callback,
109 progress_helper,
110 }
111 }
112}
113
114pub struct WriteFlashParams {
115 pub files: Vec<WriteFlashFile>,
116 pub verify: bool,
117 pub no_compress: bool,
118 pub erase_all: bool,
119}
120
121#[derive(Debug)]
122pub struct WriteFlashFile {
123 pub address: u32,
124 pub file: std::fs::File,
125 pub crc32: u32,
126}
127
128pub struct ReadFlashParams {
129 pub files: Vec<ReadFlashFile>,
130}
131
132#[derive(Debug)]
133pub struct ReadFlashFile {
134 pub file_path: String,
135 pub address: u32,
136 pub size: u32,
137}
138
139#[derive(Clone)]
140pub struct EraseFlashParams {
141 pub address: u32,
142}
143
144pub struct EraseRegionParams {
145 pub regions: Vec<EraseRegionFile>,
146}
147
148#[derive(Debug)]
149pub struct EraseRegionFile {
150 pub address: u32,
151 pub size: u32,
152}
153
154pub trait SifliToolTrait: Send + Sync {
155 fn port(&mut self) -> &mut Box<dyn SerialPort>;
157
158 fn base(&self) -> &SifliToolBase;
160
161 fn progress(&mut self) -> Arc<ProgressHelper> {
163 self.base().progress_helper.clone()
165 }
166
167 fn set_speed(&mut self, baud: u32) -> Result<()>;
168 fn soft_reset(&mut self) -> Result<()>;
169}
170
171pub trait SifliTool:
172 SifliToolTrait + WriteFlashTrait + ReadFlashTrait + EraseFlashTrait + Send + Sync
173{
174 fn create_tool(base_param: SifliToolBase) -> Box<dyn SifliTool>
176 where
177 Self: Sized;
178}
179
180pub fn create_sifli_tool(chip_type: ChipType, base_param: SifliToolBase) -> Box<dyn SifliTool> {
182 match chip_type {
183 ChipType::SF32LB52 => sf32lb52::SF32LB52Tool::create_tool(base_param),
184 ChipType::SF32LB56 => sf32lb56::SF32LB56Tool::create_tool(base_param),
185 ChipType::SF32LB58 => sf32lb58::SF32LB58Tool::create_tool(base_param),
186 }
187}