dstack.h
2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#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__