我正在使用raspberry pi进行物联网项目。
我正在使用PIR传感器构建内核模块。
我想这样做:
当PIR获得RISING信号时,全局变量count
每秒都会增加。
并在count
== 5
如果在count
变为5之前出现FALLING信号,则count
重置为0
所以,我可能需要ISR函数中的标志数据,如下所示,
但我无法找到函数或系统调用。
你能帮帮我吗?
全球范围
static struct timer_list my_timer;
#define LED1 4
#define SENSOR1 17
static int count = 0;
static int irq_num;
模块初始化
static int __init module_init(void)
{
int ret;
gpio_request_ont(SENSOR1, GPIOF_IN, "sensor1");
irq_num = gpio_to_irq(SENSOR1);
ret = request_irq(irq_num, pir, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "sensor_irq", NULL);
if(ret)
{
printk(KERN_ERR "Unable to request IRQ : %d\n", ret);
free_irq(irq_num, NULL);
}
return 0;
}
ISR功能
static irqreturn_t pir(int irq, void *data)
{
gpio_request_one(LED1, GPIOF_OUT_INIT_LOW, "led1");
gpio_set_value(LED1, 0);
//pseudo code
if(flag == RISING)
{
init_timer(&my_timer);
my_timer.function = my_timer_func;
my_timer.data = LED1;
my_timer.expires = jiffies + (1 * HZ);
add_timer(&my_timer);
}
else if(flag == FALLING)
{
count = 0;
}
return IRQ_HANDLED;
}
计时器功能
static void my_timer_func(unsigned long data)
{
count ++;
if(count == 5)
{
gpio_set_value(LED1, 1); //actions that I want will be here
count = 0;
}
}