source: mainline/uspace/drv/usbhid/hidreq.c@ 2391aaf

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

Huge refactoring of USB HID driver.

  • Created generic USB HID device structure and API (hiddev.h/c).
    • The structure holds data common for all HID devices.
    • Functions for creating the structure, and initializing based on given endpoint description.
    • Processing of descriptors, initializing of pipes moved here.
  • Modified USB HID keyboard device structure (kbddev.h/c).
    • This structure now holds only keyboard-specific data.
    • API provides function for adding device of type keyboard.
    • All keyboard-related functions moved here. These include:
      • IPC handler
      • Key and modifier processing functions
      • Polling
      • Creating new fibril for polling.
  • Separated USB HID class-specific request functions (hidreq.h/c)
  • Removed unused code from scancode parser (conv.c)

WARNING: not compileable due to a strange error.

  • Property mode set to 100644
File size: 4.3 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
145/**
146 * @}
147 */
Note: See TracBrowser for help on using the repository browser.