1 /*
2 * Copyright 2010-2019, 2022-2024 NXP
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #define LOG_TAG "NxpNfcHal"
17 #include <stdio.h>
18 #include <string.h>
19 #if !defined(NXPLOG__H_INCLUDED)
20 #include "phNxpConfig.h"
21 #include "phNxpLog.h"
22 #endif
23 #include <log/log.h>
24 #include "phNxpNciHal_IoctlOperations.h"
25
26 const char* NXPLOG_ITEM_EXTNS = "NxpExtns";
27 const char* NXPLOG_ITEM_NCIHAL = "NxpHal";
28 const char* NXPLOG_ITEM_NCIX = "NxpNciX";
29 const char* NXPLOG_ITEM_NCIR = "NxpNciR";
30 const char* NXPAVCLOG_ITEM_NCIX = "NxpAvcNciX";
31 const char* NXPAVCLOG_ITEM_NCIR = "NxpAvcNciR";
32 const char* NXPLOG_ITEM_FWDNLD = "NxpFwDnld";
33 const char* NXPLOG_ITEM_TML = "NxpTml";
34 const char* NXPLOG_ITEM_ONEBIN = "NxpOneBinary";
35
36 #ifdef NXP_HCI_REQ
37 const char* NXPLOG_ITEM_HCPX = "NxpHcpX";
38 const char* NXPLOG_ITEM_HCPR = "NxpHcpR";
39 #endif /*NXP_HCI_REQ*/
40
41 /* global log level structure */
42 nci_log_level_t gLog_level;
43
44 extern bool nfc_debug_enabled;
45
46 /*******************************************************************************
47 *
48 * Function phNxpLog_SetGlobalLogLevel
49 *
50 * Description Sets the global log level for all modules.
51 * This value is set by Android property
52 *nfc.nxp_log_level_global.
53 * If value can be overridden by module log level.
54 *
55 * Returns The value of global log level
56 *
57 ******************************************************************************/
phNxpLog_SetGlobalLogLevel(void)58 static uint8_t phNxpLog_SetGlobalLogLevel(void) {
59 uint8_t level = NXPLOG_DEFAULT_LOGLEVEL;
60 unsigned long num = 0;
61 char valueStr[PROPERTY_VALUE_MAX] = {0};
62
63 int len = property_get(PROP_NAME_NXPLOG_GLOBAL_LOGLEVEL, valueStr, "");
64 if (len > 0) {
65 /* let Android property override .conf variable */
66 int ret = sscanf(valueStr, "%lu", &num);
67 if (ret) level = (unsigned char)num;
68 }
69 memset(&gLog_level, level, sizeof(nci_log_level_t));
70 return level;
71 }
72
73 /*******************************************************************************
74 *
75 * Function phNxpLog_SetHALLogLevel
76 *
77 * Description Sets the HAL layer log level.
78 *
79 * Returns void
80 *
81 ******************************************************************************/
phNxpLog_SetHALLogLevel(uint8_t level)82 static void phNxpLog_SetHALLogLevel(uint8_t level) {
83 unsigned long num = 0;
84 int len;
85 char valueStr[PROPERTY_VALUE_MAX] = {0};
86
87 if (GetNxpNumValue(NAME_NXPLOG_NCIHAL_LOGLEVEL, &num, sizeof(num))) {
88 gLog_level.hal_log_level =
89 (level > (unsigned char)num) ? level : (unsigned char)num;
90 }
91
92 len = property_get(PROP_NAME_NXPLOG_NCIHAL_LOGLEVEL, valueStr, "");
93 if (len > 0) {
94 /* let Android property override .conf variable */
95 int ret = sscanf(valueStr, "%lu", &num);
96 if (ret) gLog_level.hal_log_level = (unsigned char)num;
97 }
98 }
99
100 /*******************************************************************************
101 *
102 * Function phNxpLog_SetAvcLogLevel
103 *
104 * Description Sets the Android Vendor GID OID log level.
105 *
106 * Returns void
107 *
108 ******************************************************************************/
phNxpLog_SetAvcLogLevel(uint8_t level)109 static void phNxpLog_SetAvcLogLevel(uint8_t level) {
110 unsigned long num = 0;
111 int len;
112 char valueStr[PROPERTY_VALUE_MAX] = {0};
113
114 if (GetNxpNumValue(NAME_NXPLOG_AVCNCI_LOGLEVEL, &num, sizeof(num))) {
115 gLog_level.avc_log_level =
116 (level > (unsigned char)num) ? level : (unsigned char)num;
117 }
118 }
119
120 /*******************************************************************************
121 *
122 * Function phNxpLog_SetExtnsLogLevel
123 *
124 * Description Sets the Extensions layer log level.
125 *
126 * Returns void
127 *
128 ******************************************************************************/
phNxpLog_SetExtnsLogLevel(uint8_t level)129 static void phNxpLog_SetExtnsLogLevel(uint8_t level) {
130 unsigned long num = 0;
131 int len;
132 char valueStr[PROPERTY_VALUE_MAX] = {0};
133 if (GetNxpNumValue(NAME_NXPLOG_EXTNS_LOGLEVEL, &num, sizeof(num))) {
134 gLog_level.extns_log_level =
135 (level > (unsigned char)num) ? level : (unsigned char)num;
136 ;
137 }
138
139 len = property_get(PROP_NAME_NXPLOG_EXTNS_LOGLEVEL, valueStr, "");
140 if (len > 0) {
141 /* let Android property override .conf variable */
142 int ret = sscanf(valueStr, "%lu", &num);
143 if (ret) gLog_level.extns_log_level = (unsigned char)num;
144 }
145 }
146
147 /*******************************************************************************
148 *
149 * Function phNxpLog_SetTmlLogLevel
150 *
151 * Description Sets the Tml layer log level.
152 *
153 * Returns void
154 *
155 ******************************************************************************/
phNxpLog_SetTmlLogLevel(uint8_t level)156 static void phNxpLog_SetTmlLogLevel(uint8_t level) {
157 unsigned long num = 0;
158 int len;
159 char valueStr[PROPERTY_VALUE_MAX] = {0};
160 if (GetNxpNumValue(NAME_NXPLOG_TML_LOGLEVEL, &num, sizeof(num))) {
161 gLog_level.tml_log_level =
162 (level > (unsigned char)num) ? level : (unsigned char)num;
163 ;
164 }
165
166 len = property_get(PROP_NAME_NXPLOG_TML_LOGLEVEL, valueStr, "");
167 if (len > 0) {
168 /* let Android property override .conf variable */
169 int ret = sscanf(valueStr, "%lu", &num);
170 if (ret) gLog_level.tml_log_level = (unsigned char)num;
171 }
172 }
173
174 /*******************************************************************************
175 *
176 * Function phNxpLog_SetDnldLogLevel
177 *
178 * Description Sets the FW download layer log level.
179 *
180 * Returns void
181 *
182 ******************************************************************************/
phNxpLog_SetDnldLogLevel(uint8_t level)183 static void phNxpLog_SetDnldLogLevel(uint8_t level) {
184 unsigned long num = 0;
185 int len;
186 char valueStr[PROPERTY_VALUE_MAX] = {0};
187 if (GetNxpNumValue(NAME_NXPLOG_FWDNLD_LOGLEVEL, &num, sizeof(num))) {
188 gLog_level.dnld_log_level =
189 (level > (unsigned char)num) ? level : (unsigned char)num;
190 ;
191 }
192
193 len = property_get(PROP_NAME_NXPLOG_FWDNLD_LOGLEVEL, valueStr, "");
194 if (len > 0) {
195 /* let Android property override .conf variable */
196 int ret = sscanf(valueStr, "%lu", &num);
197 if (ret) gLog_level.dnld_log_level = (unsigned char)num;
198 }
199 }
200
201 /*******************************************************************************
202 *
203 * Function phNxpLog_SetNciTxLogLevel
204 *
205 * Description Sets the NCI transaction layer log level.
206 *
207 * Returns void
208 *
209 ******************************************************************************/
phNxpLog_SetNciTxLogLevel(uint8_t level)210 static void phNxpLog_SetNciTxLogLevel(uint8_t level) {
211 unsigned long num = 0;
212 int len;
213 char valueStr[PROPERTY_VALUE_MAX] = {0};
214 if (GetNxpNumValue(NAME_NXPLOG_NCIX_LOGLEVEL, &num, sizeof(num))) {
215 gLog_level.ncix_log_level =
216 (level > (unsigned char)num) ? level : (unsigned char)num;
217 }
218 if (GetNxpNumValue(NAME_NXPLOG_NCIR_LOGLEVEL, &num, sizeof(num))) {
219 gLog_level.ncir_log_level =
220 (level > (unsigned char)num) ? level : (unsigned char)num;
221 ;
222 }
223
224 len = property_get(PROP_NAME_NXPLOG_NCI_LOGLEVEL, valueStr, "");
225 if (len > 0) {
226 /* let Android property override .conf variable */
227 int ret = sscanf(valueStr, "%lu", &num);
228 if (ret) {
229 gLog_level.ncix_log_level = (unsigned char)num;
230 gLog_level.ncir_log_level = (unsigned char)num;
231 }
232 }
233 }
234
235 /******************************************************************************
236 * Function phNxpLog_InitializeLogLevel
237 *
238 * Description Initialize and get log level of module from libnfc-nxp.conf
239 *or
240 * Android runtime properties.
241 * The Android property nfc.nxp_global_log_level is to
242 * define log level for all modules. Modules log level will
243 *overwide global level.
244 * The Android property will overwide the level
245 * in libnfc-nxp.conf
246 *
247 * Android property names:
248 * nfc.nxp_log_level_global * defines log level for all
249 *modules
250 * nfc.nxp_log_level_extns * extensions module log
251 * nfc.nxp_log_level_hal * Hal module log
252 * nfc.nxp_log_level_dnld * firmware download module
253 *log
254 * nfc.nxp_log_level_tml * TML module log
255 * nfc.nxp_log_level_nci * NCI transaction log
256 *
257 * Log Level values:
258 * NXPLOG_LOG_SILENT_LOGLEVEL 0 * No trace to show
259 * NXPLOG_LOG_ERROR_LOGLEVEL 1 * Show Error trace
260 *only
261 * NXPLOG_LOG_WARN_LOGLEVEL 2 * Show Warning
262 *trace and Error trace
263 * NXPLOG_LOG_DEBUG_LOGLEVEL 3 * Show all traces
264 *
265 * Returns void
266 *
267 ******************************************************************************/
phNxpLog_InitializeLogLevel(void)268 void phNxpLog_InitializeLogLevel(void) {
269 uint8_t level = phNxpLog_SetGlobalLogLevel();
270 phNxpLog_SetHALLogLevel(level);
271 phNxpLog_SetAvcLogLevel(level);
272 phNxpLog_SetExtnsLogLevel(level);
273 phNxpLog_SetTmlLogLevel(level);
274 phNxpLog_SetDnldLogLevel(level);
275 phNxpLog_SetNciTxLogLevel(level);
276
277 ALOGD_IF(nfc_debug_enabled,
278 "%s: global =%u, Fwdnld =%u, extns =%u, \
279 hal =%u, tml =%u, ncir =%u, \
280 ncix =%u, avc = %u",
281 __func__, gLog_level.global_log_level, gLog_level.dnld_log_level,
282 gLog_level.extns_log_level, gLog_level.hal_log_level,
283 gLog_level.tml_log_level, gLog_level.ncir_log_level,
284 gLog_level.ncix_log_level, gLog_level.avc_log_level);
285 }
286 /******************************************************************************
287 * Function phNxpLog_EnableDisableLogLevel
288 *
289 * Description This function can be called to enable/disable the log levels
290 *
291 *
292 * Log Level values:
293 * NXPLOG_LOG_SILENT_LOGLEVEL 0 * No trace to show
294 * NXPLOG_LOG_ERROR_LOGLEVEL 1 * Show Error trace
295 *only
296 * NXPLOG_LOG_WARN_LOGLEVEL 2 * Show Warning
297 *trace and Error trace
298 * NXPLOG_LOG_DEBUG_LOGLEVEL 3 * Show all traces
299 *
300 * Returns void
301 *
302 ******************************************************************************/
phNxpLog_EnableDisableLogLevel(uint8_t enable)303 uint8_t phNxpLog_EnableDisableLogLevel(uint8_t enable) {
304 static nci_log_level_t prevTraceLevel = {0, 0, 0, 0, 0, 0, 0};
305 static uint8_t currState = 0x01;
306 static bool prev_debug_enabled = true;
307 uint8_t status = NFCSTATUS_FAILED;
308
309 if (0x01 == enable && currState != 0x01) {
310 memcpy(&gLog_level, &prevTraceLevel, sizeof(nci_log_level_t));
311 nfc_debug_enabled = prev_debug_enabled;
312 currState = 0x01;
313 status = NFCSTATUS_SUCCESS;
314 } else if (0x00 == enable && currState != 0x00) {
315 prev_debug_enabled = nfc_debug_enabled;
316 memcpy(&prevTraceLevel, &gLog_level, sizeof(nci_log_level_t));
317 gLog_level.hal_log_level = 0;
318 gLog_level.extns_log_level = 0;
319 gLog_level.tml_log_level = 0;
320 gLog_level.ncix_log_level = 0;
321 gLog_level.ncir_log_level = 0;
322 nfc_debug_enabled = false;
323 currState = 0x00;
324 status = NFCSTATUS_SUCCESS;
325 }
326
327 return status;
328 }
329