安卓外挂红外触摸屏的软件设计

2 安卓驱动架构
Android 驱动 主要分两种类型: Android 专用驱动 和 An-
droid 使用的设备驱动 (linux), 触摸屏属于 Event 输入设备驱
动。 输入 Input 驱动程序的主设备 是 13, 次设备 是(Event
queue):64~95, 最多有 32 个。Input 子系统的结构如图 2 所示, 分
为三层: 硬件驱动层, 子系统核心层, 事件处理层。
(1) 硬件驱动层负责具体的硬件设备驱动, 本层代码放在
内核中, 是开发工作的核心内容, 按照 GPL 协议, 这部分需要开
源。
(2) 安卓框架部分是上下两个层之间的纽带, 向上提供事
件处理层的接口, 向下提供驱动层的接口, 本部分一般不用修
改。
(3) 最上层应用层负责与用户程序打交道, 将下层传来的
事件 告给用户程序。

3 触屏驱动设计
安卓的 linux3.1.10 版本的内核中自带了 USB 触摸屏驱动,
位置是:
/kernel /drivers /input /touchscreen /usbtouchscreen.c, 添加
的专用触摸驱动也放在这个目录。
3.1 USB 驱动注册
插入 USB 触屏后, 首先进行 USB 设备注册, 入口是:
module_init(usbirtouch_init);
static int __init usbirtouch_init(void)
{
return usb_register(&usbirtouch_driver);
}
这里调用了 USB 注册函数, 需要传入一个 usb_driver 结构
体指针:
static struct usb_driver usbirtouch_driver = {
.name = “USBIRTOUCH”,
.probe = usbirtouch_probe, .disconnect = usbir-
touch_disconnect,
.id_table = usbirtouch_id_table,
};
USB 设备驱动 usb_generic_driver 会和 USB 设备交互, 进
行描述符的匹配, 匹配成功后将调用上述结构体中 probe 域中
指定的 probe 函数。 其中的匹配表由 usbirtouch_id_table 指定。
然后将每个接口定义成 device, 加载到 USB 总线。

static struct usb_device_id usbirtouch_id_table[] = {
{USB_DEVICE_HID_CLASS(0x0abf, 0x0011), .driver_info
= DEVTYPE_IGNORE},
{USB_DEVICE_HID_CLASS(0x0abf, 0x0012), .driver_info
= DEVTYPE_IGNORE},

};
USB_DEVICE_HID_CLASS 中两个参数, 第 1 个代表厂商
(Vendor)ID, 第 2 个代表产品(Product) ID.
在 probe 函数中, 需要通过 set_bit ()告知 input 子系统可以
告的事件并初始化触屏参数:
input_dev->evbit [0] = BIT(EV_KEY) | BIT(EV_ABS);
set_bit(BTN_TOUCH, input_dev->keybit);
input_dev->absbit[0] = BIT(ABS_MT_POSITION_X) | BIT
(ABS_MT_POSITION_Y);
set_bit(ABS_MT_PRESSURE, input_dev->absbit);
EV_KEY 表示按键事件, EV_ABS 表示触摸的绝对坐标值,
使用下面 3 个函数进行触屏参数初始化。
input_set_abs_params (input_dev, ABS_MT_PRESSURE,
0,255,0,0);//压力范围和精度
input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
32767, 0, 0);//X 值范围和精度
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
32767, 0, 0);//Y 值范围和精度
3.2 触摸数据的上
利用 urb 上 进行数据上 。 上 前使用 usb_fill_int_urb(
)回调 usbirtouch_irq( )函数进行数据段填充。 主要代码如下:
input_report_abs(dev,ABS_MT_POSITION_X, x);//X 轴
坐标值
input_report_abs(dev,ABS_MT_POSITION_Y, y);//Y 轴
坐标值
input_report_key(dev,BTN_TOUCH,1);//单击
input_mt_sync(dev);
在每个点上 后需要紧跟一句 input_mt_sync()用于不同点
的间隔, 本批触摸点上 完毕使用 input_sync(dev)表示本批次
上 结束。
4 驱动的编译
编写好的需要对内核重新编译, 主要步骤如下 :
(1) 将驱动程序复制到 kernel/driver/input/touchscreen 目 录
下;
(2) 修改 kernel/driver/input/touchscreen 目 录下的 Makefile,
添加
“obj-$(CONFIG_TOUCHSCREEN_USBIRTOUCH_DT)
+= usbirtouchusb-hy.o”;
(3) 修改 kernel/driver/input/touchscreen 目 录下的 Kconfig
文件, 增加如下代码
config TOUCHSCREEN_USBIRTOUCH_HY
tristate “IRTOUCH USB Touchscreen Driver For single
point”
depends on USB_ARCH_HAS_HCD
select USB

help
Say Y here if you have a USBIRTOUCH based touch-
screen controller.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called usbirtouch.
(4) 运行 make menuconfig 选择 TOUCHSCREEN_USBIR-
TOUCH_HY 重建内核;
(5)打开目 录/system/core/rootdir 目 录下的 ueventd.rc 文件,
该文件设置驱动挂载到/dev 目录下时的权限和所有者。 添加如
下内容:
/dev/usbirtouch 0666 root root
第 5 步的作用是增加程序访问驱动的权限。 经过上述步骤
编译的内核包含了新 USB 触屏驱动。 如果安卓系统版本高于
4.0, 还要需要将输入设备配置文件(idc)复制到/system/usr/idc 目
录下。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年9月18日
下一篇 2019年9月18日

相关推荐