Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1229607
  • 博文数量: 479
  • 博客积分: 12240
  • 博客等级: 上将
  • 技术积分: 4999
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 17:12
文章分类

全部博文(479)

文章存档

2014年(1)

2013年(1)

2012年(1)

2011年(95)

2010年(177)

2009年(167)

2008年(16)

2007年(21)

分类: LINUX

2009-11-18 14:30:21

OMAP3 Linux中的中断

内部中断定义在/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))


用法举例:
假定使用GP14作为中断输入,则可以使用如下代码得到IRQ号:
OMAP_GPIO_IRQ(14);

同时,文件需要包含文件。

使用一个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, "JP9 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一个低电平,即可出发中断。





阅读(2000) | 评论(1) | 转发(3) |
给主人留下些什么吧!~~

chinaunix网友2010-06-29 16:08:26

非常好!