1 /*
2 * Copyright (C) 2015 The Android Open Source Project
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 #include <stdio.h>
17 #include <string.h>
18 #if !defined(NXPLOG__H_INCLUDED)
19 #include "phNxpConfig.h"
20 #include "phNxpLog.h"
21 #endif
22 #include <android-base/stringprintf.h>
23 #include <base/logging.h>
24 #include <cutils/properties.h>
25
26 using android::base::StringPrintf;
27
28 extern bool nfc_debug_enabled;
29
30 const char* NXPLOG_ITEM_EXTNS = "NxpExtns";
31 const char* NXPLOG_ITEM_NCIHAL = "NxpHal";
32 const char* NXPLOG_ITEM_NCIX = "NxpNciX";
33 const char* NXPLOG_ITEM_NCIR = "NxpNciR";
34 const char* NXPLOG_ITEM_FWDNLD = "NxpFwDnld";
35 const char* NXPLOG_ITEM_TML = "NxpTml";
36
37 #ifdef NXP_HCI_REQ
38 const char* NXPLOG_ITEM_HCPX = "NxpHcpX";
39 const char* NXPLOG_ITEM_HCPR = "NxpHcpR";
40 #endif /*NXP_HCI_REQ*/
41
42 /* global log level structure */
43 nci_log_level_t gLog_level;
44
45 /*******************************************************************************
46 *
47 * Function phNxpLog_SetGlobalLogLevel
48 *
49 * Description Sets the global log level for all modules.
50 * This value is set by Android property
51 *nfc.nxp_log_level_global. If value can be overridden by module log level.
52 *
53 * Returns The value of global log level
54 *
55 ******************************************************************************/
phNxpLog_SetGlobalLogLevel(void)56 static uint8_t phNxpLog_SetGlobalLogLevel(void) {
57 uint8_t level = NXPLOG_DEFAULT_LOGLEVEL;
58 unsigned long num = 0;
59 char valueStr[PROPERTY_VALUE_MAX] = {0};
60
61 int len = property_get(PROP_NAME_NXPLOG_GLOBAL_LOGLEVEL, valueStr, "");
62 if (len > 0) {
63 /* let Android property override .conf variable */
64 sscanf(valueStr, "%lu", &num);
65 level = (unsigned char)num;
66 }
67 memset(&gLog_level, level, sizeof(nci_log_level_t));
68 return level;
69 }
70
71 /*******************************************************************************
72 *
73 * Function phNxpLog_SetHALLogLevel
74 *
75 * Description Sets the HAL layer log level.
76 *
77 * Returns void
78 *
79 ******************************************************************************/
phNxpLog_SetHALLogLevel(uint8_t level)80 static void phNxpLog_SetHALLogLevel(uint8_t level) {
81 unsigned long num = 0;
82 int len;
83 char valueStr[PROPERTY_VALUE_MAX] = {0};
84
85 if (GetNxpNumValue(NAME_NXPLOG_HAL_LOGLEVEL, &num, sizeof(num))) {
86 gLog_level.hal_log_level =
87 (level > (unsigned char)num) ? level : (unsigned char)num;
88 ;
89 }
90
91 len = property_get(PROP_NAME_NXPLOG_HAL_LOGLEVEL, valueStr, "");
92 if (len > 0) {
93 /* let Android property override .conf variable */
94 sscanf(valueStr, "%lu", &num);
95 gLog_level.hal_log_level = (unsigned char)num;
96 }
97
98 return;
99 }
100
101 /*******************************************************************************
102 *
103 * Function phNxpLog_SetExtnsLogLevel
104 *
105 * Description Sets the Extensions layer log level.
106 *
107 * Returns void
108 *
109 ******************************************************************************/
phNxpLog_SetExtnsLogLevel(uint8_t level)110 static void phNxpLog_SetExtnsLogLevel(uint8_t level) {
111 unsigned long num = 0;
112 int len;
113 char valueStr[PROPERTY_VALUE_MAX] = {0};
114 if (GetNxpNumValue(NAME_NXPLOG_EXTNS_LOGLEVEL, &num, sizeof(num))) {
115 gLog_level.extns_log_level =
116 (level > (unsigned char)num) ? level : (unsigned char)num;
117 ;
118 }
119
120 len = property_get(PROP_NAME_NXPLOG_EXTNS_LOGLEVEL, valueStr, "");
121 if (len > 0) {
122 /* let Android property override .conf variable */
123 sscanf(valueStr, "%lu", &num);
124 gLog_level.extns_log_level = (unsigned char)num;
125 }
126
127 return;
128 }
129
130 /*******************************************************************************
131 *
132 * Function phNxpLog_SetTmlLogLevel
133 *
134 * Description Sets the TML layer log level.
135 *
136 * Returns void
137 *
138 ******************************************************************************/
phNxpLog_SetTmlLogLevel(uint8_t level)139 static void phNxpLog_SetTmlLogLevel(uint8_t level) {
140 unsigned long num = 0;
141 int len;
142 char valueStr[PROPERTY_VALUE_MAX] = {0};
143 if (GetNxpNumValue(NAME_NXPLOG_TML_LOGLEVEL, &num, sizeof(num))) {
144 gLog_level.tml_log_level =
145 (level > (unsigned char)num) ? level : (unsigned char)num;
146 ;
147 }
148
149 len = property_get(PROP_NAME_NXPLOG_TML_LOGLEVEL, valueStr, "");
150 if (len > 0) {
151 /* let Android property override .conf variable */
152 sscanf(valueStr, "%lu", &num);
153 gLog_level.tml_log_level = (unsigned char)num;
154 }
155
156 return;
157 }
158
159 /*******************************************************************************
160 *
161 * Function phNxpLog_SetDnldLogLevel
162 *
163 * Description Sets the FW download layer log level.
164 *
165 * Returns void
166 *
167 ******************************************************************************/
phNxpLog_SetDnldLogLevel(uint8_t level)168 static void phNxpLog_SetDnldLogLevel(uint8_t level) {
169 unsigned long num = 0;
170 int len;
171 char valueStr[PROPERTY_VALUE_MAX] = {0};
172 if (GetNxpNumValue(NAME_NXPLOG_FWDNLD_LOGLEVEL, &num, sizeof(num))) {
173 gLog_level.dnld_log_level =
174 (level > (unsigned char)num) ? level : (unsigned char)num;
175 ;
176 }
177
178 len = property_get(PROP_NAME_NXPLOG_FWDNLD_LOGLEVEL, valueStr, "");
179 if (len > 0) {
180 /* let Android property override .conf variable */
181 sscanf(valueStr, "%lu", &num);
182 gLog_level.dnld_log_level = (unsigned char)num;
183 }
184
185 return;
186 }
187
188 /*******************************************************************************
189 *
190 * Function phNxpLog_SetNciTxLogLevel
191 *
192 * Description Sets the NCI transaction layer log level.
193 *
194 * Returns void
195 *
196 ******************************************************************************/
phNxpLog_SetNciTxLogLevel(uint8_t level)197 static void phNxpLog_SetNciTxLogLevel(uint8_t level) {
198 unsigned long num = 0;
199 int len;
200 char valueStr[PROPERTY_VALUE_MAX] = {0};
201 if (GetNxpNumValue(NAME_NXPLOG_NCIX_LOGLEVEL, &num, sizeof(num))) {
202 gLog_level.ncix_log_level =
203 (level > (unsigned char)num) ? level : (unsigned char)num;
204 }
205 if (GetNxpNumValue(NAME_NXPLOG_NCIR_LOGLEVEL, &num, sizeof(num))) {
206 gLog_level.ncir_log_level =
207 (level > (unsigned char)num) ? level : (unsigned char)num;
208 ;
209 }
210
211 len = property_get(PROP_NAME_NXPLOG_NCI_LOGLEVEL, valueStr, "");
212 if (len > 0) {
213 /* let Android property override .conf variable */
214 sscanf(valueStr, "%lu", &num);
215 gLog_level.ncix_log_level = (unsigned char)num;
216 gLog_level.ncir_log_level = (unsigned char)num;
217 }
218
219 return;
220 }
221
222 /******************************************************************************
223 * Function phNxpLog_InitializeLogLevel
224 *
225 * Description Initialize and get log level of module from libnfc-nxp.conf
226 *or Android runtime properties. The Android property nfc.nxp_global_log_level
227 *is to define log level for all modules. Modules log level
228 *will override global level. The Android property will
229 *override the level in libnfc-nxp.conf
230 *
231 * Android property names:
232 * nfc.nxp_log_level_global * defines log level for all
233 *modules nfc.nxp_log_level_extns * extensions module log
234 * nfc.nxp_log_level_hal * Hal module log
235 * nfc.nxp_log_level_dnld * firmware download module
236 *log nfc.nxp_log_level_tml * TML module log nfc.nxp_log_level_nci *
237 *NCI transaction log
238 *
239 * Log Level values:
240 * NXPLOG_LOG_SILENT_LOGLEVEL 0 * No trace to show
241 * NXPLOG_LOG_ERROR_LOGLEVEL 1 * Show Error trace
242 *only NXPLOG_LOG_WARN_LOGLEVEL 2 * Show Warning trace and Error trace
243 * NXPLOG_LOG_DEBUG_LOGLEVEL 3 * Show all traces
244 *
245 * Returns void
246 *
247 ******************************************************************************/
phNxpLog_InitializeLogLevel(void)248 void phNxpLog_InitializeLogLevel(void) {
249 uint8_t level = phNxpLog_SetGlobalLogLevel();
250 phNxpLog_SetHALLogLevel(level);
251 phNxpLog_SetExtnsLogLevel(level);
252 phNxpLog_SetTmlLogLevel(level);
253 phNxpLog_SetDnldLogLevel(level);
254 phNxpLog_SetNciTxLogLevel(level);
255
256 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
257 "%s: global =%u, Fwdnld =%u, extns =%u, \
258 hal =%u, tml =%u, ncir =%u, \
259 ncix =%u",
260 __func__, gLog_level.global_log_level, gLog_level.dnld_log_level,
261 gLog_level.extns_log_level, gLog_level.hal_log_level,
262 gLog_level.tml_log_level, gLog_level.ncir_log_level,
263 gLog_level.ncix_log_level);
264
265 return;
266 }
267