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