diff options
| author | Haobo Gu <[email protected]> | 2024-10-25 18:27:48 +0800 |
|---|---|---|
| committer | Haobo Gu <[email protected]> | 2024-10-25 18:27:48 +0800 |
| commit | 7b62d70d184ca9e8e7c6864d6ed39b4e8f75f02f (patch) | |
| tree | 606d4ef6e78704b4364b7751af3b454a449fb4a3 /embassy-stm32 | |
| parent | e5bc2666547d0320635fede91c76d936c56a1a90 (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.rs | 63 |
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 | ||
| 181 | impl<'d, T: Instance, M: PeriMode> Ospi<'d, T, M> { | 181 | impl<'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 | } |
