]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiUsbLib/hid.c
1. Import UsbKbDxe and UsbMouseDxe into MdeModulePkg
[mirror_edk2.git] / MdePkg / Library / UefiUsbLib / hid.c
CommitLineData
ed838d0c 1/** @file\r
7bc232b2 2\r
ed838d0c 3Copyright (c) 2004, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
7bc232b2
LG
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
7bc232b2 22\r
ed838d0c 23**/\r
24#include <PiDxe.h>\r
25#include <Library/UsbLib.h>\r
7bc232b2
LG
26\r
27//\r
28// Function to get HID descriptor\r
29//\r
ed838d0c 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
7bc232b2
LG
44EFI_STATUS\r
45UsbGetHidDescriptor (\r
46 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
47 IN UINT8 InterfaceNum,\r
48 OUT EFI_USB_HID_DESCRIPTOR *HidDescriptor\r
49 )\r
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
92EFI_STATUS\r
93UsbGetReportDescriptor (\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
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
142EFI_STATUS\r
143UsbGetProtocolRequest (\r
144 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
145 IN UINT8 Interface,\r
146 IN UINT8 *Protocol\r
147 )\r
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
192EFI_STATUS\r
193UsbSetProtocolRequest (\r
194 IN EFI_USB_IO_PROTOCOL *UsbIo,\r
195 IN UINT8 Interface,\r
196 IN UINT8 Protocol\r
197 )\r
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
242EFI_STATUS\r
243UsbSetIdleRequest (\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
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
292EFI_STATUS\r
293UsbGetIdleRequest (\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
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
346EFI_STATUS\r
347UsbSetReportRequest (\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
7bc232b2
LG
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
ed838d0c 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
7bc232b2
LG
401EFI_STATUS\r
402UsbGetReportRequest (\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
7bc232b2
LG
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