dstack.h 2.81 KB
#ifndef	__DSTACK_H__
#define	__DSTACK_H__


typedef	enum {
	enDPIPE_CTRL,
	enDPIPE_BULK,
	enDPIPE_INT,
	enDPIPE_ISO
}	enum_PIPE_TYPE;

struct _DUSB_DEVICE;
typedef struct {
	U8	type;
	U8	endpt;		//DC endpoint number, not endpAddr
	U8	dirIn;      //per USB Host

	int	maxpkt;
	U8	toggle;
	U8	multi;
	int	interval;

	struct _DUSB_DEVICE *usbdev;
	U8	active;
}	DPIPE;



typedef enum {
	enDEV_STATE_UNKOWN,
	enDEV_STATE_ATTACHED,
	enDEV_STATE_POWERED,
	enDEV_STATE_DEFAULT,
	enDEV_STATE_ADDRESS,
	enDEV_STATE_CONFIGED,
	enDEV_STATE_SUSPEND
}	enum_USB_DEV_STATE;

typedef enum {
	enSPEED_UNKNOWN,
	enSPEED_LOW,
	enSPEED_FULL,
	enSPEED_HIGH
}	enum_USB_DEV_SPEED;

//#define	MAX_DEV_PIPES		3
//for HID
#define	MAX_DEV_PIPES		4
//0 is dummy, ep1 Host OUT 	(in INTERFACE 01)
#define	ENDP_NUM_ISO_OUT	1		
//JJ+, ep2 Host IN			(in INTERFACE 02)
#define	ENDP_NUM_ISO_IN	    1		

//JJ+, ep2 ISO IN for FB	(in INTERFACE 01)//#ifdef USBDEV_ISOIN_ASYNC
#define	ENDP_NUM_ISO_INFB	3

//JJ+, ep2 INT IN for HID	(in INTERFACE 03)
#define	ENDP_NUM_INT_IN	    2	
//JJ+, ep2 INT OUT for HID	(in INTERFACE 03)
#define	ENDP_NUM_INT_OUT    2

#define	CTL_ENDP_MAX_PKT	64
/*#ifdef AudioData24BIT
//max 1152 for (192KHz x 2 x 3)
#define	DISO_MAX_PKT_SIZE	1200
#else
#define	DISO_MAX_PKT_SIZE	256
#endif
*/
#if 0	//for low BW cfg: such as Windows7 ...
#define	DISO_MAX_PKT_SIZE	576
#else
//jj #define	DISO_MAX_PKT_SIZE	(96000*2*3/1000)
//#define	DISO_MAX_PKT_SIZE	(48000*2*3/1000)
#define	DISO_MAX_PKT_SIZE	(48000*2*2/1000)
#endif

typedef struct _DUSB_DEVICE {
	U8	addr;
//	U8	speed;
	int	state;

	DPIPE *ctlPipe;
	DPIPE *ipipe[MAX_DEV_PIPES];	//ipipe[2]: Mic In	ipipe[3]: HID In
	DPIPE *opipe[MAX_DEV_PIPES];	//opipe[1]:	Spk Out opipe[3]: HID Out
}	DUSB_DEVICE;


struct _DTD;
typedef	int (*PDTD_CALLBACK) ( struct _DTD *dtd ); 

typedef enum {
	enDCTL_SETUP,
	enDCTL_DATA,
	enDCTL_STATUS,
	enDCTL_COMPLETE
}	enum_DEV_CTL_STAGE;

typedef struct _DTD {
	U8	*buffer;	//original
	int	len;
	U8	*transbuf;	//increase, working data buffer
	int	translen;	//transfered data len
	U8	zeropkt;

	U8	dirIn;		//ctl only
	int ctlStage;
	DPIPE *pipe;

	U8	shortpkt;
	U8	first;		//for DCD OUT pipe, used to arm endpoint
	
	U8	active;
	U8	waitEvent;

	PDTD_CALLBACK	callback;
	U8	complete;
	int	result;

	DUSB_DEVICE	*usbdev;
	struct _DTD *next;
}	DTD;


typedef enum {
	enDTD_SUCESS,
	enDTD_STALL,
	enDTD_FAIL,
	enDTD_TIMEOUT,
	enDTD_HOST_DISCONNECT,

	enDTD_SUCCESS_UNDERRUN,
	enDTD_TERMINATED
}	enum_DTD_RESULT;

int dstk_dtdPut( DTD *dtd );

DUSB_DEVICE *dstk_getDev( void );

DPIPE *dstk_getCtlPipe( void );
//usb speaker
DPIPE *dstk_getIsoOutPipe( void );
DPIPE *dstk_getIsoInPipe( void );

// endpnum + dir = endpAddr
DPIPE *dstk_getPipes( U8 endpAddr );

int dstk_busReset( void );

int dstk_transfer( DPIPE *pipe, int dirIn, U8 *buf, int *len, PDTD_CALLBACK callback, int waitEvent );


#endif //__DSTACK_H__