霍尔器件是一个磁感应器件,在手机等平台上主要用于例如滑盖手机、翻盖手机等场合,用于控制屏幕的亮、灭。
那么如果来写driver呢,这里主要调用input_report_switch来上报事件,当然也可以上报其它键值,上层根据键值来做不同的处理。
首先是input设备的注册,注册同其它input设备没有什么不同,这里主要看input设备的setting:
最后是中断处理函数:
剩下的事情就交由上层去处理吧。
那么如果来写driver呢,这里主要调用input_report_switch来上报事件,当然也可以上报其它键值,上层根据键值来做不同的处理。
首先是input设备的注册,注册同其它input设备没有什么不同,这里主要看input设备的setting:
input_set_capability(input_dev, EV_SW, SW_LID);
当然也可以调用__set_bit去setting。
然后是中断的注册:
err = request_irq(irq, hall_irq_handler,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "hall", input_dev);
if (err) {
printk("failed to request IRQ\n");
goto failed_request_irq;
}
这里使用上升沿和下降沿来触发中断。
最后是中断处理函数:
static irqreturn_t hall_irq_handler(int irq, void *dev_id)
{
struct input_dev *input_dev = (struct input_dev *)dev_id;
int state;
state = gpio_get_value(hall_irq_pin);
input_report_switch(input_dev, SW_LID, !state);
input_sync(input_dev);
return IRQ_HANDLED;
}
input_report_switch用来上报一个开关事件,只有两个状态1、0,靠近霍尔器件是要上报1,远离霍尔器件是上报0。从这里也可以看出,靠近时gpio状态是低电平,远离时是高电平。
剩下的事情就交由上层去处理吧。