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驱动的主要内容,如果未能解决你的问题,请参考以下文章