mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-25 23:24:15 +01:00
51 lines
1.4 KiB
C
51 lines
1.4 KiB
C
#include "flash.h"
|
|
#include "fpga.h"
|
|
|
|
|
|
#define FLASH_ADDRESS (0x04000000UL)
|
|
#define FLASH_SIZE (16 * 1024 * 1024)
|
|
#define ERASE_BLOCK_SIZE (64 * 1024)
|
|
|
|
|
|
bool flash_program (uint32_t src, uint32_t dst, uint32_t length) {
|
|
if ((dst < FLASH_ADDRESS) || ((dst + length) > (FLASH_ADDRESS + FLASH_SIZE))) {
|
|
return true;
|
|
}
|
|
if ((src <= dst) && ((src + length) > dst)) {
|
|
return true;
|
|
}
|
|
if ((dst <= src) && ((dst + length) > src)) {
|
|
return true;
|
|
}
|
|
while (length > 0) {
|
|
uint32_t block = (length > FPGA_MAX_MEM_TRANSFER) ? FPGA_MAX_MEM_TRANSFER : length;
|
|
fpga_mem_copy(src, dst, block);
|
|
src += block;
|
|
dst += block;
|
|
length -= block;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void flash_wait_busy (void) {
|
|
uint8_t dummy[2];
|
|
fpga_mem_read(FLASH_ADDRESS, 2, dummy);
|
|
}
|
|
|
|
bool flash_erase_block (uint32_t address) {
|
|
if ((address % FLASH_ERASE_BLOCK_SIZE) != 0) {
|
|
return true;
|
|
}
|
|
if ((address < FLASH_ADDRESS) || (address >= (FLASH_ADDRESS + FLASH_SIZE))) {
|
|
return true;
|
|
}
|
|
address &= (FLASH_SIZE - 1);
|
|
for (int i = 0; i < (FLASH_ERASE_BLOCK_SIZE / ERASE_BLOCK_SIZE); i++) {
|
|
fpga_reg_set(REG_FLASH_SCR, address);
|
|
while (fpga_reg_get(REG_FLASH_SCR) & FLASH_SCR_BUSY);
|
|
address += ERASE_BLOCK_SIZE;
|
|
}
|
|
flash_wait_busy();
|
|
return false;
|
|
}
|