]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Usb/UsbMouseDxe/mousehid.c
remove some comments introduced by tools.
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbMouseDxe / mousehid.c
CommitLineData
ed838d0c 1/** @file\r
2\r
3Copyright (c) 2004, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 Mousehid.c\r
15\r
16Abstract:\r
17 Parse mouse hid descriptor\r
18\r
19\r
20**/\r
21\r
22#include "mousehid.h"\r
23\r
24\r
25//\r
26// Get an item from report descriptor\r
27//\r
28\r
29/**\r
30 Get Next Item\r
31\r
32 @param StartPos Start Position\r
33 @param EndPos End Position\r
34 @param HidItem HidItem to return\r
35\r
36 @return Position\r
37\r
38**/\r
39STATIC\r
40UINT8 *\r
41GetNextItem (\r
42 IN UINT8 *StartPos,\r
43 IN UINT8 *EndPos,\r
44 OUT HID_ITEM *HidItem\r
45 )\r
46{\r
47 UINT8 Temp;\r
48\r
49 if ((EndPos - StartPos) <= 0) {\r
50 return NULL;\r
51 }\r
52\r
53 Temp = *StartPos;\r
54 StartPos++;\r
55 //\r
56 // bit 2,3\r
57 //\r
58 HidItem->Type = (UINT8) ((Temp >> 2) & 0x03);\r
59 //\r
60 // bit 4-7\r
61 //\r
62 HidItem->Tag = (UINT8) ((Temp >> 4) & 0x0F);\r
63\r
64 if (HidItem->Tag == HID_ITEM_TAG_LONG) {\r
65 //\r
66 // Long Items are not supported by HID rev1.0,\r
67 // although we try to parse it.\r
68 //\r
69 HidItem->Format = HID_ITEM_FORMAT_LONG;\r
70\r
71 if ((EndPos - StartPos) >= 2) {\r
72 HidItem->Size = *StartPos++;\r
73 HidItem->Tag = *StartPos++;\r
74\r
75 if ((EndPos - StartPos) >= HidItem->Size) {\r
76 HidItem->Data.LongData = StartPos;\r
77 StartPos += HidItem->Size;\r
78 return StartPos;\r
79 }\r
80 }\r
81 } else {\r
82 HidItem->Format = HID_ITEM_FORMAT_SHORT;\r
83 //\r
84 // bit 0, 1\r
85 //\r
86 HidItem->Size = (UINT8) (Temp & 0x03);\r
87 switch (HidItem->Size) {\r
88\r
89 case 0:\r
90 //\r
91 // No data\r
92 //\r
93 return StartPos;\r
94\r
95 case 1:\r
96 //\r
97 // One byte data\r
98 //\r
99 if ((EndPos - StartPos) >= 1) {\r
100 HidItem->Data.U8 = *StartPos++;\r
101 return StartPos;\r
102 }\r
103\r
104 case 2:\r
105 //\r
106 // Two byte data\r
107 //\r
108 if ((EndPos - StartPos) >= 2) {\r
109 CopyMem (&HidItem->Data.U16, StartPos, sizeof (UINT16));\r
110 StartPos += 2;\r
111 return StartPos;\r
112 }\r
113\r
114 case 3:\r
115 //\r
116 // 4 byte data, adjust size\r
117 //\r
118 HidItem->Size++;\r
119 if ((EndPos - StartPos) >= 4) {\r
120 CopyMem (&HidItem->Data.U32, StartPos, sizeof (UINT32));\r
121 StartPos += 4;\r
122 return StartPos;\r
123 }\r
124 }\r
125 }\r
126\r
127 return NULL;\r
128}\r
129\r
130\r
131/**\r
132 Get Item Data\r
133\r
134 @param HidItem HID_ITEM\r
135\r
136 @return HidItem Data\r
137\r
138**/\r
139STATIC\r
140UINT32\r
141GetItemData (\r
142 IN HID_ITEM *HidItem\r
143 )\r
144{\r
145 //\r
146 // Get Data from HID_ITEM structure\r
147 //\r
148 switch (HidItem->Size) {\r
149\r
150 case 1:\r
151 return HidItem->Data.U8;\r
152\r
153 case 2:\r
154 return HidItem->Data.U16;\r
155\r
156 case 4:\r
157 return HidItem->Data.U32;\r
158 }\r
159\r
160 return 0;\r
161}\r
162\r
163\r
164/**\r
165 Parse Local Item\r
166\r
167 @param UsbMouse USB_MOUSE_DEV\r
168 @param LocalItem Local Item\r
169\r
170\r
171**/\r
172STATIC\r
173VOID\r
174ParseLocalItem (\r
175 IN USB_MOUSE_DEV *UsbMouse,\r
176 IN HID_ITEM *LocalItem\r
177 )\r
178{\r
179 UINT32 Data;\r
180\r
181 if (LocalItem->Size == 0) {\r
182 //\r
183 // No expected data for local item\r
184 //\r
185 return ;\r
186 }\r
187\r
188 Data = GetItemData (LocalItem);\r
189\r
190 switch (LocalItem->Tag) {\r
191\r
192 case HID_LOCAL_ITEM_TAG_DELIMITER:\r
193 //\r
194 // we don't support delimiter here\r
195 //\r
196 return ;\r
197\r
198 case HID_LOCAL_ITEM_TAG_USAGE:\r
199 return ;\r
200\r
201 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:\r
202 if (UsbMouse->PrivateData.ButtonDetected) {\r
203 UsbMouse->PrivateData.ButtonMinIndex = (UINT8) Data;\r
204 }\r
205\r
206 return ;\r
207\r
208 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:\r
209 {\r
210 if (UsbMouse->PrivateData.ButtonDetected) {\r
211 UsbMouse->PrivateData.ButtonMaxIndex = (UINT8) Data;\r
212 }\r
213\r
214 return ;\r
215 }\r
216 }\r
217}\r
218\r
219STATIC\r
220VOID\r
221ParseGlobalItem (\r
222 IN USB_MOUSE_DEV *UsbMouse,\r
223 IN HID_ITEM *GlobalItem\r
224 )\r
225{\r
226 UINT8 UsagePage;\r
227\r
228 switch (GlobalItem->Tag) {\r
229 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:\r
230 {\r
231 UsagePage = (UINT8) GetItemData (GlobalItem);\r
232\r
233 //\r
234 // We only care Button Page here\r
235 //\r
236 if (UsagePage == 0x09) {\r
237 //\r
238 // Button Page\r
239 //\r
240 UsbMouse->PrivateData.ButtonDetected = TRUE;\r
241 return ;\r
242 }\r
243 break;\r
244 }\r
245\r
246 }\r
247}\r
248\r
249\r
250\r
251/**\r
252 Parse Main Item\r
253\r
254 @param UsbMouse TODO: add argument description\r
255 @param MainItem HID_ITEM to parse\r
256\r
257 @return VOID\r
258\r
259**/\r
260STATIC\r
261VOID\r
262ParseMainItem (\r
263 IN USB_MOUSE_DEV *UsbMouse,\r
264 IN HID_ITEM *MainItem\r
265 )\r
266{\r
267 //\r
268 // we don't care any main items, just skip\r
269 //\r
270 return ;\r
271}\r
272\r
273\r
274/**\r
275 Parse Hid Item\r
276\r
277 @param UsbMouse USB_MOUSE_DEV\r
278 @param HidItem HidItem to parse\r
279\r
280 @return VOID\r
281\r
282**/\r
283STATIC\r
284VOID\r
285ParseHidItem (\r
286 IN USB_MOUSE_DEV *UsbMouse,\r
287 IN HID_ITEM *HidItem\r
288 )\r
289{\r
290 switch (HidItem->Type) {\r
291\r
292 case HID_ITEM_TYPE_MAIN:\r
293 //\r
294 // For Main Item, parse main item\r
295 //\r
296 ParseMainItem (UsbMouse, HidItem);\r
297 break;\r
298\r
299 case HID_ITEM_TYPE_GLOBAL:\r
300 //\r
301 // For global Item, parse global item\r
302 //\r
303 ParseGlobalItem (UsbMouse, HidItem);\r
304 break;\r
305\r
306 case HID_ITEM_TYPE_LOCAL:\r
307 //\r
308 // For Local Item, parse local item\r
309 //\r
310 ParseLocalItem (UsbMouse, HidItem);\r
311 break;\r
312 }\r
313}\r
314//\r
315// A simple parse just read some field we are interested in\r
316//\r
317\r
318/**\r
319 Parse Mouse Report Descriptor\r
320\r
321 @param UsbMouse USB_MOUSE_DEV\r
322 @param ReportDescriptor Report descriptor to parse\r
323 @param ReportSize Report descriptor size\r
324\r
325 @retval EFI_DEVICE_ERROR Report descriptor error\r
326 @retval EFI_SUCCESS Success\r
327\r
328**/\r
329EFI_STATUS\r
330ParseMouseReportDescriptor (\r
331 IN USB_MOUSE_DEV *UsbMouse,\r
332 IN UINT8 *ReportDescriptor,\r
333 IN UINTN ReportSize\r
334 )\r
335{\r
336 UINT8 *DescriptorEnd;\r
337 UINT8 *ptr;\r
338 HID_ITEM HidItem;\r
339\r
340 DescriptorEnd = ReportDescriptor + ReportSize;\r
341\r
342 ptr = GetNextItem (ReportDescriptor, DescriptorEnd, &HidItem);\r
343\r
344 while (ptr != NULL) {\r
345 if (HidItem.Format != HID_ITEM_FORMAT_SHORT) {\r
346 //\r
347 // Long Format Item is not supported at current HID revision\r
348 //\r
349 return EFI_DEVICE_ERROR;\r
350 }\r
351\r
352 ParseHidItem (UsbMouse, &HidItem);\r
353\r
354 ptr = GetNextItem (ptr, DescriptorEnd, &HidItem);\r
355 }\r
356\r
357 UsbMouse->NumberOfButtons = (UINT8) (UsbMouse->PrivateData.ButtonMaxIndex - UsbMouse->PrivateData.ButtonMinIndex + 1);\r
358 UsbMouse->XLogicMax = UsbMouse->YLogicMax = 127;\r
359 UsbMouse->XLogicMin = UsbMouse->YLogicMin = -127;\r
360\r
361 return EFI_SUCCESS;\r
362}\r