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