www.pudn.com > Linux2410_device.rar > pxa.h


/*
 * linux/drivers/usb/device/bi/pxa.h
 *
 * Copyright (c) 2000, 2001, 2002 Lineo
 *
 * By: 
 *      Stuart Lynne , 
 *      Tom Rushworth , 
 *
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */


#define EP0_PACKETSIZE  0x10

#define UDC_MAX_ENDPOINTS       6

#define UDC_NAME        "PXA"

#ifdef CONFIG_SABINAL_DISCOVERY
/* SHARP A3 specific GPIO assignments */
#define USBD_CONNECT_GPIO	50
#if defined(CONFIG_SABINAL_DISCOVERY_DVT) || defined(CONFIG_SABINAL_DISCOVERY_DVT2)
#define USBD_CONNECT_HIGH	 1   /* Pin high for connect (undef for pin low) */
#else
#undef USBD_CONNECT_HIGH
#endif

#define CKEN11_USB	USB_CE		 /* USB Unit Clock Enable */
#endif

/*
 * DMA Notes
 *
 * DCSRX	DMA Channel Control/Status register	
 * DRCMRX	DMA Request to Channel Map register
 * DDADRX	DMA Descriptor Address register
 *
 * DSADRX	DMA Source Address register (RO)	
 * DTADRX	DMA Target Address register (RO)
 * DCMCDX	DMA Command register (RO)
 *
 *
 */

typedef enum {
	DMA_READY,
	DMA_ACTIVE, 
	DMA_DONE
} dma_status_t;

typedef struct {
	int offset;
	dma_status_t dma_status;

	unsigned char *dma_buf;
	dma_addr_t dma_buf_phys;

#ifndef CONFIG_SABINAL_DISCOVERY
	pxa_dma_desc *dma_desc;
	dma_addr_t dma_desc_phys;
#endif

} usb_buf_t;

typedef struct {
	char *name;
	u_long dcmd;
	volatile u32 *drcmr;
	u_long dev_addr;

	u_int dma_ch;
	usb_buf_t *buffers;

	unsigned char *dma_buf;
	dma_addr_t dma_buf_phys;

#ifndef CONFIG_SABINAL_DISCOVERY
	pxa_dma_desc *dma_desc;
	dma_addr_t dma_desc_phys;
#endif
	int num;
	int size;

        int ep;
        struct usb_endpoint_instance *endpoint;
} usb_stream_t;


/*
 * Reserved Register Definitions
 */
#define UDCRSVD0        __REG(0x40600004)  /* UDC Reserved Register 0 */
#define UDCRSVD1        __REG(0x40600008)  /* UDC Reserved Register 1 */
#define UDCRSVD2        __REG(0x4060000c)  /* UDC Reserved Register 2 */

#define UFNHR           __REG(0x40600060)  /* UDC Frame Number High Register */
#define UFNLR           __REG(0x40600064)  /* UDC Frame Number Low Register */



/*
 *      7654 3210
 * de   1101 1110
 *
 *      fedc ba98
 * 7b   0111 1011
 *
 *
 */

#define UDCRSVD0_DBL0   (1 << 0)                /* enable endpoint 0 double buffer (always zero)) */
#define UDCRSVD0_DBL1   (1 << 1)                /* enable endpoint 1 double buffer (read/write) */
#define UDCRSVD0_DBL2   (1 << 2)                /* enable endpoint 2 double buffer (read/write) */
#define UDCRSVD0_DBL3   (1 << 3)                /* enable endpoint 3 double buffer (read/write) */
#define UDCRSVD0_DBL4   (1 << 4)                /* enable endpoint 4 double buffer (read/write) */
#define UDCRSVD0_DBL5   (1 << 5)                /* enable endpoint 5 double buffer (always zero)) */
#define UDCRSVD0_DBL6   (1 << 6)                /* enable endpoint 6 double buffer (read/write) */
#define UDCRSVD0_DBL7   (1 << 7)                /* enable endpoint 7 double buffer (read/write) */

#define UDCRSVD0_DBL8   (1 << 0)                /* enable endpoint 8 double buffer (read/write) */
#define UDCRSVD0_DBL9   (1 << 1)                /* enable endpoint 9 double buffer (read/write) */
#define UDCRSVD0_DBL10  (1 << 2)                /* enable endpoint 10 double buffer (always zero)) */
#define UDCRSVD0_DBL11  (1 << 3)                /* enable endpoint 11 double buffer (read/write) */
#define UDCRSVD0_DBL12  (1 << 4)                /* enable endpoint 12 double buffer (read/write) */
#define UDCRSVD0_DBL13  (1 << 5)                /* enable endpoint 13 double buffer (read/write) */
#define UDCRSVD0_DBL14  (1 << 6)                /* enable endpoint 14 double buffer (read/write) */
#define UDCRSVD0_DBL15  (1 << 7)                /* enable endpoint 15 double buffer (always zero)) */

/* ep0 states */
#define WAIT_FOR_SETUP          0
#define DATA_STATE_XMIT         1
#define DATA_STATE_NEED_ZLP     2
#define WAIT_FOR_OUT_STATUS     3
/* Added by Stanley */
#define DATA_STATE_RECV         4


// XXX Send to nico@cam.org to include in pxa-regs.h
//

/* c.f. Table 12-20 UDC Control Register (UDCCR) */

#define	UDCCR_REM	(1 << 7)		/* Reset interrupt mask (read/write) */
#define	UDCCR_RSTIR	(1 << 6)		/* Reset interrupt request (read/write 1 to clear */
#define	UDCCR_SRM	(1 << 5)		/* Suspend/resume interrupt mask (read/write) */
#define	UDCCR_SUSIR	(1 << 4)		/* Suspend interrupt request (read/write 1 to clear) */
#define	UDCCR_RESIR	(1 << 3)		/* Resume interrupt request (read/write 1 to clear) */
#define	UDCCR_RSM	(1 << 2)		/* Device Resume (read/write 1 to set) */
#define	UDCCR_UDA	(1 << 1)		/* UDC active (read-only) */
#define	UDCCR_UDE	(1 << 0)		/* UDC enable (read/write) */


/* c.f. Table 12-21 UDC Endpoint 0 Control Status Register (UDCCS0) */

#define	UDCCS0_OPR	(1 << 0)		/* OUT packet ready (read/write 1 to clear) */
#define	UDCCS0_IPR	(1 << 1)		/* IN packet ready (always read 0/write 1 to set) */
#define	UDCCS0_FTF	(1 << 2)		/* Flush Tx FIFO (always read 0/write 1 to set) */
#define	UDCCS0_DRWF	(1 << 3)		/* Device remote wake feature (read only) */
#define	UDCCS0_SST	(1 << 4)		/* Sent stall (read/write 1 to clear) */
#define	UDCCS0_FST	(1 << 5)		/* Force stall (read/write 1 to set) */
#define	UDCCS0_RNE	(1 << 6)		/* Receive FIFO not empty (read only) */
#define	UDCCS0_SA	(1 << 7)		/* Setup Active (read/write 1 to clear) */


/* c.f. Table 12-22 UDC Endpoint X where x is 1, 6, 11 - BULK IN (UDCCSX) */

#define	UDCCS_BI_TFS	(1 << 0)		/* Transmit FIFO service (read only) */
#define	UDCCS_BI_TPC	(1 << 1)		/* Transmit packet complete (read/write 1 to clear) */
#define	UDCCS_BI_FTF	(1 << 2)		/* Flush Tx FIFO (always read 0/write 1 to set) */
#define	UDCCS_BI_TUR	(1 << 3)		/* Transmit FIFO underrun (read/write 1 to clear) */
#define	UDCCS_BI_SST	(1 << 4)		/* Sent STALL (read/write 1 to clear) */
#define	UDCCS_BI_FST	(1 << 5)		/* Force STALL (read/write) */

#define	UDCCS_BI_TSP	(1 << 7)		/* Transmit short packet (always read 0/write 1 to set) */


/* c.f. Table 12-23 UDC Endpoint X where x is 2, 7, 12 - BULK OUT (UDCCSX) */

#define	UDCCS_BO_RFS	(1 << 0)		/* Receive FIFO service (read only) */
#define	UDCCS_BO_RPC	(1 << 1)		/* Receive packet complete (read/write 1 to clear) */

#define	UDCCS_BO_DME	(1 << 3)		/* DMA Enable (read/write) */
#define	UDCCS_BO_SST	(1 << 4)		/* Sent STALL (read/write 1 to clear) */
#define	UDCCS_BO_FST	(1 << 5)		/* Force STALL (read/write) */
#define	UDCCS_BO_RNE	(1 << 6)		/* Receive FIFO not empty (read only) */
#define	UDCCS_BO_RSP	(1 << 7)		/* Receive short packet (read only) */

/* c.f. Table 12-24 UDC Endpoint X where x is 3, 8, 13 - ISO IN (UDCCSX) */

#define	UDCCS_II_TFS	(1 << 0)		/* Transmit FIFO service (read only) */
#define	UDCCS_II_TPC	(1 << 1)		/* Transmit packet complete (read/write 1 to clear) */
#define	UDCCS_II_FTF	(1 << 2)		/* Flush Tx FIFO (always read 0/write 1 to set) */
#define	UDCCS_II_TUR	(1 << 3)		/* Transmit FIFO underrun (read/write 1 to clear) */

#define	UDCCS_II_TSP	(1 << 7)		/* Transmit short packet (always read 0/write 1 to set) */

/* c.f. Table 12-25 UDC Endpoint X where x is 4, 9, 14 - ISO OUT (UDCCSX) */

#define	UDCCS_IO_RFS	(1 << 0)		/* Receive FIFO service (read only) */
#define	UDCCS_IO_RPC	(1 << 1)		/* Receive packet complete (read/write 1 to clear) */
#define	UDCCS_IO_ROF	(1 << 2)		/* Receive overflow (read/write 1 to clear) */
#define	UDCCS_IO_DME	(1 << 3)		/* DMA Enable (read/write) */

#define	UDCCS_IO_RSP	(1 << 7)		/* Receive short packet (read only) */


/* c.f. Table 12-26 UDC Endpoint X where x is 5, 10, 15 - INTERRUPT (UDCCSX) */

#define	UDCCS_INT_TFS	(1 << 0)		/* Transmit FIFO service (read only) */
#define	UDCCS_INT_TPC	(1 << 1)		/* Transmit packet complete (read/write 1 to clear) */
#define	UDCCS_INT_FTF	(1 << 2)		/* Flush Tx FIFO (always read 0/write 1 to set) */
#define	UDCCS_INT_TUR	(1 << 3)		/* Transmit FIFO underrun (read/write 1 to clear) */
#define	UDCCS_INT_SST	(1 << 4)		/* Sent STALL (read/write 1 to clear) */
#define	UDCCS_INT_FST	(1 << 5)		/* Force STALL (read/write) */

#define	UDCCS_INT_TSP	(1 << 7)		/* Transmit short packet (always read 0/write 1 to set) */


/* c.f. Table 12-27 UDC Interrupt Control Register 0 (UICR0) */

#define	UICR0_IM0	(1 << 0)		/* Interrupt mask for endpoint 0 */
#define	UICR0_IM1	(1 << 1)		/* Interrupt mask for endpoint 1 */
#define	UICR0_IM2	(1 << 2)		/* Interrupt mask for endpoint 2 */
#define	UICR0_IM3	(1 << 3)		/* Interrupt mask for endpoint 3 */
#define	UICR0_IM4	(1 << 4)		/* Interrupt mask for endpoint 4 */
#define	UICR0_IM5	(1 << 5)		/* Interrupt mask for endpoint 5 */
#define	UICR0_IM6	(1 << 6)		/* Interrupt mask for endpoint 6 */
#define	UICR0_IM7	(1 << 7)		/* Interrupt mask for endpoint 7 */


/* c.f. Table 12-28 UDC Interrupt Control Register 0 (UICR1) */

#define	UICR1_IM8	(1 << 0)		/* Interrupt mask for endpoint 8 */
#define	UICR1_IM9	(1 << 1)		/* Interrupt mask for endpoint 9 */
#define	UICR1_IM10	(1 << 2)		/* Interrupt mask for endpoint 10 */
#define	UICR1_IM11	(1 << 3)		/* Interrupt mask for endpoint 11 */
#define	UICR1_IM12	(1 << 4)		/* Interrupt mask for endpoint 12 */
#define	UICR1_IM13	(1 << 5)		/* Interrupt mask for endpoint 13 */
#define	UICR1_IM14	(1 << 6)		/* Interrupt mask for endpoint 14 */
#define	UICR1_IM15	(1 << 7)		/* Interrupt mask for endpoint 15 */


/* c.f. Table 12-29 UDC Status / Interrupt Register 0 (USIR0) */

#define	USIR0_IR0	(1 << 0)		/* Interrupt Request endpoint 0 (read/write 1 to clear) */
#define	USIR0_IR1	(1 << 1)		/* Interrupt Request endpoint 1 (read/write 1 to clear) */
#define	USIR0_IR2	(1 << 2)		/* Interrupt Request endpoint 2 (read/write 1 to clear) */
#define	USIR0_IR3	(1 << 3)		/* Interrupt Request endpoint 3 (read/write 1 to clear) */
#define	USIR0_IR4	(1 << 4)		/* Interrupt Request endpoint 4 (read/write 1 to clear) */
#define	USIR0_IR5	(1 << 5)		/* Interrupt Request endpoint 5 (read/write 1 to clear) */
#define	USIR0_IR6	(1 << 6)		/* Interrupt Request endpoint 6 (read/write 1 to clear) */
#define	USIR0_IR7	(1 << 7)		/* Interrupt Request endpoint 7 (read/write 1 to clear) */


/* c.f. Table 12-30 UDC Status / Interrupt Register 1 (USIR1) */

#define	USIR1_IR8	(1 << 0)		/* Interrupt Request endpoint 8  (read/write 1 to clear) */
#define	USIR1_IR9	(1 << 1)		/* Interrupt Request endpoint 9  (read/write 1 to clear) */
#define	USIR1_IR10	(1 << 2)		/* Interrupt Request endpoint 10 (read/write 1 to clear) */
#define	USIR1_IR11	(1 << 3)		/* Interrupt Request endpoint 11 (read/write 1 to clear) */
#define	USIR1_IR12	(1 << 4)		/* Interrupt Request endpoint 12 (read/write 1 to clear) */
#define	USIR1_IR13	(1 << 5)		/* Interrupt Request endpoint 13 (read/write 1 to clear) */
#define	USIR1_IR14	(1 << 6)		/* Interrupt Request endpoint 14 (read/write 1 to clear) */
#define	USIR1_IR15	(1 << 7)		/* Interrupt Request endpoint 15 (read/write 1 to clear) */



/* c.f. Table 12-31 UDC Frame Number High Register (UFNRH)*/

#define	UFNHR_FNMSB	(7 << 0)		/* Most significant 3-bits of 11-bit frame number */

#define	UFNHR_IPE4	(1 << 3)		/* Iso Packet Error Endpont 4 (read/write 1 to clear) */
#define	UFNHR_IPE9	(1 << 4)		/* Iso Packet Error Endpont 9 (read/write 1 to clear) */
#define	UFNHR_IPE14	(1 << 5)		/* Iso Packet Error Endpont 14 (read/write 1 to clear) */
#define	UFNHR_SIM	(1 << 6)		/* SOF interrupt mask (read/write) */
#define	UFNHR_SIR	(1 << 7)		/* SOF Interrupt Request (read/write 1 to clear) */