/********************************************************************************************************************* * File Name : $Source: fdlapp_control.c $ * Mod. Revision : $Revision: 1.8 $ * Mod. Date : $Date: 2014/07/30 13:14:47MESZ $ * Device(s) : RV40 Flash based RH850 microcontroller * Description : Application sample program control module *********************************************************************************************************************/ /********************************************************************************************************************* * 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 (C) 2014 Renesas Electronics Corporation. All rights reserved. *********************************************************************************************************************/ /********************************************************************************************************************* * header files include *********************************************************************************************************************/ #include "r_typedefs.h" #include "r_fdl.h" #include "fdl_descriptor.h" #include "target.h" /********************************************************************************************************************* * Module internal function prototypes *********************************************************************************************************************/ /********************************************************************************************************************* Function name: SampleApp_FDL_Control *********************************************************************************************************************/ /** EEL sample function to handle FDL functionality. Executing a set of dummy Flash operations @param --- @return --- */ /*********************************************************************************************************************/ #if 0 void SampleApp_FDL_Control( void ) { r_fdl_status_t fdlRet; r_fdl_request_t req; uint8_t wBuf_au08[64] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f }; uint32_t rBuf_au32[64]; /* Read buffer must be 32bit aligned as the read operation accesses it 32bit aligned */ volatile uint16_t data; /* 1st initialize the FDL */ fdlRet = R_FDL_Init( &sampleApp_fdlConfig_enu ); if( R_FDL_OK != fdlRet ) { /* Error handler */ while( 1 ) ; } #ifndef R_FDL_LIB_V1_COMPATIBILITY /* Prepare the environment */ req.command_enu = R_FDL_CMD_PREPARE_ENV; req.idx_u32 = 0; req.cnt_u16 = 0; req.accessType_enu = R_FDL_ACCESS_NONE; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } #endif /* ----------------------------------------------------------------------- Example... Read a Word --> address 0x0004 of the Data Flash 1) Do a blank check to distinguish if the read value is based on erased data or written data. We can only trust written data 2) read the data ----------------------------------------------------------------------- */ req.command_enu = R_FDL_CMD_BLANKCHECK; req.idx_u32 = 0; req.cnt_u16 = 1; req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK == req.status_enu ) { /* The half word is blank... we may not read */ } else if( R_FDL_ERR_BLANKCHECK == req.status_enu ) { /* Read the data */ data = (*(uint16_t*)0xff200004); } else { /* Error handler.. on an internal error */ while( 1 ) ; } /* ----------------------------------------------------------------------- Example... Erase Flash block 0 ----------------------------------------------------------------------- */ req.command_enu = R_FDL_CMD_ERASE; req.idx_u32 = 0; req.cnt_u16 = 1; req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } /* ----------------------------------------------------------------------- Write data: addresses 0x00000000 - 0x0000001F ----------------------------------------------------------------------- */ req.command_enu = R_FDL_CMD_WRITE; req.idx_u32 = 0x0000; req.cnt_u16 = 0x8; req.bufAddr_u32 = (uint32_t)( &wBuf_au08[0] ); req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } /* ----------------------------------------------------------------------- Read data: addresses 0x00000000 - 0x0000001F ----------------------------------------------------------------------- */ req.command_enu = R_FDL_CMD_READ; req.idx_u32 = 0x0000; req.cnt_u16 = 0x8; req.bufAddr_u32 = (uint32_t)( &rBuf_au32[0] ); req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } /* ----------------------------------------------------------------------- Read data: addresses 0x00000020 - 0x00000023 ... Most probably resulting in ECC error ----------------------------------------------------------------------- */ req.command_enu = R_FDL_CMD_READ; req.idx_u32 = 0x0004; req.cnt_u16 = 0x2; req.bufAddr_u32 = (uint32_t)( &rBuf_au32[0] ); req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } return; } #endif void FDL_Init(void) { r_fdl_status_t fdlRetStatus; r_fdl_request_t fdlRequestCmd; fdlRetStatus = R_FDL_Init( &sampleApp_fdlConfig_enu ); if( R_FDL_OK != fdlRetStatus ) { /* Error handler */ while( 1 ) ; } fdlRequestCmd.command_enu = R_FDL_CMD_PREPARE_ENV; fdlRequestCmd.idx_u32 = 0; fdlRequestCmd.cnt_u16 = 0; fdlRequestCmd.accessType_enu = R_FDL_ACCESS_NONE; R_FDL_Execute( &fdlRequestCmd ); while( R_FDL_BUSY == fdlRequestCmd.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != fdlRequestCmd.status_enu ) { /* Error handler */ while( 1 ) ; } } r_fdl_status_t FDL_WriteDataBlock(uint32_t id,uint32_t* data, uint16_t len) { r_fdl_request_t fdlRequestCmd; uint16_t eraseblocknum; uint16_t remainder; eraseblocknum = len / 16u; remainder = len % 16u; if(remainder != 0) { eraseblocknum += 1; } fdlRequestCmd.command_enu = R_FDL_CMD_ERASE; fdlRequestCmd.idx_u32 = id; fdlRequestCmd.cnt_u16 = eraseblocknum; fdlRequestCmd.accessType_enu = R_FDL_ACCESS_USER; if(((320 - id) * 64) < (len * 4)) /*FDL 20K 共计320块 如果写入的数据超过320块则报参数错误*/ { fdlRequestCmd.status_enu = R_FDL_ERR_PARAMETER; } else { R_FDL_Execute( &fdlRequestCmd ); while( R_FDL_BUSY == fdlRequestCmd.status_enu ) { R_FDL_Handler(); } fdlRequestCmd.command_enu = R_FDL_CMD_WRITE; fdlRequestCmd.idx_u32 = id*0x40; fdlRequestCmd.cnt_u16 = len; fdlRequestCmd.bufAddr_u32 = (uint32_t)data; fdlRequestCmd.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &fdlRequestCmd ); while( R_FDL_BUSY == fdlRequestCmd.status_enu ) { R_FDL_Handler(); } } /*if( R_FDL_OK != fdlRequestCmd.status_enu ) { Error handler while( 1 ) ; }*/ return fdlRequestCmd.status_enu; } r_fdl_status_t FDL_ReadDataBlock(uint32_t id,uint32_t* data, uint16_t len) { r_fdl_request_t fdlRequestCmd; fdlRequestCmd.command_enu = R_FDL_CMD_READ; fdlRequestCmd.idx_u32 = id*0x40; fdlRequestCmd.cnt_u16 = len; fdlRequestCmd.bufAddr_u32 = (uint32_t)data ; fdlRequestCmd.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &fdlRequestCmd ); while( R_FDL_BUSY == fdlRequestCmd.status_enu ) { R_FDL_Handler(); } /* if( R_FDL_OK != fdlRequestCmd.status_enu ) { return fdlRequestCmd.status_enu; Error handler while( 1 ) ; }*/ return fdlRequestCmd.status_enu; } #if 0 void FDL_Test(void) { uint8_t rollback = 0; r_fdl_status_t fdlRet; r_fdl_request_t req; uint32_t number; number = 0; fdlRet = R_FDL_Init( &sampleApp_fdlConfig_enu ); if( R_FDL_OK != fdlRet ) { /* Error handler */ while( 1 ) ; } req.command_enu = R_FDL_CMD_PREPARE_ENV; req.idx_u32 = 0; req.cnt_u16 = 0; req.accessType_enu = R_FDL_ACCESS_NONE; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } for(uint32_t i= 0;i<32;i++) { /* req.command_enu = R_FDL_CMD_BLANKCHECK; req.idx_u32 = i; req.cnt_u16 = 16; req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); }*/ req.command_enu = R_FDL_CMD_ERASE; req.idx_u32 = i; req.cnt_u16 = 1; req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } number++; if(rollback) { req.command_enu = R_FDL_CMD_WRITE; req.idx_u32 = i*0x40; req.cnt_u16 = 16; Fill_Buffer_55[0] =number; req.bufAddr_u32 = (uint32_t)( &Fill_Buffer_55[0] ); req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } rollback=!rollback; } else { req.command_enu = R_FDL_CMD_WRITE; req.idx_u32 = i*0x40; req.cnt_u16 = 16; Fill_Buffer_AA[0] =number; req.bufAddr_u32 = (uint32_t)( &Fill_Buffer_AA[0] ); req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } rollback=!rollback; } } for(uint16_t i= 0;i<32;i++) { req.command_enu = R_FDL_CMD_READ; req.idx_u32 = i*0x40; req.cnt_u16 = 16; req.bufAddr_u32 = (uint32_t)( &FillReadBuffer[0] ); req.accessType_enu = R_FDL_ACCESS_USER; R_FDL_Execute( &req ); while( R_FDL_BUSY == req.status_enu ) { R_FDL_Handler(); } if( R_FDL_OK != req.status_enu ) { /* Error handler */ while( 1 ) ; } } } #endif