}
...
六. interrupt接口:
1. 查看系统中断处理信息: cat /proc/interrupts
2. 申请并注册中断处理函数:
static inline int __must_check request_irq( unsigned int irq, irq_handler_t handler,
unsigned long flags, const char *name, void *dev_data);
3. 释放中断,并取消中断处理函数:
void free_irq(unsigned int irq, void *dev_data);
4. 代码执行环境:
1. 中断上下文: in_interrupt(); ---> 判断执行环境是否是中断上下文
1. 软中断上下文: in_softirq(); ---> 判断执行环境是否是soft irq
2. 外部中断上下文: in_irq(); ---> 判断执行环境是否是硬件中断处理环境
2. 进程上下文.
5. 共享中断方法:
1. request_irq()指定共享标志 IRQF_SHARED;
2. request_irq()最后一个参数不能传递NULL,传递当前驱动全局变量地址;
6. 将系统gpio编号转换成对应的外部中断: gpio_to_irq();
7. spinlock中断中使用Demo:
...
struct test_s {
struct file_operations fops;
spinlock_t lock;
int major;
};
typedef struct test_s test_t;
...
int critical(const char *s, spinlock_t *lock)
{
int i;
unsigned long flag;
static int cnt = 0;
/*spin_lock(lock);*/
/*local_irq_disable();*/
/*local_irq_save(flag);*/
/*spin_lock_irq(lock);*/
spin_lock_irqsave(lock, flag);
for(i = 0; i < 3; i++)
{
printk('count = %d, %s', cnt++, s);
mdelay(1000);
}
spin_unlock_irqrestore(lock, flag);
/*spin_unlock_irq(lock);*/
/*local_irq_restore(flag);*/
/*local_irq_enable();*/
/*spin_unlock(lock);*/
return 0;
}
static irqreturn_t irq_handler(int irq, void *arg)
{
test_t *p = arg;
critical('irqn', &p->lock);
return IRQ_HANDLED;
}
static ssize_t test_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
int ret;
char kbuf[count + 1];
test_t *p = file->private_data;
ret = copy_from_user(kbuf, buf, count);
if(ret)
return -EFAULT;
kbuf[count] = '
