1 /*
2  * Copyright (c) 2023 Arm Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __DRIVER_FLASH_STRATA_H__
18 #define __DRIVER_FLASH_STRATA_H__
19 
20 #include "Driver_Flash_Common.h"
21 #include "spi_strataflashj3_flash_lib.h"
22 /*
23  * ARM FLASH device structure
24  */
25 struct arm_strata_flash_dev_t {
26     struct cfi_strataflashj3_dev_t *dev; /*!< FLASH memory device structure */
27     ARM_FLASH_INFO *data;                /*!< FLASH data */
28 };
29 /* Driver Capabilities */
30 static const ARM_FLASH_CAPABILITIES STRATAFLASHJ3DriverCapabilities = {
31     0, /* event_ready */
32     0, /* data_width = 0:8-bit, 1:16-bit, 2:32-bit */
33     1  /* erase_chip */
34 };
35 
ARM_Driver_GetCapabilities(void)36 static inline ARM_FLASH_CAPABILITIES ARM_Driver_GetCapabilities(void)
37 {
38     return STRATAFLASHJ3DriverCapabilities;
39 }
40 
41 /*
42  * \brief Macro for STRATA Flash Driver
43  *
44  * \param[in]  FLASH_DEV          Native driver device
45  *                                \ref arm_strata_flash_dev_t
46  * \param[out] FLASH_DRIVER_NAME  Resulting Driver name
47  */
48 #define ARM_FLASH_STRATA(FLASH_DEV, FLASH_DRIVER_NAME)                        \
49 static int32_t FLASH_DRIVER_NAME##_Initialize(                                \
50                                             ARM_Flash_SignalEvent_t cb_event) \
51 {                                                                             \
52     ARG_UNUSED(cb_event);                                                     \
53     enum strataflashj3_error_t ret;                                           \
54     struct cfi_strataflashj3_dev_t* dev = FLASH_DEV.dev;                      \
55     ARM_FLASH_INFO* data = FLASH_DEV.data;                                    \
56                                                                               \
57     dev->total_sector_cnt = data->sector_count;                               \
58     dev->page_size = data->page_size;                                         \
59     dev->sector_size = data->sector_size;                                     \
60     dev->program_unit = data->program_unit;                                   \
61                                                                               \
62                                                                               \
63     ret = cfi_strataflashj3_initialize(FLASH_DEV.dev);                        \
64                                                                               \
65     if (ret != STRATAFLASHJ3_ERR_NONE) {                                      \
66         CFI_FLASH_LOG_MSG("%s: Initialization failed.\n\r", __func__);        \
67         return ARM_DRIVER_ERROR;                                              \
68     }                                                                         \
69                                                                               \
70     return ARM_DRIVER_OK;                                                     \
71 }                                                                             \
72                                                                               \
73 static int32_t FLASH_DRIVER_NAME##_ReadData(uint32_t addr,                    \
74                                             void *data,                       \
75                                             uint32_t cnt)                     \
76 {                                                                             \
77     enum strataflashj3_error_t ret;                                           \
78                                                                               \
79     if (STRATAFLASHJ3DriverCapabilities.data_width > 2 ||                     \
80         STRATAFLASHJ3DriverCapabilities.data_width < 0)                       \
81     {                                                                         \
82         CFI_FLASH_LOG_MSG("%s: Incorrect data width selected: addr=0x%x\n\r", \
83                           __func__,                                           \
84                           addr);                                              \
85         return ARM_DRIVER_ERROR;                                              \
86     }                                                                         \
87                                                                               \
88     /* Conversion between data items and bytes */                             \
89     cnt *= data_width_byte[STRATAFLASHJ3DriverCapabilities.data_width];       \
90                                                                               \
91     ret = cfi_strataflashj3_read(FLASH_DEV.dev, addr, (uint8_t*) data, cnt);  \
92     if (ret != STRATAFLASHJ3_ERR_NONE) {                                      \
93         CFI_FLASH_LOG_MSG("%s: read failed: addr=0x%x, cnt=%u\n\r",           \
94                           __func__,                                           \
95                           addr,                                               \
96                           cnt);                                               \
97         return ARM_DRIVER_ERROR;                                              \
98     }                                                                         \
99                                                                               \
100     /* Conversion between bytes and data items */                             \
101     cnt /= data_width_byte[STRATAFLASHJ3DriverCapabilities.data_width];       \
102                                                                               \
103     return cnt;                                                               \
104 }                                                                             \
105                                                                               \
106 static int32_t FLASH_DRIVER_NAME##_ProgramData(uint32_t addr,                 \
107                                                const void *data,              \
108                                                uint32_t cnt)                  \
109 {                                                                             \
110     enum strataflashj3_error_t ret;                                           \
111                                                                               \
112     if (STRATAFLASHJ3DriverCapabilities.data_width > 2 ||                     \
113         STRATAFLASHJ3DriverCapabilities.data_width < 0)                       \
114     {                                                                         \
115         CFI_FLASH_LOG_MSG("%s: Incorrect data width selected: addr=0x%x\n\r", \
116                           __func__,                                           \
117                           addr);                                              \
118         return ARM_DRIVER_ERROR;                                              \
119     }                                                                         \
120                                                                               \
121     /* Conversion between data items and bytes */                             \
122     cnt *= data_width_byte[STRATAFLASHJ3DriverCapabilities.data_width];       \
123                                                                               \
124     ret = cfi_strataflashj3_program(FLASH_DEV.dev,                            \
125                                     addr,                                     \
126                                     (uint8_t*) data,                          \
127                                     cnt);                                     \
128     if (ret != STRATAFLASHJ3_ERR_NONE) {                                      \
129         CFI_FLASH_LOG_MSG("%s: program failed: addr=0x%x, cnt=%u\n\r",        \
130                           __func__,                                           \
131                           addr,                                               \
132                           cnt);                                               \
133         return ARM_DRIVER_ERROR;                                              \
134     }                                                                         \
135                                                                               \
136     /* Conversion between bytes and data items */                             \
137     cnt /= data_width_byte[STRATAFLASHJ3DriverCapabilities.data_width];       \
138                                                                               \
139     return cnt;                                                               \
140 }                                                                             \
141                                                                               \
142 static int32_t FLASH_DRIVER_NAME##_EraseSector(uint32_t addr)                 \
143 {                                                                             \
144     enum strataflashj3_error_t ret;                                           \
145                                                                               \
146     ret = cfi_strataflashj3_erase(FLASH_DEV.dev, addr);                       \
147     if (ret != STRATAFLASHJ3_ERR_NONE) {                                      \
148         CFI_FLASH_LOG_MSG("%s: erase failed: addr=0x%x\n\r", __func__, addr); \
149         return ARM_DRIVER_ERROR;                                              \
150     }                                                                         \
151                                                                               \
152     return ARM_DRIVER_OK;                                                     \
153 }                                                                             \
154                                                                               \
155 static int32_t FLASH_DRIVER_NAME##_EraseChip(void)                            \
156 {                                                                             \
157     enum strataflashj3_error_t ret;                                           \
158                                                                               \
159     ret = cfi_strataflashj3_erase_chip(FLASH_DEV.dev);                        \
160     if (ret != STRATAFLASHJ3_ERR_NONE) {                                      \
161         CFI_FLASH_LOG_MSG("%s: erase chip failed\n\r", __func__);             \
162         return ARM_DRIVER_ERROR;                                              \
163     }                                                                         \
164                                                                               \
165     return ARM_DRIVER_OK;                                                     \
166 }                                                                             \
167                                                                               \
168 static ARM_FLASH_INFO* FLASH_DRIVER_NAME##_GetInfo(void)                      \
169 {                                                                             \
170     return FLASH_DEV.data;                                                    \
171 }                                                                             \
172                                                                               \
173 ARM_DRIVER_FLASH FLASH_DRIVER_NAME = {                                        \
174     ARM_Flash_GetVersion,                                                     \
175     ARM_Driver_GetCapabilities,                                               \
176     FLASH_DRIVER_NAME##_Initialize,                                           \
177     ARM_Flash_Uninitialize,                                                   \
178     ARM_Flash_PowerControl,                                                   \
179     FLASH_DRIVER_NAME##_ReadData,                                             \
180     FLASH_DRIVER_NAME##_ProgramData,                                          \
181     FLASH_DRIVER_NAME##_EraseSector,                                          \
182     FLASH_DRIVER_NAME##_EraseChip,                                            \
183     ARM_Flash_GetStatus,                                                      \
184     FLASH_DRIVER_NAME##_GetInfo                                               \
185 }
186 
187 #endif /* __DRIVER_FLASH_STRATA_H__ */
188