summaryrefslogtreecommitdiffstats
path: root/cfe/cfe/usb/usbd.h
diff options
context:
space:
mode:
Diffstat (limited to 'cfe/cfe/usb/usbd.h')
-rw-r--r--cfe/cfe/usb/usbd.h308
1 files changed, 308 insertions, 0 deletions
diff --git a/cfe/cfe/usb/usbd.h b/cfe/cfe/usb/usbd.h
new file mode 100644
index 0000000..73fde86
--- /dev/null
+++ b/cfe/cfe/usb/usbd.h
@@ -0,0 +1,308 @@
+/* *********************************************************************
+ * Broadcom Common Firmware Environment (CFE)
+ *
+ * USB Device Layer definitions File: usbd.h
+ *
+ * Definitions for the USB device layer.
+ *
+ * Author: Mitch Lichtenberg (mpl@broadcom.com)
+ *
+ *********************************************************************
+ *
+ * Copyright 2000,2001,2002,2003
+ * Broadcom Corporation. All rights reserved.
+ *
+ * This software is furnished under license and may be used and
+ * copied only in accordance with the following terms and
+ * conditions. Subject to these conditions, you may download,
+ * copy, install, use, modify and distribute modified or unmodified
+ * copies of this software in source and/or binary form. No title
+ * or ownership is transferred hereby.
+ *
+ * 1) Any source code used, modified or distributed must reproduce
+ * and retain this copyright notice and list of conditions
+ * as they appear in the source file.
+ *
+ * 2) No right is granted to use any trade name, trademark, or
+ * logo of Broadcom Corporation. The "Broadcom Corporation"
+ * name may not be used to endorse or promote products derived
+ * from this software without the prior written permission of
+ * Broadcom Corporation.
+ *
+ * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
+ * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
+ * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ ********************************************************************* */
+
+#ifndef _PHYSADDR_T_DEFINED_
+#include "lib_physio.h"
+#endif
+
+#include "usbchap9.h"
+
+
+/* *********************************************************************
+ * Forward declarations and opaque types
+ ********************************************************************* */
+
+typedef struct usb_hc_s usb_hc_t;
+typedef struct usb_ept_s usb_ept_t;
+typedef struct usb_hcdrv_s usb_hcdrv_t;
+typedef struct usbdev_s usbdev_t;
+typedef struct usb_driver_s usb_driver_t;
+
+/* *********************************************************************
+ * USB Bus structure - one of these per host controller
+ ********************************************************************* */
+
+#define USB_MAX_DEVICES 128
+
+typedef struct usbbus_s {
+ struct usbbus_s *ub_next; /* link to other buses */
+ usb_hc_t *ub_hwsoftc; /* bus driver softc */
+ usb_hcdrv_t *ub_hwdisp; /* bus driver dispatch */
+ usbdev_t *ub_roothub; /* root hub device */
+ usbdev_t *ub_devices[USB_MAX_DEVICES]; /* pointers to each device, idx by address */
+ unsigned int ub_flags; /* flag bits */
+ int ub_num; /* bus number */
+} usbbus_t;
+
+#define UB_FLG_NEEDSCAN 1 /* some device on bus needs scanning */
+
+/* *********************************************************************
+ * USB Pipe structure - one of these per unidirectional channel
+ * to an endpoint on a USB device
+ ********************************************************************* */
+
+#define UP_TYPE_CONTROL 1
+#define UP_TYPE_BULK 2
+#define UP_TYPE_INTR 4
+#define UP_TYPE_ISOC 8
+
+#define UP_TYPE_IN 128
+#define UP_TYPE_OUT 256
+
+#define UP_TYPE_LOWSPEED 16
+
+typedef struct usbpipe_s {
+ usb_ept_t *up_hwendpoint; /* OHCI-specific endpoint pointer */
+ usbdev_t *up_dev; /* our device info */
+ int up_num; /* pipe number */
+ int up_mps; /* max packet size */
+ int up_flags;
+} usbpipe_t;
+
+/* *********************************************************************
+ * USB device structure - one per device attached to the USB
+ * This is the basic structure applications will use to
+ * refer to a device.
+ ********************************************************************* */
+
+#define UD_FLAG_HUB 0x0001 /* this is a hub device */
+#define UD_FLAG_ROOTHUB 0x0002 /* this is a root hub device */
+#define UD_FLAG_LOWSPEED 0x0008 /* this is a lowspeed device */
+
+#define UD_MAX_PIPES 32
+#define USB_EPADDR_TO_IDX(addr) ((((addr)&0x80) >> 3) | ((addr) & 0x0F))
+//#define USB_EPADDR_TO_IDX(addr) USB_ENDPOINT_ADDRESS(addr)
+//#define UD_MAX_PIPES 16
+
+struct usbdev_s {
+ usb_driver_t *ud_drv; /* Driver's methods */
+ usbbus_t *ud_bus; /* owning bus */
+ int ud_address; /* USB address */
+ usbpipe_t *ud_pipes[UD_MAX_PIPES]; /* pipes, 0 is the control pipe */
+ struct usbdev_s *ud_parent; /* used for hubs */
+ int ud_flags;
+ void *ud_private; /* private data for device driver */
+ usb_device_descr_t ud_devdescr; /* device descriptor */
+ usb_config_descr_t *ud_cfgdescr; /* config, interface, and ep descrs */
+};
+
+
+/* *********************************************************************
+ * USB Request - basic structure to describe an in-progress
+ * I/O request. It associates buses, pipes, and buffers
+ * together.
+ ********************************************************************* */
+
+
+#define UR_FLAG_SYNC 0x8000
+
+#define UR_FLAG_SETUP 0x0001
+#define UR_FLAG_IN 0x0002
+#define UR_FLAG_OUT 0x0004
+#define UR_FLAG_STATUS_IN 0x0008 /* status phase of a control WRITE */
+#define UR_FLAG_STATUS_OUT 0x0010 /* status phase of a control READ */
+#define UR_FLAG_SHORTOK 0x0020 /* short transfers are ok */
+
+
+typedef struct usbreq_s {
+ queue_t ur_qblock;
+
+ /*
+ * pointers to our device and pipe
+ */
+
+ usbdev_t *ur_dev;
+ usbpipe_t *ur_pipe;
+
+ /*
+ * stuff to keep track of the data we transfer
+ */
+
+ uint8_t *ur_buffer;
+ int ur_length;
+ int ur_xferred;
+ int ur_status;
+ int ur_flags;
+
+ /*
+ * Stuff needed for the callback
+ */
+ void *ur_ref;
+ int ur_inprogress;
+ int (*ur_callback)(struct usbreq_s *req);
+
+ /*
+ * For use inside the ohci driver
+ */
+ void *ur_tdqueue;
+ int ur_tdcount;
+} usbreq_t;
+
+
+/* *********************************************************************
+ * Prototypes
+ ********************************************************************* */
+
+int usb_create_pipe(usbdev_t *dev,int pipenum,int mps,int flags);
+void usb_destroy_pipe(usbdev_t *dev,int pipenum);
+int usb_set_address(usbdev_t *dev,int addr);
+usbdev_t *usb_create_device(usbbus_t *bus,int lowspeed);
+void usb_destroy_device(usbdev_t *dev);
+usbreq_t *usb_make_request(usbdev_t *dev,int pipenum,uint8_t *buf,int length,int flags);
+void usb_poll(usbbus_t *bus);
+void usb_daemon(usbbus_t *bus);
+int usb_cancel_request(usbreq_t *ur);
+void usb_free_request(usbreq_t *ur);
+int usb_queue_request(usbreq_t *ur);
+int usb_wait_request(usbreq_t *ur);
+int usb_sync_request(usbreq_t *ur);
+int usb_get_descriptor(usbdev_t *dev,uint8_t reqtype,int dsctype,int dscidx,uint8_t *buffer,int buflen);
+int usb_get_config_descriptor(usbdev_t *dev,usb_config_descr_t *dscr,int idx,int maxlen);
+int usb_get_device_status(usbdev_t *dev,usb_device_status_t *status);
+int usb_set_configuration(usbdev_t *dev,int config);
+int usb_open_pipe(usbdev_t *dev,usb_endpoint_descr_t *epdesc);
+int usb_simple_request(usbdev_t *dev,uint8_t reqtype,int bRequest,int wValue,int wIndex);
+void usb_complete_request(usbreq_t *ur,int status);
+int usb_get_device_descriptor(usbdev_t *dev,usb_device_descr_t *dscr,int smallflg);
+int usb_set_ep0mps(usbdev_t *dev,int mps);
+int usb_new_address(usbbus_t *bus);
+int usb_get_string(usbdev_t *dev,int id,char *buf,int maxlen);
+int usb_std_request(usbdev_t *dev,uint8_t bmRequestType,
+ uint8_t bRequest,uint16_t wValue,
+ uint16_t wIndex,uint8_t *buffer,int length);
+void *usb_find_cfg_descr(usbdev_t *dev,int dtype,int idx);
+void usb_delay_ms(usbbus_t *bus,int ms);
+int usb_clear_stall(usbdev_t *dev,int pipe);
+
+void usb_scan(usbbus_t *bus);
+void usbhub_map_tree(usbbus_t *bus,int (*func)(usbdev_t *dev,void *arg),void *arg);
+void usbhub_dumpbus(usbbus_t *bus,uint32_t verbose);
+
+void usb_initroot(usbbus_t *bus);
+
+
+/* *********************************************************************
+ * Host Controller Driver
+ * Methods for abstracting the USB host controller from the
+ * rest of the goop.
+ ********************************************************************* */
+
+struct usb_hcdrv_s {
+ usbbus_t * (*hcdrv_create)(physaddr_t regaddr);
+ void (*hcdrv_delete)(usbbus_t *);
+ int (*hcdrv_start)(usbbus_t *);
+ void (*hcdrv_stop)(usbbus_t *);
+ int (*hcdrv_intr)(usbbus_t *);
+ usb_ept_t * (*hcdrv_ept_create)(usbbus_t *,int usbaddr,int eptnum,int mps,int flags);
+ void (*hcdrv_ept_delete)(usbbus_t *,usb_ept_t *);
+ void (*hcdrv_ept_setmps)(usbbus_t *,usb_ept_t *,int mps);
+ void (*hcdrv_ept_setaddr)(usbbus_t *,usb_ept_t *,int addr);
+ void (*hcdrv_ept_cleartoggle)(usbbus_t *,usb_ept_t *);
+ int (*hcdrv_xfer)(usbbus_t *,usb_ept_t *uept,usbreq_t *ur);
+};
+
+#define UBCREATE(driver,addr) (*((driver)->hcdrv_create))(addr)
+#define UBDELETE(bus) (*((bus)->ub_hwdisp->hcdrv_delete))(bus)
+#define UBSTART(bus) (*((bus)->ub_hwdisp->hcdrv_start))(bus)
+#define UBSTOP(bus) (*((bus)->ub_hwdisp->hcdrv_stop))(bus)
+#define UBINTR(bus) (*((bus)->ub_hwdisp->hcdrv_intr))(bus)
+#define UBEPTCREATE(bus,addr,num,mps,flags) (*((bus)->ub_hwdisp->hcdrv_ept_create))(bus,addr,num,mps,flags)
+#define UBEPTDELETE(bus,ept) (*((bus)->ub_hwdisp->hcdrv_ept_delete))(bus,ept)
+#define UBEPTSETMPS(bus,ept,mps) (*((bus)->ub_hwdisp->hcdrv_ept_setmps))(bus,ept,mps)
+#define UBEPTSETADDR(bus,ept,addr) (*((bus)->ub_hwdisp->hcdrv_ept_setaddr))(bus,ept,addr)
+#define UBEPTCLEARTOGGLE(bus,ept) (*((bus)->ub_hwdisp->hcdrv_ept_cleartoggle))(bus,ept)
+#define UBXFER(bus,ept,xfer) (*((bus)->ub_hwdisp->hcdrv_xfer))(bus,ept,xfer)
+
+/* *********************************************************************
+ * Devices - methods for abstracting things that _use_ USB
+ * (devices you can plug into the USB) - the entry points
+ * here are basically just for device discovery, since the top half
+ * of the actual driver will be device-specific.
+ ********************************************************************* */
+
+struct usb_driver_s {
+ char *udrv_name;
+ int (*udrv_attach)(usbdev_t *,usb_driver_t *);
+ int (*udrv_detach)(usbdev_t *);
+};
+
+typedef struct usb_drvlist_s {
+ int udl_class;
+ int udl_vendor;
+ int udl_product;
+ usb_driver_t *udl_disp;
+} usb_drvlist_t;
+
+extern usb_driver_t *usb_find_driver(usbdev_t *dev);
+
+#define CLASS_ANY -1
+#define VENDOR_ANY -1
+#define PRODUCT_ANY -1
+
+void mydelay(int x);
+
+#define IS_HUB(dev) ((dev)->ud_devdescr.bDeviceClass == USB_DEVICE_CLASS_HUB)
+
+/* *********************************************************************
+ * Error codes
+ ********************************************************************* */
+
+#define USBD_ERR_OK 0 /* Request ok */
+#define USBD_ERR_STALLED -1 /* Endpoint is stalled */
+#define USBD_ERR_IOERROR -2 /* I/O error */
+#define USBD_ERR_HWERROR -3 /* Hardware failure */
+#define USBD_ERR_CANCELED -4 /* Request canceled */
+#define USBD_ERR_NOMEM -5 /* Out of memory */
+#define USBD_ERR_TIMEOUT -6 /* Request timeout */
+
+/* *********************************************************************
+ * Debug routines
+ ********************************************************************* */
+
+void usb_dbg_dumpportstatus(int port,usb_port_status_t *portstatus,int level);
+void usb_dbg_dumpdescriptors(usbdev_t *dev,uint8_t *ptr,int len);
+void usb_dbg_dumpcfgdescr(usbdev_t *dev);
+void usb_dbg_dumpeptdescr(usb_endpoint_descr_t * epdscr);