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.

[参考译文] RTOS/EVMK2H:在器件模式下为 USB 注册的 ISR 被连续调用

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/656943/rtos-evmk2h-isr-registered-for-usb-in-device-mode-getting-invoked-continuously

器件型号:EVMK2H

工具/软件:TI-RTOS

您好!

我  有一个 K2EVM-HK 并在其中使用 TI RTOS。 我正在设备模式下处理 USB 驱动程序。 该板使用 dwc3 USB 控制器。

我已经为 USB_INT00注册了一个 ISR (USB 事件环0中断)。 当我将电路板连接到主机并获得适当的事件时、ISR 会被触发。 处理完所有事件后、即使没有事件、也会连续调用 ISR。

我读取 IRQ_STATUS_MAIN 寄存器并得到值为0、表示没有挂起的事件。 我还检查了 GEVNTCOUNT 寄存器、在这里、我再次看到该值为0、表示没有事件。

下面是我的 ISR 的代码流

/*禁用中断*/

HW_WR_REG32 (IRQ_ENABLE_CLR_MAIN (0)、0x1U);

/*读取主中断状态的值*/
uint32_t regVal = HW_RD_REG32 (IRQ_STATUS_MAIN (0x0U));

/*调用设备中断处理程序*/
USBDwcDcdIntrHandler();

/*清除发生的中断*/
HW_WR_REG32 (IRQ_STATUS_MAIN (0x0U)、regVal);

/*再次启用 IRQ */
HW_WR_REG32 (IRQ_ENABLE_SET_MAIN (0)、0x1U);

/* IRQ 结束*/
HW_WR_REG32 (IRQ_EOI_MAIN、0x1U);

我已在 K2G 板上以及作为 PDK 一部分的 USB 驱动程序上验证了这种行为。

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

    这是哪个版本的 RTOS SDK?

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

    我的 RTOS 版本为6.46.05.55、K2G 的 PDK 版本为1.0.7、K2H 的 PDK 版本为4.0.7

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

    您能不能澄清一下您的 USB RTOS 驱动程序、我们只在 K2G 器件上提供它、如何获取它并在 K2H 上进行测试?

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

    尊敬的 Eric:

    我正在尝试为 K2H 移植它。 但我在 K2G 上观察到了同样的问题。

    此致、

    Krishna

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

    如果在 K2G 上看到问题、您能否提供详细信息? 例如、什么 K2G 测试示例和步骤如何重现?

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

    尊敬的 Eric:

    我在 K2G 板上以器件模式示例(USB_DevMsc_evmK2G_armExampleProject)运行 USB 大容量存储。

    以下是重现此问题的步骤:

    • 使用 CCS 启动程序。
    • 将器件连接到主机并让枚举完成。
    • 暂停程序并在中断处理程序上放置一个断点。
    • 观察到事件计数为零、ISR 不执行任何操作就会返回。
    • 这一进程不断重复。

    此致、

    Krishna

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

    您甚至可以在一段时间后断开电路板与主机的连接、但仍然会连续调用 ISR、而无需处理任何事件。

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

    很抱歉迟到了! 您是说 usbCoreIntraHandler --> usbDwcDcdCoreIntraHandler 被连续调用,哪个事件计数为零? 对于 K2G、您是否有主机 PC 枚举的 MSC 设备、或者它是未知的 USB 设备?

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

    尊敬的 Eric:

    是的、没错。  usbCoreInterHandler -->即使 事件计数为零,也会连续调用 usbDwcDcdCoreInterHandler。 我使用主机作为 Windows 10 Desktop。

    此致、

    Krishna

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

    感谢您确认! 我为此开了一个 TT、并将在修复后告知您。

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

    您好、Krishna、

    感谢您给我们写这个问题。

    我们已复制此问题并找到此问题的解决方法。 是否可以尝试将函数 usbDwcDcdCoreInter()的内容替换为以下内容:

    具有 USB 包装程序设置的 DWC 内核中断处理程序的主入口点*/
    void usbDwcDcdCoreInterHandler (uint32_t intrId、uint32_t CPUID、void* pUserParam)
    {
       usbDwcDcdDevice_t* dwc3;

       dwc3 =(usbDwcDcdDevice_t*) pUserParam;

       /*禁用中断*/
       HW_WR_REG32 (dwc3->wrapperAddr + CSL_USB3SS_IRQ_ENABLE_CLR_MAIN (0)、0x1U);

       /*读取主中断状态的值
        如果 ENABLE_CLR_MAIN 被置位、则清除* IRQ_STATUS_MAIN
        *
       uint32_t regVal = hw_RD_REG32 (dwc3->wrapperAddr + CSL_USB3SS_IRQ_STATUS_RAW_MAIN (0x0U));

       /*
        *清除发生的中断
        *   这必须在 DWC 内核中断处理程序之前完成
        *
        * Kepler/Lamarr/Edion/Galileo DWC 中断是器件模式下的电平中断
        但主机模式下的脉冲中断。
        *
        *对于处于器件模式的 K2器件、我们必须先写入 IRQ_STATUS_MAIN
        *清除 DWC 中断(gEventCount)
        *
        *
       HW_WR_REG32 (dwc3->wrapperAddr + CSL_USB3SS_IRQ_STATUS_MAIN (0x0U)、regVal);

       /*调用 DWC 设备模式中断处理程序*/
       USBDwcDcdIntrHandler ((usbDwcDcdDevice_t *) pUserParam);

       /*再次启用 IRQ */
       HW_WR_REG32 (dwc3->wrapperAddr + CSL_USB3SS_IRQ_ENABLE_SET_MAIN (0)、0x1U);

       /* IRQ 结束*/
       HW_WR_REG32 (dwc3->wrapperAddr + CSL_USB3SS_IRQ_EOI_MAIN、0x1U);
    }

     

    基本来说、修复方法是在调用 DWC 中断处理程序之前读取 IRQ_STATUS_RAW 并将值写入 IRQ_STATUS。

     

    请告诉我们这是否能解决您的问题

     

    此致

    Thanh