]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/mousehid.c
check the usage of %d,%x,%ld,%lx and so on in debug print statement.
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbMouseAbsolutePointerDxe / mousehid.c
CommitLineData
09f72ae8 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
09f72ae8 39UINT8 *\r
40GetNextItem (\r
41 IN UINT8 *StartPos,\r
42 IN UINT8 *EndPos,\r
43 OUT HID_ITEM *HidItem\r
44 )\r
45{\r
46 UINT8 Temp;\r
47\r
48 if ((EndPos - StartPos) <= 0) {\r
49 return NULL;\r
50 }\r
51\r
52 Temp = *StartPos;\r
53 StartPos++;\r
54 //\r
55 // bit 2,3\r
56 //\r
57 HidItem->Type = (UINT8) ((Temp >> 2) & 0x03);\r
58 //\r
59 // bit 4-7\r
60 //\r
61 HidItem->Tag = (UINT8) ((Temp >> 4) & 0x0F);\r
62\r
63 if (HidItem->Tag == HID_ITEM_TAG_LONG) {\r
64 //\r
65 // Long Items are not supported by HID rev1.0,\r
66 // although we try to parse it.\r
67 //\r
68 HidItem->Format = HID_ITEM_FORMAT_LONG;\r
69\r
70 if ((EndPos - StartPos) >= 2) {\r
71 HidItem->Size = *StartPos++;\r
72 HidItem->Tag = *StartPos++;\r
73\r
74 if ((EndPos - StartPos) >= HidItem->Size) {\r
75 HidItem->Data.LongData = StartPos;\r
76 StartPos += HidItem->Size;\r
77 return StartPos;\r
78 }\r
79 }\r
80 } else {\r
81 HidItem->Format = HID_ITEM_FORMAT_SHORT;\r
82 //\r
83 // bit 0, 1\r
84 //\r
85 HidItem->Size = (UINT8) (Temp & 0x03);\r
86 switch (HidItem->Size) {\r
87\r
88 case 0:\r
89 //\r
90 // No data\r
91 //\r
92 return StartPos;\r
93\r
94 case 1:\r
95 //\r
96 // One byte data\r
97 //\r
98 if ((EndPos - StartPos) >= 1) {\r
99 HidItem->Data.U8 = *StartPos++;\r
100 return StartPos;\r
101 }\r
102\r
103 case 2:\r
104 //\r
105 // Two byte data\r
106 //\r
107 if ((EndPos - StartPos) >= 2) {\r
108 CopyMem (&HidItem->Data.U16, StartPos, sizeof (UINT16));\r
109 StartPos += 2;\r
110 return StartPos;\r
111 }\r
112\r
113 case 3:\r
114 //\r
115 // 4 byte data, adjust size\r
116 //\r
117 HidItem->Size++;\r
118 if ((EndPos - StartPos) >= 4) {\r
119 CopyMem (&HidItem->Data.U32, StartPos, sizeof (UINT32));\r
120 StartPos += 4;\r
121 return StartPos;\r
122 }\r
123 }\r
124 }\r
125\r
126 return NULL;\r
127}\r
128\r
129\r
130/**\r
131 Get Item Data\r
132\r
133 @param HidItem HID_ITEM\r
134\r
135 @return HidItem Data\r
136\r
137**/\r
09f72ae8 138UINT32\r
139GetItemData (\r
140 IN HID_ITEM *HidItem\r
141 )\r
142{\r
143 //\r
144 // Get Data from HID_ITEM structure\r
145 //\r
146 switch (HidItem->Size) {\r
147\r
148 case 1:\r
149 return HidItem->Data.U8;\r
150\r
151 case 2:\r
152 return HidItem->Data.U16;\r
153\r
154 case 4:\r
155 return HidItem->Data.U32;\r
156 }\r
157\r
158 return 0;\r
159}\r
160\r
161\r
162/**\r
163 Parse Local Item\r
164\r
165 @param UsbMouseAbsolutePointer USB_MOUSE_ABSOLUTE_POINTER_DEV\r
166 @param LocalItem Local Item\r
167\r
168\r
169**/\r
09f72ae8 170VOID\r
171ParseLocalItem (\r
172 IN USB_MOUSE_ABSOLUTE_POINTER_DEV *UsbMouseAbsolutePointer,\r
173 IN HID_ITEM *LocalItem\r
174 )\r
175{\r
176 UINT32 Data;\r
177\r
178 if (LocalItem->Size == 0) {\r
179 //\r
180 // No expected data for local item\r
181 //\r
182 return ;\r
183 }\r
184\r
185 Data = GetItemData (LocalItem);\r
186\r
187 switch (LocalItem->Tag) {\r
188\r
189 case HID_LOCAL_ITEM_TAG_DELIMITER:\r
190 //\r
191 // we don't support delimiter here\r
192 //\r
193 return ;\r
194\r
195 case HID_LOCAL_ITEM_TAG_USAGE:\r
196 return ;\r
197\r
198 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:\r
199 if (UsbMouseAbsolutePointer->PrivateData.ButtonDetected) {\r
200 UsbMouseAbsolutePointer->PrivateData.ButtonMinIndex = (UINT8) Data;\r
201 }\r
202\r
203 return ;\r
204\r
205 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:\r
206 {\r
207 if (UsbMouseAbsolutePointer->PrivateData.ButtonDetected) {\r
208 UsbMouseAbsolutePointer->PrivateData.ButtonMaxIndex = (UINT8) Data;\r
209 }\r
210\r
211 return ;\r
212 }\r
213 }\r
214}\r
215\r
09f72ae8 216VOID\r
217ParseGlobalItem (\r
218 IN USB_MOUSE_ABSOLUTE_POINTER_DEV *UsbMouseAbsolutePointer,\r
219 IN HID_ITEM *GlobalItem\r
220 )\r
221{\r
222 UINT8 UsagePage;\r
223\r
224 switch (GlobalItem->Tag) {\r
225 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:\r
226 {\r
227 UsagePage = (UINT8) GetItemData (GlobalItem);\r
228\r
229 //\r
230 // We only care Button Page here\r
231 //\r
232 if (UsagePage == 0x09) {\r
233 //\r
234 // Button Page\r
235 //\r
236 UsbMouseAbsolutePointer->PrivateData.ButtonDetected = TRUE;\r
237 return ;\r
238 }\r
239 break;\r
240 }\r
241\r
242 }\r
243}\r
244\r
245\r
246\r
247/**\r
248 Parse Main Item\r
249\r
250 @param UsbMouseAbsolutePointer USB_MOUSE_ABSOLUTE_POINTER_DEV\r
251 @param MainItem HID_ITEM to parse\r
252\r
253 @return VOID\r
254\r
255**/\r
09f72ae8 256VOID\r
257ParseMainItem (\r
258 IN USB_MOUSE_ABSOLUTE_POINTER_DEV *UsbMouseAbsolutePointer,\r
259 IN HID_ITEM *MainItem\r
260 )\r
261{\r
262 //\r
263 // we don't care any main items, just skip\r
264 //\r
265 return ;\r
266}\r
267\r
268\r
269/**\r
270 Parse Hid Item\r
271\r
272 @param UsbMouseAbsolutePointer USB_MOUSE_ABSOLUTE_POINTER_DEV\r
273 @param HidItem HidItem to parse\r
274\r
275 @return VOID\r
276\r
277**/\r
09f72ae8 278VOID\r
279ParseHidItem (\r
280 IN USB_MOUSE_ABSOLUTE_POINTER_DEV *UsbMouseAbsolutePointer,\r
281 IN HID_ITEM *HidItem\r
282 )\r
283{\r
284 switch (HidItem->Type) {\r
285\r
286 case HID_ITEM_TYPE_MAIN:\r
287 //\r
288 // For Main Item, parse main item\r
289 //\r
290 ParseMainItem (UsbMouseAbsolutePointer, HidItem);\r
291 break;\r
292\r
293 case HID_ITEM_TYPE_GLOBAL:\r
294 //\r
295 // For global Item, parse global item\r
296 //\r
297 ParseGlobalItem (UsbMouseAbsolutePointer, HidItem);\r
298 break;\r
299\r
300 case HID_ITEM_TYPE_LOCAL:\r
301 //\r
302 // For Local Item, parse local item\r
303 //\r
304 ParseLocalItem (UsbMouseAbsolutePointer, HidItem);\r
305 break;\r
306 }\r
307}\r
308//\r
309// A simple parse just read some field we are interested in\r
310//\r
311\r
312/**\r
313 Parse Mouse Report Descriptor\r
314\r
315 @param UsbMouse USB_MOUSE_DEV\r
316 @param ReportDescriptor Report descriptor to parse\r
317 @param ReportSize Report descriptor size\r
318\r
319 @retval EFI_DEVICE_ERROR Report descriptor error\r
320 @retval EFI_SUCCESS Success\r
321\r
322**/\r
323EFI_STATUS\r
324ParseMouseReportDescriptor (\r
325 IN USB_MOUSE_ABSOLUTE_POINTER_DEV *UsbMouseAbsolutePointer,\r
326 IN UINT8 *ReportDescriptor,\r
327 IN UINTN ReportSize\r
328 )\r
329{\r
330 UINT8 *DescriptorEnd;\r
331 UINT8 *ptr;\r
332 HID_ITEM HidItem;\r
333\r
334 DescriptorEnd = ReportDescriptor + ReportSize;\r
335\r
336 ptr = GetNextItem (ReportDescriptor, DescriptorEnd, &HidItem);\r
337\r
338 while (ptr != NULL) {\r
339 if (HidItem.Format != HID_ITEM_FORMAT_SHORT) {\r
340 //\r
341 // Long Format Item is not supported at current HID revision\r
342 //\r
343 return EFI_DEVICE_ERROR;\r
344 }\r
345\r
346 ParseHidItem (UsbMouseAbsolutePointer, &HidItem);\r
347\r
348 ptr = GetNextItem (ptr, DescriptorEnd, &HidItem);\r
349 }\r
350\r
351 UsbMouseAbsolutePointer->NumberOfButtons = (UINT8) (UsbMouseAbsolutePointer->PrivateData.ButtonMaxIndex - UsbMouseAbsolutePointer->PrivateData.ButtonMinIndex + 1);\r
352 UsbMouseAbsolutePointer->XLogicMax = UsbMouseAbsolutePointer->YLogicMax = 1023;\r
353 UsbMouseAbsolutePointer->XLogicMin = UsbMouseAbsolutePointer->YLogicMin = -1023;\r
354\r
355 return EFI_SUCCESS;\r
356}\r