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.

[参考译文] AM6421:勘误表 MCU Plus SDK 中的 i2409 分辨率

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1662887/am6421-errata-i2409-resolution-in-mcu-plus-sdk

器件型号: AM6421

您好:

我看到 Linux SDK 中已解决勘误表 i2409。  在我们的应用中、我们从 R5 内核和 FreeRTOS 运行 USB。  我在最新的 MCU Plus SDK 12.0 中搜索、没有发现类似的 i2409 修复已经实现。  如果是这种情况、请说明如何做到这一点、因为 MCU Plus SDK 中不存在类似的文件 (drd.h、drd.c、core.h、cdns3-ti.c)。

谢谢您、

Joe

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

    您好 Joe、

    是的、您回答正确。 权变措施序列未在当前 SDK 中实现。  

    在正常操作(复位后)期间、可以随时访问暂停驻留寄存器。 因此、需要小心访问它、以免影响控制器的正确运行。

     在由 SW 启用控制器以供操作之前、需要确保访问配置寄存器。 请 查找以下操作序列。

    1.接通电源
    2.控制器重置 inputs.de-asserted
    3、写暂停居住登记
    4.启用控制器以在器件模式下使用 DEVEN 位运行。

    我提供以下代码、用于  在 () 函数内 USB 复位释放后设置 SUSP_CTRL 寄存器的 SUSPEND_REATION_ENABLE 位、该函数在 ${MCU+SDK}/source/usb/cdn /usm/am64x_am243x/usb_wrapper.c 处找到 soc需要先设置该位、然后才会如上述序列中所述启用控制器以供 SW 操作。  (即在启用控制器以将 DEVEN 位用于器件模式运行之前)

    请找到以下代码以实施已发布勘误表的权变措施。

    static int32_t usbConfig(usb_init_param_t *usbInitParamsPtr)
    {
        uint32_t usbBaseRegs = 0;
        uint32_t usbCmnRegs = 0;
        uint32_t modeStrap = 0;
    
        usbBaseRegs = CSL_USB0_VBP2APB_WRAP_CONTROLLER_VBP_CORE_ADDR_MAP_BASE;
        usbCmnRegs = CSL_USB0_MMR_MMRVBP_USBSS_CMN_BASE;
    
        /* assert reset to the USB controller */
        usbss_reset_assert(&usb_handle);
    
        /* set the USB controller to host or device mode */
        if(usbInitParamsPtr->isHostMode == 1)
        {
           modeStrap =  MODESTRAP_SEL_HOST_MODE;
        }
        else
        {
           modeStrap =  MODESTRAP_SEL_DEVICE_MODE;
        }
    
        HW_WR_FIELD32(usbCmnRegs + CSL_USB3P0SS_CMN_USB3P0SS_W1,
                      CSL_USB3P0SS_CMN_USB3P0SS_W1_MODESTRAP, modeStrap);
    
        HW_WR_FIELD32(usbCmnRegs + CSL_USB3P0SS_CMN_USB3P0SS_W1,
                      CSL_USB3P0SS_CMN_USB3P0SS_W1_MODESTRAP_SEL,
                      MODESTRAP_USES_MODE_S_SEL);
    
        /* set to USB2.0 only if USB3.0 is not enabled. i.e SERDES is not used */
        HW_WR_FIELD32(usbCmnRegs + CSL_USB3P0SS_CMN_USB3P0SS_W1,
                      CSL_USB3P0SS_CMN_USB3P0SS_W1_USB2_ONLY_MODE, usbInitParamsPtr->usb2Enable);
    
        /* release reset */
        usbss_reset_release(&usb_handle);
    
        /* wait for Controller Not Ready to go 0 */
        while(HW_RD_FIELD32(usbBaseRegs + CSL_USB3P0SS_CTRL_DRD_OTGSTS,
            CSL_USB3P0SS_CTRL_DRD_OTGSTS_OTG_NRDY));
    
        /* setting suspend_residency_enable field in SUSP_CTRL to '1' */
        HW_WR_FIELD32(&usb_handle.p_usbregs_ctlr -> DRD.SUSP_CTRL, CSL_USB3P0SS_CTRL_DRD_SUSP_CTRL_SUSPEND_RESIDENCY_ENABLE, 0x1);
    
        /* for USB host, needs to wait for XHC_READY */
        if(usbInitParamsPtr->isHostMode == 1)
        {
            /* wait for Controller XHC_READY to go 1 */
            while(!HW_RD_FIELD32(usbBaseRegs + CSL_USB3P0SS_CTRL_DRD_OTGSTS,
                CSL_USB3P0SS_CTRL_DRD_OTGSTS_XHC_READY));
        } else {
            /* wait for Controller DEV_READY to go 1 */
            while(!HW_RD_FIELD32(usbBaseRegs + CSL_USB3P0SS_CTRL_DRD_OTGSTS,
                CSL_USB3P0SS_CTRL_DRD_OTGSTS_DEV_READY));
        }
    
        return 0;
    }

    此致、

    Tushar

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

    Tushar、

    非常感谢。  我们将尝试并返回报告。