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