mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-25 21:24:21 +08:00
f298e4b6dd
This change adds the usb device support for musb. Omap3 platform support added at the same level as davinci. The interface for usbtty to use the musb device support was added. Verified on omap3 beagle, zoom1 and zoom2. Signed-off-by: Tom Rix <Tom.Rix@windriver.com>
206 lines
5.8 KiB
C
206 lines
5.8 KiB
C
/*
|
|
* Copyright (c) 2009 Wind River Systems, Inc.
|
|
* Tom Rix <Tom.Rix@windriver.com>
|
|
*
|
|
* 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; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* 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
|
|
*/
|
|
|
|
/* Define MUSB_DEBUG before including this file to get debug macros */
|
|
#ifdef MUSB_DEBUG
|
|
|
|
#define MUSB_FLAGS_PRINT(v, x, y) \
|
|
if (((v) & MUSB_##x##_##y)) \
|
|
serial_printf("\t\t"#y"\n")
|
|
|
|
static inline void musb_print_pwr(u8 b)
|
|
{
|
|
serial_printf("\tpower 0x%2.2x\n", b);
|
|
MUSB_FLAGS_PRINT(b, POWER, ISOUPDATE);
|
|
MUSB_FLAGS_PRINT(b, POWER, SOFTCONN);
|
|
MUSB_FLAGS_PRINT(b, POWER, HSENAB);
|
|
MUSB_FLAGS_PRINT(b, POWER, HSMODE);
|
|
MUSB_FLAGS_PRINT(b, POWER, RESET);
|
|
MUSB_FLAGS_PRINT(b, POWER, RESUME);
|
|
MUSB_FLAGS_PRINT(b, POWER, SUSPENDM);
|
|
MUSB_FLAGS_PRINT(b, POWER, ENSUSPEND);
|
|
}
|
|
|
|
static inline void musb_print_csr0(u16 w)
|
|
{
|
|
serial_printf("\tcsr0 0x%4.4x\n", w);
|
|
MUSB_FLAGS_PRINT(w, CSR0, FLUSHFIFO);
|
|
MUSB_FLAGS_PRINT(w, CSR0_P, SVDSETUPEND);
|
|
MUSB_FLAGS_PRINT(w, CSR0_P, SVDRXPKTRDY);
|
|
MUSB_FLAGS_PRINT(w, CSR0_P, SENDSTALL);
|
|
MUSB_FLAGS_PRINT(w, CSR0_P, SETUPEND);
|
|
MUSB_FLAGS_PRINT(w, CSR0_P, DATAEND);
|
|
MUSB_FLAGS_PRINT(w, CSR0_P, SENTSTALL);
|
|
MUSB_FLAGS_PRINT(w, CSR0, TXPKTRDY);
|
|
MUSB_FLAGS_PRINT(w, CSR0, RXPKTRDY);
|
|
}
|
|
|
|
static inline void musb_print_intrusb(u8 b)
|
|
{
|
|
serial_printf("\tintrusb 0x%2.2x\n", b);
|
|
MUSB_FLAGS_PRINT(b, INTR, VBUSERROR);
|
|
MUSB_FLAGS_PRINT(b, INTR, SESSREQ);
|
|
MUSB_FLAGS_PRINT(b, INTR, DISCONNECT);
|
|
MUSB_FLAGS_PRINT(b, INTR, CONNECT);
|
|
MUSB_FLAGS_PRINT(b, INTR, SOF);
|
|
MUSB_FLAGS_PRINT(b, INTR, RESUME);
|
|
MUSB_FLAGS_PRINT(b, INTR, SUSPEND);
|
|
|
|
if (b & MUSB_INTR_BABBLE)
|
|
serial_printf("\t\tMUSB_INTR_RESET or MUSB_INTR_BABBLE\n");
|
|
|
|
}
|
|
|
|
static inline void musb_print_intrtx(u16 w)
|
|
{
|
|
serial_printf("\tintrtx 0x%4.4x\n", w);
|
|
}
|
|
|
|
static inline void musb_print_intrrx(u16 w)
|
|
{
|
|
serial_printf("\tintrx 0x%4.4x\n", w);
|
|
}
|
|
|
|
static inline void musb_print_devctl(u8 b)
|
|
{
|
|
serial_printf("\tdevctl 0x%2.2x\n", b);
|
|
if (b & MUSB_DEVCTL_BDEVICE)
|
|
serial_printf("\t\tB device\n");
|
|
else
|
|
serial_printf("\t\tA device\n");
|
|
if (b & MUSB_DEVCTL_FSDEV)
|
|
serial_printf("\t\tFast Device -(host mode)\n");
|
|
if (b & MUSB_DEVCTL_LSDEV)
|
|
serial_printf("\t\tSlow Device -(host mode)\n");
|
|
if (b & MUSB_DEVCTL_HM)
|
|
serial_printf("\t\tHost mode\n");
|
|
else
|
|
serial_printf("\t\tPeripherial mode\n");
|
|
if (b & MUSB_DEVCTL_HR)
|
|
serial_printf("\t\tHost request started(B device)\n");
|
|
else
|
|
serial_printf("\t\tHost request finished(B device)\n");
|
|
if (b & MUSB_DEVCTL_BDEVICE) {
|
|
if (b & MUSB_DEVCTL_SESSION)
|
|
serial_printf("\t\tStart of session(B device)\n");
|
|
else
|
|
serial_printf("\t\tEnd of session(B device)\n");
|
|
} else {
|
|
if (b & MUSB_DEVCTL_SESSION)
|
|
serial_printf("\t\tStart of session(A device)\n");
|
|
else
|
|
serial_printf("\t\tEnd of session(A device)\n");
|
|
}
|
|
}
|
|
|
|
static inline void musb_print_config(u8 b)
|
|
{
|
|
serial_printf("\tconfig 0x%2.2x\n", b);
|
|
if (b & MUSB_CONFIGDATA_MPRXE)
|
|
serial_printf("\t\tAuto combine rx bulk packets\n");
|
|
if (b & MUSB_CONFIGDATA_MPTXE)
|
|
serial_printf("\t\tAuto split tx bulk packets\n");
|
|
if (b & MUSB_CONFIGDATA_BIGENDIAN)
|
|
serial_printf("\t\tBig Endian ordering\n");
|
|
else
|
|
serial_printf("\t\tLittle Endian ordering\n");
|
|
if (b & MUSB_CONFIGDATA_HBRXE)
|
|
serial_printf("\t\tHigh speed rx iso endpoint\n");
|
|
if (b & MUSB_CONFIGDATA_HBTXE)
|
|
serial_printf("\t\tHigh speed tx iso endpoint\n");
|
|
if (b & MUSB_CONFIGDATA_DYNFIFO)
|
|
serial_printf("\t\tDynamic fifo sizing\n");
|
|
if (b & MUSB_CONFIGDATA_SOFTCONE)
|
|
serial_printf("\t\tSoft Connect\n");
|
|
if (b & MUSB_CONFIGDATA_UTMIDW)
|
|
serial_printf("\t\t16 bit data width\n");
|
|
else
|
|
serial_printf("\t\t8 bit data width\n");
|
|
}
|
|
|
|
static inline void musb_print_rxmaxp(u16 w)
|
|
{
|
|
serial_printf("\trxmaxp 0x%4.4x\n", w);
|
|
}
|
|
|
|
static inline void musb_print_rxcsr(u16 w)
|
|
{
|
|
serial_printf("\trxcsr 0x%4.4x\n", w);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, AUTOCLEAR);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, DMAENAB);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, DISNYET);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, PID_ERR);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, DMAMODE);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, CLRDATATOG);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, FLUSHFIFO);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, DATAERROR);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, FIFOFULL);
|
|
MUSB_FLAGS_PRINT(w, RXCSR, RXPKTRDY);
|
|
MUSB_FLAGS_PRINT(w, RXCSR_P, SENTSTALL);
|
|
MUSB_FLAGS_PRINT(w, RXCSR_P, SENDSTALL);
|
|
MUSB_FLAGS_PRINT(w, RXCSR_P, OVERRUN);
|
|
|
|
if (w & MUSB_RXCSR_P_ISO)
|
|
serial_printf("\t\tiso mode\n");
|
|
else
|
|
serial_printf("\t\tbulk mode\n");
|
|
|
|
}
|
|
|
|
static inline void musb_print_txmaxp(u16 w)
|
|
{
|
|
serial_printf("\ttxmaxp 0x%4.4x\n", w);
|
|
}
|
|
|
|
static inline void musb_print_txcsr(u16 w)
|
|
{
|
|
serial_printf("\ttxcsr 0x%4.4x\n", w);
|
|
MUSB_FLAGS_PRINT(w, TXCSR, TXPKTRDY);
|
|
MUSB_FLAGS_PRINT(w, TXCSR, FIFONOTEMPTY);
|
|
MUSB_FLAGS_PRINT(w, TXCSR, FLUSHFIFO);
|
|
MUSB_FLAGS_PRINT(w, TXCSR, CLRDATATOG);
|
|
MUSB_FLAGS_PRINT(w, TXCSR_P, UNDERRUN);
|
|
MUSB_FLAGS_PRINT(w, TXCSR_P, SENTSTALL);
|
|
MUSB_FLAGS_PRINT(w, TXCSR_P, SENDSTALL);
|
|
|
|
if (w & MUSB_TXCSR_MODE)
|
|
serial_printf("\t\tTX mode\n");
|
|
else
|
|
serial_printf("\t\tRX mode\n");
|
|
}
|
|
|
|
#else
|
|
|
|
/* stubs */
|
|
|
|
#define musb_print_pwr(b)
|
|
#define musb_print_csr0(w)
|
|
#define musb_print_intrusb(b)
|
|
#define musb_print_intrtx(w)
|
|
#define musb_print_intrrx(w)
|
|
#define musb_print_devctl(b)
|
|
#define musb_print_config(b)
|
|
#define musb_print_rxmaxp(w)
|
|
#define musb_print_rxcsr(w)
|
|
#define musb_print_txmaxp(w)
|
|
#define musb_print_txcsr(w)
|
|
|
|
#endif /* MUSB_DEBUG */
|