1. Import UsbKbDxe and UsbMouseDxe into MdeModulePkg
[people/mcb30/edk2.git] / edk2 / MdePkg / Library / UefiUsbLib / hid.c
1 /** @file\r
2 \r
3 Copyright (c) 2004, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution.  The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8 \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11 \r
12   Module Name:\r
13 \r
14     hid.c\r
15 \r
16   Abstract:\r
17 \r
18     HID class request\r
19 \r
20   Revision History\r
21 \r
22 \r
23 **/\r
24 #include <PiDxe.h>\r
25 #include <Library/UsbLib.h>\r
26 \r
27 //\r
28 // Function to get HID descriptor\r
29 //\r
30 \r
31 /**\r
32   Get Hid Descriptor\r
33 \r
34   @param  UsbIo             EFI_USB_IO_PROTOCOL\r
35   @param  InterfaceNum      Hid interface number\r
36   @param  HidDescriptor     Caller allocated buffer to store Usb hid descriptor if\r
37                             successfully returned.\r
38 \r
39   @return EFI_SUCCESS\r
40   @return EFI_DEVICE_ERROR\r
41   @return EFI_TIMEOUT\r
42 \r
43 **/\r
44 EFI_STATUS\r
45 UsbGetHidDescriptor (\r
46   IN  EFI_USB_IO_PROTOCOL        *UsbIo,\r
47   IN  UINT8                      InterfaceNum,\r
48   OUT EFI_USB_HID_DESCRIPTOR     *HidDescriptor\r
49   )\r
50 {\r
51   UINT32                  Status;\r
52   EFI_STATUS              Result;\r
53   EFI_USB_DEVICE_REQUEST  Request;\r
54 \r
55   Request.RequestType = 0x81;\r
56   Request.Request     = 0x06;\r
57   Request.Value       = (UINT16) (0x21 << 8);\r
58   Request.Index       = InterfaceNum;\r
59   Request.Length      = sizeof (EFI_USB_HID_DESCRIPTOR);\r
60 \r
61   Result = UsbIo->UsbControlTransfer (\r
62                     UsbIo,\r
63                     &Request,\r
64                     EfiUsbDataIn,\r
65                     TIMEOUT_VALUE,\r
66                     HidDescriptor,\r
67                     sizeof (EFI_USB_HID_DESCRIPTOR),\r
68                     &Status\r
69                     );\r
70 \r
71   return Result;\r
72 \r
73 }\r
74 //\r
75 // Function to get Report Class descriptor\r
76 //\r
77 \r
78 /**\r
79   get Report Class descriptor\r
80 \r
81   @param  UsbIo             EFI_USB_IO_PROTOCOL.\r
82   @param  InterfaceNum      Report interface number.\r
83   @param  DescriptorSize    Length of DescriptorBuffer.\r
84   @param  DescriptorBuffer  Caller allocated buffer to store Usb report descriptor\r
85                             if successfully returned.\r
86 \r
87   @return EFI_SUCCESS\r
88   @return EFI_DEVICE_ERROR\r
89   @return EFI_TIMEOUT\r
90 \r
91 **/\r
92 EFI_STATUS\r
93 UsbGetReportDescriptor (\r
94   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
95   IN  UINT8                   InterfaceNum,\r
96   IN  UINT16                  DescriptorSize,\r
97   OUT UINT8                   *DescriptorBuffer\r
98   )\r
99 {\r
100   UINT32                  Status;\r
101   EFI_STATUS              Result;\r
102   EFI_USB_DEVICE_REQUEST  Request;\r
103 \r
104   //\r
105   // Fill Device request packet\r
106   //\r
107   Request.RequestType = 0x81;\r
108   Request.Request     = 0x06;\r
109   Request.Value       = (UINT16) (0x22 << 8);\r
110   Request.Index       = InterfaceNum;\r
111   Request.Length      = DescriptorSize;\r
112 \r
113   Result = UsbIo->UsbControlTransfer (\r
114                     UsbIo,\r
115                     &Request,\r
116                     EfiUsbDataIn,\r
117                     TIMEOUT_VALUE,\r
118                     DescriptorBuffer,\r
119                     DescriptorSize,\r
120                     &Status\r
121                     );\r
122 \r
123   return Result;\r
124 \r
125 }\r
126 //\r
127 // Following are HID class request\r
128 //\r
129 \r
130 /**\r
131   Get Hid Protocol Request\r
132 \r
133   @param  UsbIo             EFI_USB_IO_PROTOCOL\r
134   @param  Interface         Which interface the caller wants to get protocol\r
135   @param  Protocol          Protocol value returned.\r
136 \r
137   @return EFI_SUCCESS\r
138   @return EFI_DEVICE_ERROR\r
139   @return EFI_TIMEOUT\r
140 \r
141 **/\r
142 EFI_STATUS\r
143 UsbGetProtocolRequest (\r
144   IN EFI_USB_IO_PROTOCOL     *UsbIo,\r
145   IN UINT8                   Interface,\r
146   IN UINT8                   *Protocol\r
147   )\r
148 {\r
149   UINT32                  Status;\r
150   EFI_STATUS              Result;\r
151   EFI_USB_DEVICE_REQUEST  Request;\r
152 \r
153   //\r
154   // Fill Device request packet\r
155   //\r
156   Request.RequestType = 0xa1;\r
157   //\r
158   // 10100001b;\r
159   //\r
160   Request.Request = EFI_USB_GET_PROTOCOL_REQUEST;\r
161   Request.Value   = 0;\r
162   Request.Index   = Interface;\r
163   Request.Length  = 1;\r
164 \r
165   Result = UsbIo->UsbControlTransfer (\r
166                     UsbIo,\r
167                     &Request,\r
168                     EfiUsbDataIn,\r
169                     TIMEOUT_VALUE,\r
170                     Protocol,\r
171                     sizeof (UINT8),\r
172                     &Status\r
173                     );\r
174 \r
175   return Result;\r
176 }\r
177 \r
178 \r
179 \r
180 /**\r
181   Set Hid Protocol Request\r
182 \r
183   @param  UsbIo             EFI_USB_IO_PROTOCOL\r
184   @param  Interface         Which interface the caller wants to set protocol\r
185   @param  Protocol          Protocol value the caller wants to set.\r
186 \r
187   @return EFI_SUCCESS\r
188   @return EFI_DEVICE_ERROR\r
189   @return EFI_TIMEOUT\r
190 \r
191 **/\r
192 EFI_STATUS\r
193 UsbSetProtocolRequest (\r
194   IN EFI_USB_IO_PROTOCOL     *UsbIo,\r
195   IN UINT8                   Interface,\r
196   IN UINT8                   Protocol\r
197   )\r
198 {\r
199   UINT32                  Status;\r
200   EFI_STATUS              Result;\r
201   EFI_USB_DEVICE_REQUEST  Request;\r
202 \r
203   //\r
204   // Fill Device request packet\r
205   //\r
206   Request.RequestType = 0x21;\r
207   //\r
208   // 00100001b;\r
209   //\r
210   Request.Request = EFI_USB_SET_PROTOCOL_REQUEST;\r
211   Request.Value   = Protocol;\r
212   Request.Index   = Interface;\r
213   Request.Length  = 0;\r
214 \r
215   Result = UsbIo->UsbControlTransfer (\r
216                     UsbIo,\r
217                     &Request,\r
218                     EfiUsbNoData,\r
219                     TIMEOUT_VALUE,\r
220                     NULL,\r
221                     0,\r
222                     &Status\r
223                     );\r
224   return Result;\r
225 }\r
226 \r
227 \r
228 \r
229 /**\r
230   Set Idel request.\r
231 \r
232   @param  UsbIo             EFI_USB_IO_PROTOCOL\r
233   @param  Interface         Which interface the caller wants to set.\r
234   @param  ReportId          Which report the caller wants to set.\r
235   @param  Duration          Idle rate the caller wants to set.\r
236 \r
237   @return EFI_SUCCESS\r
238   @return EFI_DEVICE_ERROR\r
239   @return EFI_TIMEOUT\r
240 \r
241 **/\r
242 EFI_STATUS\r
243 UsbSetIdleRequest (\r
244   IN EFI_USB_IO_PROTOCOL     *UsbIo,\r
245   IN UINT8                   Interface,\r
246   IN UINT8                   ReportId,\r
247   IN UINT8                   Duration\r
248   )\r
249 {\r
250   UINT32                  Status;\r
251   EFI_STATUS              Result;\r
252   EFI_USB_DEVICE_REQUEST  Request;\r
253 \r
254   //\r
255   // Fill Device request packet\r
256   //\r
257   Request.RequestType = 0x21;\r
258   //\r
259   // 00100001b;\r
260   //\r
261   Request.Request = EFI_USB_SET_IDLE_REQUEST;\r
262   Request.Value   = (UINT16) ((Duration << 8) | ReportId);\r
263   Request.Index   = Interface;\r
264   Request.Length  = 0;\r
265 \r
266   Result = UsbIo->UsbControlTransfer (\r
267                     UsbIo,\r
268                     &Request,\r
269                     EfiUsbNoData,\r
270                     TIMEOUT_VALUE,\r
271                     NULL,\r
272                     0,\r
273                     &Status\r
274                     );\r
275   return Result;\r
276 }\r
277 \r
278 \r
279 /**\r
280   Get Idel request.\r
281 \r
282   @param  UsbIo             EFI_USB_IO_PROTOCOL\r
283   @param  Interface         Which interface the caller wants to get.\r
284   @param  ReportId          Which report the caller wants to get.\r
285   @param  Duration          Idle rate the caller wants to get.\r
286 \r
287   @return EFI_SUCCESS\r
288   @return EFI_DEVICE_ERROR\r
289   @return EFI_TIMEOUT\r
290 \r
291 **/\r
292 EFI_STATUS\r
293 UsbGetIdleRequest (\r
294   IN  EFI_USB_IO_PROTOCOL     *UsbIo,\r
295   IN  UINT8                   Interface,\r
296   IN  UINT8                   ReportId,\r
297   OUT UINT8                   *Duration\r
298   )\r
299 {\r
300   UINT32                  Status;\r
301   EFI_STATUS              Result;\r
302   EFI_USB_DEVICE_REQUEST  Request;\r
303 \r
304   //\r
305   // Fill Device request packet\r
306   //\r
307   Request.RequestType = 0xa1;\r
308   //\r
309   // 10100001b;\r
310   //\r
311   Request.Request = EFI_USB_GET_IDLE_REQUEST;\r
312   Request.Value   = ReportId;\r
313   Request.Index   = Interface;\r
314   Request.Length  = 1;\r
315 \r
316   Result = UsbIo->UsbControlTransfer (\r
317                     UsbIo,\r
318                     &Request,\r
319                     EfiUsbDataIn,\r
320                     TIMEOUT_VALUE,\r
321                     Duration,\r
322                     1,\r
323                     &Status\r
324                     );\r
325 \r
326   return Result;\r
327 }\r
328 \r
329 \r
330 \r
331 /**\r
332   Hid Set Report request.\r
333 \r
334   @param  UsbIo             EFI_USB_IO_PROTOCOL\r
335   @param  Interface         Which interface the caller wants to set.\r
336   @param  ReportId          Which report the caller wants to set.\r
337   @param  ReportType        Type of report.\r
338   @param  ReportLen         Length of report descriptor.\r
339   @param  Report            Report Descriptor buffer.\r
340 \r
341   @return EFI_SUCCESS\r
342   @return EFI_DEVICE_ERROR\r
343   @return EFI_TIMEOUT\r
344 \r
345 **/\r
346 EFI_STATUS\r
347 UsbSetReportRequest (\r
348   IN EFI_USB_IO_PROTOCOL     *UsbIo,\r
349   IN UINT8                   Interface,\r
350   IN UINT8                   ReportId,\r
351   IN UINT8                   ReportType,\r
352   IN UINT16                  ReportLen,\r
353   IN UINT8                   *Report\r
354   )\r
355 {\r
356   UINT32                  Status;\r
357   EFI_STATUS              Result;\r
358   EFI_USB_DEVICE_REQUEST  Request;\r
359 \r
360   //\r
361   // Fill Device request packet\r
362   //\r
363   Request.RequestType = 0x21;\r
364   //\r
365   // 00100001b;\r
366   //\r
367   Request.Request = EFI_USB_SET_REPORT_REQUEST;\r
368   Request.Value   = (UINT16) ((ReportType << 8) | ReportId);\r
369   Request.Index   = Interface;\r
370   Request.Length  = ReportLen;\r
371 \r
372   Result = UsbIo->UsbControlTransfer (\r
373                     UsbIo,\r
374                     &Request,\r
375                     EfiUsbDataOut,\r
376                     TIMEOUT_VALUE,\r
377                     Report,\r
378                     ReportLen,\r
379                     &Status\r
380                     );\r
381 \r
382   return Result;\r
383 }\r
384 \r
385 \r
386 /**\r
387   Hid Set Report request.\r
388 \r
389   @param  UsbIo             EFI_USB_IO_PROTOCOL\r
390   @param  Interface         Which interface the caller wants to set.\r
391   @param  ReportId          Which report the caller wants to set.\r
392   @param  ReportType        Type of report.\r
393   @param  ReportLen         Length of report descriptor.\r
394   @param  Report            Caller allocated buffer to store Report Descriptor.\r
395 \r
396   @return EFI_SUCCESS\r
397   @return EFI_DEVICE_ERROR\r
398   @return EFI_TIMEOUT\r
399 \r
400 **/\r
401 EFI_STATUS\r
402 UsbGetReportRequest (\r
403   IN EFI_USB_IO_PROTOCOL     *UsbIo,\r
404   IN UINT8                   Interface,\r
405   IN UINT8                   ReportId,\r
406   IN UINT8                   ReportType,\r
407   IN UINT16                  ReportLen,\r
408   IN UINT8                   *Report\r
409   )\r
410 {\r
411   UINT32                  Status;\r
412   EFI_STATUS              Result;\r
413   EFI_USB_DEVICE_REQUEST  Request;\r
414 \r
415   //\r
416   // Fill Device request packet\r
417   //\r
418   Request.RequestType = 0xa1;\r
419   //\r
420   // 10100001b;\r
421   //\r
422   Request.Request = EFI_USB_GET_REPORT_REQUEST;\r
423   Request.Value   = (UINT16) ((ReportType << 8) | ReportId);\r
424   Request.Index   = Interface;\r
425   Request.Length  = ReportLen;\r
426 \r
427   Result = UsbIo->UsbControlTransfer (\r
428                     UsbIo,\r
429                     &Request,\r
430                     EfiUsbDataIn,\r
431                     TIMEOUT_VALUE,\r
432                     Report,\r
433                     ReportLen,\r
434                     &Status\r
435                     );\r
436 \r
437   return Result;\r
438 }\r