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