mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #7675 from TomoYamanaka/improve_flashiap
Renesas : Improve Flash iappull/7604/merge
						commit
						e016d8d84d
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue