3 Copyright (c) 2004, 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
26 // Get an item from report descriptor
32 @param StartPos Start Position
33 @param EndPos End Position
34 @param HidItem HidItem to return
48 if ((EndPos
- StartPos
) <= 0) {
57 HidItem
->Type
= (UINT8
) ((Temp
>> 2) & 0x03);
61 HidItem
->Tag
= (UINT8
) ((Temp
>> 4) & 0x0F);
63 if (HidItem
->Tag
== HID_ITEM_TAG_LONG
) {
65 // Long Items are not supported by HID rev1.0,
66 // although we try to parse it.
68 HidItem
->Format
= HID_ITEM_FORMAT_LONG
;
70 if ((EndPos
- StartPos
) >= 2) {
71 HidItem
->Size
= *StartPos
++;
72 HidItem
->Tag
= *StartPos
++;
74 if ((EndPos
- StartPos
) >= HidItem
->Size
) {
75 HidItem
->Data
.LongData
= StartPos
;
76 StartPos
+= HidItem
->Size
;
81 HidItem
->Format
= HID_ITEM_FORMAT_SHORT
;
85 HidItem
->Size
= (UINT8
) (Temp
& 0x03);
86 switch (HidItem
->Size
) {
98 if ((EndPos
- StartPos
) >= 1) {
99 HidItem
->Data
.U8
= *StartPos
++;
107 if ((EndPos
- StartPos
) >= 2) {
108 CopyMem (&HidItem
->Data
.U16
, StartPos
, sizeof (UINT16
));
115 // 4 byte data, adjust size
118 if ((EndPos
- StartPos
) >= 4) {
119 CopyMem (&HidItem
->Data
.U32
, StartPos
, sizeof (UINT32
));
133 @param HidItem HID_ITEM
144 // Get Data from HID_ITEM structure
146 switch (HidItem
->Size
) {
149 return HidItem
->Data
.U8
;
152 return HidItem
->Data
.U16
;
155 return HidItem
->Data
.U32
;
165 @param UsbMouseAbsolutePointer USB_MOUSE_ABSOLUTE_POINTER_DEV
166 @param LocalItem Local Item
172 IN USB_MOUSE_ABSOLUTE_POINTER_DEV
*UsbMouseAbsolutePointer
,
173 IN HID_ITEM
*LocalItem
178 if (LocalItem
->Size
== 0) {
180 // No expected data for local item
185 Data
= GetItemData (LocalItem
);
187 switch (LocalItem
->Tag
) {
189 case HID_LOCAL_ITEM_TAG_DELIMITER
:
191 // we don't support delimiter here
195 case HID_LOCAL_ITEM_TAG_USAGE
:
198 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM
:
199 if (UsbMouseAbsolutePointer
->PrivateData
.ButtonDetected
) {
200 UsbMouseAbsolutePointer
->PrivateData
.ButtonMinIndex
= (UINT8
) Data
;
205 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM
:
207 if (UsbMouseAbsolutePointer
->PrivateData
.ButtonDetected
) {
208 UsbMouseAbsolutePointer
->PrivateData
.ButtonMaxIndex
= (UINT8
) Data
;
218 IN USB_MOUSE_ABSOLUTE_POINTER_DEV
*UsbMouseAbsolutePointer
,
219 IN HID_ITEM
*GlobalItem
224 switch (GlobalItem
->Tag
) {
225 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE
:
227 UsagePage
= (UINT8
) GetItemData (GlobalItem
);
230 // We only care Button Page here
232 if (UsagePage
== 0x09) {
236 UsbMouseAbsolutePointer
->PrivateData
.ButtonDetected
= TRUE
;
250 @param UsbMouseAbsolutePointer USB_MOUSE_ABSOLUTE_POINTER_DEV
251 @param MainItem HID_ITEM to parse
258 IN USB_MOUSE_ABSOLUTE_POINTER_DEV
*UsbMouseAbsolutePointer
,
259 IN HID_ITEM
*MainItem
263 // we don't care any main items, just skip
272 @param UsbMouseAbsolutePointer USB_MOUSE_ABSOLUTE_POINTER_DEV
273 @param HidItem HidItem to parse
280 IN USB_MOUSE_ABSOLUTE_POINTER_DEV
*UsbMouseAbsolutePointer
,
284 switch (HidItem
->Type
) {
286 case HID_ITEM_TYPE_MAIN
:
288 // For Main Item, parse main item
290 ParseMainItem (UsbMouseAbsolutePointer
, HidItem
);
293 case HID_ITEM_TYPE_GLOBAL
:
295 // For global Item, parse global item
297 ParseGlobalItem (UsbMouseAbsolutePointer
, HidItem
);
300 case HID_ITEM_TYPE_LOCAL
:
302 // For Local Item, parse local item
304 ParseLocalItem (UsbMouseAbsolutePointer
, HidItem
);
309 // A simple parse just read some field we are interested in
313 Parse Mouse Report Descriptor
315 @param UsbMouse USB_MOUSE_DEV
316 @param ReportDescriptor Report descriptor to parse
317 @param ReportSize Report descriptor size
319 @retval EFI_DEVICE_ERROR Report descriptor error
320 @retval EFI_SUCCESS Success
324 ParseMouseReportDescriptor (
325 IN USB_MOUSE_ABSOLUTE_POINTER_DEV
*UsbMouseAbsolutePointer
,
326 IN UINT8
*ReportDescriptor
,
330 UINT8
*DescriptorEnd
;
334 DescriptorEnd
= ReportDescriptor
+ ReportSize
;
336 ptr
= GetNextItem (ReportDescriptor
, DescriptorEnd
, &HidItem
);
338 while (ptr
!= NULL
) {
339 if (HidItem
.Format
!= HID_ITEM_FORMAT_SHORT
) {
341 // Long Format Item is not supported at current HID revision
343 return EFI_DEVICE_ERROR
;
346 ParseHidItem (UsbMouseAbsolutePointer
, &HidItem
);
348 ptr
= GetNextItem (ptr
, DescriptorEnd
, &HidItem
);
351 UsbMouseAbsolutePointer
->NumberOfButtons
= (UINT8
) (UsbMouseAbsolutePointer
->PrivateData
.ButtonMaxIndex
- UsbMouseAbsolutePointer
->PrivateData
.ButtonMinIndex
+ 1);
352 UsbMouseAbsolutePointer
->XLogicMax
= UsbMouseAbsolutePointer
->YLogicMax
= 1023;
353 UsbMouseAbsolutePointer
->XLogicMin
= UsbMouseAbsolutePointer
->YLogicMin
= -1023;