1 /*******************************************************************************
2 * \file cybt_platform_trace.h
3 *
4 * \brief
5 * Define API to have logging functionality.
6 *
7 ********************************************************************************
8 * \copyright
9 * Copyright 2018-2019 Cypress Semiconductor Corporation
10 * SPDX-License-Identifier: Apache-2.0
11 *
12 * Licensed under the Apache License, Version 2.0 (the "License");
13 * you may not use this file except in compliance with the License.
14 * You may obtain a copy of the License at
15 *
16 *     http://www.apache.org/licenses/LICENSE-2.0
17 *
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
23 *******************************************************************************/
24 
25 #ifndef CYBT_PLATFORM_TRACE_H
26 #define CYBT_PLATFORM_TRACE_H
27 
28 #include <stdio.h>
29 #include <stdint.h>
30 #include "wiced_data_types.h"
31 #include "cybt_platform_config.h"
32 
33 /**
34  *  @addtogroup    platform_trace   Bluetooth Platform Trace
35  *
36  * ENABLE the below definition CYBT_PLATFORM_TRACE_ENABLE to have logging
37  * functionality by using trace marcos in this file.
38  *
39  *  @{
40  */
41 #if !defined(CYBT_PLATFORM_TRACE_ENABLE)
42 #define CYBT_PLATFORM_TRACE_ENABLE 1
43 #endif
44 
45 /*****************************************************************************
46  *                                Constants
47  ****************************************************************************/
48 #define INITIAL_TRACE_LEVEL_MAIN          (CYBT_TRACE_LEVEL_ERROR)
49 #define INITIAL_TRACE_LEVEL_SPIF          (CYBT_TRACE_LEVEL_ERROR)
50 #define INITIAL_TRACE_LEVEL_HCITX_TASK    (CYBT_TRACE_LEVEL_ERROR)
51 #define INITIAL_TRACE_LEVEL_HCIRX_TASK    (CYBT_TRACE_LEVEL_ERROR)
52 #define INITIAL_TRACE_LEVEL_HCI_DRV       (CYBT_TRACE_LEVEL_ERROR)
53 #define INITIAL_TRACE_LEVEL_HCI_LOG       (CYBT_TRACE_LEVEL_ERROR)
54 #define INITIAL_TRACE_LEVEL_MEMORY        (CYBT_TRACE_LEVEL_ERROR)
55 #define INITIAL_TRACE_LEVEL_PRM           (CYBT_TRACE_LEVEL_ERROR)
56 #ifdef ENABLE_DEBUG_UART
57 #define INITIAL_TRACE_LEVEL_STACK         (CYBT_TRACE_LEVEL_MAX)
58 #else
59 #define INITIAL_TRACE_LEVEL_STACK         (CYBT_TRACE_LEVEL_ERROR)
60 #endif
61 #define INITIAL_TRACE_LEVEL_APP           (CYBT_TRACE_LEVEL_ERROR)
62 #define INITIAL_TRACE_LEVEL_BT_TASK       (CYBT_TRACE_LEVEL_ERROR)
63 
64 /*****************************************************************************
65  *                             Type Definitions
66  ****************************************************************************/
67 /**
68  * trace category id
69  */
70 #define CYBT_TRACE_ID_MAIN         (0)
71 #define CYBT_TRACE_ID_SPIF         (1)
72 #define CYBT_TRACE_ID_HCITX_TASK   (2)
73 #define CYBT_TRACE_ID_HCIRX_TASK   (3)
74 #define CYBT_TRACE_ID_HCI_DRV      (4)
75 #define CYBT_TRACE_ID_HCI_LOG      (5)
76 #define CYBT_TRACE_ID_MEMORY       (6)
77 #define CYBT_TRACE_ID_PRM          (7)
78 #define CYBT_TRACE_ID_STACK        (8)
79 #define CYBT_TRACE_ID_APP          (9)
80 #define CYBT_TRACE_ID_BT_TASK      (10)
81 #define CYBT_TRACE_ID_MAX          (11)
82 #define CYBT_TRACE_ID_ALL          (0xFF)
83 typedef uint8_t cybt_trace_id_t;
84 
85 /**
86  * trace level
87  */
88 #define CYBT_TRACE_LEVEL_NONE      (0)
89 #define CYBT_TRACE_LEVEL_ERROR     (1)
90 #define CYBT_TRACE_LEVEL_WARNING   (2)
91 #define CYBT_TRACE_LEVEL_API       (3)
92 #define CYBT_TRACE_LEVEL_EVENT     (4)
93 #define CYBT_TRACE_LEVEL_DEBUG     (5)
94 #define CYBT_TRACE_LEVEL_MAX       (6)
95 typedef uint8_t cybt_trace_level_t;
96 
97 /**
98  * trace control block
99  */
100 typedef struct
101 {
102     uint8_t  trace_level[CYBT_TRACE_ID_MAX];    /**< BT trace level */
103 } cybt_platform_trace_cb_t;
104 
105 
106 #ifdef __cplusplus
107 extern "C"
108 {
109 #endif
110 
111 #if(CYBT_PLATFORM_TRACE_ENABLE == 1)
112 
113 extern cybt_platform_trace_cb_t trace_cb;
114 
115 extern void cybt_platform_log_print(const char *fmt_str, ...);
116 
117 #define MAIN_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_MAIN] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
118 #define MAIN_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_MAIN] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
119 #define MAIN_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_MAIN] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
120 #define MAIN_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_MAIN] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
121 #define MAIN_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_MAIN] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
122 
123 #define SPIF_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_SPIF] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
124 #define SPIF_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_SPIF] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
125 #define SPIF_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_SPIF] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
126 #define SPIF_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_SPIF] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
127 #define SPIF_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_SPIF] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
128 
129 #define HCITXTASK_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCITX_TASK] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
130 #define HCITXTASK_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_HCITX_TASK] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
131 #define HCITXTASK_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_HCITX_TASK] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
132 #define HCITXTASK_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCITX_TASK] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
133 #define HCITXTASK_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCITX_TASK] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
134 
135 #define HCIRXTASK_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCIRX_TASK] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
136 #define HCIRXTASK_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_HCIRX_TASK] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
137 #define HCIRXTASK_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_HCIRX_TASK] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
138 #define HCIRXTASK_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCIRX_TASK] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
139 #define HCIRXTASK_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCIRX_TASK] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
140 
141 #define HCIDRV_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_DRV] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
142 #define HCIDRV_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_DRV] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
143 #define HCIDRV_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_DRV] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
144 #define HCIDRV_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_DRV] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
145 #define HCIDRV_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_DRV] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
146 
147 #define HCILOG_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_LOG] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
148 #define HCILOG_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_LOG] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
149 #define HCILOG_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_LOG] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
150 #define HCILOG_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_LOG] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
151 #define HCILOG_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_HCI_LOG] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
152 
153 #define MEM_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_MEMORY] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
154 #define MEM_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_MEMORY] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
155 #define MEM_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_MEMORY] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
156 #define MEM_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_MEMORY] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
157 #define MEM_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_MEMORY] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
158 
159 #define PRM_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_PRM] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
160 #define PRM_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_PRM] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
161 #define PRM_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_PRM] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
162 #define PRM_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_PRM] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
163 #define PRM_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_PRM] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
164 
165 #define STACK_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_STACK] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
166 #define STACK_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_STACK] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
167 #define STACK_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_STACK] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
168 #define STACK_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_STACK] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
169 #define STACK_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_STACK] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
170 
171 #define APP_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_APP] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
172 #define APP_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_APP] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
173 #define APP_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_APP] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
174 #define APP_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_APP] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
175 #define APP_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_APP] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
176 
177 #define BTTASK_TRACE_ERROR(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_BT_TASK] >= CYBT_TRACE_LEVEL_ERROR) cybt_platform_log_print(__VA_ARGS__);}
178 #define BTTASK_TRACE_WARNING(...)  {if (trace_cb.trace_level[CYBT_TRACE_ID_BT_TASK] >= CYBT_TRACE_LEVEL_WARNING) cybt_platform_log_print(__VA_ARGS__);}
179 #define BTTASK_TRACE_API(...)      {if (trace_cb.trace_level[CYBT_TRACE_ID_BT_TASK] >= CYBT_TRACE_LEVEL_API) cybt_platform_log_print(__VA_ARGS__);}
180 #define BTTASK_TRACE_EVENT(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_BT_TASK] >= CYBT_TRACE_LEVEL_EVENT) cybt_platform_log_print(__VA_ARGS__);}
181 #define BTTASK_TRACE_DEBUG(...)    {if (trace_cb.trace_level[CYBT_TRACE_ID_BT_TASK] >= CYBT_TRACE_LEVEL_DEBUG) cybt_platform_log_print(__VA_ARGS__);}
182 
183 #else // (CYBT_PLATFORM_TRACE_ENABLE == 0)
184 
185 #define MAIN_TRACE_ERROR(...)
186 #define MAIN_TRACE_WARNING(...)
187 #define MAIN_TRACE_API(...)
188 #define MAIN_TRACE_EVENT(...)
189 #define MAIN_TRACE_DEBUG(...)
190 
191 #define SPIF_TRACE_ERROR(...)
192 #define SPIF_TRACE_WARNING(...)
193 #define SPIF_TRACE_API(...)
194 #define SPIF_TRACE_EVENT(...)
195 #define SPIF_TRACE_DEBUG(...)
196 
197 #define HCITXTASK_TRACE_ERROR(...)
198 #define HCITXTASK_TRACE_WARNING(...)
199 #define HCITXTASK_TRACE_API(...)
200 #define HCITXTASK_TRACE_EVENT(...)
201 #define HCITXTASK_TRACE_DEBUG(...)
202 
203 #define HCIRXTASK_TRACE_ERROR(...)
204 #define HCIRXTASK_TRACE_WARNING(...)
205 #define HCIRXTASK_TRACE_API(...)
206 #define HCIRXTASK_TRACE_EVENT(...)
207 #define HCIRXTASK_TRACE_DEBUG(...)
208 
209 #define HCIDRV_TRACE_ERROR(...)
210 #define HCIDRV_TRACE_WARNING(...)
211 #define HCIDRV_TRACE_API(...)
212 #define HCIDRV_TRACE_EVENT(...)
213 #define HCIDRV_TRACE_DEBUG(...)
214 
215 #define HCILOG_TRACE_ERROR(...)
216 #define HCILOG_TRACE_WARNING(...)
217 #define HCILOG_TRACE_API(...)
218 #define HCILOG_TRACE_EVENT(...)
219 #define HCILOG_TRACE_DEBUG(...)
220 
221 #define MEM_TRACE_ERROR(...)
222 #define MEM_TRACE_WARNING(...)
223 #define MEM_TRACE_API(...)
224 #define MEM_TRACE_EVENT(...)
225 #define MEM_TRACE_DEBUG(...)
226 
227 #define PRM_TRACE_ERROR(...)
228 #define PRM_TRACE_WARNING(...)
229 #define PRM_TRACE_API(...)
230 #define PRM_TRACE_EVENT(...)
231 #define PRM_TRACE_DEBUG(...)
232 
233 #define STACK_TRACE_ERROR(...)
234 #define STACK_TRACE_WARNING(...)
235 #define STACK_TRACE_API(...)
236 #define STACK_TRACE_EVENT(...)
237 #define STACK_TRACE_DEBUG(...)
238 
239 #define APP_TRACE_ERROR(...)
240 #define APP_TRACE_WARNING(...)
241 #define APP_TRACE_API(...)
242 #define APP_TRACE_EVENT(...)
243 #define APP_TRACE_DEBUG(...)
244 
245 #define BTTASK_TRACE_ERROR(...)
246 #define BTTASK_TRACE_WARNING(...)
247 #define BTTASK_TRACE_API(...)
248 #define BTTASK_TRACE_EVENT(...)
249 #define BTTASK_TRACE_DEBUG(...)
250 #endif
251 
252 /*****************************************************************************
253  *                           Function Declarations
254  ****************************************************************************/
255 /**
256  * Set the trace level for trace categories id.
257  *
258  * @param[in]       id    : trace id, CYBT_TRACE_ID_ALL for all categories
259  * @param[in]       level : trace level
260  *
261  * @returns         void
262  */
263 void cybt_platform_set_trace_level(cybt_trace_id_t                id,
264                                    cybt_trace_level_t level
265                                    );
266 #ifdef __cplusplus
267 } /* extern "C" */
268 #endif
269 
270 /**@} */
271 
272 #endif
273 
274