source: mainline/uspace/drv/usbhub/port_status.h@ a546687

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a546687 was 8123695a, checked in by Matus Dekanek <smekideki@…>, 14 years ago

ohci root hub set/clear feature requests redesigned
hub: fix for non-removable devices 3.0

  • Property mode set to 100644
File size: 10.3 KB
Line 
1/*
2 * Copyright (c) 2010 Matus Dekanek
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/** @addtogroup drvusbhub
29 * @{
30 */
31
32#ifndef HUB_PORT_STATUS_H
33#define HUB_PORT_STATUS_H
34
35#include <bool.h>
36#include <sys/types.h>
37#include <usb/request.h>
38#include "usbhub_private.h"
39
40/**
41 * structure holding port status and changes flags.
42 * should not be accessed directly, use supplied getter/setter methods.
43 *
44 * For more information refer to table 11-15 in
45 * "Universal Serial Bus Specification Revision 1.1"
46 *
47 */
48typedef uint32_t usb_port_status_t;
49
50/**
51 * set values in request to be it a port status request
52 * @param request
53 * @param port
54 */
55static inline void usb_hub_set_port_status_request(
56usb_device_request_setup_packet_t * request, uint16_t port
57){
58 request->index = port;
59 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS;
60 request->request = USB_HUB_REQUEST_GET_STATUS;
61 request->value = 0;
62 request->length = 4;
63}
64
65
66/**
67 * create request for usb hub port status
68 * @param port
69 * @return
70 */
71static inline usb_device_request_setup_packet_t *
72usb_hub_create_port_status_request(uint16_t port){
73 usb_device_request_setup_packet_t * result =
74 usb_new(usb_device_request_setup_packet_t);
75 usb_hub_set_port_status_request(result,port);
76 return result;
77}
78
79
80/**
81 * set the device request to be a port feature enable request
82 * @param request
83 * @param port
84 * @param feature_selector
85 */
86static inline void usb_hub_set_enable_port_feature_request(
87usb_device_request_setup_packet_t * request, uint16_t port,
88 uint16_t feature_selector
89){
90 request->index = port;
91 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
92 request->request = USB_HUB_REQUEST_SET_FEATURE;
93 request->value = feature_selector;
94 request->length = 0;
95}
96
97/**
98 * set the device request to be a port feature clear request
99 * @param request
100 * @param port
101 * @param feature_selector
102 */
103static inline void usb_hub_set_disable_port_feature_request(
104usb_device_request_setup_packet_t * request, uint16_t port,
105 uint16_t feature_selector
106){
107 request->index = port;
108 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
109 request->request = USB_HUB_REQUEST_CLEAR_FEATURE;
110 request->value = feature_selector;
111 request->length = 0;
112}
113
114/**
115 * set the device request to be a port enable request
116 * @param request
117 * @param port
118 */
119static inline void usb_hub_set_enable_port_request(
120usb_device_request_setup_packet_t * request, uint16_t port
121){
122 request->index = port;
123 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
124 request->request = USB_HUB_REQUEST_SET_FEATURE;
125 request->value = USB_HUB_FEATURE_C_PORT_ENABLE;
126 request->length = 0;
127}
128
129/**
130 * enable specified port
131 * @param port
132 * @return
133 */
134static inline usb_device_request_setup_packet_t *
135usb_hub_create_enable_port_request(uint16_t port){
136 usb_device_request_setup_packet_t * result =
137 usb_new(usb_device_request_setup_packet_t);
138 usb_hub_set_enable_port_request(result,port);
139 return result;
140}
141
142/**
143 * set the device request to be a port disable request
144 * @param request
145 * @param port
146 */
147static inline void usb_hub_set_disable_port_request(
148usb_device_request_setup_packet_t * request, uint16_t port
149){
150 request->index = port;
151 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
152 request->request = USB_HUB_REQUEST_SET_FEATURE;
153 request->value = USB_HUB_FEATURE_C_PORT_SUSPEND;
154 request->length = 0;
155}
156
157/**
158 * disable specified port
159 * @param port
160 * @return
161 */
162static inline usb_device_request_setup_packet_t *
163usb_hub_create_disable_port_request(uint16_t port){
164 usb_device_request_setup_packet_t * result =
165 usb_new(usb_device_request_setup_packet_t);
166 usb_hub_set_disable_port_request(result,port);
167 return result;
168}
169
170/**
171 * set the device request to be a port disable request
172 * @param request
173 * @param port
174 */
175static inline void usb_hub_set_reset_port_request(
176usb_device_request_setup_packet_t * request, uint16_t port
177){
178 request->index = port;
179 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
180 request->request = USB_HUB_REQUEST_SET_FEATURE;
181 request->value = USB_HUB_FEATURE_PORT_RESET;
182 request->length = 0;
183}
184
185/**
186 * disable specified port
187 * @param port
188 * @return
189 */
190static inline usb_device_request_setup_packet_t *
191usb_hub_create_reset_port_request(uint16_t port){
192 usb_device_request_setup_packet_t * result =
193 usb_new(usb_device_request_setup_packet_t);
194 usb_hub_set_reset_port_request(result,port);
195 return result;
196}
197
198/**
199 * set the device request to be a port disable request
200 * @param request
201 * @param port
202 */
203static inline void usb_hub_set_power_port_request(
204usb_device_request_setup_packet_t * request, uint16_t port
205){
206 request->index = port;
207 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
208 request->request = USB_HUB_REQUEST_SET_FEATURE;
209 request->value = USB_HUB_FEATURE_PORT_POWER;
210 request->length = 0;
211}
212
213/**
214 * set the device request to be a port disable request
215 * @param request
216 * @param port
217 */
218static inline void usb_hub_unset_power_port_request(
219usb_device_request_setup_packet_t * request, uint16_t port
220){
221 request->index = port;
222 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
223 request->request = USB_HUB_REQUEST_CLEAR_FEATURE;
224 request->value = USB_HUB_FEATURE_PORT_POWER;
225 request->length = 0;
226}
227
228
229/** get i`th bit of port status */
230static inline bool usb_port_get_bit(usb_port_status_t * status, int idx)
231{
232 return (((*status)>>(idx))%2);
233}
234
235/** set i`th bit of port status */
236static inline void usb_port_set_bit(
237 usb_port_status_t * status, int idx, bool value)
238{
239 (*status) = value?
240 ((*status)|(1<<(idx))):
241 ((*status)&(~(1<<(idx))));
242}
243
244//device connnected on port
245static inline bool usb_port_dev_connected(usb_port_status_t * status){
246 return usb_port_get_bit(status,0);
247}
248
249static inline void usb_port_set_dev_connected(usb_port_status_t * status,bool connected){
250 usb_port_set_bit(status,0,connected);
251}
252
253//port enabled
254static inline bool usb_port_enabled(usb_port_status_t * status){
255 return usb_port_get_bit(status,1);
256}
257
258static inline void usb_port_set_enabled(usb_port_status_t * status,bool enabled){
259 usb_port_set_bit(status,1,enabled);
260}
261
262//port suspended
263static inline bool usb_port_suspended(usb_port_status_t * status){
264 return usb_port_get_bit(status,2);
265}
266
267static inline void usb_port_set_suspended(usb_port_status_t * status,bool suspended){
268 usb_port_set_bit(status,2,suspended);
269}
270
271//over currect
272static inline bool usb_port_over_current(usb_port_status_t * status){
273 return usb_port_get_bit(status,3);
274}
275
276static inline void usb_port_set_over_current(usb_port_status_t * status,bool value){
277 usb_port_set_bit(status,3,value);
278}
279
280//port reset
281static inline bool usb_port_reset(usb_port_status_t * status){
282 return usb_port_get_bit(status,4);
283}
284
285static inline void usb_port_set_reset(usb_port_status_t * status,bool value){
286 usb_port_set_bit(status,4,value);
287}
288
289//powered
290static inline bool usb_port_powered(usb_port_status_t * status){
291 return usb_port_get_bit(status,8);
292}
293
294static inline void usb_port_set_powered(usb_port_status_t * status,bool powered){
295 usb_port_set_bit(status,8,powered);
296}
297
298//low speed device attached
299static inline bool usb_port_low_speed(usb_port_status_t * status){
300 return usb_port_get_bit(status,9);
301}
302
303static inline void usb_port_set_low_speed(usb_port_status_t * status,bool low_speed){
304 usb_port_set_bit(status,9,low_speed);
305}
306
307//low speed device attached
308static inline bool usb_port_high_speed(usb_port_status_t * status){
309 return usb_port_get_bit(status,10);
310}
311
312static inline void usb_port_set_high_speed(usb_port_status_t * status,bool high_speed){
313 usb_port_set_bit(status,10,high_speed);
314}
315
316static inline usb_speed_t usb_port_speed(usb_port_status_t * status){
317 if(usb_port_low_speed(status))
318 return USB_SPEED_LOW;
319 if(usb_port_high_speed(status))
320 return USB_SPEED_HIGH;
321 return USB_SPEED_FULL;
322}
323
324
325//connect change
326static inline bool usb_port_connect_change(usb_port_status_t * status){
327 return usb_port_get_bit(status,16);
328}
329
330static inline void usb_port_set_connect_change(usb_port_status_t * status,bool change){
331 usb_port_set_bit(status,16,change);
332}
333
334//port enable change
335static inline bool usb_port_enabled_change(usb_port_status_t * status){
336 return usb_port_get_bit(status,17);
337}
338
339static inline void usb_port_set_enabled_change(usb_port_status_t * status,bool change){
340 usb_port_set_bit(status,17,change);
341}
342
343//suspend change
344static inline bool usb_port_suspend_change(usb_port_status_t * status){
345 return usb_port_get_bit(status,18);
346}
347
348static inline void usb_port_set_suspend_change(usb_port_status_t * status,bool change){
349 usb_port_set_bit(status,18,change);
350}
351
352//over current change
353static inline bool usb_port_overcurrent_change(usb_port_status_t * status){
354 return usb_port_get_bit(status,19);
355}
356
357static inline void usb_port_set_overcurrent_change(usb_port_status_t * status,bool change){
358 usb_port_set_bit(status,19,change);
359}
360
361//reset change
362static inline bool usb_port_reset_completed(usb_port_status_t * status){
363 return usb_port_get_bit(status,20);
364}
365
366static inline void usb_port_set_reset_completed(usb_port_status_t * status,bool completed){
367 usb_port_set_bit(status,20,completed);
368}
369
370
371
372#endif /* HUB_PORT_STATUS_H */
373
374/**
375 * @}
376 */
Note: See TracBrowser for help on using the repository browser.