13f0440ad1422eba719428822b970c203bfdd392eEvan Chu/****************************************************************************** 23f0440ad1422eba719428822b970c203bfdd392eEvan Chu * 33f0440ad1422eba719428822b970c203bfdd392eEvan Chu * Copyright (C) 2012 Broadcom Corporation 43f0440ad1422eba719428822b970c203bfdd392eEvan Chu * 53f0440ad1422eba719428822b970c203bfdd392eEvan Chu * Licensed under the Apache License, Version 2.0 (the "License"); 63f0440ad1422eba719428822b970c203bfdd392eEvan Chu * you may not use this file except in compliance with the License. 73f0440ad1422eba719428822b970c203bfdd392eEvan Chu * You may obtain a copy of the License at: 83f0440ad1422eba719428822b970c203bfdd392eEvan Chu * 93f0440ad1422eba719428822b970c203bfdd392eEvan Chu * http://www.apache.org/licenses/LICENSE-2.0 103f0440ad1422eba719428822b970c203bfdd392eEvan Chu * 113f0440ad1422eba719428822b970c203bfdd392eEvan Chu * Unless required by applicable law or agreed to in writing, software 123f0440ad1422eba719428822b970c203bfdd392eEvan Chu * distributed under the License is distributed on an "AS IS" BASIS, 133f0440ad1422eba719428822b970c203bfdd392eEvan Chu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143f0440ad1422eba719428822b970c203bfdd392eEvan Chu * See the License for the specific language governing permissions and 153f0440ad1422eba719428822b970c203bfdd392eEvan Chu * limitations under the License. 163f0440ad1422eba719428822b970c203bfdd392eEvan Chu * 173f0440ad1422eba719428822b970c203bfdd392eEvan Chu ******************************************************************************/ 183f0440ad1422eba719428822b970c203bfdd392eEvan Chu 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define LOG_TAG "NfcNciHal" 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "OverrideLog.h" 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "spdhelper.h" 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h" 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid SpdHelper::setPatchAsBad() 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project getInstance().setPatchAsBadImpl(); 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid SpdHelper::incErrorCount() 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project getInstance().incErrorCountImpl(); 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectbool SpdHelper::isPatchBad(UINT8* prm, UINT32 len) 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return getInstance().isPatchBadImpl(prm, len); 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectbool SpdHelper::isSpdDebug() 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bool b = getInstance().isSpdDebugImpl(); 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ALOGD("%s SpdDebug is %s", __func__, (b ? "TRUE" : "FALSE")); 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return b; 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid SpdHelper::incErrorCountImpl() 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (++mErrorCount >= mMaxErrorCount) 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project setPatchAsBadImpl(); 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid SpdHelper::setPatchAsBadImpl() 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mIsPatchBad = true; 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectinline const char * toHex(UINT8 b) 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static char hex[] = "0123456789ABCDEF"; 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static char c[3]; 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project c[0] = hex[((b >> 4) & 0x0F)]; 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project c[1] = hex[((b >> 0) & 0x0F)]; 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project c[2] = '\0'; 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return &c[0]; 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectbool SpdHelper::isPatchBadImpl(UINT8* prm, UINT32 len) 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project string strNew; 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Get the patch ID from the prm data. 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (int i = 0; i < 8 && i < len; ++i) 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project strNew.append(toHex(*prm++)); 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // If it is not the same patch as before, then reset things. 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( strNew != mPatchId ) 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mPatchId = strNew; 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mErrorCount = 0; 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mIsPatchBad = false; 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Otherwise the 'mIsPatchBad' will tell if its bad or not. 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ALOGD("%s '%s' (%d) is %sa known bad patch file", __func__, mPatchId.c_str(), mErrorCount, (mIsPatchBad ? "" : "not ")); 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return mIsPatchBad; 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectSpdHelper& SpdHelper::getInstance() 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static SpdHelper* theInstance = NULL; 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (theInstance == NULL) 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project theInstance= new SpdHelper; 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return *theInstance; 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectSpdHelper::SpdHelper() 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mErrorCount = 0; 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mPatchId.erase(); 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if(!GetNumValue((char*)NAME_SPD_MAXRETRYCOUNT, &mMaxErrorCount, sizeof(mMaxErrorCount))) 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mMaxErrorCount = DEFAULT_SPD_MAXRETRYCOUNT; 1051569641423dac0a41af7596fdef972126e698f46Evan Chu mIsPatchBad = false; 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!GetNumValue((char*)NAME_SPD_DEBUG, &mSpdDebug, sizeof(mSpdDebug))) 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mSpdDebug = false; 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 109