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:GPIO 中断帮助

Guru**** 2482105 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1454049/am6421-help-with-gpio-interrupt

器件型号:AM6421

工具与软件:

您好...

我需要启用 GPIO 中断、使其发生在 R5F0_0内核中 GPIO0_73 (U12)的下降沿。

SoC 在 A53上运行 Linux、在 R5F 中运行 nortos。

Tiboot3.bin (rm-cfg.c)如下所示:

		/* Main GPIO Interrupt Router */
		{
			.start_resource = 0,
			.num_resource = 8,
			.type = RESASG_UTYPE (AM64X_DEV_MAIN_GPIOMUX_INTROUTER0,
					RESASG_SUBTYPE_IR_OUTPUT),
			.host_id = HOST_ID_A53_2,
		},
		{
			.start_resource = 8,
			.num_resource = 2,
			.type = RESASG_UTYPE (AM64X_DEV_MAIN_GPIOMUX_INTROUTER0,
					RESASG_SUBTYPE_IR_OUTPUT),
			.host_id = HOST_ID_MAIN_0_R5_1,
		},
		{
			.start_resource = 8,
			.num_resource = 2,
			.type = RESASG_UTYPE (AM64X_DEV_MAIN_GPIOMUX_INTROUTER0,
					RESASG_SUBTYPE_IR_OUTPUT),
			.host_id = HOST_ID_MAIN_0_R5_0,
		},
		{
			.start_resource = 16,
			.num_resource = 1,
			.type = RESASG_UTYPE (AM64X_DEV_MAIN_GPIOMUX_INTROUTER0,
					RESASG_SUBTYPE_IR_OUTPUT),
			.host_id = HOST_ID_ALL,
		},

Linux DT 如下所示:

	main_gpio0: gpio@600000 {
		compatible = "ti,am64-gpio", "ti,keystone-gpio";
		reg = <0x0 0x00600000 0x0 0x100>;
		gpio-controller;
		#gpio-cells = <2>;
		interrupt-parent = <&main_gpio_intr>;
		interrupts = <190>, <191>, <192>,
			     <193>, <194>, <195>;
		interrupt-controller;
		#interrupt-cells = <2>;
		ti,ngpio = <87>;
		ti,davinci-gpio-unbanked = <0>;
		power-domains = <&k3_pds 77 TI_SCI_PD_EXCLUSIVE>;
		clocks = <&k3_clks 77 0>;
		clock-names = "gpio";
	};

然后在 main 上:

	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_GPIO0;
	rmIrqReq.src_index = IRQ0_OUT_N_PIN;
	rmIrqReq.dst_id = TISCI_DEV_R5FSS0_CORE0;
	rmIrqReq.dst_host_irq = CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_8;
	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_rmIrqSet(&rmIrqReq, &rmIrqResp, SystemP_WAIT_FOREVER);
	if (0 != retVal)
	{
		DebugP_log("[Error] Sciclient event config failed!!!\r\n");
		DebugP_assert(FALSE);
	}

	GPIO_bankIntrEnable(gGpioBaseAddr, GPIO_GET_BANK_INDEX(IRQ0_OUT_N_PIN));

	/* Register pin interrupt */
	HwiP_Params_init(&hwiPrms);
	hwiPrms.intNum = CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_8;
	hwiPrms.callback = &int_callback;
	hwiPrms.args = (void*)IRQ0_OUT_N_PIN;
	/* GPIO interrupt is a pulse type interrupt */
	hwiPrms.isPulse = TRUE;
	retVal = HwiP_construct(&hwGpioHwiObject, &hwiPrms);
	DebugP_assert(retVal == SystemP_SUCCESS);

它不会显示任何错误、但 不会调用 int_callback。

感谢任何帮助。