Linux(kernel 3.2.x)下,基于EETI触屏控制器、USB触控线的触屏应用,发现将USB触控线拔掉再插上后,触屏失灵,此时触屏驱动 eGTouhD的CPU急剧飙升,占用率在90%以上。

      查看触屏设备,发现USB触控线拔掉后,/dev/hidraw仍然存在,没有及时remove,此时再插上USB触控线,会在/dev下出现hidraw0的设备。因此判断故障点出在这里:USB触控线拔掉后,触控设备实际上已不存在,但是/dev/hidraw的存在使eGTouhD认为触控设备还存在,一直在读取/dev/hidraw,而不是读取重新插上后生成的新设备号/dev/hidraw1。

      运行udevadm --monitor,发现在拔掉USB触控线,内核没有发出remove 设备的信息。

      后从kernel.org官网找到一篇文档,更改drivers/hid/hidraw.c中更改device_destory执行的位置后,问题斛决,更改内容如下:

diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
index cb0137b..ab24ce2 100644
--- a/drivers/hid/hidraw.c
+++ b/drivers/hid/hidraw.c

@@ -320,13 +320,13 @@ static void drop_ref(struct hidraw *hidraw, int exists_bit)

hid_hw_close(hidraw->hid);

wake_up_interruptible(&hidraw->wait);

}

+ device_destroy(hidraw_class,

+ MKDEV(hidraw_major, hidraw->minor));

} else {

--hidraw->open;

}

if (!hidraw->open) {

if (!hidraw->exist) {

- device_destroy(hidraw_class,

- MKDEV(hidraw_major, hidraw->minor));

hidraw_table[hidraw->minor] = NULL;

kfree(hidraw);

} else {

参考文档:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/hid/hidraw.c?id=47587fc098451c2100dc1fb618855fc2e2d937af