安卓外挂红外触摸屏的软件设计
安卓外掛紅外觸摸屏的軟件設(shè)計(jì)
許海燕, 黃賢立
(淮陰師范學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 江蘇 淮安 223300)
【 摘 要】基于 Android 輸入系統(tǒng)開發(fā)了 安卓外掛紅外觸摸屏的驅(qū)動軟件。 USB 接口的紅外觸摸屏連接到 A83T 開
發(fā)板上,觸摸點(diǎn)數(shù)據(jù)通過安卓 Input 子系統(tǒng)上報(bào)。 本文描述了 觸摸系統(tǒng)的硬件架構(gòu)和安卓輸入系統(tǒng)的編程體系,給出了 觸
屏驅(qū)動的主要設(shè)計(jì)和實(shí)現(xiàn)過程。
【關(guān)鍵詞】安卓;觸摸屏;驅(qū)動設(shè)計(jì)
1 開發(fā)背景
紅外觸摸技術(shù)是一種自然的人機(jī)交互技術(shù), 利用了 LCD 屏
邊沿的紅外對管矩陣來檢測觸摸位置。 紅外管發(fā)出的脈沖形成
格柵, 手指觸摸屏幕會阻斷光束, 接收電路探測到光束的損失
便可確定 X 軸與 Y 軸的坐標(biāo)值。 對于兩點(diǎn)以上觸摸, 可通過多
軸掃描來處理, 實(shí)現(xiàn)真 2 點(diǎn)以上觸摸感知。
相比電阻、電容等觸摸屏, 紅外觸摸屏的特點(diǎn)是透光性好,
性價(jià)比高, 穩(wěn)定性好, 對觸摸物體無力度、導(dǎo)電等特殊要求。 紅
外觸摸屏常用接口有 COM 串口和 USB, 其中 USB 接口使用比
較靈活, 可插拔使用。 普通顯示器只要外掛一個尺寸相當(dāng)?shù)挠|
摸屏, 安裝好驅(qū)動程序即可使用。
市場上的觸摸展示機(jī)大多采用 Windows 系統(tǒng), 其優(yōu)點(diǎn)是軟
件兼容性好, 系統(tǒng)性能較強(qiáng), 缺點(diǎn)是功耗大, 散熱不好, 系統(tǒng)造
價(jià)高。 若采用安卓系統(tǒng), 可克服上述缺點(diǎn), 大大降低系統(tǒng)造價(jià),
提高系統(tǒng)的穩(wěn)定性。 安卓系統(tǒng)的觸摸系統(tǒng)適合用在對系統(tǒng)性能
要求不高, 功能相對單一的場合。 本文外掛觸摸屏選用了 22
寸的 USB 接口觸摸屏, 支持 2 點(diǎn)觸摸和 USB-HID 規(guī)范, Win-
dows7 以上可直接驅(qū)動, 不需要專門的驅(qū)動程序。 系統(tǒng)主板采用
了全志 A83T 開發(fā)板, 安卓版本為 4.4, linux 內(nèi)核版本為 3.1。 整
個觸摸系統(tǒng)架構(gòu)如圖 1 所示。
2 安卓驅(qū)動架構(gòu)
Android 驅(qū)動 主要分兩種類型: Android 專用驅(qū)動 和 An-
droid 使用的設(shè)備驅(qū)動 (linux), 觸摸屏屬于 Event 輸入設(shè)備驅(qū)
動。 輸入 Input 驅(qū)動程序的主設(shè)備號是 13, 次設(shè)備號是(Event
queue):64~95, 最多有 32 個。Input 子系統(tǒng)的結(jié)構(gòu)如圖 2 所示, 分
為三層: 硬件驅(qū)動層, 子系統(tǒng)核心層, 事件處理層。
(1) 硬件驅(qū)動層負(fù)責(zé)具體的硬件設(shè)備驅(qū)動, 本層代碼放在
內(nèi)核中, 是開發(fā)工作的核心內(nèi)容, 按照 GPL 協(xié)議, 這部分需要開
源。
(2) 安卓框架部分是上下兩個層之間的紐帶, 向上提供事
件處理層的接口, 向下提供驅(qū)動層的接口, 本部分一般不用修
改。
(3) 最上層應(yīng)用層負(fù)責(zé)與用戶程序打交道, 將下層傳來的
事件報(bào)告給用戶程序。
3 觸屏驅(qū)動設(shè)計(jì)
安卓的 linux3.1.10 版本的內(nèi)核中自帶了 USB 觸摸屏驅(qū)動,
位置是:
/kernel /drivers /input /touchscreen /usbtouchscreen.c, 添加
的專用觸摸驅(qū)動也放在這個目錄。
3.1 USB 驅(qū)動注冊
插入 USB 觸屏后, 首先進(jìn)行 USB 設(shè)備注冊, 入口是:
module_init(usbirtouch_init);
static int __init usbirtouch_init(void)
{
return usb_register(&usbirtouch_driver);
}
這里調(diào)用了 USB 注冊函數(shù), 需要傳入一個 usb_driver 結(jié)構(gòu)
體指針:
static struct usb_driver usbirtouch_driver = {
.name = "USBIRTOUCH",
.probe = usbirtouch_probe, .disconnect = usbir-
touch_disconnect,
.id_table = usbirtouch_id_table,
};
USB 設(shè)備驅(qū)動 usb_generic_driver 會和 USB 設(shè)備交互, 進(jìn)
行描述符的匹配, 匹配成功后將調(diào)用上述結(jié)構(gòu)體中 probe 域中
指定的 probe 函數(shù)。 其中的匹配表由 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 中兩個參數(shù), 第 1 個代表廠商
(Vendor)ID, 第 2 個代表產(chǎn)品(Product) ID.
在 probe 函數(shù)中, 需要通過 set_bit ()告知 input 子系統(tǒng)可以
報(bào)告的事件并初始化觸屏參數(shù):
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 表示觸摸的絕對坐標(biāo)值,
使用下面 3 個函數(shù)進(jìn)行觸屏參數(shù)初始化。
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 觸摸數(shù)據(jù)的上報(bào)
利用 urb 上報(bào)進(jìn)行數(shù)據(jù)上報(bào)。 上報(bào)前使用 usb_fill_int_urb(
)回調(diào) usbirtouch_irq( )函數(shù)進(jìn)行數(shù)據(jù)段填充。 主要代碼如下:
input_report_abs(dev,ABS_MT_POSITION_X, x);//X 軸
坐標(biāo)值
input_report_abs(dev,ABS_MT_POSITION_Y, y);//Y 軸
坐標(biāo)值
input_report_key(dev,BTN_TOUCH,1);//單擊
input_mt_sync(dev);
在每個點(diǎn)上報(bào)后需要緊跟一句 input_mt_sync()用于不同點(diǎn)
的間隔, 本批觸摸點(diǎn)上報(bào)完畢使用 input_sync(dev)表示本批次
上報(bào)結(jié)束。
4 驅(qū)動的編譯
編寫好的需要對內(nèi)核重新編譯, 主要步驟如下 :
(1) 將驅(qū)動程序復(fù)制到 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) 運(yùn)行 make menuconfig 選擇 TOUCHSCREEN_USBIR-
TOUCH_HY 重建內(nèi)核;
(5)打開目 錄/system/core/rootdir 目 錄下的 ueventd.rc 文件,
該文件設(shè)置驅(qū)動掛載到/dev 目錄下時的權(quán)限和所有者。 添加如
下內(nèi)容:
/dev/usbirtouch 0666 root root
第 5 步的作用是增加程序訪問驅(qū)動的權(quán)限。 經(jīng)過上述步驟
編譯的內(nèi)核包含了新 USB 觸屏驅(qū)動。 如果安卓系統(tǒng)版本高于
4.0, 還要需要將輸入設(shè)備配置文件(idc)復(fù)制到/system/usr/idc 目
錄下。
5 觸摸屏的校準(zhǔn)
由于外掛屏采用了絕對坐標(biāo), 安裝時也不可能與 LCD 高精
度對準(zhǔn), 需要軟件算法進(jìn)行校準(zhǔn), 其目 標(biāo)是將物理坐標(biāo)值轉(zhuǎn)換
為屏幕坐標(biāo)。 常用的校準(zhǔn)算法是 3 點(diǎn)、4 點(diǎn)與 5 點(diǎn)校準(zhǔn), 原理類
似。 校準(zhǔn)的數(shù)據(jù)保存在/dev/usbirtouch 目錄下, 但需要此目錄的
讀寫權(quán)限。 對于 3 點(diǎn)校準(zhǔn)算法使用方程組(1)來表示觸摸點(diǎn)的絕
對坐標(biāo)值與顯示設(shè)備上匹配點(diǎn)的關(guān)系:
X t = (A*X o + B*Y o + C)
Y t = (D*X o + E*Y o + F) (1)
其中(X t , Y t )為轉(zhuǎn)換后得到的顯示屏坐標(biāo), (X o , Y o )為原始的
觸摸屏坐標(biāo), A、B、C、D、E、F 為該線性算法的 6 個參數(shù)。 代入至
少三個不同點(diǎn)的坐標(biāo)值 (X o1 ,Y o1 ),(X o2 ,Y o2 ),(X o3 ,Y o3 ),(X t1 ,Y t1 ),(X t2 ,Y t2 ),
(X t3 ,Y t3 )到方程組(2), 得到 6 個方程。
X t1 = (A*X o1 + B*Y o1 + C)
X t2 = (A*X o2 + B*Y o2 + C)
X t3 = (A*X o3 + B*Y o3 + C)
Y t1 = (D*X o1 + E*Y o1 + F)
Y t2 = (D*X o2 + E*Y o2 + F)
Y t3 = (D*X o3 + E*Y o3 + F) (2)
求解方程確定 6 個參數(shù)后, 即可利用方程組(1) 計(jì)算觸摸
點(diǎn)對應(yīng)的屏幕點(diǎn)的坐標(biāo)。 將 6 個參數(shù)值存入指定文件, 觸摸屏
初始化時如果讀到校準(zhǔn)文件就不需要校準(zhǔn)了, 否則提示用戶運(yùn)
行程序校準(zhǔn)。 校準(zhǔn)程序限制于篇幅不再贅述。
6 結(jié)語
本文主要對基于安卓的外掛式紅外觸摸屏進(jìn)行了驅(qū)動設(shè)
計(jì), 實(shí)現(xiàn)了 2 點(diǎn)觸摸操作, 設(shè)計(jì)思想可用于其它大屏尺寸的觸
摸驅(qū)動開發(fā)。 由于 Input 輸入子系統(tǒng)涉及的知識較多和篇幅受
限, 細(xì)節(jié)沒有過多展開, 未來打算在觸摸防抖、抗干擾和提高分
辨率等方面做進(jìn)一步研究。
參考文獻(xiàn):
[1]許榮斌,謝瑩,朱永紅.觸摸屏校準(zhǔn)常用 算法分析[J].工業(yè)控制 計(jì)算
機(jī),2006. 19(4):77~ 78.
[2]於琪建,張海峰. Linux 輸入子系統(tǒng)在觸摸屏驅(qū)動上的實(shí)現(xiàn)[J]. 機(jī)電
工程, 2009,26 (3):32~ 34
[3] 王振麗等.Android 底層開發(fā)技術(shù)實(shí)戰(zhàn)詳解—— —?
內(nèi) 核、移植和驅(qū)動[M]. 北京:電子工業(yè)出版社,2015.3
[4]石堅(jiān), 白瑞林, 鄒駿宇, 馬濤. Android 多 點(diǎn)觸摸屏輸入系統(tǒng)的設(shè)計(jì)
與實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程與應(yīng)用. 2012(28)
作者簡介:
許海燕(1970-),男(漢族),江蘇省淮安人,副教授,碩士,研究方向
為物聯(lián)網(wǎng)和嵌入式開發(fā);黃賢立(1977-),男(漢族),安徽省碭山縣人,
副教授,碩士,主要研究方向?yàn)闄C(jī)器學(xué)習(xí)、人機(jī)用戶界面和生物信息學(xué)。
總結(jié)
以上是生活随笔為你收集整理的安卓外挂红外触摸屏的软件设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 视频上传 FFMpeg 视频格式
- 下一篇: 04.多元梯度下降算法