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