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.

[参考译文] TDA4VM:如何通过 TISCI API?改变 R5F 内核的频率

Guru**** 2465890 points
Other Parts Discussed in Thread: TDA4VM, J721EXSOMXEVM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1474826/tda4vm-how-to-change-the-frequency-of-the-r5f-core-through-the-tisci-api

器件型号:TDA4VM

工具与软件:

您好!

我想通过 TISCI API 修改 TDA4VM 上 R5F 内核的工作频率、请参阅相关常见问题解答(8.8. 常见问题-如何 在 SDK 中设置给定模块和时钟的时钟,并尝试编写类似的程序,但我失败了。

例如、我考虑将 MCU 域上 R5F Core1的工作频率设置为800MHz、并且根据常见问题解答中的示例、我编写了以下程序:

// check freq of MCU_R5FSS0_CORE1
uint64_t currentFreq = 0;
get_status = Sciclient_pmGetModuleClkFreq(
                                TISCI_DEV_MCU_R5FSS0_CORE1, 
                                TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK,
                                &currentFreq, 
                                SCICLIENT_SERVICE_WAIT_FOREVER);
// 800MHZ
uint64_t reqFreqHz = 800000000;
uint64_t respFreqHz = 0;
// query 800MHZ 
query_status = Sciclient_pmQueryModuleClkFreq(
  								TISCI_DEV_MCU_R5FSS0_CORE1, 
    							TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK,
    							reqFreqHz,
								&respFreqHz, 
    							SCICLIENT_SERVICE_WAIT_FOREVER);
// set 800MHZ
set_status = Sciclient_pmSetModuleClkFreq(
                                TISCI_DEV_MCU_R5FSS0_CORE1, 
                                TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK,
                                800000000,
                                TISCI_MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE,
                                SCICLIENT_SERVICE_WAIT_FOREVER);
// check set result
checkFreq = 0;
check_status = Sciclient_pmGetModuleClkFreq(
                                TISCI_DEV_MCU_R5FSS0_CORE1, 
                                TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK,
                                &checkFreq, 
                                SCICLIENT_SERVICE_WAIT_FOREVER);

运行程序后、我得到以下返回值:

get_status = CSL_PASS;
// 1 GHZ
currentFreq = 1000000000; 

query_status = CSL_PASS;
respFreqHz = 0;

set_status = CSL_EFAIL;

显然、上述程序没有成功地将  MCU 域上的 R5F Core1工作频率设置为800MHz、但我不确定原因。

我的问题是 :我应该如何写我的程序,以适当地调整  R5F 的工作频率?

我的测试环境如下所示:

硬件:

软件 SDK 版本:

我通过 CCS 调试程序、首先在 mcu1_0上运行 sciserver 程序、然后在 mcu1_1上运行我的程序。

完整代码如下所示:

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <ti/csl/arch/csl_arch.h>
#include <ti/csl/hw_types.h>
#include <ti/csl/soc.h>
#include <ti/drv/sciclient/examples/common/sci_app_common.h>
#include <ti/drv/sciclient/sciclient.h>
#include <ti/drv/sciclient/soc/sysfw/include/j721e/tisci_clocks.h>
#include <ti/drv/sciclient/soc/sysfw/include/j721e/tisci_devices.h>


int main(void) {
  SciApp_consoleInit();
  Sciclient_ConfigPrms_t config = {SCICLIENT_SERVICE_OPERATION_MODE_POLLED,
                                   NULL};
  int32_t status = CSL_PASS;
  status = Sciclient_init(&config);
  if (status != CSL_PASS) {
    SciApp_printf("SCIClient Init Failed\nstatus: %d", status);
    return 0;
  }

  uint64_t currentFreq = 0;
  int32_t get_status = CSL_PASS;
  get_status = Sciclient_pmGetModuleClkFreq(
      TISCI_DEV_MCU_R5FSS0_CORE1, TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK,
      &currentFreq, SCICLIENT_SERVICE_WAIT_FOREVER);
  if (get_status != CSL_PASS) {
    SciApp_printf("Sciclient_pmGetModuleClkFreq Failed\nstatus: %d",
                  get_status);
    return 0;
  }
  SciApp_printf("MCU_R5FSS0_CORE1 init Freq: %u HZ\n", currentFreq);

  uint64_t reqFreqHz = 800000000;
  uint64_t respFreqHz = 0;
  int32_t query_status = CSL_PASS;
  query_status = Sciclient_pmQueryModuleClkFreq(
      TISCI_DEV_MCU_R5FSS0_CORE1, TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK, reqFreqHz,
      &respFreqHz, SCICLIENT_SERVICE_WAIT_FOREVER);
  if (query_status != CSL_PASS) {
    SciApp_printf("Sciclient_pmQueryModuleClkFreq Failed\nstatus: %d",
                  query_status);
    return 0;
  }
  //UART_printf cannot correctly display uint64_t data 
  SciApp_printf("MCU_R5FSS0_CORE1 respFreqHz: %u HZ\n", (uint32_t)respFreqHz);

  int32_t set_status = CSL_PASS;

  set_status = Sciclient_pmSetModuleClkFreq(
      TISCI_DEV_MCU_R5FSS0_CORE1, TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK, reqFreqHz,
      TISCI_MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE, SCICLIENT_SERVICE_WAIT_FOREVER);
  if (set_status != CSL_PASS) {
    SciApp_printf("Sciclient_pmSetModuleClkFreq Failed\nstatus: %d",
                  set_status);
    return 0;
  }

  get_status = CSL_PASS;
  get_status = Sciclient_pmGetModuleClkFreq(
      TISCI_DEV_MCU_R5FSS0_CORE1, TISCI_DEV_MCU_R5FSS0_CORE1_CPU_CLK,
      &currentFreq, SCICLIENT_SERVICE_WAIT_FOREVER);
  if (get_status != CSL_PASS) {
    SciApp_printf("Sciclient_pmGetModuleClkFreq Failed\nstatus: %d",
                  get_status);
    return 0;
  }
  SciApp_printf("MCU_R5FSS0_CORE1 Freq now: %u HZ\n", currentFreq);

  return 0;
}

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

    您好!

    您要从哪个内核更改频率? 如果内核已在运行、则可能不允许更改内核。 还有降低内核频率的任何具体原因吗?  

    此致、

    Brijesh

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

    主域的 r5f 内核或 MCU 域的 r5f 内核都可以、只要可以修改其工作频率即可。 我想测试 r5f 内核在不同频率下的性能、为我们的工程设计提供参考。

    如果 r5f 内核运行时无法修改其工作频率、是否有其他方法可以满足这一要求?

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

    尊敬的 Lu:

    如果您使用 SBL 引导流程、则可以在引导时更改内核的频率。 SBL 中有一个 sbl_soc_def.h 头文件、其中定义了所有内核的频率。 您可以在此处更改所需的内核频率并 检查内核性能。  

    此致、

    Brijesh

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

    大家好、我想知道 是否还需要配置 SBL 来修改外设(如计时器)的工作频率

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

    尊敬的 Lu:

    嗯、这是一种更改 默认 R5F 频率以及其他模块频率的方法。

    此致、

    Brijesh