Home | History | Annotate | Download | only in adaptation
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  HAL Adaptation Interface (HAI). This interface regulates the interaction
     22  *  between standard Android HAL and Broadcom-specific HAL.  It adapts
     23  *  Broadcom-specific features to the Android framework.
     24  *
     25  ******************************************************************************/
     26 #define LOG_TAG "NfcNciHal"
     27 #include "OverrideLog.h"
     28 #include "HalAdaptation.h"
     29 #include "SyncEvent.h"
     30 #include "config.h"
     31 #include "nfc_hal_int.h"
     32 #include "nfc_hal_post_reset.h"
     33 #include <errno.h>
     34 #include <pthread.h>
     35 #include <cutils/properties.h>
     36 #include "buildcfg.h"
     37 #include "android_logmsg.h"
     38 extern void delete_hal_non_volatile_store (bool forceDelete);
     39 extern void verify_hal_non_volatile_store ();
     40 extern void resetConfig ();
     41 extern "C"
     42 {
     43 #include "userial.h"
     44 }
     45 
     46 extern void configureCrystalFrequency ();
     47 
     48 ///////////////////////////////////////
     49 // private declaration, definition
     50 
     51 
     52 static nfc_stack_callback_t* gAndroidHalCallback = NULL;
     53 static nfc_stack_data_callback_t* gAndroidHalDataCallback = NULL;
     54 static SyncEvent gOpenCompletedEvent;
     55 static SyncEvent gPostInitCompletedEvent;
     56 static SyncEvent gCloseCompletedEvent;
     57 
     58 UINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
     59 
     60 static void BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status);
     61 static void BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data);
     62 
     63 static bool isColdBoot = true;
     64 
     65 extern tNFC_HAL_CFG *p_nfc_hal_cfg;
     66 extern const UINT8  nfca_version_string [];
     67 extern const UINT8  nfa_version_string [];
     68 
     69 tNFC_HAL_DM_PRE_SET_MEM nfc_hal_pre_set_mem_20795a1 [] =
     70 {
     71     {0x0016403c,    0x00000008},
     72     {0x0016403c,    0x00000000},
     73     {0x0014008c,    0x00000001},
     74     {0,         0}
     75 };
     76 
     77 extern tNFC_HAL_DM_PRE_SET_MEM *p_nfc_hal_dm_pre_set_mem;
     78 
     79 ///////////////////////////////////////
     80 
     81 
     82 int HaiInitializeLibrary (const bcm2079x_dev_t* device)
     83 {
     84     ALOGD ("%s: enter", __FUNCTION__);
     85     ALOGE ("%s: ver=%s nfa=%s", __FUNCTION__, nfca_version_string, nfa_version_string);
     86     int retval = EACCES;
     87     unsigned long freq = 0;
     88     unsigned long num = 0;
     89     char temp[120];
     90     int8_t prop_value;
     91     UINT8 logLevel = 0;
     92 
     93     logLevel = InitializeGlobalAppLogLevel ();
     94 
     95     if ( GetNumValue ( NAME_GLOBAL_RESET, &num, sizeof ( num ) ) )
     96     {
     97         if (num == 1)
     98         {
     99             // Send commands to disable boc
    100             p_nfc_hal_dm_pre_set_mem = nfc_hal_pre_set_mem_20795a1;
    101         }
    102     }
    103 
    104     configureCrystalFrequency ();
    105     verify_hal_non_volatile_store ();
    106     if ( GetNumValue ( NAME_PRESERVE_STORAGE, (char*)&num, sizeof ( num ) ) &&
    107             (num == 1) )
    108         ALOGD ("%s: preserve HAL NV store", __FUNCTION__);
    109     else
    110     {
    111         delete_hal_non_volatile_store (false);
    112     }
    113 
    114     if ( GetNumValue ( NAME_USE_RAW_NCI_TRACE, &num, sizeof ( num ) ) )
    115     {
    116         if (num == 1)
    117         {
    118             // display protocol traces in raw format
    119             ProtoDispAdapterUseRawOutput (TRUE);
    120         }
    121     }
    122 
    123     // Initialize protocol logging level
    124     if ( GetNumValue ( NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof ( num ) ) )
    125         ScrProtocolTraceFlag = num;
    126 
    127     tUSERIAL_OPEN_CFG cfg;
    128     struct tUART_CONFIG  uart;
    129 
    130     if ( GetStrValue ( NAME_UART_PARITY, temp, sizeof ( temp ) ) )
    131     {
    132         if ( strcmp ( temp, "even" ) == 0 )
    133             uart.m_iParity = USERIAL_PARITY_EVEN;
    134         else if ( strcmp ( temp, "odd" ) == 0 )
    135             uart.m_iParity = USERIAL_PARITY_ODD;
    136         else if ( strcmp ( temp, "none" ) == 0 )
    137             uart.m_iParity = USERIAL_PARITY_NONE;
    138     }
    139     else
    140         uart.m_iParity = USERIAL_PARITY_NONE;
    141 
    142     if ( GetStrValue ( NAME_UART_STOPBITS, temp, sizeof ( temp ) ) )
    143     {
    144         if ( strcmp ( temp, "1" ) == 0 )
    145             uart.m_iStopbits = USERIAL_STOPBITS_1;
    146         else if ( strcmp ( temp, "2" ) == 0 )
    147             uart.m_iStopbits = USERIAL_STOPBITS_2;
    148         else if ( strcmp ( temp, "1.5" ) == 0 )
    149             uart.m_iStopbits = USERIAL_STOPBITS_1_5;
    150     }
    151     else if ( GetNumValue ( NAME_UART_STOPBITS, &num, sizeof ( num ) ) )
    152     {
    153         if ( num == 1 )
    154             uart.m_iStopbits = USERIAL_STOPBITS_1;
    155         else if ( num == 2 )
    156             uart.m_iStopbits = USERIAL_STOPBITS_2;
    157     }
    158     else
    159         uart.m_iStopbits = USERIAL_STOPBITS_1;
    160 
    161     if ( GetNumValue ( NAME_UART_DATABITS, &num, sizeof ( num ) ) )
    162     {
    163         if ( 5 <= num && num <= 8 )
    164             uart.m_iDatabits = ( 1 << ( num + 1 ) );
    165     }
    166     else
    167         uart.m_iDatabits = USERIAL_DATABITS_8;
    168 
    169     if ( GetNumValue ( NAME_UART_BAUD, &num, sizeof ( num ) ) )
    170     {
    171         if ( num == 300 ) uart.m_iBaudrate = USERIAL_BAUD_300;
    172         else if ( num == 600 ) uart.m_iBaudrate = USERIAL_BAUD_600;
    173         else if ( num == 1200 ) uart.m_iBaudrate = USERIAL_BAUD_1200;
    174         else if ( num == 2400 ) uart.m_iBaudrate = USERIAL_BAUD_2400;
    175         else if ( num == 9600 ) uart.m_iBaudrate = USERIAL_BAUD_9600;
    176         else if ( num == 19200 ) uart.m_iBaudrate = USERIAL_BAUD_19200;
    177         else if ( num == 57600 ) uart.m_iBaudrate = USERIAL_BAUD_57600;
    178         else if ( num == 115200 ) uart.m_iBaudrate = USERIAL_BAUD_115200;
    179         else if ( num == 230400 ) uart.m_iBaudrate = USERIAL_BAUD_230400;
    180         else if ( num == 460800 ) uart.m_iBaudrate = USERIAL_BAUD_460800;
    181         else if ( num == 921600 ) uart.m_iBaudrate = USERIAL_BAUD_921600;
    182     }
    183     else if ( GetStrValue ( NAME_UART_BAUD, temp, sizeof ( temp ) ) )
    184     {
    185         if ( strcmp ( temp, "auto" ) == 0 )
    186             uart.m_iBaudrate = USERIAL_BAUD_AUTO;
    187     }
    188     else
    189         uart.m_iBaudrate = USERIAL_BAUD_115200;
    190 
    191     memset (&cfg, 0, sizeof(tUSERIAL_OPEN_CFG));
    192     cfg.fmt = uart.m_iDatabits | uart.m_iParity | uart.m_iStopbits;
    193     cfg.baud = uart.m_iBaudrate;
    194 
    195     ALOGD ("%s: uart config=0x%04x, %d\n", __func__, cfg.fmt, cfg.baud);
    196     USERIAL_Init(&cfg);
    197 
    198     if ( GetNumValue ( NAME_NFCC_ENABLE_TIMEOUT, &num, sizeof ( num ) ) )
    199     {
    200         p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout = num;
    201     }
    202 
    203     if ( GetNumValue ( NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof ( num ) ) && num == 0 )
    204     {
    205         // Since NFA_MAX_EE_SUPPORTED is explicetly set to 0, no UICC support is needed.
    206         p_nfc_hal_cfg->nfc_hal_hci_uicc_support = 0;
    207     }
    208 
    209     prop_value = property_get_bool("nfc.bcm2079x.isColdboot", 0);
    210     if (prop_value) {
    211         isColdBoot = true;
    212         property_set("nfc.bcm2079x.isColdboot", "0");
    213     }
    214     // Set 'first boot' flag based on static variable that will get set to false
    215     // after the stack has first initialized the EE.
    216     p_nfc_hal_cfg->nfc_hal_first_boot = isColdBoot ? TRUE : FALSE;
    217 
    218     HAL_NfcInitialize ();
    219     HAL_NfcSetTraceLevel (logLevel); // Initialize HAL's logging level
    220 
    221     retval = 0;
    222     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    223     return retval;
    224 }
    225 
    226 
    227 int HaiTerminateLibrary ()
    228 {
    229     int retval = EACCES;
    230     ALOGD ("%s: enter", __FUNCTION__);
    231 
    232     HAL_NfcTerminate ();
    233     gAndroidHalCallback = NULL;
    234     gAndroidHalDataCallback = NULL;
    235     GKI_shutdown ();
    236     resetConfig ();
    237     retval = 0;
    238     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    239     return retval;
    240 }
    241 
    242 
    243 int HaiOpen (const bcm2079x_dev_t* device, nfc_stack_callback_t* halCallbackFunc, nfc_stack_data_callback_t* halDataCallbackFunc)
    244 {
    245     ALOGD ("%s: enter", __FUNCTION__);
    246     int retval = EACCES;
    247 
    248     gAndroidHalCallback = halCallbackFunc;
    249     gAndroidHalDataCallback = halDataCallbackFunc;
    250 
    251     SyncEventGuard guard (gOpenCompletedEvent);
    252     HAL_NfcOpen (BroadcomHalCallback, BroadcomHalDataCallback);
    253     gOpenCompletedEvent.wait ();
    254 
    255     retval = 0;
    256     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    257     return retval;
    258 }
    259 
    260 
    261 void BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status)
    262 {
    263     ALOGD ("%s: enter; event=0x%X", __FUNCTION__, event);
    264     switch (event)
    265     {
    266     case HAL_NFC_OPEN_CPLT_EVT:
    267         {
    268             ALOGD ("%s: HAL_NFC_OPEN_CPLT_EVT; status=0x%X", __FUNCTION__, status);
    269             SyncEventGuard guard (gOpenCompletedEvent);
    270             gOpenCompletedEvent.notifyOne ();
    271             break;
    272         }
    273 
    274     case HAL_NFC_POST_INIT_CPLT_EVT:
    275         {
    276             ALOGD ("%s: HAL_NFC_POST_INIT_CPLT_EVT", __FUNCTION__);
    277             SyncEventGuard guard (gPostInitCompletedEvent);
    278             gPostInitCompletedEvent.notifyOne ();
    279             break;
    280         }
    281 
    282     case HAL_NFC_CLOSE_CPLT_EVT:
    283         {
    284             ALOGD ("%s: HAL_NFC_CLOSE_CPLT_EVT", __FUNCTION__);
    285             SyncEventGuard guard (gCloseCompletedEvent);
    286             gCloseCompletedEvent.notifyOne ();
    287             break;
    288         }
    289 
    290     case HAL_NFC_ERROR_EVT:
    291         {
    292             ALOGD ("%s: HAL_NFC_ERROR_EVT", __FUNCTION__);
    293             {
    294                 SyncEventGuard guard (gOpenCompletedEvent);
    295                 gOpenCompletedEvent.notifyOne ();
    296             }
    297             {
    298                 SyncEventGuard guard (gPostInitCompletedEvent);
    299                 gPostInitCompletedEvent.notifyOne ();
    300             }
    301             {
    302                 SyncEventGuard guard (gCloseCompletedEvent);
    303                 gCloseCompletedEvent.notifyOne ();
    304             }
    305             break;
    306         }
    307     }
    308     gAndroidHalCallback (event, status);
    309     ALOGD ("%s: exit; event=0x%X", __FUNCTION__, event);
    310 }
    311 
    312 
    313 void BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data)
    314 {
    315     ALOGD ("%s: enter; len=%u", __FUNCTION__, data_len);
    316     gAndroidHalDataCallback (data_len, p_data);
    317 }
    318 
    319 
    320 int HaiClose (const bcm2079x_dev_t* device)
    321 {
    322     ALOGD ("%s: enter", __FUNCTION__);
    323     int retval = EACCES;
    324 
    325     SyncEventGuard guard (gCloseCompletedEvent);
    326     HAL_NfcClose ();
    327     gCloseCompletedEvent.wait ();
    328     retval = 0;
    329     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    330     return retval;
    331 }
    332 
    333 
    334 int HaiCoreInitialized (const bcm2079x_dev_t* device, uint8_t* coreInitResponseParams)
    335 {
    336     ALOGD ("%s: enter", __FUNCTION__);
    337     int retval = EACCES;
    338 
    339     SyncEventGuard guard (gPostInitCompletedEvent);
    340     HAL_NfcCoreInitialized (coreInitResponseParams);
    341     gPostInitCompletedEvent.wait ();
    342     retval = 0;
    343     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    344     return retval;
    345 }
    346 
    347 
    348 int HaiWrite (const bcm2079x_dev_t* dev, uint16_t dataLen, const uint8_t* data)
    349 {
    350     ALOGD ("%s: enter; len=%u", __FUNCTION__, dataLen);
    351     int retval = EACCES;
    352 
    353     HAL_NfcWrite (dataLen, const_cast<UINT8*> (data));
    354     retval = 0;
    355     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    356     return retval;
    357 }
    358 
    359 
    360 int HaiPreDiscover (const bcm2079x_dev_t* device)
    361 {
    362     ALOGD ("%s: enter", __FUNCTION__);
    363     int retval = EACCES;
    364 
    365     // This function is a clear indication that the stack is initializing
    366     // EE.  So we can reset the cold-boot flag here.
    367     isColdBoot = false;
    368     retval = HAL_NfcPreDiscover () ? 1 : 0;
    369     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    370     return retval;
    371 }
    372 
    373 
    374 int HaiControlGranted (const bcm2079x_dev_t* device)
    375 {
    376     ALOGD ("%s: enter", __FUNCTION__);
    377     int retval = EACCES;
    378 
    379     HAL_NfcControlGranted ();
    380     retval = 0;
    381     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    382     return retval;
    383 }
    384 
    385 
    386 int HaiPowerCycle (const bcm2079x_dev_t* device)
    387 {
    388     ALOGD ("%s: enter", __FUNCTION__);
    389     int retval = EACCES;
    390 
    391     HAL_NfcPowerCycle ();
    392     retval = 0;
    393     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    394     return retval;
    395 }
    396 
    397 
    398 int HaiGetMaxNfcee (const bcm2079x_dev_t* device, uint8_t* maxNfcee)
    399 {
    400     ALOGD ("%s: enter", __FUNCTION__);
    401     int retval = EACCES;
    402 
    403     // This function is a clear indication that the stack is initializing
    404     // EE.  So we can reset the cold-boot flag here.
    405     isColdBoot = false;
    406 
    407     if ( maxNfcee )
    408     {
    409         *maxNfcee = HAL_NfcGetMaxNfcee ();
    410         ALOGD("%s: max_ee from HAL to use %d", __FUNCTION__, *maxNfcee);
    411         retval = 0;
    412     }
    413     ALOGD ("%s: exit %d", __FUNCTION__, retval);
    414     return retval;
    415 }
    416 
    417