This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-AM243:USB_TestMode

Guru**** 2557070 points
Other Parts Discussed in Thread: LP-AM243

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1524317/lp-am243-usb_testmode

器件型号:LP-AM243


工具/软件:

我在 LP-AM243 上运行 cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang 工程。

如何检查 USB 测试模式 (TEST_J、TEST_K、TEST_packet、SE0_NAK)?

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    要测试应用程序、请将 AM243x LP 上的 J10 连接到 USB 主机 (Windows/Linux)。  可以使用 Windows 上的设备管理器显示两个枚举的 COM 端口。

      有关详细信息、请参阅 examples_usb_cc_echo。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    感谢您的答复。

    我能够在 Windows PC 上与 COM 端口通信。

    但是、我要做的是输出 USB 合规性测试的波形。  (TEST_J、TEST_K、TEST_packet、SE0_NAK)

    是否有办法做到这一点?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    您可以检查  handleFeatureRecDevTest 适用于上述用例的 API。

    此 API 可在上找到 ${MCU+SDK}/source/usb/cdn/core_driver/device、src、cusbd.c 添加到工程。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    感谢您的答复。

    我尝试在 CDC 收到特定字符串时调用 API。

    似乎正在写入 USBR_CMD 寄存器、但 D+ D-信号没有变化。

    是否有可以确认 API 正确使用的样片?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    但 D+ D-信号没有变化。

    您能告诉我们如何探测这些信号吗?

    是否有可确认 API 正确使用的示例?

    SDK 或驱动程序中没有用于确认其使用情况的示例代码。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    您能告诉您如何探测此信号吗?

    我使用示波器测量了这些信号。

    我还确认、在写入 USBR_CMD 寄存器后、CDC 会继续运行。 (即使写入 SE0_NAK 时也是如此)

    SDK 中没有用于确认其用法的示例代码或驱动程序。

    好的、假设除了调用 handleFeatureRecDevTest 之外不需要其他操作、我是否正确?

    此致、

    本笃史

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    好的、假设除了调用 handleFeatureRecDevTest 之外不需要其他操作、我是否正确?

    是的、这是 USB 器件处于测试模式时需要调用的函数。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    我还确认 CDC 在写入 USBR_CMD 寄存器后继续运行。 (即使写入 SE0_NAK 时也是如此)

    通过调用 handleFeatureRecDevTest API、我看不到芯片行为的任何变化、是否真的不需要任何其他操作?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    仅通过调用 handleFeatureRecDevTest API 我看不到芯片行为的任何变化、是否真的不需要任何其他操作

    您如何调用此函数?

    您向 USBR_CMD 寄存器写入了什么值?

    是否可以使用传递的值共享 handleFeatureRecDevTest 调用的虚拟代码片段?

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    这些是我添加的虚拟代码。

    cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang/cc_echo_freertos.c
    156-175 号线

            {
                extern void dcd_testmodeCheck(int test_selector);
                switch (buf[i])
                {
                case 'a':
                    dcd_testmodeCheck(1);
                    break;
                case 'b':
                    dcd_testmodeCheck(2);
                    break;
                case 'c':
                    dcd_testmodeCheck(3);
                    break;
                case 'd':
                    dcd_testmodeCheck(4);
                    break;
                default:
                    break;
                }
            }

    cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang\usb\tinyusb\portable\am64x_am243x\dcd.c
    第 523-532 行

    void dcd_testmodeCheck(int test_selector)
    {
        extern void testmodeCheck(CUSBD_PrivateData* pD, int test_Selector);
        testmodeCheck(usb_handle.pD, test_selector);
    }

    cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang/usb/cdn/core_drivers/device/cusbd.c src
    2466-2471 号线

    void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
    {
        CH9_UsbSetup setup;
        setup.wIndex = (test_selector & 0xFF) << 8;
        handleFeatureRecDevTest(dev, &setup);
    }

    此致、

    本笃史

    e2e.ti.com/.../cdc_5F00_echo_5F00_freertos.ce2e.ti.com/.../dcd.ce2e.ti.com/.../cusbd.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Motofumi、

    感谢您分享以上详细信息。 请留出一些时间来审核并回复。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    上述代码看起来正常。  

    请在将 USB_CMD.STMODE[9]位值设置为 1 后重试一次、然后调用 handleFeatureRecDevTest API。 请告知我们结果。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    感谢您发送编修。

    我尝试了以下两种模式,也没有看到任何变化。

    ① 按顺序写入 STMODE 和 TMODE_SEL

    void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
    {
        CH9_UsbSetup setup;
        setup.wIndex = (test_selector & 0xFF) << 8;
        CPS_UncachedWrite32(&dev->reg->USBR_CMD, 1U << 9);
        handleFeatureRecDevTest(dev, &setup);
    }

    ②Write STMODE 和 TMODE_SEL

    static uint32_t handleFeatureRecDevTest(CUSBD_PrivateData * dev, const CH9_UsbSetup *ctrl) {
    
        uint32_t wIndex = ctrl->wIndex;
        uint32_t ret = CDN_EOK;
    
        if ((wIndex & 0xffU) != 0U) {
            ret = CDN_EINVAL;
        }
    
        if (ret == CDN_EOK) {
            uint8_t test_selector = (uint8_t) ((ctrl->wIndex >> 8) & 0x00FFU);
            uint32_t regSelec = 1U << 9;
            switch (test_selector) {
    
            /* TEST J */
            case CH9_TEST_J:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_TEST_J);
                break;
    
            /*test K*/
            case CH9_TEST_K:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_TEST_K);
                break;
    
            /*test se0_NAK*/
            case CH9_TEST_SE0_NAK:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_SE0_NAK);
                break;
    
            /* packet test */
            case CH9_TEST_PACKET:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_TEST_PACKET);
                break;
    
            case CH9_TEST_FORCE_EN:
                break;
    
            default:;
                break;
            }
            CPS_UncachedWrite32(&dev->reg->USBR_CMD, regSelec);
        }
        return ret;
    }

    此致、

    本笃史

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    我尝试了以下两种模式、但两种模式都没有变化。

    您是否还可以尝试设置以下值并进行一次检查?

    bmRequestType = CH9_USB_REQ_RECIPIENT_DEVICE
    wValue = CH9_USB_FS_TEST_MODE
    bRequest = CH9_USB_REQ_SET_FEATURE
    

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    以下实施是否正确?
    我重新检查了这个、没有看到任何变化。

    void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
    {
        CH9_UsbSetup setup;
        setup.wIndex = (test_selector & 0xFF) << 8;
        setup.bmRequestType = CH9_USB_REQ_RECIPIENT_DEVICE;
        setup.wValue = CH9_USB_FS_TEST_MODE;
        setup.bRequest = CH9_USB_REQ_SET_FEATURE;
        CPS_UncachedWrite32(&dev->reg->USBR_CMD, 1U << 9);
        handleFeatureRecDevTest(dev, &setup);
    }

    此致、

    本笃史

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    我已经解决了这个问题。

    修改如下。

    1. 在收到 Set Configuration 时调用 setConfigStateAddressed API。 (在样本中不调用,因为启用了 TINYUSB_INTEGRITY。)

    2. 同时写入 STMODE 和 TMODE_SEL。

    感谢您的支持!

    此致、

    本笃史

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    感谢您的更新。 很高兴听到您能够解决该问题。

    能否说明您正在从哪个 API 调用此  setConfigStateAddressed 函数?

    您的代码现在看起来像下面的代码片段吗?

    void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
    {
        CH9_UsbSetup setup;
        setup.wIndex = (test_selector & 0xFF) << 8;
        setup.bmRequestType = CH9_USB_REQ_RECIPIENT_DEVICE;
        setup.wValue = CH9_USB_FS_TEST_MODE;
        setup.bRequest = CH9_USB_REQ_SET_FEATURE;
        CPS_UncachedWrite32(&dev->reg->USBR_CMD, 1U << 9);
        setConfigStateAddressed(dev, setup, test_selector);
        handleFeatureRecDevTest(dev, &setup);
    }

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    这是我的代码。

    1. 我已经停止使用 CDC 数据作为触发器。 (在接收设置配置时调用 setConfigStateAddressed)

    2. 添加了检测 handleEp0IrqSetup 函数中 CH9_USB_REQ_SET_CONFIGURATION 的处理以调用 setConfigStateAddressed 和 testmodeCheck。

        if (ctrl.bRequest == CH9_USB_REQ_SET_CONFIGURATION)
        {
            setConfigStateAddressed(dev, &ctrl, ctrl.wValue & 0xFF);
            testmodeCheck(dev, 1);
        }

     3.要同时写入 TMODE_SEL 和 STMODE、围绕测试模式的实现如下所示

    static uint32_t handleFeatureRecDevTest(CUSBD_PrivateData * dev, const CH9_UsbSetup *ctrl) {
    
        uint32_t wIndex = ctrl->wIndex;
        uint32_t ret = CDN_EOK;
    
        if ((wIndex & 0xffU) != 0U) {
            ret = CDN_EINVAL;
        }
    
        if (ret == CDN_EOK) {
            uint8_t test_selector = (uint8_t) ((ctrl->wIndex >> 8) & 0x00FFU);
            uint32_t regSelec = 1U << 9;
            switch (test_selector) {
    
            /* TEST J */
            case CH9_TEST_J:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_TEST_J);
                break;
    
            /*test K*/
            case CH9_TEST_K:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_TEST_K);
                break;
    
            /*test se0_NAK*/
            case CH9_TEST_SE0_NAK:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_SE0_NAK);
                break;
    
            /* packet test */
            case CH9_TEST_PACKET:
                SET_USB_CMD_TMODE_SEL(&regSelec, USBRV_TM_TEST_PACKET);
                break;
    
            case CH9_TEST_FORCE_EN:
                break;
    
            default:;
                break;
            }
            CPS_UncachedWrite32(&dev->reg->USBR_CMD, regSelec);
        }
        return ret;
    }
    
    void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
    {
        CH9_UsbSetup setup;
        setup.wIndex = (test_selector & 0xFF) << 8;
        setup.bmRequestType = CH9_USB_REQ_RECIPIENT_DEVICE;
        setup.wValue = CH9_USB_FS_TEST_MODE;
        setup.bRequest = CH9_USB_REQ_SET_FEATURE;
    
        handleFeatureRecDevTest(dev, &setup);
    }

    此致、

    本笃史

    e2e.ti.com/.../1222.cusbd.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Motofumi、

    感谢您提供上述详细信息。 非常感谢。

    此致、

    Tushar