source: mainline/uspace/drv/usbhid/hidreq.c@ dde8ca4

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since dde8ca4 was dde8ca4, checked in by Lubos Slovak <lubos.slovak@…>, 15 years ago

Added function for Set_Idle request.

  • Property mode set to 100644
File size: 5.5 KB
Line 
1/*
2 * Copyright (c) 2011 Lubos Slovak
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup drvusbhid
30 * @{
31 */
32/** @file
33 * HID class-specific requests.
34 */
35
36#include <stdint.h>
37#include <errno.h>
38#include <str_error.h>
39
40#include <usb/classes/hid.h>
41#include <usb/debug.h>
42#include <usb/request.h>
43
44#include "hidreq.h"
45#include "hiddev.h"
46
47/*----------------------------------------------------------------------------*/
48
49int usbhid_req_set_report(usbhid_dev_t *hid_dev,
50 usb_hid_report_type_t type, uint8_t *buffer, size_t buf_size)
51{
52 if (hid_dev == NULL) {
53 usb_log_error("usbhid_req_set_report(): no HID device structure"
54 " given.\n");
55 return EINVAL;
56 }
57
58 /*
59 * No need for checking other parameters, as they are checked in
60 * the called function (usb_control_request_set()).
61 */
62
63 int rc, sess_rc;
64
65 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe);
66 if (sess_rc != EOK) {
67 usb_log_warning("Failed to start a session: %s.\n",
68 str_error(sess_rc));
69 return sess_rc;
70 }
71
72 usb_log_debug("Sending Set_Report request to the device.\n");
73
74 rc = usb_control_request_set(&hid_dev->ctrl_pipe,
75 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
76 USB_HIDREQ_SET_REPORT, type, hid_dev->iface, buffer, buf_size);
77
78 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe);
79
80 if (rc != EOK) {
81 usb_log_warning("Error sending output report to the keyboard: "
82 "%s.\n", str_error(rc));
83 return rc;
84 }
85
86 if (sess_rc != EOK) {
87 usb_log_warning("Error closing session: %s.\n",
88 str_error(sess_rc));
89 return sess_rc;
90 }
91
92 return EOK;
93}
94
95/*----------------------------------------------------------------------------*/
96
97int usbhid_req_set_protocol(usbhid_dev_t *hid_dev, usb_hid_protocol_t protocol)
98{
99 if (hid_dev == NULL) {
100 usb_log_error("usbhid_req_set_protocol(): no HID device "
101 "structure given.\n");
102 return EINVAL;
103 }
104
105 /*
106 * No need for checking other parameters, as they are checked in
107 * the called function (usb_control_request_set()).
108 */
109
110 int rc, sess_rc;
111
112 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe);
113 if (sess_rc != EOK) {
114 usb_log_warning("Failed to start a session: %s.\n",
115 str_error(sess_rc));
116 return sess_rc;
117 }
118
119 usb_log_debug("Sending Set_Protocol request to the device ("
120 "protocol: %d, iface: %d).\n", protocol, hid_dev->iface);
121
122 rc = usb_control_request_set(&hid_dev->ctrl_pipe,
123 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
124 USB_HIDREQ_SET_PROTOCOL, protocol, hid_dev->iface, NULL, 0);
125
126 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe);
127
128 if (rc != EOK) {
129 usb_log_warning("Error sending output report to the keyboard: "
130 "%s.\n", str_error(rc));
131 return rc;
132 }
133
134 if (sess_rc != EOK) {
135 usb_log_warning("Error closing session: %s.\n",
136 str_error(sess_rc));
137 return sess_rc;
138 }
139
140 return EOK;
141}
142
143/*----------------------------------------------------------------------------*/
144
145int usbhid_req_set_idle(usbhid_dev_t *hid_dev, uint8_t duration)
146{
147 if (hid_dev == NULL) {
148 usb_log_error("usbhid_req_set_idle(): no HID device "
149 "structure given.\n");
150 return EINVAL;
151 }
152
153 /*
154 * No need for checking other parameters, as they are checked in
155 * the called function (usb_control_request_set()).
156 */
157
158 int rc, sess_rc;
159
160 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe);
161 if (sess_rc != EOK) {
162 usb_log_warning("Failed to start a session: %s.\n",
163 str_error(sess_rc));
164 return sess_rc;
165 }
166
167 usb_log_debug("Sending Set_Idle request to the device ("
168 "duration: %u, iface: %d).\n", duration, hid_dev->iface);
169
170 uint16_t value = duration << 8;
171
172 rc = usb_control_request_set(&hid_dev->ctrl_pipe,
173 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
174 USB_HIDREQ_SET_IDLE, value, hid_dev->iface, NULL, 0);
175
176 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe);
177
178 if (rc != EOK) {
179 usb_log_warning("Error sending output report to the keyboard: "
180 "%s.\n", str_error(rc));
181 return rc;
182 }
183
184 if (sess_rc != EOK) {
185 usb_log_warning("Error closing session: %s.\n",
186 str_error(sess_rc));
187 return sess_rc;
188 }
189
190 return EOK;
191}
192
193/*----------------------------------------------------------------------------*/
194
195/**
196 * @}
197 */
Note: See TracBrowser for help on using the repository browser.