1 /*
2 * Copyright (c) 2021 Bestechnic (Shanghai) Co., Ltd. All rights reserved.
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 */
15 #ifndef __HAL_TRACE_H__
16 #define __HAL_TRACE_H__
17 #define __INCLUDE_ASSERT_H
18 #ifndef __ASSEMBLY__
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22
23 #include "plat_types.h"
24 #include "hal_trace_mod.h"
25
26 #ifndef AUDIO_DEBUG
27 #if defined(CONFIG_BES_AUDIO_DUMP)
28 #define AUDIO_DEBUG
29 #else
30 // #define AUDIO_DEBUG
31 #endif
32 #endif
33
34 // #define INTERSYS_RAW_DATA_ONLY
35
36 #if defined(INTERSYS_RAW_DATA_ONLY)
37 #define NO_REL_TRACE
38 #endif
39
40 #if defined(__BT_DEBUG_TPORTS__)
41 #ifndef CRASH_REBOOT
42 #define CRASH_REBOOT
43 #endif
44 #endif
45
46 /*
47 * Total number of core registers stored
48 */
49 #define CRASH_DUMP_REGISTERS_NUM 17
50 #define CRASH_DUMP_REGISTERS_NUM_BYTES ((CRASH_DUMP_REGISTERS_NUM)*4)
51
52 /*
53 * Number bytes to store from stack
54 * - this is total, not per PSP/MSP
55 */
56 #define CRASH_DUMP_STACK_NUM_BYTES 384
57
58 // Log Attributes
59 #define TR_ATTR_ARG_NUM_SHIFT 0
60 #define TR_ATTR_ARG_NUM_MASK (0xF << TR_ATTR_ARG_NUM_SHIFT)
61 #define TR_ATTR_ARG_NUM(n) BITFIELD_VAL(TR_ATTR_ARG_NUM, n)
62 #define TR_ATTR_LEVEL_SHIFT 4
63 #define TR_ATTR_LEVEL_MASK (0x7 << TR_ATTR_LEVEL_SHIFT)
64 #define TR_ATTR_LEVEL(n) BITFIELD_VAL(TR_ATTR_LEVEL, n)
65 #define TR_ATTR_MOD_SHIFT 7
66 #define TR_ATTR_MOD_MASK (0x7F << TR_ATTR_MOD_SHIFT)
67 #define TR_ATTR_MOD(n) BITFIELD_VAL(TR_ATTR_MOD, n)
68 #define TR_ATTR_IMM (1 << 14)
69 #define TR_ATTR_NO_LF (1 << 15)
70 #define TR_ATTR_NO_TS (1 << 16)
71 #define TR_ATTR_NO_ID (1 << 17)
72
73 // Count variadic argument number
74 #define _VAR_ARG_17(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, ...) a17
75 #define COUNT_ARG_NUM(...) _VAR_ARG_17(unused, ##__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
76
77 #if defined(TRACE_STR_SECTION) && !(defined(ROM_BUILD) || defined(PROGRAMMER) || defined(FPGA))
78 #define CONCAT_(x,y) x##y
79 #define CONCATS(x,y) CONCAT_(x,y)
80 #define __trcname CONCATS(__trc, __LINE__)
81 #define TRC_STR_LOC __attribute__((section(TO_STRING(CONCATS(.trc_str,__LINE__)))))
82 #define TRC_STR(s) (({ static const char TRC_STR_LOC __trcname[] = (s); __trcname; }))
83 #else
84 #define TRC_STR_LOC
85 #define TRC_STR(s) (s)
86 #endif
87
88 #define TR_DUMMY(attr, str, ...) hal_trace_dummy(str, ##__VA_ARGS__)
89
90 #if defined(NUTTX_BUILD)
91 #undef ASSERT
92 #if !defined(CONFIG_ARCH_CHIP_DEBUG_H)
93 #include "syslog.h"
94 void _assert(FAR const char *filename, int linenum) noreturn_function;
95 #endif
96 #endif
97 #if (defined(DEBUG) || defined(REL_TRACE_ENABLE)) && !defined(NO_REL_TRACE)
98 #define REL_LOG(attr, str, ...) hal_trace_printf(((attr) & ~TR_ATTR_ARG_NUM_MASK) | \
99 TR_ATTR_ARG_NUM(COUNT_ARG_NUM(unused, ##__VA_ARGS__)), \
100 TRC_STR(str), ##__VA_ARGS__)
101 #define REL_LOG_RAW_OUTPUT(str, len) hal_raw_trace_output(str, len)
102 #define REL_LOG_FLUSH() hal_trace_flush_buffer()
103 #define REL_LOG_SEND() hal_trace_send()
104 #define REL_DUMP8(str, buf, cnt) hal_trace_dump(str, sizeof(uint8_t), cnt, buf)
105 #define REL_DUMP16(str, buf, cnt) hal_trace_dump(str, sizeof(uint16_t), cnt, buf)
106 #define REL_DUMP32(str, buf, cnt) hal_trace_dump(str, sizeof(uint32_t), cnt, buf)
107 #else
108 #define REL_LOG(attr, str, ...) hal_trace_dummy(str, ##__VA_ARGS__)
109 #define REL_LOG_RAW_OUTPUT(str, len) hal_trace_dummy((const char *)str, len)
110 #define REL_LOG_FLUSH() hal_trace_dummy(NULL)
111 #define REL_LOG_SEND() hal_trace_dummy(NULL)
112 #define REL_DUMP8(str, buf, cnt) hal_dump_dummy(str, buf, cnt)
113 #define REL_DUMP16(str, buf, cnt) hal_dump_dummy(str, buf, cnt)
114 #define REL_DUMP32(str, buf, cnt) hal_dump_dummy(str, buf, cnt)
115 #endif
116
117 #if (!defined(DEBUG) && defined(REL_TRACE_ENABLE)) && !defined(NO_TRACE)
118 // To avoid warnings on unused variables
119 #define NORM_LOG(num,str, ...) hal_trace_dummy(str, ##__VA_ARGS__)
120 #define NORM_LOG_RAW_OUTPUT(str, len) hal_trace_dummy((const char *)str, len)
121 #define NORM_LOG_FLUSH() hal_trace_dummy(NULL)
122 #define NORM_LOG_SEND() hal_trace_dummy(NULL)
123 #define DUMP8(str, buf, cnt) hal_dump_dummy(str, buf, cnt)
124 #define DUMP16(str, buf, cnt) hal_dump_dummy(str, buf, cnt)
125 #define DUMP32(str, buf, cnt) hal_dump_dummy(str, buf, cnt)
126 #else
127 #define NORM_LOG REL_LOG
128 #define NORM_LOG_RAW_OUTPUT REL_LOG_RAW_OUTPUT
129 #define NORM_LOG_FLUSH REL_TRACE_FLUSH
130 #define NORM_LOG_SEND REL_LOG_SEND
131 #define DUMP8 REL_DUMP8
132 #define DUMP16 REL_DUMP16
133 #define DUMP32 REL_DUMP32
134 #endif
135
136 #define R_TR_CRITICAL(attr, str, ...) REL_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_CRITICAL), \
137 str, ##__VA_ARGS__)
138 #define R_TR_ERROR(attr, str, ...) REL_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_ERROR), \
139 str, ##__VA_ARGS__)
140 #define R_TR_WARN(attr, str, ...) REL_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_WARN), \
141 str, ##__VA_ARGS__)
142 #define R_TR_NOTIF(attr, str, ...) REL_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_NOTIF), \
143 str, ##__VA_ARGS__)
144 #define R_TR_INFO(attr, str, ...) REL_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_INFO), \
145 str, ##__VA_ARGS__)
146 #define R_TR_DEBUG(attr, str, ...) REL_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_DEBUG), \
147 str, ##__VA_ARGS__)
148 #define R_TR_VERBOSE(attr, str, ...) REL_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_VERBOSE), \
149 str, ##__VA_ARGS__)
150
151 #define TR_CRITICAL(attr, str, ...) NORM_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_CRITICAL), \
152 str, ##__VA_ARGS__)
153 #define TR_ERROR(attr, str, ...) NORM_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_ERROR), \
154 str, ##__VA_ARGS__)
155 #define TR_WARN(attr, str, ...) NORM_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_WARN), \
156 str, ##__VA_ARGS__)
157 #define TR_NOTIF(attr, str, ...) NORM_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_NOTIF), \
158 str, ##__VA_ARGS__)
159 #define TR_INFO(attr, str, ...) NORM_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_INFO), \
160 str, ##__VA_ARGS__)
161 #define TR_DEBUG(attr, str, ...) NORM_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_DEBUG), \
162 str, ##__VA_ARGS__)
163 #define TR_VERBOSE(attr, str, ...) NORM_LOG(((attr) & ~TR_ATTR_LEVEL_MASK) | TR_ATTR_LEVEL(TR_LEVEL_VERBOSE), \
164 str, ##__VA_ARGS__)
165
166 #define REL_TRACE(attr, str, ...) R_TR_NOTIF(attr, str, ##__VA_ARGS__)
167 #define REL_TRACE_IMM(attr, str, ...) R_TR_NOTIF((attr) | TR_ATTR_IMM, str, ##__VA_ARGS__)
168 #define REL_TRACE_NOCRLF(attr, str, ...) R_TR_NOTIF((attr) | TR_ATTR_NO_LF, str, ##__VA_ARGS__)
169 #define REL_TRACE_NOTS(attr, str, ...) R_TR_NOTIF((attr) | TR_ATTR_NO_TS, str, ##__VA_ARGS__)
170 #define REL_TRACE_IMM_NOTS(attr, str, ...) R_TR_NOTIF((attr) | TR_ATTR_IMM | TR_ATTR_NO_TS, str, ##__VA_ARGS__)
171 #define REL_TRACE_NOCRLF_NOTS(attr, str, ...) R_TR_NOTIF((attr) | TR_ATTR_NO_LF | TR_ATTR_NO_TS, str, ##__VA_ARGS__)
172 #define REL_FUNC_ENTRY_TRACE() R_TR_NOTIF(1, "%s", __FUNCTION__)
173 #define REL_TRACE_OUTPUT(str, len) REL_LOG_RAW_OUTPUT(str, len)
174 #define REL_TRACE_FLUSH() REL_LOG_FLUSH()
175
176 #define TRACE(attr, str, ...) TR_INFO(attr, str, ##__VA_ARGS__)
177 #define TRACE_IMM(attr, str, ...) TR_INFO((attr) | TR_ATTR_IMM, str, ##__VA_ARGS__)
178 #define TRACE_NOCRLF(attr, str, ...) TR_INFO((attr) | TR_ATTR_NO_LF, str, ##__VA_ARGS__)
179 #define FUNC_ENTRY_TRACE() TR_INFO(1, "%s", __FUNCTION__)
180 #define TRACE_OUTPUT(str, len) NORM_LOG_RAW_OUTPUT(str, len)
181 #define TRACE_FLUSH() NORM_LOG_FLUSH()
182 #define TRACE_SEND() NORM_LOG_SEND()
183 #ifdef BES_AUTOMATE_TEST
184 #define AUTO_TEST_TRACE(attr, str, ...) TR_INFO(attr, "_AT_" str, ##__VA_ARGS__)
185 #else
186 #define AUTO_TEST_TRACE(attr, str, ...) TR_INFO(attr, str, ##__VA_ARGS__)
187 #endif
188
189 #define TRACE_DUMMY(attr, str, ...) TR_DUMMY(attr, str, ##__VA_ARGS__)
190
191 #if (defined(DEBUG) || defined(REL_TRACE_ENABLE)) && defined(ASSERT_SHOW_FILE_FUNC)
192 #define ASSERT(cond, str, ...) { if (!(cond)) { hal_trace_assert_dump(__FILE__, __FUNCTION__, __LINE__, str, ##__VA_ARGS__); } }
193 #define ASSERT_DUMP_ARGS const char *file, const char *func, unsigned int line, const char *fmt, ...
194 #define ASSERT_FMT_ARG_IDX 4
195 #elif (defined(DEBUG) || defined(REL_TRACE_ENABLE)) && defined(ASSERT_SHOW_FILE)
196 #define ASSERT(cond, str, ...) { if (!(cond)) { hal_trace_assert_dump(__FILE__, __LINE__, str, ##__VA_ARGS__); } }
197 #define ASSERT_DUMP_ARGS const char *file, const char *func, unsigned int line, const char *fmt, ...
198 #define ASSERT_FMT_ARG_IDX 4
199 #elif (defined(DEBUG) || defined(REL_TRACE_ENABLE)) && defined(ASSERT_SHOW_FUNC)
200 #define ASSERT(cond, str, ...) { if (!(cond)) { hal_trace_assert_dump(__FUNCTION__, __LINE__, str, ##__VA_ARGS__); } }
201 #define ASSERT_DUMP_ARGS const char *scope, unsigned int line, const char *fmt, ...
202 #define ASSERT_FMT_ARG_IDX 3
203 #elif (defined(DEBUG) || defined(REL_TRACE_ENABLE))
204 #define ASSERT(cond, str, ...) { if (!(cond)) { hal_trace_assert_dump(str, ##__VA_ARGS__); } }
205 #define ASSERT_DUMP_ARGS const char *fmt, ...
206 #define ASSERT_FMT_ARG_IDX 1
207 #else
208 #define ASSERT(cond, str, ...) { if (!(cond)) { hal_trace_dummy(str, ##__VA_ARGS__); hal_trace_assert_dump(NULL); } }
209 #define ASSERT_DUMP_ARGS const char *fmt
210 #define ASSERT_FMT_ARG_IDX 0
211 #endif
212
213 #if defined(NUTTX_BUILD) && !defined(CONFIG_ARCH_CHIP_DEBUG_H)
214 #undef ASSERT
215 #define ASSERT(cond, str, ...) { if (!(cond)) { _assert(str,1); } }
216 #endif
217
218 #if (defined(DEBUG) || defined(REL_TRACE_ENABLE))
219 #define TRACE_FUNC_DECLARE(d, r) d
220 #else
221 #ifndef TRACE_FUNC_SPEC
222 #define TRACE_FUNC_SPEC static inline
223 #endif
224 #define TRACE_FUNC_DECLARE(d, r) TRACE_FUNC_SPEC d { r; }
225 #endif
226
227 #if defined(__GNUC__) && !defined(NO_CHK_TRC_FMT)
228 #define TRC_FMT_CHK(sidx, vaidx) __attribute__((format(printf, (sidx), (vaidx))))
229 #else
230 #define TRC_FMT_CHK(sidx, vaidx)
231 #endif
232
233 #define ASSERT_NODUMP(cond) { if (!(cond)) { SAFE_PROGRAM_STOP(); } }
234
235 #ifdef CHIP_BEST1000
236 // Avoid CPU instruction fetch blocking the system bus on BEST1000
237 #define SAFE_PROGRAM_STOP() do { asm volatile("nop; nop; nop; nop"); } while (1)
238 #else
239 #define SAFE_PROGRAM_STOP() do { } while (1)
240 #endif
241
242 /// definitions for easier debug
243 #define _ENUM_DEF(prefix, detail) prefix ## detail
244
245 enum HAL_TRACE_TRANSPORT_T {
246 #ifdef CHIP_HAS_USB
247 HAL_TRACE_TRANSPORT_USB,
248 #endif
249 HAL_TRACE_TRANSPORT_UART0,
250 #if (CHIP_HAS_UART >= 2)
251 HAL_TRACE_TRANSPORT_UART1,
252 #endif
253 #if (CHIP_HAS_UART >= 3)
254 HAL_TRACE_TRANSPORT_UART2,
255 #endif
256 #if defined(CHIP_BEST2001) || defined(CHIP_BEST2003)
257 HAL_TRACE_TRANSPORT_TRANSQ1,
258 #if defined (CP_BOOT) ||defined (CP_BUILD)
259 HAL_TRACE_TRANSPORT_CPIPC,
260 #endif
261 #endif
262 HAL_TRACE_TRANSPORT_QTY
263 };
264
265 enum HAL_TRACE_STATE_T {
266 HAL_TRACE_STATE_CRASH_ASSERT_START,
267 HAL_TRACE_STATE_CRASH_FAULT_START,
268 HAL_TRACE_STATE_CRASH_END,
269 };
270
271 enum HAL_TRACE_BUF_STATE_T {
272 HAL_TRACE_BUF_STATE_FLUSH,
273 HAL_TRACE_BUF_STATE_NEAR_FULL,
274 HAL_TRACE_BUF_STATE_FULL,
275 };
276
277 enum HAL_TRACE_CRASH_DUMP_MODULE_T {
278 HAL_TRACE_CRASH_DUMP_MODULE_SYS = 0,
279 HAL_TRACE_CRASH_DUMP_MODULE_ID1 = 1,
280 HAL_TRACE_CRASH_DUMP_MODULE_ID2 = 2,
281 HAL_TRACE_CRASH_DUMP_MODULE_BTH = 3,
282 HAL_TRACE_CRASH_DUMP_MODULE_BT = 4,
283 HAL_TRACE_CRASH_DUMP_MODULE_END = 5,
284 };
285
286 enum HAL_TRACE_APP_REG_ID_T {
287 HAL_TRACE_APP_REG_ID_0,
288 HAL_TRACE_APP_REG_ID_1,
289
290 HAL_TRACE_APP_REG_ID_QTY,
291 };
292
293 enum TR_LEVEL_T {
294 TR_LEVEL_CRITICAL = 0,
295 TR_LEVEL_ERROR = 1,
296 TR_LEVEL_WARN = 2,
297 TR_LEVEL_NOTIF = 3,
298 TR_LEVEL_INFO = 4,
299 TR_LEVEL_DEBUG = 5,
300 TR_LEVEL_VERBOSE = 6,
301
302 TR_LEVEL_QTY,
303 };
304
305 typedef void (*HAL_TRACE_CRASH_DUMP_CB_T)(void);
306
307 typedef void (*HAL_TRACE_APP_NOTIFY_T)(enum HAL_TRACE_STATE_T state);
308
309 typedef void (*HAL_TRACE_APP_OUTPUT_T)(const unsigned char *buf, unsigned int buf_len);
310
311 typedef void (*HAL_TRACE_BUF_CTRL_T)(enum HAL_TRACE_BUF_STATE_T buf_ctrl);
312
313 typedef int (*HAL_TRACE_GLOBAL_TAG_CB_T)(char *buf, unsigned int buf_len);
314
315 typedef void (*HAL_TRACE_SAVE_PLAYBACK_DEVICE_T)(void);
316
317 int hal_trace_open(enum HAL_TRACE_TRANSPORT_T transport);
318
319 //int hal_trace_set_log_level(enum TR_LEVEL_T level);
320
321 TRACE_FUNC_DECLARE(int hal_trace_switch(enum HAL_TRACE_TRANSPORT_T transport), return 0);
322
323 TRACE_FUNC_DECLARE(int hal_trace_close(void), return 0);
324
325 TRACE_FUNC_DECLARE(enum HAL_TRACE_TRANSPORT_T hal_trace_get_transport(void), return HAL_TRACE_TRANSPORT_QTY);
326
327 TRACE_FUNC_DECLARE(int hal_trace_enable_log_module(enum TR_MODULE_T module), return 0);
328
329 TRACE_FUNC_DECLARE(int hal_trace_disable_log_module(enum TR_MODULE_T module), return 0);
330
331 TRACE_FUNC_DECLARE(int hal_trace_set_log_module(const uint32_t *map, uint32_t word_cnt), return 0);
332
333 TRACE_FUNC_DECLARE(int hal_trace_set_log_level(enum TR_LEVEL_T level), return 0);
334
335 TRACE_FUNC_DECLARE(void hal_trace_get_history_buffer(const uint8_t **buf1, uint32_t *len1, const uint8_t **buf2, uint32_t *len2), \
336 { if (buf1) { *buf1 = NULL; } if (len1) { *len1 = 0; } if (buf2) { *buf2 = NULL; } if (len2) { *len2 = 0; } });
337
338 TRACE_FUNC_DECLARE(int hal_raw_trace_output(const unsigned char *buf, unsigned int buf_len), return 0);
339
340 TRACE_FUNC_DECLARE(int hal_trace_output(const unsigned char *buf, unsigned int buf_len), return 0);
341
342 TRC_FMT_CHK(2, 3)
343 TRACE_FUNC_DECLARE(int hal_trace_printf(uint32_t attr, const char *fmt, ...), return 0);
344
345 TRACE_FUNC_DECLARE(int hal_trace_dump(const char *fmt, unsigned int size, unsigned int count, const void *buffer), return 0);
346
347 TRACE_FUNC_DECLARE(int hal_trace_busy(void), return 0);
348
349 TRACE_FUNC_DECLARE(int hal_trace_pause(void), return 0);
350
351 TRACE_FUNC_DECLARE(int hal_trace_continue(void), return 0);
352
353 TRACE_FUNC_DECLARE(int hal_trace_flush_buffer(void), return 0);
354
355 TRACE_FUNC_DECLARE(int hal_trace_flush_output(void), return 0);
356
357 TRACE_FUNC_DECLARE(void hal_trace_send(void), return);
358
359 TRACE_FUNC_DECLARE(int hal_trace_crash_dump_register(enum HAL_TRACE_CRASH_DUMP_MODULE_T module, HAL_TRACE_CRASH_DUMP_CB_T cb), return 0);
360
361 TRACE_FUNC_DECLARE(void hal_trace_crash_dump_callback(void), return);
362
363 TRACE_FUNC_DECLARE(int hal_trace_app_register(enum HAL_TRACE_APP_REG_ID_T id, HAL_TRACE_APP_NOTIFY_T notify_cb, HAL_TRACE_APP_OUTPUT_T output_cb), return 0);
364
365 TRACE_FUNC_DECLARE(void hal_trace_app_notify_callback(enum HAL_TRACE_STATE_T state), return);
366
367 TRACE_FUNC_DECLARE(void hal_trace_app_custom_register(HAL_TRACE_APP_NOTIFY_T notify_cb, HAL_TRACE_APP_OUTPUT_T output_cb, HAL_TRACE_APP_OUTPUT_T crash_custom_cb), return);
368
369 TRACE_FUNC_DECLARE(void hal_trace_global_tag_register(HAL_TRACE_GLOBAL_TAG_CB_T tag_cb), return);
370
371 TRACE_FUNC_DECLARE(int hal_trace_open_cp(HAL_TRACE_BUF_CTRL_T buf_cb, HAL_TRACE_APP_NOTIFY_T notify_cb), return 0);
372
373 TRACE_FUNC_DECLARE(int hal_trace_close_cp(void), return 0);
374
375 TRACE_FUNC_DECLARE(void hal_trace_print_backtrace(uint32_t addr, uint32_t search_cnt, uint32_t print_cnt), return);
376
377 TRACE_FUNC_DECLARE(bool hal_trace_in_crash_dump(void), return false);
378
379 TRACE_FUNC_DECLARE (uint32_t hal_trace_get_id(void), return 0);
380
381 TRACE_FUNC_DECLARE(uint32_t hal_trace_get_baudrate(void), return 0);
382
383 TRC_FMT_CHK(1, 2)
hal_trace_dummy(const char * fmt,...)384 static inline void hal_trace_dummy(const char *fmt, ...) { }
385
hal_dump_dummy(const char * fmt,...)386 static inline void hal_dump_dummy(const char *fmt, ...) { }
387
388 #if (ASSERT_FMT_ARG_IDX > 0)
389 TRC_FMT_CHK(ASSERT_FMT_ARG_IDX, ASSERT_FMT_ARG_IDX + 1)
390 #endif
391 void NORETURN hal_trace_assert_dump(ASSERT_DUMP_ARGS);
392
393 int hal_trace_address_writable(uint32_t addr);
394
395 int hal_trace_address_executable(uint32_t addr);
396
397 int hal_trace_address_readable(uint32_t addr);
398
399
400 //==============================================================================
401 // AUDIO_DEBUG
402 //==============================================================================
403
404 #ifdef AUDIO_DEBUG
405 #define AUDIO_DEBUG_TRACE(str, ...) hal_trace_printf(str, ##__VA_ARGS__)
406 #define AUDIO_DEBUG_DUMP(buf, cnt) hal_trace_output(buf, cnt)
407 #endif
408
409
410 //==============================================================================
411 // INTERSYS_RAW_DATA_ONLY
412 //==============================================================================
413
414 #ifdef INTERSYS_RAW_DATA_ONLY
415 #define TRACE_RAW(str, ...) hal_trace_printf(str, ##__VA_ARGS__)
416 #define DUMP8_RAW(str, buf, cnt) hal_trace_dump(str, sizeof(uint8_t), cnt, buf)
417 #endif
418
419 //==============================================================================
420 // TRACE RX
421 //==============================================================================
422
423 typedef unsigned int (*HAL_TRACE_RX_CALLBACK_T)(unsigned char *buf, unsigned int len);
424
425 TRACE_FUNC_DECLARE(int hal_trace_rx_open(unsigned char *buf, unsigned int len, HAL_TRACE_RX_CALLBACK_T rx_callback), return 0);
426
427 TRACE_FUNC_DECLARE(int hal_trace_rx_close(void), return 0);
428
429 TRACE_FUNC_DECLARE(int hal_trace_rx_sleep(void), return 0);
430
431 TRACE_FUNC_DECLARE(int hal_trace_rx_wakeup(void), return 0);
432
433 #ifdef assert
434 #undef assert
435 #endif
436 #ifdef NDEBUG
437 # define assert(f)
438 #else
439 # define assert(f) ASSERT(f,"%s:%d",__func__,__LINE__)
440 #endif
441
442 #include "stdarg.h"
443 typedef int (*HAL_TRACE_OUTPUT_HOOK_T)(const char *tag, const char *fmt, uint32_t len);
444 void hal_trace_register_hook(HAL_TRACE_OUTPUT_HOOK_T hook);
445 void hal_trace_unregister_hook(HAL_TRACE_OUTPUT_HOOK_T hook);
446 typedef int (*HAL_TRACE_PRINTF_HOOK_T)(const char *tag, const char *fmt, va_list ap);
447 void hal_trace_printf_register_hook(HAL_TRACE_PRINTF_HOOK_T hook);
448 void hal_trace_printf_unregister_hook(HAL_TRACE_PRINTF_HOOK_T hook);
449 int hal_trace_output_block(const unsigned char *buf, unsigned int len);
450 void hal_trace_print_a7(const unsigned char *buf, unsigned int buf_len);
451 void hal_trace_print_a7_flush(int onoff);
452 extern int hal_trace_printf_without_crlf_ts(const char *fmt, ...);
453 #define printf hal_trace_printf_without_crlf_ts
454 int hal_trace_set_onoff(uint32_t onoff);
455 void hal_trace_register_cp_hook(HAL_TRACE_OUTPUT_HOOK_T hook);
456 void hal_trace_unregister_cp_hook(HAL_TRACE_OUTPUT_HOOK_T hook);
457 #ifdef __cplusplus
458 }
459 #endif
460 #endif
461 #endif
462