LibXenon
Bare-metal Xbox 360 homebrew library
Loading...
Searching...
No Matches
usbd.h
Go to the documentation of this file.
1/* *********************************************************************
2 * Broadcom Common Firmware Environment (CFE)
3 *
4 * USB Device Layer definitions File: usbd.h
5 *
6 * Definitions for the USB device layer.
7 *
8 * Author: Mitch Lichtenberg
9 *
10 *********************************************************************
11 *
12 * Copyright 2000,2001,2002,2003
13 * Broadcom Corporation. All rights reserved.
14 *
15 * This software is furnished under license and may be used and
16 * copied only in accordance with the following terms and
17 * conditions. Subject to these conditions, you may download,
18 * copy, install, use, modify and distribute modified or unmodified
19 * copies of this software in source and/or binary form. No title
20 * or ownership is transferred hereby.
21 *
22 * 1) Any source code used, modified or distributed must reproduce
23 * and retain this copyright notice and list of conditions
24 * as they appear in the source file.
25 *
26 * 2) No right is granted to use any trade name, trademark, or
27 * logo of Broadcom Corporation. The "Broadcom Corporation"
28 * name may not be used to endorse or promote products derived
29 * from this software without the prior written permission of
30 * Broadcom Corporation.
31 *
32 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
33 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
34 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
35 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
36 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
37 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
38 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
39 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
40 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
41 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
42 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
43 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
44 * THE POSSIBILITY OF SUCH DAMAGE.
45 ********************************************************************* */
46
47#ifndef _USBD_H_
48#define _USBD_H_
49
50#include "usbchap9.h"
51
52
53/* *********************************************************************
54 * Forward declarations and opaque types
55 ********************************************************************* */
56
57typedef struct usb_hc_s usb_hc_t;
58typedef struct usb_ept_s usb_ept_t;
59typedef struct usb_hcdrv_s usb_hcdrv_t;
60typedef struct usbdev_s usbdev_t;
62
63/* *********************************************************************
64 * USB Request error codes
65 *
66 * Note: these error codes exactly match the OHCI errors, so they
67 * should be kept in sync. It is expected that other controllers
68 * will either use these same codes or can be mapped into them.
69 ********************************************************************* */
70
71#define UR_ERR_NOERROR 0
72#define UR_ERR_CRC 1
73#define UR_ERR_BITSTUFFING 2
74#define UR_ERR_DATATOGGLEMISMATCH 3
75#define UR_ERR_STALL 4
76#define UR_ERR_DEVICENOTRESPONDING 5
77#define UR_ERR_PIDCHECKFAILURE 6
78#define UR_ERR_UNEXPECTEDPID 7
79#define UR_ERR_DATAOVERRUN 8
80#define UR_ERR_DATAUNDERRUN 9
81#define UR_ERR_BUFFEROVERRUN 12
82#define UR_ERR_BUFFERUNDERRUN 13
83#define UR_ERR_NOTACCESSED 15
84#define UR_ERR_CANCELLED 0xFF
85
86/* *********************************************************************
87 * USB Bus structure - one of these per host controller
88 ********************************************************************* */
89
90#define USB_MAX_DEVICES 128
91
92typedef struct usbbus_s {
93 struct usbbus_s *ub_next; /* link to other buses */
94 usb_hc_t *ub_hwsoftc; /* bus driver softc */
95 usb_hcdrv_t *ub_hwdisp; /* bus driver dispatch */
96 usbdev_t *ub_roothub; /* root hub device */
97 usbdev_t *ub_devices[USB_MAX_DEVICES]; /* pointers to each device, idx by address */
98 unsigned int ub_flags; /* flag bits */
99 int ub_num; /* bus number */
101
102#define UB_FLG_NEEDSCAN 1 /* some device on bus needs scanning */
103
104/* *********************************************************************
105 * USB Pipe structure - one of these per unidirectional channel
106 * to an endpoint on a USB device
107 ********************************************************************* */
108
109#define UP_TYPE_CONTROL 1
110#define UP_TYPE_BULK 2
111#define UP_TYPE_INTR 4
112#define UP_TYPE_ISOC 8
113
114#define UP_TYPE_IN 128
115#define UP_TYPE_OUT 256
116
117#define UP_TYPE_LOWSPEED 16
118
119typedef struct usbpipe_s {
120 usb_ept_t *up_hwendpoint; /* OHCI-specific endpoint pointer */
121 usbdev_t *up_dev; /* our device info */
122 int up_num; /* pipe number */
123 int up_mps; /* max packet size */
126
127/* *********************************************************************
128 * USB device structure - one per device attached to the USB
129 * This is the basic structure applications will use to
130 * refer to a device.
131 ********************************************************************* */
132
133#define UD_FLAG_HUB 0x0001 /* this is a hub device */
134#define UD_FLAG_ROOTHUB 0x0002 /* this is a root hub device */
135#define UD_FLAG_LOWSPEED 0x0008 /* this is a lowspeed device */
136#define UD_FLAG_REMOVING 0x0010 /* device is being removed */
137
138#define UD_MAX_PIPES 32
139#define USB_EPADDR_TO_IDX(addr) ((((addr)&0x80) >> 3) | ((addr) & 0x0F))
140
141struct usbdev_s {
142 usb_driver_t *ud_drv; /* Driver's methods */
143 usbbus_t *ud_bus; /* owning bus */
144 int ud_address; /* USB address */
145 usbpipe_t *ud_pipes[UD_MAX_PIPES]; /* pipes, 0 is the control pipe */
146 struct usbdev_s *ud_parent; /* used for hubs */
148 void *ud_private; /* private data for device driver */
149 usb_device_descr_t ud_devdescr; /* device descriptor */
150 usb_config_descr_t *ud_cfgdescr; /* config, interface, and ep descrs */
151};
152
153
154/* *********************************************************************
155 * USB Request - basic structure to describe an in-progress
156 * I/O request. It associates buses, pipes, and buffers
157 * together.
158 ********************************************************************* */
159
160
161#define UR_FLAG_SYNC 0x8000
162
163#define UR_FLAG_SETUP 0x0001
164#define UR_FLAG_IN 0x0002
165#define UR_FLAG_OUT 0x0004
166#define UR_FLAG_STATUS_IN 0x0008 /* status phase of a control WRITE */
167#define UR_FLAG_STATUS_OUT 0x0010 /* status phase of a control READ */
168#define UR_FLAG_SHORTOK 0x0020 /* short transfers are ok */
169
170
171typedef struct usbreq_s {
173
174 /*
175 * pointers to our device and pipe
176 */
177
180
181 /*
182 * stuff to keep track of the data we transfer
183 */
184
190
191 /*
192 * Stuff needed for the callback
193 */
194 void *ur_ref;
196 int (*ur_callback)(struct usbreq_s *req);
197
198 /*
199 * For use inside the ohci driver
200 */
204
205
206/* *********************************************************************
207 * Prototypes
208 ********************************************************************* */
209
210int usb_create_pipe(usbdev_t *dev,int pipenum,int mps,int flags);
211void usb_destroy_pipe(usbdev_t *dev,int pipenum);
212int usb_set_address(usbdev_t *dev,int addr);
213usbdev_t *usb_create_device(usbbus_t *bus,int lowspeed);
216usbreq_t *usb_make_request(usbdev_t *dev,int pipenum,uint8_t *buf,int length,int flags);
217void usb_poll(usbbus_t *bus);
218void usb_daemon(usbbus_t *bus);
220void usb_free_request(usbreq_t *ur);
224int usb_make_sync_request(usbdev_t *dev,int pipenum,uint8_t *buf,int length,int flags);
225int usb_get_descriptor(usbdev_t *dev,uint8_t reqtype,int dsctype,int dscidx,uint8_t *buffer,int buflen);
226int usb_get_config_descriptor(usbdev_t *dev,usb_config_descr_t *dscr,int idx,int maxlen);
228int usb_set_configuration(usbdev_t *dev,int config);
230int usb_simple_request(usbdev_t *dev,uint8_t reqtype,int bRequest,int wValue,int wIndex);
232int usb_get_device_descriptor(usbdev_t *dev,usb_device_descr_t *dscr,int smallflg);
233int usb_set_ep0mps(usbdev_t *dev,int mps);
235int usb_get_string(usbdev_t *dev,int id,char *buf,int maxlen);
236int usb_std_request(usbdev_t *dev,uint8_t bmRequestType,
237 uint8_t bRequest,uint16_t wValue,
238 uint16_t wIndex,uint8_t *buffer,int length);
239void *usb_find_cfg_descr(usbdev_t *dev,int dtype,int idx);
240void usb_delay_ms(usbbus_t *bus,int ms);
241int usb_clear_stall(usbdev_t *dev,int pipe);
242
243void usb_scan(usbbus_t *bus);
244void usbhub_map_tree(usbbus_t *bus,int (*func)(usbdev_t *dev,void *arg),void *arg);
245void usbhub_map_from_device(usbdev_t *dev,int (*func)(usbdev_t *dev,void *arg),void *arg);
246void usbhub_dumpbus(usbbus_t *bus,uint32_t verbose);
247
249
250
251/* *********************************************************************
252 * Host Controller Driver
253 * Methods for abstracting the USB host controller from the
254 * rest of the goop.
255 ********************************************************************* */
256
258 usbbus_t * (*hcdrv_create)(physaddr_t regaddr);
263 usb_ept_t * (*hcdrv_ept_create)(usbbus_t *,int usbaddr,int eptnum,int mps,int flags);
265 void (*hcdrv_ept_setmps)(usbbus_t *,usb_ept_t *,int mps);
266 void (*hcdrv_ept_setaddr)(usbbus_t *,usb_ept_t *,int addr);
269};
270
271#define UBCREATE(driver,addr) (*((driver)->hcdrv_create))(addr)
272#define UBDELETE(bus) (*((bus)->ub_hwdisp->hcdrv_delete))(bus)
273#define UBSTART(bus) (*((bus)->ub_hwdisp->hcdrv_start))(bus)
274#define UBSTOP(bus) (*((bus)->ub_hwdisp->hcdrv_stop))(bus)
275#define UBINTR(bus) (*((bus)->ub_hwdisp->hcdrv_intr))(bus)
276#define UBEPTCREATE(bus,addr,num,mps,flags) (*((bus)->ub_hwdisp->hcdrv_ept_create))(bus,addr,num,mps,flags)
277#define UBEPTDELETE(bus,ept) (*((bus)->ub_hwdisp->hcdrv_ept_delete))(bus,ept)
278#define UBEPTSETMPS(bus,ept,mps) (*((bus)->ub_hwdisp->hcdrv_ept_setmps))(bus,ept,mps)
279#define UBEPTSETADDR(bus,ept,addr) (*((bus)->ub_hwdisp->hcdrv_ept_setaddr))(bus,ept,addr)
280#define UBEPTCLEARTOGGLE(bus,ept) (*((bus)->ub_hwdisp->hcdrv_ept_cleartoggle))(bus,ept)
281#define UBXFER(bus,ept,xfer) (*((bus)->ub_hwdisp->hcdrv_xfer))(bus,ept,xfer)
282
283/* *********************************************************************
284 * Devices - methods for abstracting things that _use_ USB
285 * (devices you can plug into the USB) - the entry points
286 * here are basically just for device discovery, since the top half
287 * of the actual driver will be device-specific.
288 ********************************************************************* */
289
294};
295
296typedef struct usb_drvlist_s {
302
304
305#define CLASS_ANY -1
306#define VENDOR_ANY -1
307#define PRODUCT_ANY -1
308
309void mydelay(int x);
310
311#define IS_HUB(dev) ((dev)->ud_devdescr.bDeviceClass == USB_DEVICE_CLASS_HUB)
312
313/* *********************************************************************
314 * Error codes
315 ********************************************************************* */
316
317#define USBD_ERR_OK 0 /* Request ok */
318#define USBD_ERR_STALLED -1 /* Endpoint is stalled */
319#define USBD_ERR_IOERROR -2 /* I/O error */
320#define USBD_ERR_HWERROR -3 /* Hardware failure */
321#define USBD_ERR_CANCELED -4 /* Request canceled */
322#define USBD_ERR_NOMEM -5 /* Out of memory */
323#define USBD_ERR_TIMEOUT -6 /* Request timeout */
324
325/* *********************************************************************
326 * Debug routines
327 ********************************************************************* */
328
329void usb_dbg_dumpportstatus(int port,usb_port_status_t *portstatus,int level);
330void usb_dbg_dumpdescriptors(usbdev_t *dev,uint8_t *ptr,int len);
331void usb_dbg_dumpcfgdescr(usbdev_t *dev,unsigned int index);
335
336#endif /* _USBD_H_ */
uint16_t length
Definition: ata.h:4
unsigned int physaddr_t
Definition: cfe.h:12
u32 status
Definition: ehci_defs.h:15
u32 ptr
Definition: iso9660.c:536
u32 uint32_t
Definition: libfdt_env.h:11
u16 uint16_t
Definition: libfdt_env.h:10
u8 uint8_t
Definition: libfdt_env.h:9
int(* udrv_attach)(usbdev_t *, usb_driver_t *)
Definition: usbd.h:292
char * udrv_name
Definition: usbd.h:291
int(* udrv_detach)(usbdev_t *)
Definition: usbd.h:293
int udl_vendor
Definition: usbd.h:298
usb_driver_t * udl_disp
Definition: usbd.h:300
int udl_class
Definition: usbd.h:297
int udl_product
Definition: usbd.h:299
void(* hcdrv_ept_setmps)(usbbus_t *, usb_ept_t *, int mps)
Definition: usbd.h:265
int(* hcdrv_xfer)(usbbus_t *, usb_ept_t *uept, usbreq_t *ur)
Definition: usbd.h:268
void(* hcdrv_ept_delete)(usbbus_t *, usb_ept_t *)
Definition: usbd.h:264
void(* hcdrv_ept_cleartoggle)(usbbus_t *, usb_ept_t *)
Definition: usbd.h:267
void(* hcdrv_ept_setaddr)(usbbus_t *, usb_ept_t *, int addr)
Definition: usbd.h:266
int(* hcdrv_start)(usbbus_t *)
Definition: usbd.h:260
void(* hcdrv_stop)(usbbus_t *)
Definition: usbd.h:261
int(* hcdrv_intr)(usbbus_t *)
Definition: usbd.h:262
void(* hcdrv_delete)(usbbus_t *)
Definition: usbd.h:259
Definition: usbd.h:92
usbdev_t * ub_roothub
Definition: usbd.h:96
struct usbbus_s * ub_next
Definition: usbd.h:93
usb_hcdrv_t * ub_hwdisp
Definition: usbd.h:95
int ub_num
Definition: usbd.h:99
usbdev_t * ub_devices[USB_MAX_DEVICES]
Definition: usbd.h:97
unsigned int ub_flags
Definition: usbd.h:98
usb_hc_t * ub_hwsoftc
Definition: usbd.h:94
Definition: usbd.h:141
usbpipe_t * ud_pipes[UD_MAX_PIPES]
Definition: usbd.h:145
int ud_flags
Definition: usbd.h:147
usb_config_descr_t * ud_cfgdescr
Definition: usbd.h:150
int ud_address
Definition: usbd.h:144
usbbus_t * ud_bus
Definition: usbd.h:143
void * ud_private
Definition: usbd.h:148
usb_device_descr_t ud_devdescr
Definition: usbd.h:149
usb_driver_t * ud_drv
Definition: usbd.h:142
struct usbdev_s * ud_parent
Definition: usbd.h:146
int up_mps
Definition: usbd.h:123
int up_flags
Definition: usbd.h:124
usb_ept_t * up_hwendpoint
Definition: usbd.h:120
usbdev_t * up_dev
Definition: usbd.h:121
int up_num
Definition: usbd.h:122
Definition: usbd.h:171
int(* ur_callback)(struct usbreq_s *req)
Definition: usbd.h:196
int ur_inprogress
Definition: usbd.h:195
int ur_status
Definition: usbd.h:188
uint8_t * ur_buffer
Definition: usbd.h:185
int ur_xferred
Definition: usbd.h:187
queue_t ur_qblock
Definition: usbd.h:172
void * ur_tdqueue
Definition: usbd.h:201
int ur_flags
Definition: usbd.h:189
int ur_tdcount
Definition: usbd.h:202
void * ur_ref
Definition: usbd.h:194
usbdev_t * ur_dev
Definition: usbd.h:178
int ur_length
Definition: usbd.h:186
usbpipe_t * ur_pipe
Definition: usbd.h:179
struct usb_hc_s usb_hc_t
Definition: usbd.h:57
struct usb_drvlist_s usb_drvlist_t
void * usb_find_cfg_descr(usbdev_t *dev, int dtype, int idx)
Definition: usbd.c:1237
int usb_simple_request(usbdev_t *dev, uint8_t reqtype, int bRequest, int wValue, int wIndex)
Definition: usbd.c:600
void usb_dbg_showdevice(usbdev_t *dev)
Definition: usbdebug.c:314
void usb_dbg_dumpdescriptors(usbdev_t *dev, uint8_t *ptr, int len)
Definition: usbdebug.c:110
int usb_std_request(usbdev_t *dev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *buffer, int length)
Definition: usbd.c:796
int usb_new_address(usbbus_t *bus)
Definition: usbd.c:641
void usb_complete_request(usbreq_t *ur, int status)
Definition: usbd.c:1105
struct usbpipe_s usbpipe_t
void mydelay(int x)
Definition: usbhack.c:219
int usb_wait_request(usbreq_t *ur)
Definition: usbd.c:529
int usb_sync_request(usbreq_t *ur)
Definition: usbd.c:550
usbreq_t * usb_make_request(usbdev_t *dev, int pipenum, uint8_t *buf, int length, int flags)
Definition: usbd.c:353
void usb_dbg_dumpportstatus(int port, usb_port_status_t *portstatus, int level)
Definition: usbdebug.c:64
void usb_destroy_pipe(usbdev_t *dev, int pipenum)
Definition: usbd.c:212
int usb_set_address(usbdev_t *dev, int addr)
Definition: usbd.c:667
void usb_free_request(usbreq_t *ur)
Definition: usbd.c:457
int usb_create_pipe(usbdev_t *dev, int pipenum, int mps, int flags)
Definition: usbd.c:116
void usbhub_map_tree(usbbus_t *bus, int(*func)(usbdev_t *dev, void *arg), void *arg)
Definition: usbhub.c:532
void usb_dbg_dumpdevice(usbdev_t *dev)
Definition: usbdebug.c:293
int usb_get_device_status(usbdev_t *dev, usb_device_status_t *status)
Definition: usbd.c:1079
#define UD_MAX_PIPES
Definition: usbd.h:138
struct usbreq_s usbreq_t
void usb_daemon(usbbus_t *bus)
Definition: usbd.c:410
struct usb_ept_s usb_ept_t
Definition: usbd.h:58
void usb_poll(usbbus_t *bus)
Definition: usbd.c:392
int usb_clear_stall(usbdev_t *dev, int pipe)
Definition: usbd.c:731
usbdev_t * usb_create_device(usbbus_t *bus, int lowspeed)
Definition: usbd.c:299
int usb_queue_request(usbreq_t *ur)
Definition: usbd.c:502
struct usbbus_s usbbus_t
#define USB_MAX_DEVICES
Definition: usbd.h:90
int usb_get_descriptor(usbdev_t *dev, uint8_t reqtype, int dsctype, int dscidx, uint8_t *buffer, int buflen)
Definition: usbd.c:897
int usb_get_config_descriptor(usbdev_t *dev, usb_config_descr_t *dscr, int idx, int maxlen)
Definition: usbd.c:1049
int usb_get_string(usbdev_t *dev, int id, char *buf, int maxlen)
Definition: usbd.c:948
void usb_dbg_dumpeptdescr(usb_endpoint_descr_t *epdscr)
usb_driver_t * usb_find_driver(usbdev_t *dev)
Definition: usbdevs.c:158
void usb_initroot(usbbus_t *bus)
Definition: usbd.c:1128
int usb_cancel_request(usbreq_t *ur)
Definition: usbd.c:439
int usb_get_device_descriptor(usbdev_t *dev, usb_device_descr_t *dscr, int smallflg)
Definition: usbd.c:1006
void usbhub_map_from_device(usbdev_t *dev, int(*func)(usbdev_t *dev, void *arg), void *arg)
Definition: usbhub.c:537
int usb_make_sync_request(usbdev_t *dev, int pipenum, uint8_t *buf, int length, int flags)
Definition: usbd.c:572
void usb_delay_ms(usbbus_t *bus, int ms)
Definition: usbd.c:482
void usb_destroy_all_pipes(usbdev_t *dev)
Definition: usbd.c:244
int usb_set_configuration(usbdev_t *dev, int config)
Definition: usbd.c:619
void usb_scan(usbbus_t *bus)
Definition: usbhub.c:981
void usbhub_dumpbus(usbbus_t *bus, uint32_t verbose)
Definition: usbhub.c:590
int usb_set_ep0mps(usbdev_t *dev, int mps)
Definition: usbd.c:703
int usb_open_pipe(usbdev_t *dev, usb_endpoint_descr_t *epdesc)
Definition: usbd.c:165
void usb_dbg_dumpcfgdescr(usbdev_t *dev, unsigned int index)
Definition: usbdebug.c:266
void usb_destroy_device(usbdev_t *dev)
Definition: usbd.c:271
usbbus_t * bus
Definition: usbhack.c:153