安卓外掛紅外觸摸屏的軟件設計

安卓外掛紅外觸摸屏的軟件設計
許海燕, 黃賢立
(淮陰師範學院計算機科學與技術學院 江蘇 淮安 223300)
【 摘 要】基於 Android 輸入系統開發了 安卓外掛紅外觸摸屏的驅動軟件。 USB 接口的紅外觸摸屏連接到 A83T 開
發板上,觸摸點數據通過安卓 Input 子系統上報。 本文描述了 觸摸系統的硬件架構和安卓輸入系統的編程體系,給出了 觸
屏驅動的主要設計和實現過程。
【關鍵詞】安卓;觸摸屏;驅動設計

1 開發背景
紅外觸摸技術是一種自然的人機交互技術, 利用了 LCD 屏
邊沿的紅外對管矩陣來檢測觸摸位置。 紅外管發出的脈衝形成
格柵, 手指觸摸屏幕會阻斷光束, 接收電路探測到光束的損失
便可確定 X 軸與 Y 軸的座標值。 對於兩點以上觸摸, 可通過多
軸掃描來處理, 實現真 2 點以上觸摸感知。
相比電阻、電容等觸摸屏, 紅外觸摸屏的特點是透光性好,
性價比高, 穩定性好, 對觸摸物體無力度、導電等特殊要求。 紅
外觸摸屏常用接口有 COM 串口和 USB, 其中 USB 接口使用比
較靈活, 可插拔使用。 普通顯示器只要外掛一個尺寸相當的觸
摸屏, 安裝好驅動程序即可使用。
市場上的觸摸展示機大多采用 Windows 系統, 其優點是軟
件兼容性好, 系統性能較強, 缺點是功耗大, 散熱不好, 系統造
價高。 若採用安卓系統, 可克服上述缺點, 大大降低系統造價,
提高系統的穩定性。 安卓系統的觸摸系統適合用在對系統性能
要求不高, 功能相對單一的場合。 本文外掛觸摸屏選用了 22
寸的 USB 接口觸摸屏, 支持 2 點觸摸和 USB-HID 規範, Win-
dows7 以上可直接驅動, 不需要專門的驅動程序。 系統主板採用
了全志 A83T 開發板, 安卓版本爲 4.4, linux 內核版本爲 3.1。 整
個觸摸系統架構如圖 1 所示。

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 目
錄下。

5 觸摸屏的校準
由於外掛屏採用了絕對座標, 安裝時也不可能與 LCD 高精
度對準, 需要軟件算法進行校準, 其目 標是將物理座標值轉換
爲屏幕座標。 常用的校準算法是 3 點、4 點與 5 點校準, 原理類
似。 校準的數據保存在/dev/usbirtouch 目錄下, 但需要此目錄的
讀寫權限。 對於 3 點校準算法使用方程組(1)來表示觸摸點的絕
對座標值與顯示設備上匹配點的關係:
X t = (A*X o + B*Y o + C)
Y t = (D*X o + E*Y o + F) (1)
其中(X t , Y t )爲轉換後得到的顯示屏座標, (X o , Y o )爲原始的
觸摸屏座標, A、B、C、D、E、F 爲該線性算法的 6 個參數。 代入至
少三個不同點的座標值 (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 個參數後, 即可利用方程組(1) 計算觸摸
點對應的屏幕點的座標。 將 6 個參數值存入指定文件, 觸摸屏
初始化時如果讀到校準文件就不需要校準了, 否則提示用戶運
行程序校準。 校準程序限制於篇幅不再贅述。
6 結語
本文主要對基於安卓的外掛式紅外觸摸屏進行了驅動設
計, 實現了 2 點觸摸操作, 設計思想可用於其它大屏尺寸的觸
摸驅動開發。 由於 Input 輸入子系統涉及的知識較多和篇幅受
限, 細節沒有過多展開, 未來打算在觸摸防抖、抗干擾和提高分
辨率等方面做進一步研究。
參考文獻:
[1]許榮斌,謝瑩,朱永紅.觸摸屏校準常用 算法分析[J].工業控制 計算
機,2006. 19(4):77~ 78.
[2]於琪建,張海峯. Linux 輸入子系統在觸摸屏驅動上的實現[J]. 機電
工程, 2009,26 (3):32~ 34
[3] 王振麗等.Android 底層開發技術實戰詳解—— — 

內 核、移植和驅動[M]. 北京:電子工業出版社,2015.3
[4]石堅, 白瑞林, 鄒駿宇, 馬濤. Android 多 點觸摸屏輸入系統的設計
與實現[J]. 計算機工程與應用. 2012(28)
作者簡介:
許海燕(1970-),男(漢族),江蘇省淮安人,副教授,碩士,研究方向
爲物聯網和嵌入式開發;黃賢立(1977-),男(漢族),安徽省碭山縣人,
副教授,碩士,主要研究方向爲機器學習、人機用戶界面和生物信息學。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章