[U-Boot] [RFC PATCH 0/1] Add ehci core
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Tue Nov 25 13:48:29 CET 2008
On 13:40 Tue 25 Nov , Michael Trimarchi wrote:
> Add ehci core support
>
> Signed-off-by: Michael Trimarchi <trimarchi at gandalf.sssup.it>
>
> ---
> common/cmd_usb.c | 3 +-
> common/usb.c | 2 +-
> drivers/usb/Makefile | 2 +
> drivers/usb/usb_ehci.h | 120 ++++++++
> drivers/usb/usb_ehci_core.c | 635 +++++++++++++++++++++++++++++++++++++++++++
> drivers/usb/usb_ehci_core.h | 29 ++
> include/usb.h | 15 +-
> include/usb_defs.h | 10 +
> 8 files changed, 808 insertions(+), 8 deletions(-)
> create mode 100644 drivers/usb/usb_ehci.h
> create mode 100644 drivers/usb/usb_ehci_core.c
> create mode 100644 drivers/usb/usb_ehci_core.h
>
> diff --git a/common/cmd_usb.c b/common/cmd_usb.c
> index 99e551f..532df37 100644
> --- a/common/cmd_usb.c
> +++ b/common/cmd_usb.c
> @@ -276,7 +276,8 @@ void usb_show_tree_graph(struct usb_device *dev,char *pre)
> pre[index++]= has_child ? '|' : ' ';
> pre[index]=0;
> printf(" %s (%s, %dmA)\n",usb_get_class_desc(dev->config.if_desc[0].bInterfaceClass),
too long please split
> - dev->slow ? "1.5MBit/s" : "12MBit/s",dev->config.MaxPower * 2);
> + (dev->speed == USB_SPEED_LOW) ? "1.5MBit/s" : (dev->speed == USB_SPEED_FULL)
too long please split
> + ? "12MBit/s" : "480MBit/s", dev->config.MaxPower * 2);
> if (strlen(dev->mf) ||
> strlen(dev->prod) ||
> strlen(dev->serial))
> diff --git a/common/usb.c b/common/usb.c
> index 7ab5df6..1518d9a 100644
> --- a/common/usb.c
> +++ b/common/usb.c
> @@ -1126,7 +1126,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
>
> /* Allocate a new device struct for it */
> usb = usb_alloc_new_device();
> - usb->slow = (portstatus & USB_PORT_STAT_LOW_SPEED) ? 1 : 0;
> + usb->speed = (portstatus & USB_PORT_STAT_LOW_SPEED) ? 1 : 0;
>
> dev->children[port] = usb;
> usb->parent = dev;
> diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile
> index c67a490..6a4df02 100644
> --- a/drivers/usb/Makefile
> +++ b/drivers/usb/Makefile
> @@ -34,6 +34,8 @@ COBJS-y += usbdcore.o
> COBJS-y += usbdcore_ep0.o
> COBJS-y += usbdcore_mpc8xx.o
> COBJS-y += usbdcore_omap1510.o
> +COBJS-$(CONFIG_USB_EHCI) += usb_ehci_core.o
> +COBJS-$(CONFIG_USB_EHCI_FSL) += usb_ehci_fsl.o
I've send a patch to move condition compile to Makefile
please base your after this one
>
> COBJS := $(COBJS-y)
> SRCS := $(COBJS:.o=.c)
> diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
> new file mode 100644
> index 0000000..9911068
> --- /dev/null
> +++ b/drivers/usb/usb_ehci.h
> @@ -0,0 +1,120 @@
> +/*-
> + * Copyright (c) 2007-2008, Juniper Networks, Inc.
> + * All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation version 2 of
> + * the License.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#ifndef USB_EHCI_H
> +#define USB_EHCI_H
> +
> +/* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */
> +#define DeviceRequest \
> + ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
please a space before and after '|' and '<<'
> +#define DeviceOutRequest \
> + ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
please a space before and after '|' and '<<'
> +
> +#define InterfaceRequest \
> + ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
please a space before and after '|' and '<<'
> +
> +#define EndpointRequest \
> + ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
please a space before and after '|' and '<<'
> +#define EndpointOutRequest \
> + ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
please a space before and after '|' and '<<'
> +
> +/*
> + * Register Space.
> + */
> +struct ehci_hccr {
> + uint8_t cr_caplength;
> + uint16_t cr_hciversion;
> + uint32_t cr_hcsparams;
> + uint32_t cr_hccparams;
> + uint8_t cr_hcsp_portrt[8];
> +};
> +
> +struct ehci_hcor {
> + uint32_t or_usbcmd;
> + uint32_t or_usbsts;
> + uint32_t or_usbintr;
> + uint32_t or_frindex;
> + uint32_t or_ctrldssegment;
> + uint32_t or_periodiclistbase;
> + uint32_t or_asynclistaddr;
> + uint32_t _reserved_[9];
> + uint32_t or_configflag;
> + uint32_t or_portsc[2];
> + uint32_t or_systune;
> +};
> +
> +#define EHCI_PS_WKOC_E 0x00400000 /* RW wake on over current */
> +#define EHCI_PS_WKDSCNNT_E 0x00200000 /* RW wake on disconnect */
> +#define EHCI_PS_WKCNNT_E 0x00100000 /* RW wake on connect */
> +#define EHCI_PS_PTC 0x000f0000 /* RW port test control */
> +#define EHCI_PS_PIC 0x0000c000 /* RW port indicator control */
> +#define EHCI_PS_PO 0x00002000 /* RW port owner */
> +#define EHCI_PS_PP 0x00001000 /* RW,RO port power */
> +#define EHCI_PS_LS 0x00000c00 /* RO line status */
> +#define EHCI_PS_IS_LOWSPEED(x) (((x) & EHCI_PS_LS) == 0x00000400)
> +#define EHCI_PS_PR 0x00000100 /* RW port reset */
> +#define EHCI_PS_SUSP 0x00000080 /* RW suspend */
> +#define EHCI_PS_FPR 0x00000040 /* RW force port resume */
> +#define EHCI_PS_OCC 0x00000020 /* RWC over current change */
> +#define EHCI_PS_OCA 0x00000010 /* RO over current active */
> +#define EHCI_PS_PEC 0x00000008 /* RWC port enable change */
> +#define EHCI_PS_PE 0x00000004 /* RW port enable */
> +#define EHCI_PS_CSC 0x00000002 /* RWC connect status change */
> +#define EHCI_PS_CS 0x00000001 /* RO connect status */
> +#define EHCI_PS_CLEAR (EHCI_PS_OCC|EHCI_PS_PEC|EHCI_PS_CSC)
please a space before and after '|' and '<<'
> +
> +/*
> + * Schedule Interface Space.
> + *
> + * IMPORTANT: Software must ensure that no interface data structure
> + * reachable by the EHCI host controller spans a 4K page boundary!
> + *
> + * Periodic transfers (i.e. isochronous and interrupt transfers) are
> + * not supported.
> + */
> +
> +/* Queue Element Transfer Descriptor (qTD). */
> +struct qTD {
> + uint32_t qt_next;
> +#define QT_NEXT_TERMINATE 1
> + uint32_t qt_altnext;
> + uint32_t qt_token;
> + uint32_t qt_buffer[5];
> +};
> +
> +/* Queue Head (QH). */
> +struct QH {
> + uint32_t qh_link;
> +#define QH_LINK_TERMINATE 1
> +#define QH_LINK_TYPE_ITD 0
> +#define QH_LINK_TYPE_QH 2
> +#define QH_LINK_TYPE_SITD 4
> +#define QH_LINK_TYPE_FSTN 6
> + uint32_t qh_endpt1;
> + uint32_t qh_endpt2;
> + uint32_t qh_curtd;
> + struct qTD qh_overlay;
> +};
> +
> +/* Low level intit functions */
> +
> +int ehci_hcd_init(void);
> +int ehci_hcd_stop(void);
> +#endif /* USB_EHCI_H */
> +#include <asm/io.h>
> +#include "usb_ehci.h"
> +
> +int rootdev;
> +struct ehci_hccr *hccr; /* R/O registers, not need for volatile */
> +volatile struct ehci_hcor *hcor;
> +
> +static uint16_t portreset;
> +static struct QH qh_list __attribute__((aligned(32)));
> +
> +struct usb_device_descriptor device = {
> + sizeof(struct usb_device_descriptor), /* bLength */
^^^
whitespace please fix
> + 1, /* bDescriptorType: UDESC_DEVICE */
> + 0x0002, /* bcdUSB: v2.0 */
> + 9, /* bDeviceClass: UDCLASS_HUB */
> + 0, /* bDeviceSubClass: UDSUBCLASS_HUB */
> + 1, /* bDeviceProtocol: UDPROTO_HSHUBSTT */
> + 64, /* bMaxPacketSize: 64 bytes */
> + 0x0000, /* idVendor */
> + 0x0000, /* idProduct */
> + 0x0001, /* bcdDevice */
^^^^^^^^^
whitespace please fix
> + 1, /* bDescriptorType: UDESC_DEVICE */
> + 1, /* iManufacturer */
> + 2, /* iProduct */
> + 0, /* iSerialNumber */
> + 1 /* bNumConfigurations: 1 */
> +};
> +
> +struct usb_config_descriptor config = {
> + sizeof(struct usb_config_descriptor),
> + 2, /* bDescriptorType: UDESC_CONFIG */
> + sizeof(struct usb_config_descriptor) +
> + sizeof(struct usb_interface_descriptor) +
> + sizeof(struct usb_endpoint_descriptor),
> + 0,
> + 1, /* bNumInterface */
> + 1, /* bConfigurationValue */
> + 0, /* iConfiguration */
> + 0x40, /* bmAttributes: UC_SELF_POWER */
> + 0 /* bMaxPower */
> +};
> +
> +struct usb_interface_descriptor interface = {
> + sizeof(struct usb_interface_descriptor), /* bLength */
^^^^^^^^
whitespace please fix
> + 4, /* bDescriptorType: UDESC_INTERFACE */
> + 0, /* bInterfaceNumber */
> + 0, /* bAlternateSetting */
> + 1, /* bNumEndpoints */
> + 9, /* bInterfaceClass: UICLASS_HUB */
> + 0, /* bInterfaceSubClass: UISUBCLASS_HUB */
> + 0, /* bInterfaceProtocol: UIPROTO_HSHUBSTT */
> + 0 /* iInterface */
> +};
> +
> +struct usb_endpoint_descriptor endpoint = {
> +sizeof(struct usb_endpoint_descriptor), /* bLength */
^^^^^^^^^
whitespace please fix
> + 5, /* bDescriptorType: UDESC_ENDPOINT */
> + 0x81, /* bEndpointAddress: UE_DIR_IN | EHCI_INTR_ENDPT */
> + 3, /* bmAttributes: UE_INTERRUPT */
> + 8, 0, /* wMaxPacketSize */
> + 255 /* bInterval */
> +};
> +
> +struct usb_hub_descriptor hub = {
> + sizeof(struct usb_hub_descriptor), /* bDescLength */
> + 0x29, /* bDescriptorType: hub
> + descriptor */
^^^
whitespace please fix
and please use this style of comment
/*
*
*/
> + 2, /* bNrPorts -- runtime modified */
> + 0, 0, /* wHubCharacteristics */
> + 0xff, /* bPwrOn2PwrGood */
> + {}, /* bHubCntrCurrent */
> + {} /* at most 7 ports! XXX */
> +};
> +
>
....
> #define usb_sndctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | create_pipe(dev,endpoint))
> #define usb_rcvctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | create_pipe(dev,endpoint) | USB_DIR_IN)
> @@ -333,7 +335,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate);
> #define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff)
> #define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
> #define usb_pipedata(pipe) (((pipe) >> 19) & 1)
> -#define usb_pipeslow(pipe) (((pipe) >> 26) & 1)
> +#define usb_pipespeed(pipe) (((pipe) >> 26) & 3)
> +#define usb_pipeslow(pipe) (usb_pipespeed(pipe) == USB_SPEED_LOW)
> #define usb_pipetype(pipe) (((pipe) >> 30) & 3)
> #define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
> #define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT)
> diff --git a/include/usb_defs.h b/include/usb_defs.h
> index 353019f..8032e57 100644
> --- a/include/usb_defs.h
> +++ b/include/usb_defs.h
> @@ -80,6 +80,12 @@
> #define USB_DIR_OUT 0
whitespace please fix
> #define USB_DIR_IN 0x80
whitespace please fix
>
> +/* USB device speeds */
> +#define USB_SPEED_FULL 0x0 /* 12Mbps */
> +#define USB_SPEED_LOW 0x1 /* 1.5Mbps */
> +#define USB_SPEED_HIGH 0x2 /* 480Mbps */
> +#define USB_SPEED_RESERVED 0x3
> +
> /* Descriptor types */
> #define USB_DT_DEVICE 0x01
^^^^^^^^
whitespace please fix
> #define USB_DT_CONFIG 0x02
^^^^^^^^
whitespace please fix
> @@ -202,6 +208,7 @@
> #define USB_PORT_FEAT_RESET 4
^^^^^^^^^^
whitespace please fix
> #define USB_PORT_FEAT_POWER 8
^^^^^^^^^^
whitespace please fix
> #define USB_PORT_FEAT_LOWSPEED 9
^^^^^^^
whitespace please fix
> +#define USB_PORT_FEAT_HIGHSPEED 10
^^^^^^
whitespace please fix
> #define USB_PORT_FEAT_C_CONNECTION 16
^^^
whitespace please fix
> #define USB_PORT_FEAT_C_ENABLE 17
^^^^^^^
whitespace please fix
> #define USB_PORT_FEAT_C_SUSPEND 18
^^^^^^
whitespace please fix
> @@ -216,6 +223,9 @@
whitespace please fix
> #define USB_PORT_STAT_RESET 0x0010
^^^^^^^^^
whitespace please fix
> #define USB_PORT_STAT_POWER 0x0100
^^^^^^^^^
whitespace please fix
> #define USB_PORT_STAT_LOW_SPEED 0x0200
^^^^^
whitespace please fix
> +#define USB_PORT_STAT_HIGH_SPEED 0x0400 /* support for EHCI */
^^^^
whitespace please fix
> +#define USB_PORT_STAT_SPEED \
> + (USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED)
>
> /* wPortChange bits */
> #define USB_PORT_STAT_C_CONNECTION 0x0001
^^^^^^^^
whitespace please fix
for the non modified line with a whiteplease it will be nice to send an other patch
Best Regards,
J.
More information about the U-Boot
mailing list