[ROC-RK3568-PC] [Firefly-Android] 10min带你了解中断GPIO的使用

Posted Neutionwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ROC-RK3568-PC] [Firefly-Android] 10min带你了解中断GPIO的使用相关的知识,希望对你有一定的参考价值。

🍇 博主主页:Systemcall小酒屋
🍇 博主简介:Neutionwei,C站嵌入式领域新星创作者之一,一枚热爱开源技术、喜欢分享技术心得的极客,注重简约风格,热衷于用简单的案例讲述复杂的技术,“假传万卷书,真传一案例”,这是厦大一位教数学的院士说过的一句话,另外“成就是最好的老师”,技术既要沉淀,也得分享,成就感的正反馈是支持我持续耕耘的动力!
🍇 专栏目录:Firefly-RK356x板卡
🍇 专栏说明:本专栏主要基于Firefly旗下的RK356x板卡进行入门篇讲述,欢迎订阅,博主会持续更新!


上一节主要讲述了普通GPIO的使用:

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解普通GPIO的使用

在 Firefly 的例子程序中还包含了一个中断引脚,GPIO 口的中断使用与 GPIO 的输入输出类似,首先在 DTS 文件中增加驱动的资源描述:

kernel/arch/arm64/boot/dts/rockchip/rk356x-firefly-demo.dtsi
gpio 
	compatible = "firefly-gpio";
	firefly-irq-gpio = <&gpio4 29 IRQ_TYPE_EDGE_RISING>;  /* GPIO4_D5 */
;

其中IRQ_TYPE_EDGE_RISING 表示中断由上升沿触发,当该引脚接收到上升沿信号时可以触发中断函数。 这里还可以配置成如下:

IRQ_TYPE_NONE         //默认值,无定义中断触发类型
IRQ_TYPE_EDGE_RISING  //上升沿触发
IRQ_TYPE_EDGE_FALLING //下降沿触发
IRQ_TYPE_EDGE_BOTH    //上升沿和下降沿都触发
IRQ_TYPE_LEVEL_HIGH   //高电平触发
IRQ_TYPE_LEVEL_LOW    //低电平触发

然后在驱动的 probe 函数中对 DTS 所添加的资源进行解析,再做中断的注册申请:

static int firefly_gpio_probe(struct platform_device *pdev)

	int ret;
   	int gpio;
   	enum of_gpio_flags flag;
    struct firefly_gpio_info *gpio_info;
    struct device_node *firefly_gpio_node = pdev->dev.of_node;
    ...

    gpio_info->firefly_irq_gpio = gpio;
    gpio_info->firefly_irq_mode = flag;
   	gpio_info->firefly_irq = gpio_to_irq(gpio_info->firefly_irq_gpio); // 调用 gpio_to_irq 把 GPIO 的 PIN 值转换为相应的 IRQ 值
   	if (gpio_info->firefly_irq) 
	    if (gpio_request(gpio, "firefly-irq-gpio"))  // 调用 gpio_request 申请占用该 IO 口
    		printk("gpio %d request failed!\\n", gpio);
    		gpio_free(gpio);
    		return IRQ_NONE;
    	
    	ret = request_irq(gpio_info->firefly_irq, firefly_gpio_irq, flag, "firefly-gpio", gpio_info); // 调用 request_irq 申请中断,
    	if (ret != 0) 
    		free_irq(gpio_info->firefly_irq, gpio_info);
    		dev_err(&pdev->dev, "Failed to request IRQ: %d\\n", ret);
    		return ret;
    	
    
    return 0;


static irqreturn_t firefly_gpio_irq(int irq, void *dev_id) // 中断函数

   	printk("Enter firefly gpio irq test program!\\n");
    return IRQ_HANDLED;

request_irq 函数中 gpio_info->firefly_irq 是要申请的硬件中断号,firefly_gpio_irq 是中断函数,gpio_info->firefly_irq_mode 是中断处理的属性,firefly-gpio 是设备驱动程序名称,gpio_info 是该设备的 device 结构,在注册共享中断时会用到。

以上是关于[ROC-RK3568-PC] [Firefly-Android] 10min带你了解中断GPIO的使用的主要内容,如果未能解决你的问题,请参考以下文章

[ROC-RK3568-PC] Kernel配置支持docker或者k8s

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解ADC的使用

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解ADC的使用

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解LED的使用

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解PWM的使用

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解PWM的使用