Merge pull request #7675 from TomoYamanaka/improve_flashiap

Renesas : Improve Flash iap
pull/7604/merge
Cruz Monrreal 2018-08-02 10:12:21 -05:00 committed by GitHub
commit e016d8d84d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 39 deletions

View File

@ -40,6 +40,7 @@
#define FLASH_BASE (0x18000000UL) /**< Flash Base Address */
#define FLASH_SIZE (0x00800000UL) /**< Available Flash Memory */
#define FLASH_PAGE_SIZE 256 /**< Flash Memory page size (interleaving off) */
/**< Maximum size per one writing is 256 byte and minimum size per one writing is 1 byte */
#define FLASH_SECTOR_SIZE 4096 /**< Flash Memory sector size (interleaving off) */
#endif

View File

@ -40,6 +40,7 @@
#define FLASH_BASE (0x18000000UL) /**< Flash Base Address */
#define FLASH_SIZE (0x00800000UL) /**< Available Flash Memory */
#define FLASH_PAGE_SIZE 256 /**< Flash Memory page size (interleaving off) */
/**< Maximum size per one writing is 256 byte and minimum size per one writing is 1 byte */
#define FLASH_SECTOR_SIZE 4096 /**< Flash Memory sector size (interleaving off) */
#endif

View File

@ -167,7 +167,7 @@ uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
uint32_t flash_get_page_size(const flash_t *obj)
{
return FLASH_PAGE_SIZE;
return 1;
}
uint32_t flash_get_start_address(const flash_t *obj)
@ -222,49 +222,72 @@ int32_t _sector_erase(uint32_t addr)
int32_t _page_program(uint32_t addr, const uint8_t * buf, int32_t size)
{
int32_t ret;
int32_t program_size;
int32_t remainder;
int32_t idx = 0;
spi_mode();
/* ---- Write enable ---- */
ret = write_enable(); /* WREN Command */
if (ret != 0) {
ex_mode();
return ret;
while (size > 0) {
if (size > FLASH_PAGE_SIZE) {
program_size = FLASH_PAGE_SIZE;
} else {
program_size = size;
}
remainder = FLASH_PAGE_SIZE - (addr % FLASH_PAGE_SIZE);
if ((remainder != 0) && (program_size > remainder)) {
program_size = remainder;
}
/* ---- Write enable ---- */
ret = write_enable(); /* WREN Command */
if (ret != 0) {
ex_mode();
return ret;
}
/* ----------- 1. Command, Address ---------------*/
/* ---- spimd_reg init ---- */
clear_spimd_reg(&spimd_reg);
/* ---- command ---- */
spimd_reg.cde = SPIBSC_OUTPUT_ENABLE;
spimd_reg.cdb = SPIBSC_1BIT;
spimd_reg.cmd = SFLASHCMD_PAGE_PROGRAM;
/* ---- address ---- */
spimd_reg.ade = SPIBSC_OUTPUT_ADDR_24;
spimd_reg.addre = SPIBSC_SDR_TRANS; /* SDR */
spimd_reg.adb = SPIBSC_1BIT;
spimd_reg.addr = addr;
/* ---- Others ---- */
spimd_reg.sslkp = SPIBSC_SPISSL_KEEP; /* SPBSSL level */
ret = spibsc_transfer(&spimd_reg); /* Command,Address */
if (ret != 0) {
ex_mode();
return ret;
}
/* ----------- 2. Data ---------------*/
ret = data_send(SPIBSC_1BIT, SPIBSC_SPISSL_NEGATE, &buf[idx], program_size);
if (ret != 0) {
ex_mode();
return ret;
}
ret = busy_wait();
if (ret != 0) {
ex_mode();
return ret;
}
addr += program_size;
idx += program_size;
size -= program_size;
}
/* ----------- 1. Command, Address ---------------*/
/* ---- spimd_reg init ---- */
clear_spimd_reg(&spimd_reg);
/* ---- command ---- */
spimd_reg.cde = SPIBSC_OUTPUT_ENABLE;
spimd_reg.cdb = SPIBSC_1BIT;
spimd_reg.cmd = SFLASHCMD_PAGE_PROGRAM;
/* ---- address ---- */
spimd_reg.ade = SPIBSC_OUTPUT_ADDR_24;
spimd_reg.addre = SPIBSC_SDR_TRANS; /* SDR */
spimd_reg.adb = SPIBSC_1BIT;
spimd_reg.addr = addr;
/* ---- Others ---- */
spimd_reg.sslkp = SPIBSC_SPISSL_KEEP; /* SPBSSL level */
ret = spibsc_transfer(&spimd_reg); /* Command,Address */
if (ret != 0) {
ex_mode();
return ret;
}
/* ----------- 2. Data ---------------*/
ret = data_send(SPIBSC_1BIT, SPIBSC_SPISSL_NEGATE, buf, size);
if (ret != 0) {
ex_mode();
return ret;
}
ret = busy_wait();
ex_mode();
return ret;
}