@@ -433,76 +433,77 @@ QSPIHandle::Impl::Write(uint32_t address, uint32_t size, uint8_t* buffer)
433433
434434
435435QSPIHandle::Result QSPIHandle::Impl::Erase (uint32_t start_addr,
436- uint32_t end_addr)
436+ uint32_t end_addr)
437437{
438- uint32_t block_addr;
439- constexpr uint32_t BLOCK_64K = 0x10000 ; // 64KB
440- constexpr uint32_t SECTOR_4K = 0x1000 ; // 4KB
441-
442- // Align start address down to 4KB boundary
443- start_addr = start_addr - (start_addr % SECTOR_4K);
444-
445- while (end_addr > start_addr)
446- {
447- block_addr = start_addr & 0x0FFFFFFF ;
448-
449- // Use 64KB block erase when aligned and enough space remaining
450- if ((block_addr % BLOCK_64K) == 0 && (end_addr - start_addr) >= BLOCK_64K)
451- {
452- if (EraseBlock64K (block_addr) != QSPIHandle::Result::OK)
453- {
454- ERR_RECOVERY (Status::E_HAL_ERROR);
455- }
456- start_addr += BLOCK_64K;
457- }
458- else
459- {
460- // Fall back to 4KB sector erase
461- if (EraseSector (block_addr) != QSPIHandle::Result::OK)
462- {
463- ERR_RECOVERY (Status::E_HAL_ERROR);
464- }
465- start_addr += SECTOR_4K;
466- }
467- }
468- return QSPIHandle::Result::OK;
438+ uint32_t block_addr;
439+ constexpr uint32_t BLOCK_64K = 0x10000 ; // 64KB
440+ constexpr uint32_t SECTOR_4K = 0x1000 ; // 4KB
441+
442+ // Align start address down to 4KB boundary
443+ start_addr = start_addr - (start_addr % SECTOR_4K);
444+
445+ while (end_addr > start_addr)
446+ {
447+ block_addr = start_addr & 0x0FFFFFFF ;
448+
449+ // Use 64KB block erase when aligned and enough space remaining
450+ if ((block_addr % BLOCK_64K) == 0
451+ && (end_addr - start_addr) >= BLOCK_64K)
452+ {
453+ if (EraseBlock64K (block_addr) != QSPIHandle::Result::OK)
454+ {
455+ ERR_RECOVERY (Status::E_HAL_ERROR);
456+ }
457+ start_addr += BLOCK_64K;
458+ }
459+ else
460+ {
461+ // Fall back to 4KB sector erase
462+ if (EraseSector (block_addr) != QSPIHandle::Result::OK)
463+ {
464+ ERR_RECOVERY (Status::E_HAL_ERROR);
465+ }
466+ start_addr += SECTOR_4K;
467+ }
468+ }
469+ return QSPIHandle::Result::OK;
469470}
470471
471472QSPIHandle::Result QSPIHandle::Impl::EraseBlock64K (uint32_t address)
472473{
473- QSPI_CommandTypeDef s_command;
474- s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
475- s_command.Instruction = BLOCK_ERASE_CMD; // 0xD8 = 64KB block erase
476- s_command.AddressMode = QSPI_ADDRESS_1_LINE;
477- s_command.AddressSize = QSPI_ADDRESS_24_BITS;
478- s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
479- s_command.DataMode = QSPI_DATA_NONE;
480- s_command.DummyCycles = 0 ;
481- s_command.NbData = 1 ;
482- s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
483- s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
484- s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
485- s_command.Address = address;
486-
487- RETURN_IF_ERR (CheckProgramMemory ());
488- RETURN_IF_ERR (SetMode (Config::Mode::INDIRECT_POLLING));
489-
490- if (WriteEnable () != QSPIHandle::Result::OK)
491- {
492- ERR_RECOVERY (Status::E_HAL_ERROR);
493- }
494- if (HAL_QSPI_Command (&halqspi_, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
495- != HAL_OK)
496- {
497- ERR_RECOVERY (Status::E_HAL_ERROR);
498- }
499- if (AutopollingMemReady (HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
500- != QSPIHandle::Result::OK)
501- {
502- ERR_RECOVERY (Status::E_HAL_ERROR);
503- }
504-
505- return QSPIHandle::Result::OK;
474+ QSPI_CommandTypeDef s_command;
475+ s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
476+ s_command.Instruction = BLOCK_ERASE_CMD; // 0xD8 = 64KB block erase
477+ s_command.AddressMode = QSPI_ADDRESS_1_LINE;
478+ s_command.AddressSize = QSPI_ADDRESS_24_BITS;
479+ s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
480+ s_command.DataMode = QSPI_DATA_NONE;
481+ s_command.DummyCycles = 0 ;
482+ s_command.NbData = 1 ;
483+ s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
484+ s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
485+ s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
486+ s_command.Address = address;
487+
488+ RETURN_IF_ERR (CheckProgramMemory ());
489+ RETURN_IF_ERR (SetMode (Config::Mode::INDIRECT_POLLING));
490+
491+ if (WriteEnable () != QSPIHandle::Result::OK)
492+ {
493+ ERR_RECOVERY (Status::E_HAL_ERROR);
494+ }
495+ if (HAL_QSPI_Command (&halqspi_, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
496+ != HAL_OK)
497+ {
498+ ERR_RECOVERY (Status::E_HAL_ERROR);
499+ }
500+ if (AutopollingMemReady (HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
501+ != QSPIHandle::Result::OK)
502+ {
503+ ERR_RECOVERY (Status::E_HAL_ERROR);
504+ }
505+
506+ return QSPIHandle::Result::OK;
506507}
507508
508509QSPIHandle::Result QSPIHandle::Impl::EraseSector (uint32_t address)
0 commit comments