//! ISSI Serial NOR Flash. //! //! The same algorithm will query the flash part to differentiate //! the 3.3V part ("LP") from the 1.8V part ("WP"). Sequences and //! configurations vary by part. Replace the W and L with 'x'. use super::*; use crate::{ImxrtFlashAlgorithm, sequences::common as sequences}; pub type Is25xP128 = Issi<{ 128 / 8 * 1024 * 1024 }>; /// An ISSI serial NOR flash driver. pub struct Issi; const ISSI_WP_MEM_TYPE: u8 = 0x70; const ISSI_LP_MEM_TYPE: u8 = 0x60; impl ImxrtFlashAlgorithm for Issi { const FLASH_CAPACITY_BYTES: usize = FLASH_CAPACITY_BYTES; const FLASH_PAGE_SIZE_BYTES: usize = 256; const FLASH_SECTOR_SIZE_BYTES: usize = 4096; fn initialize(flexspi: imxrt_drivers_flexspi::Instance) { defmt::assert_eq!( READ_ID_JEDEC_ID, defmt::unwrap!(crate::install_ip_cmd( flexspi, READ_ID_JEDEC_ID.seq_id, &[sequences::SEQ_READ_ID_JEDEC_ID] )) ); let jedec_id = super::read_jedec_id(flexspi); defmt::assert_eq!(jedec_id.mnf_id, 0x9D); let (dummy_cycles, set_read_params_data) = match jedec_id.mem_type { ISSI_WP_MEM_TYPE => (15, 15 << 3), ISSI_LP_MEM_TYPE => (10, (0b111 << 5) | (0b11) << 3), _ => defmt::panic!("{=u8:#X}", jedec_id.mem_type), }; defmt::assert_eq!( READ, defmt::unwrap!(crate::install_ip_cmd( flexspi, READ.seq_id, &[sequences::seq_fast_read_quad_io(dummy_cycles)], )) ); defmt::assert_eq!( SET_READ_PARAMS, defmt::unwrap!(crate::install_ip_cmd( flexspi, SET_READ_PARAMS.seq_id, &[sequences::SEQ_SET_READ_PARAMS_VOL] )) ); defmt::assert_eq!( WRITE_ENABLE, defmt::unwrap!(crate::install_ip_cmd( flexspi, WRITE_ENABLE.seq_id, &[sequences::SEQ_WRITE_ENABLE] )) ); defmt::assert_eq!( ERASE_SECTOR, defmt::unwrap!(crate::install_ip_cmd( flexspi, ERASE_SECTOR.seq_id, &[sequences::SEQ_WRITE_ENABLE, sequences::SEQ_ERASE_SECTOR] )) ); defmt::assert_eq!( READ_STATUS, defmt::unwrap!(crate::install_ip_cmd( flexspi, READ_STATUS.seq_id, &[sequences::SEQ_READ_STATUS] )) ); defmt::assert_eq!( PAGE_PROGRAM, defmt::unwrap!(crate::install_ip_cmd( flexspi, PAGE_PROGRAM.seq_id, &[ sequences::SEQ_WRITE_ENABLE, sequences::SEQ_PAGE_PROGRAM_QUAD_INPUT ] )) ); defmt::assert_eq!( CHIP_ERASE, defmt::unwrap!(crate::install_ip_cmd( flexspi, CHIP_ERASE.seq_id, &[sequences::SEQ_WRITE_ENABLE, sequences::SEQ_ERASE_CHIP] )) ); defmt::assert_eq!( RESET, defmt::unwrap!(crate::install_ip_cmd( flexspi, RESET.seq_id, &[sequences::SEQ_RSTEN, sequences::SEQ_RST] )) ); let set_read_params_data = [set_read_params_data]; crate::start_ip_cmd(flexspi, SET_READ_PARAMS, 0, &set_read_params_data); crate::transmit_bytes(flexspi, &set_read_params_data); crate::wait_for_ip_cmd_done(flexspi); crate::clear_tx_fifo(flexspi); crate::wait_for_idle(flexspi); } }