r_fdl_global.h 17.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
#ifdef ENABLE_QAC_TEST
    #pragma PRQA_MESSAGES_OFF 0292
#endif
/*********************************************************************************************************************
 * Library       : Data Flash Access Library for Renesas RH850 devices
 *
 * File Name     : $Source: r_fdl_global.h $
 * Lib. Version  : $RH850_FDL_LIB_VERSION_T01: V2.11 $
 * Mod. Revision : $Revision: 1.43 $
 * Mod. Date     : $Date: 2016/06/07 09:29:27JST $
 * Device(s)     : RV40 Flash based RH850 microcontroller
 * Description   : FDL internal definitions and global functions
 *********************************************************************************************************************/

/*********************************************************************************************************************
 * 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) 2015-2016 Renesas Electronics Corporation. All rights reserved.
 *********************************************************************************************************************/

#ifdef ENABLE_QAC_TEST
    #pragma PRQA_MESSAGES_ON 0292
#endif

/*********************************************************************************************************************
 * MISRA Rule:   MISRA-C 2004 rule 3.1 (QAC message 0292)
 * Reason:       To support automatic insertion of revision, module name etc. by the source revision control system
 *               it is necessary to violate the rule, because the system uses non basic characters as placeholders.
 * Verification: The placeholders are used in commentaries only. Therefore rule violation cannot influence code
 *               compilation.
 *********************************************************************************************************************/

#ifndef R_FDL_GLOBAL_H
#define R_FDL_GLOBAL_H


/*********************************************************************************************************************
 * Include list
 *********************************************************************************************************************/
#include "r_typedefs.h"
#include "r_fdl.h"
#include "r_fdl_env.h"

#if R_FDL_COMPILER == R_FDL_COMP_GHS
    uint32_t __STSR(int32_t regID, int32_t selID);
#elif R_FDL_COMPILER == R_FDL_COMP_IAR
    __intrinsic int32_t __STSR(int32_t reg, int32_t selID);
#elif R_FDL_COMPILER == R_FDL_COMP_REC
#endif

/*********************************************************************************************************************
 * Global constants (define, const, ...)
 *********************************************************************************************************************/
/* -------------------- Library version string ----------------------------- */
#define R_FDL_VERSION_STRING                    "DH850T01xxxxxxV211"

/* -------------------- Misc constants ------------------------------------- */
/* Reset value of request pointers */
#define R_FDL_REQUEST_POINTER_UNDEFINED         (r_fdl_request_t *)(0x00000000uL)
#define R_FDL_DESCRIPTOR_POINTER_UNDEFINED      (r_fdl_descriptor_t *)(0x00000000uL)
#define R_FDL_NULL                              (0x00000000uL)


/* -------------------- Size of RAM buffer for Code exececution ------------ */
/* Estimation of stack variable size:
   - Code size R_FDL_FCUFct_InitRAM_Asm: 166 Bytes (GHS/REC/IAR)
   - Code 1st address must be 16Byte aligned (fetch size): +16Bytes
   - Code last address must be 16Byte aligned (fetch size)
   - Prefetch: 4*16Byte
   --> 176Bytes (166Bytes aligned to 16Bytes) + 16Bytes + 64Bytes
       = 256Bytes = 128half words (=instruction alignment)
   - Code size R_FDL_IFct_GetFWParam_Asm: always less than R_FDL_FCUFct_InitRAM_Asm
*/
#define R_FDL_RAM_CODE_SIZE_HW                  (128)

/* ----- Unique timeout value is 40us ----- */
/* Clear cache register check loop timeout */
/* clocks per timeout loop */
#define R_FDL_TIMEOUT_CC_CLK_P_LOOP             (3)
/* timeout loop_count: (40us * f_MHz) / (clk per loop)   ---  but rounding up to be considered */
#define R_FDL_TIMEOUT_CC                        (   ( (40 * g_fdl_str.RTCfg_pstr->cpuFrequencyMHz_u16) \
                                                  + (R_FDL_TIMEOUT_CC_CLK_P_LOOP - 1) ) / R_FDL_TIMEOUT_CC_CLK_P_LOOP )

/* IO register check loop timeout */
/* clocks per timeout loop */
#define R_FDL_TIMEOUT_CHKREG_CLK_P_LOOP         (19)
/* timeout loop_count: (40us * f_MHz) / (clk per loop)   ---  but rounding up to be considered */
#define R_FDL_TIMEOUT_CHKREG                    (   ( (40 * g_fdl_str.RTCfg_pstr->cpuFrequencyMHz_u16) \
                                                  + (R_FDL_TIMEOUT_CHKREG_CLK_P_LOOP - 1) ) / R_FDL_TIMEOUT_CHKREG_CLK_P_LOOP )

/*********************************************************************************************************************
 * Global type definitions
 *********************************************************************************************************************/
/**
   \enum r_fdl_flag_t
   standard FDL internal flag definition
*/
typedef enum R_FDL_FLAG_T
{
    R_FDL_FALSE,                                    /**< Flag false */
    R_FDL_TRUE                                      /**< Flag true */
} r_fdl_flag_t;

/**
   \enum r_fdl_int_status_t
   definition of the FDL operational status
*/
typedef enum R_FDL_INT_STATUS_T
{
    R_FDL_ISTAT_NOINIT          = 0x00000000uL,     /**< Pattern for uninitialized library (0x00000000) */
    R_FDL_ISTAT_INIT            = 0x55555554uL,     /**< Pattern for initialized library after R_FDL_Init */
    R_FDL_ISTAT_NORMALOP        = 0x55555555uL,     /**< Pattern for prepared library after
                                                         R_FDL_CMD_PREPARE_ENV execution */
    R_FDL_ISTAT_SUSPEND_PR      = 0x55555556uL,     /**< Pattern for library in suspend processing */
    R_FDL_ISTAT_SUSPENDED       = 0x55555557uL,     /**< Pattern for library in suspend status */
    R_FDL_ISTAT_STANDBY_PR      = 0x55555558uL,     /**< Pattern for library in standby processing */
    R_FDL_ISTAT_STANDBY         = 0x55555559uL      /**< Pattern for library in standby */
} r_fdl_int_status_t;

/**
   \typedef r_fdl_pFct_ExeInRAM
   pointer to a function. Is used in e.g. R_FDL_FCUFct_InitRAM_...
*/
typedef void (* r_fdl_pFct_ExeInRAM)(uint32_t * param_pu32);

/**
   \enum r_fdl_op_status_t
   definition of the internal operation status required for switch mode handling
*/
typedef enum R_FDL_OP_STATUS_T
{
    R_FDL_OP_IDLE                 = 0,              /**< No on-going operation */
    R_FDL_OP_EXECUTE_SYNC_ON      = 1,              /**< Operation ready to start, switch mode 
                                                         to P/E requested */
    R_FDL_OP_PREPARE_START        = 2,              /**< Prepare environment operation ready to start, 
                                                         switch mode to P/E requested */
    R_FDL_OP_PREPARE_RST_FCU      = 3,              /**< Prepare environment operation started,
                                                         switch mode to P/E requested */
    R_FDL_OP_PREPARE_END          = 4,              /**< Prepare environment operation on-going, FCU reset performed, 
                                                         switch mode to read requested */
    R_FDL_OP_RESUME_SYNC_ON       = 5,              /**< Resume request accepted, switch mode 
                                                         to P/E requested */
    R_FDL_OP_RESUME_MULTI_SYNC_ON = 6,              /**< Resume request accepted to restart a multiple operation, 
                                                         switch mode to P/E requested */
    R_FDL_OP_BUSY                 = 7,              /**< On-going operation */
    R_FDL_OP_SUSPEND_SYNC_OFF     = 8,              /**< Suspend processing finished, switch mode to read requested */
    R_FDL_OP_END_SYNC_OFF         = 9               /**< Operation finished, switch mode to read requested */
} r_fdl_op_status_t;

/**
   \struct r_fdl_multiOp_t
   structure containing the data required for multi operations (erase multiple blocks, write multiple half words data)
*/
typedef struct R_FDL_MULTIOP_T
{
    uint32_t            flashAdd_u32;               /**< source data pointer */
    uint32_t            bufAdd_u32;                 /**< destination data pointer */
    uint32_t            flashAddEnd_u32;            /**< last source address to write */
    r_fdl_accessType_t  accessType_enu;             /**< access type */
} r_fdl_multiOp_t;

/**
   \struct r_fdl_data_t
   this structure contains all FDL internal data
*/
typedef struct R_FDL_DATA_T
{
    const r_fdl_descriptor_t *  RTCfg_pstr;         /**< pointer to descriptor structure, initialized by
                                                         R_FDL_ISTAT_INIT */
    r_fdl_multiOp_t     mulOp_str;                  /**< multi operation (erase/write) variables. Set when a multi
                                                         operation is started, checked/updated when a single
                                                         erase/write is finished */
    r_fdl_multiOp_t     spdMulOp_str;               /**< multi operation variables backup for FDL suspend */
    r_fdl_request_t *   reqSuspend_pstr;            /**< request structure pointer backup buffer for suspend/resume */
    r_fdl_request_t *   reqInt_pstr;                /**< request structure pointer for current operation */
    r_fdl_op_status_t   opStatus_enu;               /**< Operation status required for switch mode handling */
    uint32_t            opFailAddr_u32;             /**< fail address of the blank check operation */
    uint32_t            dfSize_u32;                 /**< Data Flash size, required for boundary checks */
    uint32_t            baseAddrECC_u32;            /**< ECC base address determined on firmware
                                                         parameter version */
    uint32_t            chksumEndAddr_u32;          /**< Checksum end address */
    uint32_t            chksumVal_u32;              /**< Checksum value */
    uint16_t            flashMode_u16;              /**< Current Flash operating mode: P/E or Read */
    r_fdl_status_t      spdResStatus_enu;           /**< result backup buffer for suspend/resume */
    r_fdl_status_t      opResult_enu;               /**< result backup buffer for switch mode handling */
    r_fdl_flag_t        cancelRequest_enu;          /**< cancel request indication to the handler */
    r_fdl_flag_t        spdSpdRequest_enu;          /**< suspend request indication to the handler */
    r_fdl_flag_t        spdResRequest_enu;          /**< resume request indication to the handler */
    r_fdl_int_status_t  stByIStatBackUp_enu;        /**< internal status backup for StandBy processing */
    r_fdl_int_status_t  iStat_enu;                  /**< FDL operational status variable */
} r_fdl_data_t;


/*********************************************************************************************************************
 * Global macros
 *********************************************************************************************************************/
/* Static functions definition */
#ifndef R_FDL_STATIC
    #define R_FDL_STATIC static
#endif


/*********************************************************************************************************************
 * Global function prototypes
 *********************************************************************************************************************/
r_fdl_status_t  R_FDL_FCUFct_CheckFatalError       (void);
r_fdl_flag_t    R_FDL_FCUFct_ChkReady              (void);
r_fdl_flag_t    R_FDL_FCUFct_ChkSuspendable        (void);
r_fdl_flag_t    R_FDL_FCUFct_ChkStartable          (r_fdl_command_t     cmd_enu);
void            R_FDL_FCUFct_ClearStatus           (void);
r_fdl_status_t  R_FDL_FCUFct_GetStat               (void);
r_fdl_status_t  R_FDL_FCUFct_InitRAM               (void);
r_fdl_status_t  R_FDL_FCUFct_ReadOperation         (volatile uint32_t * pAddSrc_u32, 
                                                    uint32_t            addDest_u32, 
                                                    uint32_t            cnt_u32);
r_fdl_flag_t    R_FDL_FCUFct_ResumeChkNeed         (void);
void            R_FDL_FCUFct_Resume                (void);
r_fdl_status_t  R_FDL_FCUFct_SetFrequency          (void);
r_fdl_status_t  R_FDL_FCUFct_GetDFSize             (uint32_t            *size);
r_fdl_status_t  R_FDL_FCUFct_StartBCEraseOperation (uint32_t            addStart_u32, 
                                                    uint32_t            addEnd_u32,
                                                    uint8_t             fcuCmd_u08,    
                                                    r_fdl_accessType_t  accType_enu);
r_fdl_status_t  R_FDL_FCUFct_StartWriteOperation   (uint32_t            addSrc_u32,   
                                                    uint32_t            addDest_u32,
                                                    uint32_t            cnt_u32,      
                                                    r_fdl_accessType_t  accType_enu);
void            R_FDL_FCUFct_Suspend               (void);
r_fdl_status_t  R_FDL_FCUFct_SwitchMode_Start      (uint16_t            mode_u16);
r_fdl_status_t  R_FDL_FCUFct_SwitchMode_Check      (void);
r_fdl_status_t  R_FDL_IFct_ChkAccessBoundaries     (uint32_t            addrStart_u32, 
                                                    uint32_t            bCnt_u32,
                                                    r_fdl_accessType_t  accType_enu, 
                                                    uint32_t            granularity_u32);
void            R_FDL_IFct_WriteMemoryU08          (uint32_t            addr_u32, 
                                                    uint8_t             val_u08);
void            R_FDL_IFct_CalcFOpUnitCnt_BC       (uint32_t *          cnt_pu32, 
                                                    uint32_t            addr_u32);
r_fdl_status_t  R_FDL_FCUFct_ForcedStop            (void);
void            R_FDL_FCUFct_Switch_FAEINT         (r_fdl_flag_t        on_t);
r_fdl_status_t  R_FDL_FCUFct_VerifyChecksum        (void);


/*********************************************************************************************************************
 * Global data declarations
 *********************************************************************************************************************/
#define R_FDL_START_SEC_VAR
#include "r_fdl_mem_map.h"

#if R_FDL_COMPILER == R_FDL_COMP_GHS
    #define R_FDL_NOINIT
#elif R_FDL_COMPILER == R_FDL_COMP_IAR
    #define R_FDL_NOINIT __no_init
#elif R_FDL_COMPILER == R_FDL_COMP_REC
    #define R_FDL_NOINIT
#endif

extern R_FDL_NOINIT r_fdl_data_t   g_fdl_str;         /**< fdl global variable structure */

#define R_FDL_STOP_SEC_VAR
#include "r_fdl_mem_map.h"

#ifndef R_FDL_EXE_INIT_CODE_ON_STACK
    #define R_FDL_START_SEC_CODERAM
    #include "r_fdl_mem_map.h"

    /* Code size calculation described in r_fdl_global.h */
    extern R_FDL_NOINIT uint16_t g_fdl_ramCodeBuf_au16[R_FDL_RAM_CODE_SIZE_HW];

    #define R_FDL_STOP_SEC_CODERAM
    #include "r_fdl_mem_map.h"
#endif
    

    
/*********************************************************************************************************************/


/*********************************************************************************************************************
 * Add test defines and typedefs
 *********************************************************************************************************************/
#ifdef PATCH_TO_SIMULATE_ERRORS
    #include "FDL-tc_common.h"
#endif

    /* specific defines for coverage measurement */
    #ifdef _BullseyeCoverage
        #define R_FDL_COV_SAVEOFF _Pragma ("BullseyeCoverage save off")
        #define R_FDL_COV_RESTORE _Pragma ("BullseyeCoverage restore")
    #else
        #define R_FDL_COV_SAVEOFF
        #define R_FDL_COV_RESTORE
    #endif
/*********************************************************************************************************************/
#endif /* ifndef R_FDL_GLOBAL_H */