Files
2025-12-24 17:21:08 +09:00

214 lines
6.5 KiB
C

/*******************************************************************************
* DISCLAIMER
* This software is supplied by Renesas Electronics Corporation and is only
* intended for use with Renesas products. No other uses are authorized. This
* software is owned by Renesas Electronics Corporation and is protected under
* all applicable laws, including copyright laws.
* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* Renesas reserves the right, without notice, to make changes to this software
* and to discontinue the availability of this software. By using this software,
* you agree to the additional terms and conditions found by accessing the
* following link:
* http://www.renesas.com/disclaimer
* Copyright 2020-2022 Renesas Electronics Corporation All rights reserved.
*******************************************************************************/
/*******************************************************************************
* DESCRIPTION : QSPI Flash driver for S25FS512S
******************************************************************************/
/******************************************************************************
* @file spiflash2drv.c
* - Version : 0.04
* @brief QSPI Flash driver for S25FS512S.
* .
*****************************************************************************/
/******************************************************************************
* History : DD.MM.YYYY Version Description
* : 15.10.2021 0.01 First Release
* : 23.03.2022 0.02 Modify command for QSPI Flash to refer to
* : command table.
* : 01.04.2022 0.03 Modify magic number to definition.
* : 09.11.2022 0.04 License notation change.
*****************************************************************************/
#include <stdint.h>
#include <stddef.h>
#include <spiflash2drv.h>
#include <rpcqspidrv.h>
#include <rpc.h>
#include <log.h>
#include "dma2.h"
#define QSPI_PARAM_SEC_SIZE (0x1000U)
#define QSPI_PARAM_SEC_MASK (0xFFFFF000U)
void fast_rd_qspi_flash(uint32_t sourceSpiAdd, uint32_t destinationAdd, uint32_t byteCount)
{
uint32_t sourceAdd;
init_rpc_qspi_flash_4fastread_ext_mode();
sourceAdd = SPI_IOADDRESS_TOP + sourceSpiAdd;
// dma_trans_start(destinationAdd, sourceAdd, byteCount);
// dma_trans_end_check();
// dma2_init();
dma2_start(destinationAdd, sourceAdd, byteCount, DMA_MODE_SRC_INC);
dma2_end();
}
/* End of function fast_rd_qspi_flash */
/* Qspi:Sector Erase */
/* 4SE DCh */
void sector_erase_NNNkb_qspi_flash_s25s512s(uint32_t addr)
{
uint32_t status;
/* WRITE ENABLE */
write_command_qspi_flash((gp_qspi_cmd_tbl -> write_enable) << DRCMR_SMCMR_CMD_SHIFT);
sector_erase_4byte_qspi_flash(addr);
while(1)
{
read_status_qspi_flash(&status);
if( check_Erase_Fail(status) )
{
// put_str("Erase Error", CRLF_OFF);
ERROR("Erase Error!!\n");
break;
}
read_wip_status_register(&status);
if( !(status & BIT0) )
{
break;
}
}
}
/* End of function sector_erase_NNNkb_qspi_flash_s25s512s */
/* Qspi:Parameter 4-kB Sector Erase */
/* 4P4E 21h */
void parameter_sector_erase_4kb_qspi_flash_s25s512s(uint32_t addr)
{
uint32_t status;
/* WRITE ENABLE */
write_command_qspi_flash((gp_qspi_cmd_tbl -> write_enable) << DRCMR_SMCMR_CMD_SHIFT);
parameter_sector_erase_4kb_qspi_flash(addr);
while(1)
{
read_status_qspi_flash(&status);
if( check_Erase_Fail(status) )
{
ERROR("Erase Error!!\n");
break;
}
read_wip_status_register(&status);
if( !(status & BIT0) )
{
break;
}
}
}
/* End of function parameter_sector_erase_4kb_qspi_flash_s25s512s */
/* Qspi:Page Program (4PP:12h) */
void page_program_with_buf_qspi_flash_s25s512s(uint32_t addr, uint32_t source_addr)
{
uint32_t status;
/* WRITE ENABLE */
write_command_qspi_flash((gp_qspi_cmd_tbl -> write_enable) << DRCMR_SMCMR_CMD_SHIFT);
write_data_4pp_with_buf_qspi_flash(addr,source_addr); /* 4PP */
/* Add */
while(1)
{
read_wip_status_register(&status);
if( !(status & BIT0) )
{
break;
}
}
}
/* End of function page_program_with_buf_qspi_flash_s25s512s */
/* Qspi:Clear Block Protection of SR1V */
void clear_bp_qspi_flash(void)
{
uint32_t statusReg;
while(1)
{
read_wip_status_register(&statusReg);
if( !(statusReg & BIT0) )
{
break;
}
}
}
/* End of function clear_bp_qspi_flash */
void save_data_with_buf_qspi_flash(uint32_t srcAdd,uint32_t svFlashAdd,uint32_t svSize)
{
uint32_t flashAdd;
uint32_t writeDataAdd;
/* WRITE ENABLE */
write_command_qspi_flash((gp_qspi_cmd_tbl -> write_enable) << DRCMR_SMCMR_CMD_SHIFT);
writeDataAdd = srcAdd;
for(flashAdd=svFlashAdd; flashAdd<(svFlashAdd+svSize); flashAdd += RPC_WRITE_BUF_SIZE)
{ /* 256byte:RPC Write Buffer size */
page_program_with_buf_qspi_flash_s25s512s(flashAdd, writeDataAdd);
writeDataAdd = writeDataAdd + RPC_WRITE_BUF_SIZE;
}
}
/* End of function save_data_with_buf_qspi_flash */
void sector_erase_qspi_flash(uint32_t EraseStatAdd,uint32_t EraseEndAdd)
{
uint32_t sectorAd;
uint32_t SectorStatTopAdd;
uint32_t SectorEndTopAdd;
SectorStatTopAdd = EraseStatAdd & FLASH_SECTOR_MASK;
SectorEndTopAdd = EraseEndAdd & FLASH_SECTOR_MASK;
for(sectorAd = SectorStatTopAdd; sectorAd <= SectorEndTopAdd; sectorAd += FLASH_SECTOR_SIZE)
{
sector_erase_NNNkb_qspi_flash_s25s512s(sectorAd);
}
}
/* End of function sector_erase_qspi_flash_s25s512s */
void parameter_sector_erase_qspi_flash(uint32_t EraseStatAdd,uint32_t EraseEndAdd)
{
uint32_t sectorAd;
uint32_t SectorStatTopAdd;
uint32_t SectorEndTopAdd;
SectorStatTopAdd = EraseStatAdd & QSPI_PARAM_SEC_MASK;
SectorEndTopAdd = EraseEndAdd & QSPI_PARAM_SEC_MASK;
for(sectorAd = SectorStatTopAdd; sectorAd <= SectorEndTopAdd; sectorAd += QSPI_PARAM_SEC_SIZE)
{
parameter_sector_erase_4kb_qspi_flash_s25s512s(sectorAd);
}
}
/* End of function parameter_sector_erase_qspi_flash */