嵌入式QT程式同時支援觸屏和滑鼠的解決辦法
阿新 • • 發佈:2019-02-20
嵌入式QT程式需要支援觸屏和滑鼠同時使用,一般會使用tslib庫(tslib和qt編譯請參照網上其他帖子)
qt和tslib配置如下:
# 注意替換庫檔案路徑和對應的裝置檔案路徑 LIB_ROOT=/usr QT_DIR=${LIB_ROOT}/qt4.8.6 TS_DIR=${LIB_ROOT}/tslib-1.8 export LD_LIBRARY_PATH=${LIB_ROOT}/lib:${QT_DIR}/lib:${TS_DIR}/lib:${ShellPath} export QT_QWS_FONTDIR=${QT_DIR}/lib/fonts export QWS_DISPLAY="LinuxFb:/dev/fb1" export QWS_MOUSE_PROTO="mouseman:/dev/input/mice tslib:/dev/input/touchscreen0" export TSLIB_TSDEVICE="/dev/input/touchscreen0" export TSLIB_CONFFILE=${TS_DIR}/etc/ts.conf export POINTERCAL_FILE=${TS_DIR}/etc/pointercal export TSLIB_CALIBFILE=${TS_DIR}/etc/pointercal export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb1 export TSLIB_PLUGINDIR=${TS_DIR}/lib/ts
使用這個配置時,滑鼠可以正常操作,觸屏操作就顯得有些魔性了...
解決思路:這個問題是由於觸屏裝置在input子系統註冊的時候,會被視為一個mouse裝置。/dev/input/mice這個裝置會連線所有的mouse裝置,導致觸屏裝置上報座標變化時,/dev/input/mice也會上報,此時mice上報的資料點不準確。
2個解決辦法(推薦使用第二種):
1. 在配置中不使用mice,將指定滑鼠的event handler固定(如固定為event1,配置時將mice替換為event1即可)。
2. 修改核心原始碼中的drivers/input/mousedev.c檔案。在將滑鼠裝置連線到mice的時候,忽略觸屏裝置,使觸屏裝置與mice互相獨立,互不影響。修改如下:
檔案頂部標頭檔案新增
#include <linux/string.h>
mousedev_connect 、 mousedev_disconnect 函式修改(此處我的觸屏裝置名為touchScreen)
static int mousedev_connect(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id) { struct mousedev *mousedev; int minor; int error; // add by wx: ignore touch screen static const char* tsname = "touchScreen"; printk(KERN_INFO "%s: %s", __func__, dev->name); for (minor = 0; minor < MOUSEDEV_MINORS; minor++) if (!mousedev_table[minor]) break; if (minor == MOUSEDEV_MINORS) { printk(KERN_ERR "mousedev: no more free mousedev devices\n"); return -ENFILE; } mousedev = mousedev_create(dev, handler, minor); if (IS_ERR(mousedev)) return PTR_ERR(mousedev); // add by wx: (mixdev_add_device) ignore touch screen if (!strcmp(dev->name, tsname)) return 0; error = mixdev_add_device(mousedev); if (error) { mousedev_destroy(mousedev); return error; } return 0; } static void mousedev_disconnect(struct input_handle *handle) { struct mousedev *mousedev = handle->private; // modify by wx: (mixdev_remove_device) ignore touch screen static const char* tsname = "touchScreen"; printk(KERN_INFO "%s: %s", __func__, handle->dev->name); if (strcmp(handle->dev->name, tsname)) mixdev_remove_device(mousedev); mousedev_destroy(mousedev); }
程式碼修改完成,重新編譯並燒寫核心之後再啟動QT程式,執行一切正常。