TouchScreen驱动

Posted 四季帆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
      
   

以上是关于TouchScreen驱动的主要内容,如果未能解决你的问题,请参考以下文章

输入在 pygame 和 adafruit-touchscreen 中移动

asm335x系列adc和触摸屏驱动(转)

Linux驱动开发之输入子系统

android4.1触摸屏驱动怎么移植?

八 s3c2440 linux 触摸屏 驱动代分析

Linux/Android——输入子系统input_event传递