「深入了解Linux触摸屏代码」

1. Linux触摸屏简介

随着智能手机和平板电脑的盛行,使用触摸屏成为了人们最直观、方便的交互方式之一。而对于Linux操作系统而言,如何支持触摸屏也是一项重要的技术。

Linux触摸屏技术主要包括两个部分:

1.1 触摸屏硬件

触摸屏硬件由自带触摸屏和外接触摸屏两种形式。二者区别是:自带触摸屏集成于显示屏中,主板通过I/O地址控制;外接触摸屏是外接于显示器之外的一个分离设备(可以独立使用),主板通过USB接口与其连接。

无论是何种形式的触摸屏,其核心部件就是触摸屏控制器(Touch Screen Controller),它位于触摸面板背面,处理触摸操作后输出结果给主板。控制器将触摸面板按其坐标轴方向分割成若干等份,分别为每一个坐标区域设定一个触摸输入设备。当用户点击触摸面板时,触摸屏控制器相应地输出具体的触摸位置信息。

1.2 触摸屏软件

触摸屏软件主要涉及Linux内核、驱动层和用户层三个方面。Linux内核提供核心的触摸屏操作接口,驱动程序提供硬件接口支持,最后在用户层提供界面管理和应用层操作接口。

对于Linux的使用者而言,不需要过多地考虑触摸屏驱动的开发问题,只需在内核和文件系统的支持下,安装适当的触摸屏驱动即可实现触摸操作。

2. 触摸屏工作原理

触摸屏的工作原理是利用一组电极产生电场。当用户使用手指或其他物体触碰屏幕时,电子信号是被电阻触摸屏控制器感应到的。这个电子信号将传递给处理器进行解码,在屏幕上显示出用户定义的操作。

对于电容触摸屏而言,触摸屏上方底下的玻璃板中间夹一层透明氧化物,电容触摸屏的主要原理基于手指的电容变化造成的电场变化,探头可以探测到这个变化,并利用电阻原理来确定触摸的位置。

以下是一个简单的电容式触摸屏工作原理模型图:

![touch screen fundamental principle](https://cdn.jsdelivr.net/gh/gaoluhua/piccdn/touch.gif)

如图所示,触摸屏上方的透明电阻薄膜是具有均匀电场的X、Y电极,并且由细密的银线网格,中间是一个空气缝隙层,手指触摸到电阻薄膜会引起电容变化,进而使得X、Y电极之间的感应电容改变。在电容变化之后,电容触摸屏控制器将记录手指的位置,并将数据传送到系统的处理器,指示需要做出相应的响应。

3. 触摸屏驱动开发

触摸屏驱动程序主要作用是将信号有效地获取到,传递给内核或者用户层,从而实现鼠标的移动和点击事件信息。驱动程序一般采用Linux标准的输入子系统(Input Subsystem)框架进行开发。

Linux内核提供了input_booster组件用于读取input_event datasup。这种框架提供一种将输入设备(如键盘、鼠标和触摸屏)device_serve底层设备震动接口的简单方式。触摸屏的input_booster驱动也被称作TouchScreen Driver(TSDr),其设计思路为适应各种触摸屏硬件,将输入设备转换为input_event通道,以保证与底层设备的兼容性。

以下是一个简单的触摸屏驱动代码示例:

int __init gpm_i2c_ts_init(struct device *dev)

{

int ret;

struct i2c_client *client;

struct ts_data *ts;

dev_info(dev, "start gpm-i2c-ts(%d) initial\n", minor_num);

client = to_i2c_client(dev);

ts = kzalloc(sizeof(struct ts_data), GFP_KERNEL);

if (unlikely(!ts)) {

dev_err(dev, "failed to allocate ts data\n");

return -ENOMEM;

}

ret = input_allocate_device();

if (unlikely(ret)) {

dev_err(dev, "error to allocate input device\n");

kfree(ts);

return ret;

}

ts->input = input_get_dev(&dev->dev);

ts->input->open = ts_open;

ts->input->close = ts_close;

ts->input->name = CLIENT_NAME;

ts->input->id.bustype = BUS_I2C;

ts->input->id.vendor = 0x0001;

ts->input->id.product = 0x0002;

ts->input->id.version = 0x0100;

input_set_capability(ts->input, EV_ABS, ABS_MT_POSITION_X);

input_set_capability(ts->input, EV_ABS, ABS_MT_POSITION_Y);

input_set_capability(ts->input, EV_KEY, BTN_TOUCH);

input_mt_init_slots(ts->input, 1, INPUT_MT_DIRECT);

input_set_abs_params(ts->input, ABS_MT_POSITION_X, 0, 1199, 0, 0);

input_set_abs_params(ts->input, ABS_MT_POSITION_Y, 0, 799, 0, 0);

i2c_set_clientdata(client, ts);

ret = gpm_read_chips(client, ts);

if (unlikely(ret)) {

dev_err(&client->dev, "failed to init read chips\n");

input_free_device(ts->input);

kfree(ts);

}

return ret;

}

代码中input_allocate_device()函数分配了一个input结构体,该结构体定义了输入子系统中的输入设备,即将触摸屏视为一个input_device结构体对象,提供给用户空间作为输入设备。

以下是触摸屏驱动中经常使用的一些输入事件:

EV_SYN:用于同步多个事件

EV_KEY:键按下或键松开事件

EV_ABS:绝对位移事件,包含触摸、加速度等信息

EV_REL:相对位移事件,如鼠标滚轮事件

EV_MSC:用于处理“杂项”的事件

EV_REP:重复按键

4. 触摸屏的应用

触摸屏最早用于计算机的人机交互,如在普通电脑屏幕上安装触摸传感器,让用户可以通过其进行电脑操作。现在触摸屏已经广泛地应用于多个领域。

例如在智能手机、平板电脑等便携式电子产品上,用户可以通过触摸屏实现各种复杂操作,如打电话、发短信、浏览网页、阅读电子书等等。在汽车、家庭电器等领域中,大尺寸的触摸屏也可以让用户轻松地操作设备,相比传统的按钮、旋钮等操作方式更加方便、直观。

5. 结论

Linux触摸屏技术在当前的IT应用系统中,是一项必不可少的技术。触摸屏作为人类与计算机的交互手段,它已经广泛地应用于移动设备,在日常生活中提供了便利的用户体验。通过本文对Linux触摸屏技术的简介,我们可以更加全面地认识触摸屏的工作原理,并理解Linux驱动开发中触摸屏驱动的实现方法。

操作系统标签