probe_rs_target/
flash_algorithm.rs1use super::flash_properties::FlashProperties;
2use crate::serialize::{hex_option, hex_u_int};
3use base64::{Engine as _, engine::general_purpose as base64_engine};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
8#[serde(rename_all = "snake_case")]
9pub enum TransferEncoding {
10 #[default]
12 Raw,
13
14 Miniz,
20}
21
22#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
29#[serde(deny_unknown_fields)]
30pub struct RawFlashAlgorithm {
31 pub name: String,
33 pub description: String,
35 #[serde(default)]
37 pub default: bool,
38 #[serde(deserialize_with = "deserialize")]
40 #[serde(serialize_with = "serialize")]
41 pub instructions: Vec<u8>,
42 #[serde(serialize_with = "hex_option")]
44 pub load_address: Option<u64>,
45 #[serde(serialize_with = "hex_option")]
47 pub data_load_address: Option<u64>,
48 #[serde(serialize_with = "hex_option")]
50 pub pc_init: Option<u64>,
51 #[serde(serialize_with = "hex_option")]
53 pub pc_uninit: Option<u64>,
54 #[serde(serialize_with = "hex_u_int")]
56 pub pc_program_page: u64,
57 #[serde(serialize_with = "hex_u_int")]
59 pub pc_erase_sector: u64,
60 #[serde(serialize_with = "hex_option")]
62 pub pc_erase_all: Option<u64>,
63 #[serde(serialize_with = "hex_option")]
65 pub pc_verify: Option<u64>,
66 #[serde(serialize_with = "hex_option")]
68 pub pc_blank_check: Option<u64>,
69 #[serde(serialize_with = "hex_option")]
71 pub pc_read: Option<u64>,
72 #[serde(serialize_with = "hex_option")]
74 pub pc_flash_size: Option<u64>,
75 #[serde(serialize_with = "hex_u_int")]
77 pub data_section_offset: u64,
78 #[serde(serialize_with = "hex_option")]
83 pub rtt_location: Option<u64>,
84 #[serde(default = "default_rtt_poll_interval")]
88 pub rtt_poll_interval: u64,
89 pub flash_properties: FlashProperties,
91 #[serde(default)]
93 pub cores: Vec<String>,
94 pub stack_size: Option<u32>,
100
101 #[serde(default)]
103 pub stack_overflow_check: Option<bool>,
104
105 #[serde(default)]
107 pub transfer_encoding: Option<TransferEncoding>,
108
109 #[serde(default)]
111 pub big_endian: bool,
112}
113
114impl RawFlashAlgorithm {
115 pub fn stack_overflow_check(&self) -> bool {
117 self.stack_overflow_check.unwrap_or(true)
118 }
119}
120
121pub fn serialize<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
122where
123 S: serde::Serializer,
124{
125 if serializer.is_human_readable() {
127 Base64::serialize(bytes, serializer)
128 } else {
129 Bytes::serialize(bytes, serializer)
130 }
131}
132
133pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
134where
135 D: serde::Deserializer<'de>,
136{
137 if deserializer.is_human_readable() {
139 Base64::deserialize(deserializer)
140 } else {
141 Bytes::deserialize(deserializer)
142 }
143}
144
145struct Base64;
146impl Base64 {
147 fn serialize<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
148 where
149 S: serde::Serializer,
150 {
151 serializer.serialize_str(base64_engine::STANDARD.encode(bytes).as_str())
152 }
153
154 fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
155 where
156 D: serde::Deserializer<'de>,
157 {
158 deserializer.deserialize_str(Base64)
159 }
160}
161impl serde::de::Visitor<'_> for Base64 {
162 type Value = Vec<u8>;
163
164 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
165 write!(formatter, "base64 ASCII text")
166 }
167
168 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
169 where
170 E: serde::de::Error,
171 {
172 base64_engine::STANDARD
173 .decode(v)
174 .map_err(serde::de::Error::custom)
175 }
176}
177
178struct Bytes;
179impl Bytes {
180 fn serialize<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
181 where
182 S: serde::Serializer,
183 {
184 serializer.serialize_bytes(bytes)
185 }
186
187 fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
188 where
189 D: serde::Deserializer<'de>,
190 {
191 deserializer.deserialize_bytes(Bytes)
192 }
193}
194impl serde::de::Visitor<'_> for Bytes {
195 type Value = Vec<u8>;
196
197 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
198 write!(formatter, "binary data")
199 }
200
201 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
202 where
203 E: serde::de::Error,
204 {
205 Ok(v.to_vec())
206 }
207}
208
209fn default_rtt_poll_interval() -> u64 {
210 20
211}