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 ******************************************************************************/ 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 ******************************************************************************/ 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 ******************************************************************************/ 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 ******************************************************************************/ 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 ******************************************************************************/ 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 ******************************************************************************/ 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 ******************************************************************************/ 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