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