⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pxa2xx_udc.h

📁 优龙2410linux2.6.8内核源代码
💻 H
字号:
/* * linux/drivers/usb/gadget/pxa2xx_udc.h * Intel PXA2xx on-chip full speed USB device controller * * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix * Copyright (C) 2003 David Brownell * * * 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 */#ifndef __LINUX_USB_GADGET_PXA2XX_H#define __LINUX_USB_GADGET_PXA2XX_H#include <linux/types.h>/*-------------------------------------------------------------------------*//* pxa2xx has this (move to include/asm-arm/arch-pxa/pxa-regs.h) */#define UFNRH_SIR	(1 << 7)	/* SOF interrupt request */#define UFNRH_SIM	(1 << 6)	/* SOF interrupt mask */#define UFNRH_IPE14	(1 << 5)	/* ISO packet error, ep14 */#define UFNRH_IPE9	(1 << 4)	/* ISO packet error, ep9 */#define UFNRH_IPE4	(1 << 3)	/* ISO packet error, ep4 *//* pxa255 has this (move to include/asm-arm/arch-pxa/pxa-regs.h) */#define	UDCCFR		UDC_RES2	/* UDC Control Function Register */#define UDCCFR_AREN	(1 << 7)	/* ACK response enable (now) */#define UDCCFR_ACM	(1 << 2)	/* ACK control mode (wait for AREN) *//*-------------------------------------------------------------------------*/struct pxa2xx_udc;struct pxa2xx_ep {	struct usb_ep				ep;	struct pxa2xx_udc			*dev;	const struct usb_endpoint_descriptor	*desc;	struct list_head			queue;	unsigned long				pio_irqs;	unsigned long				dma_irqs;	short					dma; 	unsigned short				fifo_size;	u8					bEndpointAddress;	u8					bmAttributes;	unsigned				stopped : 1;	unsigned				dma_fixup : 1;							 	/* UDCCS = UDC Control/Status for this EP	 * UBCR = UDC Byte Count Remaining (contents of OUT fifo)	 * UDDR = UDC Endpoint Data Register (the fifo)	 * DRCM = DMA Request Channel Map	 */	volatile u32				*reg_udccs;	volatile u32				*reg_ubcr;	volatile u32				*reg_uddr;#ifdef USE_DMA	volatile u32				*reg_drcmr;#define	drcmr(n)  .reg_drcmr = & DRCMR ## n ,#else#define	drcmr(n)  #endif};struct pxa2xx_request {	struct usb_request			req;	struct list_head			queue;};enum ep0_state { 	EP0_IDLE,	EP0_IN_DATA_PHASE,	EP0_OUT_DATA_PHASE,	EP0_END_XFER,	EP0_STALL,};#define EP0_FIFO_SIZE	((unsigned)16)#define BULK_FIFO_SIZE	((unsigned)64)#define ISO_FIFO_SIZE	((unsigned)256)#define INT_FIFO_SIZE	((unsigned)8)struct udc_stats {	struct ep0stats {		unsigned long		ops;		unsigned long		bytes;	} read, write;	unsigned long			irqs;};#ifdef CONFIG_USB_PXA2XX_SMALL/* when memory's tight, SMALL config saves code+data.  */#undef	USE_DMA#define	PXA_UDC_NUM_ENDPOINTS	3#endif#ifndef	PXA_UDC_NUM_ENDPOINTS#define	PXA_UDC_NUM_ENDPOINTS	16#endifstruct pxa2xx_udc {	struct usb_gadget			gadget;	struct usb_gadget_driver		*driver;	enum ep0_state				ep0state;	struct udc_stats			stats;	unsigned				got_irq : 1,						got_disc : 1,						has_cfr : 1,						req_pending : 1,						req_std : 1,						req_config : 1;#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200))	struct timer_list			timer;	struct device				*dev;	struct pxa2xx_udc_mach_info		*mach;	u64					dma_mask;	struct pxa2xx_ep			ep [PXA_UDC_NUM_ENDPOINTS];};/*-------------------------------------------------------------------------*/#ifdef CONFIG_ARCH_LUBBOCK#include <asm/arch/lubbock.h>/* lubbock can also report usb connect/disconnect irqs */#ifdef DEBUG#define HEX_DISPLAY(n)	if (machine_is_lubbock()) { LUB_HEXLED = (n); }#define LED_CONNECTED_ON	if (machine_is_lubbock()) { \	DISCRETE_LED_ON(D26); }#define LED_CONNECTED_OFF	if(machine_is_lubbock()) { \	DISCRETE_LED_OFF(D26); LUB_HEXLED = 0; }#define LED_EP0_ON	if (machine_is_lubbock()) { DISCRETE_LED_ON(D25); }#define LED_EP0_OFF	if (machine_is_lubbock()) { DISCRETE_LED_OFF(D25); }#endif /* DEBUG */#endif/*-------------------------------------------------------------------------*//* LEDs are only for debug */#ifndef HEX_DISPLAY#define HEX_DISPLAY(n)		do {} while(0)#endif#ifndef LED_CONNECTED_ON#define LED_CONNECTED_ON	do {} while(0)#define LED_CONNECTED_OFF	do {} while(0)#endif#ifndef LED_EP0_ON#define LED_EP0_ON		do {} while (0)#define LED_EP0_OFF		do {} while (0)#endif/*-------------------------------------------------------------------------*/static struct pxa2xx_udc *the_controller;/* one GPIO should be used to detect host disconnect */static inline int is_usb_connected(void){	if (!the_controller->mach->udc_is_connected)		return 1;	return the_controller->mach->udc_is_connected();}/* one GPIO should force the host to see this device (or not) */static inline void make_usb_disappear(void){	if (!the_controller->mach->udc_command)		return;	the_controller->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT);}static inline void let_usb_appear(void){	if (!the_controller->mach->udc_command)		return;	the_controller->mach->udc_command(PXA2XX_UDC_CMD_CONNECT);}/*-------------------------------------------------------------------------*//* * Debugging support vanishes in non-debug builds.  DBG_NORMAL should be * mostly silent during normal use/testing, with no timing side-effects. */#define DBG_NORMAL	1	/* error paths, device state transitions */#define DBG_VERBOSE	2	/* add some success path trace info */#define DBG_NOISY	3	/* ... even more: request level */#define DBG_VERY_NOISY	4	/* ... even more: packet level */#ifdef DEBUGstatic const char *state_name[] = {	"EP0_IDLE",	"EP0_IN_DATA_PHASE", "EP0_OUT_DATA_PHASE",	"EP0_END_XFER", "EP0_STALL"};#define DMSG(stuff...) printk(KERN_DEBUG "udc: " stuff)#ifdef VERBOSE#    define UDC_DEBUG DBG_VERBOSE#else#    define UDC_DEBUG DBG_NORMAL#endifstatic void __attribute__ ((__unused__))dump_udccr(const char *label){	u32	udccr = UDCCR;	DMSG("%s %02X =%s%s%s%s%s%s%s%s\n",		label, udccr,		(udccr & UDCCR_REM) ? " rem" : "",		(udccr & UDCCR_RSTIR) ? " rstir" : "",		(udccr & UDCCR_SRM) ? " srm" : "",		(udccr & UDCCR_SUSIR) ? " susir" : "",		(udccr & UDCCR_RESIR) ? " resir" : "",		(udccr & UDCCR_RSM) ? " rsm" : "",		(udccr & UDCCR_UDA) ? " uda" : "",		(udccr & UDCCR_UDE) ? " ude" : "");}static void __attribute__ ((__unused__))dump_udccs0(const char *label){	u32		udccs0 = UDCCS0;	DMSG("%s %s %02X =%s%s%s%s%s%s%s%s\n",		label, state_name[the_controller->ep0state], udccs0,		(udccs0 & UDCCS0_SA) ? " sa" : "",		(udccs0 & UDCCS0_RNE) ? " rne" : "",		(udccs0 & UDCCS0_FST) ? " fst" : "",		(udccs0 & UDCCS0_SST) ? " sst" : "",		(udccs0 & UDCCS0_DRWF) ? " dwrf" : "",		(udccs0 & UDCCS0_FTF) ? " ftf" : "",		(udccs0 & UDCCS0_IPR) ? " ipr" : "",		(udccs0 & UDCCS0_OPR) ? " opr" : "");}static void __attribute__ ((__unused__))dump_state(struct pxa2xx_udc *dev){	u32		tmp;	unsigned	i;	DMSG("%s %s, uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X\n",		is_usb_connected() ? "host " : "disconnected",		state_name[dev->ep0state],		UICR1, UICR0, USIR1, USIR0, UFNRH, UFNRL);	dump_udccr("udccr");	if (dev->has_cfr) {		tmp = UDCCFR;		DMSG("udccfr %02X =%s%s\n", tmp,			(tmp & UDCCFR_AREN) ? " aren" : "",			(tmp & UDCCFR_ACM) ? " acm" : "");	}	if (!dev->driver) {		DMSG("no gadget driver bound\n");		return;	} else		DMSG("ep0 driver '%s'\n", dev->driver->driver.name);	if (!is_usb_connected())		return;	dump_udccs0 ("udccs0");	DMSG("ep0 IN %lu/%lu, OUT %lu/%lu\n",		dev->stats.write.bytes, dev->stats.write.ops,		dev->stats.read.bytes, dev->stats.read.ops);	for (i = 1; i < PXA_UDC_NUM_ENDPOINTS; i++) {		if (dev->ep [i].desc == 0)			continue;		DMSG ("udccs%d = %02x\n", i, *dev->ep->reg_udccs);	}}#else#define DMSG(stuff...)		do{}while(0)#define	dump_udccr(x)	do{}while(0)#define	dump_udccs0(x)	do{}while(0)#define	dump_state(x)	do{}while(0)#define UDC_DEBUG ((unsigned)0)#endif#define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0)#define WARN(stuff...) printk(KERN_WARNING "udc: " stuff)#define INFO(stuff...) printk(KERN_INFO "udc: " stuff)#endif /* __LINUX_USB_GADGET_PXA2XX_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -