Add functions to enable/disable sector protection on flash
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
DataHoarder 2020-12-21 04:49:59 +01:00
parent 60f74b671e
commit 20a04186d2
3 changed files with 83 additions and 0 deletions

View file

@ -169,6 +169,11 @@ int main(int argc, char** argv){
sleep(1);
printf("Disabling sector protection.\n");
fm10k_uio_spi_DisableSectorProtection((uintptr_t)memmapAddr);
sleep(1);
for(uint32_t addr = 0; addr < bootImageSizeMax; addr += 4){
if(memcmp(valueBackup + addr, value + addr, 4) != 0){

View file

@ -253,6 +253,81 @@ uint32_t fm10k_uio_spi_ReadFlash(uintptr_t mem, uint32_t address, uint8_t* data,
return 0;
}
uint32_t fm10k_uio_spi_EnableSectorProtection(uintptr_t mem){
SPI_CTRL currentSpiCtrl;
SPI_CTRL spiCtrl = {0};
uint32_t header;
int32_t freq;
fm10k_uio_spi_Enable(mem);
ReadRegister32(mem, FM10K_REGISTER_SPI_CTRL, &currentSpiCtrl.value);
if(FM10K_SPI_FREQ_KHZ > 0){
freq = ((100000 / (int)FM10K_SPI_FREQ_KHZ) / 2) - 1;
if (freq < 0){
freq = 0;
}
spiCtrl.fields.Freq = freq;
}
spiCtrl.fields.Enable = 1;
header = (0x3D << 24) | (0x2A << 16) | (0x7F) | (0xA9);
WriteRegister32(mem, FM10K_REGISTER_SPI_HEADER, header);
/* first loop only: set send header flag. Following loops: shift only data. */
spiCtrl.fields.Command |= 0b0001;
/* send command to the flash */
if(fm10k_uio_spi_SetCtrlReg(mem, spiCtrl)){
return 1;
}
fm10k_uio_spi_Disable(mem);
return 0;
}
uint32_t fm10k_uio_spi_DisableSectorProtection(uintptr_t mem){
SPI_CTRL currentSpiCtrl;
SPI_CTRL spiCtrl = {0};
uint32_t header;
int32_t freq;
fm10k_uio_spi_Enable(mem);
ReadRegister32(mem, FM10K_REGISTER_SPI_CTRL, &currentSpiCtrl.value);
if(FM10K_SPI_FREQ_KHZ > 0){
freq = ((100000 / (int)FM10K_SPI_FREQ_KHZ) / 2) - 1;
if (freq < 0){
freq = 0;
}
spiCtrl.fields.Freq = freq;
}
spiCtrl.fields.Enable = 1;
header = (0x3D << 24) | (0x2A << 16) | (0x7F) | (0x9A);
WriteRegister32(mem, FM10K_REGISTER_SPI_HEADER, header);
/* first loop only: set send header flag. Following loops: shift only data. */
spiCtrl.fields.Command |= 0b0001;
/* send command to the flash */
if(fm10k_uio_spi_SetCtrlReg(mem, spiCtrl)){
return 1;
}
fm10k_uio_spi_Disable(mem);
return 0;
}
uint32_t fm10k_uio_spi_WriteFlash(uintptr_t mem, uint32_t address, const uint8_t* data, uint32_t len){

View file

@ -115,5 +115,8 @@ void fm10k_uio_spi_Disable(uintptr_t mem);
SPI_COMMAND_READ_MANUFACTURER_RESULT fm10k_uio_spi_ReadManufacturerData(uintptr_t mem);
const KNOWN_FLASH_DEVICE* getKnownFlashFromManufacturerData(SPI_COMMAND_READ_MANUFACTURER_RESULT data);
uint32_t fm10k_uio_spi_EnableSectorProtection(uintptr_t mem);
uint32_t fm10k_uio_spi_DisableSectorProtection(uintptr_t mem);
uint32_t fm10k_uio_spi_ReadFlash(uintptr_t mem, uint32_t address, uint8_t* data, uint32_t len);
uint32_t fm10k_uio_spi_WriteFlash(uintptr_t mem, uint32_t address, const uint8_t* data, uint32_t len);