1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/*
* SiI8620 Linux Driver
*
* Copyright (C) 2013-2014 Silicon Image, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
* This program is distributed AS-IS WITHOUT ANY WARRANTY of any
* kind, whether express or implied; INCLUDING without the implied warranty
* of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE or NON-INFRINGEMENT.
* See the GNU General Public License for more details at
* http://www.gnu.org/licenses/gpl-2.0.html.
*/
#ifndef _SI_MDT_INPUTDEV_H_
#define _SI_MDT_INPUTDEV_H_
#define HID_INPUT_REPORT_CNT 7
#define MAX_TOUCH_CONTACTS 4
/* MDT header byte bit definitions */
#define REGISTRATION_SUCCESS 0
#define REGISTRATION_ERROR 1
#define KEY_PRESSED 1
#define KEY_RELEASED 0
#define MDT_TOUCH_INACTIVE 1
#define MDT_TOUCH_ACTIVE 2
/* Common header bit definitions */
#define MDT_HDR_IS_HID 0x80
#define MDT_HDR_IS_PORT_B 0x40
#define MDT_HDR_IS_KEYBOARD 0x20
#define MDT_HDR_IS_NOT_LAST 0x10
#define MDT_HDR_IS_NOT_MOUSE 0x08
/* Keyboard event specific header bit definitions */
#define MDT_HDR_KBD_LEFT_ALT 0x04
#define MDT_HDR_KBD_LEFT_SHIFT 0x02
#define MDT_HDR_KBD_LEFT_CTRL 0x01
/* Mouse event specific header bit definitions */
#define MDT_HDR_MOUSE_BUTTON_3 0x04
#define MDT_HDR_MOUSE_BUTTON_2 0x02
#define MDT_HDR_MOUSE_BUTTON_1 0x01
#define MDT_HDR_MOUSE_BUTTON_MASK 0x07
/* Touch pad event specific header bit definitions */
#define MDT_HDR_TOUCH_IS_TOUCHED 0x01
#define MDT_HDR_TOUCH_CONTACT_ID_MASK 0x06
/* Game controller event specific header bit definitions */
#define MDT_HDR_GAME_BUTTON_3 0x04
#define MDT_HDR_GAME_BUTTON_2 0x02
#define MDT_HDR_GAME_BUTTON_1 0x01
/* MDT hot-plug prefix and event information */
#define MDT_VERSION 1
#define M_CHAR 'M'
#define D_CHAR 'D'
#define T_CHAR 'T'
#define NOTICE_DEV_PLUG 'R'
#define NOTICE_DEV_UNPLUG 'U'
#define RESPONSE_ACK 'A'
#define RESPONSE_NACK 'N'
/* MDT Touch screen resources and parameters */
#define MDT_TOUCH_X 0
#define MDT_TOUCH_Y 1
#define BYTE_LOW 0
#define BYTE_HIGH 1
#define MDT_TOUCH_X_LOW BYTE_LOW
#define MDT_TOUCH_X_HIGH BYTE_HIGH
#define MDT_TOUCH_Y_LOW BYTE_LOW
#define MDT_TOUCH_Y_HIGH BYTE_HIGH
/* support 11 bit absolute addressing */
#define X_CORNER_RIGHT_LOWER 1870
#define Y_CORNER_RIGHT_LOWER 1870
#define ICS_BeagleboardxM 1
#define X_MAX 1920
#define Y_MAX 1920
#define SCALE_X_RAW 0
#define SCALE_X_SCREEN 0
#define SCALE_Y_RAW 0
#define SCALE_Y_SCREEN 0
#define X_SHIFT 0
#define Y_SHIFT 0
#define SWAP_LEFTRIGHT 0
#define SWAP_UPDOWN 0
#define SWAP_XY 0
#define SINGLE_TOUCH 1
#define CORNER_BUTTON 1
#define ICS_BAR 0
#define RIGHT_MOUSE_BUTTON_IS_ESC 1
/* requires installation of IDC file */
/* #define KERNEL_2_6_38_AND_LATER */
/* as of JB the IDC file is needed but, doesn't
guarantee acess to virtual buttons. */
#define JB_421 0
#if (JB_421 == 1)
#define X_BUTTON_BAR_START 0x4F0
#define Y_BUTTON_RECENTAPPS_TOP 0x050
#define Y_BUTTON_RECENTAPPS_BOTTOM 0x165
#define Y_BUTTON_HOME_TOP 0x185
#define Y_BUTTON_HOME_BOTTOM 0x2C0
#define Y_BUTTON_BACK_TOP 0x2E0
#define Y_BUTTON_BACK_BOTTOM 0x3E0
#endif
enum mdt_dev_state_e {
INPUT_DISABLED,
INPUT_WAITING_FOR_REGISTRATION,
INPUT_ACTIVE
};
enum mdt_dev_types_e {
MDT_TYPE_MOUSE,
MDT_TYPE_KEYBOARD,
MDT_TYPE_TOUCHSCREEN,
MDT_TYPE_COUNT
};
struct mdt_touch_history_t {
uint32_t abs_x;
uint32_t abs_y;
uint8_t isTouched;
uint8_t state;
};
struct mdt_inputdevs {
/* Prior HID input report */
uint8_t keycodes_old[HID_INPUT_REPORT_CNT];
/* Current HID input report */
uint8_t keycodes_new[HID_INPUT_REPORT_CNT];
struct input_dev *dev_keyboard;
struct input_dev *dev_mouse;
struct input_dev *dev_touchscreen;
/* Instance tracking variable */
uint8_t is_dev_registered[MDT_TYPE_COUNT];
struct mdt_touch_history_t prior_touch_events[MAX_TOUCH_CONTACTS];
unsigned char prior_touch_button;
#if (RIGHT_MOUSE_BUTTON_IS_ESC == 1)
unsigned char prior_right_button;
#endif
/* ser overrides to allow runtime calibration */
uint32_t x_max, y_max;
uint32_t x_screen, x_raw, x_shift;
uint32_t y_screen, y_raw, y_shift;
uint32_t swap_xy, swap_updown, swap_leftright;
};
struct keyboard_event_data {
uint8_t first_key[3];
uint8_t second_key[3];
};
struct mouse_event_data {
int8_t x_displacement;
int8_t y_displacement;
int8_t z_displacement;
uint8_t vendor_specific[2];
uint8_t vendor_specific_game_flag;
};
struct touch_pad_event_data {
uint8_t x_abs_coordinate[2];
uint8_t y_abs_coordinate[2];
uint8_t vendor_specific;
uint8_t vendor_specific_game_flag;
};
struct gaming_controller {
int8_t x_rel_displacement;
int8_t y_rel_displacement;
int8_t z_rel_displacement;
int8_t y2_rel_displacement;
uint8_t buttons_ext;
uint8_t id_dpad;
};
struct mdt_hotplug_data {
uint8_t sub_header_d;
uint8_t sub_header_t;
uint8_t event_code;
uint8_t device_type;
uint8_t mdt_version;
uint8_t reserved;
};
struct mdt_packet {
uint8_t adopter_id_h;
uint8_t adopter_id_l;
uint8_t header;
union {
struct keyboard_event_data keyboard;
struct mouse_event_data mouse;
struct touch_pad_event_data touch_pad;
struct gaming_controller game_controller;
struct mdt_hotplug_data hotplug;
uint8_t bytes[6];
} event;
};
struct mhl_dev_context;
extern struct attribute_group mdt_attr_group;
void mdt_toggle_keyboard_keycode(struct mhl_dev_context *dev_context,
unsigned char keycode);
bool si_mhl_tx_mdt_process_packet(struct mhl_dev_context *dev_context,
void *packet);
void mdt_destroy(struct mhl_dev_context *dev_context);
#endif /* #ifndef _SI_MDT_INPUTDEV_H_ */
|