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驱动开发中触摸屏驱动的实现方法。