staticint__initHi3516Dv300_interrupts_init(void){signedintret=0;ret=misc_register(&Infrare_Control_dev);//创建杂项设备if(0!=ret){printk(KERN_ERR"register misc dev for dooralarm fail!\n");gotoerr_clk;}gpio_num=54;//gpio6_6=6*8+6if(gpio_request(gpio_num,NULL)){//申请gpio操作printk("[%s %d]gpio_request fail! gpio_num=%d \n",__func__,__LINE__,gpio_num);gotogpio_err;}if(gpio_direction_input(gpio_num)){//设置gpio为输入printk("[%s %d]gpio_direction_input fail!\n",__func__,__LINE__);gotogpio_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);//传参不能空,为空就会报错返回-22if(ret){printk("[%s %d]request_irq error! return = %d\n",__func__,__LINE__,ret);gotointerrupt_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");return0;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);return0;}
中断响应函数(Infrare_Control_handle)
staticirqreturn_tInfrare_Control_handle(intirq,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的值returnIRQ_HANDLED;}