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