1 /*
2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 /* ****************************************************************************
20 1 头文件包含
21 **************************************************************************** */
22 #include "plat_firmware.h"
23 #include "oal_file.h"
24 #include "oal_sdio_host_if.h"
25 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
26 #include "plat_pm.h"
27 #elif (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
28 #include "plat_sdio.h"
29 #include "los_event.h"
30 #include "los_typedef.h"
31 #include "stdio.h"
32 #include "stdlib.h"
33 #include "unistd.h"
34 #include "fcntl.h"
35 #include "los_exc.h"
36 #include "oal_util.h"
37 #include "oal_time.h"
38 #ifdef _PRE_HI113X_FS_DISABLE
39 #include "plat_wifi_cfg.h"
40 #ifndef _PRE_WLAN_FEATURE_MFG_FW
41 #include "plat_rw.h"
42 #else
43 #include "plat_rw_mfg.h"
44 #endif
45 #endif
46 #endif
47 #include "oal_channel_host_if.h"
48 #include "wal_customize.h"
49 #include "wal_hipriv.h"
50 #include "oam_ext_if.h"
51 #ifdef _PRE_WLAN_FEATURE_DATA_BACKUP
52 #include "data_process.h"
53 #include "plat_data_backup.h"
54 #endif
55
56 /* ****************************************************************************
57 2 全局变量
58 **************************************************************************** */
59 #ifdef _PRE_WLAN_FEATURE_DATA_BACKUP
60 extern unsigned int g_ul_wlan_resume_wifi_init_flag;
61 #endif
62
63 #ifdef _PRE_HI113X_FS_DISABLE
64 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
65 static hi_u8 g_firmware_array_wifi_cfg_c01[] = {
66 #include "c01/plat_wifi_cfg.h"
67 };
68
69 static hi_u8 g_firmware_array_wifi_cfg_c02[] = {
70 #include "c02/plat_wifi_cfg.h"
71 };
72
73 static hi_u8 g_firmware_array_rw_bin_c01[] = {
74 #include "c01/plat_rw.h"
75 };
76
77 static hi_u8 g_firmware_array_rw_bin_c02[] = {
78 #include "c02/plat_rw.h"
79 };
80 #endif
81
82 DECLARE_FIRMWARE_FILE(wifi_cfg_c01);
83 DECLARE_FIRMWARE_FILE(wifi_cfg_c02);
84 DECLARE_FIRMWARE_FILE(rw_bin_c01);
85 DECLARE_FIRMWARE_FILE(rw_bin_c02);
86
87 static firmware_file_stru *g_st_wifi_cfg[SOFT_VER_BUTT] = {
88 &firmware_file_wifi_cfg_c01,
89 &firmware_file_wifi_cfg_c02
90 };
91
92 static firmware_file_stru *g_st_rw_bin[SOFT_VER_BUTT] = {
93 &firmware_file_rw_bin_c01,
94 &firmware_file_rw_bin_c02
95 };
96 #endif
97
98 #define WIFI_FIRMWARE_FILE_BIN "/vendor/firmware/hisilicon/hi1131h_demo_non_rom.bin"
99
100 /* ****************************************************************************
101 2 宏定义
102 **************************************************************************** */
103 #define WIFI_CFG_C01_PATH "/vendor/firmware/hi3881/wifi_cfg"
104 #define WIFI_CFG_C02_PATH HI_NULL
105 #define RAM_CHECK_CFG_PATH HI_NULL
106 #define STORE_WIFI_MEM HI_NULL
107
108 #define FILE_COUNT_PER_SEND 1
109 #define MIN_FIRMWARE_FILE_TX_BUF_LEN 4096
110 #define MAX_FIRMWARE_FILE_TX_BUF_LEN (4*1024*1024) /* 大小4M */
111
112 #define DEVICE_EFUSE_ADDR 0x50000764
113 #define DEVICE_EFUSE_LENGTH 16
114
115 #define CFG_CMD_NUM_MAX 10 /* 支持配置的最大命令(参数)个数 */
116
117 /* ****************************************************************************
118 3 全局变量定义
119 **************************************************************************** */
120 hi_u8 *g_auc_cfg_path[SOFT_VER_BUTT] = {
121 (hi_u8 *)WIFI_CFG_C01_PATH,
122 WIFI_CFG_C02_PATH,
123 };
124
125 /* 存储cfg文件信息,解析cfg文件时赋值,加载的时候使用该变量 */
126 firmware_globals_struct g_st_cfg_info;
127 cfg_cmd_struct g_cus_cfg_cmd[CFG_CMD_NUM_MAX]; /* 存储每个cfg文件的产测校准命令 */
128 hi_u32 g_ul_jump_cmd_result = CMD_JUMP_EXEC_RESULT_SUCC;
129 efuse_info_stru g_st_efuse_info = {
130 .soft_ver = SOFT_VER_CO1,
131 .mac_h = 0x0,
132 .mac_m = 0x0,
133 .mac_l = 0x0,
134 };
135
136 /* ****************************************************************************
137 4 函数实现
138 **************************************************************************** */
139 extern hi_u32 usb_max_req_size(void);
140 static void firmware_mem_free(firmware_mem_stru *firmware_mem);
141
142 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
143 extern int usleep(unsigned useconds);
144 extern int32_t plat_usb_init(void);
145 extern void plat_usb_destroy(void);
146 #endif
147
148 /* ****************************************************************************
149 功能描述 : host接收device发来的消息
150 输入参数 : data: 接收消息的buffer
151 len : 接收buffer的长度
152 输出参数 : 无
153 返 回 值 : -1表示失败,否则返回实际接收的长度
154 **************************************************************************** */
firmware_read_msg(hi_u8 *data, hi_s32 len)155 static hi_s32 firmware_read_msg(hi_u8 *data, hi_s32 len)
156 {
157 hi_s32 l_len;
158
159 if (oal_unlikely((data == HI_NULL))) {
160 oam_error_log0(0, 0, "data is HI_NULL\n ");
161 return -OAL_EFAIL;
162 }
163
164 l_len = oal_bus_patch_readsb(data, len, READ_MEG_TIMEOUT);
165
166 return l_len;
167 }
168
firmware_read_msg_timeout(hi_u8 *data, hi_s32 len, hi_u32 timeout)169 static hi_s32 firmware_read_msg_timeout(hi_u8 *data, hi_s32 len, hi_u32 timeout)
170 {
171 hi_s32 l_len;
172
173 if (oal_unlikely((data == HI_NULL))) {
174 oam_error_log0(0, 0, "data is HI_NULL\n ");
175 return -OAL_EFAIL;
176 }
177
178 l_len = oal_bus_patch_readsb(data, len, timeout);
179
180 return l_len;
181 }
182
183 /* ****************************************************************************
184 功能描述 : host往device发送消息
185 输入参数 : data: 发送buffer
186 len : 发送数据的长度
187 输出参数 : 无
188 返 回 值 : -1表示失败,否则返回实际发送的长度
189 **************************************************************************** */
firmware_send_msg(hi_u8 *data, hi_s32 len)190 static hi_s32 firmware_send_msg(hi_u8 *data, hi_s32 len)
191 {
192 hi_s32 l_ret;
193
194 #ifdef HW_DEBUG
195 print_hex_dump_bytes("firmware_send_msg :", DUMP_PREFIX_ADDRESS, data, (len < 128 ? len : 128)); /* len 128 */
196 #endif
197
198 l_ret = oal_bus_patch_writesb(data, len);
199 return l_ret;
200 }
201
firmware_mem_request(void)202 static firmware_mem_stru *firmware_mem_request(void)
203 {
204 firmware_mem_stru *firmware_mem = oal_kzalloc(sizeof(firmware_mem_stru), OAL_GFP_KERNEL);
205 if (firmware_mem == HI_NULL) {
206 oam_error_log0(0, 0, "g_st_firmware_mem KMALLOC failed\n");
207 goto nomem;
208 }
209
210 #if (_PRE_FEATURE_USB == _PRE_FEATURE_CHANNEL_TYPE)
211 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
212 if (plat_usb_init()) {
213 oam_warning_log0(0, 0, "plat_usb_init failed\n");
214 goto nomem;
215 }
216 #endif
217 firmware_mem->ul_data_buf_len = usb_max_req_size();
218 #elif (_PRE_FEATURE_SDIO == _PRE_FEATURE_CHANNEL_TYPE)
219 firmware_mem->ul_data_buf_len = oal_sdio_func_max_req_size(oal_get_bus_default_handler());
220 oam_warning_log1(0, 0, "sdio max transmit size is [%d]\n", firmware_mem->ul_data_buf_len);
221 if (firmware_mem->ul_data_buf_len < HISDIO_BLOCK_SIZE) {
222 oam_warning_log1(0, 0, "sdio max transmit size [%d] is error!\n", firmware_mem->ul_data_buf_len);
223 goto nomem;
224 }
225 #endif
226
227 do {
228 firmware_mem->puc_data_buf = (hi_u8 *)OS_KMALLOC_GFP(firmware_mem->ul_data_buf_len);
229 if (firmware_mem->puc_data_buf == HI_NULL) {
230 oam_warning_log1(0, 0, "malloc mem len [%d] fail, continue to try in a smaller size\n",
231 firmware_mem->ul_data_buf_len);
232 firmware_mem->ul_data_buf_len = firmware_mem->ul_data_buf_len >> 1;
233 }
234 } while ((firmware_mem->puc_data_buf == HI_NULL) &&
235 (firmware_mem->ul_data_buf_len >= MIN_FIRMWARE_FILE_TX_BUF_LEN) &&
236 (firmware_mem->ul_data_buf_len <= MAX_FIRMWARE_FILE_TX_BUF_LEN));
237
238 if (firmware_mem->puc_data_buf == HI_NULL) {
239 oam_info_log0(0, 0, "puc_data_buf KMALLOC failed\n");
240 goto nomem;
241 }
242
243 firmware_mem->puc_recv_cmd_buff = (hi_u8 *)OS_KMALLOC_GFP(CMD_BUFF_LEN);
244 if (firmware_mem->puc_recv_cmd_buff == HI_NULL) {
245 oam_info_log0(0, 0, "puc_recv_cmd_buff KMALLOC failed\n");
246 goto nomem;
247 }
248
249 firmware_mem->puc_send_cmd_buff = (hi_u8 *)OS_KMALLOC_GFP(CMD_BUFF_LEN);
250 if (firmware_mem->puc_send_cmd_buff == HI_NULL) {
251 oam_info_log0(0, 0, "puc_recv_cmd_buff KMALLOC failed\n");
252 goto nomem;
253 }
254
255 return firmware_mem;
256
257 nomem:
258 firmware_mem_free(firmware_mem);
259 return HI_NULL;
260 }
261
firmware_mem_free(firmware_mem_stru *firmware_mem)262 static void firmware_mem_free(firmware_mem_stru *firmware_mem)
263 {
264 if (firmware_mem == HI_NULL) {
265 oam_error_log0(0, 0, "g_firmware_mem_mutex is null\n");
266 return;
267 }
268 if (firmware_mem->puc_send_cmd_buff != HI_NULL) {
269 oal_free(firmware_mem->puc_send_cmd_buff);
270 }
271 if (firmware_mem->puc_recv_cmd_buff != HI_NULL) {
272 oal_free(firmware_mem->puc_recv_cmd_buff);
273 }
274 if (firmware_mem->puc_data_buf != HI_NULL) {
275 oal_free(firmware_mem->puc_data_buf);
276 }
277 oal_free(firmware_mem);
278 firmware_mem = HI_NULL;
279 #if (_PRE_FEATURE_USB == _PRE_FEATURE_CHANNEL_TYPE) && (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
280 plat_usb_destroy();
281 #endif
282 }
283
284 /* ****************************************************************************
285 功能描述 : 接收host期望device正确返回的内容
286 输入参数 : expect: 期望device正确返回的内容
287 输出参数 : 无
288 返 回 值 : 0表示成功,-1表示失败
289 **************************************************************************** */
recv_expect_result(const hi_u8 *expect, const firmware_mem_stru *firmware_mem)290 static hi_s32 recv_expect_result(const hi_u8 *expect, const firmware_mem_stru *firmware_mem)
291 {
292 hi_s32 l_len;
293 hi_s32 i;
294 if (expect == HI_NULL) {
295 oam_error_log0(0, 0, "recv_expect_result:expect = HI_NULL \n");
296 return -OAL_EFAIL;
297 }
298
299 if (!strlen((const hi_char *)expect)) {
300 oam_info_log0(0, 0, "not wait device to respond!\n");
301 return HI_SUCCESS;
302 }
303 if (firmware_mem == HI_NULL || firmware_mem->puc_recv_cmd_buff == HI_NULL) {
304 oam_error_log0(0, 0, "puc_recv_cmd_buff = HI_NULL \n");
305 return -OAL_EFAIL;
306 }
307 memset_s(firmware_mem->puc_recv_cmd_buff, CMD_BUFF_LEN, 0, CMD_BUFF_LEN);
308 for (i = 0; i < HOST_DEV_TIMEOUT; i++) {
309 l_len = firmware_read_msg(firmware_mem->puc_recv_cmd_buff, CMD_BUFF_LEN);
310 if (l_len < 0) {
311 oam_error_log0(0, 0, "recv result fail\n");
312 return -OAL_EFAIL;
313 }
314 if (!memcmp(firmware_mem->puc_recv_cmd_buff, expect, strlen((const hi_char *)expect))) {
315 return HI_SUCCESS;
316 } else {
317 oam_error_log2(0, 0, " error result[%s], expect [%s], read result again",
318 (uintptr_t)firmware_mem->puc_recv_cmd_buff, (uintptr_t)expect);
319 }
320 }
321
322 return -OAL_EFAIL;
323 }
324
recv_expect_result_timeout(const hi_u8 *expect, const firmware_mem_stru *firmware_mem, hi_u32 timeout)325 static hi_s32 recv_expect_result_timeout(const hi_u8 *expect, const firmware_mem_stru *firmware_mem, hi_u32 timeout)
326 {
327 hi_s32 l_len;
328
329 if (expect == HI_NULL) {
330 oam_error_log0(0, 0, "recv_expect_result_timeout:expect = HI_NULL \n");
331 return -OAL_EFAIL;
332 }
333
334 if (!strlen((const hi_char *)expect)) {
335 oam_info_log0(0, 0, "not wait device to respond!\n");
336 return HI_SUCCESS;
337 }
338
339 memset_s(firmware_mem->puc_recv_cmd_buff, CMD_BUFF_LEN, 0, CMD_BUFF_LEN);
340 l_len = firmware_read_msg_timeout(firmware_mem->puc_recv_cmd_buff, CMD_BUFF_LEN, timeout);
341 if (l_len < 0) {
342 oam_error_log0(0, 0, "recv result fail\n");
343 return -OAL_EFAIL;
344 }
345
346 if (!memcmp(firmware_mem->puc_recv_cmd_buff, expect, strlen((const hi_char *)expect))) {
347 oam_info_log1(0, 0, " send HI_SUCCESS, expect [%s] ok\n", (uintptr_t)expect);
348 return HI_SUCCESS;
349 } else {
350 oam_error_log2(0, 0, " error result[%s], expect [%s], read result again\n", firmware_mem->puc_recv_cmd_buff,
351 expect);
352 }
353 return -OAL_EFAIL;
354 }
355
356 /* ****************************************************************************
357 功能描述 : host向device发送消息并等待device返回消息
358 输入参数 : data : 发送buffer
359 len : 发送内容的长度
360 expect: 期望device回复的内容
361 输出参数 : 无
362 返 回 值 : -1表示失败,0表示成功
363 **************************************************************************** */
msg_send_and_recv_except(hi_u8 *data, hi_s32 len, const hi_u8 *expect, const firmware_mem_stru *firmware_mem)364 static hi_s32 msg_send_and_recv_except(hi_u8 *data, hi_s32 len, const hi_u8 *expect,
365 const firmware_mem_stru *firmware_mem)
366 {
367 hi_s32 i;
368 hi_s32 l_ret;
369
370 for (i = 0; i < HOST_DEV_TIMEOUT; i++) {
371 l_ret = firmware_send_msg(data, len);
372 if (l_ret < 0) {
373 continue;
374 }
375
376 l_ret = recv_expect_result(expect, firmware_mem);
377 if (l_ret == 0) {
378 return HI_SUCCESS;
379 }
380 }
381 return -OAL_EFAIL;
382 }
383
384 /* ****************************************************************************
385 功能描述 : 解析cfg文件,将解析的结果保存在g_st_cfg_info全局变量中
386 输入参数 : puc_cfg_info_buf: 保存有cfg文件内容的buffer
387 ul_index : 保存解析结果的数组索引值
388 输出参数 : 无
389 返 回 值 : NULL表示分配内存失败,否则返回指向保存解析cfg文件命令数组的首地址
390 **************************************************************************** */
malloc_cmd_buf(hi_u8 *puc_cfg_info_buf, hi_u32 ul_index)391 static void *malloc_cmd_buf(hi_u8 *puc_cfg_info_buf, hi_u32 ul_index)
392 {
393 hi_u32 l_len;
394 hi_u8 *flag = HI_NULL;
395 hi_u8 *p_buf = HI_NULL;
396
397 if (puc_cfg_info_buf == HI_NULL) {
398 oam_error_log0(0, 0, "malloc_cmd_buf: buf is HI_NULL!\n");
399 return HI_NULL;
400 }
401
402 /* 统计命令个数 */
403 flag = puc_cfg_info_buf;
404 g_st_cfg_info.al_count[ul_index] = 0;
405 while (flag != HI_NULL) {
406 /* 一个正确的命令行结束符为 ; */
407 flag = (hi_u8 *)strchr((const hi_char *)flag, CMD_LINE_SIGN);
408 if (flag == HI_NULL) {
409 break;
410 }
411 g_st_cfg_info.al_count[ul_index]++;
412 flag++;
413 }
414 oam_info_log2(0, 0, "cfg file cmd count: al_count[%d] = %d", ul_index, g_st_cfg_info.al_count[ul_index]);
415
416 /* 申请存储命令空间 */
417 l_len = ((g_st_cfg_info.al_count[ul_index]) + CFG_INFO_RESERVE_LEN) * sizeof(struct cmd_type_st);
418
419 p_buf = OS_KMALLOC_GFP(l_len);
420 if (p_buf == HI_NULL) {
421 oam_error_log0(0, 0, "kmalloc cmd_type_st fail\n");
422 return HI_NULL;
423 }
424 memset_s((void *)p_buf, l_len, 0, l_len);
425
426 return p_buf;
427 }
428
429 /* ****************************************************************************
430 功能描述 : 删除字符串两边多余的空格
431 输入参数 : string: 原始字符串
432 len : 字符串的长度
433 输出参数 : 无
434 返 回 值 : 错误返回NULL,否则返回删除两边空格以后字符串的首地址
435 **************************************************************************** */
delete_space(hi_u8 *string, hi_s32 *len)436 static hi_u8 *delete_space(hi_u8 *string, hi_s32 *len)
437 {
438 int i;
439
440 if ((string == HI_NULL) || (len == HI_NULL)) {
441 return HI_NULL;
442 }
443
444 /* 删除尾部的空格 */
445 for (i = *len - 1; i >= 0; i--) {
446 if (string[i] != COMPART_KEYWORD) {
447 break;
448 }
449 string[i] = '\0';
450 }
451 /* 出错 */
452 if (i < 0) {
453 oam_error_log0(0, 0, " string is Space bar\n");
454 return HI_NULL;
455 }
456 /* 在for语句中减去1,这里加上1 */
457 *len = i + 1;
458
459 /* 删除头部的空格 */
460 for (i = 0; i < *len; i++) {
461 if (string[i] != COMPART_KEYWORD) {
462 /* 减去空格的个数 */
463 *len = *len - i;
464 return &string[i];
465 }
466 }
467
468 return HI_NULL;
469 }
470
471 /* ************************************************************************************
472 功能描述 : 打开文件,保存read mem读上来的内容
473 输入参数 : 无
474 输出参数 : 无
475 返 回 值 : 返回打开文件的描述符
476 ************************************************************************************ */
open_file_to_readm(hi_u8 *name)477 static oal_file_stru *open_file_to_readm(hi_u8 *name)
478 {
479 oal_file_stru *fp = HI_NULL;
480 hi_u8 *file_name = HI_NULL;
481
482 if (OAL_WARN_ON(name == HI_NULL)) {
483 file_name = (hi_u8 *)"/data/memdump/readm_wifi";
484 } else {
485 file_name = name;
486 }
487 fp = oal_file_open((const hi_char *)file_name, (OAL_O_CREAT | OAL_O_RDWR | OAL_O_TRUNC), 0);
488
489 return fp;
490 }
491
492 /* ************************************************************************************
493 功能描述 : 接收device发送上来的内存,保存到指定的文件中
494 输入参数 : fp : 保存内存的文件指针
495 len: 需要保存的内存的长度
496 输出参数 : 无
497 返 回 值 : -1表示失败,否则返回实际保存的内存的长度
498 ************************************************************************************ */
recv_device_mem(oal_file_stru *fp, hi_u8 *puc_data_buf, hi_s32 len)499 static hi_s32 recv_device_mem(oal_file_stru *fp, hi_u8 *puc_data_buf, hi_s32 len)
500 {
501 hi_s32 l_ret = 0;
502 hi_u8 retry = 3;
503 hi_s32 lenbuf = 0;
504
505 if (IS_ERR_OR_NULL(fp)) {
506 oam_error_log1(0, 0, "fp is error,fp = 0x%p\n", (uintptr_t)fp);
507 return -OAL_EFAIL;
508 }
509
510 if (puc_data_buf == HI_NULL) {
511 oam_error_log0(0, 0, "puc_data_buf is HI_NULL\n");
512 return -OAL_EFAIL;
513 }
514
515 oam_info_log1(0, 0, "expect recv len is [%d]\n", len);
516
517 while (len > lenbuf) {
518 l_ret = firmware_read_msg(puc_data_buf + lenbuf, len - lenbuf);
519 if (l_ret > 0) {
520 lenbuf += l_ret;
521 } else {
522 retry--;
523 lenbuf = 0;
524 if (0 == retry) {
525 l_ret = -OAL_EFAIL;
526 oam_error_log0(0, 0, "time out\n");
527 break;
528 }
529 }
530 }
531
532 if (len <= lenbuf) {
533 oal_file_write(fp, (hi_char *)puc_data_buf, len);
534 }
535
536 return l_ret;
537 }
538
539 /* ************************************************************************************
540 功能描述 : 发送命令读device版本号,并检查device上报的版本号和host的版本号是否匹配
541 输入参数 : 无
542 输出参数 : 无
543 返 回 值 : -1表示失败,0表示成功
544 ************************************************************************************ */
check_version(const firmware_mem_stru *firmware_mem)545 static hi_s32 check_version(const firmware_mem_stru *firmware_mem)
546 {
547 hi_s32 l_ret;
548 size_t l_len;
549 hi_s32 i;
550
551 if (firmware_mem == HI_NULL || firmware_mem->puc_recv_cmd_buff == HI_NULL ||
552 firmware_mem->puc_send_cmd_buff == HI_NULL) {
553 oam_error_log0(0, 0, "MEM IS HI_NULL \n");
554 return -OAL_EFAIL;
555 }
556
557 for (i = 0; i < HOST_DEV_TIMEOUT; i++) {
558 if ((memset_s(firmware_mem->puc_send_cmd_buff, CMD_BUFF_LEN, 0, CMD_BUFF_LEN) != EOK) ||
559 (memcpy_s(firmware_mem->puc_send_cmd_buff, strlen(VER_CMD_KEYWORD), (hi_u8 *)VER_CMD_KEYWORD,
560 strlen(VER_CMD_KEYWORD)) != EOK)) {
561 continue;
562 }
563 l_len = strlen(VER_CMD_KEYWORD);
564
565 firmware_mem->puc_send_cmd_buff[l_len] = COMPART_KEYWORD;
566 l_len++;
567
568 l_len = HISDIO_ALIGN_4_OR_BLK(l_len + 1);
569
570 l_ret = firmware_send_msg(firmware_mem->puc_send_cmd_buff, l_len);
571 if (l_ret < 0) {
572 oam_warning_log1(0, 0, "send version fail![%d]\n", i);
573 continue;
574 }
575 if (memset_s(g_st_cfg_info.auc_DevVersion, VERSION_LEN, 0, VERSION_LEN) != EOK ||
576 memset_s(firmware_mem->puc_recv_cmd_buff, CMD_BUFF_LEN, 0, CMD_BUFF_LEN) != EOK) {
577 continue;
578 }
579
580 l_ret = firmware_read_msg(firmware_mem->puc_recv_cmd_buff, CMD_BUFF_LEN);
581 if (l_ret < 0) {
582 oam_warning_log1(0, 0, "read version fail![%d]\n", i);
583 continue;
584 }
585 if (memcpy_s(g_st_cfg_info.auc_DevVersion, VERSION_LEN, firmware_mem->puc_recv_cmd_buff, VERSION_LEN) != EOK) {
586 continue;
587 }
588 if (!memcmp((hi_char *)g_st_cfg_info.auc_DevVersion, (hi_char *)g_st_cfg_info.auc_CfgVersion,
589 strlen((const hi_char *)g_st_cfg_info.auc_CfgVersion))) {
590 oam_warning_log2(0, 0, "HI_SUCCESS: Device Version=[%s], CfgVersion=[%s].",
591 (uintptr_t)g_st_cfg_info.auc_DevVersion, (uintptr_t)g_st_cfg_info.auc_CfgVersion);
592 return HI_SUCCESS;
593 } else {
594 oam_error_log2(0, 0, "ERROR version,Device Version=[%s], CfgVersion=[%s].", g_st_cfg_info.auc_DevVersion,
595 g_st_cfg_info.auc_CfgVersion);
596 return -OAL_EFAIL;
597 }
598 }
599
600 return -OAL_EFAIL;
601 }
602
603 /* ****************************************************************************
604 功能描述 : 处理number类型的命令,并发送到device
605 输入参数 : key : 命令的关键字
606 val: 命令的参数
607 输出参数 : 无
608 返 回 值 : -1表示失败,非零表示成功
609 **************************************************************************** */
number_type_cmd_send(hi_u8 *key, hi_u8 *val, const firmware_mem_stru *firmware_mem)610 static hi_s32 number_type_cmd_send(hi_u8 *key, hi_u8 *val, const firmware_mem_stru *firmware_mem)
611 {
612 hi_s32 l_ret;
613 hi_u32 data_len;
614 hi_u32 value_len;
615 hi_u32 i;
616 hi_u32 n;
617 #define RESERVED_BYTES 10
618
619 if (firmware_mem == HI_NULL || firmware_mem->puc_recv_cmd_buff == HI_NULL ||
620 firmware_mem->puc_send_cmd_buff == HI_NULL) {
621 oam_error_log0(0, 0, "MEM IS HI_NULL \n");
622 return -OAL_EFAIL;
623 }
624
625 if (CMD_BUFF_LEN < strlen((const hi_char *)key) + strlen((const hi_char *)val) + RESERVED_BYTES) {
626 oam_error_log2(0, 0, "the cmd string must be error, key=%s, vlaue=%s \n", (uintptr_t)key, (uintptr_t)val);
627 return -OAL_EFAIL;
628 }
629
630 value_len = strlen((hi_char *)val);
631
632 if (memset_s(firmware_mem->puc_recv_cmd_buff, CMD_BUFF_LEN, 0, CMD_BUFF_LEN) != EOK ||
633 memset_s(firmware_mem->puc_send_cmd_buff, CMD_BUFF_LEN, 0, CMD_BUFF_LEN) != EOK) {
634 return -OAL_EFAIL;
635 }
636
637 data_len = (hi_s32)strlen((const hi_char *)key);
638 if (memcpy_s(firmware_mem->puc_send_cmd_buff, data_len, key, data_len) != EOK) {
639 return -OAL_EFAIL;
640 }
641
642 firmware_mem->puc_send_cmd_buff[data_len] = COMPART_KEYWORD;
643 data_len = data_len + 1;
644
645 for (i = 0, n = 0; (i <= value_len) && (n < INT32_STR_LEN); i++) {
646 if ((val[i] == ',') || (i == value_len)) {
647 if (n == 0) {
648 continue;
649 }
650 if (memcpy_s((hi_u8 *)&firmware_mem->puc_send_cmd_buff[data_len], n,
651 firmware_mem->puc_recv_cmd_buff, n) != EOK) {
652 return -OAL_EFAIL;
653 }
654 data_len = data_len + n;
655
656 firmware_mem->puc_send_cmd_buff[data_len] = COMPART_KEYWORD;
657 data_len = data_len + 1;
658
659 memset_s(firmware_mem->puc_recv_cmd_buff, INT32_STR_LEN, 0, INT32_STR_LEN);
660 n = 0;
661 } else if (val[i] == COMPART_KEYWORD) {
662 continue;
663 } else {
664 firmware_mem->puc_recv_cmd_buff[n] = val[i];
665 n++;
666 }
667 }
668 firmware_mem->puc_send_cmd_buff[data_len + 1] = '\0';
669 l_ret = firmware_send_msg(firmware_mem->puc_send_cmd_buff, data_len);
670
671 return l_ret;
672 }
673
674 /* ****************************************************************************
675 功能描述 : 解析file命令参数
676 输入参数 : string : file命令的参数
677 addr : 发送的数据地址
678 file_path: 发送文件的路径
679 输出参数 : 无
680 返 回 值 : -1表示失败,0表示成功
681 **************************************************************************** */
parse_file_cmd(hi_u8 *string, unsigned long *addr, hi_char **file_path)682 static hi_s32 parse_file_cmd(hi_u8 *string, unsigned long *addr, hi_char **file_path)
683 {
684 hi_char *tmp = HI_NULL;
685 hi_size_t count;
686 hi_char *after = HI_NULL;
687 #define DECIMAL_ALGORITHM 10
688
689 if (string == HI_NULL || addr == HI_NULL || file_path == HI_NULL) {
690 oam_error_log0(0, 0, "param is error!\n");
691 return -OAL_EFAIL;
692 }
693
694 /* 获得发送的文件的个数,此处必须为1,string字符串的格式必须是"1,0xXXXXX,file_path" */
695 tmp = (hi_char *)string;
696 hi_u32 cnt = 0;
697 while ((cnt < DOWNLOAD_CMD_PARA_LEN) && (*tmp == COMPART_KEYWORD)) {
698 tmp++;
699 cnt++;
700 }
701 count = oal_simple_strtoul(tmp, HI_NULL, DECIMAL_ALGORITHM);
702 if (count != FILE_COUNT_PER_SEND) {
703 oam_error_log1(0, 0, "the count of send file must be 1, count = [%d]\n", count);
704 return -OAL_EFAIL;
705 }
706
707 /* 让tmp指向地址的首字母 */
708 tmp = strchr((const hi_char *)string, ',');
709 if (tmp == HI_NULL) {
710 oam_error_log0(0, 0, "param string is err!\n");
711 return -OAL_EFAIL;
712 } else {
713 tmp++;
714 while (((tmp - (hi_char *)string) < DOWNLOAD_CMD_PARA_LEN) && (*tmp == COMPART_KEYWORD)) {
715 tmp++;
716 }
717 }
718
719 *addr = oal_simple_strtoul((hi_char *)tmp, &after, 16); /* base 16 */
720 oam_info_log1(0, 0, "file to send addr:[0x%lx]", *addr);
721
722 /* "1,0xXXXX,file_path" */
723 /* ^ */
724 /* after */
725 after++;
726 while (((after - (hi_char *)string) < DOWNLOAD_CMD_PARA_LEN) && (*after == COMPART_KEYWORD)) {
727 after++;
728 }
729
730 *file_path = after;
731
732 return HI_SUCCESS;
733 }
734
735
736 /* ****************************************************************************
737 功能描述 : 当device处于bootloader时从DEVICE读取内存
738 输入参数 : 无
739 输出参数 : 无
740 返 回 值 : 小于0表示失败
741 **************************************************************************** */
read_device_mem(const wifi_dump_mem_info_stru *mem_dump_info, oal_file_stru *fp, const firmware_mem_stru *firmware_mem)742 static hi_s32 read_device_mem(const wifi_dump_mem_info_stru *mem_dump_info, oal_file_stru *fp,
743 const firmware_mem_stru *firmware_mem)
744 {
745 hi_s32 ret = 0;
746 hi_u32 size = 0;
747 hi_u32 remainder = mem_dump_info->size;
748
749 if (firmware_mem == HI_NULL || firmware_mem->puc_send_cmd_buff == HI_NULL) {
750 oam_error_log0(0, 0, "puc_send_cmd_buff = HI_NULL \n");
751 return -OAL_EFAIL;
752 }
753 while (remainder > 0) {
754 memset_s(firmware_mem->puc_send_cmd_buff, CMD_BUFF_LEN, 0, CMD_BUFF_LEN);
755
756 size = oal_min(remainder, firmware_mem->ul_data_buf_len);
757
758 oam_info_log1(0, 0, "read mem cmd:[%s]\n", (uintptr_t)firmware_mem->puc_send_cmd_buff);
759 ret = firmware_send_msg(firmware_mem->puc_send_cmd_buff,
760 strlen((const hi_char *)firmware_mem->puc_send_cmd_buff));
761 if (ret < 0) {
762 oam_warning_log2(0, 0, "wifi mem dump fail, mem_addr is [0x%lx],ret=%d\n", mem_dump_info->mem_addr, ret);
763 break;
764 }
765
766 ret = recv_device_mem(fp, firmware_mem->puc_data_buf, size);
767 if (ret < 0) {
768 oam_warning_log2(0, 0, "wifi mem dump fail, mem_addr is [0x%lx],ret=%d\n", mem_dump_info->mem_addr, ret);
769 break;
770 }
771
772 remainder -= size;
773 }
774
775 return ret;
776 }
777
read_mem(hi_u8 *key, const hi_u8 *val, const firmware_mem_stru *firmware_mem)778 static hi_s32 read_mem(hi_u8 *key, const hi_u8 *val, const firmware_mem_stru *firmware_mem)
779 {
780 hi_unref_param(key);
781 hi_s32 l_ret;
782 hi_size_t size;
783 hi_char *flag = HI_NULL;
784 oal_file_stru *fp = HI_NULL;
785 struct wifi_dump_mem_info_stru read_memory;
786 memset_s(&read_memory, sizeof(struct wifi_dump_mem_info_stru), 0, sizeof(struct wifi_dump_mem_info_stru));
787
788 flag = strchr((const hi_char *)val, ',');
789 if (flag == HI_NULL) {
790 oam_error_log0(0, 0, "RECV LEN ERROR..\n");
791 return -OAL_EFAIL;
792 }
793 if (firmware_mem == HI_NULL || firmware_mem->puc_data_buf == HI_NULL) {
794 oam_error_log0(0, 0, "MEM IS HI_NULL \n");
795 return -OAL_EFAIL;
796 }
797
798 flag++;
799 oam_info_log1(0, 0, "recv len [%s]\n", flag);
800 while (((flag - (hi_char *)key) < DOWNLOAD_CMD_LEN) && (*flag == COMPART_KEYWORD)) {
801 flag++;
802 }
803 size = oal_simple_strtoul(flag, HI_NULL, 10); /* base 10: DEC */
804
805 fp = open_file_to_readm(HI_NULL);
806 if (IS_ERR_OR_NULL(fp)) {
807 oam_error_log1(0, 0, "create file error,fp = 0x%p\n", (uintptr_t)fp);
808 return -OAL_EFAIL;
809 }
810
811 read_memory.mem_addr = oal_simple_strtoul((const hi_char *)val, HI_NULL, 16); /* base 16 */
812 read_memory.size = (hi_u32)size;
813 l_ret = read_device_mem(&read_memory, fp, firmware_mem);
814
815 oal_file_close(fp);
816
817 return l_ret;
818 }
819
820 /* ****************************************************************************
821 功能描述 : 执行number类型的命令
822 输入参数 : key : 命令的关键字
823 val: 命令的参数
824 输出参数 : 无
825 返 回 值 : -1表示失败,0表示成功
826 **************************************************************************** */
exec_number_type_cmd(hi_u8 *key, hi_u8 *val, firmware_mem_stru *firmware_mem)827 static hi_s32 exec_number_type_cmd(hi_u8 *key, hi_u8 *val, firmware_mem_stru *firmware_mem)
828 {
829 hi_s32 l_ret = -OAL_EFAIL;
830
831 if (key == HI_NULL) {
832 oam_error_log0(0, 0, "exec_number_type_cmd key null\n");
833 return -OAL_EFAIL;
834 }
835
836 if (!memcmp(key, VER_CMD_KEYWORD, strlen(VER_CMD_KEYWORD))) {
837 l_ret = check_version(firmware_mem);
838 if (l_ret < 0) {
839 oam_error_log1(0, 0, "check version FAIL [%d]\n", l_ret);
840 return -OAL_EFAIL;
841 }
842 }
843
844 if (!strcmp((hi_char *)key, WMEM_CMD_KEYWORD)) {
845 l_ret = number_type_cmd_send(key, val, firmware_mem);
846 if (l_ret < 0) {
847 goto ret_err;
848 }
849
850 l_ret = recv_expect_result((const hi_u8 *)MSG_FROM_DEV_WRITEM_OK, firmware_mem);
851 if (l_ret < 0) {
852 oam_error_log0(0, 0, "recv expect result fail!\n");
853 return l_ret;
854 }
855 } else if (!strcmp((hi_char *)key, CONFIG_CMD_KEYWORD)) {
856 l_ret = number_type_cmd_send(key, val, firmware_mem);
857 if (l_ret < 0) {
858 goto ret_err;
859 }
860
861 l_ret = recv_expect_result((const hi_u8 *)MSG_FROM_DEV_CONFIG_OK, firmware_mem);
862 if (l_ret < 0) {
863 oam_print_err("recv expect result fail!\n");
864 return l_ret;
865 }
866 } else if (!strcmp((hi_char *)key, JUMP_CMD_KEYWORD)) {
867 g_ul_jump_cmd_result = CMD_JUMP_EXEC_RESULT_SUCC;
868 l_ret = number_type_cmd_send(key, val, firmware_mem);
869 if (l_ret < 0) {
870 goto ret_err;
871 }
872
873 /* 100000ms timeout */
874 l_ret = recv_expect_result_timeout((const hi_u8 *)MSG_FROM_DEV_JUMP_OK, firmware_mem, READ_MEG_JUMP_TIMEOUT);
875 if (l_ret >= 0) {
876 return l_ret;
877 } else {
878 g_ul_jump_cmd_result = CMD_JUMP_EXEC_RESULT_FAIL;
879 return l_ret;
880 }
881 } else if (!strcmp((hi_char *)key, RMEM_CMD_KEYWORD)) {
882 l_ret = read_mem(key, val, firmware_mem);
883 }
884 return l_ret;
885 ret_err:
886 oam_error_log2(0, 0, "send key=[%s],value=[%s] fail\n", (uintptr_t)key, (uintptr_t)val);
887 return l_ret;
888 }
889
890
891 /* ****************************************************************************
892 功能描述 : 执行quit类型的命令
893 输入参数 : 无
894 输出参数 : 无
895 返 回 值 : -1表示失败,0表示成功
896 **************************************************************************** */
exec_quit_type_cmd(firmware_mem_stru *firmware_mem)897 static hi_s32 exec_quit_type_cmd(firmware_mem_stru *firmware_mem)
898 {
899 hi_s32 l_ret;
900 hi_u32 l_len;
901
902 if (firmware_mem == HI_NULL || firmware_mem->puc_send_cmd_buff == HI_NULL) {
903 oam_error_log0(0, 0, "puc_send_cmd_buff = HI_NULL \n");
904 return -OAL_EFAIL;
905 }
906
907 if (memset_s(firmware_mem->puc_send_cmd_buff, CMD_BUFF_LEN, 0, 8) != EOK) { /* 8: 清8个长度 */
908 return -OAL_EFAIL;
909 } /* buffer len 8 */
910
911 if (memcpy_s(firmware_mem->puc_send_cmd_buff, strlen(QUIT_CMD_KEYWORD), (hi_u8 *)QUIT_CMD_KEYWORD,
912 strlen(QUIT_CMD_KEYWORD)) != EOK) {
913 return -OAL_EFAIL;
914 }
915 l_len = strlen(QUIT_CMD_KEYWORD);
916
917 firmware_mem->puc_send_cmd_buff[l_len] = COMPART_KEYWORD;
918 l_len++;
919
920 l_ret = msg_send_and_recv_except(firmware_mem->puc_send_cmd_buff, l_len, (const hi_u8 *)MSG_FROM_DEV_QUIT_OK,
921 firmware_mem);
922
923 return l_ret;
924 }
925
926 #ifndef _PRE_HI113X_FS_DISABLE
927 int g_fw_mode = FIRMWARE_BIN; /* 默认业务bin */
928 module_param(g_fw_mode, int, 0644);
929 /* ****************************************************************************
930 功能描述 : 执行file类型的命令
931 输入参数 : key : 命令的关键字
932 val: 命令的参数
933 输出参数 : 无
934 返 回 值 : -1表示失败,0表示成功
935 **************************************************************************** */
exec_file_type_cmd(hi_u8 *key, hi_u8 *val, firmware_mem_stru *firmware_mem)936 static hi_s32 exec_file_type_cmd(hi_u8 *key, hi_u8 *val, firmware_mem_stru *firmware_mem)
937 {
938 hi_unref_param(key);
939 unsigned long addr;
940 hi_u32 addr_send;
941 hi_char *path = HI_NULL;
942 hi_s32 ret;
943 hi_u32 file_len;
944 hi_u32 per_send_len;
945 hi_u32 send_count;
946 hi_s32 rdlen;
947 hi_u32 i;
948 hi_u32 offset = 0;
949 oal_file_stru *fp = HI_NULL;
950 hi_s32 verify_stage = 0;
951
952 if (firmware_mem == HI_NULL || firmware_mem->puc_send_cmd_buff == HI_NULL ||
953 firmware_mem->puc_data_buf == HI_NULL) {
954 oam_error_log0(0, 0, "exec_file_type_cmd:: mem is HI_NULL");
955 return -OAL_EFAIL;
956 }
957
958 ret = parse_file_cmd(val, &addr, &path);
959 if (ret < 0) {
960 oam_error_log0(0, 0, "exec_file_type_cmd:: parse file cmd fail");
961 return ret;
962 }
963 if (g_fw_mode == MFG_FIRMWARE_BIN) {
964 path = "/vendor/firmware/hisilicon/hi3881_mfg_fw.bin";
965 }
966 fp = oal_file_open(path, (OAL_O_RDONLY), 0);
967 if (IS_ERR_OR_NULL(fp)) {
968 oam_error_log2(0, 0, "exec_file_type_cmd:: filp_open [%s] fail!!, fp=%p", path, fp);
969 return -OAL_EFAIL;
970 }
971 set_under_mfg(g_fw_mode); /* 保存当前firmware模式 */
972 /* 获取file文件大小 */
973 file_len = oal_file_lseek(fp, 0, OAL_SEEK_END);
974
975 /* 恢复fp->f_pos到文件开头 */
976 oal_file_lseek(fp, 0, OAL_SEEK_SET);
977
978 oam_info_log2(0, 0, "exec_file_type_cmd:: file len is [%d],firmware_mem->ul_data_buf_len=%d", file_len,
979 firmware_mem->ul_data_buf_len);
980
981 per_send_len = (firmware_mem->ul_data_buf_len > file_len) ? file_len : firmware_mem->ul_data_buf_len;
982 if (per_send_len == 0) {
983 oam_error_log0(0, 0, "per_send_len == 0");
984 oal_file_close(fp);
985 return -OAL_EFAIL;
986 }
987 send_count = (file_len + per_send_len - 1) / per_send_len;
988 oam_info_log1(0, 0, "exec_file_type_cmd:: send_count=%d", send_count);
989
990 for (i = 0; i < send_count; i++) {
991 rdlen = oal_file_read(fp, firmware_mem->puc_data_buf, per_send_len);
992 if (rdlen > 0) {
993 oam_info_log2(0, 0, "exec_file_type_cmd:: len of kernel_read is [%d], i=%d", rdlen, i);
994 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
995 OAL_FILE_POS(fp) += rdlen;
996 #endif
997 } else {
998 oam_error_log2(0, 0, "exec_file_type_cmd:: len of kernel_read is error! ret=[%d], i=%d", rdlen, i);
999 oal_file_close(fp);
1000 return -OAL_EFAIL;
1001 }
1002
1003 addr_send = (hi_u32)(addr + offset);
1004 oam_info_log2(0, 0, "exec_file_type_cmd:: send addr is [0x%x], i=%d", addr_send, i);
1005
1006 if (offset == 0 && offset + rdlen == file_len) {
1007 verify_stage = 3; /* 3:start and end. */
1008 } else if (offset == 0) {
1009 verify_stage = 0; /* start trans. */
1010 } else if (offset + rdlen == file_len) {
1011 verify_stage = 2; /* 2:end trans. */
1012 } else {
1013 verify_stage = 1; /* transferring. */
1014 }
1015
1016 if (snprintf_s((hi_char *)firmware_mem->puc_send_cmd_buff, CMD_BUFF_LEN, CMD_BUFF_LEN - 1,
1017 "%s%c0x%x%c0x%x%c%d%c", FILES_CMD_KEYWORD, COMPART_KEYWORD, addr_send, COMPART_KEYWORD, rdlen,
1018 COMPART_KEYWORD, verify_stage, COMPART_KEYWORD) == -1) {
1019 return -OAL_EFAIL;
1020 }
1021
1022 /* 发送地址 */
1023 oam_info_log1(0, 0, "exec_file_type_cmd:: send file addr cmd is [%s]", firmware_mem->puc_send_cmd_buff);
1024 ret = msg_send_and_recv_except(firmware_mem->puc_send_cmd_buff,
1025 strlen((hi_char *)firmware_mem->puc_send_cmd_buff), (const hi_u8 *)MSG_FROM_DEV_READY_OK, firmware_mem);
1026 if (ret < 0) {
1027 oam_error_log1(0, 0, "exec_file_type_cmd:: SEND [%s] error", (uintptr_t)firmware_mem->puc_send_cmd_buff);
1028 oal_file_close(fp);
1029 return -OAL_EFAIL;
1030 }
1031 /* Wait at least 5 ms */
1032 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
1033 usleep_range(FILE_CMD_WAIT_TIME_MIN, FILE_CMD_WAIT_TIME_MAX);
1034 #elif (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
1035 usleep(FILE_CMD_WAIT_TIME_MIN);
1036 #endif
1037 /* 发送文件内容 */
1038 ret = msg_send_and_recv_except(firmware_mem->puc_data_buf, rdlen, (const hi_u8 *)MSG_FROM_DEV_FILES_OK,
1039 firmware_mem);
1040 if (ret < 0) {
1041 oam_error_log0(0, 0, "exec_file_type_cmd:: send data fail");
1042 oal_file_close(fp);
1043 return -OAL_EFAIL;
1044 }
1045
1046 offset += rdlen;
1047 }
1048 oal_file_close(fp);
1049 /* 发送的长度要和文件的长度一致 */
1050 if (offset != file_len) {
1051 oam_error_log2(0, 0, "exec_file_type_cmd:: send len[%d] is different with file_len[%d]", offset, file_len);
1052 return -OAL_EFAIL;
1053 }
1054
1055 return HI_SUCCESS;
1056 }
1057 #else
exec_file_type_cmd(hi_u8 *key, hi_u8 *val, firmware_mem_stru *firmware_mem)1058 static hi_s32 exec_file_type_cmd(hi_u8 *key, hi_u8 *val, firmware_mem_stru *firmware_mem)
1059 {
1060 hi_unref_param(key);
1061 unsigned long addr;
1062 hi_u32 addr_send;
1063 hi_char *path = HI_NULL;
1064 hi_s32 ret;
1065 hi_u32 file_len;
1066 hi_u32 per_send_len;
1067 hi_s32 rdlen;
1068 hi_u32 offset = 0;
1069 hi_u32 file_len_count;
1070 hi_u32 ul_soft_ver;
1071 hi_s32 verify_stage = 0;
1072
1073 if (firmware_mem == HI_NULL || firmware_mem->puc_data_buf == HI_NULL ||
1074 firmware_mem->puc_send_cmd_buff == HI_NULL) {
1075 oam_error_log0(0, 0, "mem is HI_NULL \n");
1076 return -OAL_EFAIL;
1077 }
1078
1079 ul_soft_ver = get_device_soft_version();
1080 if (ul_soft_ver >= SOFT_VER_BUTT) {
1081 oam_error_log0(0, 0, "device soft version is invalid!\n");
1082 return -OAL_EFAIL;
1083 }
1084
1085 ret = parse_file_cmd(val, &addr, &path);
1086 if (ret < 0) {
1087 oam_error_log0(0, 0, "parse file cmd fail!\n");
1088 return ret;
1089 }
1090
1091 oam_info_log1(0, 0, "download firmware:%s", path);
1092
1093 file_len = g_st_rw_bin[ul_soft_ver]->len;
1094 file_len_count = file_len;
1095
1096 oam_info_log2(0, 0, "file len is [%d],firmware_mem->ulDataBufLen=%d", file_len, firmware_mem->ul_data_buf_len);
1097
1098 per_send_len = (firmware_mem->ul_data_buf_len > file_len) ? file_len : firmware_mem->ul_data_buf_len;
1099
1100 while (file_len_count > 0) {
1101 rdlen = per_send_len < file_len_count ? per_send_len : file_len_count;
1102 if (memcpy_s(firmware_mem->puc_data_buf, rdlen, g_st_rw_bin[ul_soft_ver]->addr + offset, rdlen) != EOK) {
1103 return -OAL_EFAIL;
1104 };
1105
1106 addr_send = (hi_u32)(addr + offset);
1107
1108 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
1109 if (offset == 0 && offset + rdlen == file_len) {
1110 verify_stage = 3; /* start and end, verify_stage 3. */
1111 } else if (offset == 0) {
1112 verify_stage = 0; /* start trans. */
1113 } else if (offset + rdlen == file_len) {
1114 verify_stage = 2; /* end trans, verify_stage 2. */
1115 } else {
1116 verify_stage = 1; /* transferring. */
1117 }
1118
1119 ret = snprintf_s((hi_char *)firmware_mem->puc_send_cmd_buff, CMD_BUFF_LEN, CMD_BUFF_LEN - 1,
1120 "%s%c0x%x%c0x%x%c%d%c", FILES_CMD_KEYWORD, COMPART_KEYWORD, addr_send, COMPART_KEYWORD, rdlen,
1121 COMPART_KEYWORD, verify_stage, COMPART_KEYWORD);
1122 if (ret < 0) {
1123 return -OAL_EFAIL;
1124 }
1125 #endif
1126 /* 发送地址 */
1127 oam_info_log1(0, 0, "send file addr cmd is [%s]", firmware_mem->puc_send_cmd_buff);
1128 ret = msg_send_and_recv_except(firmware_mem->puc_send_cmd_buff,
1129 strlen((const hi_char *)firmware_mem->puc_send_cmd_buff), (const hi_u8 *)MSG_FROM_DEV_READY_OK,
1130 firmware_mem);
1131 if (ret < 0) {
1132 oam_error_log1(0, 0, "SEND [%s] error\n", firmware_mem->puc_send_cmd_buff);
1133 return -OAL_EFAIL;
1134 }
1135 /* Wait at least 5 ms */
1136 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
1137 usleep_range(FILE_CMD_WAIT_TIME_MIN, FILE_CMD_WAIT_TIME_MAX);
1138 #elif (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
1139 usleep(FILE_CMD_WAIT_TIME_MIN);
1140 #endif
1141 /* 发送文件内容 */
1142 ret = msg_send_and_recv_except(firmware_mem->puc_data_buf, rdlen, (const hi_u8 *)MSG_FROM_DEV_FILES_OK,
1143 firmware_mem);
1144 if (ret < 0) {
1145 oam_error_log0(0, 0, " send data fail");
1146 return -OAL_EFAIL;
1147 }
1148
1149 offset += rdlen;
1150 file_len_count -= rdlen;
1151 }
1152
1153 /* 发送的长度要和文件的长度一致 */
1154 if (offset != file_len) {
1155 oam_error_log2(0, 0, "file send len is err! send len is [%d], file len is [%d]", offset, file_len);
1156 return -OAL_EFAIL;
1157 }
1158
1159 return HI_SUCCESS;
1160 }
1161 #endif
1162
1163 /* ****************************************************************************
1164 功能描述 : 执行firmware download的命令
1165 输入参数 : cmd_type: 加载命令的类型
1166 cmd_name: 命令的关键字
1167 cmd_para: 命令的参数
1168 输出参数 : 无
1169 返 回 值 : -1表示失败,非负数表示成功
1170 **************************************************************************** */
execute_download_cmd(hi_s32 cmd_type, hi_u8 *cmd_name, hi_u8 *cmd_para, firmware_mem_stru *firmware_mem)1171 static hi_s32 execute_download_cmd(hi_s32 cmd_type, hi_u8 *cmd_name, hi_u8 *cmd_para, firmware_mem_stru *firmware_mem)
1172 {
1173 hi_s32 l_ret;
1174
1175 switch (cmd_type) {
1176 case FILE_TYPE_CMD:
1177 l_ret = exec_file_type_cmd(cmd_name, cmd_para, firmware_mem);
1178 break;
1179 case NUM_TYPE_CMD:
1180 l_ret = exec_number_type_cmd(cmd_name, cmd_para, firmware_mem);
1181 break;
1182 case QUIT_TYPE_CMD:
1183 l_ret = exec_quit_type_cmd(firmware_mem);
1184 break;
1185 default:
1186 oam_error_log1(0, 0, "command type error[%d]", cmd_type);
1187 l_ret = -OAL_EFAIL;
1188 break;
1189 }
1190
1191 return l_ret;
1192 }
1193
firmware_write_cfg(hi_u8 *key, hi_u8 *new_val, hi_u8 len)1194 hi_s32 firmware_write_cfg(hi_u8 *key, hi_u8 *new_val, hi_u8 len)
1195 {
1196 oal_file_stru *fp;
1197 hi_s32 idx;
1198 hi_s64 l_ret;
1199 hi_u8 *cfg_patch = (hi_u8 *)WIFI_CFG_C01_PATH;
1200
1201 /* 查找参数名是否缓存 */
1202 for (idx = 0; idx < CFG_CMD_NUM_MAX; ++idx) {
1203 if (strcmp((const hi_char *)key, (const hi_char *)g_cus_cfg_cmd[idx].cmd_name) == 0) {
1204 break;
1205 }
1206 }
1207 if (idx == CFG_CMD_NUM_MAX) {
1208 printk("cfg [%s] to write not found\n", key);
1209 return -OAL_EFAIL;
1210 }
1211 /* 校验新值的长度 */
1212 if (len > g_cus_cfg_cmd[idx].val_len - 3) { /* 3:预留的 ‘;’和“\r\n”的大小 */
1213 printk("new val [%s] length exceeds old val [%s]\n", new_val, g_cus_cfg_cmd[idx].cmd_para);
1214 return -OAL_EFAIL;
1215 }
1216 fp = oal_file_open((const hi_char *)cfg_patch, (OAL_O_RDWR), 0);
1217 if (IS_ERR_OR_NULL(fp)) {
1218 printk("open file %s fail, fp=%p\n", cfg_patch, fp);
1219 return -OAL_EFAIL;
1220 }
1221 /* 定位到目标位置 */
1222 l_ret = oal_file_lseek(fp, g_cus_cfg_cmd[idx].val_offset, OAL_SEEK_SET);
1223 hi_u8 *buf = (hi_u8 *)OS_KMALLOC_GFP(g_cus_cfg_cmd[idx].val_len);
1224 if (buf == HI_NULL) {
1225 printk("firmware_write_cfg:alloc buf failed\n");
1226 oal_file_close(fp);
1227 return -OAL_EFAIL;
1228 }
1229 if (memset_s(buf, g_cus_cfg_cmd[idx].val_len, ' ', g_cus_cfg_cmd[idx].val_len) != EOK) {
1230 return -OAL_EFAIL;
1231 }
1232
1233 if (memcpy_s(buf, g_cus_cfg_cmd[idx].val_len, new_val, len + 1) != EOK) {
1234 oam_warning_log0(0, 0, "firmware_write_cfg:: buf memcpy_s fail.\n");
1235 }
1236 if (len < g_cus_cfg_cmd[idx].val_len - 2) { /* 2:回车换行预留 */
1237 buf[len] = ';'; /* 重置结束符 */
1238 }
1239 buf[g_cus_cfg_cmd[idx].val_len - 2] = '\r'; /* 增加回车换行.2:回退值 */
1240 buf[g_cus_cfg_cmd[idx].val_len - 1] = '\n';
1241 l_ret = oal_file_write(fp, (hi_char *)buf, g_cus_cfg_cmd[idx].val_len);
1242 oal_file_close(fp);
1243
1244 if (l_ret == g_cus_cfg_cmd[idx].val_len) { /* 返回值为写入字节数表示成功 */
1245 /* 更新缓存 */
1246 if (memcpy_s(g_cus_cfg_cmd[idx].cmd_para, g_cus_cfg_cmd[idx].val_len, buf, g_cus_cfg_cmd[idx].val_len) != EOK) {
1247 oam_warning_log0(0, 0, "firmware_write_cfg:: g_cus_cfg_cmd memcpy_s fail.\n");
1248 }
1249 oal_free(buf);
1250 return HI_SUCCESS;
1251 }
1252 oal_free(buf);
1253 return HI_FAIL;
1254 }
1255
1256 /* ****************************************************************************
1257 功能描述 : 读取cfg文件的内容,放到驱动动态分配的buffer中
1258 输入参数 : cfg_patch : cfg文件的路径
1259 puc_read_buffer : 保存cfg文件内容的buffer
1260 输出参数 : 无
1261 返 回 值 : 0表示成功,-1表示失败
1262 **************************************************************************** */
firmware_read_cfg(const hi_u8 *cfg_patch, hi_u8 *puc_read_buffer)1263 hi_s32 firmware_read_cfg(const hi_u8 *cfg_patch, hi_u8 *puc_read_buffer)
1264 {
1265 oal_file_stru *fp = HI_NULL;
1266 hi_s32 l_ret;
1267
1268 if ((cfg_patch == HI_NULL) || (puc_read_buffer == HI_NULL)) {
1269 printk("para is HI_NULL\n");
1270 return -OAL_EFAIL;
1271 }
1272
1273 fp = oal_file_open((const hi_char *)cfg_patch, (OAL_O_RDONLY), 0);
1274 if (IS_ERR_OR_NULL(fp)) {
1275 printk("open file %s fail, fp=%p\n", cfg_patch, fp);
1276 return -OAL_EFAIL;
1277 }
1278
1279 memset_s(puc_read_buffer, READ_CFG_BUF_LEN, 0, READ_CFG_BUF_LEN);
1280 l_ret = oal_file_read(fp, puc_read_buffer, READ_CFG_BUF_LEN);
1281 *(puc_read_buffer + READ_CFG_BUF_LEN - 1) = '\0';
1282 oal_file_close(fp);
1283 fp = HI_NULL;
1284
1285 return l_ret;
1286 }
1287
firmware_param_check(hi_u8 **begin, hi_u8 **end, hi_u8 **link, hi_u8 *puc_cfg_buffer, hi_s32 *l_ret)1288 hi_u8 firmware_param_check(hi_u8 **begin, hi_u8 **end, hi_u8 **link, hi_u8 *puc_cfg_buffer, hi_s32 *l_ret)
1289 {
1290 *begin = puc_cfg_buffer;
1291
1292 /* 注释行 */
1293 if (puc_cfg_buffer[0] == '@') {
1294 *l_ret = ERROR_TYPE_CMD;
1295 return HI_FAIL;
1296 }
1297
1298 /* 错误行,或者退出命令行 */
1299 *link = (hi_u8 *)strchr((const hi_char *)(*begin), '=');
1300 if (*link == HI_NULL) {
1301 /* 退出命令行 */
1302 if (strstr((hi_char *)puc_cfg_buffer, QUIT_CMD_KEYWORD) != HI_NULL) {
1303 *l_ret = QUIT_TYPE_CMD;
1304 return HI_SUCCESS;
1305 }
1306 *l_ret = ERROR_TYPE_CMD;
1307 return HI_FAIL;
1308 }
1309 /* 错误行,没有结束符 */
1310 *end = (hi_u8 *)strchr((const hi_char *)(*link), ';');
1311 if (*end == HI_NULL) {
1312 *l_ret = ERROR_TYPE_CMD;
1313 return HI_FAIL;
1314 }
1315
1316 return HI_CONTINUE;
1317 }
1318
firmware_parse_cmd_type(hi_s32 *l_cmdlen, hi_u8 **handle, hi_s32 *l_ret)1319 hi_u8 firmware_parse_cmd_type(hi_s32 *l_cmdlen, hi_u8 **handle, hi_s32 *l_ret)
1320 {
1321 hi_u8 *handle_temp = HI_NULL;
1322
1323 /* 判断命令类型 */
1324 if (!memcmp(*handle, (hi_u8 *)FILE_TYPE_CMD_KEY, strlen((const hi_char *)FILE_TYPE_CMD_KEY))) {
1325 handle_temp = (hi_u8 *)strstr((const hi_char *)(*handle), (const hi_char *)FILE_TYPE_CMD_KEY);
1326 if (handle_temp == HI_NULL) {
1327 oam_error_log1(0, 0, "'ADDR_FILE_'is not handle child string, handle=%s", *handle);
1328 *l_ret = ERROR_TYPE_CMD;
1329 return HI_FAIL;
1330 }
1331 *handle = handle_temp + strlen(FILE_TYPE_CMD_KEY);
1332 *l_cmdlen = *l_cmdlen - strlen(FILE_TYPE_CMD_KEY);
1333 *l_ret = FILE_TYPE_CMD;
1334 } else if (!memcmp(*handle, (hi_u8 *)NUM_TYPE_CMD_KEY, strlen(NUM_TYPE_CMD_KEY))) {
1335 handle_temp = (hi_u8 *)strstr((const hi_char *)(*handle), (const hi_char *)NUM_TYPE_CMD_KEY);
1336 if (handle_temp == HI_NULL) {
1337 oam_error_log1(0, 0, "'PARA_' is not handle child string, handle=%s", (uintptr_t)*handle);
1338 *l_ret = ERROR_TYPE_CMD;
1339 return HI_FAIL;
1340 }
1341 *handle = handle_temp + strlen(NUM_TYPE_CMD_KEY);
1342 *l_cmdlen = *l_cmdlen - strlen(NUM_TYPE_CMD_KEY);
1343 *l_ret = NUM_TYPE_CMD;
1344 } else if (!memcmp(*handle, (hi_u8 *)CFG_TYPE_CMD_KEY, strlen(CFG_TYPE_CMD_KEY))) {
1345 handle_temp = (hi_u8 *)strstr((const hi_char *)(*handle), (const hi_char *)CFG_TYPE_CMD_KEY);
1346 if (handle_temp == HI_NULL) {
1347 *l_ret = CFG_TYPE_CMD;
1348 return HI_SUCCESS;
1349 }
1350 *handle = handle_temp + strlen(CFG_TYPE_CMD_KEY);
1351 *l_cmdlen = *l_cmdlen - strlen(CFG_TYPE_CMD_KEY);
1352 *l_ret = CFG_TYPE_CMD;
1353 } else {
1354 *l_ret = ERROR_TYPE_CMD;
1355 return HI_FAIL;
1356 }
1357
1358 return HI_CONTINUE;
1359 }
1360
1361 /* ****************************************************************************
1362 功能描述 : 解析cfg文件中的命令
1363 输入参数 : puc_cfg_buffer: 保存cfg文件内容的buffer
1364 puc_cmd_name : 保存解析以后命令关键字的buffer
1365 puc_cmd_para : 保存解析以后命令参数的buffer
1366 输出参数 : 无
1367 返 回 值 : 返回命令的类型
1368 **************************************************************************** */
firmware_parse_cmd(hi_u8 *puc_cfg_buffer, hi_u8 *puc_cmd_name, hi_u8 cmd_len, hi_u8 *puc_cmd_para, hi_u32 *val_begin)1369 static hi_s32 firmware_parse_cmd(hi_u8 *puc_cfg_buffer, hi_u8 *puc_cmd_name, hi_u8 cmd_len, hi_u8 *puc_cmd_para,
1370 hi_u32 *val_begin)
1371 {
1372 hi_s32 l_ret;
1373 hi_s32 l_cmdlen;
1374 hi_s32 l_paralen;
1375 hi_u8 *begin = HI_NULL;
1376 hi_u8 *end = HI_NULL;
1377 hi_u8 *link = HI_NULL;
1378 hi_u8 *handle = HI_NULL;
1379
1380 hi_unref_param(cmd_len);
1381
1382 if ((puc_cfg_buffer == HI_NULL) || (puc_cmd_name == HI_NULL) || (puc_cmd_para == HI_NULL)) {
1383 oam_error_log0(0, 0, "para is HI_NULL\n");
1384 return ERROR_TYPE_CMD;
1385 }
1386
1387 if (firmware_param_check(&begin, &end, &link, puc_cfg_buffer, &l_ret) != HI_CONTINUE) {
1388 return l_ret;
1389 }
1390
1391 *val_begin = (uintptr_t)(link + 1);
1392
1393 l_cmdlen = link - begin;
1394
1395 /* 删除关键字的两边空格 */
1396 handle = delete_space((hi_u8 *)begin, &l_cmdlen);
1397 if (handle == HI_NULL) {
1398 return ERROR_TYPE_CMD;
1399 }
1400
1401 if (firmware_parse_cmd_type(&l_cmdlen, &handle, &l_ret) != HI_CONTINUE) {
1402 return l_ret;
1403 }
1404
1405 if (l_cmdlen > DOWNLOAD_CMD_LEN || l_cmdlen < 0) {
1406 oam_error_log0(0, 0, "cmd len out of range!\n");
1407 return ERROR_TYPE_CMD;
1408 }
1409 memcpy_s(puc_cmd_name, l_cmdlen, handle, l_cmdlen);
1410
1411 /* 删除值两边空格 */
1412 begin = link + 1;
1413 l_paralen = end - begin;
1414 if (l_paralen > DOWNLOAD_CMD_PARA_LEN || l_paralen < 0) {
1415 oam_error_log0(0, 0, "para len out of range!\n");
1416 return ERROR_TYPE_CMD;
1417 }
1418
1419 handle = delete_space((hi_u8 *)begin, &l_paralen);
1420 if (handle == HI_NULL) {
1421 return ERROR_TYPE_CMD;
1422 }
1423 memcpy_s(puc_cmd_para, l_paralen, handle, l_paralen);
1424
1425 return l_ret;
1426 }
1427
1428 /* ****************************************************************************
1429 功能描述 : 解析cfg文件,将解析的结果保存在g_st_cfg_info全局变量中
1430 输入参数 : puc_cfg_info_buf: 保存了cfg文件内容的buffer
1431 l_buf_len : puc_cfg_info_buf的长度
1432 ul_index : 保存解析结果的数组索引值
1433 输出参数 : 无
1434 返 回 值 : 0表示成功,-1表示失败
1435 **************************************************************************** */
firmware_parse_cfg(hi_u8 *puc_cfg_info_buf, hi_s32 l_buf_len, hi_u32 ul_index)1436 static hi_s32 firmware_parse_cfg(hi_u8 *puc_cfg_info_buf, hi_s32 l_buf_len, hi_u32 ul_index)
1437 {
1438 hi_u32 cfg_idx = 0;
1439 hi_s32 i, l_len, cmd_type;
1440 hi_u8 *flag = HI_NULL;
1441 hi_u8 *begin = HI_NULL;
1442 hi_u8 *end = HI_NULL;
1443 hi_u8 cmd_name[DOWNLOAD_CMD_LEN];
1444 hi_u8 cmd_para[DOWNLOAD_CMD_PARA_LEN];
1445 hi_u32 cmd_para_len = 0;
1446 hi_u32 val_offset = 0;
1447 if (puc_cfg_info_buf == HI_NULL) {
1448 oam_error_log0(0, 0, "firmware_parse_cfg:: puc_cfg_info_buf is HI_NULL");
1449 return -OAL_EFAIL;
1450 }
1451
1452 g_st_cfg_info.apst_cmd[ul_index] = (struct cmd_type_st *)malloc_cmd_buf(puc_cfg_info_buf, ul_index);
1453 if (g_st_cfg_info.apst_cmd[ul_index] == HI_NULL) {
1454 oam_error_log0(0, 0, "firmware_parse_cfg:: malloc_cmd_buf fail");
1455 return -OAL_EFAIL;
1456 }
1457
1458 /* 解析CMD BUF */
1459 flag = puc_cfg_info_buf;
1460 l_len = l_buf_len;
1461 i = 0;
1462 while ((i < g_st_cfg_info.al_count[ul_index]) && (flag < &puc_cfg_info_buf[l_len])) {
1463 /*
1464 * 获取配置文件中的一行,配置文件必须是unix格式.
1465 * 配置文件中的某一行含有字符 @ 则认为该行为注释行
1466 */
1467 begin = flag;
1468 end = (hi_u8 *)strchr((const hi_char *)flag, '\n');
1469 if (end == HI_NULL) { /* 文件的最后一行,没有换行符 */
1470 end = &puc_cfg_info_buf[l_len];
1471 } else if (end == begin) { /* 该行只有一个换行符 */
1472 oam_error_log0(0, 0, "blank line\n");
1473 flag = end + 1;
1474 continue;
1475 }
1476 *end = '\0';
1477
1478 memset_s(cmd_name, DOWNLOAD_CMD_LEN, 0, DOWNLOAD_CMD_LEN);
1479 memset_s(cmd_para, DOWNLOAD_CMD_PARA_LEN, 0, DOWNLOAD_CMD_PARA_LEN);
1480
1481 cmd_type = firmware_parse_cmd(begin, cmd_name, DOWNLOAD_CMD_LEN, cmd_para, &val_offset);
1482
1483 if (cmd_type == CFG_TYPE_CMD) { /* 产测配置命令类型,增加到缓存 */
1484 if (cfg_idx == CFG_CMD_NUM_MAX) {
1485 oam_error_log1(0, 0, "firmware_parse_cfg:: Cus cfg items exceed limit %d, will omit", CFG_CMD_NUM_MAX);
1486 }
1487 memcpy_s(g_cus_cfg_cmd[cfg_idx].cmd_name, DOWNLOAD_CMD_LEN, cmd_name, DOWNLOAD_CMD_LEN);
1488 memcpy_s(g_cus_cfg_cmd[cfg_idx].cmd_para, DOWNLOAD_CMD_PARA_LEN, cmd_para, DOWNLOAD_CMD_PARA_LEN);
1489 g_cus_cfg_cmd[cfg_idx].cmd_name[DOWNLOAD_CMD_LEN - 1] = '\0';
1490 g_cus_cfg_cmd[cfg_idx].cmd_para[DOWNLOAD_CMD_PARA_LEN - 1] = '\0';
1491 g_cus_cfg_cmd[cfg_idx].val_offset = val_offset - (uintptr_t)puc_cfg_info_buf;
1492 g_cus_cfg_cmd[cfg_idx].val_len = (hi_u16)((uintptr_t)end - val_offset + 1);
1493 #ifdef CUSTOM_DBG
1494 oam_info_log0(0, 0, "firmware_parse_cfg:: cmd type=[%d],cmd_name=[%s],cmd_para=[%s], line len %d",
1495 cmd_type, cmd_name, cmd_para, g_cus_cfg_cmd[cfg_idx].val_len);
1496 #endif
1497 ++cfg_idx;
1498 } else if (cmd_type != ERROR_TYPE_CMD) { /* 正确的命令类型,增加 */
1499 g_st_cfg_info.apst_cmd[ul_index][i].cmd_type = cmd_type;
1500 if (memcpy_s(g_st_cfg_info.apst_cmd[ul_index][i].cmd_name, DOWNLOAD_CMD_LEN, cmd_name, DOWNLOAD_CMD_LEN) !=
1501 EOK || memcpy_s(g_st_cfg_info.apst_cmd[ul_index][i].cmd_para, DOWNLOAD_CMD_PARA_LEN, cmd_para,
1502 DOWNLOAD_CMD_PARA_LEN) != EOK) {
1503 return -OAL_EFAIL;
1504 }
1505 g_st_cfg_info.apst_cmd[ul_index][i].cmd_name[DOWNLOAD_CMD_LEN - 1] = '\0';
1506 g_st_cfg_info.apst_cmd[ul_index][i].cmd_para[DOWNLOAD_CMD_PARA_LEN - 1] = '\0';
1507
1508 /* 获取配置版本号 */
1509 if (!memcmp(g_st_cfg_info.apst_cmd[ul_index][i].cmd_name, VER_CMD_KEYWORD, strlen(VER_CMD_KEYWORD))) {
1510 cmd_para_len = strlen((const hi_char *)g_st_cfg_info.apst_cmd[ul_index][i].cmd_para);
1511 if (cmd_para_len <= VERSION_LEN) {
1512 if (memcpy_s(g_st_cfg_info.auc_CfgVersion, cmd_para_len,
1513 g_st_cfg_info.apst_cmd[ul_index][i].cmd_para, cmd_para_len) != EOK) {
1514 oam_warning_log0(0, 0, "firmware_parse_cfg::memcpy_s fail!");
1515 }
1516 } else {
1517 oam_error_log1(0, 0, "firmware_parse_cfg:: cmd_para_len = %d over auc_CfgVersion length",
1518 cmd_para_len);
1519 return -OAL_EFAIL;
1520 }
1521 oam_warning_log1(0, 0, "Hi3881 VERSION:: [%s]", (uintptr_t)g_st_cfg_info.auc_CfgVersion);
1522 }
1523 i++;
1524 }
1525 flag = end + 1;
1526 }
1527
1528 /* 根据实际命令个数,修改最终的命令个数 */
1529 g_st_cfg_info.al_count[ul_index] = i;
1530 oam_info_log2(0, 0, "firmware_parse_cfg:: effective cmd count: al_count[%d] = %d", ul_index,
1531 g_st_cfg_info.al_count[ul_index]);
1532
1533 return HI_SUCCESS;
1534 }
1535
1536
1537 /* ****************************************************************************
1538 功能描述 : 读取cfg文件并解析,将解析的结果保存在g_st_cfg_info全局变量中
1539 输入参数 : cfg_patch: cfg文件的路径
1540 ul_index : 保存解析结果的数组索引值
1541 输出参数 : 无
1542 返 回 值 : 0表示成功,-1表示失败
1543 **************************************************************************** */
firmware_get_cfg(const hi_u8 *cfg_patch, hi_u32 ul_index)1544 static hi_s32 firmware_get_cfg(const hi_u8 *cfg_patch, hi_u32 ul_index)
1545 {
1546 hi_u8 *read_cfg_buf = HI_NULL;
1547 hi_s32 l_readlen;
1548 hi_s32 l_ret;
1549 hi_u32 ul_soft_ver = 0;
1550
1551 if (cfg_patch == HI_NULL) {
1552 oam_warning_log0(0, 0, "firmware_get_cfg:: cfg file path is HI_NULL");
1553 return -OAL_EFAIL;
1554 }
1555
1556 /* cfg文件限定在小于2048,如果cfg文件的大小确实大于2048,可以修改READ_CFG_BUF_LEN的值 */
1557 read_cfg_buf = OS_KMALLOC_GFP(READ_CFG_BUF_LEN);
1558 if (read_cfg_buf == HI_NULL) {
1559 oam_warning_log0(0, 0, "firmware_get_cfg:: kmalloc READ_CFG_BUF fail");
1560 return -OAL_EFAIL;
1561 }
1562
1563 memset_s(read_cfg_buf, READ_CFG_BUF_LEN, 0, READ_CFG_BUF_LEN);
1564
1565 #ifndef _PRE_HI113X_FS_DISABLE
1566 (hi_void)ul_soft_ver;
1567 l_readlen = firmware_read_cfg(cfg_patch, read_cfg_buf);
1568 if (l_readlen < 0) {
1569 oam_warning_log1(0, 0, "firmware_get_cfg:: firmware_read_cfg failed[%d]", l_readlen);
1570 oal_free(read_cfg_buf);
1571 read_cfg_buf = HI_NULL;
1572 return -OAL_EFAIL;
1573 } else if (l_readlen > READ_CFG_BUF_LEN - 1) {
1574 /*
1575 * 减1是为了确保cfg文件的长度不超过READ_CFG_BUF_LEN,
1576 * 因为firmware_read_cfg最多只会读取READ_CFG_BUF_LEN长度的内容
1577 */
1578 oam_error_log2(0, 0, "firmware_get_cfg:: cfg file [%s] larger than %d", (uintptr_t)cfg_patch, READ_CFG_BUF_LEN);
1579 oal_free(read_cfg_buf);
1580 read_cfg_buf = HI_NULL;
1581 return -OAL_EFAIL;
1582 }
1583 #else
1584 ul_soft_ver = get_device_soft_version();
1585 if (ul_soft_ver >= SOFT_VER_BUTT) {
1586 oam_error_log1(0, 0, "firmware_get_cfg:: get_device_soft_version failed[%d]", ul_soft_ver);
1587 oal_free(read_cfg_buf);
1588 return -OAL_EFAIL;
1589 }
1590
1591 l_readlen = g_st_wifi_cfg[ul_soft_ver]->len;
1592 if (l_readlen > READ_CFG_BUF_LEN) {
1593 oam_error_log1(0, 0, "firmware_get_cfg:: read_wifi_cfg failed[%d]", l_readlen);
1594 oal_free(read_cfg_buf);
1595 read_cfg_buf = HI_NULL;
1596 return -OAL_EFAIL;
1597 }
1598
1599 if (memcpy_s(read_cfg_buf, l_readlen, g_st_wifi_cfg[ul_soft_ver]->addr, l_readlen) != EOK) {
1600 oal_free(read_cfg_buf);
1601 return -OAL_EFAIL;
1602 }
1603 #endif
1604
1605 l_ret = firmware_parse_cfg(read_cfg_buf, l_readlen, ul_index);
1606 if (l_ret < 0) {
1607 oam_error_log1(0, 0, "firmware_get_cfg:: firmware_parse_cfg failed[%d]", l_ret);
1608 }
1609
1610 oal_free(read_cfg_buf);
1611 read_cfg_buf = HI_NULL;
1612
1613 return l_ret;
1614 }
1615
1616 /* ****************************************************************************
1617 功能描述 : firmware加载
1618 输入参数 : ul_index: 有效加载命令数组的索引
1619 输出参数 : 无
1620 返 回 值 : 0表示成功,-1表示失败
1621 **************************************************************************** */
firmware_download(hi_u32 ul_index)1622 hi_s32 firmware_download(hi_u32 ul_index)
1623 {
1624 hi_s32 l_ret;
1625 hi_s32 i;
1626 hi_s32 l_cmd_type;
1627 hi_u8 *puc_cmd_name = HI_NULL;
1628 hi_u8 *puc_cmd_para = HI_NULL;
1629 firmware_mem_stru *firmware_mem = HI_NULL;
1630
1631 if (ul_index >= CFG_FILE_TOTAL) {
1632 oam_error_log1(0, 0, "firmware_download:: ul_index [%d] is error", ul_index);
1633 return -OAL_EFAIL;
1634 }
1635
1636 if (g_st_cfg_info.al_count[ul_index] == 0) {
1637 oam_error_log1(0, 0, "firmware_download:: firmware download cmd count is 0, ul_index = [%d]", ul_index);
1638 return -OAL_EFAIL;
1639 }
1640
1641 firmware_mem = firmware_mem_request();
1642 if (firmware_mem == HI_NULL) {
1643 oam_error_log0(0, 0, "firmware_download:: firmware_mem_request fail");
1644 return -OAL_EFAIL;
1645 }
1646
1647 for (i = 0; i < g_st_cfg_info.al_count[ul_index]; i++) {
1648 l_cmd_type = g_st_cfg_info.apst_cmd[ul_index][i].cmd_type;
1649 puc_cmd_name = g_st_cfg_info.apst_cmd[ul_index][i].cmd_name;
1650 puc_cmd_para = g_st_cfg_info.apst_cmd[ul_index][i].cmd_para;
1651 l_ret = execute_download_cmd(l_cmd_type, puc_cmd_name, puc_cmd_para, firmware_mem);
1652 if (l_ret < 0) {
1653 if (puc_cmd_name == HI_NULL) {
1654 continue;
1655 }
1656 if (ul_index == RAM_REG_TEST_CFG && ((!memcmp(puc_cmd_name, JUMP_CMD_KEYWORD, strlen(JUMP_CMD_KEYWORD))) &&
1657 (g_ul_jump_cmd_result == CMD_JUMP_EXEC_RESULT_FAIL))) {
1658 /* device mem check 返回失败,继续执行READM命令,将结果读上来 */
1659 oam_error_log0(0, 0, "firmware_download:: Device Mem Reg check result is fail");
1660 continue;
1661 }
1662 l_ret = -OAL_EFAIL;
1663 firmware_mem_free(firmware_mem);
1664 return l_ret;
1665 }
1666 }
1667 l_ret = HI_SUCCESS;
1668 firmware_mem_free(firmware_mem);
1669 return l_ret;
1670 }
1671
1672
1673 EXPORT_SYMBOL(firmware_download);
1674
get_efuse_info_handlernull1675 efuse_info_stru *get_efuse_info_handler(hi_void)
1676 {
1677 return &g_st_efuse_info;
1678 }
1679 EXPORT_SYMBOL(get_efuse_info_handler);
1680
get_device_soft_versionnull1681 hi_u32 get_device_soft_version(hi_void)
1682 {
1683 efuse_info_stru *pst_efuse_info;
1684 hi_u32 ul_soft_ver;
1685 pst_efuse_info = get_efuse_info_handler();
1686 if (pst_efuse_info == HI_NULL) {
1687 printk("***get_device_soft_version***[%d]\n", __LINE__);
1688 return SOFT_VER_BUTT;
1689 }
1690
1691 ul_soft_ver = pst_efuse_info->soft_ver;
1692 if (ul_soft_ver >= SOFT_VER_BUTT) {
1693 printk("***get_device_soft_version***[%d]\n", __LINE__);
1694 return SOFT_VER_BUTT;
1695 }
1696
1697 return ul_soft_ver;
1698 }
1699
firmware_read_efuse_infonull1700 hi_s32 firmware_read_efuse_info(hi_void)
1701 {
1702 firmware_mem_stru *firmware_mem = HI_NULL;
1703 const unsigned long ul_mac_addr = DEVICE_EFUSE_ADDR;
1704
1705 efuse_info_stru *pst_efuse_info = get_efuse_info_handler();
1706 if (pst_efuse_info == HI_NULL) {
1707 oam_error_log0(0, 0, "pst_efuse_info is HI_NULL!\n");
1708 goto failed;
1709 }
1710 if (memset_s(pst_efuse_info, sizeof(efuse_info_stru), 0, sizeof(efuse_info_stru)) != EOK) {
1711 goto failed;
1712 }
1713
1714 firmware_mem = firmware_mem_request();
1715 if (firmware_mem == HI_NULL) {
1716 oam_error_log0(0, 0, "firmware_mem_request fail\n");
1717 goto failed;
1718 }
1719
1720 hi_u32 ul_size = DEVICE_EFUSE_LENGTH;
1721 #if (_PRE_FEATURE_USB == _PRE_FEATURE_CHANNEL_TYPE)
1722 ul_size = hiusb_align_32(ul_size);
1723 #elif (_PRE_FEATURE_SDIO == _PRE_FEATURE_CHANNEL_TYPE)
1724 ul_size = HISDIO_ALIGN_4_OR_BLK(ul_size);
1725 #endif
1726 if (ul_size > firmware_mem->ul_data_buf_len) {
1727 oam_error_log0(0, 0, "device mac length is too long !\n");
1728 goto failed;
1729 }
1730
1731 if (snprintf_s((hi_char *)firmware_mem->puc_send_cmd_buff, CMD_BUFF_LEN, CMD_BUFF_LEN - 1, "%s%c0x%lx%c%d%c",
1732 RMEM_CMD_KEYWORD, COMPART_KEYWORD, ul_mac_addr, COMPART_KEYWORD, ul_size, COMPART_KEYWORD) == -1) {
1733 goto failed;
1734 }
1735 oam_info_log1(0, 0, "read mac cmd:[%s]\n", (uintptr_t)firmware_mem->puc_send_cmd_buff);
1736 hi_s32 l_ret = firmware_send_msg(firmware_mem->puc_send_cmd_buff,
1737 strlen((const hi_char *)firmware_mem->puc_send_cmd_buff));
1738 if (l_ret < 0) {
1739 oam_error_log1(0, 0, "read device mac cmd send fail![%d]\n", l_ret);
1740 goto failed;
1741 }
1742
1743 l_ret = firmware_read_msg(firmware_mem->puc_data_buf, ul_size);
1744 if (l_ret < 0) {
1745 oam_error_log1(0, 0, "read device mac fail![%d]\n", l_ret);
1746 goto failed;
1747 }
1748
1749 if (memcpy_s(pst_efuse_info, sizeof(efuse_info_stru), firmware_mem->puc_data_buf,
1750 sizeof(efuse_info_stru)) != EOK) {
1751 goto failed;
1752 }
1753
1754 firmware_mem_free(firmware_mem);
1755 return HI_SUCCESS;
1756
1757 failed:
1758 if (firmware_mem != HI_NULL) {
1759 firmware_mem_free(firmware_mem);
1760 }
1761 return -OAL_EFAIL;
1762 }
1763 /* ****************************************************************************
1764 功能描述 : firmware加载的cfg文件初始化,读取并解析cfg文件,将解析的结果保存在
1765 g_st_cfg_info全局变量中
1766 输入参数 : 无
1767 输出参数 : 无
1768 返 回 值 : 0表示成功,-1表示失败
1769 **************************************************************************** */
plat_firmware_init(void)1770 hi_u32 plat_firmware_init(void)
1771 {
1772 hi_s32 l_ret;
1773 hi_u32 ul_soft_ver;
1774
1775 #ifdef _PRE_WLAN_FEATURE_DATA_BACKUP
1776 if (g_ul_wlan_resume_wifi_init_flag) {
1777 l_ret = plat_data_recover();
1778 if (l_ret != HI_SUCCESS) {
1779 oam_error_log1(0, 0, "plat_firmware_init:: plat_data_recover failed[%d]", l_ret);
1780 return OAL_EFAIL;
1781 }
1782 }
1783 #endif
1784
1785 #ifdef _PRE_WLAN_FEATURE_DATA_BACKUP
1786 if (!g_ul_wlan_resume_wifi_init_flag) {
1787 #endif
1788 ul_soft_ver = get_device_soft_version();
1789 if (ul_soft_ver >= SOFT_VER_BUTT) {
1790 oam_error_log1(0, 0, "plat_firmware_init:: get_device_soft_version failed[%d]", ul_soft_ver);
1791 return OAL_EFAIL;
1792 }
1793
1794 /* 解析cfg文件 */
1795 l_ret = firmware_get_cfg(g_auc_cfg_path[ul_soft_ver], WIFI_CFG);
1796 if (l_ret < 0) {
1797 oam_error_log1(0, 0, "plat_firmware_init:: firware_get_cfg faile[%d]d", l_ret);
1798 plat_firmware_clear();
1799 return OAL_EFAIL;
1800 }
1801
1802 #ifdef _PRE_WLAN_FEATURE_DATA_BACKUP
1803 }
1804 #endif
1805
1806 #ifdef _PRE_WLAN_FEATURE_DATA_BACKUP
1807 l_ret = plat_data_backup();
1808 if (l_ret != HI_SUCCESS) {
1809 oam_error_log1(0, 0, "plat_firmware_init:: plat_data_backup failed[%d]", l_ret);
1810 plat_firmware_clear();
1811 return OAL_EFAIL;
1812 }
1813 #endif
1814
1815 printk("plat_firmware_init SUCCESSFULLY\r\n");
1816 return HI_SUCCESS;
1817 }
1818
1819 EXPORT_SYMBOL(plat_firmware_init);
1820
1821 /* ****************************************************************************
1822 功能描述 : 释放firmware_cfg_init时申请的内存
1823 输入参数 : 无
1824 输出参数 : 无
1825 返 回 值 : 总是返回0,表示成功
1826 **************************************************************************** */
plat_firmware_clear(void)1827 hi_s32 plat_firmware_clear(void)
1828 {
1829 hi_s32 i;
1830
1831 for (i = 0; i < CFG_FILE_TOTAL; i++) {
1832 g_st_cfg_info.al_count[i] = 0;
1833 if (g_st_cfg_info.apst_cmd[i] != HI_NULL) {
1834 oal_free(g_st_cfg_info.apst_cmd[i]);
1835 g_st_cfg_info.apst_cmd[i] = HI_NULL;
1836 }
1837 }
1838 return HI_SUCCESS;
1839 }
1840
char_2_hex(hi_u8 c, hi_u8 *val)1841 hi_bool char_2_hex(hi_u8 c, hi_u8 *val)
1842 {
1843 if ((c >= '0') && (c <= '9')) {
1844 *val = c - '0';
1845 return HI_TRUE;
1846 }
1847 if ((c >= 'a') && (c <= 'f')) {
1848 *val = 0x0a + c - 'a';
1849 return HI_TRUE;
1850 }
1851 if ((c >= 'A') && (c <= 'F')) {
1852 *val = 0x0a + c - 'A';
1853 return HI_TRUE;
1854 }
1855
1856 return HI_FALSE;
1857 }
1858
parse_mac_addr(const hi_u8 *str, hi_u8 str_len, hi_u8 *mac, hi_u8 size)1859 hi_bool parse_mac_addr(const hi_u8 *str, hi_u8 str_len, hi_u8 *mac, hi_u8 size)
1860 {
1861 hi_u8 i, temp;
1862 hi_u8 val = 0;
1863 hi_u8 idx = 0;
1864 hi_u8 offset = 0;
1865 hi_bool is_mac_valid = HI_FALSE;
1866 hi_bool ret;
1867
1868 for (i = 0; (i < str_len) && (idx < size); ++i) {
1869 ret = char_2_hex(str[i], &temp);
1870 if (ret) {
1871 if (offset == 2) { /* 2:连续有效字符.超过2个有效值 */
1872 return HI_FALSE;
1873 }
1874 val = (offset == 0) ? temp : ((val << 4) + temp); /* 4:位数 */
1875 if (offset == 1) {
1876 mac[idx] = val;
1877 is_mac_valid = (val != 0) ? HI_TRUE : is_mac_valid;
1878 ++idx;
1879 }
1880 ++offset;
1881 } else if (offset != 2) { /* 2:连续有效字符,少于2个有效值 */
1882 return HI_FALSE;
1883 } else if (str[i] == ':') {
1884 offset = 0;
1885 } else {
1886 return HI_FALSE;
1887 }
1888 }
1889
1890 return ((idx == size) && is_mac_valid) ? HI_TRUE : HI_FALSE;
1891 }
1892
split(hi_u8 *src, const hi_char *separator, hi_char **dest, hi_u8 num)1893 hi_bool split(hi_u8 *src, const hi_char *separator, hi_char **dest, hi_u8 num)
1894 {
1895 char *next = HI_NULL;
1896 int count = 0;
1897
1898 if ((src == HI_NULL) || (strlen((const hi_char *)src) == 0) || (separator == HI_NULL) || (strlen(separator) == 0)) {
1899 return HI_FALSE;
1900 }
1901 next = oal_strtok((char *)src, separator);
1902 while (next != HI_NULL) {
1903 *(dest++) = next;
1904 ++count;
1905 if (count == num) {
1906 break;
1907 }
1908 next = oal_strtok(HI_NULL, separator);
1909 }
1910 if (count < num) {
1911 return HI_FALSE;
1912 }
1913 return HI_TRUE;
1914 }
1915
split_cmd_paras(const hi_char *cmd_para, hi_u8 size, hi_u32 *data, hi_u8 data_size, hi_bool by_hex)1916 hi_bool split_cmd_paras(const hi_char *cmd_para, hi_u8 size, hi_u32 *data, hi_u8 data_size, hi_bool by_hex)
1917 {
1918 hi_u8 i;
1919 hi_char *stop = HI_NULL;
1920 hi_u8 src[DOWNLOAD_CMD_PARA_LEN + 1] = {0};
1921 hi_char *revbuf[CMD_SUB_PARA_CNT_MAX] = {0};
1922
1923 if (data_size > CMD_SUB_PARA_CNT_MAX) {
1924 return HI_FALSE;
1925 }
1926
1927 if (memcpy_s(src, sizeof(src), cmd_para, size) != EOK) {
1928 oam_error_log0(0, 0, "split_cmd_paras:: memcpy_s failed");
1929 return HI_FALSE;
1930 }
1931
1932 if (!split(src, ",", revbuf, data_size)) {
1933 return HI_FALSE;
1934 }
1935 for (i = 0; i < data_size; ++i) {
1936 if (by_hex) {
1937 data[i] = (hi_u32)oal_strtol(revbuf[i], &stop, 16); /* 16:按16进制解析 */
1938 } else {
1939 data[i] = (hi_u32)oal_strtol(revbuf[i], &stop, 10); /* 10:按10进制解析 */
1940 }
1941 }
1942 return HI_TRUE;
1943 }
1944
get_cfg_idx(const hi_char *cfg_name, hi_u8 *idx)1945 hi_bool get_cfg_idx(const hi_char *cfg_name, hi_u8 *idx)
1946 {
1947 hi_u8 i;
1948 /* 查找参数名是否缓存 */
1949 for (i = 0; i < CFG_CMD_NUM_MAX; ++i) {
1950 if (strcmp(cfg_name, (const hi_char *)g_cus_cfg_cmd[i].cmd_name) == 0) {
1951 break;
1952 }
1953 }
1954 *idx = i;
1955 return HI_TRUE;
1956 }
1957
cfg_get_mac(hi_u8 *mac_addr, hi_u8 size)1958 hi_bool cfg_get_mac(hi_u8 *mac_addr, hi_u8 size)
1959 {
1960 hi_u8 idx;
1961
1962 if (!get_cfg_idx((const hi_char *)WIFI_CFG_MAC, &idx)) {
1963 return HI_FALSE;
1964 }
1965
1966 return parse_mac_addr(g_cus_cfg_cmd[idx].cmd_para, strlen((const hi_char *)g_cus_cfg_cmd[idx].cmd_para), mac_addr,
1967 size);
1968 }
1969
cfg_dbbnull1970 hi_u32 cfg_dbb(hi_void)
1971 {
1972 const hi_u8 data_size = 7; /* 7:参数个数 */
1973 hi_u32 data[data_size];
1974 hi_u8 idx;
1975 hi_bool ret;
1976
1977 memset_s(data, sizeof(data), 0, sizeof(data));
1978 /* 查找配置索引 */
1979 if (!get_cfg_idx(WIFI_CFG_DBB_PARAMS, &idx)) {
1980 return HI_FAIL;
1981 }
1982 /* 解析参数 */
1983 ret = split_cmd_paras((const hi_char *)g_cus_cfg_cmd[idx].cmd_para,
1984 strlen((const hi_char *)g_cus_cfg_cmd[idx].cmd_para), data, data_size, HI_TRUE);
1985 if (ret != HI_FAIL) {
1986 oam_error_log0(0, 0, "cfg_dbb:: split_cmd_paras failed");
1987 return ret;
1988 }
1989
1990 return wal_cfg_dbb(data, data_size);
1991 }
1992
cfg_country_codenull1993 hi_u32 cfg_country_code(hi_void)
1994 {
1995 const hi_u8 size = 3;
1996 hi_char data[size];
1997 hi_u8 idx;
1998
1999 /* 查找配置索引 */
2000 if (!get_cfg_idx(WIFI_CFG_COUNTRY_CODE, &idx)) {
2001 return HI_FAIL;
2002 }
2003 if (strlen((const hi_char *)g_cus_cfg_cmd[idx].cmd_para) < size - 1) {
2004 return HI_FAIL;
2005 }
2006 /* 拷贝国家码,顺序交叉 */
2007 data[0] = g_cus_cfg_cmd[idx].cmd_para[1];
2008 data[1] = g_cus_cfg_cmd[idx].cmd_para[0];
2009 data[2] = '\0'; /* 下标2 */
2010
2011 return wal_cfg_country_code(data, size);
2012 }
2013
cfg_tx_pwr_offsetnull2014 hi_u32 cfg_tx_pwr_offset(hi_void)
2015 {
2016 hi_u8 idx;
2017 const hi_u8 data_size = 13; /* 13:参数个数 */
2018 hi_u32 data[data_size];
2019 hi_bool ret;
2020
2021 memset_s(data, sizeof(data), 0, sizeof(data));
2022 /* 查找配置索引 */
2023 if (!get_cfg_idx(WIFI_CFG_CH_TXPWR, &idx)) {
2024 return HI_FAIL;
2025 }
2026 /* 解析参数 */
2027 ret = split_cmd_paras((const hi_char *)g_cus_cfg_cmd[idx].cmd_para,
2028 strlen((const hi_char *)g_cus_cfg_cmd[idx].cmd_para), data, data_size, HI_TRUE);
2029 if (ret != HI_FAIL) {
2030 oam_error_log0(0, 0, "cfg_tx_pwr_offset:: split_cmd_paras failed");
2031 return ret;
2032 }
2033
2034 return wal_cfg_fcc_tx_pwr(data, data_size);
2035 }
2036
cfg_freq_comp_valnull2037 hi_u32 cfg_freq_comp_val(hi_void)
2038 {
2039 hi_u8 idx;
2040 const hi_u8 data_size = 3; /* 3:参数个数 */
2041 hi_u32 data[data_size];
2042 hi_bool ret;
2043
2044 memset_s(data, sizeof(data), 0, sizeof(data));
2045 /* 查找配置索引 */
2046 if (!get_cfg_idx(WIFI_CFG_FREQ_COMP, &idx)) {
2047 return HI_FAIL;
2048 }
2049 /* 解析参数 */
2050 ret = split_cmd_paras((const hi_char *)g_cus_cfg_cmd[idx].cmd_para,
2051 strlen((const hi_char *)g_cus_cfg_cmd[idx].cmd_para), data, data_size, HI_FALSE);
2052 if (ret != HI_FAIL) {
2053 oam_error_log0(0, 0, "cfg_freq_comp_val:: split_cmd_paras failed");
2054 return ret;
2055 }
2056
2057 return wal_cfg_freq_comp_val(data, data_size);
2058 }
2059
cfg_rssi_ofsetnull2060 hi_u32 cfg_rssi_ofset(hi_void)
2061 {
2062 hi_s32 data;
2063 hi_char *stop = HI_NULL;
2064 hi_u8 idx;
2065
2066 /* 查找配置索引 */
2067 if (!get_cfg_idx(WIFI_CFG_RSSI_OFFSET, &idx)) {
2068 return HI_FAIL;
2069 }
2070 data = oal_strtol((const hi_char *)g_cus_cfg_cmd[idx].cmd_para, &stop, 10); /* 10:按10进制解析 */
2071 return wal_cfg_rssi_ofset(data);
2072 }
2073
firmware_sync_cfg_paras_to_wal_customizenull2074 hi_u32 firmware_sync_cfg_paras_to_wal_customize(hi_void)
2075 {
2076 /* 同步dbb scale功率配置 */
2077 if (cfg_dbb() != HI_SUCCESS) {
2078 oam_error_log0(0, 0, "firmware_sync_cfg_paras_to_wal_customize:: cfg_dbb failed");
2079 return HI_FAIL;
2080 }
2081 /* 同步国家码 */
2082 if (cfg_country_code() != HI_SUCCESS) {
2083 oam_error_log0(0, 0, "firmware_sync_cfg_paras_to_wal_customize:: cfg_country_code failed");
2084 return HI_FAIL;
2085 }
2086 /* 同步FCC功率配置 */
2087 if (cfg_tx_pwr_offset() != HI_SUCCESS) {
2088 oam_error_log0(0, 0, "firmware_sync_cfg_paras_to_wal_customize:: cfg_tx_pwr_offset failed");
2089 return HI_FAIL;
2090 }
2091 /* 同步高温频偏补偿配置 */
2092 if (cfg_freq_comp_val() != HI_SUCCESS) {
2093 oam_error_log0(0, 0, "firmware_sync_cfg_paras_to_wal_customize:: cfg_dbb failed");
2094 return HI_FAIL;
2095 }
2096 /* 同步rssi补偿配置 */
2097 if (cfg_rssi_ofset() != HI_SUCCESS) {
2098 oam_error_log0(0, 0, "firmware_sync_cfg_paras_to_wal_customize:: cfg_rssi_ofset failed");
2099 return HI_FAIL;
2100 }
2101
2102 printk("firmware_sync_cfg_paras_to_wal_customize SUCCESSFULLY\r\n");
2103 return HI_SUCCESS;
2104 }
2105
2106 EXPORT_SYMBOL(plat_firmware_clear);
2107 EXPORT_SYMBOL(get_device_soft_version);
2108