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