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.

[FAQ] [参考译文] [常见问题解答] AM64X:如何在 Linux 在 A53上运行的情况下为 R5FSS0-0运行 MCU+ SDK GPIO_INPUT_INTERRUPT 示例

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1198105/faq-am64x-how-to-run-mcu-sdk-gpio_input_interrupt-example-for-r5fss0-0-with-linux-running-on-a53

器件型号:AM6442

问题描述

MCU+ SDK 附带一个适用于 R5FSS0-0的 GPIO_INPUT_INTERRUPT 示例。 此示例将 GPIO 引脚配置为生成中断、然后寄存中断处理程序以处理 GPIO 中断。 此示例开箱即用、可与 MCU+ SDK 配合使用。 但是、当在 A53上运行 Linux 并且在其他内核上运行 NORTOS/FreeRTOS 时、该 GPIO_INPUT_INTERRUPT 不起作用。 它通过报告以下错误而失败:

[Error] Sciclient event config failed!!!

在本常见问题解答中、我们将介绍问题的内容、原因和方式。 我们将讨论导致问题的原因、问题发生的原因以及如何解决问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 什么是资源管理文件(sciclient_defaultBoardcfg_rm.c)?

    RM 固件使用 rm_c (sciclient_defaultBoardcfg_rm.c )文件在引导期间初始化系统资源,并在运行时管理这些资源的分配和使用。 这有助于确保系统资源得到有效使用、并且可能需要访问相同资源的不同软件组件之间不存在冲突。 该文件通常由系统集成商创建、并作为引导过程的一部分提供给 RM 固件

    • 什么是中断路由器

    中断路由器是 AM64x 片上系统(SoC)中的一个硬件模块、用于管理各种处理器和外设组件之间的中断并在这些组件之间路由中断。 中断路由器负责接收由硬件外设或其他源生成的中断请求、然后将其路由到相应的 CPU 或处理器内核进行处理。

    中断路由器是可配置的、允许开发人员指定中断路由配置、以优化系统性能并减少延迟。 可通过资源管理文件(sciclient_defaultBoardcfg_rm.c  文件)控制中断路由器配置。

     

    在 AM64X SOC 中、有以下中断路由器、

    1. MAIN_GPIO_INTERRUPT_INTR0
    2. MCU_GPIOMUX_INTR0
    3. TIME_SYNC_INTRTR
    4. CMP_LEW_INTRR.
    5. PKTDMA_INTRTR
    6. BCDMA 路由器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在这里、我们将重点介绍 MAIN_GPIO_INTERRUPT_INTR0、因为该问题与此路由器有关。

     MAIN_GPIO_INTERRUPT_INTR0 

    根据 TRM、AM64X SOC 可以读取199个 GPIO 中断、并通过  MAIN_GPIO_INTERRUPT_INTRTR0将它们路由到不同的内核

    路由器。 如下图所示、AM64X SOC 具有54个主 GPIO MUX INTR 路由器。

    在54台路由器中、A53/R5F 内核共享0到15台路由器、

    38至45分配给 PRU_ICSSG0、和

    46至53分配给 PRU_ICSSG1。

    这些路由器被分配到 sciclient_defaultBoardcfg_rm.c 文件中的特定内核。

    在 MCU+SDK 中、可以在以下路径中找到该文件: <Installation Directory> 64 source/drivers/sciclient/sciclient_default_boardcfg/am64x_am243x/sciclient_defaultBoardcfg_rm

    根据 sciclient_defaultBoardcfg_rm.c 文件、

            {
                .num_resource = 8,
                .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
                .start_resource = 0,
                .host_id = TISCI_HOST_ID_A53_2,
            },
            {
                .num_resource = 2,
                .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
                .start_resource = 8,
                .host_id = TISCI_HOST_ID_MAIN_0_R5_0,
            },
            {
                .num_resource = 2,
                .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
                .start_resource = 8,
                .host_id = TISCI_HOST_ID_MAIN_0_R5_1,
            },
            {
                .num_resource = 2,
                .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
                .start_resource = 10,
                .host_id = TISCI_HOST_ID_MAIN_0_R5_3,
            },
            {
                .num_resource = 2,
                .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
                .start_resource = 12,
                .host_id = TISCI_HOST_ID_MAIN_1_R5_1,
            },
            {
                .num_resource = 2,
                .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
                .start_resource = 14,
                .host_id = TISCI_HOST_ID_MAIN_1_R5_3,
            },

    默认路由器分配表

    SL。 否

    路由器编号(范围)

    默认 Core

    1。

    0至7

    A53.

    2.

    8至9

    R5F0_0

    3.

    10至11

    R5F0_1

    4.

    12至13.

    R5F1_0

    5.

    14至15

    R5F1_1

     

    因此、要将 GPIO 中断路由到特定内核、必须正确配置路由器输出和目标内核。

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

    问题的根本原因

    R5FSS0_0上运行的 GPIO_INPUT_INTERRUPT 示例基于 MCU+ SDK、而在 A53上运行的 Linux 基于处理器 SDK。 该问题是由于这些 SDK 中的 RM 配置差异引起的。 我们必须使用正确的 RM 配置来初始化电路板、以使该示例正常工作。

    有三种方法可以初始化电路板:

    S. No. 引导流程 用例
    1 来自 MCU+ SDK 的 SBL 在 A53SS、R5FSS、M4FSS 上运行的 NORTOS/FreeRTOS 示例
    2. 处理器 SDK 中的 SPL 在 A53SS 上运行的 Linux
    3. MCU+ SDK 中的 Linux SBL 在 R5FSS、M4FSS 和 Linux 上运行的 NORTOS/FreeRTOS 示例在 A53SS 上运行

    默认的 GPIO_INPUT_INTERRUPT 示例经过编码、可与 MCU+ SDK 中的 SBL 开箱即用。 如果我们使用 SPL 初始化电路板、则该示例不起作用、因为 Processor SDK 使用不同的 RM 配置。 对于第三个选项、使用的 RM 配置与处理器 SDK 中使用的配置相同、因此该示例在这种情况下也不起作用。

    简而言之、GPIO_INPUT_INTERRUPT 示例仅适用于第一个选项、而我们需要调整 RM 配置、以防第二个和第三个选项使示例起作用。

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

    修改资源管理配置

     有关修改资源分配的一般介绍,请参见修改资源分配。 在这里、我们将讨论对  TISCI_DEV_MAIN_GPIOMUX_INTROUTER0进行更具体的修改

    资源管理 源文件

    我们将使用 Linux SBL 引导流程 来演示如何修改 RM 配置以使示例正常工作。

    MCU+ SDK 中有两个 Linux SBL。 一个是 SBL_EMMC_Linux、另一个是 SBL_OPSI_Linux。 这些 SBL 使用的 RM 配置文件与 SBL_NULL、SBL_OSPI 等其他 SBL 使用的配置文件不同。 Linux SBL 的资源管理文件位于 /source/drivers/sciclient/sciclient_default_boardcfg/am64x_am243x/sciclient_defaultBoardcfg_rm_linux.c.

    查看此文件、我们会发现 MAIN_GPIOMUX_INTROUTER0 中断输出仅分配给 A530 R5FSS1-1。 由于 GPIO_INPUT_INTERRUPT 在 R5FSS0-0上运行、因此该示例不起作用。 为了使该示例有效、我们必须将中断输出89分配 R5FSS0-0、并保持相同。

    Core 的上下文 ID

    我们还需要再做一件事。 中断路由路径通过 TISCI 请求消息 TISCI_MSG_RM_IRQ_SET 设置 为系统固件。 此消息类型用于非安全上下文、因此应将非安全上下文 ID 用于内核。 MCU+ SDK 中 R5FSS0-0的非安全上下文 ID 为  TISCI_HOST_ID_MAIN_0_R5_1

    对资源管理文件的更改

    基于上述理解、我们按如下方式分配 TISCI_DEV_MAIN_GPIOMUX_INTROUTER0的中断输出:

    {
        .num_resource = 8,
        .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
        .start_resource = 0,
        .host_id = TISCI_HOST_ID_A53_2,
    },
    {
        .num_resource = 2,
        .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
        .start_resource = 8,
        .host_id = TISCI_HOST_ID_MAIN_0_R5_1,
    },
    {
        .num_resource = 2,
        .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
        .start_resource = 10,
        .host_id = TISCI_HOST_ID_A53_2,
    },
    {
        .num_resource = 2,
        .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
        .start_resource = 12,
        .host_id = TISCI_HOST_ID_MAIN_1_R5_1,
    },
    {
        .num_resource = 2,
        .type = TISCI_RESASG_UTYPE (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0, TISCI_RESASG_SUBTYPE_IR_OUTPUT),
        .start_resource = 14,
        .host_id = TISCI_HOST_ID_MAIN_1_R5_3,
    },

    由于上述更改为结构添加了2个新条目、因此我们必须相应地更新新的条目数。 搜索字段  resasg_entries _size  并将数字161更改为163

    .resasg_entries_size = 163 * sizeof(struct tisci_boardcfg_rm_resasg_entry),

    根据上述更改、我们必须生成更新的板配置二进制文件、然后重新构建 Linux SBL 以反映更改。

      随附更新的 sciclient_defaultBoardcfg_rm_linux.c 文件以供参考:

    e2e.ti.com/.../3730.sciclient_5F00_defaultBoardcfg_5F00_rm_5F00_linux.c

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

    构建 RM 和 Linux SBL

    生成电路板配置二进制文件

    完成这些更改后、我们会构建板配置以生成更新的板配置二进制文件。 可以在中运行以下命令 生成生成电路板配置文件。

    gmake -s -C tools/sysfw/boardcfg

    有关更多详细信息、请参阅SYSFW 电路板配置生成

    构建 Linux SBL

    我们将构建 SBL_OSPI_Linux、但 SBL_EMMC_Linux 也是如此。 可以在中运行以下命令 构建 SBL_OSPI_Linux。

    gmake -s -C examples/drivers/boot/sbl_ospi_linux/am64x-evm/r5fss0-0_nortos/ti-arm-clang all

    编译后处理步骤

    构建所需的组件后 、刷写二进制文件并对电路板进行下电上电。 R5FSS0-0上运行的 GPIO_INPUT_INTERRUPT 示例现在应该能够成功运行。