source: mainline/uspace/drv/usbhub/port_status.h@ 36cd378

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

some more comments

  • Property mode set to 100644
File size: 16.5 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))!=0;
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))!=0;
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
311/**
312 * set device connected bit in port status
313 *
314 * @param status
315 * @param connected value of the bit
316 */
317static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) {
318 usb_port_set_bit(status, 0, connected);
319}
320
321//port enabled
322
323/**
324 * port enabled getter for port status
325 *
326 * @param status
327 * @return true if the port is enabled
328 */
329static inline bool usb_port_enabled(usb_port_status_t * status) {
330 return usb_port_get_bit(status, 1);
331}
332
333/**
334 * set port enabled bit in port status
335 *
336 * @param status
337 * @param enabled value of the bit
338 */
339static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) {
340 usb_port_set_bit(status, 1, enabled);
341}
342
343//port suspended
344/**
345 * port suspended getter for port status
346 *
347 * @param status
348 * @return true if port is suspended
349 */
350static inline bool usb_port_suspended(usb_port_status_t * status) {
351 return usb_port_get_bit(status, 2);
352}
353
354/**
355 * set port suspended bit in port status
356 *
357 * @param status
358 * @param suspended value of the bit
359 */
360static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) {
361 usb_port_set_bit(status, 2, suspended);
362}
363
364//over currect
365/**
366 * over current condition indicator getter for port status
367 *
368 * @param status
369 * @return true if there is opver-current condition on the hub
370 */
371static inline bool usb_port_over_current(usb_port_status_t * status) {
372 return usb_port_get_bit(status, 3);
373}
374
375/**
376 * set over current indicator bit in port status
377 *
378 * @param status
379 * @param value value of the bit
380 */
381static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) {
382 usb_port_set_bit(status, 3, value);
383}
384
385//port reset
386/**
387 * port reset indicator getter for port status
388 *
389 * @param status
390 * @return true if port is reset
391 */
392static inline bool usb_port_reset(usb_port_status_t * status) {
393 return usb_port_get_bit(status, 4);
394}
395
396/**
397 * set port reset bit in port status
398 *
399 * @param status
400 * @param value value of the bit
401 */
402static inline void usb_port_set_reset(usb_port_status_t * status, bool value) {
403 usb_port_set_bit(status, 4, value);
404}
405
406//powered
407/**
408 * power state getter for port status
409 *
410 * @param status
411 * @return true if port is powered
412 */
413static inline bool usb_port_powered(usb_port_status_t * status) {
414 return usb_port_get_bit(status, 8);
415}
416
417/**
418 * set port powered bit in port status
419 *
420 * @param status
421 * @param powered value of the bit
422 */
423static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) {
424 usb_port_set_bit(status, 8, powered);
425}
426
427//low speed device attached
428/**
429 * low speed device on the port indicator
430 *
431 * @param status
432 * @return true if low speed device is attached
433 */
434static inline bool usb_port_low_speed(usb_port_status_t * status) {
435 return usb_port_get_bit(status, 9);
436}
437
438/**
439 * set device connected bit in port status
440 *
441 * @param status
442 * @param low_speed value of the bit
443 */
444static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) {
445 usb_port_set_bit(status, 9, low_speed);
446}
447
448//high speed device attached
449/**
450 * high speed device on the port indicator
451 *
452 * @param status
453 * @return true if high speed device is on port
454 */
455static inline bool usb_port_high_speed(usb_port_status_t * status) {
456 return usb_port_get_bit(status, 10);
457}
458
459/**
460 * set high speed device bit in port status
461 *
462 * @param status
463 * @param high_speed value of the bit
464 */
465static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) {
466 usb_port_set_bit(status, 10, high_speed);
467}
468
469/**
470 * speed getter for port status
471 *
472 * @param status
473 * @return speed of usb device (for more see usb specification)
474 */
475static inline usb_speed_t usb_port_speed(usb_port_status_t * status) {
476 if (usb_port_low_speed(status))
477 return USB_SPEED_LOW;
478 if (usb_port_high_speed(status))
479 return USB_SPEED_HIGH;
480 return USB_SPEED_FULL;
481}
482
483
484//connect change
485/**
486 * port connect change indicator
487 *
488 * @param status
489 * @return true if connection has changed
490 */
491static inline bool usb_port_connect_change(usb_port_status_t * status) {
492 return usb_port_get_bit(status, 16);
493}
494
495/**
496 * set connection change bit in port status
497 * @param status
498 * @param change value of the bit
499 */
500static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) {
501 usb_port_set_bit(status, 16, change);
502}
503
504//port enable change
505/**
506 * port enable change for port status
507 *
508 * @param status
509 * @return true if the port has been enabled/disabled
510 */
511static inline bool usb_port_enabled_change(usb_port_status_t * status) {
512 return usb_port_get_bit(status, 17);
513}
514
515/**
516 * set port enable change bit in port status
517 *
518 * @param status
519 * @param change value of the bit
520 */
521static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) {
522 usb_port_set_bit(status, 17, change);
523}
524
525//suspend change
526/**
527 * port suspend change for port status
528 *
529 * @param status
530 * @return ture if suspend status has changed
531 */
532static inline bool usb_port_suspend_change(usb_port_status_t * status) {
533 return usb_port_get_bit(status, 18);
534}
535
536/**
537 * set port suspend change bit in port status
538 *
539 * @param status
540 * @param change value of the bit
541 */
542static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) {
543 usb_port_set_bit(status, 18, change);
544}
545
546//over current change
547/**
548 * over current change indicator
549 *
550 * @param status
551 * @return true if over-current condition on port has changed
552 */
553static inline bool usb_port_overcurrent_change(usb_port_status_t * status) {
554 return usb_port_get_bit(status, 19);
555}
556
557/**
558 * set port over current change bit in port status
559 *
560 * @param status
561 * @param change value of the bit
562 */
563static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) {
564 usb_port_set_bit(status, 19, change);
565}
566
567//reset change
568/**
569 * port reset change indicator
570 * @param status
571 * @return true if port has been reset
572 */
573static inline bool usb_port_reset_completed(usb_port_status_t * status) {
574 return usb_port_get_bit(status, 20);
575}
576
577/**
578 * set port reset completed bit in port status
579 *
580 * @param status
581 * @param change value of the bit
582 */
583static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) {
584 usb_port_set_bit(status, 20, completed);
585}
586
587//local power status
588/**
589 * local power lost indicator for hub status
590 *
591 * @param status
592 * @return true if hub is not powered
593 */
594static inline bool usb_hub_local_power_lost(usb_hub_status_t * status) {
595 return usb_hub_get_bit(status, 0);
596}
597
598/**
599 * set hub power lost bit in hub status
600 *
601 * @param status
602 * @param change value of the bit
603 */
604static inline void usb_hub_set_local_power_lost(usb_port_status_t * status,
605 bool power_lost) {
606 usb_hub_set_bit(status, 0, power_lost);
607}
608
609//over current ocndition
610/**
611 * hub over-current indicator
612 *
613 * @param status
614 * @return true if over-current condition occurred on hub
615 */
616static inline bool usb_hub_over_current(usb_hub_status_t * status) {
617 return usb_hub_get_bit(status, 1);
618}
619
620/**
621 * set hub over current bit in hub status
622 *
623 * @param status
624 * @param change value of the bit
625 */
626static inline void usb_hub_set_over_current(usb_port_status_t * status,
627 bool over_current) {
628 usb_hub_set_bit(status, 1, over_current);
629}
630
631//local power change
632/**
633 * hub power change indicator
634 *
635 * @param status
636 * @return true if local power status has been changed - power has been
637 * dropped or re-established
638 */
639static inline bool usb_hub_local_power_change(usb_hub_status_t * status) {
640 return usb_hub_get_bit(status, 16);
641}
642
643/**
644 * set hub power change bit in hub status
645 *
646 * @param status
647 * @param change value of the bit
648 */
649static inline void usb_hub_set_local_power_change(usb_port_status_t * status,
650 bool change) {
651 usb_hub_set_bit(status, 16, change);
652}
653
654//local power status
655/**
656 * hub over-current condition change indicator
657 *
658 * @param status
659 * @return true if over-current condition has changed
660 */
661static inline bool usb_hub_over_current_change(usb_hub_status_t * status) {
662 return usb_hub_get_bit(status, 17);
663}
664
665/**
666 * set hub over current change bit in hub status
667 *
668 * @param status
669 * @param change value of the bit
670 */
671static inline void usb_hub_set_over_current_change(usb_port_status_t * status,
672 bool change) {
673 usb_hub_set_bit(status, 17, change);
674}
675
676
677#endif /* HUB_PORT_STATUS_H */
678
679/**
680 * @}
681 */
Note: See TracBrowser for help on using the repository browser.