linux中断详解

1.中断引脚与中断号的对映

static int xxx_probe(struct platform_device *pdev)
{
    struct xxx_platform_data *pdata = pdev->dev.platform_data;
//获取中断引脚
if(pdata->irq_gpio.io != INVALID_GPIO) {
if (gpio_request(pdata->irq_gpio.io, "XXX_EINT")){
printk("xxx irq_gpio is busy!\n");
return -1;
}
}
//注册中断号,中断号和中断引脚在硬件上是对映起来的
int trigger = IRQF_TRIGGER_HIGH;  //还有其他的中断触发方式
if(pdata->irq_gpio.enable == GPIO_LOW)
trigger = IRQF_TRIGGER_LOW;//具体要看外设芯片手册
iRet = request_irq(IRQ_XXX, xxx_eirq_handler,  trigger, "BT_INT_B", NULL);
disable_irq_nosync(IRQ_XXX);//注册好的中断最好先禁止,等到驱动准备就绪在开启
return 0;
}


2.gpio_request与gpio_free

函数原型:int gpio_request(unsigned gpio, const char *tag);

gpio:申请的引脚

tag:给申请的引脚取名

函数原型:void gpio_free(unsigned gpio);

gpio:同上

一般gpio_request封装了mem_request(),起保护作用,最后要调用mem_free之类的。主要是告诉内核这地址被占用了。当其它地方调用同一地址的gpio_request就会报告错误,该地址已被申请。在/proc/mem应该会有地址占用表描述。

这种用法的保护作用前提是大家都遵守先申请再访问,有一个地方没遵守这个规则,这功能就失效了。好比进程互斥,必需大家在访问临界资源的时候都得先获取锁一样,其中一个没遵守约定,代码就废了。

3.中断触发方式:

#define IRQF_TRIGGER_NONE0x00000000

#define IRQF_TRIGGER_RISING0x00000001

#define IRQF_TRIGGER_FALLING0x00000002

#define IRQF_TRIGGER_HIGH0x00000004

#define IRQF_TRIGGER_LOW0x00000008


4.int request_irq(unsigned int irq, irq_handler_t handler,

                         unsigned long irqflags, const char *devname, void *dev_id)

irq 是要申请的硬件中断号。

handler 是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。

irqflags 是中断处理的属性,若设置了IRQF_DISABLED (老版本中的SA_INTERRUPT,本版已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程 序不屏蔽;若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的 SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。(这几个flag是可以通过或的方式同时使用的)

dev_id 在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。

devname 设置中断名称,在cat /proc/interrupts中可以看到此名称。

request_irq()返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值