【问题标题】:1-Byte response issue in transceive function in Broadcom NFC Android stackBroadcom NFC Android 堆栈中的收发功能中的 1 字节响应问题
【发布时间】:2013-10-01 11:49:12
【问题描述】:

我正在使用 NFC 标签类型 2。在调用运行 Broadcom NFC Android 堆栈的 transceive() 函数时,我遇到了 1 字节 ACK/NACK 响应的问题。 NXP NFC Android 堆栈不会发生此问题。例如,写入命令的 ACK 响应定义为 0xAh(根据 NFC Forum Tag Type 2 协议)。如果 NFC 标签回复其他内容而不是 0xAh,Broadcom NFC 堆栈会将其视为 NACK。 NXP NFC 堆栈中不会出现此问题。

Broadcom NFC 堆栈

在 /platform/packages/apps/Nfc/nci/jni/NativeNfcTag.cpp
在函数“nativeNfcTag_doTransceive()”第 890 行

static jbyteArray nativeNfcTag_doTransceive (JNIEnv* e, jobject, jbyteArray data, jboolean raw, jintArray statusTargetLost)
    {
    ..
    ..
    if ((natTag.getProtocol () == NFA_PROTOCOL_T2T) &&
                natTag.isT2tNackResponse (sTransceiveData, sTransceiveDataLen))
            {
                isNack = true;
            }

            if (sTransceiveDataLen)
            {
                if (!isNack) {
                    // marshall data to java for return
                    result.reset(e->NewByteArray(sTransceiveDataLen));
                    if (result.get() != NULL) {
                        e->SetByteArrayRegion(result.get(), 0, sTransceiveDataLen, (jbyte *) sTransceiveData);
                    }
                    else
                        ALOGE ("%s: Failed to allocate java byte array", __FUNCTION__);
                } // else a nack is treated as a transceive failure to the upper layers

                free (sTransceiveData);
                sTransceiveData = NULL;
                sTransceiveDataLen = 0;
            }
       ..
       ..
}

当我们查看 /platform/packages/apps/Nfc/nci/jni/NfcTag.cpp 第 1212 行中的函数 isT2tNackResponse() 时

    bool NfcTag::isT2tNackResponse (const UINT8* response, UINT32 responseLen)
    {
        static const char fn [] = "NfcTag::isT2tNackResponse";
        bool isNack = false;

        if (responseLen == 1)
        {
            if (response[0] == 0xA) // line 1212: T2tNackResponse always returns NACK if the first byte is NOT 0xA 
                isNack = false; //an ACK response, so definitely not a NACK
            else
                isNack = true; //assume every value is a NACK
        }
        ALOGD ("%s: return %u", fn, isNack);
        return isNack;
}

NXP NFC 堆栈

NXP NFC 堆栈中的相同功能 在 /platform/packages/apps/Nfc/nxp/jni/com_android_nfc_NativeNfcTag.cpp
在函数“com_android_nfc_NativeNfcTag_doTransceive()”第 853 行

static jbyteArray com_android_nfc_NativeNfcTag_doTransceive(JNIEnv *e,
   jobject o, jbyteArray data, jboolean raw, jintArray statusTargetLost)
{

..
..
/* Copy results back to Java *
     * In case of NfcA and raw, also check the CRC in the response
     * and cut it off in the returned data.
     */
    if ((nfc_jni_transceive_buffer->length > 2) && checkResponseCrc) { // line 853
        if (crc_valid(nfc_jni_transceive_buffer->buffer, nfc_jni_transceive_buffer->length)) {
            result = e->NewByteArray(nfc_jni_transceive_buffer->length - 2);
            if (result != NULL) {
                e->SetByteArrayRegion(result, 0,
                 nfc_jni_transceive_buffer->length - 2,
                 (jbyte *)nfc_jni_transceive_buffer->buffer);
            }
        }
    } else {
        result = e->NewByteArray(nfc_jni_transceive_buffer->length);
        if (result != NULL) {
            e->SetByteArrayRegion(result, 0,
             nfc_jni_transceive_buffer->length,
             (jbyte *)nfc_jni_transceive_buffer->buffer);
        }
    }
..
..
}

在 NXP NFC 堆栈中,所有内容都被转发到 Java 并返回到 transceive() 函数。

任何帮助/评论将不胜感激。谢谢。

【问题讨论】:

    标签: android nfc broadcom


    【解决方案1】:

    这是一个已知问题。问题实际上出在 Broadcom 堆栈所基于的 NFC 论坛 NCI 标准上。 NCI 标准中的协议消息不区分 4 位 ACK/NAK 响应和 1 字节的正常响应(+ CRC,被剥离)。两者都由一个字节表示。 Broadcom 堆栈(必须)将它们解释为 ACK/NAK。希望这将很快在标准和软件堆栈的更新中得到修复。

    【讨论】:

    • 谢谢你,NFC 家伙。我希望这会很快发生。
    【解决方案2】:

    这是否仅适用于 NFC 论坛标签类型 2?在代码中,其他标签类型似乎不受此影响。标签类型 3,4 和 NfcV 的 1 字节原始数据不会被过滤。我没有关注 NFC 论坛中的讨论。我们需要区分 4 位响应和 1 字节数据的主要原因是什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      相关资源
      最近更新 更多