Omap3530 的GPIO中斷設置:
?
1.配置成GPIO,申請GPIO中斷
omap_cfg_reg(OMAP3_KBD_GPIO);配置成gpio
if (gpio_request(OMAP3_KBD_GPIO, "kbd7279 IRQ") < 0)
printk(KERN_ERR "Failed to request GPIO%d for kbd IRQ/n");//申請GPIO為中斷引腳。
2. 設置中斷觸發模式
set_irq_type(OMAP_GPIO_IRQ(OMAP3_KBD_GPIO),IRQ_TYPE_EDGE_FALLING);
?
3.使能中斷
enable_irq(gpio_to_irq(OMAP3_KBD_GPIO));
gpio_to_irq()函數將OMAP3_KBD_GPIO映射為中斷管腳,enable_irq()函數將其使能,這樣該端口就設置為中斷了。
?
4.申請中斷
if(result = request_irq(OMAP_GPIO_IRQ(OMAP3_KBD_GPIO), &Kbd7279_ISR,0, "Ds7279", NULL))
{
printk(KERN_INFO"[FALLED: Cannot register Kbd7279_Interrupt!]/n");
return -EBUSY;
}
else
printk("[OK]/n");
?
下面是完整的設置程序:
void Setup_Kbd7279(void)
{
int i,result;
?
omap_cfg_reg(OMAP3_KBD_GPIO);
if (gpio_request(OMAP3_KBD_GPIO, "kbd7279 IRQ") < 0)
printk(KERN_ERR "Failed to request GPIO%d for kbd IRQ/n");
gpio_direction_input(OMAP3_KBD_GPIO);
set_irq_type(OMAP_GPIO_IRQ(OMAP3_KBD_GPIO),IRQ_TYPE_EDGE_FALLING);//IRQ_TYPE_EDGE_RISING
enable_irq(gpio_to_irq(OMAP3_KBD_GPIO));
//set_irq_type(OMAP_GPIO_IRQ(OMAP3_KBD_GPIO),0 );IRQ_TYPE_LEVEL_LOW
if(result = request_irq(OMAP_GPIO_IRQ(OMAP3_KBD_GPIO), &Kbd7279_ISR,0, "Ds7279", NULL))
{
printk(KERN_INFO"[FALLED: Cannot register Kbd7279_Interrupt!]/n");
return -EBUSY;
}
else
printk("[OK]/n");
send_byte(cmd_reset);
setcs1;
printk("HD7279 setup complete! --- > [OK]/n");
for(i=0;i<1000;i++);
?
write7279(decode1+7,0x1);
write7279(decode1+6,0x2);
}
?
?
這里有個地方一定要注意的,一定要確定設為中斷的引腳工作在GPIO模式,如果不是,先要設置為GPIO模式。
?
?