tao_z
2022-05-25 1044ba0d2286698d0da28112bffc0f114bef2134
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
/**
 ******************************************************************************
 * @file    EEPROM_Emul/Porting/STM32L4/flash_interface.c
 * @author  MCD Application Team
 * @brief   This file provides all the EEPROM emulation flash interface functions.
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
 * All rights reserved.</center></h2>
 *
 * This software component is licensed by ST under BSD 3-Clause license,
 * the "License"; You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                        opensource.org/licenses/BSD-3-Clause
 *
 ******************************************************************************
 */
 
/* Includes ------------------------------------------------------------------*/
#include "eeprom_emul.h"
#include "flash_interface.h"
 
__STATIC_FORCEINLINE uint32_t disable_int(void)
{
  uint32_t s = __get_PRIMASK();
  __disable_irq();
  return s;
}
 
__STATIC_FORCEINLINE void restore_int(uint32_t s)
{
  __set_PRIMASK(s);
}
 
/** @addtogroup EEPROM_Emulation
 * @{
 */
 
/* Private typedef -----------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
#if defined(FLASH_BANK_2)
static uint32_t GetBankNumber(uint32_t Address);
#endif
 
/* Exported functions --------------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/** @addtogroup EEPROM_Private_Functions
 * @{
 */
 
/**
 * @brief  Write a double word at the given address in Flash
 * @param  Address Where to write
 * @param  Data What to write
 * @retval EE_Status
 *           - EE_OK: on success
 *           - EE_WRITE_ERROR: if an error occurs
 */
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t Data)
{
  EE_Status status = EE_OK;
  uint32_t data0 = (uint32_t)(Data >> 0);
  uint32_t data1 = (uint32_t)(Data >> 32);
  uint32_t int_state = disable_int();
  if (FLASH_Program2LongWord(Address, data0, data1) == 0)
  {
    FLASH_LaunchCMD();
    while (FLASH_GetCmdFinshFlag() == 0)
    {
    }
    if (FLASH_CheckErrStatus() != 0)
    {
      status = EE_WRITE_ERROR;
    }
  }
  restore_int(int_state);
  return status;
}
 
/**
 * @brief  Erase a page in polling mode
 * @param  Page Page number
 * @param  NbPages Number of pages to erase
 * @retval EE_Status
 *           - EE_OK: on success
 *           - EE error code: if an error occurs
 */
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages)
{
  EE_Status status = EE_OK;
  uint32_t addr = FLASH_BASE + Page * FLASH_PAGE_SIZE;
  uint32_t int_state = disable_int();
  while (NbPages > 0)
  {
    if (FLASH_EraseSector(addr) == 0)
    {
      FLASH_LaunchCMD();
      while (FLASH_GetCmdFinshFlag() == 0)
      {
      }
      if (FLASH_CheckErrStatus() != 0)
      {
        status = EE_ERASE_ERROR;
        break;
      }
      addr += FLASH_PAGE_SIZE;
      NbPages--;
    }
  }
  restore_int(int_state);
  return status;
}
 
/**
 * @brief  Erase a page with interrupt enabled
 * @param  Page Page number
 * @param  NbPages Number of pages to erase
 * @retval EE_Status
 *           - EE_OK: on success
 *           - EE error code: if an error occurs
 */
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages)
{
  return EE_ERASE_ERROR;
}
 
/**
 * @brief  Flush the caches if needed to keep coherency when the flash content is modified
 */
void FI_CacheFlush()
{
  /* No flush needed. There is no D-Cache for the STM32G0x0 and STM32G0x1 products. */
}
 
#if defined(FLASH_BANK_2)
/**
 * @brief  Gets the bank of a given address
 * @param  Address Address of the FLASH Memory
 * @retval Bank_Number The bank of a given address
 */
static uint32_t GetBankNumber(uint32_t Address)
{
  uint32_t bank = 0U;
 
  if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0U)
  {
    /* No Bank swap */
    if (Address < (FLASH_BASE + FLASH_BANK_SIZE))
    {
      bank = FLASH_BANK_1;
    }
    else
    {
      bank = FLASH_BANK_2;
    }
  }
  else
  {
    /* Bank swap */
    if (Address < (FLASH_BASE + FLASH_BANK_SIZE))
    {
      bank = FLASH_BANK_2;
    }
    else
    {
      bank = FLASH_BANK_1;
    }
  }
 
  return bank;
}
#endif
 
/**
 * @brief  Delete corrupted Flash address, can be called from NMI. No Timeout.
 * @param  Address Address of the FLASH Memory to delete
 * @retval EE_Status
 *           - EE_OK: on success
 *           - EE error code: if an error occurs
 */
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address)
{
  return EE_OK;
}
 
/**
 * @brief  Check if the configuration is 128-bits bank or 2*64-bits bank
 * @param  None
 * @retval EE_Status
 *           - EE_OK: on success
 *           - EE error code: if an error occurs
 */
EE_Status FI_CheckBankConfig(void)
{
  return EE_OK;
}
 
/**
 * @}
 */
 
/**
 * @}
 */
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/