aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32
diff options
context:
space:
mode:
authorHaobo Gu <[email protected]>2024-10-25 18:27:48 +0800
committerHaobo Gu <[email protected]>2024-10-25 18:27:48 +0800
commit7b62d70d184ca9e8e7c6864d6ed39b4e8f75f02f (patch)
tree606d4ef6e78704b4364b7751af3b454a449fb4a3 /embassy-stm32
parente5bc2666547d0320635fede91c76d936c56a1a90 (diff)
feat(ospi): add memory mapped mode
Signed-off-by: Haobo Gu <[email protected]>
Diffstat (limited to 'embassy-stm32')
-rw-r--r--embassy-stm32/src/ospi/mod.rs63
1 files changed, 48 insertions, 15 deletions
diff --git a/embassy-stm32/src/ospi/mod.rs b/embassy-stm32/src/ospi/mod.rs
index 0574f7816..7ccafe361 100644
--- a/embassy-stm32/src/ospi/mod.rs
+++ b/embassy-stm32/src/ospi/mod.rs
@@ -179,39 +179,72 @@ pub struct Ospi<'d, T: Instance, M: PeriMode> {
179} 179}
180 180
181impl<'d, T: Instance, M: PeriMode> Ospi<'d, T, M> { 181impl<'d, T: Instance, M: PeriMode> Ospi<'d, T, M> {
182 pub fn enable_memory_mapped_mode(&mut self) { 182 /// Enter memory mode.
183 /// The Input `TransferConfig` is used to configure the read operation in memory mode
184 pub fn enable_memory_mapped_mode(
185 &mut self,
186 read_config: TransferConfig,
187 write_config: TransferConfig,
188 ) -> Result<(), OspiError> {
189 // Use configure command to set read config
190 self.configure_command(&read_config, None)?;
191
183 let reg = T::REGS; 192 let reg = T::REGS;
184 while reg.sr().read().busy() { 193 while reg.sr().read().busy() {
185 info!("wait ospi busy"); 194 info!("wait ospi busy");
186 } 195 }
187 196
188 reg.ccr().modify(|r| { 197 reg.ccr().modify(|r| {
189 r.set_isize(crate::ospi::vals::SizeInBits::_8BIT); 198 r.set_dqse(false);
190 r.set_adsize(crate::ospi::vals::SizeInBits::_24BIT); 199 r.set_sioo(true);
191 r.set_admode(crate::ospi::vals::PhaseMode::ONELINE); 200 });
192 r.set_imode(crate::ospi::vals::PhaseMode::ONELINE); 201
193 r.set_dmode(crate::ospi::vals::PhaseMode::FOURLINES); 202 // Set wrting configurations, there are separate registers for write configurations in memory mapped mode
203 reg.wccr().modify(|w| {
204 w.set_imode(PhaseMode::from_bits(write_config.iwidth.into()));
205 w.set_idtr(write_config.idtr);
206 w.set_isize(SizeInBits::from_bits(write_config.isize.into()));
207
208 w.set_admode(PhaseMode::from_bits(write_config.adwidth.into()));
209 w.set_addtr(write_config.idtr);
210 w.set_adsize(SizeInBits::from_bits(write_config.adsize.into()));
211
212 w.set_dmode(PhaseMode::from_bits(write_config.dwidth.into()));
213 w.set_ddtr(write_config.ddtr);
214
215 w.set_abmode(PhaseMode::from_bits(write_config.abwidth.into()));
216 w.set_dqse(true);
194 }); 217 });
195 218
219 reg.wtcr().modify(|w| w.set_dcyc(write_config.dummy.into()));
220
221 // Enable memory mapped mode
196 reg.cr().modify(|r| { 222 reg.cr().modify(|r| {
197 r.set_fmode(crate::ospi::vals::FunctionalMode::MEMORYMAPPED); 223 r.set_fmode(crate::ospi::vals::FunctionalMode::MEMORYMAPPED);
198 r.set_dmaen(false); 224 r.set_tcen(false);
199 r.set_en(true);
200 }); 225 });
201 226 Ok(())
202 // reg.tcr().modify(|r| {
203 // r.set_dcyc(6);
204 // });
205
206 } 227 }
228
229 /// Quit from memory mapped mode
207 pub fn disable_memory_mapped_mode(&mut self) { 230 pub fn disable_memory_mapped_mode(&mut self) {
208 let reg = T::REGS; 231 let reg = T::REGS;
209 while reg.sr().read().busy() { 232 while reg.sr().read().busy() {
210 info!("wait ospi busy"); 233 info!("wait ospi busy");
211 } 234 }
235
212 reg.cr().modify(|r| { 236 reg.cr().modify(|r| {
213 r.set_fmode(crate::ospi::vals::FunctionalMode::INDIRECTWRITE); 237 r.set_fmode(crate::ospi::vals::FunctionalMode::INDIRECTWRITE);
238 r.set_abort(true);
214 r.set_dmaen(false); 239 r.set_dmaen(false);
240 r.set_en(false);
241 });
242
243 // Clear transfer complete flag
244 reg.fcr().write(|w| w.set_ctcf(true));
245
246 // Re-enable ospi
247 reg.cr().modify(|r| {
215 r.set_en(true); 248 r.set_en(true);
216 }); 249 });
217 } 250 }