OMAP3开发系列—— 中断
小狼@http://blog.csdn.net/xiaolangyangyang
内部中断定义
在/arch/arm/plat-omap/include/mach/irqs.h中,如:
#define INT_34XX_BENCH_MPU_EMUL 3 #define INT_34XX_ST_MCBSP2_IRQ 4 #define INT_34XX_ST_MCBSP3_IRQ 5 #define INT_34XX_SSM_ABORT_IRQ 6 #define INT_34XX_SYS_NIRQ 7 #define INT_34XX_D2D_FW_IRQ 8 #define INT_34XX_PRCM_MPU_IRQ 11 #define INT_34XX_MCBSP1_IRQ 16 #define INT_34XX_MCBSP2_IRQ 17 #define INT_34XX_MCBSP3_IRQ 22 #define INT_34XX_MCBSP4_IRQ 23 #define INT_34XX_CAM_IRQ 24 #define INT_34XX_MCBSP5_IRQ 27 #define INT_34XX_GPIO_BANK1 29 #define INT_34XX_GPIO_BANK2 30 #define INT_34XX_GPIO_BANK3 31 #define INT_34XX_GPIO_BANK4 32 #define INT_34XX_GPIO_BANK5 33 #define INT_34XX_GPIO_BANK6 34 #define INT_34XX_USIM_IRQ 35 #define INT_34XX_WDT3_IRQ 36 #define INT_34XX_SPI4_IRQ 48 #define INT_34XX_SHA1MD52_IRQ 49 #define INT_34XX_FPKA_READY_IRQ 50 #define INT_34XX_SHA1MD51_IRQ 51 #define INT_34XX_RNG_IRQ 52 #define INT_34XX_I2C3_IRQ 61 #define INT_34XX_FPKA_ERROR_IRQ 64
如果要用GPIO作为中断呢?
先看/arch/arm/plat-omap/include/mach/gpio.h文件:
#define OMAP_GPIO_IRQ(nr) (OMAP_GPIO_IS_MPUIO(nr) ? IH_MPUIO_BASE + ((nr) & 0x0f) : IH_GPIO_BASE + (nr))
用法举例:
假定使用GPIO14作为中断输入,则可以使用如下代码得到IRQ号:
OMAP_GPIO_IRQ(14);
同时,文件需要包含<mach/gpio.h>文件。
使用一个GPIO作为中断之前,需要进行请求,同时还需要设置方向,参考arch/arm/plat-omap/debug-devices.c文件中的使用范例:
smc91x_resources[1].start = gpio_to_irq(gpio);
smc91x_resources[1].end = gpio_to_irq(gpio);
status = gpio_request(gpio, "SMC91x irq");
if(status < 0){
printk(KERN_ERR "GPIO%d unavailable for smc91x IRQ\n", gpio)
return status;
}
gpio_direction_input(gpio);
一个简单的能触发中断的范例:
先需要在mux.c和mux.h中设置GPIO156:
增加:
MUX_CFG_34XX("GPIO156", 0x18c, OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)/* for GPIO156 */
增加: GPIO156,初始化:
//for test JP9 GP156 omap_cfg_reg(GPIO156);// gpio_request(156,"JP156 Reset_Reg"); gpio_direction_input(156); set_irq_type(OMAP_GPIO_IRQ(156),IRQ_TYPE_LEVEL_LOW); enable_irq(gpio_to_irq(156));
申请中断:
request_irq(OMAP_GPIO_IRQ(156),&test_interrupt,0,"REG_REST",NULL);
中断处理函数:
static irqreturn_t test_interrupt(int irq,void *dev_id,struct pt_regs * regs)^M { printk("#########ABING in INTR\n"); return 0; }
只要给GPIO156一个低电平,即可触发中断。