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

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

codelifting

  • Property mode set to 100644
File size: 16.6 KB
RevLine 
[b5ec347]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 */
[281ebae]28/** @addtogroup drvusbhub
29 * @{
30 */
[b5ec347]31
[4d0c40b]32#ifndef HUB_PORT_STATUS_H
33#define HUB_PORT_STATUS_H
[b5ec347]34
35#include <bool.h>
36#include <sys/types.h>
[0f21c0c]37#include <usb/request.h>
[b5ec347]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 */
[98d06b8]48typedef uint32_t usb_port_status_t;
[b5ec347]49
[040ab02]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
[b5ec347]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(
[3dba1ca]66 usb_device_request_setup_packet_t * request, uint16_t port
67 ) {
[b5ec347]68 request->index = port;
69 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS;
[39c3d95d]70 request->request = USB_HUB_REQUEST_GET_STATUS;
[b5ec347]71 request->value = 0;
72 request->length = 4;
73}
74
[040ab02]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(
[3dba1ca]81 usb_device_request_setup_packet_t * request
82 ) {
[040ab02]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
[b5ec347]90/**
91 * create request for usb hub port status
92 * @param port
93 * @return
94 */
95static inline usb_device_request_setup_packet_t *
[3dba1ca]96usb_hub_create_port_status_request(uint16_t port) {
[b5ec347]97 usb_device_request_setup_packet_t * result =
[f35b294]98 malloc(sizeof(usb_device_request_setup_packet_t));
[3dba1ca]99 usb_hub_set_port_status_request(result, port);
[b5ec347]100 return result;
101}
102
[df3ad97]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(
[3dba1ca]110 usb_device_request_setup_packet_t * request, uint16_t port,
111 uint16_t feature_selector
112 ) {
[df3ad97]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
[8123695a]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(
[3dba1ca]127 usb_device_request_setup_packet_t * request, uint16_t port,
128 uint16_t feature_selector
129 ) {
[8123695a]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}
[df3ad97]136
[b5ec347]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(
[3dba1ca]143 usb_device_request_setup_packet_t * request, uint16_t port
144 ) {
[b5ec347]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 *
[3dba1ca]158usb_hub_create_enable_port_request(uint16_t port) {
[b5ec347]159 usb_device_request_setup_packet_t * result =
[f35b294]160 malloc(sizeof(usb_device_request_setup_packet_t));
[3dba1ca]161 usb_hub_set_enable_port_request(result, port);
[b5ec347]162 return result;
163}
164
[98d06b8]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(
[3dba1ca]171 usb_device_request_setup_packet_t * request, uint16_t port
172 ) {
[98d06b8]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 *
[3dba1ca]186usb_hub_create_disable_port_request(uint16_t port) {
[98d06b8]187 usb_device_request_setup_packet_t * result =
[f35b294]188 malloc(sizeof(usb_device_request_setup_packet_t));
[3dba1ca]189 usb_hub_set_disable_port_request(result, port);
[98d06b8]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(
[3dba1ca]199 usb_device_request_setup_packet_t * request, uint16_t port
200 ) {
[98d06b8]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 *
[3dba1ca]214usb_hub_create_reset_port_request(uint16_t port) {
[98d06b8]215 usb_device_request_setup_packet_t * result =
[f35b294]216 malloc(sizeof(usb_device_request_setup_packet_t));
[3dba1ca]217 usb_hub_set_reset_port_request(result, port);
[98d06b8]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(
[3dba1ca]227 usb_device_request_setup_packet_t * request, uint16_t port
228 ) {
[98d06b8]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}
[b5ec347]235
[cd4b184]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(
[3dba1ca]242 usb_device_request_setup_packet_t * request, uint16_t port
243 ) {
[cd4b184]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
[3dba1ca]251/**
252 * get i`th bit of port status
253 *
254 * @param status
255 * @param idx
256 * @return
257 */
[f35b294]258static inline bool usb_port_is_status(usb_port_status_t status, int idx) {
259 return (status&(1 << idx))!=0;
[b5ec347]260}
261
[3dba1ca]262/**
263 * set i`th bit of port status
264 *
265 * @param status
266 * @param idx
267 * @param value
268 */
[f35b294]269static inline void usb_port_status_set_bit(
[3dba1ca]270 usb_port_status_t * status, int idx, bool value) {
271 (*status) = value ?
272 ((*status) | (1 << (idx))) :
273 ((*status)&(~(1 << (idx))));
[b5ec347]274}
275
[3dba1ca]276/**
277 * get i`th bit of hub status
278 *
279 * @param status
280 * @param idx
281 * @return
282 */
[f35b294]283static inline bool usb_hub_is_status(usb_hub_status_t status, int idx) {
284 return (status&(1 << idx))!=0;
[040ab02]285}
286
[3dba1ca]287/**
288 * set i`th bit of hub status
289 *
290 * @param status
291 * @param idx
292 * @param value
293 */
[f35b294]294static inline void usb_hub_status_set_bit(
[3dba1ca]295 usb_hub_status_t * status, int idx, bool value) {
296 (*status) = value ?
297 ((*status) | (1 << (idx))) :
298 ((*status)&(~(1 << (idx))));
[040ab02]299}
300
[f35b294]301
302#if 0
[3dba1ca]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);
[b5ec347]311}
312
[36cd378]313/**
314 * set device connected bit in port status
315 *
316 * @param status
317 * @param connected value of the bit
318 */
[3dba1ca]319static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) {
320 usb_port_set_bit(status, 0, connected);
[b5ec347]321}
322
323//port enabled
[3dba1ca]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);
[b5ec347]333}
334
[36cd378]335/**
336 * set port enabled bit in port status
337 *
338 * @param status
339 * @param enabled value of the bit
340 */
[3dba1ca]341static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) {
342 usb_port_set_bit(status, 1, enabled);
[b5ec347]343}
344
345//port suspended
[3dba1ca]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);
[b5ec347]354}
355
[36cd378]356/**
357 * set port suspended bit in port status
358 *
359 * @param status
360 * @param suspended value of the bit
361 */
[3dba1ca]362static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) {
363 usb_port_set_bit(status, 2, suspended);
[b5ec347]364}
365
366//over currect
[3dba1ca]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);
[b5ec347]375}
376
[36cd378]377/**
378 * set over current indicator bit in port status
379 *
380 * @param status
381 * @param value value of the bit
382 */
[3dba1ca]383static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) {
384 usb_port_set_bit(status, 3, value);
[b5ec347]385}
386
387//port reset
[3dba1ca]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);
[b5ec347]396}
397
[36cd378]398/**
399 * set port reset bit in port status
400 *
401 * @param status
402 * @param value value of the bit
403 */
[3dba1ca]404static inline void usb_port_set_reset(usb_port_status_t * status, bool value) {
405 usb_port_set_bit(status, 4, value);
[b5ec347]406}
407
408//powered
[3dba1ca]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);
[b5ec347]417}
418
[36cd378]419/**
420 * set port powered bit in port status
421 *
422 * @param status
423 * @param powered value of the bit
424 */
[3dba1ca]425static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) {
426 usb_port_set_bit(status, 8, powered);
[b5ec347]427}
428
[f35b294]429#endif
430
[b5ec347]431//low speed device attached
[3dba1ca]432/**
433 * low speed device on the port indicator
434 *
435 * @param status
436 * @return true if low speed device is attached
437 */
[f35b294]438static inline bool usb_port_low_speed(usb_port_status_t status) {
439 return usb_port_is_status(status, 9);
[b5ec347]440}
441
[36cd378]442/**
[f35b294]443 * set low speed device connected bit in port status
[36cd378]444 *
445 * @param status
446 * @param low_speed value of the bit
447 */
[3dba1ca]448static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) {
[f35b294]449 usb_port_status_set_bit(status, 9, low_speed);
[b5ec347]450}
451
[3dba1ca]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 */
[f35b294]459static inline bool usb_port_high_speed(usb_port_status_t status) {
460 return usb_port_is_status(status, 10);
[a7528a16]461}
462
[36cd378]463/**
464 * set high speed device bit in port status
465 *
466 * @param status
467 * @param high_speed value of the bit
468 */
[3dba1ca]469static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) {
[f35b294]470 usb_port_status_set_bit(status, 10, high_speed);
[a7528a16]471}
472
[3dba1ca]473/**
474 * speed getter for port status
475 *
476 * @param status
477 * @return speed of usb device (for more see usb specification)
478 */
[f35b294]479static inline usb_speed_t usb_port_speed(usb_port_status_t status) {
[3dba1ca]480 if (usb_port_low_speed(status))
[a7528a16]481 return USB_SPEED_LOW;
[3dba1ca]482 if (usb_port_high_speed(status))
[a7528a16]483 return USB_SPEED_HIGH;
484 return USB_SPEED_FULL;
485}
486
[f35b294]487#if 0
[b5ec347]488//connect change
[3dba1ca]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);
[b5ec347]497}
498
[36cd378]499/**
500 * set connection change bit in port status
501 * @param status
502 * @param change value of the bit
503 */
[3dba1ca]504static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) {
505 usb_port_set_bit(status, 16, change);
[b5ec347]506}
507
508//port enable change
[3dba1ca]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);
[b5ec347]517}
518
[36cd378]519/**
520 * set port enable change bit in port status
521 *
522 * @param status
523 * @param change value of the bit
524 */
[3dba1ca]525static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) {
526 usb_port_set_bit(status, 17, change);
[b5ec347]527}
528
529//suspend change
[3dba1ca]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);
[b5ec347]538}
539
[36cd378]540/**
541 * set port suspend change bit in port status
542 *
543 * @param status
544 * @param change value of the bit
545 */
[3dba1ca]546static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) {
547 usb_port_set_bit(status, 18, change);
[b5ec347]548}
549
550//over current change
[3dba1ca]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);
[b5ec347]559}
560
[36cd378]561/**
562 * set port over current change bit in port status
563 *
564 * @param status
565 * @param change value of the bit
566 */
[3dba1ca]567static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) {
568 usb_port_set_bit(status, 19, change);
[b5ec347]569}
570
571//reset change
[3dba1ca]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);
[b5ec347]579}
580
[36cd378]581/**
582 * set port reset completed bit in port status
583 *
584 * @param status
585 * @param change value of the bit
586 */
[3dba1ca]587static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) {
588 usb_port_set_bit(status, 20, completed);
[b5ec347]589}
590
[040ab02]591//local power status
[3dba1ca]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);
[040ab02]600}
601
[36cd378]602/**
603 * set hub power lost bit in hub status
604 *
605 * @param status
606 * @param change value of the bit
607 */
[040ab02]608static inline void usb_hub_set_local_power_lost(usb_port_status_t * status,
[3dba1ca]609 bool power_lost) {
610 usb_hub_set_bit(status, 0, power_lost);
[040ab02]611}
612
613//over current ocndition
[3dba1ca]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);
[040ab02]622}
623
[36cd378]624/**
625 * set hub over current bit in hub status
626 *
627 * @param status
628 * @param change value of the bit
629 */
[040ab02]630static inline void usb_hub_set_over_current(usb_port_status_t * status,
[3dba1ca]631 bool over_current) {
632 usb_hub_set_bit(status, 1, over_current);
[040ab02]633}
634
635//local power change
[3dba1ca]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);
[040ab02]645}
646
[36cd378]647/**
648 * set hub power change bit in hub status
649 *
650 * @param status
651 * @param change value of the bit
652 */
[040ab02]653static inline void usb_hub_set_local_power_change(usb_port_status_t * status,
[3dba1ca]654 bool change) {
655 usb_hub_set_bit(status, 16, change);
[040ab02]656}
657
658//local power status
[3dba1ca]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);
[040ab02]667}
668
[36cd378]669/**
670 * set hub over current change bit in hub status
671 *
672 * @param status
673 * @param change value of the bit
674 */
[040ab02]675static inline void usb_hub_set_over_current_change(usb_port_status_t * status,
[3dba1ca]676 bool change) {
677 usb_hub_set_bit(status, 17, change);
[040ab02]678}
[f35b294]679#endif
[b5ec347]680
681
[4d0c40b]682#endif /* HUB_PORT_STATUS_H */
[b5ec347]683
[281ebae]684/**
685 * @}
686 */
Note: See TracBrowser for help on using the repository browser.