3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 Parse mouse hid descriptor
25 // Get an item from report descriptor
42 StartPos - Start Position
44 HidItem - HidItem to return
53 if ((EndPos
- StartPos
) <= 0) {
62 HidItem
->Type
= (UINT8
) ((Temp
>> 2) & 0x03);
66 HidItem
->Tag
= (UINT8
) ((Temp
>> 4) & 0x0F);
68 if (HidItem
->Tag
== HID_ITEM_TAG_LONG
) {
70 // Long Items are not supported by HID rev1.0,
71 // although we try to parse it.
73 HidItem
->Format
= HID_ITEM_FORMAT_LONG
;
75 if ((EndPos
- StartPos
) >= 2) {
76 HidItem
->Size
= *StartPos
++;
77 HidItem
->Tag
= *StartPos
++;
79 if ((EndPos
- StartPos
) >= HidItem
->Size
) {
80 HidItem
->Data
.LongData
= StartPos
;
81 StartPos
+= HidItem
->Size
;
86 HidItem
->Format
= HID_ITEM_FORMAT_SHORT
;
90 HidItem
->Size
= (UINT8
) (Temp
& 0x03);
91 switch (HidItem
->Size
) {
103 if ((EndPos
- StartPos
) >= 1) {
104 HidItem
->Data
.U8
= *StartPos
++;
112 if ((EndPos
- StartPos
) >= 2) {
113 CopyMem (&HidItem
->Data
.U16
, StartPos
, sizeof (UINT16
));
120 // 4 byte data, adjust size
123 if ((EndPos
- StartPos
) >= 4) {
124 CopyMem (&HidItem
->Data
.U32
, StartPos
, sizeof (UINT32
));
156 // Get Data from HID_ITEM structure
158 switch (HidItem
->Size
) {
161 return HidItem
->Data
.U8
;
164 return HidItem
->Data
.U16
;
167 return HidItem
->Data
.U32
;
176 IN USB_MOUSE_DEV
*UsbMouse
,
177 IN HID_ITEM
*LocalItem
187 UsbMouse - USB_MOUSE_DEV
188 LocalItem - Local Item
196 if (LocalItem
->Size
== 0) {
198 // No expected data for local item
203 Data
= GetItemData (LocalItem
);
205 switch (LocalItem
->Tag
) {
207 case HID_LOCAL_ITEM_TAG_DELIMITER
:
209 // we don't support delimiter here
213 case HID_LOCAL_ITEM_TAG_USAGE
:
216 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM
:
217 if (UsbMouse
->PrivateData
.ButtonDetected
) {
218 UsbMouse
->PrivateData
.ButtonMinIndex
= (UINT8
) Data
;
223 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM
:
225 if (UsbMouse
->PrivateData
.ButtonDetected
) {
226 UsbMouse
->PrivateData
.ButtonMaxIndex
= (UINT8
) Data
;
237 IN USB_MOUSE_DEV
*UsbMouse
,
238 IN HID_ITEM
*GlobalItem
243 switch (GlobalItem
->Tag
) {
244 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE
:
246 UsagePage
= (UINT8
) GetItemData (GlobalItem
);
249 // We only care Button Page here
251 if (UsagePage
== 0x09) {
255 UsbMouse
->PrivateData
.ButtonDetected
= TRUE
;
268 IN USB_MOUSE_DEV
*UsbMouse
,
269 IN HID_ITEM
*MainItem
279 UsbMouse - TODO: add argument description
280 MainItem - HID_ITEM to parse
289 // we don't care any main items, just skip
297 IN USB_MOUSE_DEV
*UsbMouse
,
308 UsbMouse - USB_MOUSE_DEV
309 HidItem - HidItem to parse
317 switch (HidItem
->Type
) {
319 case HID_ITEM_TYPE_MAIN
:
321 // For Main Item, parse main item
323 ParseMainItem (UsbMouse
, HidItem
);
326 case HID_ITEM_TYPE_GLOBAL
:
328 // For global Item, parse global item
330 ParseGlobalItem (UsbMouse
, HidItem
);
333 case HID_ITEM_TYPE_LOCAL
:
335 // For Local Item, parse local item
337 ParseLocalItem (UsbMouse
, HidItem
);
342 // A simple parse just read some field we are interested in
345 ParseMouseReportDescriptor (
346 IN USB_MOUSE_DEV
*UsbMouse
,
347 IN UINT8
*ReportDescriptor
,
354 Parse Mouse Report Descriptor
358 UsbMouse - USB_MOUSE_DEV
359 ReportDescriptor - Report descriptor to parse
360 ReportSize - Report descriptor size
364 EFI_DEVICE_ERROR - Report descriptor error
365 EFI_SUCCESS - Success
369 UINT8
*DescriptorEnd
;
373 DescriptorEnd
= ReportDescriptor
+ ReportSize
;
375 ptr
= GetNextItem (ReportDescriptor
, DescriptorEnd
, &HidItem
);
377 while (ptr
!= NULL
) {
378 if (HidItem
.Format
!= HID_ITEM_FORMAT_SHORT
) {
380 // Long Format Item is not supported at current HID revision
382 return EFI_DEVICE_ERROR
;
385 ParseHidItem (UsbMouse
, &HidItem
);
387 ptr
= GetNextItem (ptr
, DescriptorEnd
, &HidItem
);
390 UsbMouse
->NumberOfButtons
= (UINT8
) (UsbMouse
->PrivateData
.ButtonMaxIndex
- UsbMouse
->PrivateData
.ButtonMinIndex
+ 1);
391 UsbMouse
->XLogicMax
= UsbMouse
->YLogicMax
= 127;
392 UsbMouse
->XLogicMin
= UsbMouse
->YLogicMin
= -127;