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
49 if ((EndPos
- StartPos
) <= 0) {
58 HidItem
->Type
= (UINT8
) ((Temp
>> 2) & 0x03);
62 HidItem
->Tag
= (UINT8
) ((Temp
>> 4) & 0x0F);
64 if (HidItem
->Tag
== HID_ITEM_TAG_LONG
) {
66 // Long Items are not supported by HID rev1.0,
67 // although we try to parse it.
69 HidItem
->Format
= HID_ITEM_FORMAT_LONG
;
71 if ((EndPos
- StartPos
) >= 2) {
72 HidItem
->Size
= *StartPos
++;
73 HidItem
->Tag
= *StartPos
++;
75 if ((EndPos
- StartPos
) >= HidItem
->Size
) {
76 HidItem
->Data
.LongData
= StartPos
;
77 StartPos
+= HidItem
->Size
;
82 HidItem
->Format
= HID_ITEM_FORMAT_SHORT
;
86 HidItem
->Size
= (UINT8
) (Temp
& 0x03);
87 switch (HidItem
->Size
) {
99 if ((EndPos
- StartPos
) >= 1) {
100 HidItem
->Data
.U8
= *StartPos
++;
108 if ((EndPos
- StartPos
) >= 2) {
109 CopyMem (&HidItem
->Data
.U16
, StartPos
, sizeof (UINT16
));
116 // 4 byte data, adjust size
119 if ((EndPos
- StartPos
) >= 4) {
120 CopyMem (&HidItem
->Data
.U32
, StartPos
, sizeof (UINT32
));
134 @param HidItem HID_ITEM
146 // Get Data from HID_ITEM structure
148 switch (HidItem
->Size
) {
151 return HidItem
->Data
.U8
;
154 return HidItem
->Data
.U16
;
157 return HidItem
->Data
.U32
;
167 @param UsbMouse USB_MOUSE_DEV
168 @param LocalItem Local Item
175 IN USB_MOUSE_DEV
*UsbMouse
,
176 IN HID_ITEM
*LocalItem
181 if (LocalItem
->Size
== 0) {
183 // No expected data for local item
188 Data
= GetItemData (LocalItem
);
190 switch (LocalItem
->Tag
) {
192 case HID_LOCAL_ITEM_TAG_DELIMITER
:
194 // we don't support delimiter here
198 case HID_LOCAL_ITEM_TAG_USAGE
:
201 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM
:
202 if (UsbMouse
->PrivateData
.ButtonDetected
) {
203 UsbMouse
->PrivateData
.ButtonMinIndex
= (UINT8
) Data
;
208 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM
:
210 if (UsbMouse
->PrivateData
.ButtonDetected
) {
211 UsbMouse
->PrivateData
.ButtonMaxIndex
= (UINT8
) Data
;
222 IN USB_MOUSE_DEV
*UsbMouse
,
223 IN HID_ITEM
*GlobalItem
228 switch (GlobalItem
->Tag
) {
229 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE
:
231 UsagePage
= (UINT8
) GetItemData (GlobalItem
);
234 // We only care Button Page here
236 if (UsagePage
== 0x09) {
240 UsbMouse
->PrivateData
.ButtonDetected
= TRUE
;
254 @param UsbMouse TODO: add argument description
255 @param MainItem HID_ITEM to parse
263 IN USB_MOUSE_DEV
*UsbMouse
,
264 IN HID_ITEM
*MainItem
268 // we don't care any main items, just skip
277 @param UsbMouse USB_MOUSE_DEV
278 @param HidItem HidItem to parse
286 IN USB_MOUSE_DEV
*UsbMouse
,
290 switch (HidItem
->Type
) {
292 case HID_ITEM_TYPE_MAIN
:
294 // For Main Item, parse main item
296 ParseMainItem (UsbMouse
, HidItem
);
299 case HID_ITEM_TYPE_GLOBAL
:
301 // For global Item, parse global item
303 ParseGlobalItem (UsbMouse
, HidItem
);
306 case HID_ITEM_TYPE_LOCAL
:
308 // For Local Item, parse local item
310 ParseLocalItem (UsbMouse
, HidItem
);
315 // A simple parse just read some field we are interested in
319 Parse Mouse Report Descriptor
321 @param UsbMouse USB_MOUSE_DEV
322 @param ReportDescriptor Report descriptor to parse
323 @param ReportSize Report descriptor size
325 @retval EFI_DEVICE_ERROR Report descriptor error
326 @retval EFI_SUCCESS Success
330 ParseMouseReportDescriptor (
331 IN USB_MOUSE_DEV
*UsbMouse
,
332 IN UINT8
*ReportDescriptor
,
336 UINT8
*DescriptorEnd
;
340 DescriptorEnd
= ReportDescriptor
+ ReportSize
;
342 ptr
= GetNextItem (ReportDescriptor
, DescriptorEnd
, &HidItem
);
344 while (ptr
!= NULL
) {
345 if (HidItem
.Format
!= HID_ITEM_FORMAT_SHORT
) {
347 // Long Format Item is not supported at current HID revision
349 return EFI_DEVICE_ERROR
;
352 ParseHidItem (UsbMouse
, &HidItem
);
354 ptr
= GetNextItem (ptr
, DescriptorEnd
, &HidItem
);
357 UsbMouse
->NumberOfButtons
= (UINT8
) (UsbMouse
->PrivateData
.ButtonMaxIndex
- UsbMouse
->PrivateData
.ButtonMinIndex
+ 1);
358 UsbMouse
->XLogicMax
= UsbMouse
->YLogicMax
= 127;
359 UsbMouse
->XLogicMin
= UsbMouse
->YLogicMin
= -127;