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
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 =
98 usb_new(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 =
160 usb_new(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 =
188 usb_new(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 =
216 usb_new(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 */
258static inline bool usb_port_get_bit(usb_port_status_t * status, int idx) {
259 return (*status)&(1 << idx);
[b5ec347]260}
261
[3dba1ca]262/**
263 * set i`th bit of port status
264 *
265 * @param status
266 * @param idx
267 * @param value
268 */
[b5ec347]269static inline void usb_port_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 */
283static inline bool usb_hub_get_bit(usb_hub_status_t * status, int idx) {
284 return (*status)&(1 << idx);
[040ab02]285}
286
[3dba1ca]287/**
288 * set i`th bit of hub status
289 *
290 * @param status
291 * @param idx
292 * @param value
293 */
[040ab02]294static inline void usb_hub_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
[3dba1ca]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);
[b5ec347]309}
310
[3dba1ca]311static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) {
312 usb_port_set_bit(status, 0, connected);
[b5ec347]313}
314
315//port enabled
[3dba1ca]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);
[b5ec347]325}
326
[3dba1ca]327static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) {
328 usb_port_set_bit(status, 1, enabled);
[b5ec347]329}
330
331//port suspended
[3dba1ca]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);
[b5ec347]340}
341
[3dba1ca]342static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) {
343 usb_port_set_bit(status, 2, suspended);
[b5ec347]344}
345
346//over currect
[3dba1ca]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);
[b5ec347]355}
356
[3dba1ca]357static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) {
358 usb_port_set_bit(status, 3, value);
[b5ec347]359}
360
361//port reset
[3dba1ca]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);
[b5ec347]370}
371
[3dba1ca]372static inline void usb_port_set_reset(usb_port_status_t * status, bool value) {
373 usb_port_set_bit(status, 4, value);
[b5ec347]374}
375
376//powered
[3dba1ca]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);
[b5ec347]385}
386
[3dba1ca]387static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) {
388 usb_port_set_bit(status, 8, powered);
[b5ec347]389}
390
391//low speed device attached
[3dba1ca]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);
[b5ec347]400}
401
[3dba1ca]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);
[b5ec347]404}
405
[3dba1ca]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);
[a7528a16]415}
416
[3dba1ca]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);
[a7528a16]419}
420
[3dba1ca]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))
[a7528a16]429 return USB_SPEED_LOW;
[3dba1ca]430 if (usb_port_high_speed(status))
[a7528a16]431 return USB_SPEED_HIGH;
432 return USB_SPEED_FULL;
433}
434
[b5ec347]435
436//connect change
[3dba1ca]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);
[b5ec347]445}
446
[3dba1ca]447static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) {
448 usb_port_set_bit(status, 16, change);
[b5ec347]449}
450
451//port enable change
[3dba1ca]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);
[b5ec347]460}
461
[3dba1ca]462static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) {
463 usb_port_set_bit(status, 17, change);
[b5ec347]464}
465
466//suspend change
[3dba1ca]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);
[b5ec347]475}
476
[3dba1ca]477static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) {
478 usb_port_set_bit(status, 18, change);
[b5ec347]479}
480
481//over current change
[3dba1ca]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);
[b5ec347]490}
491
[3dba1ca]492static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) {
493 usb_port_set_bit(status, 19, change);
[b5ec347]494}
495
496//reset change
[3dba1ca]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);
[b5ec347]504}
505
[3dba1ca]506static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) {
507 usb_port_set_bit(status, 20, completed);
[b5ec347]508}
509
[040ab02]510//local power status
[3dba1ca]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);
[040ab02]519}
520
521static inline void usb_hub_set_local_power_lost(usb_port_status_t * status,
[3dba1ca]522 bool power_lost) {
523 usb_hub_set_bit(status, 0, power_lost);
[040ab02]524}
525
526//over current ocndition
[3dba1ca]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);
[040ab02]535}
536
537static inline void usb_hub_set_over_current(usb_port_status_t * status,
[3dba1ca]538 bool over_current) {
539 usb_hub_set_bit(status, 1, over_current);
[040ab02]540}
541
542//local power change
[3dba1ca]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);
[040ab02]552}
553
554static inline void usb_hub_set_local_power_change(usb_port_status_t * status,
[3dba1ca]555 bool change) {
556 usb_hub_set_bit(status, 16, change);
[040ab02]557}
558
559//local power status
[3dba1ca]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);
[040ab02]568}
569
570static inline void usb_hub_set_over_current_change(usb_port_status_t * status,
[3dba1ca]571 bool change) {
572 usb_hub_set_bit(status, 17, change);
[040ab02]573}
[b5ec347]574
575
[4d0c40b]576#endif /* HUB_PORT_STATUS_H */
[b5ec347]577
[281ebae]578/**
579 * @}
580 */
Note: See TracBrowser for help on using the repository browser.