3 Parse mouse hid descriptor.
5 Copyright (c) 2004 - 2008, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 Get next item from report descriptor.
22 @param StartPos Start Position.
23 @param EndPos End Position.
24 @param HidItem HidItem to return.
38 if ((EndPos
- StartPos
) <= 0) {
47 HidItem
->Type
= (UINT8
) ((Temp
>> 2) & 0x03);
51 HidItem
->Tag
= (UINT8
) ((Temp
>> 4) & 0x0F);
53 if (HidItem
->Tag
== HID_ITEM_TAG_LONG
) {
55 // Long Items are not supported by HID rev1.0,
56 // although we try to parse it.
58 HidItem
->Format
= HID_ITEM_FORMAT_LONG
;
60 if ((EndPos
- StartPos
) >= 2) {
61 HidItem
->Size
= *StartPos
++;
62 HidItem
->Tag
= *StartPos
++;
64 if ((EndPos
- StartPos
) >= HidItem
->Size
) {
65 HidItem
->Data
.LongData
= StartPos
;
66 StartPos
+= HidItem
->Size
;
71 HidItem
->Format
= HID_ITEM_FORMAT_SHORT
;
75 HidItem
->Size
= (UINT8
) (Temp
& 0x03);
76 switch (HidItem
->Size
) {
88 if ((EndPos
- StartPos
) >= 1) {
89 HidItem
->Data
.U8
= *StartPos
++;
97 if ((EndPos
- StartPos
) >= 2) {
98 CopyMem (&HidItem
->Data
.U16
, StartPos
, sizeof (UINT16
));
105 // 4 byte data, adjust size
108 if ((EndPos
- StartPos
) >= 4) {
109 CopyMem (&HidItem
->Data
.U32
, StartPos
, sizeof (UINT32
));
121 Get item data from report descriptor.
123 @param HidItem The pointer to HID_ITEM.
125 @return The Data of HidItem.
134 // Get Data from HID_ITEM structure
136 switch (HidItem
->Size
) {
139 return HidItem
->Data
.U8
;
142 return HidItem
->Data
.U16
;
145 return HidItem
->Data
.U32
;
153 Parse local item from report descriptor.
155 @param UsbMouse The instance of USB_MOUSE_DEV
156 @param LocalItem The pointer to local hid item
161 IN USB_MOUSE_DEV
*UsbMouse
,
162 IN HID_ITEM
*LocalItem
167 if (LocalItem
->Size
== 0) {
169 // No expected data for local item
174 Data
= GetItemData (LocalItem
);
176 switch (LocalItem
->Tag
) {
178 case HID_LOCAL_ITEM_TAG_DELIMITER
:
180 // we don't support delimiter here
184 case HID_LOCAL_ITEM_TAG_USAGE
:
187 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM
:
188 if (UsbMouse
->PrivateData
.ButtonDetected
) {
189 UsbMouse
->PrivateData
.ButtonMinIndex
= (UINT8
) Data
;
194 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM
:
196 if (UsbMouse
->PrivateData
.ButtonDetected
) {
197 UsbMouse
->PrivateData
.ButtonMaxIndex
= (UINT8
) Data
;
207 Parse global item from report descriptor.
209 @param UsbMouse The instance of USB_MOUSE_DEV
210 @param GlobalItem The pointer to global hid item
215 IN USB_MOUSE_DEV
*UsbMouse
,
216 IN HID_ITEM
*GlobalItem
221 switch (GlobalItem
->Tag
) {
222 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE
:
224 UsagePage
= (UINT8
) GetItemData (GlobalItem
);
227 // We only care Button Page here
229 if (UsagePage
== 0x09) {
233 UsbMouse
->PrivateData
.ButtonDetected
= TRUE
;
244 Parse main item from report descriptor.
246 @param UsbMouse The instance of USB_MOUSE_DEV
247 @param MainItem Main hid item to parse
252 IN USB_MOUSE_DEV
*UsbMouse
,
253 IN HID_ITEM
*MainItem
257 // we don't care any main items, just skip
264 Parse hid item from report descriptor.
266 @param UsbMouse The instance of USB_MOUSE_DEV
267 @param HidItem The hid item to parse
272 IN USB_MOUSE_DEV
*UsbMouse
,
276 switch (HidItem
->Type
) {
278 case HID_ITEM_TYPE_MAIN
:
280 // For Main Item, parse main item
282 ParseMainItem (UsbMouse
, HidItem
);
285 case HID_ITEM_TYPE_GLOBAL
:
287 // For global Item, parse global item
289 ParseGlobalItem (UsbMouse
, HidItem
);
292 case HID_ITEM_TYPE_LOCAL
:
294 // For Local Item, parse local item
296 ParseLocalItem (UsbMouse
, HidItem
);
303 Parse Mouse Report Descriptor.
305 @param UsbMouse The instance of USB_MOUSE_DEV
306 @param ReportDescriptor Report descriptor to parse
307 @param ReportSize Report descriptor size
309 @retval EFI_DEVICE_ERROR Report descriptor error
310 @retval EFI_SUCCESS Parse descriptor success
314 ParseMouseReportDescriptor (
315 IN USB_MOUSE_DEV
*UsbMouse
,
316 IN UINT8
*ReportDescriptor
,
320 UINT8
*DescriptorEnd
;
324 DescriptorEnd
= ReportDescriptor
+ ReportSize
;
326 Ptr
= GetNextItem (ReportDescriptor
, DescriptorEnd
, &HidItem
);
328 while (Ptr
!= NULL
) {
329 if (HidItem
.Format
!= HID_ITEM_FORMAT_SHORT
) {
331 // Long Format Item is not supported at current HID revision
333 return EFI_DEVICE_ERROR
;
336 ParseHidItem (UsbMouse
, &HidItem
);
338 Ptr
= GetNextItem (Ptr
, DescriptorEnd
, &HidItem
);
341 UsbMouse
->NumberOfButtons
= (UINT8
) (UsbMouse
->PrivateData
.ButtonMaxIndex
- UsbMouse
->PrivateData
.ButtonMinIndex
+ 1);
342 UsbMouse
->XLogicMax
= UsbMouse
->YLogicMax
= 127;
343 UsbMouse
->XLogicMin
= UsbMouse
->YLogicMin
= -127;