觸摸linux
A. linux 系統觸摸屏從左上方到右下方跑偏越來越嚴重!怎麼辦
是device tree設置觸摸屏介面(使用串口)設置成bufeer方式,改成收到數據就上傳問題就解決了;說明一下善於用minicom調試串口工具,很好定位問題。
B. 如何在ARM Linux下使用多點觸摸屏
我在3.2內核下做的,配合Xorg 1.2.4,Xinput2,Qt5.2.1。
首先,驅動程序probe的時候要聲明成多點觸摸的:
input_set_abs_params(input, ABS_X, 0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_Y, 0, pdata->y_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_X,
0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_Y,
0, pdata->y_res - 1, 0, 0);
error = input_mt_init_slots(input, MAX_SUPPORT_POINTS);
pdata是board-[mach].c裡面定義的platform data,如果是3.8以上的內核,你可以用device tree。
其次,提交觸摸數據的時候,要提交成多點的:
for (i = 0; i < MAX_SUPPORT_POINTS; i++)
{
type = posdata.touch[i].xh >> 6;
if (type == TOUCH_EVENT_RESERVED)
continue;
x = ((posdata.touch[i].xh << 8) | (posdata.touch[i].xl)) & 0x0fff;
y = ((posdata.touch[i].yh << 8) | (posdata.touch[i].yl)) & 0x0fff;
id = (posdata.touch[i].yh >> 4) & 0x0f;
down = (type != TOUCH_EVENT_UP);
input_mt_slot(tsdata->input, id);
input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down);
if (!down)
continue;
input_report_abs(tsdata->input, ABS_MT_POSITION_X, x);
input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y);
}
input_mt_report_pointer_emulation(tsdata->input, true);
input_sync(tsdata->input);
然後,Buildroot做根文件系統的時候要選上Target packages > Libraries > Hardware handling > mtdev和Target packages > Graphic libraries and applications (graphic/text) > X.org X Window System > X11R7 Drivers > xf86-input-evdev,網上有很多文章說如何讓X支持多點觸摸的,那都是過去式了,現在的X和xf86-input-evdev都支持多點觸摸。
最後,編譯Qt開發包的時候要加上-xinput2選項,在qtbase/examples/touch里能找到觸摸屏的樣例代碼。
C. 如何在Linux下禁用鍵盤,觸摸板,滑鼠等輸入設備
用 xinput 來禁用/啟用輸入設備。我經常用 synclient 來關掉我的觸摸板, 或者用 xinput 來關閉我的筆記本鍵盤。
第一步我們需要先拿到設備的名字或者ID:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ USB Optical Mouse id=8 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=7 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Power Button id=10 [slave keyboard (3)]
↳ Video Bus id=11 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=6 [slave keyboard (3)]
在這里觸摸板的名字是 'SynPS/2 Synaptics TouchPad' ID是 7;
鍵盤的名字是 'AT Translated Set 2 keyboard' ID是 6.
下一步我們要知道設備都有什麼屬性:
$ xinput list-props 'AT Translated Set 2 keyboard'
Device 'AT Translated Set 2 keyboard':
Device Enabled (127): 1
鍵盤只有一個屬性 'Device Enabled' 他的值是 1,意思就是說鍵盤是打開狀態的。
我們來嘗試關掉它:
sleep 0.1 ; xinput set-prop 'AT Translated Set 2 keyboard' 'Device Enabled' 0 ; sleep 5 ; xinput set-prop 'AT Translated Set 2 keyboard' 'Device Enabled' 1
開頭 sleep 0.1 的目的是要留出時間讓你執行當前命令時所敲的回車的按鍵(keypress)事件能夠完成, 我猜測當你按下回車時命令就會執行並把鍵盤禁用,但是按鍵彈起(keyup)還沒有被發送,所以X會以為你一直按這回車鍵。
另一個更簡單的用法是用ID來進行操作,這樣你就不需要輸入一大長串的名字了:
sleep 0.1 ; xinput set-prop 8 127 0 ; sleep 5 ; xinput set-prop 8 127 1
鍵盤的ID是8, 屬性 'Device Enabled' 的ID是127。 當你用 list-props 列出設備屬性時, 在屬性名後面的數字就是屬性的ID。 像 'Device Enabled' 的ID總是 127,但是設備的ID就不一樣,它跟設備的連接時間有關,一般越先連接的設備ID越小,之後會越來越大。
PS:設置設備屬性不需要root許可權。
D. linux下 觸摸屏驅動載入後,只能單擊,不能移動,要怎麼解決
電阻屏吧。。。你自己數據上報機制問題。觸摸屏按下 上報 啟動一個延時timer 延時 timer 到 再繼續上報數據 觸摸屏抬起 上報事件結束 刪除 timer 大概就是這樣
E. 安裝linux後觸摸板不能用
1、在終端輸入以下代碼
sudo modprobe -r psmouse
sudo modprobe psmouse
重新載入相應模塊後好了(對於這種情況不管用)
2、有可能是關機前觸摸板就處於關閉狀態,這種情況下先打開觸摸板,再重啟一次系統觸摸板就能恢復工作 。
在終端輸入以下代碼
sudo modprobe -r psmouse
sudo modprobe psmouse proto=imps
sudo gedit /etc/modprobe.d/options
添加 options psmouse proto=imps
保存改動重啟。