Hello World
/*中断下半部分使用工作队列*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <mach/hardware.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-fns.h>
#include <linux/workqueue.h>
int irq_num;
/*定义工作队列*/
struct work_struct test_workqueue;
/*工作任务*/
void test_workqueue_handler(struct work_struct *work)
{
msleep(1000);
printk(KERN_INFO "I am a work_func_t function\n");
}
irqreturn_t irq_handler(int irq, void *args)
{
printk(KERN_INFO "I am a irq_handler function\n");
//调度工作队列
schedule_work(&test_workqueue);
return IRQ_RETVAL(IRQ_HANDLED);
}
static int __init hello_init(void)
{
int ret;
//申请GPIO中断
irq_num = gpio_to_irq(S3C2410_GPF(0));
printk(KERN_INFO "irq_num = %d\n", irq_num);
//申请中断
ret = request_irq(irq_num, irq_handler, IRQF_TRIGGER_RISING, "irq_test", NULL);
if (ret < 0)
{
printk(KERN_INFO "request_irq failed\n");
}
//静态初始化工作队列
INIT_WORK(&test_workqueue, test_workqueue_handler);
return 0;
}
static void __exit hello_exit(void)
{
free_irq(irq_num, NULL);
printk(KERN_INFO "irq_exit\n");
return;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");