想要让IO口作为从外部出发的中断口,可以分为以下几步
①先让其为gpio模式,并且为方向设置为输出,并且必须上拉
1,可以在平台上添加
OMAP4_MUX(SDMMC1_DAT4, OMAP_MUX_MODE3 | OMAP_PIN_INPUT_PULLUP),
SDMMC1_DAT1 这个名字为原理图端口上指定端口的第一个名字
INPUT_PULLUP的含义就不用说了~~
OMAP_MUX_MODE3 指定为gpio模式
2,也可以在驱动里边用这个函数直接定义
omap_mux_init_gpio(106,OMAP_PIN_INPUT_PULLUP);
//这个函数的好处是不用指定gpio模式
106是io的序号,跟上边平台中的SDMMC1_DAT4等价
②申请io口
error = gpio_request(IRQ_GPIO_UP, NULL);
if (error < 0) {
printk("oled Failed to request GPIO %d, error %d\n",
IRQ_GPIO_UP, error);
return error;
}
③:这部有没有必要我没测试过,估计作用是再次确认为输入口,我是参考gpio_key相关代码是这么写的
error = gpio_direction_input(IRQ_GPIO_UP);
if (error < 0) {
printk("oled :Failed to configure direction for GPIO %d, error %d\n",
IRQ_GPIO_UP, error);
return error;
}
irqflags |= IRQF_SHARED; //其他的io口可以共享,所以就可以被其他的中断来disable掉
④:申请中断 (其实等价于request_irq函数)
error = request_any_context_irq(gpio_to_irq(IRQ_GPIO_UP),light_up ,IRQF_TRIGGER_FALLING,"OLED_GPIO_106",NULL);
if (error < 0) {
printk( "oled :Unable to claim irq %d; error %d\n",
IRQ_GPIO_UP, error);
return error;
}
我测试时遇到的问题是:只是指定为了OMAP_PIN_INPUT而没有指定为OMAP_PIN_INPUT_PULLUP
打印寄存器的时候一直发现GPIO_DATAIN跟成功的不一样 才知道要设定为pullup才能稳定中断,否则自己的gpio口电平悬空未知~~
关于omap4 GPIO中断还有复用的情况
比如:gpio_3跟gpio_wk3就复用一个引脚request_irq(GPIO_TO_ITQ(3),)对应于两个引脚
如果你是用gpio_wk3引脚产生中断的话就应该将gpio_3设置为其他模式 代码如下:/arch/arm/mach-omap2/board-omap4panda.c中添加
OMAP4_MUX(SIM_CD, OMAP_MUX_MODE3 | OMAP_PIN_INPUT_PULLUP),
OMAP4_MUX(KPD_ROW1, OMAP_MUX_MODE7 | OMAP_PIN_INPUT_PULLUP),
或
omap_mux_init_signal("kpd_row2.gpio_3", OMAP_MUX_MODE7 | OMAP_PIN_INPUT_PULLUP); /* gpio_3 */
omap_mux_init_signal("sim_cd.gpio_wk3", OMAP_MUX_MODE3 | OMAP_PIN_INPUT_PULLUP | OMAP_WAKEUP_EN ); /* gpio_wk3 */