source: mainline/uspace/drv/usbhub/port_status.h@ 3dba1ca

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

some more comments

  • Property mode set to 100644
File size: 14.7 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 * structure holding hub status and changes flags.
52 * should not be accessed directly, use supplied getter/setter methods.
53 *
54 * For more information refer to table 11.16.2.5 in
55 * "Universal Serial Bus Specification Revision 1.1"
56 *
57 */
58typedef uint32_t usb_hub_status_t;
59
60/**
61 * set values in request to be it a port status request
62 * @param request
63 * @param port
64 */
65static inline void usb_hub_set_port_status_request(
66 usb_device_request_setup_packet_t * request, uint16_t port
67 ) {
68 request->index = port;
69 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS;
70 request->request = USB_HUB_REQUEST_GET_STATUS;
71 request->value = 0;
72 request->length = 4;
73}
74
75/**
76 * set values in request to be it a port status request
77 * @param request
78 * @param port
79 */
80static inline void usb_hub_set_hub_status_request(
81 usb_device_request_setup_packet_t * request
82 ) {
83 request->index = 0;
84 request->request_type = USB_HUB_REQ_TYPE_GET_HUB_STATUS;
85 request->request = USB_HUB_REQUEST_GET_STATUS;
86 request->value = 0;
87 request->length = 4;
88}
89
90/**
91 * create request for usb hub port status
92 * @param port
93 * @return
94 */
95static inline usb_device_request_setup_packet_t *
96usb_hub_create_port_status_request(uint16_t port) {
97 usb_device_request_setup_packet_t * result =
98 usb_new(usb_device_request_setup_packet_t);
99 usb_hub_set_port_status_request(result, port);
100 return result;
101}
102
103/**
104 * set the device request to be a port feature enable request
105 * @param request
106 * @param port
107 * @param feature_selector
108 */
109static inline void usb_hub_set_enable_port_feature_request(
110 usb_device_request_setup_packet_t * request, uint16_t port,
111 uint16_t feature_selector
112 ) {
113 request->index = port;
114 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
115 request->request = USB_HUB_REQUEST_SET_FEATURE;
116 request->value = feature_selector;
117 request->length = 0;
118}
119
120/**
121 * set the device request to be a port feature clear request
122 * @param request
123 * @param port
124 * @param feature_selector
125 */
126static inline void usb_hub_set_disable_port_feature_request(
127 usb_device_request_setup_packet_t * request, uint16_t port,
128 uint16_t feature_selector
129 ) {
130 request->index = port;
131 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
132 request->request = USB_HUB_REQUEST_CLEAR_FEATURE;
133 request->value = feature_selector;
134 request->length = 0;
135}
136
137/**
138 * set the device request to be a port enable request
139 * @param request
140 * @param port
141 */
142static inline void usb_hub_set_enable_port_request(
143 usb_device_request_setup_packet_t * request, uint16_t port
144 ) {
145 request->index = port;
146 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
147 request->request = USB_HUB_REQUEST_SET_FEATURE;
148 request->value = USB_HUB_FEATURE_C_PORT_ENABLE;
149 request->length = 0;
150}
151
152/**
153 * enable specified port
154 * @param port
155 * @return
156 */
157static inline usb_device_request_setup_packet_t *
158usb_hub_create_enable_port_request(uint16_t port) {
159 usb_device_request_setup_packet_t * result =
160 usb_new(usb_device_request_setup_packet_t);
161 usb_hub_set_enable_port_request(result, port);
162 return result;
163}
164
165/**
166 * set the device request to be a port disable request
167 * @param request
168 * @param port
169 */
170static inline void usb_hub_set_disable_port_request(
171 usb_device_request_setup_packet_t * request, uint16_t port
172 ) {
173 request->index = port;
174 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
175 request->request = USB_HUB_REQUEST_SET_FEATURE;
176 request->value = USB_HUB_FEATURE_C_PORT_SUSPEND;
177 request->length = 0;
178}
179
180/**
181 * disable specified port
182 * @param port
183 * @return
184 */
185static inline usb_device_request_setup_packet_t *
186usb_hub_create_disable_port_request(uint16_t port) {
187 usb_device_request_setup_packet_t * result =
188 usb_new(usb_device_request_setup_packet_t);
189 usb_hub_set_disable_port_request(result, port);
190 return result;
191}
192
193/**
194 * set the device request to be a port disable request
195 * @param request
196 * @param port
197 */
198static inline void usb_hub_set_reset_port_request(
199 usb_device_request_setup_packet_t * request, uint16_t port
200 ) {
201 request->index = port;
202 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
203 request->request = USB_HUB_REQUEST_SET_FEATURE;
204 request->value = USB_HUB_FEATURE_PORT_RESET;
205 request->length = 0;
206}
207
208/**
209 * disable specified port
210 * @param port
211 * @return
212 */
213static inline usb_device_request_setup_packet_t *
214usb_hub_create_reset_port_request(uint16_t port) {
215 usb_device_request_setup_packet_t * result =
216 usb_new(usb_device_request_setup_packet_t);
217 usb_hub_set_reset_port_request(result, port);
218 return result;
219}
220
221/**
222 * set the device request to be a port disable request
223 * @param request
224 * @param port
225 */
226static inline void usb_hub_set_power_port_request(
227 usb_device_request_setup_packet_t * request, uint16_t port
228 ) {
229 request->index = port;
230 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
231 request->request = USB_HUB_REQUEST_SET_FEATURE;
232 request->value = USB_HUB_FEATURE_PORT_POWER;
233 request->length = 0;
234}
235
236/**
237 * set the device request to be a port disable request
238 * @param request
239 * @param port
240 */
241static inline void usb_hub_unset_power_port_request(
242 usb_device_request_setup_packet_t * request, uint16_t port
243 ) {
244 request->index = port;
245 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
246 request->request = USB_HUB_REQUEST_CLEAR_FEATURE;
247 request->value = USB_HUB_FEATURE_PORT_POWER;
248 request->length = 0;
249}
250
251/**
252 * get i`th bit of port status
253 *
254 * @param status
255 * @param idx
256 * @return
257 */
258static inline bool usb_port_get_bit(usb_port_status_t * status, int idx) {
259 return (*status)&(1 << idx);
260}
261
262/**
263 * set i`th bit of port status
264 *
265 * @param status
266 * @param idx
267 * @param value
268 */
269static inline void usb_port_set_bit(
270 usb_port_status_t * status, int idx, bool value) {
271 (*status) = value ?
272 ((*status) | (1 << (idx))) :
273 ((*status)&(~(1 << (idx))));
274}
275
276/**
277 * get i`th bit of hub status
278 *
279 * @param status
280 * @param idx
281 * @return
282 */
283static inline bool usb_hub_get_bit(usb_hub_status_t * status, int idx) {
284 return (*status)&(1 << idx);
285}
286
287/**
288 * set i`th bit of hub status
289 *
290 * @param status
291 * @param idx
292 * @param value
293 */
294static inline void usb_hub_set_bit(
295 usb_hub_status_t * status, int idx, bool value) {
296 (*status) = value ?
297 ((*status) | (1 << (idx))) :
298 ((*status)&(~(1 << (idx))));
299}
300
301/**
302 * connection status geter for port status
303 *
304 * @param status
305 * @return true if there is something connected
306 */
307static inline bool usb_port_dev_connected(usb_port_status_t * status) {
308 return usb_port_get_bit(status, 0);
309}
310
311static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) {
312 usb_port_set_bit(status, 0, connected);
313}
314
315//port enabled
316
317/**
318 * port enabled getter for port status
319 *
320 * @param status
321 * @return true if the port is enabled
322 */
323static inline bool usb_port_enabled(usb_port_status_t * status) {
324 return usb_port_get_bit(status, 1);
325}
326
327static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) {
328 usb_port_set_bit(status, 1, enabled);
329}
330
331//port suspended
332/**
333 * port suspended getter for port status
334 *
335 * @param status
336 * @return true if port is suspended
337 */
338static inline bool usb_port_suspended(usb_port_status_t * status) {
339 return usb_port_get_bit(status, 2);
340}
341
342static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) {
343 usb_port_set_bit(status, 2, suspended);
344}
345
346//over currect
347/**
348 * over current condition indicator getter for port status
349 *
350 * @param status
351 * @return true if there is opver-current condition on the hub
352 */
353static inline bool usb_port_over_current(usb_port_status_t * status) {
354 return usb_port_get_bit(status, 3);
355}
356
357static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) {
358 usb_port_set_bit(status, 3, value);
359}
360
361//port reset
362/**
363 * port reset indicator getter for port status
364 *
365 * @param status
366 * @return true if port is reset
367 */
368static inline bool usb_port_reset(usb_port_status_t * status) {
369 return usb_port_get_bit(status, 4);
370}
371
372static inline void usb_port_set_reset(usb_port_status_t * status, bool value) {
373 usb_port_set_bit(status, 4, value);
374}
375
376//powered
377/**
378 * power state getter for port status
379 *
380 * @param status
381 * @return true if port is powered
382 */
383static inline bool usb_port_powered(usb_port_status_t * status) {
384 return usb_port_get_bit(status, 8);
385}
386
387static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) {
388 usb_port_set_bit(status, 8, powered);
389}
390
391//low speed device attached
392/**
393 * low speed device on the port indicator
394 *
395 * @param status
396 * @return true if low speed device is attached
397 */
398static inline bool usb_port_low_speed(usb_port_status_t * status) {
399 return usb_port_get_bit(status, 9);
400}
401
402static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) {
403 usb_port_set_bit(status, 9, low_speed);
404}
405
406//high speed device attached
407/**
408 * high speed device on the port indicator
409 *
410 * @param status
411 * @return true if high speed device is on port
412 */
413static inline bool usb_port_high_speed(usb_port_status_t * status) {
414 return usb_port_get_bit(status, 10);
415}
416
417static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) {
418 usb_port_set_bit(status, 10, high_speed);
419}
420
421/**
422 * speed getter for port status
423 *
424 * @param status
425 * @return speed of usb device (for more see usb specification)
426 */
427static inline usb_speed_t usb_port_speed(usb_port_status_t * status) {
428 if (usb_port_low_speed(status))
429 return USB_SPEED_LOW;
430 if (usb_port_high_speed(status))
431 return USB_SPEED_HIGH;
432 return USB_SPEED_FULL;
433}
434
435
436//connect change
437/**
438 * port connect change indicator
439 *
440 * @param status
441 * @return true if connection has changed
442 */
443static inline bool usb_port_connect_change(usb_port_status_t * status) {
444 return usb_port_get_bit(status, 16);
445}
446
447static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) {
448 usb_port_set_bit(status, 16, change);
449}
450
451//port enable change
452/**
453 * port enable change for port status
454 *
455 * @param status
456 * @return true if the port has been enabled/disabled
457 */
458static inline bool usb_port_enabled_change(usb_port_status_t * status) {
459 return usb_port_get_bit(status, 17);
460}
461
462static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) {
463 usb_port_set_bit(status, 17, change);
464}
465
466//suspend change
467/**
468 * port suspend change for port status
469 *
470 * @param status
471 * @return ture if suspend status has changed
472 */
473static inline bool usb_port_suspend_change(usb_port_status_t * status) {
474 return usb_port_get_bit(status, 18);
475}
476
477static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) {
478 usb_port_set_bit(status, 18, change);
479}
480
481//over current change
482/**
483 * over current change indicator
484 *
485 * @param status
486 * @return true if over-current condition on port has changed
487 */
488static inline bool usb_port_overcurrent_change(usb_port_status_t * status) {
489 return usb_port_get_bit(status, 19);
490}
491
492static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) {
493 usb_port_set_bit(status, 19, change);
494}
495
496//reset change
497/**
498 * port reset change indicator
499 * @param status
500 * @return true if port has been reset
501 */
502static inline bool usb_port_reset_completed(usb_port_status_t * status) {
503 return usb_port_get_bit(status, 20);
504}
505
506static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) {
507 usb_port_set_bit(status, 20, completed);
508}
509
510//local power status
511/**
512 * local power lost indicator for hub status
513 *
514 * @param status
515 * @return true if hub is not powered
516 */
517static inline bool usb_hub_local_power_lost(usb_hub_status_t * status) {
518 return usb_hub_get_bit(status, 0);
519}
520
521static inline void usb_hub_set_local_power_lost(usb_port_status_t * status,
522 bool power_lost) {
523 usb_hub_set_bit(status, 0, power_lost);
524}
525
526//over current ocndition
527/**
528 * hub over-current indicator
529 *
530 * @param status
531 * @return true if over-current condition occurred on hub
532 */
533static inline bool usb_hub_over_current(usb_hub_status_t * status) {
534 return usb_hub_get_bit(status, 1);
535}
536
537static inline void usb_hub_set_over_current(usb_port_status_t * status,
538 bool over_current) {
539 usb_hub_set_bit(status, 1, over_current);
540}
541
542//local power change
543/**
544 * hub power change indicator
545 *
546 * @param status
547 * @return true if local power status has been changed - power has been
548 * dropped or re-established
549 */
550static inline bool usb_hub_local_power_change(usb_hub_status_t * status) {
551 return usb_hub_get_bit(status, 16);
552}
553
554static inline void usb_hub_set_local_power_change(usb_port_status_t * status,
555 bool change) {
556 usb_hub_set_bit(status, 16, change);
557}
558
559//local power status
560/**
561 * hub over-current condition change indicator
562 *
563 * @param status
564 * @return true if over-current condition has changed
565 */
566static inline bool usb_hub_over_current_change(usb_hub_status_t * status) {
567 return usb_hub_get_bit(status, 17);
568}
569
570static inline void usb_hub_set_over_current_change(usb_port_status_t * status,
571 bool change) {
572 usb_hub_set_bit(status, 17, change);
573}
574
575
576#endif /* HUB_PORT_STATUS_H */
577
578/**
579 * @}
580 */
Note: See TracBrowser for help on using the repository browser.