1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: LOG PRINTF MODULE
15 * Author:
16 * Create:
17 */
18
19 #include "log_printf.h"
20 #include "log_common.h"
21 #if defined(SUPPORT_CONNECTIVITY) && defined(SUPPORT_IPC)
22 #include "connectivity_log.h"
23 #endif
24
25 #include "log_buffer.h"
26 #include "systick.h"
27 #ifdef SUPPORT_IPC
28 #include "ipc.h"
29 #endif
30
31 #define CHR_SECOND_PER_DAY 86400
32 #define CHR_MS_PER_SECOND 1000
33
34 #define LOG_MAX_ARGS_COUNT 7
35 #define LOG_MAX_ARGS_EXTEND_COUNT 7
36 #define LOG_SYNC_TIME_TIMEOUT_MS 5
37
38 #define LOG_CONTENT_INDEX2 2
39 #define LOG_OFFSET_18 18
40 #define LOG_OFFSET_4 4
41
42 static uint64_t g_log_basetime_ms = 0;
43 static uint32_t g_chr_basegmt_s = 0;
44
get_log_basetime_ms(void)45 uint64_t get_log_basetime_ms(void)
46 {
47 return g_log_basetime_ms;
48 }
49
get_chr_basegmt_s(void)50 uint32_t get_chr_basegmt_s(void)
51 {
52 return g_chr_basegmt_s;
53 }
54
set_chr_basegmt_s(uint32_t t)55 void set_chr_basegmt_s(uint32_t t)
56 {
57 g_chr_basegmt_s = t;
58 return;
59 }
60
61 #if CORE == APPS
62 #ifdef SUPPORT_IPC
set_log_time(uint32_t rtc_time_s)63 void set_log_time(uint32_t rtc_time_s)
64 {
65 uint64_t temp = rtc_time_s;
66 g_log_basetime_ms = ((temp % CHR_SECOND_PER_DAY) * CHR_MS_PER_SECOND) - uapi_systick_get_ms();
67 g_chr_basegmt_s = (uint32_t)(rtc_time_s - uapi_systick_get_s());
68
69 log_set_sharemem_timestamp(g_log_basetime_ms);
70 ipc_status_t ret = ipc_spin_send_message_timeout(CORES_BT_CORE,
71 IPC_ACTION_SET_LOG_TIME,
72 (ipc_payload *)(uintptr_t)&rtc_time_s,
73 sizeof(uint32_t),
74 IPC_PRIORITY_LOWEST,
75 false,
76 LOG_SYNC_TIME_TIMEOUT_MS);
77 if (ret != IPC_STATUS_OK) {
78 UNUSED(ret);
79 }
80 }
81 #endif
82 #else
83 #ifdef IPC_NEW
84 #elif (defined CONFIG_DFX_SUPPORT_CUSTOM_LOG) && (CONFIG_DFX_SUPPORT_CUSTOM_LOG == DFX_YES)
85 #else
set_log_time_action_handler(ipc_action_t message,const volatile ipc_payload * payload_p,cores_t src,uint32_t id)86 bool set_log_time_action_handler(ipc_action_t message, const volatile ipc_payload *payload_p, cores_t src, uint32_t id)
87 {
88 UNUSED(message);
89 UNUSED(id);
90 UNUSED(src);
91
92 uint64_t temp;
93
94 temp = *(uint32_t *)payload_p;
95 g_log_basetime_ms = (uint64_t)(((temp % CHR_SECOND_PER_DAY) * CHR_MS_PER_SECOND) - uapi_systick_get_ms());
96 g_chr_basegmt_s = (uint32_t)(temp - uapi_systick_get_s());
97 return true;
98 }
99 #endif
100 #endif
101
102 #if (USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG == YES)
103
104 #define LOG_HEADER_LEN_IN_UINT32_T (sizeof(compress_log_header_t) / sizeof(uint32_t))
105 #define TEN_MS_AS_BASE 10
106 #define COMPRESS_LOG_MAGIC_HEADER (0xA8 >> 3)
107 #define LOG_LIMIT_TIMEOUT_MS 5000
108 #define COMPRESS_LOG_COUNT_MARK 0
109
110 enum COMPRESS_LOG_CORE {
111 COMPRESS_LOG_CORE_EXTEND,
112 COMPRESS_LOG_CORE_BT,
113 COMPRESS_LOG_CORE_HIFI,
114 COMPRESS_LOG_CORE_BT_STATUS,
115 };
116
117 enum COMPRESS_LOG_EXTEND_CORE {
118 COMPRESS_LOG_EXTEND_CORE_APP,
119 COMPRESS_LOG_EXTEND_CORE_GNSS,
120 };
121
122 typedef struct {
123 uint32_t level : 3; // log level in enLogLevel
124 uint32_t magic : 5; // 0xA8 >> 3
125 uint32_t core : 2; // 0: EXTEND CORE, 1: BT, 2:HIFI, 3:BT STATUS
126 uint32_t count : 3; // count of variable params
127 uint32_t addr : 19; // address in .logstr
128 uint32_t psn : 8; // log sequence number
129 uint32_t timestamp : 24; // system time
130 uint32_t code : 24; // domain|module|sub module|log number
131 uint32_t ext_core : 2; // 0:APP, 1:GNSS, using with core
132 uint32_t ext_count : 3; // extended count of variable params
133 uint32_t reserved : 3;
134 } compress_log_header_t;
135
136 typedef struct {
137 uint16_t domain;
138 uint16_t module;
139 bool op;
140 } log_switch_cmd_t;
141
142 static uint8_t g_psn = 0;
143 static uint64_t g_log_marktime_ms = 0;
144 static uint32_t g_log_count_limit = 0;
145
146 static uint16_t g_log_switch_control[LOG_DOMAIN_MAX];
147
log_switch_is_open(uint16_t domain,uint16_t module)148 bool log_switch_is_open(uint16_t domain, uint16_t module)
149 {
150 if ((domain >= LOG_DOMAIN_MAX) || (module >= LIB_LOG_MODULE_MAX)) {
151 return true; /* default true, even if input is invalid */
152 }
153
154 if (g_log_switch_control[domain] & (1U << module)) {
155 return true;
156 }
157 return false;
158 }
159
set_log_switch(uint16_t domain,uint16_t module,bool op)160 int16_t set_log_switch(uint16_t domain, uint16_t module, bool op)
161 {
162 if ((domain > LOG_DOMAIN_MAX) || (module > LIB_LOG_MODULE_MAX)) {
163 return ERR;
164 }
165
166 if (domain == LOG_DOMAIN_MAX) {
167 reset_log_switch(op);
168 return SUCC;
169 }
170
171 if (module == LIB_LOG_MODULE_MAX) {
172 g_log_switch_control[domain] = op ? 0xFFFF : 0;
173 return SUCC;
174 }
175
176 if (op) { /* op == true means on, otherwise off */
177 g_log_switch_control[domain] |= (uint16_t)(1U << module);
178 } else {
179 g_log_switch_control[domain] &= (uint16_t)(~(1U << module));
180 }
181
182 return SUCC;
183 }
184
185 #if CORE == APPS
remote_config_log_switch(cores_t dst,uint16_t domain,uint16_t module,bool op)186 uint16_t remote_config_log_switch(cores_t dst, uint16_t domain, uint16_t module, bool op)
187 {
188 log_switch_cmd_t cmd = {domain, module, op};
189
190 return ipc_spin_send_message_timeout(dst,
191 IPC_ACTION_SET_LOG_SWITCH,
192 (ipc_payload *)&cmd,
193 sizeof(log_switch_cmd_t),
194 IPC_PRIORITY_LOWEST,
195 false,
196 LOG_SYNC_TIME_TIMEOUT_MS);
197 }
198 #else
set_log_switch_action_handler(ipc_action_t message,const volatile ipc_payload * payload_p,cores_t src,uint32_t id)199 bool set_log_switch_action_handler(ipc_action_t message, const volatile ipc_payload *payload_p,
200 cores_t src, uint32_t id)
201 {
202 UNUSED(message);
203 UNUSED(id);
204 UNUSED(src);
205
206 log_switch_cmd_t *cmd = (log_switch_cmd_t *)payload_p;
207 if (set_log_switch(cmd->domain, cmd->module, cmd->op) != SUCC) {
208 return false;
209 }
210
211 return true;
212 }
213 #endif
214
reset_log_switch(bool op)215 void reset_log_switch(bool op)
216 {
217 uint16_t i;
218 uint16_t reset_val = op ? 0xFFFF : 0;
219
220 for (i = 0; i < LOG_DOMAIN_MAX; i++) {
221 g_log_switch_control[i] = reset_val;
222 }
223 }
224
check_log_switch(log_level_e log_lvl,uint32_t log_header)225 static bool check_log_switch(log_level_e log_lvl, uint32_t log_header)
226 {
227 if (log_lvl < LOG_LEVEL_INFO) {
228 return true; /* only filter log level INFO and DEBUG */
229 }
230 uint16_t domain = (uint16_t)get_log_domain(log_header);
231 uint16_t module = (uint16_t)get_log_module(log_header);
232
233 return log_switch_is_open(domain, module);
234 }
235
check_compress_log_printf_threshold(void)236 bool check_compress_log_printf_threshold(void)
237 {
238 uint64_t log_time;
239 static uint32_t log_count = 0;
240 log_count++;
241 if (log_count > g_log_count_limit) {
242 log_time = uapi_systick_get_ms();
243 if ((log_time - g_log_marktime_ms) > LOG_LIMIT_TIMEOUT_MS) {
244 g_log_marktime_ms = log_time;
245 log_count = COMPRESS_LOG_COUNT_MARK;
246 return true;
247 } else {
248 return false;
249 }
250 }
251 return true;
252 }
253
compress_log_init(void)254 void compress_log_init(void)
255 {
256 g_log_count_limit = COMPRESS_LOG_COUNT_THRESHOLD;
257 reset_log_switch(true);
258 }
259
set_compress_log_count_threshold(uint32_t threshold)260 void set_compress_log_count_threshold(uint32_t threshold)
261 {
262 g_log_count_limit = threshold;
263 }
264
compress_printf_store_in_flash(uint32_t log_addr,uint32_t log_header,va_list args)265 static void compress_printf_store_in_flash(uint32_t log_addr, uint32_t log_header, va_list args)
266 {
267 log_level_e log_lvl = (log_level_e)get_log_lvl(log_header);
268 if (log_lvl > log_get_local_log_level()) { return; }
269 if (check_log_switch(log_lvl, log_header) == false) { return; }
270 if (check_compress_log_printf_threshold() == false) { return; }
271
272 uint32_t args_count = get_log_args_cnt(log_header);
273 if (args_count > LOG_MAX_ARGS_COUNT + LOG_MAX_ARGS_EXTEND_COUNT) {
274 args_count = LOG_MAX_ARGS_COUNT + LOG_MAX_ARGS_EXTEND_COUNT;
275 }
276
277 uint32_t log_code = get_log_code(log_header);
278 uint32_t log_content_len = sizeof(compress_log_header_t) + args_count * sizeof(uint32_t);
279 uint32_t log_content[LOG_HEADER_LEN_IN_UINT32_T + LOG_MAX_ARGS_COUNT + LOG_MAX_ARGS_EXTEND_COUNT];
280
281 ((compress_log_header_t *)log_content)->level = (uint32_t)log_lvl;
282 ((compress_log_header_t *)log_content)->magic = COMPRESS_LOG_MAGIC_HEADER;
283 #if CORE == BT
284 if (log_code == BTC_MAGIC_LOG_CODE) {
285 ((compress_log_header_t *)log_content)->core = COMPRESS_LOG_CORE_BT_STATUS;
286 } else {
287 ((compress_log_header_t *)log_content)->core = COMPRESS_LOG_CORE_BT;
288 }
289 #elif CORE == APPS
290 ((compress_log_header_t *)log_content)->core = COMPRESS_LOG_CORE_EXTEND;
291 ((compress_log_header_t *)log_content)->ext_core = COMPRESS_LOG_EXTEND_CORE_APP;
292 #elif CORE == GNSS
293 ((compress_log_header_t *)log_content)->core = COMPRESS_LOG_CORE_EXTEND;
294 ((compress_log_header_t *)log_content)->ext_core = COMPRESS_LOG_EXTEND_CORE_GNSS;
295 #else
296 ((compress_log_header_t *)log_content)->core = COMPRESS_LOG_CORE_HIFI;
297 #endif
298 if (args_count > LOG_MAX_ARGS_COUNT) {
299 ((compress_log_header_t *)log_content)->count = LOG_MAX_ARGS_COUNT;
300 ((compress_log_header_t *)log_content)->ext_count = args_count - LOG_MAX_ARGS_COUNT;
301 } else {
302 ((compress_log_header_t *)log_content)->count = args_count;
303 ((compress_log_header_t *)log_content)->ext_count = 0;
304 }
305 ((compress_log_header_t *)log_content)->addr = log_addr;
306 ((compress_log_header_t *)log_content)->code = log_code;
307 ((compress_log_header_t *)log_content)->timestamp = (uapi_systick_get_ms() + g_log_basetime_ms) / TEN_MS_AS_BASE;
308 ((compress_log_header_t *)log_content)->psn = g_psn;
309 g_psn++;
310
311 if (args_count > 0) {
312 for (uint32_t temp_index = 0; temp_index < args_count; temp_index++) {
313 log_content[LOG_HEADER_LEN_IN_UINT32_T + temp_index] = va_arg(args, uint32_t);
314 }
315 }
316
317 compress_log_write((const uint8_t *)log_content, log_content_len);
318 }
319
compress_printf(uint32_t log_addr,uint32_t log_header,...)320 void compress_printf(uint32_t log_addr, uint32_t log_header, ...)
321 {
322 va_list args;
323 va_start(args, log_header);
324 compress_printf_store_in_flash(log_addr, log_header, args);
325 va_end(args);
326 }
327
328 /*
329 * + 16 Bits + 10 Bits + 4 Bits + 4 Bits +
330 * +--------------+--------------+------------------+----------+-------------+--------------+
331 * | log_module | log_id | | |
332 * |--------------+--------------+------------------+----------| log_lvl | args_count |
333 * | LOG_BCORE_BTC | 0 | | |
334 * +-----------------------------------------------------------+-------------+--------------+
335 */
compress_printf_btc_info0(uint32_t log_addr,...)336 void compress_printf_btc_info0(uint32_t log_addr, ...)
337 {
338 va_list args;
339 va_start(args, log_addr);
340 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
341 (uint32_t)(LOG_LEVEL_INFO << LOG_OFFSET_4) | (uint32_t)(NO_ARG)), args);
342 va_end(args);
343 }
344
compress_printf_btc_info1(uint32_t log_addr,...)345 void compress_printf_btc_info1(uint32_t log_addr, ...)
346 {
347 va_list args;
348 va_start(args, log_addr);
349 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
350 (uint32_t)(LOG_LEVEL_INFO << LOG_OFFSET_4) | (uint32_t)(ONE_ARG)), args);
351 va_end(args);
352 }
353
compress_printf_btc_info2(uint32_t log_addr,...)354 void compress_printf_btc_info2(uint32_t log_addr, ...)
355 {
356 va_list args;
357 va_start(args, log_addr);
358 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
359 (uint32_t)(LOG_LEVEL_INFO << LOG_OFFSET_4) | (uint32_t)(TWO_ARG)), args);
360 va_end(args);
361 }
362
compress_printf_btc_info3(uint32_t log_addr,...)363 void compress_printf_btc_info3(uint32_t log_addr, ...)
364 {
365 va_list args;
366 va_start(args, log_addr);
367 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
368 (uint32_t)(LOG_LEVEL_INFO << LOG_OFFSET_4) | (uint32_t)(THREE_ARG)), args);
369 va_end(args);
370 }
371
compress_printf_btc_info4(uint32_t log_addr,...)372 void compress_printf_btc_info4(uint32_t log_addr, ...)
373 {
374 va_list args;
375 va_start(args, log_addr);
376 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
377 (uint32_t)(LOG_LEVEL_INFO << LOG_OFFSET_4) | (uint32_t)(FOUR_ARG)), args);
378 va_end(args);
379 }
380
compress_printf_btc_warn0(uint32_t log_addr,...)381 void compress_printf_btc_warn0(uint32_t log_addr, ...)
382 {
383 va_list args;
384 va_start(args, log_addr);
385 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
386 (uint32_t)(LOG_LEVEL_WARNING << LOG_OFFSET_4) | (uint32_t)(NO_ARG)), args);
387 va_end(args);
388 }
389
compress_printf_btc_warn1(uint32_t log_addr,...)390 void compress_printf_btc_warn1(uint32_t log_addr, ...)
391 {
392 va_list args;
393 va_start(args, log_addr);
394 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
395 (uint32_t)(LOG_LEVEL_WARNING << LOG_OFFSET_4) | (uint32_t)(ONE_ARG)), args);
396 va_end(args);
397 }
398
compress_printf_btc_warn2(uint32_t log_addr,...)399 void compress_printf_btc_warn2(uint32_t log_addr, ...)
400 {
401 va_list args;
402 va_start(args, log_addr);
403 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
404 (uint32_t)(LOG_LEVEL_WARNING << LOG_OFFSET_4) | (uint32_t)(TWO_ARG)), args);
405 va_end(args);
406 }
407
compress_printf_btc_warn3(uint32_t log_addr,...)408 void compress_printf_btc_warn3(uint32_t log_addr, ...)
409 {
410 va_list args;
411 va_start(args, log_addr);
412 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
413 (uint32_t)(LOG_LEVEL_WARNING << LOG_OFFSET_4) | (uint32_t)(THREE_ARG)), args);
414 va_end(args);
415 }
416
compress_printf_btc_warn4(uint32_t log_addr,...)417 void compress_printf_btc_warn4(uint32_t log_addr, ...)
418 {
419 va_list args;
420 va_start(args, log_addr);
421 compress_printf_store_in_flash(log_addr, ((uint32_t)(LOG_BCORE_BTC << LOG_OFFSET_18) |
422 (uint32_t)(LOG_LEVEL_WARNING << LOG_OFFSET_4) | (uint32_t)(FOUR_ARG)), args);
423 va_end(args);
424 }
425
426 #else /* USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG == NO */
427 #include "log_def.h"
428 #include "log_oam_logger.h"
429
430 #ifndef CONFIG_LOG_USE_DIAG_FRAME
compress_printf_output_by_uart(uint32_t log_header,va_list args)431 static void compress_printf_output_by_uart(uint32_t log_header, va_list args)
432 {
433 log_level_e log_lvl = (log_level_e)(get_log_lvl(log_header));
434 if (log_lvl > log_get_local_log_level()) {
435 return;
436 }
437
438 uint32_t log_content[OML_LOG_HEADER_ARRAY_LENTH + LOG_MAX_ARGS_COUNT + OML_LOG_TAIL_LENTH];
439 uint32_t log_mod;
440 uint32_t uc_loop = 0;
441 uint32_t file_id = get_file_id(log_header);
442 uint32_t args_count = get_log_args_cnt(log_header);
443 if (args_count > LOG_MAX_ARGS_COUNT) {
444 args_count = LOG_MAX_ARGS_COUNT;
445 }
446 #if CORE == BT || CHIP_BS2X
447 log_content[0] = log_head_press(OM_BT);
448 log_mod = LOG_BTMODULE;
449 #elif CORE == APPS
450 log_content[0] = log_head_press(OM_IR);
451 log_mod = LOG_PFMODULE;
452 #else
453 log_mod = LOG_PFMODULE;
454 #endif
455 log_content[1] = (uint32_t)log_lenth_and_sn_press(args_count, (uint32_t)get_log_sn_number());
456 log_content[LOG_CONTENT_INDEX2] = para_press(log_mod, (uint32_t)log_lvl,
457 file_id, get_log_line(log_header));
458
459 if (args_count > 0) {
460 for (uc_loop = 0; uc_loop < args_count; uc_loop++) {
461 log_content[OML_LOG_HEADER_ARRAY_LENTH + uc_loop] = (uint32_t)va_arg(args, uint32_t);
462 }
463 }
464
465 log_content[OML_LOG_HEADER_ARRAY_LENTH + uc_loop] = OM_FRAME_DELIMITER;
466 log_event((uint8_t *)log_content, (uint16_t)oal_log_lenth(args_count));
467 }
468 #else
469 #include "diag_rom_api.h"
470
compress_printf_output_by_uart(uint32_t log_header,va_list args)471 static void compress_printf_output_by_uart(uint32_t log_header, va_list args)
472 {
473 uint8_t log_lvl = get_log_lvl(log_header);
474 if (log_lvl > log_get_local_log_level()) {
475 return;
476 }
477
478 uint32_t log_data[OML_LOG_ALTER_PARA_MAX_NUM];
479 uint8_t log_mod_id;
480 uint32_t log_mod;
481 uint32_t uc_loop = 0;
482 uint32_t args_count = get_log_args_cnt(log_header);
483 if (args_count > LOG_MAX_ARGS_COUNT) {
484 args_count = LOG_MAX_ARGS_COUNT;
485 }
486 #if CORE == BT
487 log_mod_id = OM_BT;
488 log_mod = LOG_BTMODULE;
489 #elif CORE == APPS
490 log_mod_id = OM_IR;
491 log_mod = LOG_PFMODULE;
492 #else
493 log_mod = LOG_PFMODULE;
494 #endif
495 log_lvl = sdt_to_diag_log_level(log_lvl);
496 uint32_t msg_id = para_press(log_mod, log_lvl, get_file_id(log_header), get_log_line(log_header));
497
498 if (args_count > 0) {
499 for (uc_loop = 0; uc_loop < args_count; uc_loop++) {
500 log_data[uc_loop] = (uint32_t)va_arg(args, uint32_t);
501 }
502 }
503
504 uapi_diag_report_sys_msg(log_mod_id, msg_id, (uint8_t *)log_data, sizeof(uint32_t) * args_count, log_lvl);
505 }
506 #endif
507
compress_printf(uint32_t log_header,...)508 void compress_printf(uint32_t log_header, ...)
509 {
510 va_list args;
511 va_start(args, log_header);
512 compress_printf_output_by_uart(log_header, args);
513 va_end(args);
514 }
515
compress_printf_nolog(uint32_t log_header,...)516 void compress_printf_nolog(uint32_t log_header, ...)
517 {
518 unused(log_header);
519 return;
520 }
521
522 #endif /* USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG */
523
524
compress_printf_rom_callback(uint32_t log_addr,uint32_t log_header_user,uint32_t log_header_eng,va_list args)525 void compress_printf_rom_callback(uint32_t log_addr, uint32_t log_header_user, uint32_t log_header_eng, va_list args)
526 {
527 (void)log_addr;
528 (void)log_header_user;
529 (void)log_header_eng;
530 #if (USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG == YES)
531 compress_printf_store_in_flash(log_addr, log_header_user, args);
532 #else
533 compress_printf_output_by_uart(log_header_eng, args);
534 #endif
535 }
536
537 #if CHIP_LIBRA || CHIP_SOCMN1 || CHIP_BS25 || CHIP_BRANDY
compress_log_no_print_rom_callback(uint32_t log_addr,uint32_t log_header_user,uint32_t log_header_eng,va_list args)538 void compress_log_no_print_rom_callback(uint32_t log_addr, uint32_t log_header_user,
539 uint32_t log_header_eng, va_list args)
540 {
541 (void)log_addr;
542 (void)log_header_user;
543 (void)log_header_eng;
544 (void)args;
545 #if (USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG == NO)
546 compress_printf_output_by_uart(log_header_eng, args);
547 #endif
548 }
549 #endif
550