基于[海思Hi3516dv300]开发的GPIO双边缘中断

驱动入口函数(Hi3516Dv300_interrupts_init)

static int __init Hi3516Dv300_interrupts_init(void)
{

	signed int  ret=0;
    ret = misc_register(&Infrare_Control_dev);//创建杂项设备
	if (0 != ret)
	{
		printk(KERN_ERR "register misc dev for dooralarm fail!\n");
		goto err_clk;
	}
	
	gpio_num = 54;//gpio6_6 = 6*8 +6 
	
	if (gpio_request(gpio_num, NULL)) {//申请gpio操作
			printk("[%s %d]gpio_request fail! gpio_num=%d \n", __func__, __LINE__, gpio_num);
			goto gpio_err;
	}

	if (gpio_direction_input(gpio_num)) {//设置gpio为输入
                printk("[%s %d]gpio_direction_input fail!\n",
                                __func__, __LINE__);
                goto gpio_err;
    }
	
	irq_num = gpio_to_irq(gpio_num);//找到gpio对应的中断号
	ret = request_irq(irq_num, Infrare_Control_handle, IRQF_TRIGGER_FALLING|IRQF_SHARED|IRQF_TRIGGER_RISING,//上下边缘触发
							"gpio_dev_test", NULL);//传参不能空,为空就会报错返回-22
	if(ret){
			printk("[%s %d]request_irq error! return = %d\n", __func__, __LINE__,ret);
			goto interrupt_error;
	}


	printk ("[%s %d]gpio%d_%d in %d\n", __func__, __LINE__,
				gpio_num / 8, gpio_num % 8,
				gpio_get_value(gpio_num));//获取gpio的值

	printk("Hi3516Dv300_interrupts_init\n");
	
	return 0;
fail_ioremap_gpio:
	release_mem_region(0x12020000,0x4);
	release_mem_region(0x12003020,0xC);
interrupt_error:
	free_irq(irq_num, NULL);
gpio_err:
	gpio_free(gpio_num);
err_clk:
    misc_deregister(&Infrare_Control_dev);
	return 0;
}

中断响应函数(Infrare_Control_handle)

static irqreturn_t Infrare_Control_handle(int irq, void *dev_id)
{
	printk ("[%s %d]gpio%d_%d in %d\n", __func__, __LINE__,
				gpio_num / 8, gpio_num % 8,
				gpio_get_value(gpio_num));//获取gpio的值
	return IRQ_HANDLED;
}

下载代码链接

点这~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I&You

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值