|
| 1 | +extern "C" { |
| 2 | + |
| 3 | + // fn esp_rom_spiflash_write_encrypted_enable(); |
| 4 | + // fn esp_rom_spiflash_write_encrypted_disable(); |
| 5 | + // fn esp_rom_spiflash_write_encrypted(addr: u32, data: *const u8, len: u32); |
| 6 | + // fn esp_rom_spiflash_config_param(); |
| 7 | + // fn esp_rom_spiflash_select_qio_pins(); |
| 8 | + // fn esp_rom_spi_flash_auto_sus_res(); |
| 9 | + // fn esp_rom_spi_flash_send_resume(); |
| 10 | + // fn esp_rom_spi_flash_update_id(); |
| 11 | + // fn esp_rom_spiflash_config_clk(); |
| 12 | + // fn esp_rom_spiflash_config_readmode(); |
| 13 | + // fn esp_rom_spiflash_read_status(/* esp_rom_spiflash_chip_t *spi ,*/ status: *mut u32); |
| 14 | + // fn esp_rom_spiflash_read_statushigh(/* esp_rom_spiflash_chip_t *spi ,*/ status: *mut u32); |
| 15 | + // fn esp_rom_spiflash_write_status(/* esp_rom_spiflash_chip_t *spi ,*/ status: *mut u32); |
| 16 | + |
| 17 | + fn esp_rom_spiflash_erase_chip() -> i32; |
| 18 | + fn esp_rom_spiflash_erase_block(block_number: u32) -> i32; |
| 19 | + // fn esp_rom_spiflash_erase_sector(sector_number: u32) -> i32; |
| 20 | + /// address (4 byte alignment), data, length |
| 21 | + fn esp_rom_spiflash_write(dest_addr: u32, data: *const u8, len: u32) -> i32; |
| 22 | + /// address (4 byte alignment), data, length |
| 23 | + // fn esp_rom_spiflash_read(src_addr: u32, data: *const u32, len: u32) -> i32; |
| 24 | + fn esp_rom_spiflash_read_user_cmd(status: *mut u32, cmd: u8) -> i32; |
| 25 | + // fn esp_rom_spiflash_unlock() -> i32; |
| 26 | + // fn esp_rom_spiflash_lock(); // can't find in idf defs? |
| 27 | + fn esp_rom_spiflash_attach(config: u32, legacy: bool); |
| 28 | + |
| 29 | + #[cfg(feature = "esp32c3")] |
| 30 | + fn ets_efuse_get_spiconfig() -> u32; |
| 31 | +} |
| 32 | + |
| 33 | +pub fn attach() { |
| 34 | + #[cfg(feature = "esp32c3")] |
| 35 | + let spiconfig: u32 = unsafe { ets_efuse_get_spiconfig() }; |
| 36 | + #[cfg(any(feature = "esp32c2", feature = "esp32c6", feature = "esp32h2"))] |
| 37 | + let spiconfig: u32 = 0; |
| 38 | + |
| 39 | + // TODO: raise CPU frequency |
| 40 | + |
| 41 | + unsafe { esp_rom_spiflash_attach(spiconfig, false) }; |
| 42 | +} |
| 43 | + |
| 44 | +pub fn erase_block(adr: u32) -> i32 { |
| 45 | + crate::dprintln!("ERASE @ {}", adr); |
| 46 | + |
| 47 | + unsafe { esp_rom_spiflash_erase_block(adr / crate::properties::FLASH_BLOCK_SIZE) } |
| 48 | +} |
| 49 | + |
| 50 | +pub fn erase_chip() -> i32 { |
| 51 | + unsafe { esp_rom_spiflash_erase_chip() } |
| 52 | +} |
| 53 | + |
| 54 | +pub fn write_flash(address: u32, data: &[u8]) -> i32 { |
| 55 | + if data.is_empty() { |
| 56 | + return 0; |
| 57 | + } |
| 58 | + let len = data.len() as u32; |
| 59 | + unsafe { esp_rom_spiflash_write(address, data.as_ptr(), len) } |
| 60 | +} |
| 61 | + |
| 62 | +pub fn wait_for_idle() -> i32 { |
| 63 | + const SR_WIP: u32 = 1 << 0; |
| 64 | + |
| 65 | + let mut status = SR_WIP; |
| 66 | + while status & SR_WIP != 0 { |
| 67 | + let res = unsafe { esp_rom_spiflash_read_user_cmd(&mut status, 0x05) }; |
| 68 | + if res != 0 { |
| 69 | + return res; |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + 0 |
| 74 | +} |
0 commit comments