1. 程式人生 > >嵌入式QT程式同時支援觸屏和滑鼠的解決辦法

嵌入式QT程式同時支援觸屏和滑鼠的解決辦法

嵌入式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程式,執行一切正常。