最近在做omap3530如何实现GPIO的中断.特此记录一下调试过程.
驱动肯定是标准的做法.重点说一下如何配置GPIO口.GPIO口有6组,而复用管脚的GPIO模式用的是模式4才是GPIO.
一,首先把GPIO口的管脚配置为GPIO模式
想在自己的驱动中配置mux管脚,只有一个办法ioremap.不用考虑调用内核的接口omap_mux_init_gpio,因为这是在目录arch\arm\plat-omap2下,这个目录下的东西,基本上平台的配置,在内核跑起来之后,会把平台配置完,进入文件系统后,会把一些结构体释放掉.
因此要想在自己的驱动中实现mux配置,只能用ioremap.如果可以在内核中配置,那么就方便多了.
omap3530的内核用的mux.c不是arch\arm\plat-omap下的.而是arch\arm\mach-omap2下的.
关于这一点,我也没有搞明白.TI的东西真乱.有明白人,可以在这个文章的评论中留言,到时候加我QQ.共同学习交流.
在这里面
ret = gpio_get_value(10);
printk(KERN_ERR "\n**GPIO10**:%d\n",ret);
omap_mux_init_gpio(10, OMAP_PIN_INPUT_PULLUP);
if (gpio_request(10, "INT_GPIO_10") < 0) {
printk(KERN_ERR "Failed to request GPIO10for INT_GPIO_10\n");
}
gpio_direction_input(10);
这样即可.
二,驱动中如何操作
在配置完成后,即可在驱动中使用.
disable_irq(gpio_to_irq(OMAP3530_INT_GPIO));
/*gpio direction config for input*/
gpio_direction_input(OMAP3530_INT_GPIO);
/*config irq to falling trigger*/
set_irq_type(OMAP_GPIO_IRQ(OMAP3530_INT_GPIO), IRQ_TYPE_EDGE_FALLING);
/*enable gpio irq*/
enable_irq(gpio_to_irq(OMAP3530_INT_GPIO));
/*when init module, reuqest irq. Do not in open dev, becase /proc*/
result = request_irq(OMAP_GPIO_IRQ(OMAP3530_INT_GPIO),
interrupt_handle,
IRQF_DISABLED,
"card_detect",
NULL);
if(result)
{
printk(KERN_INFO "short: can't get assigned irq %i\n", OMAP_GPIO_IRQ(OMAP3530_INT_GPIO));
}
这样即可在中断看看效果如何?
作者:张亮校
日期:2012.10.16