blob: 6c60e98cb6e39d9162a215f31218bcfef753782a [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <fcntl.h>
5#include <unistd.h>
6#include <sys/ioctl.h>
7#include <mtd/mtd-user.h>
8#include <errno.h>
9#include <dlfcn.h>
10
11#include "gsw_oem_rw_interface.h"
12
13
14#ifndef LOG_ERR_LEVEL
15#define LOG_ERR_LEVEL 3 /* error conditions */
16#endif
17#ifndef LOG_WARN_LEVEL
18#define LOG_WARN_LEVEL 4 /* warning conditions */
19#endif
20#ifndef LOG_INFO_LEVEL
21#define LOG_INFO_LEVEL 6 /* informational */
22#endif
23#ifndef LOG_DEBUG_LEVEL
24#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
25#endif
26#ifndef LOG_VERBOSE_LEVEL
27#define LOG_VERBOSE_LEVEL 8
28#endif
29
30#define ERASE_BLOCK_SIZE (256*1024)
31
32#define LIB_PATH "/lib/libmbtk_lib.so"
33
34
35#define StatFunc(x,y) stat(x,y)
36
37#define LOGV(fmt, args ...) \
38 do{ \
39 char *file_ptr_1001 = __FILE__; \
40 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
41 char line_1001[10] = {0}; \
42 sprintf(line_1001, "%d", __LINE__); \
43 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
44 if(*ptr_1001 == '/') \
45 break; \
46 ptr_1001--; \
47 } \
48 fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
49 } while(0)
50
51#define LOGI(fmt, args...) \
52 do{ \
53 char *file_ptr_1001 = __FILE__; \
54 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
55 char line_1001[10] = {0}; \
56 sprintf(line_1001, "%d", __LINE__); \
57 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
58 if(*ptr_1001 == '/') \
59 break; \
60 ptr_1001--; \
61 } \
62 fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
63 } while(0)
64
65#define LOGD(fmt, args...) \
66 do{ \
67 char *file_ptr_1001 = __FILE__; \
68 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
69 char line_1001[10] = {0}; \
70 sprintf(line_1001, "%d", __LINE__); \
71 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
72 if(*ptr_1001 == '/') \
73 break; \
74 ptr_1001--; \
75 } \
76 fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
77 } while(0)
78
79#define LOGW(fmt, args...) \
80 do{ \
81 char *file_ptr_1001 = __FILE__; \
82 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
83 char line_1001[10] = {0}; \
84 sprintf(line_1001, "%d", __LINE__); \
85 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
86 if(*ptr_1001 == '/') \
87 break; \
88 ptr_1001--; \
89 } \
90 fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
91 } while(0)
92
93#define LOGE(fmt, args...) \
94 do{ \
95 char *file_ptr_1001 = __FILE__; \
96 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
97 char line_1001[10] = {0}; \
98 sprintf(line_1001, "%d", __LINE__); \
99 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
100 if(*ptr_1001 == '/') \
101 break; \
102 ptr_1001--; \
103 } \
104 fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
105 } while(0)
106
107typedef void (*mbtk_log)(int level, const char *format,...);
108
109typedef int (*mbtk_oem_read_data_ext)(unsigned int block_id, void *data, unsigned int *len);
110
111typedef int (*mbtk_oem_write_data_ext)(unsigned int block_id, void *data, unsigned int len);
112
113static mbtk_log fun_ptr_log = NULL;
114
115static mbtk_oem_read_data_ext mbtk_read_fun_ptr = NULL;
116static mbtk_oem_write_data_ext mbtk_write_fun_ptr = NULL;
117
118static void *handle = NULL;
119
120static int init_fun_handle()
121{
122 if(handle == NULL)
123 {
124 handle = dlopen(LIB_PATH, RTLD_NOW );
125 if(handle == NULL)
126 {
127 return -1;
128 }
129 if(fun_ptr_log == NULL)
130 {
131 fun_ptr_log = (mbtk_log)dlsym(handle, "mbtk_log");
132 if(fun_ptr_log == NULL)
133 {
134 return -1;
135 }
136 }
137 if(mbtk_read_fun_ptr == NULL)
138 {
139 mbtk_read_fun_ptr = (mbtk_oem_read_data_ext)dlsym(handle, "mbtk_oem_read_data_ext");
140 if(mbtk_read_fun_ptr == NULL)
141 {
142 return -1;
143 }
144 }
145 if(mbtk_write_fun_ptr == NULL)
146 {
147 mbtk_write_fun_ptr = (mbtk_oem_write_data_ext)dlsym(handle, "mbtk_oem_write_data_ext");
148 if(mbtk_write_fun_ptr == NULL)
149 {
150 return -1;
151 }
152 }
153
154 }
155 return 0;
156}
157
158static void deinit_fun_handle()
159{
160 if(handle != NULL)
161 {
162 dlclose(handle);
163 handle = NULL;
164 }
165
166 fun_ptr_log = NULL;
167 mbtk_write_fun_ptr = NULL;
168 mbtk_read_fun_ptr = NULL;
169
170}
171
172/**
173 * @brief Read data from spec block of flash
174 * @param [in] unsigned int
175 * @param [out] void *
176 * @param [out] unsigned int *
177 * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
178 */
179
180int gsw_oem_read_data_ext(unsigned int block_id, void *data, unsigned int *len)
181{
182
183 int ret = -1;
184 unsigned int actual_len = 0;
185 char *temp_buffer = NULL;
186 ret = init_fun_handle();
187 if(ret == -1)
188 {
189 printf(" init_fun_handle error ret %d\n",ret);
190 deinit_fun_handle();
191 return GSW_HAL_NORMAL_FAIL;
192 }
193
194 if (!data || !len)
195 {
196 LOGE("invalid :data or len us NULL\n");
197 deinit_fun_handle();
198 return GSW_HAL_ARG_INVALID;
199 }
200
201 temp_buffer = (char *)malloc(ERASE_BLOCK_SIZE);
202 if (temp_buffer == NULL)
203 {
204 LOGE("Failed to allocate read buffer ");
205 deinit_fun_handle();
206 return -1;
207 }
208
209 memset(temp_buffer, 0, ERASE_BLOCK_SIZE);
210
211 ret = mbtk_read_fun_ptr(block_id,temp_buffer,&actual_len);
212 if(ret != 0)
213 {
214 LOGE("mbtk_read_fun_ptr failed");
215 free(temp_buffer);
216 deinit_fun_handle();
217 return GSW_HAL_NORMAL_FAIL;
218 }
219 *len = actual_len;
220 memcpy(data, temp_buffer, *len);
221 free(temp_buffer);
222 deinit_fun_handle();
223
224 return GSW_HAL_SUCCESS;
225}
226
227/**
228 * @brief Write data to spec block of flash
229 * @param [in] unsigned int
230 * @param [in] void *
231 * @param [in] unsigned int
232 * @retval 0: success
233 * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
234 */
235
236int gsw_oem_write_data_ext(unsigned int block_id, void *data, unsigned int len)
237{
238 int ret = -1;
239 ret = init_fun_handle();
240 if(ret == -1)
241 {
242 printf("init log error ret %d\n",ret);
243 deinit_fun_handle();
244 return GSW_HAL_NORMAL_FAIL;
245 }
246 if (!data || len > ERASE_BLOCK_SIZE)
247 {
248 LOGE("invalid data is NULL ");
249 deinit_fun_handle();
250 return GSW_HAL_ARG_INVALID;
251 }
252
253 ret = mbtk_write_fun_ptr(block_id,data,len);
254 if(ret != 0)
255 {
256 LOGE("mbtk_write_fun_ptr failed");
257 deinit_fun_handle();
258 return GSW_HAL_NORMAL_FAIL;
259 }
260 deinit_fun_handle();
261 return GSW_HAL_SUCCESS;
262}