Beispiel #1
0
void testNfc(int readNdefMessages)
{
    printf("Starting test_nfc.\n");

    const hw_module_t *hwModule = 0;
    nfc_pn544_device_t *nfcDevice = 0;

    printf("Finding NFC hardware module.\n");
    hw_get_module(NFC_HARDWARE_MODULE_ID, &hwModule);
    assert(hwModule != NULL);

    printf("Opening NFC device.\n");
    assert(nfc_pn544_open(hwModule, &nfcDevice) == 0);
    assert(nfcDevice != 0);

    assert(nfcDevice->num_eeprom_settings != 0);
    assert(nfcDevice->eeprom_settings);

    printf("Configuring NFC driver.\n");
    phLibNfc_sConfig_t driverConfig;
    driverConfig.nClientId = phDal4Nfc_msgget(0, 0600);
    assert(driverConfig.nClientId);

    void *hwRef;
    NFCSTATUS status = phLibNfc_Mgt_ConfigureDriver(&driverConfig, &hwRef);
    assert(hwRef);
    assert(status == NFCSTATUS_SUCCESS);

    pthread_t messageThread = createMessageThread(&driverConfig.nClientId);

    printf("Initializing NFC stack.\n");
    NFCSTATUS callbackStatus = 0xFFFF;
    status = phLibNfc_Mgt_Initialize(hwRef, initializeCallback, &callbackStatus);
    assert(status == NFCSTATUS_PENDING);

    pthread_mutex_lock(&mut);
    while (callbackStatus == 0xFFFF)
        pthread_cond_wait(&cond, &mut);
    pthread_mutex_unlock(&mut);

    assert(callbackStatus == NFCSTATUS_SUCCESS);

    printf("Getting NFC stack capabilities.\n");
    phLibNfc_StackCapabilities_t capabilities;
    status = phLibNfc_Mgt_GetstackCapabilities(&capabilities, &callbackStatus);
    assert(status == NFCSTATUS_SUCCESS);

    printf("NFC capabilities:\n"
           "\tHAL version: %u\n"
           "\tFW version: %u\n"
           "\tHW version: %u\n"
           "\tModel: %u\n"
           "\tHCI version: %u\n"
           "\tVendor: %s\n"
           "\tFull version: %u %u\n"
           "\tFW Update: %u\n",
           capabilities.psDevCapabilities.hal_version, capabilities.psDevCapabilities.fw_version,
           capabilities.psDevCapabilities.hw_version, capabilities.psDevCapabilities.model_id,
           capabilities.psDevCapabilities.hci_version,
           capabilities.psDevCapabilities.vendor_name,
           capabilities.psDevCapabilities.full_version[NXP_FULL_VERSION_LEN-1],
           capabilities.psDevCapabilities.full_version[NXP_FULL_VERSION_LEN-2],
           capabilities.psDevCapabilities.firmware_update_info);

    if (readNdefMessages) {
        /* Start tag discovery */
        phLibNfc_Registry_Info_t registryInfo;

        registryInfo.MifareUL = 1;
        registryInfo.MifareStd = 1;
        registryInfo.ISO14443_4A = 1;
        registryInfo.ISO14443_4B = 1;
        registryInfo.Jewel = 1;
        registryInfo.Felica = 1;
        registryInfo.NFC = 1;
        registryInfo.ISO15693 = 1;

        int context;
        status = phLibNfc_RemoteDev_NtfRegister(&registryInfo, discoveryNotificationCallback, &context);
        assert(status == NFCSTATUS_SUCCESS);

        phLibNfc_sADD_Cfg_t discoveryConfig;
        discoveryConfig.NfcIP_Mode = phNfc_eP2P_ALL;
#if (ANDROID_VERSION_MAJOR == 4 && ANDROID_VERSION_MINOR >= 1) || (ANDROID_VERSION_MAJOR >= 5)
        discoveryConfig.NfcIP_Target_Mode = 0x0E;
#endif
        discoveryConfig.Duration = 300000;
        discoveryConfig.NfcIP_Tgt_Disable = 0;
        discoveryConfig.PollDevInfo.PollCfgInfo.EnableIso14443A = 1;
        discoveryConfig.PollDevInfo.PollCfgInfo.EnableIso14443B = 1;
        discoveryConfig.PollDevInfo.PollCfgInfo.EnableFelica212 = 1;
        discoveryConfig.PollDevInfo.PollCfgInfo.EnableFelica424 = 1;
        discoveryConfig.PollDevInfo.PollCfgInfo.EnableIso15693 = 1;
        discoveryConfig.PollDevInfo.PollCfgInfo.EnableNfcActive = 1;
        discoveryConfig.PollDevInfo.PollCfgInfo.DisableCardEmulation = 1;

        targetStatus = 0xFFFF;
        status = phLibNfc_Mgt_ConfigureDiscovery(NFC_DISCOVERY_CONFIG, discoveryConfig,
                                                 discoveryCallback, &context);

        for (;;) {
            pthread_mutex_lock(&mut);
            while (targetStatus == 0xFFFF)
                pthread_cond_wait(&cond, &mut);
            pthread_mutex_unlock(&mut);

            fprintf(stderr, "Discovered %d targets\n", numberOfDiscoveredTargets);
            if (numberOfDiscoveredTargets > 0) {
                targetStatus = 0xFFFF;
                status = phLibNfc_RemoteDev_Connect(discoveredTargets[0].hTargetDev,
                        remoteDevConnectCallback, &context);
                if (status == NFCSTATUS_PENDING) {
                    pthread_mutex_lock(&mut);
                    while (targetStatus == 0xFFFF)
                        pthread_cond_wait(&cond, &mut);
                    pthread_mutex_unlock(&mut);

                    if (targetStatus == NFCSTATUS_SUCCESS) {
                        targetStatus = 0xFFFF;
                        status = phLibNfc_Ndef_CheckNdef(discoveredTargets[0].hTargetDev,
                                remoteDevNdefReadCheckCallback, &context);

                        pthread_mutex_lock(&mut);
                        while (targetStatus == 0xFFFF)
                            pthread_cond_wait(&cond, &mut);
                        pthread_mutex_unlock(&mut);

                        if (targetStatus == NFCSTATUS_SUCCESS &&
                            (ndefInfo.NdefCardState == PHLIBNFC_NDEF_CARD_READ_WRITE ||
                             ndefInfo.NdefCardState == PHLIBNFC_NDEF_CARD_READ_ONLY)) {
                            phLibNfc_Data_t ndefBuffer;
                            ndefBuffer.length = ndefInfo.MaxNdefMsgLength;
                            ndefBuffer.buffer = malloc(ndefBuffer.length);

                            targetStatus = 0xFFFF;
                            status = phLibNfc_Ndef_Read(discoveredTargets[0].hTargetDev, &ndefBuffer,
                                    phLibNfc_Ndef_EBegin, remoteDevNdefReadCallback, &context);

                            pthread_mutex_lock(&mut);
                            while (targetStatus == 0xFFFF)
                                pthread_cond_wait(&cond, &mut);
                            pthread_mutex_unlock(&mut);

                            if (targetStatus == NFCSTATUS_SUCCESS) {
                                int i;
                                fprintf(stderr, "NDEF: ");
                                for (i = 0; i < ndefBuffer.length; ++i)
                                    fprintf(stderr, "%02x", ndefBuffer.buffer[i]);
                                fprintf(stderr, "\n");
                            }

                            free(ndefBuffer.buffer);
                        }
                    }
                }
            }

            if (status == NFCSTATUS_FAILED) {
                fprintf(stderr, "Failed to connect to remote device\n");
                break;
            }

            targetStatus = 0xFFFF;
            status = phLibNfc_Mgt_ConfigureDiscovery(NFC_DISCOVERY_RESUME, discoveryConfig,
                                                     discoveryCallback, &context);
            assert(status == NFCSTATUS_SUCCESS || status == NFCSTATUS_PENDING);
        }
    }

    printf("Deinitializing NFC stack.\n");
    callbackStatus = 0xFFFF;
    status = phLibNfc_Mgt_DeInitialize(hwRef, initializeCallback, &callbackStatus);
    assert(status == NFCSTATUS_PENDING);

    pthread_mutex_lock(&mut);
    while (callbackStatus == 0xFFFF)
        pthread_cond_wait(&cond, &mut);
    pthread_mutex_unlock(&mut);

    assert(callbackStatus == NFCSTATUS_SUCCESS);

    terminateMessageThread(driverConfig.nClientId);
    pthread_join(messageThread, NULL);

    printf("Unconfiguring NFC driver.\n");
    status = phLibNfc_Mgt_UnConfigureDriver(hwRef);
    assert(status == NFCSTATUS_SUCCESS);

    int result = phDal4Nfc_msgctl(driverConfig.nClientId, 0, 0);
    assert(result == 0);

    printf("Closing NFC device.\n");
    nfc_pn544_close(nfcDevice);
}
/*******************************************************************************
 **
 ** Function         phNxpNciHal_TestMode_open
 **
 ** Description      It opens the physical connection with NFCC (pn547) and
 **                  creates required client thread for operation.
 **
 ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
 **
 *******************************************************************************/
NFCSTATUS phNxpNciHal_TestMode_open (void)
{
    /* Thread */
    pthread_t test_rx_thread;

    phOsalNfc_Config_t tOsalConfig;
    phTmlNfc_Config_t tTmlConfig;
    NFCSTATUS status = NFCSTATUS_SUCCESS;
    uint16_t read_len = 255;

    /* initialize trace level */
    phNxpLog_InitializeLogLevel();

    if (phNxpNciHal_init_monitor() == NULL)
    {
        NXPLOG_NCIHAL_E("Init monitor failed");
        return NFCSTATUS_FAILED;
    }

    CONCURRENCY_LOCK();

    memset(&tOsalConfig, 0x00, sizeof(tOsalConfig));
    memset(&tTmlConfig, 0x00, sizeof(tTmlConfig));

    gDrvCfg.nClientId = phDal4Nfc_msgget(0, 0600);
    gDrvCfg.nLinkType = ENUM_LINK_TYPE_I2C;/* For PN547 */
    tTmlConfig.pDevName = (int8_t *) "/dev/pn544";
    tOsalConfig.dwCallbackThreadId = (uint32_t) gDrvCfg.nClientId;
    tOsalConfig.pLogFile = NULL;
    tTmlConfig.dwGetMsgThreadId = (uint32_t) gDrvCfg.nClientId;
    nxpncihal_ctrl.gDrvCfg.nClientId = (uint32_t) gDrvCfg.nClientId;

    /* Initialize TML layer */
    status = phTmlNfc_Init(&tTmlConfig);
    if (status != NFCSTATUS_SUCCESS)
    {
        NXPLOG_NCIHAL_E("phTmlNfc_Init Failed");
        goto clean_and_return;
    }

    if (pthread_create(&test_rx_thread, NULL,
            phNxpNciHal_test_rx_thread, NULL) != 0)
    {
        NXPLOG_NCIHAL_E("pthread_create failed");
        phTmlNfc_Shutdown();
        goto clean_and_return;
    }

    timeoutTimerId = phOsalNfc_Timer_Create();

    if(timeoutTimerId == 0xFFFF)
    {
        NXPLOG_NCIHAL_E("phOsalNfc_Timer_Create failed");
    }
    else
    {
        NXPLOG_NCIHAL_D("phOsalNfc_Timer_Create SUCCESS");
    }
    CONCURRENCY_UNLOCK();

    return NFCSTATUS_SUCCESS;

clean_and_return:
    CONCURRENCY_UNLOCK();
    phNxpNciHal_cleanup_monitor();
    return NFCSTATUS_FAILED;
}