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