input_set_abs_params(input, ABS_MISC, 0, LTR553_MAX_LUX, 0, 0);
驱动是把采集到的原始坐标(A/D值),直接通过input系统上报。对于12位的A/D,触摸屏的范围是:0~0xFFF。在驱动中表示如下:
input_set_abs_params(ts->dev, ABS_X, 0, 0xFFF, 0, 0);
Android屏的分辨率是720*1280,驱动中需要设置触摸屏的范围如下:
input_set_abs_params(ts->dev, ABS_X, 0, 720, 0, 0);
写驱动时一定要注意上面范围的设置。必须要匹配你的屏分辨率,不按照上述实现,可能调试过程中会有问题;
注册两个input设备
input_set_capability(input, EV_ABS, ABS_MISC); == __set_bit 。。。。
input_set_abs_params(input, ABS_MISC, 0, LTR553_MAX_LUX, 0, 0);
static int ltr553_init_input(struct ltr553_data *ltr)
{
struct input_dev *input;
int status;
input = devm_input_allocate_device(<r->i2c->dev);
if (!input) {
dev_err(<r->i2c->dev, "allocate light input device failed\n");
return -ENOMEM;
}
input->name = LTR553_LIGHT_INPUT_NAME;
input->phys = "ltr553/input0";
input->id.bustype = BUS_I2C;
input_set_capability(input, EV_ABS, ABS_MISC);
input_set_abs_params(input, ABS_MISC, 0, LTR553_MAX_LUX, 0, 0);
status = input_register_device(input);
if (status) {
dev_err(<r->i2c->dev, "register light input device failed.\n");
return status;
}
ltr->input_light = input;
input = devm_input_allocate_device(<r->i2c->dev);
if (!input) {
dev_err(<r->i2c->dev, "allocate proximity input device failed\n");
return -ENOMEM;
}
input->name = LTR553_PROXIMITY_INPUT_NAME;
input->phys = "ltr553/input1";
input->id.bustype = BUS_I2C;
input_set_capability(input, EV_ABS, ABS_DISTANCE);
input_set_abs_params(input, ABS_DISTANCE, 0,
ARRAY_SIZE(ps_distance_table), 0, 0);
status = input_register_device(input);
if (status) {
dev_err(<r->i2c->dev, "register proxmity input device failed.\n");
return status;
}
ltr->input_proximity = input;
return 0;
}
通过input设备可以唤醒系统使用:
/* device wakeup initialization */
device_init_wakeup(&client->dev, 1); 可以作为唤醒系统用;
#ifdef CONFIG_PM_SLEEP
static int xxx_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
if (device_may_wakeup(dev))
enable_irq_wake(client->irq);
return 0;
}
static int xxx_resume(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
if (device_may_wakeup(dev))
disable_irq_wake(client->irq);
return 0;
}
#endif