New tool fm10k-flash #1
3 changed files with 83 additions and 0 deletions
|
@ -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){
|
||||
|
|
75
src/fm10k.c
75
src/fm10k.c
|
@ -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, ¤tSpiCtrl.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, ¤tSpiCtrl.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){
|
||||
|
||||
|
|
|
@ -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);
|
Loading…
Reference in a new issue