TouchScreen驱动

背景

        kernel version:4.14.98

        drivers/input/touchscreen/atmel_mxt_ts.c

        SoC与屏幕的touch ic通过I2C进行通信

代码分析

static struct i2c_driver mxt_driver = {
	.driver = {
		.name	= "atmel_mxt_ts",
		.owner	= THIS_MODULE,
		.of_match_table = of_match_ptr(mxt_of_match),
		.acpi_match_table = ACPI_PTR(mxt_acpi_id),
		.pm	= &mxt_pm_ops,
	},
	.probe		= mxt_probe,
	.remove		= mxt_remove,
	.id_table	= mxt_id,
};
//注册i2c driver
module_i2c_driver(mxt_driver);

        因为是直接注册为i2c driver,没有init入口函数,所以直接看probe函数。

static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    struct mxt_data *data;
    data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
    snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
		 client->adapter->nr, client->addr);
    data->client = client;
	data->pdata = pdata;
	i2c_set_clientdata(client, data);
    、、、、、、
    error = mxt_acquire_irq(data);//申请中断
}

static int mxt_acquire_irq(struct mxt_data *data)
{
	int error;

	if (!data->irq) {//申请中断
		error = request_threaded_irq(data->client->irq, NULL,
				mxt_interrupt,
				data->pdata->irqflags | IRQF_ONESHOT,
				data->client->name, data);
	return 0;
}

static irqreturn_t mxt_interrupt(int irq, void *dev_id)
{//中断服务函数中读取并处理touch数据
	struct mxt_data *data = dev_id;

	if (data->T44_address) {
		return mxt_process_messages_t44(data); //-->
	} else {
		return mxt_process_messages(data);
	}
}

static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
{
    /* Read T44 and T5 together */
    //通过I2C读取touch数据到data->msg_buf中
	ret = __mxt_read_reg(data->client, data->T44_address,
		data->T5_msg_size + 1, data->msg_buf);

    //从data->msg_buf中读取数据并处理
    ret = mxt_proc_message(data, data->msg_buf + 1);
}

static int mxt_proc_message(struct mxt_data *data, u8 *message)
{
    mxt_proc_t100_message(data, message); 
}                                         
static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
{//从touch数据中解析出xy坐标值等信息,并上报至input core层
    x = get_unaligned_le16(&message[2]);
	y = get_unaligned_le16(&message[4]);
    if (data->t100_aux_area)
		major = message[data->t100_aux_area];
    if (data->t100_aux_ampl)
		pressure = message[data->t100_aux_ampl];
    if (data->t100_aux_vect)
		orientation = message[data->t100_aux_vect];
    if (active) {
		dev_dbg(dev, "[%u] type:%u x:%u y:%u a:%02X p:%02X v:%02X\n",
			id, type, x, y, major, pressure, orientation);
            //上报坐标值
		input_report_abs(input_dev, ABS_MT_POSITION_X, x);
		input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
		input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, major);
		input_report_abs(input_dev, ABS_MT_PRESSURE, pressure);
		input_report_abs(input_dev, ABS_MT_DISTANCE, distance);
		input_report_abs(input_dev, ABS_MT_ORIENTATION, orientation);
    }  
}   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值