source: mainline/uspace/drv/bus/usb/ehci/hw_struct/queue_head.h@ fdaaad00

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since fdaaad00 was 42de21a, checked in by Jan Vesely <jano.vesely@…>, 12 years ago

ehci: implement toggle bit manipulation

  • Property mode set to 100644
File size: 6.2 KB
Line 
1/*
2 * Copyright (c) 2013 Jan Vesely
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 drvusbehci
29 * @{
30 */
31/** @file
32 * @brief EHCI driver
33 */
34#ifndef DRV_EHCI_HW_STRUCT_QH_H
35#define DRV_EHCI_HW_STRUCT_QH_H
36
37#include <assert.h>
38#include <sys/types.h>
39#include <usb/host/endpoint.h>
40
41#include "../utils/malloc32.h"
42#include "link_pointer.h"
43#include "mem_access.h"
44
45/** This structure is defined in EHCI design guide p. 46 */
46typedef struct queue_head {
47 link_pointer_t horizontal;
48
49 volatile uint32_t ep_char;
50#define QH_EP_CHAR_RL_MASK 0xf
51#define QH_EP_CHAR_RL_SHIFT 28
52#define QH_EP_CHAR_C_FLAG (1 << 27)
53#define QH_EP_CHAR_MAX_LENGTH_MASK 0x7ff
54#define QH_EP_CHAR_MAX_LENGTH_SHIFT 16
55#define QH_EP_CHAR_MAX_LENGTH_SET(len) \
56 (((len) & QH_EP_CHAR_MAX_LENGTH_MASK) << QH_EP_CHAR_MAX_LENGTH_SHIFT)
57#define QH_EP_CHAR_MAX_LENGTH_GET(val) \
58 (((val) >> QH_EP_CHAR_MAX_LENGTH_SHIFT) & QH_EP_CHAR_MAX_LENGTH_MASK)
59#define QH_EP_CHAR_H_FLAG (1 << 15)
60#define QH_EP_CHAR_DTC_FLAG (1 << 14)
61#define QH_EP_CHAR_EPS_FS (0x0 << 12)
62#define QH_EP_CHAR_EPS_LS (0x1 << 12)
63#define QH_EP_CHAR_EPS_HS (0x2 << 12)
64#define QH_EP_CHAR_EPS_MASK (0x3 << 12)
65#define QH_EP_CHAR_EP_MASK 0xf
66#define QH_EP_CHAR_EP_SHIFT 8
67#define QH_EP_CHAR_EP_SET(num) \
68 (((num) & QH_EP_CHAR_EP_MASK) << QH_EP_CHAR_EP_SHIFT)
69#define QH_EP_CHAR_ADDR_GET(val) \
70 (((val) >> QH_EP_CHAR_ADDR_SHIFT) & QH_EP_CHAR_ADDR_MASK)
71#define QH_EP_CHAR_INACT_FLAG (1 << 7)
72#define QH_EP_CHAR_ADDR_MASK 0x3f
73#define QH_EP_CHAR_ADDR_SHIFT 0
74#define QH_EP_CHAR_ADDR_SET(addr) \
75 (((addr) & QH_EP_CHAR_ADDR_MASK) << QH_EP_CHAR_ADDR_SHIFT)
76#define QH_EP_CHAR_ADDR_GET(val) \
77 (((val) >> QH_EP_CHAR_ADDR_SHIFT) & QH_EP_CHAR_ADDR_MASK)
78
79 volatile uint32_t ep_cap;
80#define QH_EP_CAP_MULTI_MASK 0x3
81#define QH_EP_CAP_MULTI_SHIFT 30
82#define QH_EP_CAP_MULTI_SET(count) \
83 (((count) & QH_EP_CAP_MULTI_MASK) << QH_EP_CAP_MULTI_SHIFT)
84#define QH_EP_CAP_PORT_MASK 0x7f
85#define QH_EP_CAP_PORT_SHIFT 23
86#define QH_EP_CAP_TT_PORT_SET(addr) \
87 (((addr) & QH_EP_CAP_HUB_MASK) << QH_EP_CAP_HUB_SHIFT)
88#define QH_EP_CAP_HUB_MASK 0x7f
89#define QH_EP_CAP_HUB_SHIFT 16
90#define QH_EP_CAP_TT_ADDR_SET(addr) \
91 (((addr) & QH_EP_CAP_HUB_MASK) << QH_EP_CAP_HUB_SHIFT)
92#define QH_EP_CAP_C_MASK_MASK 0xff
93#define QH_EP_CAP_C_MASK_SHIFT 8
94#define QH_EP_CAP_C_MASK_SET(val) \
95 (((val) & QH_EP_CAP_C_MASK_MASK) << QH_EP_CAP_C_MASK_SHIFT)
96#define QH_EP_CAP_S_MASK_MASK 0xff
97#define QH_EP_CAP_S_MASK_SHIFT 0
98#define QH_EP_CAP_S_MASK_SET(val) \
99 (((val) & QH_EP_CAP_S_MASK_MASK) << QH_EP_CAP_S_MASK_SHIFT)
100
101 link_pointer_t current;
102/* Transfer overlay starts here */
103 link_pointer_t next;
104 link_pointer_t alternate;
105#define QH_ALTERNATE_NACK_CNT_MASK 0x7
106#define QH_ALTERNATE_NACK_CNT_SHIFT 1
107
108 volatile uint32_t status;
109#define QH_STATUS_TOGGLE_FLAG (1 << 31)
110#define QH_STATUS_TOTAL_MASK 0x7fff
111#define QH_STATUS_TOTAL_SHIFT 16
112#define QH_STATUS_IOC_FLAG (1 << 15)
113#define QH_STATUS_C_PAGE_MASK 0x7
114#define QH_STATUS_C_PAGE_SHIFT 12
115#define QH_STATUS_CERR_MASK 0x3
116#define QH_STATUS_CERR_SHIFT 10
117#define QH_STATUS_PID_MASK 0x3
118#define QH_STATUS_PID_SHIFT 8
119#define QH_STATUS_ACTIVE_FLAG (1 << 7)
120#define QH_STATUS_HALTED_FLAG (1 << 6)
121#define QH_STATUS_BUFF_ERROR_FLAG (1 << 5)
122#define QH_STATUS_BABBLE_FLAG (1 << 4)
123#define QH_STATUS_TRANS_ERR_FLAG (1 << 3)
124#define QH_STATUS_MISSED_FLAG (1 << 2)
125#define QH_STATUS_SPLIT_FLAG (1 << 1)
126#define QH_STATUS_PING_FLAG (1 << 0)
127
128 volatile uint32_t buffer_pointer[5];
129#define QH_BUFFER_POINTER_MASK 0xfffff000
130/* Only the first buffer pointer */
131#define QH_BUFFER_POINTER_OFFSET_MASK 0xfff
132#define QH_BUFFER_POINTER_OFFSET_SHIFT 0
133/* Only the second buffer pointer */
134#define QH_BUFFER_POINTER_C_MASK_MASK 0xff
135#define QH_BUFFER_POINTER_C_MASK_SHIFFT 0
136/* Only the third buffer pointer */
137#define QH_BUFFER_POINTER_S_MASK 0x7f
138#define QH_BUFFER_POINTER_S_SHIFT 5
139#define QH_BUFFER_POINTER_FTAG_MASK 0x1f
140#define QH_BUFFER_POINTER_FTAG_SHIFT 0
141
142} qh_t;
143
144static inline void qh_append_qh(qh_t *qh, const qh_t *next)
145{
146 assert(qh);
147 assert(next);
148 const uint32_t pa = addr_to_phys(next);
149 assert((pa & LINK_POINTER_ADDRESS_MASK) == pa);
150 EHCI_MEM32_WR(qh->horizontal, LINK_POINTER_QH(pa));
151}
152
153static inline uintptr_t qh_next(const qh_t *qh)
154{
155 assert(qh);
156 return (EHCI_MEM32_RD(qh->horizontal) & LINK_POINTER_ADDRESS_MASK);
157}
158
159static inline bool qh_toggle_from_td(const qh_t *qh)
160{
161 assert(qh);
162 return (EHCI_MEM32_RD(qh->ep_cap) & QH_EP_CHAR_DTC_FLAG);
163}
164
165static inline void qh_toggle_set(qh_t *qh, int toggle)
166{
167 assert(qh);
168 if (toggle)
169 EHCI_MEM32_SET(qh->status, QH_STATUS_TOGGLE_FLAG);
170 else
171 EHCI_MEM32_CLR(qh->status, QH_STATUS_TOGGLE_FLAG);
172}
173
174static inline int qh_toggle_get(const qh_t *qh)
175{
176 assert(qh);
177 return (EHCI_MEM32_RD(qh->status) & QH_STATUS_TOGGLE_FLAG) ? 1 : 0;
178}
179
180
181void qh_init(qh_t *instance, const endpoint_t *ep);
182#endif
183/**
184 * @}
185 */
Note: See TracBrowser for help on using the repository browser.