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