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