sftool_lib/
lib.rs

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
11// 进度条回调系统
12pub mod progress;
13
14// 公共模块,包含可复用的逻辑
15pub mod common;
16
17// 芯片特定的实现模块
18pub mod sf32lb52;
19pub mod sf32lb56;
20pub mod sf32lb58;
21
22// 重新导出 trait,使其在 crate 外部可用
23pub 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    /// 创建一个使用默认空进度回调的 SifliToolBase
68    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    /// 创建一个使用自定义进度回调的 SifliToolBase
91    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    /// 获取串口的可变引用
156    fn port(&mut self) -> &mut Box<dyn SerialPort>;
157
158    /// 获取基础配置的引用
159    fn base(&self) -> &SifliToolBase;
160
161    /// 获取进度助手
162    fn progress(&mut self) -> Arc<ProgressHelper> {
163        // 使用共享的进度助手,它会自动处理步骤计数
164        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    /// 工厂函数,根据芯片类型创建对应的 SifliTool 实现
175    fn create_tool(base_param: SifliToolBase) -> Box<dyn SifliTool>
176    where
177        Self: Sized;
178}
179
180/// 工厂函数,根据芯片类型创建对应的 SifliTool 实现
181pub 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}