ltr553 input设备



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);
  input_set_abs_params(ts->dev, ABS_Y, 0, 0xFFF, 0, 0);

Android屏的分辨率是720*1280,驱动中需要设置触摸屏的范围如下:

input_set_abs_params(ts->dev, ABS_X, 0, 720, 0, 0);
 input_set_abs_params(ts->dev, ABS_Y, 0, 1280, 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(&ltr->i2c->dev);
 if (!input) {
  dev_err(&ltr->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(&ltr->i2c->dev, "register light input device failed.\n");
  return status;
 }

 ltr->input_light = input;

 input = devm_input_allocate_device(&ltr->i2c->dev);
 if (!input) {
  dev_err(&ltr->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(&ltr->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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值