i.mx8mq M4 GPIO中斷問題

cancel
Showing results for 
Search instead for 
Did you mean: 

i.mx8mq M4 GPIO中斷問題

419 Views
jfglkaer
Contributor I

目前小弟我遇到一個問題,

請問GPIO1_12中斷在Uboot底下,

GPIO有變化就會進入中斷,

但是A53開始跑BootKernel之後,

GPIO有變化,

但GPIO中斷就不能夠進入,

查過A53都沒有人使用這隻GPIO腳位

不清楚是不是A53開始跑BootKernel要加入什麼指令才可以繼續使用?

0 Kudos
1 Reply

324 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi Lin,

1、如果在M4中使用这GPIO,那么你不能再u-boot/linux中再次使用它。

2、在fsl-imx8mq-evk.dts中,有很多节点使用了GPIO中断配置,你是可以借鉴的。

(1)你首先需要把GPIO1_12复用好

这取决于你要把它从哪个CPU引脚复用出来。你可以打开linux/include/dt-bindings/pinctrl/pins-imx8mq.h文件,GPIO1_IO12可以从这些引脚复用出来:

MX8MQ_IOMUXC_GPIO1_IO12_GPIO1_IO12

MX8MQ_IOMUXC_GPIO1_IO12_USB1_OTG_PWR

MX8MQ_IOMUXC_GPIO1_IO12_SDMA2_EXT_EVENT1

MX8MQ_IOMUXC_GPIO1_IO12_CCMSRCGPCMIX_OUT1

MX8MQ_IOMUXC_GPIO1_IO12_CSU_CSU_ALARM_AUT0

那么,你需要用哪个,要看你的原理图中使用的引脚。加在fsl-imx8mq-evk.dts中的这里,就可以了。

    imx8mq-evk {
        pinctrl_hog: hoggrp {
            fsl,pins = <
                MX8MQ_IOMUXC_NAND_READY_B_GPIO3_IO16        0x19
                MX8MQ_IOMUXC_NAND_WE_B_GPIO3_IO17        0x19
                MX8MQ_IOMUXC_NAND_WP_B_GPIO3_IO18        0x19

              /* 加在这里,复用它,比如用GPIO1_IO12引脚复用 */

               MX8MQ_IOMUXC_GPIO1_IO12_GPIO1_IO12   0x19
            >;
        };

(2)把GPIO1_IO12配置为中断响应引脚

这个GPIO连接的设备,会有一个driver,在dts里加载driver的时候,节点中配置这个GPIO中断,比如,下面是imx8mq device tree中的一个配置,你可以参考它:

    typec_ptn5100: ptn5110@50 {
        compatible = "usb,tcpci";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_typec>;
        reg = <0x50>;
        interrupt-parent = <&gpio3>;  
        interrupts = <3 8>;
        ss-sel-gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>;
        src-pdos = <0x380190c8>;
        snk-pdos = <0x380190c8 0x3802d0c8>;
        max-snk-mv = <9000>;
        max-snk-ma = <2000>;
        op-snk-mw = <9000>;
        max-snk-mw = <18000>;
        port-type = "drp";
        default-role = "sink";
    };

 interrupt-parent = <&gpio3>;   你的要修改为&gpio1

 interrupts = <3 8>;

这里的3,是指GPIO3_IO03,那么你的需要把它修改为12, 而后面的8,见下面解释:

        1 = low-to-high edge triggered
        2 = high-to-low edge triggered
        4 = active high level-sensitive
        8 = active low level-sensitive
因此interrupts第二个数字,是指中断的触发方式,你可以根据你的情况选择一个(1/2/4/8)

(3)在driver中获得节点GPIO信息,并申请中断

driver加载时,probe的时候,要得到dts配置信息,得到这个GPIO的配置,并且使用request_irq( ) function向系统申请中断。

(4)中断响应interrupt service routine

有中断,就必须要这个interrupt service routine,也可以把它理解为中断发生时,要执行的一个函数,在request_irq( )参数中,必须要给出interrupt service routine的函数名字(即它的地址)

在linux中,使用一个中断,上面的步骤是必须要有的,你可以根据i.mx8mq的bsp中,节点配置找到对应的driver,然后找到driver中GPIO中断处理做为学习的例子,这样的例子非常多。

Hope above information is helpf for you.

Have a nice day!

BR,

Weidong

0 Kudos