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.

[参考译文] PROCESSOR-SDK-AM62X:GPIO 中断

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts

器件型号:PROCESSOR-SDK-AM62X
主题中讨论的其他器件:SK-AM62

我正在尝试一个使用基于 GPIO 的中断的设计。  我们希望利用 GPIO1_44-47作为中断。  我提到了两个具体例子,但似乎都不起作用。

我尝试的第一个示例位于 Processor SDK QNX 08_05_00_0中。  具体而言、它是 psdkqa\QNX\examples\GPIO 示例。  当我尝试将其移植到我们的设计时、我能够成功构建、但第一次尝试写入 GPIO_MUX_BASE_PHY_ADDR 寄存器位置会导致"未处理异常"错误、导致单元崩溃。

在进行一些 E2E 研究后、我们似乎需要使用 SCI 来配置中断路由器、但不清楚为什么这不是 SDK 使用的方法。  基于 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1176076/processor-sdk-am62x-gic-interrupts/4469253?tisearch=e2e-sitesearch&keymatch=gpio%25252525252520%25252525252526%25252525252526%25252525252520interrupt#4469253

我们实施了以下代码、我认为这些代码应该配置中断路由器:

static void Sciclient_gpioIrqSet(void)
{
    int32_t                             retVal;
    struct tisci_msg_rm_irq_set_req     rmIrqReq;
    struct tisci_msg_rm_irq_set_resp    rmIrqResp;

    rmIrqReq.valid_params           = 0U;
    rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
    rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
    rmIrqReq.global_event           = 0U;
    rmIrqReq.src_id                 = TISCI_DEV_MAIN_GPIOMUX_INTROUTER0; //MCU_GPIO_MUX_INT_ROUTER_ID;
    rmIrqReq.src_index              = 134U;//SRC_IDX_BASE_MCU_GPIO_BANK_0;
    rmIrqReq.dst_id                 = TISCI_DEV_MAIN_GPIOMUX_INTROUTER0; //MCU_GPIO_MUX_INT_ROUTER_ID;   // TISCI_DEV_MAIN_GPIOMUX_INTROUTER0 ?
    rmIrqReq.dst_host_irq           = 32U; //MCU_GPIOMUX_INTROUTER_MCU_0_OUTP_6;
    rmIrqReq.ia_id                  = 0U;
    rmIrqReq.vint                   = 0U;
    rmIrqReq.vint_status_bit_index  = 0U;
    rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;

    retVal = Sciclient_rmIrqSetRaw(&rmIrqReq, &rmIrqResp, -1);

    if(0 != retVal)
    {
        cout << "[Error] Sciclient event config failed!!!  RetVal=" << retVal << endl;
        //DebugP_log("[Error] Sciclient event config failed!!!\r\n");
        //DebugP_assert(FALSE);
    }

    return;
}

使用此代码会导致错误消息: [ERROR] Sciclient 事件配置失败!!!  RetVal=-1。  对 slog 的进一步探讨表明、每次执行函数都会导致 slog 中出现一个新条目: Jan 05 18:52:59.587 tisci_mgr.323598 slog 55
TI_sci_msg_xfer (252):ACK 上的 sciclient 服务调用失败

是否有人可以指引我查看适用于 AM62x 设计的示例?

谢谢、

John  

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

    尊敬的 John:

    我已获取您的意见、我将向您提供最新信息。

    此致、

    Vaibhav

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

    大家好、Vaibhav  我正在与 John 一起探讨此功能、我也有关于 MCU+SDK 和 PSDK v8.5的一些问题。 一些常数和寄存器地址似乎与 TRM 不匹配。

    例如、在 cslr_intr_mcu_m4fs0_core0.h 中的 MCU+SDK 中 、WKUP_MCU_GPIOMUX_INTROUTER0_OUTP_6常量定义为2、但在 TRM 中、它在表10-15中定义为80。

    在 Examples/GPIO/src/GPIC.c 下的 PSDK 中、我认为 GPIO_MUX_BASE_PHY_ADDR 和 GIC_ICFG_BASE_PHY_ADDR 与 TRM 不匹配。 似乎还有8个 GPIO 地址、其中 AM62x 只有3个(2个主 GPIO 和1个 MCU GPIO)。 我对 GPIOMUX_INTR0_OUTP_8的值感到困惑 、在示例中、它定义为392、 但 TRM 中似乎不存在该值。 我能找到的最接近 的是表10-15中的 MAIN_GPIOMUX_INTROUTER0_OUTP_7、因为这些索引是基于0的、中断 ID 是215。 最后、我无法找到有关如何创建 mux_offset 的文档。 注释显示"GPIOMUX_INTR0_MUXCNTL_n、其中"n"为 INTR0_OUT 8:63... IRQ 392:447"、但我在 TRM 中看不到这些值、或者为什么需要将中断变量乘以4。

    感谢您的帮助!

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

    是否还有要提供的更新?

    谢谢、

    John

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

    尊敬的 John:

    我已阅读您的查询。
    当尝试使用 GPIO1_44-47作为中断时、在设计中配置中断路由器似乎遇到问题。 Processor SDK QNX 08_05_00_0中的示例似乎未按预期工作、并且遇到"未处理异常"错误。

    PEASE 让我在某个时候来了解一下、我将在与相关团队成员讨论该问题后再与您联系。

    谢谢、

    Vaibhav

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

    您好、John、

    您能否使用下面的代码来确认 GPIO 中断是否在 GPIO1_44-47上正常工作?

    在中断例程中、请确保检查哪个 GPIO 引脚导致了中断。

    如果您遇到任何问题、请告诉我。 如果这起作用、我可以解释每行代码。

    或者、我们还提供了有关如何在 AM64上路由 GPIO 中断、但不在 AM62上路由 GPIO 中断的常见问题解答。

    我将尝试在将来创建一个、以帮助其他客户解决路由 GPIO 中断问题。

    静态空 Sciclient_gpioIrqSet (空)

    int32_t RetVal;
    struct tisci_msg_rm_irq_set_req rmIrqReq;
    struct tisci_msg_rm_IRQ_SET_RESP rmIrqResp;

    rmIrqReq.valid_params = 0U;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_ID_VALID;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_HOST_IRQ_VALID;
    rmIrqReq.global_event = 0U;
    rmIrqReq.src_id = TISCI_DEV_MAIN_GPIOMUX_INTROUTER0;
    rmIrqReq.src_index = 182U;
    rmIrqReq.dst_id = TISCI_DEV_MAIN_GPIOMUX_INTROUTER0;
    rmIrqReq.dst_host_IRQ = 34U;//34U 或35U;
    rmIrqReq.ia_id = 0U;
    rmIrqReq.vint = 0U;
    rmIrqReq.vint_status_bit_index = 0U;
    rmIrqReq.secondary_host = TISCI_MSG_VALUE RM 未使用次要主机;

    RetVal = Sciclient_rmIrqSetRaw (&rmIrqReq、&rmIrqResp、-1);

    if (0!=返回值)

    COUT <<"[错误] Sciclient 事件配置失败!!! RetVal="<< RetVal << endl;
    //DebugP_log ("[Error] Sciclient 事件配置失败!!!!\r\n");
    //DebugP_Assert (false);

    返回;

    此致、

    S.Anil。

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

    使用建议的调整、我仍然会收到相同 的错误消息: [ERROR] Sciclient 事件配置失败!!!  RetVal=-1。

    John

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

    我还尝试了、得到了相同的结果。 我正在使用 TI SK-AM62 SD 卡映像中提供的 Uboot 文件、并在尝试加载 Linux 之前停止 Uboot。 然后、我加载了未经修改的 QNX IFS 并使用建议 的 Sciclient_gpioIrqSet 函数运行 sciclient_app。 以下是输出:

    /tmp/tisci-mgr
    /tmp/sciclient_app
    Main:Sciclient_init 完成
    DMSC 固件版本8.4.7-v08.04.07 (Jolly Jellyfi
    固件版本0x8
    ABI 修订版3.1
    A53 Core0频率= 1250MHz
    [错误] Sciclient 事件配置失败!!! RetVal=-1

     

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

    您好、John、

    我在最后确认了、我无法获取 [Error] Sciclient 事件配置失败!!!  RetVal=-1。  问题。

    我在 M4域中创建了此示例、并将 GPIO1中断组路由到 M4内核、作为 MCU+SDK 中的目标内核。

    您能否告诉我您要将 GPIO 中断路由到 R5F、A53或 M4域的内核?

    此致、

    S.Anil。

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

    我们正在尝试将中断路由到 A53域。

    John

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

    您好、John、

    请使用我在下面共享的基于 MuC+SDK 的代码。

    如果不起作用、请告诉我、我们需要检查您的 QNX 代码。

    静态空 Sciclient_gpioIrqSet (空)

    int32_t RetVal;
    struct tisci_msg_rm_irq_set_req rmIrqReq;
    struct tisci_msg_rm_IRQ_SET_RESP rmIrqResp;

    rmIrqReq.valid_params = 0U;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_ID_VALID;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_HOST_IRQ_VALID;
    rmIrqReq.global_event = 0U;
    rmIrqReq.src_id = TISCI_DEV_MAIN_GPIOMUX_INTROUTER0;
    rmIrqReq.src_index = 182U;
    rmIrqReq.dst_id = TISCI_DEV_MAIN_GPIOMUX_INTROUTER0;
    rmIrqReq.dst_host_IRQ = 0U;//0U 或1U 或2U 或3U;
    rmIrqReq.ia_id = 0U;
    rmIrqReq.vint = 0U;
    rmIrqReq.vint_status_bit_index = 0U;
    rmIrqReq.secondary_host = TISCI_MSG_VALUE RM 未使用次要主机;

    RetVal = Sciclient_rmIrqSetRaw (&rmIrqReq、&rmIrqResp、-1);

    if (0!=返回值)

    COUT <<"[错误] Sciclient 事件配置失败!!! RetVal="<< RetVal << endl;
    //DebugP_log ("[Error] Sciclient 事件配置失败!!!!\r\n");
    //DebugP_Assert (false);

    返回;

    此致、

    S.Anil。

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

    结果相同。 您需要检查哪些代码?  没有什么比图中所示的更好了。  设置中是否有我们可能缺少的内容?  tisci-mgr 版本错误?  还有事吗?

    John

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

    您好、John、

    感谢您的更新。

    当我们要在 AM62X 上启用 GPIO 中断时、应基于目标内核启用中断路由器。

    通常、应通过 SCI 客户端功能配置中断路由器。

    是否可以与我们分享您的项目?

    我需要查看您的项目并配置 SCI 客户端功能以快速解决问题。

    此致、

    S.Anil。

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

    您好、John、

    我已经查看过您的记录、似乎与我的建议不符。

    我假设日志是根据您的 SCI 客户端设置记录的。

    您能否确认您的代码中是否使用了以下设置?

    如果没有、您可以共享已记录数据的 SCI 代码设置吗?

    rmIrqReq.valid_params = 0U;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_ID_VALID;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_HOST_IRQ_VALID;
    rmIrqReq.global_event = 0U;
    rmIrqReq.src_id = TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0;//MCU_GPIO_MUX_INT_ROUT_ID;
    rmIrqReq.src_INDEX = 182U;//SRC_IDX_BASE_MCU_GPIO_Bank_0;
    rmIrqReq.dst_id = TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0;//MCU_GPIO_MUX_INT_ROuter_ID;// TISCI_DEV_MAIN_GPIOMUX_INTROUTER0?
    rmIrqReq.dst_host_IRQ = 32U;//MCU_GPIOMUX_INTROUTER_MCU_0_OUTP_6;
    rmIrqReq.ia_id = 0U;
    rmIrqReq.vint = 0U;
    rmIrqReq.vint_status_bit_index = 0U;
    rmIrqReq.secondary_host = TISCI_MSG_VALUE RM 未使用次要主机;

    0x5D4A00B6:资源管理/失败(操作失败):IRQ_IR_CFG (已将 IR 输入配置为输出映射):IR 输入索引:182

    0x5B070000:资源管理/失败(操作失败):        IRQ_SET (程序中断路由):VAL_params 的高16位:0x0000

    0x5B080003:资源管理/失败(操作失败):        IRQ_SET (程序中断路由):有效参数的低16位:0x0003

    0x5B0E0005:资源管理/失败(操作失败):        IRQ_SET (程序中断路由):源设备 ID:5

    0x5B0F00B6:资源管理/失败(操作失败):        IRQ_SET (程序中断路由):源索引:182

    0x5B100005:资源管理/失败(操作失败):        IRQ_SET (程序中断路由):目标设备 ID:5

    2. 您是否还可以提供以下设置的日志?

    rmIrqReq.valid_params = 0U;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_ID_VALID;
    rmIrqReq.valid_params |= TISCI_MSG_value_RM_DST_HOST_IRQ_VALID;
    rmIrqReq.global_event = 0U;
    rmIrqReq.src_id = TISCI_DEV_GPIO1;
    rmIrqReq.src_index =74U;
    rmIrqReq.dst_id = TISCI_DEV_GICSS0;
    rmIrqReq.dst_host_IRQ = 32U;
    rmIrqReq.ia_id = 0U;
    rmIrqReq.vint = 0U;
    rmIrqReq.vint_status_bit_index = 0U;
    rmIrqReq.secondary_host = TISCI_MSG_VALUE RM 未使用次要主机;

    RetVal = Sciclient_rmIrqSet (&rmIrqReq、&rmIrqResp、SystemP_WAIT_FOREVY);

    3.我不是 QNX 方面的专家,我正与 QNX 专家合作解决此问题。 此外、您是否可以与我们共享您的代码、以便在我们的末尾进一步调试?

    此致、

    S.Anil。

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

    您好、John、

    我从 Mukul 那里听说、您可以在不出现任何 SCI 错误的情况下运行 SCI 客户端功能、但您无法在 GPIO1_44至47引脚上获得中断。

    请问您的要求是什么? 是否要在边沿触发器或电平触发器中获取中断? 这需要指定给 GIC。

    /*寄存器引脚中断*/
    Hwip_Params_init (&hwiPrms);
    hwiPrms.intNum = intrNum;
    hwiPrms.callback = GPIO_bankIsrFxn;
    hwiPrms.args =(void *) pinNum;
    hwiPrms.isPulse = 1U;//1U 用于上升/下降、而0U 用于电平触发

    RetVal = Hwip_construct(&gGpioHwiObject,&hwiPrms);

    在 RTOS 代码中、我们有hwiPrms一个结构、在这个结构中、我们可以指定与 GPIO 中断相关的所有参数。 请参阅上面的代码。

    我不知道 QNX 代码、我们在 QNX 中是否有类似的结构来配置 GPIO 中断参数? 如果是、请按上面所示配置 GPIO 中断参数。

    顺便说一下、rmIrqReq.src_index = 74U已针对寄存器组中断进行配置、因此您将只获得一个中断。

    在中断例程中、确保检查哪个 GPIO 引脚引起了中断。

    如果要创建单个中断,可以rmIrqReq.src_index = 44U从进行更改rmIrqReq.src_index = 47U,以便可以为每个中断进行回调。 问题解决后、我将解释所有 SCI 参数。

    如果您遇到任何问题、请告诉我。

    此致、

    S.Anil。

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

    您好、Swargam、

    我们仍在努力在 QNX 中注册中断。 虽然当我们触发中断时看到 INTSTATUS 发生变化、但它不会在 QNX 中触发事件。 我认为我们无法使用您提供的代码、因为 QNX 有自己的 API、但我们会将问题直接提交给他们。 我们仍想了解您上一条消息中的示例与为什么使用   TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0和 TISCI_DEV_GPIO1的示例之间的区别。 谢谢。

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

    Dan,您好!

    我已按照以下过程来配置基于 MCU+SDK 的 GPIO 中断。

    您也可以在 QNX 中执行相同的过程。

    GPIO 中断配置的步骤

    1. GPIO 配置将 GPIO 引脚配置为输入。
    2. 目标内核标识:标识将 GPIO 中断路由到的目标内核、可以是 M4F、A53或 R5F。
    3. 中断路由器配置:根据目标内核配置中断路由器输出。 目前、此信息在系统配置中不可配置、因此您需要按照以下步骤手动配置中断路由器输出。
    4. 根据  您的要求启用组中断或单个引脚中断、触发类型和中断编号。

    示例: 要在 GPIO1_44和 GPIO1_47上启用中断,目标内核为 A53。"

    步骤1: 将 GPIO 引脚配置为输入。

    步骤2:配置 GPIO 中断路由器并选择目标内核

    我们需要在 Sciclient_gpioIrqSet (void)函数中配置四个参数:

    rmIrqReq.src_id、rmIrqReq.src_index、rmIrqReq.dst_id 和 rmIrqReq.dst_host_IRQ。

    您希望在 GPIO1上获得中断、因此源 ID 应为 TISCI_DEV_GPIO1

    rmIrqReq.src_id = TISCI_DEV_GPIO1

    您希望为寄存器组2生成中断。 根据 TRM、要在组2上获得组中断、源索引将为182。 有关 GPIO 中断源索引的更多详细信息、请参阅第10.1.6章"GPIO 中断处理"。

    请转至 C:\ti\mcu_plus_sdk_am62x_08_05_00_14\source\drivers\sciclient\soc \am62x\sciclient_irq_rm.c 文件

    当您想要启用组2中断时、必须将索引值写入74 (72是组2中断的基值+ 2、根据 rm_IRQ.c 文件)。"

    rmIrqReq.src_index = 74U;

    根据 TRM、根据下面的 GPIO 中断路由图、所有 GPIO1中断都路由到 M4/GIC/R5F 域、并且中断路由器也与其他内核共享。

    在这种情况下、目标 ID 将是您要路由 GPIO 中断的内核、即 A53或 R5F。

    根据您的要求、目标 ID 将是 A53内核。 所以、

    rmIrqReq.dst_id = TISCI_DEV_GICSS0;

    下一步是从0到15选择中断路由器寄存器。

    我根据 C:\ti\mcu_plus_sdk_am62x_08_05_00_14\source\drivers\sciclient\sciclient_default_boardcfg\am62x\sciclient_defaultBoardcfg_rm.c 中的文件将 rmIrqReq.src_index 选择为0至15

    rmIrqReq.src_index =基值+中断路由器索引;

    您可以选择从0到15的中断路由器索引值。

    基值为32、因为所有 GIC SPI 中断都从32开始。

    rmIrqReq.dst_host_IRQ = 32U;

     

     步骤3:启用组中断或单个引脚中断、 触发类型和中断编号。

     

    注:

    1. 如果要为每个单独的中断而不是组中断启用中断、则必须执行以下步骤。

    在以下参数中、必须指定引脚编号而不是寄存器组编号:

    1. SRC_INDEX =引脚索引;

     

    请勿调用以下函数:

    1. GPIO_bankIntraEnable (gGpioBaseAddr、bankNum);

     

    在 ISR 例程中、使用以下函数、而不是使用组寄存器状态和清零:

    1. GPIO_clearStatus 和 GPIO_getIntStatus。

    如果中断路由器在不同内核之间共享、请使用以下功能。

    RetVal = Sciclient_rmIrqSet (&rmIrqReq、&rmIrqResp、SystemP_WAIT_FOREVY);

    如果中断仅路由到单个内核、也不路由到其他内核、请使用以下函数。

    RetVal = Sciclient_rmIrqSetRaw (&rmIrqReq、&rmIrqResp、SystemP_WAIT_FOREVY);

    如果您需要任何其他帮助、请告诉我。

    此致、

    S.Anil。

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

    您好,Dan / John,

    中断路由器寄存器无法手动配置。 它必须通过 DMSC 内核进行配置。 如果尝试从 A53或其他内核写入中断路由器寄存器、SOC 将进入异常状态。

    除了该寄存器 ,您还可以手动写入所有其它 GPIO 寄存器。

    此致、

    S.Anil。

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

    Swargam、

    我想、总的来说、我们遵循您描述的流程。  但是、您提供的详细信息对于我们的设置似乎并不完全正确。  DMSC 中的 SCI 服务器将无法成功接收您建议的源/目标。  到目前为止、我们在 DMSC 接受中拥有 SCI 服务器的唯一设置是:

    • SRC_id: TISCI_DEV_MAIN_GPIOMUX_INTROUTER0
    • SRC_INDEX:134 (表10-10中的 GPIO1.GPIO.44)
    • dst_id: TISCI_DEV_MAIN_GPIOMUX_INTROUTER0
    • dst_id:0 (我们认为这会转换为基于表10-13的 Gicss0.spi.32)。

    我们已正确设置 GPIO、使其在 GPIO_44的下降沿生效。  正如 Dan 提到的、我们通过查看相应的 GPIO_INTSTAT23 (0x60105C)寄存器来确认这一点。  我们昨天还不知道、但现在做的是、只要正确设置 GPIO、GPIO_INTSTAT23 寄存器就会反映中断状态、而不管我们通过  DMSC 中的 SCI 服务器进行何种路由器设置。   这使我们相信、在路由设置中、我们仍然没有正确的东西。  我们想知道我们是否需要执行多个级别的路由(而不仅仅是一个)。  我们还想知道是否缺少一些 GIC 设置。 我们认为、将 GIC 中断32 (表10-13)与 QNX InterruptAttach 调用一起使用应该是适当的中断调用。  我们有使用 I2C GIC 中断193的工作代码。

    为了从软件级别将其抽象出来、您能否提供适当的寄存器和寄存器设置 、这些设置需要用于将下降沿中断从 GPIO1_44路由到 GIC 中断32。  我们完全了解其中一些寄存器将不能直接访问。  这将使我们能够确认我们的软件正在执行我们认为的操作。

    此致、

    John

     

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

    尊敬的 John:

    感谢您的更新。

    我有几个问题。 请提供您的意见吗?

    [引用 userid="366719" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4505655 #4505655 "]
    • SRC_id: TISCI_DEV_MAIN_GPIOMUX_INTROUTER0
    • SRC_INDEX:134 (表10-10中的 GPIO1.GPIO.44)
    • dst_id: TISCI_DEV_MAIN_GPIOMUX_INTROUTER0
    • dst_id:0 (我们认为这会转换为基于表10-13的 Gicss0.spi.32)。
    [/报价]

    在进行上述设置后、两个地址0x00A00000和0x00A00004的值是多少?

    您正在使用哪种 SCI 客户端功能:

    Sciclient_rmIrqSet (&rmIrqReq、&rmIrqResp、SystemP_WAIT_FOREVY)或

    Sciclient_rmIrqSetRaw (&rmIrqReq、&rmIrqResp、SystemP_WAIT_FOREVY)?

    在我们的 MCU+SDK 中、要设置 A53的触发器类型、我们将使用以下两个函数。

    根据您的评论、我知道您希望在 GPIO1_44引脚上获得下降沿。 为了实现这一点、您可以使用函数 Hwip_setEdgeSpiIntType (uint16_t intrNum)"并将32U 作为中断编号。

    要在 QNX 软件中编译以下代码、您应该具有CSL_gic500_gicdRegs结构和其他结构的定义。

    如果您有它们、则可以直接使用代码。 否则、请尝试集成附加的.h 文件并进行编译

    #define HWIP_GIC_BASE_ADDR        (0x1800000UL)
    #define HWIP_GICD_SPI_INTR_ID_MAX   (992u)
    #define HWIP_GICD_SGI_PPI_INTR_ID_MAX (32U)


    静态 int32_t Hwip_setEdgeSpiIntType (uint16_t intrNum)
      cSL_gic500_gicdRegs * gicdRegs =(cSL_gic500_gicdRegs *)(HWIP_GIC_BASE_ADDR);
      
      uint32_t index、mask;

      if (intrNum < HWIP_GICD_SPI_INTR_ID_MAX)
      {
        /*转换中断 ID */
        intrNum -= HWIP_GICD_SGI_PPI_INTR_ID_MAX;

        索引= intrNum /16U
        MASK = 0b11 <<((intrNum % 16U)* 2U);

        gicdRegs->ICFGR_SPI[index]= gicdRegs->ICFGR_SPI[index]| MASK;
      }
      其他
      {

      }

      返回 SystemP_SUCCESS;


    静态 int32_t Hwip_setLevelSpiIntType (uint16_t intrNum)
      cSL_gic500_gicdRegs * gicdRegs =(cSL_gic500_gicdRegs *)(HWIP_GIC_BASE_ADDR);
      
      uint32_t index、mask;

      if (intrNum < HWIP_GICD_SPI_INTR_ID_MAX)
      {
        /*转换中断 ID */
        intrNum -= HWIP_GICD_SGI_PPI_INTR_ID_MAX;

        索引= intrNum /16U
        MASK = 0b11 <<((intrNum % 16U)* 2U);

        gicdRegs->ICFGR_SPI[索引]= gicdRegs->ICFGR_SPI[索引]&(~遮罩);
      }
      其他
      {

      }

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

    您好、John、

    [引用 userid="525901" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4506350 #4506350"]cslr_gic500.h[/quot]

    上述.h 文件基于 AM64X 平台、AM62X 平台的 MCU+SDK 不支持 A53架构。

    因此、我无法共享 AM62X cslr_gic500.h 文件。

    但是、我找到了一个替代解决方案、它涉及直接写入寄存器级别、而不是使用上面的.h 文件。

    在查看 AM62X 和 AM64X 平台的寄存器集之后、我发现两个平台的 GICS 位于同一地址空间。

    因此,您可以使用以下功能选择触发器类型。

    #define HWIP_GIC_BASE_ADDR        (0x1800000UL)
    #define HWIP_GICD_SPI_INTR_ID_MAX   (992u)
    #define HWIP_GICD_SGI_PPI_INTR_ID_MAX (32U)
    静态  int32_t  Hwip_setEdgeSpiIntType (uint16_t  intrNum)
      //CSL_gic500_gicdRegs * gicdRegs =(CSL_gic500_gicdRegs *)(HWIP_GIC_BASE_ADDR);
      
       uint32_t index、mask;

     

       if (intrNum < HWIP_GICD_SPI_INTR_ID_MAX)
      {
        /*转换中断 ID */
        intrNum -= HWIP_GICD_SGI_PPI_INTR_ID_MAX;

     

        索引= intrNum /16U 
        MASK =  0b11 <<((intrNum %  16U)*  2U);

     

         //gicdRegs->ICFGR_SPI[index] gicdRegs->ICFGR_SPI[index]| MASK;
       *((UINT32_t *) ( HWIP_GIC_BASE_ADDR + (0xC08U +(((索引 )*0x4U))))|=  MASK;
      }
       其他
      {

     

      }

     

       返回 SystemP_SUCCESS;
    如果 您需要任何其他帮助、请告诉我。
    此致、
    S.Anil。
                   
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="525901" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4506350 #4506350"]上述设置后,两个地址0x00A00000和0x00A00004的值是多少?

    0xA00000:0x66948100

    0xA00004:0x00010086

    [引用 userid="525901" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4506350 #4506350"]

    您正在使用哪种 SCI 客户端功能:

    Sciclient_rmIrqSet (&rmIrqReq、&rmIrqResp、SystemP_WAIT_FOREVY)或

    Sciclient_rmIrqSetRaw (&rmIrqReq、&rmIrqResp、SystemP_WAIT_FOREVY)?

    [/报价]

    Sciclient_rmIrqSetRaw

    我已经尝试过您的 Hwip_setEdgeSpiIntType 迭代 、并且都创建了段故障。  我注意到代码正在尝试将 0x1800c08设置为0x3。  但是、回读似乎表明位0不可写(0x1800C08 = 0x2)。  你能评论吗?

    此致、

    John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="366719" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4507358 #4507358"]

    0xA00000:0x66948100

    0xA00004:0x00010086

    [/报价]

    您好、John、

    根据上述寄存器值,您已选择路由器输出为零,并已正确配置引脚134。

    [引用 userid="366719" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4507358 #4507358"]我已经尝试过 Hwip_setEdgeSpiIntType 的迭代 ,并且都创建了段错误。

    但是、您似乎无法将值0x03写入地址0x1800C08。

    在解决此问题之前,我想确认您是如何启用图片中标记的黄色线条的。

     

    此致、

    S.Anil。

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

    您好、John、

    请问您是如何在 QNX 中实现以下功能的?

    此函数用于启用 GIC 中断类型、设置中断优先级、启用中断以及寄存器用户回调。

    您是否可以共享 GPIO 代码示例?

    这样、如果以下解决方案不起作用、我们可以快速尝试解决问题。"

    int32_t Hwip_con构(Hwip_Object *句柄、Hwip_Params *参数)

    Hwip_Struct*对象=(Hwip_Struct*)句柄;
    uint8_t CoreID;

    DebugP_assertNoLog (sizeof (Hwip_Structt)<= sizeof (Hwip_Object));
    DebugP_assertNoLog( params->callback != NULL );
    DebugP_assertNoLog( params->intNum < Hwip_MAX_interrupts );

    CoreID = Armv8_getCoreId();

    gHwiCtrl.ISR[params->intNum]= params->callback;
    gHwiCtrl.isrArgs[params->intNum]= params->args;

    /*设置中断优先级*/
    HWIP_INTERPrioritySet (params->intNum、(uint32_t) params->priority、CoreID);

    if (params->isPulse ==0)

    (空) Hwip_setLevelSpiIntType((uint16_t)params->intNum);

    其他

    (空) Hwip_setEdgeSpiIntType ((uint16_t) params->intNum);

    obj->intNum = params->intNum;

    HWIP_enableInt(params->intNum);

    返回 SystemP_SUCCESS;

     

    此致、

    S.Anil。

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

    Swargaram、

    显然,该系统失去了我昨天所作的补充答复。  Hwip_setEdgeSpiIntType 的第二次迭代 确实使我们达到了 QNX 可以根据中断采取行动的程度。  现在、我们要求解释已用于完成此操作的每个寄存器及其设置。

    谢谢、

    John

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

    您好、John、

    好的,我可以尝试给出中断优先级、启用中断设置和其他参数中的代码。

    我将在一天或两天内分享该代码。

    此致、

    S.Anil。

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

    您好、John、

    请告诉我您如何在 QNX 中编写 I2C 的 ISR 函数?

    您是否注册了回调方法、或者您是否使用了另一种方法来接收/发送 /错误中断?

    此致、

    S.Anil。

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

    Swargam、

    你一定会误解我们的期望。  我不查找代码。   相反、我正在寻找您已经提供的代码的说明。  正在设置哪些寄存器?  位对应的值。  到目前为止、您已经提供了特定于特定中断的代码。  我们希望了解该代码的工作原理、以便我们知道如果使用了其他中断、如何完成相同的任务。  您错过的呼叫中对此进行了讨论。  我们被告知、一旦中断运行、将给出详细的解释。

    此致、

    John

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

    您好、John、

    您可以使用下面的两个常见问题解答来了解有关 GPIO 中断文档的更多详细信息吗?

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1196137/faq-sk-am62-how-to-configure-the-gpio-interrupt-on-am62x-in-mcu-sdk

    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

    [引用 userid="366719" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4511205 #4511205"]到目前为止,您已经提供了特定于特定中断的代码

    对于其他 GPIO 中断、您也需要遵循相同的过程。


    [引用 userid="525901" URL"~/support/processors-group/processors/f/processors-forum/1188840/processor-sdk-am62x-gpio-interrupts/4506350 #4506350"]
    • SRC_id: TISCI_DEV_MAIN_GPIOMUX_INTROUTER0
    • SRC_INDEX:134 (表10-10中的 GPIO1.GPIO.44)
    • dst_id: TISCI_DEV_MAIN_GPIOMUX_INTROUTER0
    • dst_id:0 (我们认为这会转换为基于表10-13的 Gicss0.spi.32)。
    [/报价]

    假设您希望在 GPIO1_44至 GPIO1_47上获得中断。

    在这种情况下、只需更新 src_index 值。 除此之外、所有 SCI 客户端配置都与上述相同。

    SRC_INDEX:GPIO1_45的135 (表10-10中的 GPIO1.GPIO.45)

    SRC_INDEX:针对 GPIO1_46的136 (表10-10中的 GPIO1.GPIO.46)

    SRC_INDEX:137 (表10-10中的 GPIO1.GPIO47)、适用于 GPIO1_47

    SRC_INDEX:182 用于寄存器组2。

    是否可以 指定 您是否需要其他详细信息?

    此致、

    S.Anil。