1. Описание проблемы:
Для устройства Android требуется два экрана (lvds+mipi) и два USB-порта для обеспечения различного сенсорного управления двумя экранами. Потому что направление mipi и направление lvds изменяются на одно и то же. Направления двух USB TP также должны иметь одинаковый эффект, если они отображаются по-разному. В настоящее время данные, сообщаемые касанием, необходимо изменить на основе pid и vid. usb tp имеет универсальный сенсорный драйвер/kernel/drivers/hid/hid-multitouch.c
.
То есть vid отличается pid!
2. Метод модификации:
1. Добавьте файл idc в папку device/rockchip/rk3288/:
Vendor_222a_Product_0001.idc
#*****************************************************
# Input Device Configuration File for the generaltouch touch screen.
#*****************************************************
# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1
keyboard.layout = qwerty
keyboard.characterMap = qwerty
keyboard.orientationAware = 1
keyboard.builtIn = 1
cursor.mode = navigation
cursor.orientationAware = 1
device.internal = 0
Vendor_0457_Product_0819.idc
#*****************************************************
# Input Device Configuration File for the generaltouch touch screen.
#*****************************************************
# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1
keyboard.layout = qwerty
keyboard.characterMap = qwerty
keyboard.orientationAware = 1
keyboard.builtIn = 1
cursor.mode = navigation
cursor.orientationAware = 1
device.internal = 1
2. device/rockchip/rk3288/device.mk, копируем в систему:
# for usb tp
PRODUCT_COPY_FILES += \
device/rockchip/rk3288/Vendor_222a_Product_0001.idc:system/usr/idc/Vendor_222a_Product_0001.idc \
device/rockchip/rk3288/Vendor_0457_Product_0819.idc:system/usr/idc/Vendor_0457_Product_0819.idc
3. kernel/drivers/hid/hid-multitouch.c измените драйвер:
diff --git a/kernel/drivers/hid/hid-multitouch.c b/kernel/drivers/hid/hid-multitouch.c
old mode 100644new mode 100755
index 9de379c1b3..b8456b1e50
--- a/kernel/drivers/hid/hid-multitouch.c
+++ b/kernel/drivers/hid/hid-multitouch.c
@@ -98,7 +98,23 @@ struct mt_fields {
unsigned usages[HID_MAX_FIELDS];
unsigned int length;
};
-
+#define GTP_SWAP(x, y) do{
\
+ typeof(x) z = x;\
+ x = y;\
+ y = z;\
+ }while (0)
+
+#define MAINmGtpChange_X2Y 1
+#define MIANmGtp_X_Reverse 1
+#define MAINNmGtp_Y_Reverse 0
+static int MAINX_max=0;
+static int MAINY_max=0;
+
+#define AUXmGtpChange_X2Y 1
+#define AUXmGtp_X_Reverse 1
+#define AUXNmGtp_Y_Reverse 0
+static int AUXX_max=0;
+static int AUXY_max=0;
struct mt_device {
struct mt_slot curdata; /* placeholder of incoming data */
struct mt_class mtclass; /* our mt device class */
@@ -461,6 +477,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
case HID_UP_GENDESK:
switch (usage->hid) {
case HID_GD_X:
+ if (hdev->vendor==0x0457 && hdev->product==0x0819)
+ {
+ MAINX_max = field->logical_maximum;
+ }
+ else if (hdev->vendor==0x222a && hdev->product ==0x0001)
+ {
+ AUXX_max = field->logical_maximum;
+ }
if (prev_usage && (prev_usage->hid == usage->hid)) {
hid_map_usage(hi, usage, bit, max,
EV_ABS, ABS_MT_TOOL_X);
@@ -476,6 +500,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
mt_store_field(usage, td, hi);
return 1;
case HID_GD_Y:
+ if (hdev->vendor==0x0457 && hdev->product==0x0819)
+ {
+ MAINY_max = field->logical_maximum;
+ }
+ else if (hdev->vendor==0x222a && hdev->product ==0x0001)
+ {
+ AUXY_max = field->logical_maximum;
+ }
if (prev_usage && (prev_usage->hid == usage->hid)) {
hid_map_usage(hi, usage, bit, max,
EV_ABS, ABS_MT_TOOL_Y);
@@ -613,8 +645,10 @@ static int mt_compute_slot(struct mt_device *td, struct input_dev *input)
* this function is called when a whole contact has been processed,
* so that it can assign it to a slot and store the data there
*/
-static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
+static void mt_complete_slot(struct mt_device *td, struct input_dev *input,struct hid_device *hid_device)
{
+
+
if ((td->mtclass.quirks & MT_QUIRK_CONTACT_CNT_ACCURATE) &&
td->num_received >= td->num_expected)
return;
@@ -649,7 +683,33 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
int major = max(s->w, s->h) >> 1;
int minor = min(s->w, s->h) >> 1;
- input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);
+if (hid_device->vendor==0x0457 && hid_device->product==0x0819)
+{
+ #if MAINmGtpChange_X2Y
+ GTP_SWAP(s->x, s->y);
+ #endif
+ if(MIANmGtp_X_Reverse){
+ s->x = MAINX_max -s->x;+ }
+
+ if(MAINNmGtp_Y_Reverse){
+ s->y = MAINY_max - s->y;
+ }
+}
+else if (hid_device->vendor==0x222a && hid_device->product==0x0001)
+{
+ #if AUXmGtpChange_X2Y
+ GTP_SWAP(s->x, s->y);
+ #endif
+ if(AUXmGtp_X_Reverse){
+ s->x = AUXX_max -s->x;
+ }
+
+ if(AUXNmGtp_Y_Reverse){
+ s->y = AUXY_max - s->y;
+ }
+}
input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);
input_event(input, EV_ABS, ABS_MT_POSITION_Y, s->y);
input_event(input, EV_ABS, ABS_MT_TOOL_X, s->cx);
input_event(input, EV_ABS, ABS_MT_TOOL_Y, s->cy);
@@ -752,7 +812,7 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
if (usage->usage_index + 1 == field->report_count) {
/* we only take into account the last report. */
if (usage->hid == td->last_slot_field)
- mt_complete_slot(td, field->hidinput->input);
+ mt_complete_slot(td, field->hidinput->input,hid);
}
}
Определение значения параметра макроса:
define MAINmGtpChange_X2Y 1 // Обмен определения макроса для x и y главного экрана tp
define MIANmGtp_X_Reverse 1 // Для определения обратного макроса x для главного экрана tp
define MAINNmGtp_Y_Reverse 0 // определение обратного макроса y для главного экрана tp
define AUXmGtpChange_X2Y 1 // для вторичного экрана tp x и y определение макроса обмена
define AUXmGtp_X_Reverse 1 //x определение обратного макроса для вторичного экрана tp
define AUXNmGtp_Y_Reverse 0 //для вторичного экрана tp y обратный макрос определение
Вышеуказанные модификации эффективны при реальном тестировании на rk3288_7.1. Другие платформы могут ссылаться на модификации. Общий метод реализации аналогичен.
Информацию о свойствах сенсорного экрана, управляемого файлами idc, можно найти по ссылке:Отладка системы Android. Проблемы с сенсорным экраном через USB-интерфейс