source: mainline/uspace/drv/usbhub/port_status.h@ 7d521e24

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 7d521e24 was 7d521e24, checked in by Vojtech Horky <vojtechhorky@…>, 14 years ago

libusbdev uses include usb/dev

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