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.

[参考译文] AM6442:使用多个 GPMC 区域时出现问题 (FYI 和 Fix)

Guru**** 2587345 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1576290/am6442-issue-using-multiple-gpmc-areas-fyi-and-fix

器件型号:AM6442
主题:SysConfig 中讨论的其他器件

工具/软件:

尝试将 GPMC 设置为 3 个不同区域、 CS0 上为 32 位 32Meg、CS1 上为 16 位 32Meg、CS2 上为 32 位 64Meg。  我只能使最后一个配置正常工作。  

由于 SysConfig 不允许根据需要进行配置、因此我创建了一个示例、然后使用它创建一个例程来支持这 3 个部分:

/************************************************************************ /

void Drivers_gpmcOpen (void){
  uint32_t instCnt;
  int32_t 状态= SystemP_Success;
  gpcm_init();

  GPMC_clockEnable ();
  GPMC_clockSetFrequency ();

  对于 (instCnt = 0u;instCnt < CONFIG_GPMC_NUM_instances;instCnt++){
    gGpmcHandle[instCnt]= NULL;/*初始化为 NULL 以便我们可以正常退出*/
  }

  /*打开所有实例*/
  对于 (instCnt = 0U;instCnt < gGpmcConfigNum;instCnt++){
    gGpmcHandle[instCnt]= GPMC_OPEN (instCnt、&gGpmcParams[instCnt]);
    if (NULL == gGpmcHandle[instCnt]){
      状态= SystemP_FAILURE;
      休息;
    }
    if (GPMC_setDeviceType (gGpmcHandle[instCnt])!= SystemP_Success){
      状态= SystemP_FAILURE;
      休息;
    }
    if (GPMC_setDeviceSize (gGpmcHandle[instCnt])!= SystemP_Success){
      状态= SystemP_FAILURE;
      休息;
    }
    if (GPMC_configureTimingParameters (gGpmcHandle[instCnt])!= SystemP_Success){
      状态= SystemP_FAILURE;
      休息;
    }
  }

  if (SystemP_FAILURE == status){
    drivers_gpmcClose ();/*正常退出*/
  }
  返回;
}

/************************************************************************ /

问题是,我只能得到最后一个项目的工作,如果我做了一次一个,这些部分工作,但做更多,只有最后一个工作. (无论顺序如何)。

在深入探究后、我发现 GPMC_OPEN 称为例程  

   静态 int32_t GPMC_PROGRAMInstance(GPMC_HANDLE 配置)

路由顶部是一个复位器件:

   /*重置 GPMC */
   CSL_REG32_fins (hwAttrs->gpmcBaseAddr + CSL_GPMC_SYSCONFIG、GPMC_SYSCONFIG_SOFTRESET、CSL_GPMC_GPMC_GPMC_SYSCONFIG_SOFTRESET_RESET);

   STATUS += GPMC_MODULEResetStatusWaitTimeout (CONFIG、GPMC_MODULE_RESET_WAIT_TIME_MAX);

因此、每次调用 GPMC_Open(对于 3 个实例我需要这样做)时、器件都会复位。

为了纠正这个问题、 我添加了一个静态标志、只允许在第一次调用时复位器件。

+     STATIC INT RESET_DONE = 0;  

  然后、在执行复位的 2 行代码周围、将替换为以下代码:

+       if (RESET_DONE == 0)   //仅在第一个实例时复位
+       {        
          /*重置 GPMC */
          CSL_REG32_fins (hwAttrs->gpmcBaseAddr + CSL_GPMC_SYSCONFIG、GPMC_SYSCONFIG_SOFTRESET、CSL_GPMC_GPMC_GPMC_SYSCONFIG_SOFTRESET_RESET);
          STATUS += GPMC_MODULEResetStatusWaitTimeout (CONFIG、GPMC_MODULE_RESET_WAIT_TIME_MAX);
+          RESET_DONE = 1;  
+      }  

这解决了问题、所有区域都能正常工作。

我发现的只是一个小的 FYI。

      

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

    在最新版本 MCU_PLUS_SDK_am64x_11_01_00_17 以及之前的 2 个版本中都有此更新。

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

    你好 Robert Morse ,

    在 MCU+ SDK 中、我们目前不支持同时配置多条片选 (CS) 线路。
    如果需要多条 CS 线路、则必须使用其各自的 CS 配置单独初始化每个 GPMC 实例。

    此外、在初始设置期间、只需执行一次 GPMC 复位。

    之后、您可以根据需要重新配置 CS 线路、而不重复复位。

    上述修复程序似乎正确。

    此致、

    Anil.

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

    是的、我知道 SysConfig 不支持该功能。  终端用户需要初始化这些段。  我之所以提出它、只是因为如果有人想要执行 多个区域、它需要他们编辑实际的 gmpc0 设备驱动程序。  虽然如果 TI 修复了该问题(即仅在首次复位器件)、但它对每个人都适用。   

    这只是更多的 FYI、也可能是对 GPMC 驱动程序的增强。

    Robert