-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathusbdevice.h
297 lines (212 loc) · 5.75 KB
/
usbdevice.h
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
usbdevice.h
Environment:
Kernel-mode Driver Framework
--*/
#pragma once
#pragma pack(1)
typedef struct _DESCRIPTORH {
int type;
int len;
} VDEV_DESCRIPTOR_HDR;
typedef struct _DESCRIPTOR {
int type;
int len;
UCHAR* data;
} VDEV_DESCRIPTOR;
typedef struct _PTZ_DATA
{
UINT16 focus_abs_data[1];
UINT8 focus_rel_data[2];
UINT8 focus_auto_data[1];
UINT16 zoom_abs_data[1];
UINT8 zoom_rel_data[3];
INT32 pantilt_abs_data[2];
UINT8 pantilt_rel_data[4];
} PtzData;
typedef struct _FrameData
{
int bitsPerPixel;
int width;
int height;
int frame_length;
int frame_pos;
int frame_rate;
int iso_timer_interval;
int needChangeFormat;
UCHAR frame_flip;
UCHAR bFrameIndex;
UCHAR bFormatIndex;
UCHAR* frame_buf;
}FrameData;
#if 0
typedef struct _AudioData
{
int sample_rate;
int bitResolution;
int frame_length;
int frame_pos;
UCHAR* frame_buf;
}AudioData;
typedef struct audio_prop {
int sample_rate;
int bitResolution;
} AudioProp;
#endif
#pragma pack(1)
typedef struct _PTZ_Control {
int controlType;
int v1;
int v2;
int v3;
int v4;
} PTZ_CTRL_Data;
typedef struct video_prop {
int width;
int height;
int bitsPerPixel;
int frameRate;//30/60/120
UCHAR bFrameIndex;
UCHAR bFormatIndex;
} VideoProp;
#pragma pack()
typedef struct _ptz_list {
PTZ_CTRL_Data ctrl;
LIST_ENTRY ListEntry;
} PTZ_CTRL_LIST_ITEM;
typedef struct _USB_CONTEXT {
//virtual camera device
PUDECXUSBDEVICE_INIT UdecxCamInit;
UDECXUSBDEVICE VCamDevice;
VDEV_DESCRIPTOR VCamDeviceDescriptor;
VDEV_DESCRIPTOR VCamConfigDescriptorSet;
UDECXUSBENDPOINT ControlEndpoint;
WDFQUEUE ControlQueue;
WDFQUEUE VideoQueue;
//WDFQUEUE PTZCtrlQueue;
FrameData frameData;
PtzData ptzData;
//PTZ_CTRL_LIST ptzCmdList;
LIST_ENTRY ptzListHdr;
UDECXUSBENDPOINT IsoTransferVideoEndpoint;
WDFQUEUE IsoVideoInQueue;
UDECXUSBENDPOINT InterruptEndpoint;
WDFQUEUE InterruptInQueue;
WDFREQUEST currentRequest;
WDFREQUEST currentVideoRequest;
WDFDPC completeUrbDpc;
#if 0
//virtual mic device
PUDECXUSBDEVICE_INIT UdecxMicInit;
UDECXUSBDEVICE VMicDevice;
VDEV_DESCRIPTOR VMicDeviceDescriptor;
VDEV_DESCRIPTOR VMicConfigDescriptorSet;
WDFDPC completeAudioUrbDpc;
//UDECXUSBENDPOINT ControlEndpoint;
//UDECXUSBENDPOINT IsoTransferAudioEndpoint;
WDFQUEUE AudioQueue;
WDFQUEUE IsoAudioInQueue;
AudioData audioData;
WDFREQUEST currentAudioRequest;
#endif
WDFQUEUE DefaultQueue;
WDFTIMER isoTransferTimer;
} USB_CONTEXT, * PUSB_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(USB_CONTEXT, WdfDeviceGetUsbContext);
typedef struct _UDECX_USBDEVICE_CONTEXT {
WDFDEVICE WdfDevice;
} UDECX_USBDEVICE_CONTEXT, * PUDECX_USBDEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(UDECX_USBDEVICE_CONTEXT, UdecxDeviceGetContext);
NTSTATUS
Usb_Initialize(
_In_
WDFDEVICE WdfDevice
);
NTSTATUS
Usb_ReadDescriptorsAndPlugIn(
_In_
WDFDEVICE WdfDevice
);
NTSTATUS
Usb_Disconnect(
_In_
WDFDEVICE WdfDevice
);
VOID
Usb_Destroy(
_In_
WDFDEVICE WdfDevice
);
EVT_UDECX_USB_DEVICE_ENDPOINTS_CONFIGURE UsbDevice_EvtUsbDeviceEndpointsConfigure;
EVT_UDECX_USB_DEVICE_D0_ENTRY UsbDevice_EvtUsbDeviceLinkPowerEntry;
EVT_UDECX_USB_DEVICE_D0_EXIT UsbDevice_EvtUsbDeviceLinkPowerExit;
EVT_UDECX_USB_DEVICE_SET_FUNCTION_SUSPEND_AND_WAKE UsbDevice_EvtUsbDeviceSetFunctionSuspendAndWake;
EVT_UDECX_USB_ENDPOINT_RESET UsbEndpointReset;
NTSTATUS
EvtUdecxUsbDeviceControlEndpointAdd(
_In_
UDECXUSBDEVICE UdecxUsbDevice,
_In_
PUDECXUSBENDPOINT_INIT UdecxUsbEndpointInit
);
FORCEINLINE
VOID
UsbValidateConstants(
)
{
NT_ASSERT(((PUSB_STRING_DESCRIPTOR)g_LanguageDescriptor)->bString[0] == AMERICAN_ENGLISH);
NT_ASSERT(((PUSB_STRING_DESCRIPTOR)g_LanguageDescriptor)->bLength == sizeof(g_LanguageDescriptor));
NT_ASSERT(((PUSB_STRING_DESCRIPTOR)g_LanguageDescriptor)->bDescriptorType == USB_STRING_DESCRIPTOR_TYPE);
}
#include "uvc_struct.h"
#define EP_ADDR 0x82 //ÓÃÓÚÊÓƵÁ÷´«ÊäµÄ¶Ë¿Ú
#define VID_HDR_LEN 2
void init_cam_prop(PUSB_CONTEXT usbContext);
#if 0
//////////////////////////////////////////////////////////////////
//audio implementation
NTSTATUS Usb_Audio_Initialize( _In_ WDFDEVICE WdfDevice);
NTSTATUS Usb_Audio_ReadDescriptorsAndPlugIn(_In_ WDFDEVICE WdfDevice);
NTSTATUS Usb_Audio_Disconnect(_In_ WDFDEVICE WdfDevice);
VOID Usb_Audio_Destroy( _In_ WDFDEVICE WdfDevice);
VOID Usb_Audio_UdecxUsbEndpointEvtReset(
_In_ UCXCONTROLLER,
_In_ UCXENDPOINT,
_In_ WDFREQUEST
);
VOID UsbAudioEndpointReset(
_In_
UDECXUSBENDPOINT UdecxUsbEndpoint,
_In_
WDFREQUEST Request
);
NTSTATUS UsbAudioDevice_EvtUsbDeviceLinkPowerEntry(
_In_
WDFDEVICE UdecxWdfDevice,
_In_
UDECXUSBDEVICE UdecxUsbDevice
);
NTSTATUS UsbAudioDevice_EvtUsbDeviceLinkPowerExit(
_In_
WDFDEVICE UdecxWdfDevice,
_In_
UDECXUSBDEVICE UdecxUsbDevice,
_In_
UDECX_USB_DEVICE_WAKE_SETTING WakeSetting
);
NTSTATUS UsbAudioDevice_EvtUsbDeviceSetFunctionSuspendAndWake(
_In_
WDFDEVICE UdecxWdfDevice,
_In_
UDECXUSBDEVICE UdecxUsbDevice,
_In_
ULONG Interface,
_In_
UDECX_USB_DEVICE_FUNCTION_POWER FunctionPower
);
void fill_mic_cfg_desc_video(PUSB_CONTEXT deviceContext);
void fill_mic_dev_desc_video(PUSB_CONTEXT deviceContext);
void init_mic_prop(PUSB_CONTEXT usbContext);
#endif