1 /* This test is designed to test the simple dpump host/device class operation. */
2
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "ux_api.h"
6 #include "ux_system.h"
7 #include "ux_utility.h"
8 #include "ux_hcd_sim_host.h"
9
10 #include "fx_api.h"
11
12 #include "ux_device_class_audio.h"
13 #include "ux_device_class_audio20.h"
14 #include "ux_device_stack.h"
15
16 #include "ux_host_class_audio.h"
17 #include "ux_host_class_dummy.h"
18
19 #include "ux_test_dcd_sim_slave.h"
20 #include "ux_test_hcd_sim_host.h"
21 #include "ux_test_utility_sim.h"
22
23
24 /* Define constants. */
25
26 #define UX_DEMO_REQUEST_MAX_LENGTH \
27 ((UX_HCD_SIM_HOST_MAX_PAYLOAD) > (UX_SLAVE_REQUEST_DATA_MAX_LENGTH) ? \
28 (UX_HCD_SIM_HOST_MAX_PAYLOAD) : (UX_SLAVE_REQUEST_DATA_MAX_LENGTH))
29
30 #define UX_DEMO_DEBUG_SIZE (4096*8)
31 #define UX_DEMO_STACK_SIZE 1024
32 #define UX_DEMO_BUFFER_SIZE (UX_DEMO_REQUEST_MAX_LENGTH + 1)
33 #define UX_DEMO_MEMORY_SIZE (128*1024)
34
35 #define UX_TEST_LOG_SIZE (64)
36
37
38 /* Define local/extern function prototypes. */
39 static void test_thread_entry(ULONG);
40 static TX_THREAD tx_test_thread_host_simulation;
41 static TX_THREAD tx_test_thread_slave_simulation;
42 static void tx_test_thread_host_simulation_entry(ULONG);
43 static void tx_test_thread_slave_simulation_entry(ULONG);
44
45
46 /* Define global data structures. */
47 static UCHAR usbx_memory[UX_DEMO_MEMORY_SIZE + (UX_DEMO_STACK_SIZE * 2)];
48 static UCHAR buffer[64];
49
50 static UX_HOST_CLASS_DUMMY *dummy_control;
51 static UX_HOST_CLASS_DUMMY *dummy_tx;
52 static UX_HOST_CLASS_DUMMY *dummy_rx;
53
54 static UX_DEVICE_CLASS_AUDIO *slave_audio;
55 static UX_DEVICE_CLASS_AUDIO_PARAMETER slave_audio_parameter;
56 static UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER slave_audio_stream_parameter[2];
57
58 static UX_DEVICE_CLASS_AUDIO_STREAM *slave_audio_tx_stream;
59
60 static UX_DEVICE_CLASS_AUDIO_STREAM *slave_audio_rx_stream;
61 static UX_SLAVE_TRANSFER *slave_audio_rx_transfer;
62
63 static ULONG device_audio_tx_feedback;
64 static UCHAR* device_audio_tx_feedback_u8a = (UCHAR*)&device_audio_tx_feedback;
65 static ULONG device_audio_tx_feedback_count;
66 static ULONG device_audio_rx_feedback;
67 static UCHAR* device_audio_rx_feedback_u8a = (UCHAR*)&device_audio_rx_feedback;
68 static ULONG device_audio_rx_feedback_count;
69
70
71 static UX_HOST_CLASS_AUDIO *audio;
72
73 static UX_DEVICE_CLASS_AUDIO20_CONTROL g_slave_audio20_control[2];
74
75 static ULONG error_counter;
76
77 static ULONG set_cfg_counter;
78
79 static ULONG rsc_mem_free_on_set_cfg;
80 static ULONG rsc_sem_on_set_cfg;
81 static ULONG rsc_sem_get_on_set_cfg;
82 static ULONG rsc_mutex_on_set_cfg;
83
84 static ULONG rsc_enum_sem_usage;
85 static ULONG rsc_enum_sem_get_count;
86 static ULONG rsc_enum_mutex_usage;
87 static ULONG rsc_enum_mem_usage;
88
89 static ULONG rsc_audio_sem_usage;
90 static ULONG rsc_audio_sem_get_count;
91 static ULONG rsc_audio_mutex_usage;
92 static ULONG rsc_audio_mem_usage;
93
94 static ULONG interaction_count;
95
96 static UCHAR error_callback_ignore = UX_TRUE;
97 static ULONG error_callback_counter;
98
99 static struct BUFFER_LOG_STRUCT {
100 ULONG length;
101 UCHAR data[256];
102 } buffer_log[UX_TEST_LOG_SIZE];
103 static ULONG buffer_log_count = 0;
104 #define SAVE_BUFFER_LOG(buf,siz) do { \
105 if (buffer_log_count < UX_TEST_LOG_SIZE) { \
106 ULONG __local_size__ = ((siz) > 256) ? 256 : (siz); \
107 buffer_log[buffer_log_count].length = (siz); \
108 _ux_utility_memory_copy(buffer_log[buffer_log_count].data, (buf), __local_size__); \
109 } \
110 buffer_log_count ++; \
111 } while(0)
112
113 static ULONG test_tx_ack_count = 0xFFFFFFFF;
114 static ULONG test_tx_ins_count = 0;
115 static ULONG test_tx_ins_way = 0;
116
117 static struct CALLBACK_INVOKE_LOG_STRUCT {
118 VOID *func;
119 VOID *param1;
120 VOID *param2;
121 VOID *param3;
122 } callback_invoke_log[UX_TEST_LOG_SIZE];
123 static ULONG callback_invoke_count = 0;
124
125 #define SAVE_CALLBACK_INVOKE_LOG(f,p1,p2,p3) do { \
126 if (callback_invoke_count < UX_TEST_LOG_SIZE) { \
127 callback_invoke_log[callback_invoke_count].func = (VOID *)(f); \
128 callback_invoke_log[callback_invoke_count].param1 = (VOID *)(p1); \
129 callback_invoke_log[callback_invoke_count].param2 = (VOID *)(p2); \
130 callback_invoke_log[callback_invoke_count].param3 = (VOID *)(p3); \
131 callback_invoke_count++; \
132 } \
133 } while(0)
134 #define RESET_CALLBACK_INVOKE_LOG() do { \
135 callback_invoke_count = 0; \
136 } while(0)
137
138 /* Define device framework. */
139
140 #define D3(d) ((UCHAR)((d) >> 24))
141 #define D2(d) ((UCHAR)((d) >> 16))
142 #define D1(d) ((UCHAR)((d) >> 8))
143 #define D0(d) ((UCHAR)((d) >> 0))
144
145 static unsigned char device_framework_full_speed[] = {
146
147 /* --------------------------------------- Device Descriptor */
148 /* 0 bLength, bDescriptorType */ 18, 0x01,
149 /* 2 bcdUSB */ D0(0x200),D1(0x200),
150 /* 4 bDeviceClass, bDeviceSubClass, bDeviceProtocol */ 0x00, 0x00, 0x00,
151 /* 7 bMaxPacketSize0 */ 8,
152 /* 8 idVendor, idProduct */ 0x84, 0x84, 0x02, 0x00,
153 /* 12 bcdDevice */ D0(0x200),D1(0x200),
154 /* 14 iManufacturer, iProduct, iSerialNumber */ 0, 0, 0,
155 /* 17 bNumConfigurations */ 1,
156
157 /* ----------------------------- Device Qualifier Descriptor */
158 /* 0 bLength, bDescriptorType */ 10, 0x06,
159 /* 2 bcdUSB */ D0(0x200),D1(0x200),
160 /* 4 bDeviceClass, bDeviceSubClass, bDeviceProtocol */ 0x00, 0x00, 0x00,
161 /* 7 bMaxPacketSize0 */ 8,
162 /* 8 bNumConfigurations */ 1,
163 /* 9 bReserved */ 0,
164
165 /* -------------------------------- Configuration Descriptor *//* 9+8+120+55*2=247 */
166 /* 0 bLength, bDescriptorType */ 9, 0x02,
167 /* 2 wTotalLength */ D0(247+14),D1(247+14),
168 /* 4 bNumInterfaces, bConfigurationValue */ 3, 1,
169 /* 6 iConfiguration */ 0,
170 /* 7 bmAttributes, bMaxPower */ 0x80, 50,
171
172 /* ------------------------ Interface Association Descriptor */
173 /* 0 bLength, bDescriptorType */ 8, 0x0B,
174 /* 2 bFirstInterface, bInterfaceCount */ 0, 3,
175 /* 4 bFunctionClass, bFunctionSubClass, bFunctionProtocol */ 0x01, 0x00, 0x20,
176 /* 7 iFunction */ 0,
177
178 /* ------------------------------------ Interface Descriptor *//* 0 Control (9+111=120) */
179 /* 0 bLength, bDescriptorType */ 9, 0x04,
180 /* 2 bInterfaceNumber, bAlternateSetting */ 0, 0,
181 /* 4 bNumEndpoints */ 0,
182 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x01, 0x20,
183 /* 8 iInterface */ 0,
184 /* ---------------- Audio 2.0 AC Interface Header Descriptor *//* (9+8+17*2+18*2+12*2=111) */
185 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 9, 0x24, 0x01,
186 /* 3 bcdADC, bCategory */ D0(0x200),D1(0x200), 0x08,
187 /* 6 wTotalLength */ D0(111),D1(111),
188 /* 8 bmControls */ 0x00,
189 /* -------------------- Audio 2.0 AC Clock Source Descriptor */
190 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 8, 0x24, 0x0A,
191 /* 3 bClockID, bmAttributes, bmControls */ 0x10, 0x05, 0x01,
192 /* 6 bAssocTerminal, iClockSource */ 0x00, 0,
193 /* ------------------- Audio 2.0 AC Input Terminal Descriptor */
194 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 17, 0x24, 0x02,
195 /* 3 bTerminalID, wTerminalType */ 0x01, D0(0x0201),D1(0x0201),
196 /* 6 bAssocTerminal, bCSourceID */ 0x00, 0x10,
197 /* 8 bNrChannels, bmChannelConfig */ 0x02, D0(0),D1(0),D2(0),D3(0),
198 /* 13 iChannelNames, bmControls, iTerminal */ 0, D0(0),D1(0), 0,
199 /* --------------------- Audio 2.0 AC Feature Unit Descriptor */
200 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 18, 0x24, 0x06,
201 /* 3 bUnitID, bSourceID */ 0x02, 0x01,
202 /* 5 bmaControls(0), bmaControls(...) ... */ D0(0xF),D1(0xF),D2(0xF),D3(0xF), D0(0),D1(0),D2(0),D3(0), D0(0),D1(0),D2(0),D3(0),
203 /* . iFeature */ 0,
204 /* ------------------ Audio 2.0 AC Output Terminal Descriptor */
205 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 12, 0x24, 0x03,
206 /* 3 bTerminalID, wTerminalType */ 0x03, D0(0x0101),D1(0x0101),
207 /* 6 bAssocTerminal, bSourceID, bCSourceID */ 0x00, 0x02, 0x10,
208 /* 9 bmControls, iTerminal */ D0(0),D1(0), 0,
209 /* ------------------- Audio 2.0 AC Input Terminal Descriptor */
210 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 17, 0x24, 0x02,
211 /* 3 bTerminalID, wTerminalType */ 0x04, D0(0x0101),D1(0x0101),
212 /* 6 bAssocTerminal, bCSourceID */ 0x00, 0x10,
213 /* 8 bNrChannels, bmChannelConfig */ 0x02, D0(0),D1(0),D2(0),D3(0),
214 /* 13 iChannelNames, bmControls, iTerminal */ 0, D0(0),D1(0), 0,
215 /* --------------------- Audio 2.0 AC Feature Unit Descriptor */
216 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 18, 0x24, 0x06,
217 /* 3 bUnitID, bSourceID */ 0x05, 0x04,
218 /* 5 bmaControls(0), bmaControls(...) ... */ D0(0xF),D1(0xF),D2(0xF),D3(0xF), D0(0),D1(0),D2(0),D3(0), D0(0),D1(0),D2(0),D3(0),
219 /* . iFeature */ 0,
220 /* ------------------ Audio 2.0 AC Output Terminal Descriptor */
221 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 12, 0x24, 0x03,
222 /* 3 bTerminalID, wTerminalType */ 0x06, D0(0x0301),D1(0x0301),
223 /* 6 bAssocTerminal, bSourceID, bCSourceID */ 0x00, 0x05, 0x10,
224 /* 9 bmControls, iTerminal */ D0(0),D1(0), 0,
225
226 /* ------------------------------------ Interface Descriptor *//* 1 Stream IN (9+9+16+6+7+8=55) */
227 /* 0 bLength, bDescriptorType */ 9, 0x04,
228 /* 2 bInterfaceNumber, bAlternateSetting */ 1, 0,
229 /* 4 bNumEndpoints */ 0,
230 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
231 /* 8 iInterface */ 0,
232 /* ------------------------------------ Interface Descriptor */
233 /* 0 bLength, bDescriptorType */ 9, 0x04,
234 /* 2 bInterfaceNumber, bAlternateSetting */ 1, 1,
235 /* 4 bNumEndpoints */ 2,
236 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
237 /* 8 iInterface */ 0,
238 /* ------------------------ Audio 2.0 AS Interface Descriptor */
239 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 16, 0x24, 0x01,
240 /* 3 bTerminalLink, bmControls */ 0x03,0x00,
241 /* 5 bFormatType, bmFormats */ 0x01,D0(1),D1(1),D2(1),D3(1),
242 /* 10 bNrChannels, bmChannelConfig */ 2, D0(0),D1(0),D2(0),D3(0),
243 /* 15 iChannelNames */ 0,
244 /* -------------------- Audio 2.0 AS Format Type I Descriptor */
245 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 6, 0x24, 0x02,
246 /* 3 bFormatType, bSubslotSize, bBitResolution */ 0x01, 2, 16,
247 /* ------------------------------------- Endpoint Descriptor */
248 /* 0 bLength, bDescriptorType */ 7, 0x05,
249 /* 2 bEndpointAddress, bmAttributes */ 0x81, 0x0D,
250 /* 4 wMaxPacketSize, bInterval */ D0(256),D1(256), 1,
251 /* ---------- Audio 2.0 AS ISO Audio Data Endpoint Descriptor */
252 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 8, 0x25, 0x01,
253 /* 3 bmAttributes, bmControls */ 0x00, 0x00,
254 /* 5 bLockDelayUnits, wLockDelay */ 0x00, D0(0),D1(0),
255 /* ------------------------------------- Endpoint Descriptor */
256 /* 0 bLength, bDescriptorType */ 7, 0x05,
257 /* 2 bEndpointAddress, bmAttributes */ 0x01, 0x11,
258 /* 4 wMaxPacketSize, bInterval */ D0(4),D1(4), 1,
259
260 /* ------------------------------------ Interface Descriptor *//* 2 Stream OUT (9+9+16+6+7+8=55) */
261 /* 0 bLength, bDescriptorType */ 9, 0x04,
262 /* 2 bInterfaceNumber, bAlternateSetting */ 2, 0,
263 /* 4 bNumEndpoints */ 0,
264 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
265 /* 8 iInterface */ 0,
266 /* ------------------------------------ Interface Descriptor */
267 /* 0 bLength, bDescriptorType */ 9, 0x04,
268 /* 2 bInterfaceNumber, bAlternateSetting */ 2, 1,
269 /* 4 bNumEndpoints */ 2,
270 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
271 /* 8 iInterface */ 0,
272 /* ------------------------ Audio 2.0 AS Interface Descriptor */
273 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 16, 0x24, 0x01,
274 /* 3 bTerminalLink, bmControls */ 0x04,0x00,
275 /* 5 bFormatType, bmFormats */ 0x01,D0(1),D1(1),D2(1),D3(1),
276 /* 10 bNrChannels, bmChannelConfig */ 2, D0(0),D1(0),D2(0),D3(0),
277 /* 15 iChannelNames */ 0,
278 /* ---------------------- Audio 2.0 AS Format Type Descriptor */
279 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 6, 0x24, 0x02,
280 /* 3 bFormatType, bSubslotSize, bBitResolution */ 0x01, 2, 16,
281 /* ------------------------------------- Endpoint Descriptor */
282 /* 0 bLength, bDescriptorType */ 7, 0x05,
283 /* 2 bEndpointAddress, bmAttributes */ 0x02, 0x0D,
284 /* 4 wMaxPacketSize, bInterval */ D0(256),D1(256), 1,
285 /* ---------- Audio 2.0 AS ISO Audio Data Endpoint Descriptor */
286 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 8, 0x25, 0x01,
287 /* 3 bmAttributes, bmControls */ 0x00, 0x00,
288 /* 5 bLockDelayUnits, wLockDelay */ 0x00, D0(0),D1(0),
289 /* ------------------------------------- Endpoint Descriptor */
290 /* 0 bLength, bDescriptorType */ 7, 0x05,
291 /* 2 bEndpointAddress, bmAttributes */ 0x82, 0x11,
292 /* 4 wMaxPacketSize, bInterval */ D0(4),D1(4), 1,
293
294 };
295 #define DEVICE_FRAMEWORK_LENGTH_FULL_SPEED sizeof(device_framework_full_speed)
296
297 static unsigned char device_framework_high_speed[] = {
298 /* --------------------------------------- Device Descriptor */
299 /* 0 bLength, bDescriptorType */ 18, 0x01,
300 /* 2 bcdUSB */ D0(0x200),D1(0x200),
301 /* 4 bDeviceClass, bDeviceSubClass, bDeviceProtocol */ 0x00, 0x00, 0x00,
302 /* 7 bMaxPacketSize0 */ 0x08,
303 /* 8 idVendor, idProduct */ 0x84, 0x84, 0x02, 0x00,
304 /* 12 bcdDevice */ D0(0x200),D1(0x200),
305 /* 14 iManufacturer, iProduct, iSerialNumber */ 0, 0, 0,
306 /* 17 bNumConfigurations */ 1,
307
308 /* ----------------------------- Device Qualifier Descriptor */
309 /* 0 bLength, bDescriptorType */ 10, 0x06,
310 /* 2 bcdUSB */ D0(0x200),D1(0x200),
311 /* 4 bDeviceClass, bDeviceSubClass, bDeviceProtocol */ 0x00, 0x00, 0x00,
312 /* 7 bMaxPacketSize0 */ 8,
313 /* 8 bNumConfigurations */ 1,
314 /* 9 bReserved */ 0,
315
316 /* -------------------------------- Configuration Descriptor *//* 9+8+120+55*2=247 */
317 /* 0 bLength, bDescriptorType */ 9, 0x02,
318 /* 2 wTotalLength */ D0(247+14),D1(247+14),
319 /* 4 bNumInterfaces, bConfigurationValue */ 3, 1,
320 /* 6 iConfiguration */ 0,
321 /* 7 bmAttributes, bMaxPower */ 0x80, 50,
322
323 /* ------------------------ Interface Association Descriptor */
324 /* 0 bLength, bDescriptorType */ 8, 0x0B,
325 /* 2 bFirstInterface, bInterfaceCount */ 0, 3,
326 /* 4 bFunctionClass, bFunctionSubClass, bFunctionProtocol */ 0x01, 0x00, 0x20,
327 /* 7 iFunction */ 0,
328
329 /* ------------------------------------ Interface Descriptor *//* 0 Control (9+111=120) */
330 /* 0 bLength, bDescriptorType */ 9, 0x04,
331 /* 2 bInterfaceNumber, bAlternateSetting */ 0, 0,
332 /* 4 bNumEndpoints */ 0,
333 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x01, 0x20,
334 /* 8 iInterface */ 0,
335 /* ---------------- Audio 2.0 AC Interface Header Descriptor *//* (9+8+17*2+18*2+12*2=111) */
336 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 9, 0x24, 0x01,
337 /* 3 bcdADC, bCategory */ D0(0x200),D1(0x200), 0x08,
338 /* 6 wTotalLength */ D0(111),D1(111),
339 /* 8 bmControls */ 0x00,
340 /* -------------------- Audio 2.0 AC Clock Source Descriptor */
341 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 8, 0x24, 0x0A,
342 /* 3 bClockID, bmAttributes, bmControls */ 0x10, 0x05, 0x01,
343 /* 6 bAssocTerminal, iClockSource */ 0x00, 0,
344 /* ------------------- Audio 2.0 AC Input Terminal Descriptor */
345 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 17, 0x24, 0x02,
346 /* 3 bTerminalID, wTerminalType */ 0x01, D0(0x0201),D1(0x0201),
347 /* 6 bAssocTerminal, bCSourceID */ 0x00, 0x10,
348 /* 8 bNrChannels, bmChannelConfig */ 0x02, D0(0),D1(0),D2(0),D3(0),
349 /* 13 iChannelNames, bmControls, iTerminal */ 0, D0(0),D1(0), 0,
350 /* --------------------- Audio 2.0 AC Feature Unit Descriptor */
351 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 18, 0x24, 0x06,
352 /* 3 bUnitID, bSourceID */ 0x02, 0x01,
353 /* 5 bmaControls(0), bmaControls(...) ... */ D0(0xF),D1(0xF),D2(0xF),D3(0xF), D0(0),D1(0),D2(0),D3(0), D0(0),D1(0),D2(0),D3(0),
354 /* . iFeature */ 0,
355 /* ------------------ Audio 2.0 AC Output Terminal Descriptor */
356 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 12, 0x24, 0x03,
357 /* 3 bTerminalID, wTerminalType */ 0x03, D0(0x0101),D1(0x0101),
358 /* 6 bAssocTerminal, bSourceID, bCSourceID */ 0x00, 0x02, 0x10,
359 /* 9 bmControls, iTerminal */ D0(0),D1(0), 0,
360 /* ------------------- Audio 2.0 AC Input Terminal Descriptor */
361 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 17, 0x24, 0x02,
362 /* 3 bTerminalID, wTerminalType */ 0x04, D0(0x0101),D1(0x0101),
363 /* 6 bAssocTerminal, bCSourceID */ 0x00, 0x10,
364 /* 8 bNrChannels, bmChannelConfig */ 0x02, D0(0),D1(0),D2(0),D3(0),
365 /* 13 iChannelNames, bmControls, iTerminal */ 0, D0(0),D1(0), 0,
366 /* --------------------- Audio 2.0 AC Feature Unit Descriptor */
367 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 18, 0x24, 0x06,
368 /* 3 bUnitID, bSourceID */ 0x05, 0x04,
369 /* 5 bmaControls(0), bmaControls(...) ... */ D0(0xF),D1(0xF),D2(0xF),D3(0xF), D0(0),D1(0),D2(0),D3(0), D0(0),D1(0),D2(0),D3(0),
370 /* . iFeature */ 0,
371 /* ------------------ Audio 2.0 AC Output Terminal Descriptor */
372 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 12, 0x24, 0x03,
373 /* 3 bTerminalID, wTerminalType */ 0x06, D0(0x0301),D1(0x0301),
374 /* 6 bAssocTerminal, bSourceID, bCSourceID */ 0x00, 0x05, 0x10,
375 /* 9 bmControls, iTerminal */ D0(0),D1(0), 0,
376
377 /* ------------------------------------ Interface Descriptor *//* 1 Stream IN (9+9+16+6+7+8=55) */
378 /* 0 bLength, bDescriptorType */ 9, 0x04,
379 /* 2 bInterfaceNumber, bAlternateSetting */ 1, 0,
380 /* 4 bNumEndpoints */ 0,
381 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
382 /* 8 iInterface */ 0,
383 /* ------------------------------------ Interface Descriptor */
384 /* 0 bLength, bDescriptorType */ 9, 0x04,
385 /* 2 bInterfaceNumber, bAlternateSetting */ 1, 1,
386 /* 4 bNumEndpoints */ 2,
387 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
388 /* 8 iInterface */ 0,
389 /* ------------------------ Audio 2.0 AS Interface Descriptor */
390 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 16, 0x24, 0x01,
391 /* 3 bTerminalLink, bmControls */ 0x03,0x00,
392 /* 5 bFormatType, bmFormats */ 0x01,D0(1),D1(1),D2(1),D3(1),
393 /* 10 bNrChannels, bmChannelConfig */ 2, D0(0),D1(0),D2(0),D3(0),
394 /* 15 iChannelNames */ 0,
395 /* -------------------- Audio 2.0 AS Format Type I Descriptor */
396 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 6, 0x24, 0x02,
397 /* 3 bFormatType, bSubslotSize, bBitResolution */ 0x01, 2, 16,
398 /* ------------------------------------- Endpoint Descriptor */
399 /* 0 bLength, bDescriptorType */ 7, 0x05,
400 /* 2 bEndpointAddress, bmAttributes */ 0x81, 0x0D,
401 /* 4 wMaxPacketSize, bInterval */ D0(256),D1(256), 4,
402 /* ---------- Audio 2.0 AS ISO Audio Data Endpoint Descriptor */
403 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 8, 0x25, 0x01,
404 /* 3 bmAttributes, bmControls */ 0x00, 0x00,
405 /* 5 bLockDelayUnits, wLockDelay */ 0x00, D0(0),D1(0),
406 /* ------------------------------------- Endpoint Descriptor */
407 /* 0 bLength, bDescriptorType */ 7, 0x05,
408 /* 2 bEndpointAddress, bmAttributes */ 0x01, 0x11,
409 /* 4 wMaxPacketSize, bInterval */ D0(4),D1(4), 1,
410
411 /* ------------------------------------ Interface Descriptor *//* 2 Stream OUT (9+9+16+6+7+8=55) */
412 /* 0 bLength, bDescriptorType */ 9, 0x04,
413 /* 2 bInterfaceNumber, bAlternateSetting */ 2, 0,
414 /* 4 bNumEndpoints */ 0,
415 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
416 /* 8 iInterface */ 0,
417 /* ------------------------------------ Interface Descriptor */
418 /* 0 bLength, bDescriptorType */ 9, 0x04,
419 /* 2 bInterfaceNumber, bAlternateSetting */ 2, 1,
420 /* 4 bNumEndpoints */ 2,
421 /* 5 bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol */ 0x01, 0x02, 0x20,
422 /* 8 iInterface */ 0,
423 /* ------------------------ Audio 2.0 AS Interface Descriptor */
424 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 16, 0x24, 0x01,
425 /* 3 bTerminalLink, bmControls */ 0x04,0x00,
426 /* 5 bFormatType, bmFormats */ 0x01,D0(1),D1(1),D2(1),D3(1),
427 /* 10 bNrChannels, bmChannelConfig */ 2, D0(0),D1(0),D2(0),D3(0),
428 /* 15 iChannelNames */ 0,
429 /* ---------------------- Audio 2.0 AS Format Type Descriptor */
430 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 6, 0x24, 0x02,
431 /* 3 bFormatType, bSubslotSize, bBitResolution */ 0x01, 2, 16,
432 /* ------------------------------------- Endpoint Descriptor */
433 /* 0 bLength, bDescriptorType */ 7, 0x05,
434 /* 2 bEndpointAddress, bmAttributes */ 0x02, 0x0D,
435 /* 4 wMaxPacketSize, bInterval */ D0(256),D1(256), 4,
436 /* ---------- Audio 2.0 AS ISO Audio Data Endpoint Descriptor */
437 /* 0 bLength, bDescriptorType, bDescriptorSubtype */ 8, 0x25, 0x01,
438 /* 3 bmAttributes, bmControls */ 0x00, 0x00,
439 /* 5 bLockDelayUnits, wLockDelay */ 0x00, D0(0),D1(0),
440 /* ------------------------------------- Endpoint Descriptor */
441 /* 0 bLength, bDescriptorType */ 7, 0x05,
442 /* 2 bEndpointAddress, bmAttributes */ 0x82, 0x11,
443 /* 4 wMaxPacketSize, bInterval */ D0(4),D1(4), 1,
444
445 };
446 #define DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED sizeof(device_framework_high_speed)
447
448 static unsigned char string_framework[] = {
449
450 /* Manufacturer string descriptor : Index 1 - "Express Logic" */
451 0x09, 0x04, 0x01, 0x0c,
452 0x45, 0x78, 0x70, 0x72,0x65, 0x73, 0x20, 0x4c,
453 0x6f, 0x67, 0x69, 0x63,
454
455 /* Product string descriptor : Index 2 - "EL Composite device" */
456 0x09, 0x04, 0x02, 0x13,
457 0x45, 0x4c, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f,
458 0x73, 0x69, 0x74, 0x65, 0x20, 0x64, 0x65, 0x76,
459 0x69, 0x63, 0x65,
460
461 /* Serial Number string descriptor : Index 3 - "0001" */
462 0x09, 0x04, 0x03, 0x04,
463 0x30, 0x30, 0x30, 0x31
464 };
465 #define STRING_FRAMEWORK_LENGTH sizeof(string_framework)
466
467
468 /* Multiple languages are supported on the device, to add
469 a language besides English, the Unicode language code must
470 be appended to the language_id_framework array and the length
471 adjusted accordingly. */
472 static unsigned char language_id_framework[] = {
473
474 /* English. */
475 0x09, 0x04
476 };
477 #define LANGUAGE_ID_FRAMEWORK_LENGTH sizeof(language_id_framework)
478
479 /* Setup requests */
480
481 static UX_TEST_SETUP _SetConfigure = UX_TEST_SETUP_SetConfigure;
482 static UX_TEST_SETUP _GetCfgDescr = UX_TEST_SETUP_GetCfgDescr;
483 static UX_TEST_SETUP _SetAddress = UX_TEST_SETUP_SetAddress;
484 static UX_TEST_SETUP _GetDeviceDescriptor = UX_TEST_SETUP_GetDevDescr;
485 static UX_TEST_SETUP _GetConfigDescriptor = UX_TEST_SETUP_GetCfgDescr;
486
487 /* Interaction define */
488
489 /* Hooks define */
490
ux_device_class_audio_tx_hook(struct UX_TEST_ACTION_STRUCT * action,VOID * params)491 static VOID ux_device_class_audio_tx_hook(struct UX_TEST_ACTION_STRUCT *action, VOID *params)
492 {
493
494 UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION_PARAMS *p = (UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION_PARAMS *)params;
495 UX_SLAVE_TRANSFER *transfer = (UX_SLAVE_TRANSFER *)p -> parameter;
496 UCHAR tmp[32] = {'i','n','s','e','r','t','A',0};
497
498
499 (void)params;
500 // printf("tTX\n");
501
502 /* Acknowledge frame sent. */
503 if (test_tx_ack_count)
504 {
505 SAVE_BUFFER_LOG(transfer -> ux_slave_transfer_request_data_pointer, transfer -> ux_slave_transfer_request_requested_length);
506 transfer -> ux_slave_transfer_request_actual_length = transfer -> ux_slave_transfer_request_requested_length;
507 transfer -> ux_slave_transfer_request_completion_code = UX_SUCCESS;
508 ux_test_dcd_sim_slave_transfer_done(transfer, UX_SUCCESS);
509 }
510 if (test_tx_ack_count != 0xFFFFFFFF && test_tx_ack_count > 0)
511 test_tx_ack_count --;
512
513 /* Insert frames when sent. */
514 if (test_tx_ins_count)
515 {
516 tmp[6] = (test_tx_ins_count % 26) + 'A';
517 if (test_tx_ins_way == 0)
518 ux_device_class_audio_frame_write(slave_audio_tx_stream, tmp, 32);
519 else
520 {
521
522 UCHAR *frame;
523 ULONG frame_length;
524
525
526 ux_device_class_audio_write_frame_get(slave_audio_tx_stream, &frame, &frame_length);
527 _ux_utility_memory_copy(frame, tmp, 32);
528 ux_device_class_audio_write_frame_commit(slave_audio_tx_stream, 32);
529 }
530 }
531 if (test_tx_ins_count != 0xFFFFFFFF && test_tx_ins_count > 0)
532 test_tx_ins_count --;
533 }
534
ux_device_class_audio_rx_hook(struct UX_TEST_ACTION_STRUCT * action,VOID * params)535 static VOID ux_device_class_audio_rx_hook(struct UX_TEST_ACTION_STRUCT *action, VOID *params)
536 {
537
538 UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION_PARAMS *p = (UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION_PARAMS *)params;
539 UX_SLAVE_TRANSFER *transfer = (UX_SLAVE_TRANSFER *)p -> parameter;
540
541
542 (void)action;
543 (void)params;
544 (void)p;
545 (void)transfer;
546 // printf("tRX\n");
547 slave_audio_rx_transfer = transfer;
548 }
549
ux_device_class_audio_feedback_hook(struct UX_TEST_ACTION_STRUCT * action,VOID * params)550 static VOID ux_device_class_audio_feedback_hook(struct UX_TEST_ACTION_STRUCT *action, VOID *params)
551 {
552
553 UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION_PARAMS *p = (UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION_PARAMS *)params;
554 UX_SLAVE_TRANSFER *transfer = (UX_SLAVE_TRANSFER *)p -> parameter;
555 ULONG length;
556
557 (void)action;
558 (void)params;
559 (void)p;
560 (void)transfer;
561 length = UX_MIN(4, transfer->ux_slave_transfer_request_requested_length);
562 if (transfer->ux_slave_transfer_request_endpoint->ux_slave_endpoint_descriptor.bEndpointAddress & 0x80)
563 {
564 device_audio_rx_feedback_count ++;
565 /* IN for OUT(RX/read) feedback. */
566 device_audio_rx_feedback = 0;
567 _ux_utility_memory_copy(device_audio_rx_feedback_u8a,
568 transfer->ux_slave_transfer_request_data_pointer, length);
569 transfer -> ux_slave_transfer_request_completion_code = UX_SUCCESS;
570 transfer -> ux_slave_transfer_request_actual_length = length;
571 }
572 else
573 {
574 device_audio_tx_feedback_count ++;
575 /* OUT for IN(TX/write) feedback. */
576 _ux_utility_memory_copy(transfer->ux_slave_transfer_request_data_pointer,
577 device_audio_tx_feedback_u8a, length);
578 transfer -> ux_slave_transfer_request_completion_code = UX_SUCCESS;
579 transfer -> ux_slave_transfer_request_actual_length = length;
580 }
581 ux_test_dcd_sim_slave_transfer_done(transfer, UX_SUCCESS);
582 _ux_utility_thread_sleep(1);
583 }
584
slave_audio_rx_simulate_one_frame(UCHAR * frame,ULONG frame_length)585 static VOID slave_audio_rx_simulate_one_frame(UCHAR *frame, ULONG frame_length)
586 {
587 UX_TEST_ASSERT(slave_audio_rx_transfer);
588 if (frame_length)
589 {
590 _ux_utility_memory_copy(slave_audio_rx_transfer->ux_slave_transfer_request_data_pointer, frame, frame_length);
591 slave_audio_rx_transfer->ux_slave_transfer_request_actual_length = frame_length;
592 slave_audio_rx_transfer->ux_slave_transfer_request_completion_code = UX_SUCCESS;
593 }
594 ux_test_dcd_sim_slave_transfer_done(slave_audio_rx_transfer, UX_SUCCESS);
595 _ux_utility_delay_ms(100);
596 }
597
598 static UX_TEST_ACTION ux_device_class_audio_transfer_hook[] =
599 {
600 {
601 .usbx_function = UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION,
602 .function = UX_DCD_TRANSFER_REQUEST,
603 .action_func = ux_device_class_audio_tx_hook,
604 .req_setup = UX_NULL,
605 .req_action = UX_TEST_MATCH_EP,
606 .req_ep_address = 0x81,
607 .do_after = UX_FALSE,
608 .no_return = UX_FALSE,
609 },
610 {
611 .usbx_function = UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION,
612 .function = UX_DCD_TRANSFER_REQUEST,
613 .action_func = ux_device_class_audio_rx_hook,
614 .req_setup = UX_NULL,
615 .req_action = UX_TEST_MATCH_EP,
616 .req_ep_address = 0x02,
617 .do_after = UX_FALSE,
618 .no_return = UX_FALSE,
619 },
620 {
621 .usbx_function = UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION,
622 .function = UX_DCD_TRANSFER_REQUEST,
623 .action_func = ux_device_class_audio_feedback_hook,
624 .req_setup = UX_NULL,
625 .req_action = UX_TEST_MATCH_EP,
626 .req_ep_address = 0x82,
627 .req_status = UX_SUCCESS,
628 .status = UX_SUCCESS,
629 .do_after = UX_FALSE,
630 .no_return = UX_FALSE,
631 },
632 {
633 .usbx_function = UX_TEST_OVERRIDE_UX_DCD_SIM_SLAVE_FUNCTION,
634 .function = UX_DCD_TRANSFER_REQUEST,
635 .action_func = ux_device_class_audio_feedback_hook,
636 .req_setup = UX_NULL,
637 .req_action = UX_TEST_MATCH_EP,
638 .req_ep_address = 0x01,
639 .req_status = UX_SUCCESS,
640 .status = UX_SUCCESS,
641 .do_after = UX_FALSE,
642 .no_return = UX_FALSE,
643 },
644 { 0 },
645 };
646
647 /* Define the ISR dispatch. */
648
649 extern VOID (*test_isr_dispatch)(void);
650
651
652 /* Prototype for test control return. */
653
654 void test_control_return(UINT status);
655
error_callback(UINT system_level,UINT system_context,UINT error_code)656 static VOID error_callback(UINT system_level, UINT system_context, UINT error_code)
657 {
658
659 error_callback_counter ++;
660 // printf("Error #%d, system_level: %d, system_context: %d, error_code: 0x%x\n", __LINE__, system_level, system_context, error_code);
661
662 if (!error_callback_ignore)
663 {
664 {
665 /* Failed test. */
666 test_control_return(1);
667 }
668 }
669 }
670
sleep_break_on_error(VOID)671 static UINT sleep_break_on_error(VOID)
672 {
673
674 if (error_callback_counter >= 3)
675 return error_callback_counter;
676
677 return UX_SUCCESS;
678 }
679
680 /* Define the ISR dispatch routine. */
681
test_isr(void)682 static void test_isr(void)
683 {
684
685 /* For further expansion of interrupt-level testing. */
686 }
687
slave_audio_activate(VOID * audio_instance)688 static VOID slave_audio_activate(VOID *audio_instance)
689 {
690 slave_audio = (UX_DEVICE_CLASS_AUDIO *)audio_instance;
691 ux_device_class_audio_stream_get(slave_audio, 0, &slave_audio_tx_stream);
692 ux_device_class_audio_stream_get(slave_audio, 1, &slave_audio_rx_stream);
693 // printf("sAUD:%p;%p,%p\n", audio_instance, slave_audio_tx_stream, slave_audio_rx_stream);
694 }
slave_audio_deactivate(VOID * audio_instance)695 static VOID slave_audio_deactivate(VOID *audio_instance)
696 {
697 if ((VOID *)slave_audio == audio_instance)
698 {
699 slave_audio = UX_NULL;
700 slave_audio_tx_stream = UX_NULL;
701 slave_audio_rx_stream = UX_NULL;
702 }
703 }
slave_audio_tx_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM * audio,ULONG alt)704 static VOID slave_audio_tx_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG alt)
705 {
706 SAVE_CALLBACK_INVOKE_LOG(slave_audio_tx_stream_change, audio, (ALIGN_TYPE)alt, 0);
707 }
slave_audio_rx_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM * audio,ULONG alt)708 static VOID slave_audio_rx_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG alt)
709 {
710 SAVE_CALLBACK_INVOKE_LOG(slave_audio_rx_stream_change, audio, (ALIGN_TYPE)alt, 0);
711
712 slave_audio_rx_transfer = UX_NULL;
713 }
slave_audio_control_process(UX_DEVICE_CLASS_AUDIO * audio,UX_SLAVE_TRANSFER * transfer)714 static UINT slave_audio_control_process(UX_DEVICE_CLASS_AUDIO *audio, UX_SLAVE_TRANSFER *transfer)
715 {
716
717
718 UINT status;
719 UX_DEVICE_CLASS_AUDIO20_CONTROL_GROUP group =
720 {2, g_slave_audio20_control};
721
722
723 SAVE_CALLBACK_INVOKE_LOG(slave_audio_control_process, audio, transfer, 0);
724
725 status = ux_device_class_audio20_control_process(audio, transfer, &group);
726 if (status == UX_SUCCESS)
727 {
728 if (g_slave_audio20_control[0].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED)
729 {
730 /* Mute change! */
731 }
732 if (g_slave_audio20_control[0].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_VOLUME_CHANGED)
733 {
734 /* Volume change! */
735 }
736 if (g_slave_audio20_control[1].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED)
737 {
738 /* Mute change! */
739 }
740 if (g_slave_audio20_control[1].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_VOLUME_CHANGED)
741 {
742 /* Volume change! */
743 }
744 }
745 return(status);
746 }
slave_audio_tx_done(UX_DEVICE_CLASS_AUDIO_STREAM * audio,ULONG length)747 static VOID slave_audio_tx_done(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG length)
748 {
749 SAVE_CALLBACK_INVOKE_LOG(slave_audio_tx_done, audio, (ALIGN_TYPE)length, 0);
750 }
slave_audio_rx_done(UX_DEVICE_CLASS_AUDIO_STREAM * audio,ULONG length)751 static VOID slave_audio_rx_done(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG length)
752 {
753 SAVE_CALLBACK_INVOKE_LOG(slave_audio_rx_done, audio, (ALIGN_TYPE)length, 0);
754 }
755
test_host_change_function(ULONG event,UX_HOST_CLASS * cls,VOID * inst)756 static UINT test_host_change_function(ULONG event, UX_HOST_CLASS *cls, VOID *inst)
757 {
758
759 UX_HOST_CLASS_DUMMY *dummy = (UX_HOST_CLASS_DUMMY *) inst;
760
761
762 switch(event)
763 {
764
765 case UX_DEVICE_INSERTION:
766
767 // printf("hINS:%p,%p:%ld\n", cls, inst, dummy -> ux_host_class_dummy_interface -> ux_interface_descriptor.bInterfaceNumber);
768 switch(dummy -> ux_host_class_dummy_interface -> ux_interface_descriptor.bInterfaceNumber)
769 {
770 case 0: dummy_control = dummy; break;
771 case 1: dummy_rx = dummy; break;
772 case 2: dummy_tx = dummy; break;
773 }
774 break;
775
776 case UX_DEVICE_REMOVAL:
777
778 // printf("hRMV:%p,%p:%ld\n", cls, inst, dummy -> ux_host_class_dummy_interface -> ux_interface_descriptor.bInterfaceNumber);
779 switch(dummy -> ux_host_class_dummy_interface -> ux_interface_descriptor.bInterfaceNumber)
780 {
781 case 0: dummy_control = UX_NULL; break;
782 case 1: dummy_rx = UX_NULL; break;
783 case 2: dummy_tx = UX_NULL; break;
784 }
785 break;
786
787 default:
788 break;
789 }
790 return 0;
791 }
792
ux_test_hcd_entry_set_cfg(UX_TEST_ACTION * action,VOID * params)793 static VOID ux_test_hcd_entry_set_cfg(UX_TEST_ACTION *action, VOID *params)
794 {
795
796 set_cfg_counter ++;
797
798 rsc_mem_free_on_set_cfg = _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available;
799 rsc_sem_on_set_cfg = ux_test_utility_sim_sem_create_count();
800 rsc_mutex_on_set_cfg = ux_test_utility_sim_mutex_create_count();
801 }
802
803
804 /* Define what the initial system looks like. */
805
806 #ifdef CTEST
test_application_define(void * first_unused_memory)807 void test_application_define(void *first_unused_memory)
808 #else
809 void usbx_audio20_device_feedback_test_application_define(void *first_unused_memory)
810 #endif
811 {
812
813 UINT status;
814 CHAR * stack_pointer;
815 CHAR * memory_pointer;
816
817
818 /* Inform user. */
819 printf("Running Audio 2.0 Device Feedback Functionality Test................ ");
820 #if !UX_TEST_MULTI_IFC_ON || !UX_TEST_MULTI_ALT_ON || !UX_TEST_MULTI_CLS_ON || !UX_TEST_MULTI_EP_OVER(4) ||\
821 !defined(UX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT) ||\
822 (UX_SLAVE_REQUEST_CONTROL_MAX_LENGTH < (247 + 14))
823 printf("SKIP SUCCESS!\n");
824 test_control_return(0);
825 return;
826 #endif
827 stepinfo("\n");
828
829 /* Reset testing counts. */
830 ux_test_utility_sim_mutex_create_count_reset();
831 ux_test_utility_sim_sem_create_count_reset();
832 ux_test_utility_sim_sem_get_count_reset();
833 /* Reset error generations */
834 ux_test_utility_sim_sem_error_generation_stop();
835 ux_test_utility_sim_mutex_error_generation_stop();
836 ux_test_utility_sim_sem_get_error_generation_stop();
837
838 /* Initialize the free memory pointer */
839 stack_pointer = (CHAR *) usbx_memory;
840 memory_pointer = stack_pointer + (UX_DEMO_STACK_SIZE * 2);
841
842 /* Initialize USBX Memory */
843 status = ux_system_initialize(memory_pointer, UX_DEMO_MEMORY_SIZE, UX_NULL,0);
844 UX_TEST_CHECK_SUCCESS(status);
845
846 /* Register the error callback. */
847 _ux_utility_error_callback_register(error_callback);
848
849 /* The code below is required for installing the host portion of USBX */
850 status = ux_host_stack_initialize(test_host_change_function);
851 UX_TEST_CHECK_SUCCESS(status);
852
853 /* Register Audio class. */
854 status = ux_host_stack_class_register(_ux_host_class_dummy_name, _ux_host_class_dummy_entry);
855 UX_TEST_CHECK_SUCCESS(status);
856
857 /* The code below is required for installing the device portion of USBX. No call back for
858 device status change in this example. */
859 status = ux_device_stack_initialize(device_framework_high_speed, DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED,
860 device_framework_full_speed, DEVICE_FRAMEWORK_LENGTH_FULL_SPEED,
861 string_framework, STRING_FRAMEWORK_LENGTH,
862 language_id_framework, LANGUAGE_ID_FRAMEWORK_LENGTH,UX_NULL);
863 UX_TEST_CHECK_SUCCESS(status);
864
865 /* Set the parameters for callback when insertion/extraction of a Audio 2.0 device, no IAD. */
866 #if !defined(UX_DEVICE_STANDALONE)
867 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_thread_entry = ux_device_class_audio_write_thread_entry;
868 #else
869 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_task_function = ux_device_class_audio_write_task_function;
870 #endif
871
872 #if defined(UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT)
873 #if !defined(UX_DEVICE_STANDALONE)
874 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_feedback_thread_entry = ux_device_class_audio_feedback_thread_entry;
875 #else
876 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_feedback_task_function = _ux_device_class_audio_feedback_task_function;
877 #endif
878 #endif
879 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_change = slave_audio_tx_stream_change;
880 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_frame_done = slave_audio_tx_done;
881 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_max_frame_buffer_size = 256;
882 slave_audio_stream_parameter[0].ux_device_class_audio_stream_parameter_max_frame_buffer_nb = 8;
883 #if !defined(UX_DEVICE_STANDALONE)
884 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_thread_entry = ux_device_class_audio_read_thread_entry;
885 #else
886 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_task_function = ux_device_class_audio_read_task_function;
887 #endif
888 #if defined(UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT)
889 #if !defined(UX_DEVICE_STANDALONE)
890 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_feedback_thread_entry = ux_device_class_audio_feedback_thread_entry;
891 #else
892 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_feedback_task_function = _ux_device_class_audio_feedback_task_function;
893 #endif
894 #endif
895 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_change = slave_audio_rx_stream_change;
896 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_frame_done = slave_audio_rx_done;
897 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_max_frame_buffer_size = 256;
898 slave_audio_stream_parameter[1].ux_device_class_audio_stream_parameter_max_frame_buffer_nb = 8;
899 slave_audio_parameter.ux_device_class_audio_parameter_streams = slave_audio_stream_parameter;
900 slave_audio_parameter.ux_device_class_audio_parameter_streams_nb = 2;
901 slave_audio_parameter.ux_device_class_audio_parameter_callbacks.ux_slave_class_audio_instance_activate = slave_audio_activate;
902 slave_audio_parameter.ux_device_class_audio_parameter_callbacks.ux_slave_class_audio_instance_deactivate = slave_audio_deactivate;
903 slave_audio_parameter.ux_device_class_audio_parameter_callbacks.ux_device_class_audio_control_process = slave_audio_control_process;
904 slave_audio_parameter.ux_device_class_audio_parameter_callbacks.ux_device_class_audio_arg = UX_NULL;
905
906 #if defined(UX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT)
907 slave_audio_parameter.ux_device_class_audio_parameter_status_queue_size = 2;
908 slave_audio_parameter.ux_device_class_audio_parameter_status_size = 6;
909 #endif
910
911 g_slave_audio20_control[0].ux_device_class_audio20_control_cs_id = 0x10;
912 g_slave_audio20_control[0].ux_device_class_audio20_control_sampling_frequency = 48000;
913 g_slave_audio20_control[0].ux_device_class_audio20_control_fu_id = 2;
914 g_slave_audio20_control[0].ux_device_class_audio20_control_mute[0] = 0;
915 g_slave_audio20_control[0].ux_device_class_audio20_control_volume[0] = 0;
916 g_slave_audio20_control[1].ux_device_class_audio20_control_cs_id = 0x10;
917 g_slave_audio20_control[1].ux_device_class_audio20_control_sampling_frequency = 48000;
918 g_slave_audio20_control[1].ux_device_class_audio20_control_fu_id = 5;
919 g_slave_audio20_control[1].ux_device_class_audio20_control_mute[0] = 0;
920 g_slave_audio20_control[1].ux_device_class_audio20_control_volume[0] = 0;
921
922 /* Initialize the device Audio class. This class owns interfaces starting with 0, 1, 2. */
923 status = ux_device_stack_class_register(_ux_system_slave_class_audio_name, ux_device_class_audio_entry,
924 1, 0, &slave_audio_parameter);
925 UX_TEST_CHECK_SUCCESS(status);
926
927 /* Initialize the simulated device controller. */
928 status = _ux_test_dcd_sim_slave_initialize();
929 UX_TEST_CHECK_SUCCESS(status);
930
931 /* Register all the USB host controllers available in this system */
932 status = ux_host_stack_hcd_register(_ux_system_host_hcd_simulator_name, _ux_test_hcd_sim_host_initialize,0,0);
933 UX_TEST_CHECK_SUCCESS(status);
934
935 /* Create the main host simulation thread. */
936 status = tx_thread_create(&tx_test_thread_host_simulation, "tx demo host simulation", tx_test_thread_host_simulation_entry, 0,
937 stack_pointer, UX_DEMO_STACK_SIZE,
938 20, 20, 1, TX_AUTO_START);
939 UX_TEST_CHECK_SUCCESS(status);
940
941 /* Create the main slave simulation thread. */
942 status = tx_thread_create(&tx_test_thread_slave_simulation, "tx demo slave simulation", tx_test_thread_slave_simulation_entry, 0,
943 stack_pointer + UX_DEMO_STACK_SIZE, UX_DEMO_STACK_SIZE,
944 20, 20, 1, TX_AUTO_START);
945 UX_TEST_CHECK_SUCCESS(status);
946 }
947
test_wait_until_expected(VOID ** ptr,ULONG loop,VOID * expected)948 static UINT test_wait_until_expected(VOID **ptr, ULONG loop, VOID *expected)
949 {
950 while(loop)
951 {
952 _ux_utility_delay_ms(10);
953 if (*ptr == expected)
954 return UX_SUCCESS;
955 }
956 return UX_ERROR;
957 }
test_wait_until_not_expected(VOID ** ptr,ULONG loop,VOID * expected)958 static UINT test_wait_until_not_expected(VOID **ptr, ULONG loop, VOID *expected)
959 {
960 while(loop)
961 {
962 _ux_utility_delay_ms(10);
963 if (*ptr != expected)
964 return UX_SUCCESS;
965 }
966 return UX_ERROR;
967 }
968 #define test_wait_until_not_null(ptr, loop) test_wait_until_not_expected(ptr, loop, UX_NULL)
969 #define test_wait_until_null(ptr, loop) test_wait_until_expected(ptr, loop, UX_NULL)
970
tx_test_thread_host_simulation_entry(ULONG arg)971 void tx_test_thread_host_simulation_entry(ULONG arg)
972 {
973
974 UINT status;
975 ULONG test_n;
976 UX_DEVICE *device;
977 UX_CONFIGURATION *configuration;
978 UX_INTERFACE *interface;
979 UX_INTERFACE *interface_inst[3][2];
980 UX_ENDPOINT *control_endpoint;
981 UX_TRANSFER *transfer_request;
982 UCHAR test_tmp[32];
983 ULONG temp;
984
985
986 /* Test connect. */
987 status = test_wait_until_not_null((void**)&dummy_control, 100);
988 status |= test_wait_until_not_null((void**)&dummy_tx, 100);
989 status |= test_wait_until_not_null((void**)&dummy_rx, 100);
990 status |= test_wait_until_not_null((void**)&slave_audio_tx_stream, 100);
991 status |= test_wait_until_not_null((void**)&slave_audio_rx_stream, 100);
992 UX_TEST_CHECK_SUCCESS(status);
993
994 /* Get testing instances. */
995
996 status = ux_host_stack_device_get(0, &device);
997 UX_TEST_CHECK_SUCCESS(status);
998
999 control_endpoint = &device->ux_device_control_endpoint;
1000 transfer_request = &control_endpoint->ux_endpoint_transfer_request;
1001
1002 status = ux_host_stack_device_configuration_get(device, 0, &configuration);
1003 UX_TEST_CHECK_SUCCESS(status);
1004
1005 interface = configuration -> ux_configuration_first_interface;
1006 while(interface)
1007 {
1008 // printf("Interface: %ld.%ld\n", interface -> ux_interface_descriptor.bInterfaceNumber, interface -> ux_interface_descriptor.bAlternateSetting);
1009 interface_inst[interface -> ux_interface_descriptor.bInterfaceNumber][interface -> ux_interface_descriptor.bAlternateSetting] = interface;
1010 interface = interface -> ux_interface_next_interface;
1011 }
1012
1013 ux_test_link_hooks_from_array(ux_device_class_audio_transfer_hook);
1014
1015 /* Test interface change. */
1016 /* Reset log. */
1017 RESET_CALLBACK_INVOKE_LOG();
1018 status = ux_host_stack_interface_setting_select(interface_inst[1][1]);
1019 status |= ux_host_stack_interface_setting_select(interface_inst[1][0]);
1020 status |= ux_host_stack_interface_setting_select(interface_inst[1][1]);
1021
1022 UX_TEST_CHECK_SUCCESS(status);
1023 UX_TEST_ASSERT(callback_invoke_count == 3);
1024 UX_TEST_ASSERT(callback_invoke_log[0].func == slave_audio_tx_stream_change);
1025 UX_TEST_ASSERT(callback_invoke_log[0].param1 == slave_audio_tx_stream);
1026 UX_TEST_ASSERT(callback_invoke_log[0].param2 == (VOID*)1);
1027 UX_TEST_ASSERT(callback_invoke_log[1].func == slave_audio_tx_stream_change);
1028 UX_TEST_ASSERT(callback_invoke_log[1].param1 == slave_audio_tx_stream);
1029 UX_TEST_ASSERT(callback_invoke_log[1].param2 == 0);
1030
1031 RESET_CALLBACK_INVOKE_LOG();
1032 status = ux_host_stack_interface_setting_select(interface_inst[2][1]);
1033 status |= ux_host_stack_interface_setting_select(interface_inst[2][0]);
1034 status |= ux_host_stack_interface_setting_select(interface_inst[2][1]);
1035
1036 UX_TEST_CHECK_SUCCESS(status);
1037 UX_TEST_ASSERT(callback_invoke_count == 3);
1038 UX_TEST_ASSERT(callback_invoke_log[0].func == slave_audio_rx_stream_change);
1039 UX_TEST_ASSERT(callback_invoke_log[0].param1 == slave_audio_rx_stream);
1040 UX_TEST_ASSERT(callback_invoke_log[0].param2 == (VOID*)1);
1041 UX_TEST_ASSERT(callback_invoke_log[1].func == slave_audio_rx_stream_change);
1042 UX_TEST_ASSERT(callback_invoke_log[1].param1 == slave_audio_rx_stream);
1043 UX_TEST_ASSERT(callback_invoke_log[1].param2 == 0);
1044
1045
1046 #if defined(UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT)
1047 /* Test feedbacks. */
1048
1049 /* Read/write feedback test, pass any data of 4 bytes. */
1050 _ux_system_slave->ux_system_slave_speed = UX_HIGH_SPEED_DEVICE;
1051 slave_audio_rx_stream->ux_device_class_audio_stream_feedback->ux_slave_endpoint_transfer_request.ux_slave_transfer_request_requested_length = 4;
1052 slave_audio_tx_stream->ux_device_class_audio_stream_feedback->ux_slave_endpoint_transfer_request.ux_slave_transfer_request_requested_length = 4;
1053 temp = 0x1234567;
1054 ux_device_class_audio_feedback_set(slave_audio_rx_stream, (UCHAR *)&temp);
1055 temp = device_audio_rx_feedback_count;
1056 while(device_audio_rx_feedback_count == temp)
1057 tx_thread_sleep(1);
1058 UX_TEST_ASSERT(device_audio_rx_feedback == 0x1234567);
1059
1060 device_audio_tx_feedback = 0xabcd1234;
1061 temp = device_audio_tx_feedback_count;
1062 while(device_audio_tx_feedback_count != (temp + 2))
1063 tx_thread_sleep(1);
1064 status = ux_device_class_audio_feedback_get(slave_audio_tx_stream, (UCHAR *)&temp);
1065 UX_TEST_CHECK_SUCCESS(status);
1066 UX_TEST_ASSERT(temp == 0xabcd1234);
1067
1068 /* Read/write feedback test full speed, pass any data of 3 bytes. */
1069 _ux_system_slave->ux_system_slave_speed = UX_FULL_SPEED_DEVICE;
1070 slave_audio_rx_stream->ux_device_class_audio_stream_feedback->ux_slave_endpoint_transfer_request.ux_slave_transfer_request_requested_length = 3;
1071 slave_audio_tx_stream->ux_device_class_audio_stream_feedback->ux_slave_endpoint_transfer_request.ux_slave_transfer_request_requested_length = 3;
1072 temp = 0x7654321;
1073 ux_device_class_audio_feedback_set(slave_audio_rx_stream, (UCHAR *)&temp);
1074 temp = device_audio_rx_feedback_count;
1075 while(device_audio_rx_feedback_count == temp)
1076 tx_thread_sleep(1);
1077 UX_TEST_ASSERT(device_audio_rx_feedback == 0x654321);
1078
1079 device_audio_tx_feedback = 0x4321dcba;
1080 temp = device_audio_tx_feedback_count;
1081 while(device_audio_tx_feedback_count != (temp + 2))
1082 tx_thread_sleep(1);
1083 status = ux_device_class_audio_feedback_get(slave_audio_tx_stream, (UCHAR *)&temp);
1084 UX_TEST_CHECK_SUCCESS(status);
1085 UX_TEST_ASSERT(temp == 0x21dcba);
1086 #endif
1087
1088
1089 /* Test data streaming. */
1090
1091 /* Wrong interface! */
1092 status = ux_device_class_audio_transmission_start(slave_audio_rx_stream);
1093 status |= ux_device_class_audio_reception_start(slave_audio_tx_stream);
1094 UX_TEST_CHECK_NOT_SUCCESS(status);
1095
1096 /* ------------------ Write test. */
1097
1098 status = ux_device_class_audio_frame_write(slave_audio_tx_stream, "test0", 16);
1099 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test1", 16);
1100 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test2", 16);
1101 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test3", 16);
1102 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test4", 16);
1103 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test5", 16);
1104 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test6", 16);
1105 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test7", 16);
1106 UX_TEST_CHECK_SUCCESS(status);
1107
1108 error_callback_counter = 0;
1109 status = ux_device_class_audio_frame_write(slave_audio_tx_stream, "test8", 16);
1110 UX_TEST_CHECK_CODE(UX_BUFFER_OVERFLOW, status);
1111
1112 /*
1113 Keep sending until under-run.
1114 No buffer appended while running.
1115 */
1116
1117 buffer_log_count = 0;
1118 test_tx_ack_count = 10;
1119 status = ux_device_class_audio_transmission_start(slave_audio_tx_stream);
1120 UX_TEST_CHECK_SUCCESS(status);
1121
1122 /* Delay to let thread runs. */
1123 _ux_utility_delay_ms(500);
1124
1125 /* Prepare data for checking. */
1126 _ux_utility_memory_set(test_tmp, 0, 16);
1127 _ux_utility_memory_copy(test_tmp, "test", 4);
1128
1129 /* 8 frame should be available. */
1130 for (test_n = 0; test_n < 8; test_n ++)
1131 {
1132 // printf("%ld: %ld: %s\n", test_n, buffer_log[test_n].length, buffer_log[test_n].data);
1133 test_tmp[4] = (UCHAR)(test_n + '0');
1134
1135 UX_TEST_ASSERT(buffer_log[test_n].length == 16);
1136
1137 status = _ux_utility_memory_compare(buffer_log[test_n].data, test_tmp, 6);
1138 UX_TEST_CHECK_SUCCESS(status);
1139 }
1140 /* Then under-run, 0 length packets. */
1141 for(;test_n < buffer_log_count; test_n ++)
1142 {
1143 // printf("%ld: %ld\n", test_n, buffer_log[test_n].length);
1144 UX_TEST_ASSERT(buffer_log[test_n].length == 0);
1145 }
1146
1147 /*
1148 Keep sending until under-run.
1149 Specific number of buffer appended while running.
1150 */
1151
1152 for (test_tx_ins_way = 0; test_tx_ins_way < 2; test_tx_ins_way ++)
1153 {
1154
1155 /* Switch interface to clean up status. */
1156 status = ux_host_stack_interface_setting_select(interface_inst[1][0]);
1157 status |= ux_host_stack_interface_setting_select(interface_inst[1][1]);
1158
1159 status = ux_device_class_audio_frame_write(slave_audio_tx_stream, "test0", 20);
1160 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test1", 20);
1161 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test2", 20);
1162 status |= ux_device_class_audio_frame_write(slave_audio_tx_stream, "test3", 20);
1163 UX_TEST_CHECK_SUCCESS(status);
1164
1165 test_tx_ins_count = 10;
1166 test_tx_ack_count = 20;
1167 buffer_log_count = 0;
1168 status = ux_device_class_audio_transmission_start(slave_audio_tx_stream);
1169 UX_TEST_CHECK_SUCCESS(status);
1170
1171 /* Delay to let thread runs. */
1172 _ux_utility_delay_ms(500);
1173
1174 /* Prepare data for checking. */
1175 _ux_utility_memory_set(test_tmp, 0, 32);
1176
1177 /* 4 frame should be available. */
1178 _ux_utility_memory_copy(test_tmp, "test", 4);
1179 for (test_n = 0; test_n < 4; test_n ++)
1180 {
1181 // printf("%ld: %ld: %s\n", test_n, buffer_log[test_n].length, buffer_log[test_n].data);
1182 test_tmp[4] = (UCHAR)(test_n + '0');
1183
1184 UX_TEST_ASSERT(buffer_log[test_n].length == 20);
1185
1186 status = _ux_utility_memory_compare(buffer_log[test_n].data, test_tmp, 6);
1187 UX_TEST_CHECK_SUCCESS(status);
1188 }
1189 /* 10 more frame should be available. */
1190 _ux_utility_memory_copy(test_tmp, "insert", 6);
1191 for (; test_n < 14; test_n ++)
1192 {
1193 // printf("%ld: %ld: %s\n", test_n, buffer_log[test_n].length, buffer_log[test_n].data);
1194 test_tmp[6] = (UCHAR)(((10 - (test_n - 4)) % 26) + 'A');
1195
1196 UX_TEST_ASSERT(buffer_log[test_n].length == 32);
1197
1198 status = _ux_utility_memory_compare(buffer_log[test_n].data, test_tmp, 8);
1199 UX_TEST_CHECK_SUCCESS(status);
1200 }
1201 /* Then under-run, 0 length packets. */
1202 for(;test_n < buffer_log_count; test_n ++)
1203 {
1204 // printf("%ld: %ld\n", test_n, buffer_log[test_n].length);
1205 UX_TEST_ASSERT(buffer_log[test_n].length == 0);
1206 }
1207 }
1208
1209 UX_TEST_ASSERT(slave_audio_tx_stream->ux_device_class_audio_stream_transfer_pos == slave_audio_tx_stream->ux_device_class_audio_stream_access_pos);
1210
1211 /* ------------------ Read - 8 test. */
1212
1213 UX_TEST_ASSERT(slave_audio_rx_transfer == UX_NULL);
1214
1215 temp = 0;
1216 status = ux_device_class_audio_sample_read8(slave_audio_rx_stream, (UCHAR *)&temp);
1217 UX_TEST_CHECK_CODE(UX_BUFFER_OVERFLOW, status);
1218
1219 status = ux_device_class_audio_reception_start(slave_audio_rx_stream);
1220 UX_TEST_CHECK_SUCCESS(status);
1221 _ux_utility_thread_sleep(1);
1222
1223 UX_TEST_ASSERT(slave_audio_rx_transfer != UX_NULL);
1224
1225 status = ux_device_class_audio_sample_read8(slave_audio_rx_stream, (UCHAR *)&temp);
1226 UX_TEST_CHECK_CODE(UX_BUFFER_OVERFLOW, status);
1227
1228 RESET_CALLBACK_INVOKE_LOG();
1229
1230 slave_audio_rx_simulate_one_frame("012345", 6);
1231 for (test_n = 0; test_n < 6; test_n ++)
1232 {
1233 status = ux_device_class_audio_sample_read8(slave_audio_rx_stream, (UCHAR *)&temp);
1234 UX_TEST_CHECK_SUCCESS(status);
1235 UX_TEST_ASSERT(temp == (test_n + '0'));
1236 }
1237
1238 slave_audio_rx_simulate_one_frame("012345", 6);
1239 slave_audio_rx_simulate_one_frame("67", 2);
1240 slave_audio_rx_simulate_one_frame("89", 2);
1241 for (test_n = 0; test_n < 10; test_n ++)
1242 {
1243 status = ux_device_class_audio_sample_read8(slave_audio_rx_stream, (UCHAR *)&temp);
1244 UX_TEST_CHECK_SUCCESS(status);
1245 UX_TEST_ASSERT(temp == (test_n + '0'));
1246 }
1247
1248 UX_TEST_ASSERT(callback_invoke_count == 4);
1249 UX_TEST_ASSERT(callback_invoke_log[0].func == slave_audio_rx_done);
1250 UX_TEST_ASSERT(callback_invoke_log[0].param1 == slave_audio_rx_stream);
1251 UX_TEST_ASSERT(callback_invoke_log[1].func == slave_audio_rx_done);
1252 UX_TEST_ASSERT(callback_invoke_log[1].param1 == slave_audio_rx_stream);
1253 UX_TEST_ASSERT(callback_invoke_log[2].func == slave_audio_rx_done);
1254 UX_TEST_ASSERT(callback_invoke_log[2].param1 == slave_audio_rx_stream);
1255 UX_TEST_ASSERT(callback_invoke_log[3].func == slave_audio_rx_done);
1256 UX_TEST_ASSERT(callback_invoke_log[3].param1 == slave_audio_rx_stream);
1257
1258 RESET_CALLBACK_INVOKE_LOG();
1259 error_callback_counter = 0;
1260 for (test_n = 0; test_n < 10; test_n ++)
1261 {
1262 test_tmp[0] = (UCHAR)(test_n + '0');
1263 slave_audio_rx_simulate_one_frame(test_tmp, 1);
1264 }
1265
1266 UX_TEST_ASSERT(callback_invoke_count == 10);
1267 UX_TEST_ASSERT(error_callback_counter == 3);
1268 for (test_n = 0; test_n < 7; test_n ++)
1269 {
1270 status = ux_device_class_audio_sample_read8(slave_audio_rx_stream, (UCHAR *)&temp);
1271 UX_TEST_CHECK_SUCCESS(status);
1272 // printf("(%lx)%c\n", temp, (char)temp);
1273 UX_TEST_ASSERT(temp == (test_n + '0'));
1274 }
1275 UX_TEST_CHECK_SUCCESS(ux_device_class_audio_sample_read8(slave_audio_rx_stream, (UCHAR *)&temp));
1276 UX_TEST_ASSERT(temp == '9');
1277 UX_TEST_CHECK_CODE(UX_BUFFER_OVERFLOW, ux_device_class_audio_sample_read8(slave_audio_rx_stream, (UCHAR *)&temp));
1278
1279 /* ------------------ Read - 16 test. */
1280
1281 status = ux_device_class_audio_sample_read16(slave_audio_rx_stream, (USHORT *)&temp);
1282 UX_TEST_CHECK_CODE(UX_BUFFER_OVERFLOW, status);
1283
1284 RESET_CALLBACK_INVOKE_LOG();
1285 slave_audio_rx_simulate_one_frame("012345", 6);
1286 slave_audio_rx_simulate_one_frame("67", 2);
1287 UX_TEST_ASSERT(callback_invoke_count == 2);
1288 UX_TEST_ASSERT(callback_invoke_log[0].func == slave_audio_rx_done);
1289 UX_TEST_ASSERT(callback_invoke_log[0].param1 == slave_audio_rx_stream);
1290 UX_TEST_ASSERT(callback_invoke_log[0].param2 == (VOID*)6);
1291 UX_TEST_ASSERT(callback_invoke_log[1].func == slave_audio_rx_done);
1292 UX_TEST_ASSERT(callback_invoke_log[1].param1 == slave_audio_rx_stream);
1293 UX_TEST_ASSERT(callback_invoke_log[1].param2 == (VOID*)2);
1294 for (test_n = 0; test_n < 4; test_n ++)
1295 {
1296 status = ux_device_class_audio_sample_read16(slave_audio_rx_stream, (USHORT *)&temp);
1297 UX_TEST_CHECK_SUCCESS(status);
1298 // printf("%lx\n", temp);
1299 test_tmp[0] = (UCHAR)(test_n * 2 + '0');
1300 test_tmp[1] = (UCHAR)(test_n * 2 + '1');
1301 UX_TEST_CHECK_SUCCESS(_ux_utility_memory_compare(test_tmp, &temp, 2));
1302 }
1303
1304 /* ------------------ Read - 24 test. */
1305
1306 status = ux_device_class_audio_sample_read24(slave_audio_rx_stream, &temp);
1307 UX_TEST_CHECK_CODE(UX_BUFFER_OVERFLOW, status);
1308
1309 RESET_CALLBACK_INVOKE_LOG();
1310 slave_audio_rx_simulate_one_frame("012345", 6);
1311 slave_audio_rx_simulate_one_frame("678", 3);
1312 UX_TEST_ASSERT(callback_invoke_count == 2);
1313 UX_TEST_ASSERT(callback_invoke_log[0].func == slave_audio_rx_done);
1314 UX_TEST_ASSERT(callback_invoke_log[0].param1 == slave_audio_rx_stream);
1315 UX_TEST_ASSERT(callback_invoke_log[0].param2 == (VOID*)6);
1316 UX_TEST_ASSERT(callback_invoke_log[1].func == slave_audio_rx_done);
1317 UX_TEST_ASSERT(callback_invoke_log[1].param1 == slave_audio_rx_stream);
1318 UX_TEST_ASSERT(callback_invoke_log[1].param2 == (VOID*)3);
1319 for (test_n = 0; test_n < 3; test_n ++)
1320 {
1321 status = ux_device_class_audio_sample_read24(slave_audio_rx_stream, &temp);
1322 UX_TEST_CHECK_SUCCESS(status);
1323 // printf("%lx\n", temp);
1324 test_tmp[0] = (UCHAR)(test_n * 3 + '0');
1325 test_tmp[1] = (UCHAR)(test_n * 3 + '1');
1326 test_tmp[2] = (UCHAR)(test_n * 3 + '2');
1327 UX_TEST_CHECK_SUCCESS(_ux_utility_memory_compare(test_tmp, &temp, 3));
1328 }
1329
1330 /* ------------------ Read - 32 test. */
1331
1332 status = ux_device_class_audio_sample_read32(slave_audio_rx_stream, &temp);
1333 UX_TEST_CHECK_CODE(UX_BUFFER_OVERFLOW, status);
1334
1335 RESET_CALLBACK_INVOKE_LOG();
1336 slave_audio_rx_simulate_one_frame("01234567", 8);
1337 slave_audio_rx_simulate_one_frame("8901", 4);
1338 UX_TEST_ASSERT(callback_invoke_count == 2);
1339 UX_TEST_ASSERT(callback_invoke_log[0].func == slave_audio_rx_done);
1340 UX_TEST_ASSERT(callback_invoke_log[0].param1 == slave_audio_rx_stream);
1341 UX_TEST_ASSERT(callback_invoke_log[0].param2 == (VOID*)8);
1342 UX_TEST_ASSERT(callback_invoke_log[1].func == slave_audio_rx_done);
1343 UX_TEST_ASSERT(callback_invoke_log[1].param1 == slave_audio_rx_stream);
1344 UX_TEST_ASSERT(callback_invoke_log[1].param2 == (VOID*)4);
1345 for (test_n = 0; test_n < 3; test_n ++)
1346 {
1347 status = ux_device_class_audio_sample_read32(slave_audio_rx_stream, &temp);
1348 UX_TEST_CHECK_SUCCESS(status);
1349 // printf("%lx\n", temp);
1350 test_tmp[0] = ((test_n * 4 + 0) % 10) + '0';
1351 test_tmp[1] = ((test_n * 4 + 1) % 10) + '0';
1352 test_tmp[2] = ((test_n * 4 + 2) % 10) + '0';
1353 test_tmp[3] = ((test_n * 4 + 3) % 10) + '0';
1354 UX_TEST_CHECK_SUCCESS(_ux_utility_memory_compare(test_tmp, &temp, 4));
1355 }
1356
1357 UX_TEST_ASSERT(slave_audio_tx_stream->ux_device_class_audio_stream_transfer_pos == slave_audio_tx_stream->ux_device_class_audio_stream_access_pos);
1358
1359 /**************************************************************************/
1360
1361 /* Control requests test. */
1362
1363 transfer_request -> ux_transfer_request_data_pointer = buffer;
1364
1365 test_tmp[0] = 2;
1366 test_tmp[1] = 5;
1367
1368 for (test_n = 0; test_n < 2; test_n ++)
1369 {
1370 transfer_request -> ux_transfer_request_function = UX_DEVICE_CLASS_AUDIO20_CUR;
1371 transfer_request -> ux_transfer_request_type = UX_REQUEST_OUT | UX_REQUEST_TYPE_CLASS | UX_REQUEST_TARGET_INTERFACE;
1372
1373 /* Issue SetFeatureMute(test_tmp[test_n], 0). */
1374 transfer_request -> ux_transfer_request_requested_length = 1;
1375 transfer_request -> ux_transfer_request_index = (test_tmp[test_n] << 8) | 0;
1376 transfer_request -> ux_transfer_request_value = (UX_DEVICE_CLASS_AUDIO20_FU_MUTE_CONTROL << 8) | 0;
1377 buffer[0] = 0;
1378 status = ux_host_stack_transfer_request(transfer_request);
1379 UX_TEST_CHECK_SUCCESS(status);
1380 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_changed == 0);
1381
1382 /* Issue SetFeatureMute(test_tmp[test_n], 1). */
1383 buffer[0] = 1;
1384 status = ux_host_stack_transfer_request(transfer_request);
1385 UX_TEST_CHECK_SUCCESS(status);
1386 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED);
1387 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_mute[0] == 1);
1388
1389 /* Issue SetFeatureMute(test_tmp[test_n], 0). */
1390 buffer[0] = 0;
1391 status = ux_host_stack_transfer_request(transfer_request);
1392 UX_TEST_CHECK_SUCCESS(status);
1393 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED);
1394 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_mute[0] == 0);
1395
1396 /* Issue SetFeatureMute(test_tmp[test_n], 1). */
1397 buffer[0] = 1;
1398 status = ux_host_stack_transfer_request(transfer_request);
1399 UX_TEST_CHECK_SUCCESS(status);
1400 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED);
1401 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_mute[0] == 1);
1402
1403 /* Issue SetFeatureVolume(test_tmp[test_n], 0x0003). */
1404 transfer_request -> ux_transfer_request_requested_length = 2;
1405 transfer_request -> ux_transfer_request_index = (test_tmp[test_n] << 8) | 0;
1406 transfer_request -> ux_transfer_request_value = (UX_DEVICE_CLASS_AUDIO20_FU_VOLUME_CONTROL << 8) | 0;
1407 buffer[0] = 3; buffer[1] = 0;
1408 status = ux_host_stack_transfer_request(transfer_request);
1409 UX_TEST_CHECK_SUCCESS(status);
1410 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_VOLUME_CHANGED);
1411 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_volume[0] == 0x0003);
1412
1413 /* Issue SetFeatureVolume(test_tmp[test_n], 0x0103). */
1414 buffer[1] = 1;
1415 status = ux_host_stack_transfer_request(transfer_request);
1416 UX_TEST_CHECK_SUCCESS(status);
1417 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_changed == UX_DEVICE_CLASS_AUDIO20_CONTROL_VOLUME_CHANGED);
1418 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_volume[0] == 0x0103);
1419
1420 /* Issue SetFeatureVolume(test_tmp[test_n], 0x0103). */
1421 status = ux_host_stack_transfer_request(transfer_request);
1422 UX_TEST_CHECK_SUCCESS(status);
1423 UX_TEST_ASSERT(g_slave_audio20_control[test_n].ux_device_class_audio20_control_changed == 0);
1424
1425 /* Issue GetFeatureMute(test_tmp[test_n]). */
1426 transfer_request -> ux_transfer_request_function = UX_DEVICE_CLASS_AUDIO20_CUR;
1427 transfer_request -> ux_transfer_request_type = UX_REQUEST_IN | UX_REQUEST_TYPE_CLASS | UX_REQUEST_TARGET_INTERFACE;
1428
1429 transfer_request -> ux_transfer_request_requested_length = 1;
1430 transfer_request -> ux_transfer_request_index = (test_tmp[test_n] << 8) | 0;
1431 transfer_request -> ux_transfer_request_value = (UX_DEVICE_CLASS_AUDIO20_FU_MUTE_CONTROL << 8) | 0;
1432 status = ux_host_stack_transfer_request(transfer_request);
1433 UX_TEST_CHECK_SUCCESS(status);
1434 UX_TEST_ASSERT(transfer_request -> ux_transfer_request_actual_length == 1);
1435 UX_TEST_ASSERT(buffer[0] == 1);
1436
1437 /* Issue GetFeatureMute(test_tmp[test_n]). */
1438 transfer_request -> ux_transfer_request_requested_length = 2;
1439 transfer_request -> ux_transfer_request_index = (test_tmp[test_n] << 8) | 0;
1440 transfer_request -> ux_transfer_request_value = (UX_DEVICE_CLASS_AUDIO20_FU_VOLUME_CONTROL << 8) | 0;
1441 status = ux_host_stack_transfer_request(transfer_request);
1442 UX_TEST_CHECK_SUCCESS(status);
1443 UX_TEST_ASSERT(transfer_request -> ux_transfer_request_actual_length == 2);
1444 UX_TEST_ASSERT(buffer[0] == 3);
1445 UX_TEST_ASSERT(buffer[1] == 1);
1446
1447 /* Issue GetClockSamplingFrequency(0x10). */
1448 transfer_request -> ux_transfer_request_function = UX_DEVICE_CLASS_AUDIO20_CUR;
1449 transfer_request -> ux_transfer_request_requested_length = 4;
1450 transfer_request -> ux_transfer_request_index = (0x10 << 8) | 0;
1451 transfer_request -> ux_transfer_request_value = (UX_DEVICE_CLASS_AUDIO20_CS_SAM_FREQ_CONTROL << 8) | 0;
1452 status = ux_host_stack_transfer_request(transfer_request);
1453 UX_TEST_CHECK_SUCCESS(status);
1454 UX_TEST_ASSERT(transfer_request -> ux_transfer_request_actual_length == 4);
1455 UX_TEST_ASSERT(buffer[0] == D0(48000));
1456 UX_TEST_ASSERT(buffer[1] == D1(48000));
1457 UX_TEST_ASSERT(buffer[2] == D2(48000));
1458 UX_TEST_ASSERT(buffer[3] == D3(48000));
1459
1460 /* Issue GetClockSamplingFrequencyRange(0x10). */
1461 transfer_request -> ux_transfer_request_function = UX_DEVICE_CLASS_AUDIO20_RANGE;
1462 transfer_request -> ux_transfer_request_requested_length = 14;
1463 transfer_request -> ux_transfer_request_index = (0x10 << 8) | 0;
1464 transfer_request -> ux_transfer_request_value = (UX_DEVICE_CLASS_AUDIO20_CS_SAM_FREQ_CONTROL << 8) | 0;
1465 status = ux_host_stack_transfer_request(transfer_request);
1466 UX_TEST_CHECK_SUCCESS(status);
1467 UX_TEST_ASSERT(transfer_request -> ux_transfer_request_actual_length == 14);
1468 UX_TEST_ASSERT(buffer[ 0] == D0(1));
1469 UX_TEST_ASSERT(buffer[ 1] == D1(1));
1470 UX_TEST_ASSERT(buffer[ 2] == D0(48000));
1471 UX_TEST_ASSERT(buffer[ 3] == D1(48000));
1472 UX_TEST_ASSERT(buffer[ 4] == D2(48000));
1473 UX_TEST_ASSERT(buffer[ 5] == D3(48000));
1474 UX_TEST_ASSERT(buffer[ 6] == D0(48000));
1475 UX_TEST_ASSERT(buffer[ 7] == D1(48000));
1476 UX_TEST_ASSERT(buffer[ 8] == D2(48000));
1477 UX_TEST_ASSERT(buffer[ 9] == D3(48000));
1478 }
1479
1480 /* Wait pending threads. */
1481 _ux_utility_thread_sleep(1);
1482
1483 /* Finally disconnect the device. */
1484 ux_device_stack_disconnect();
1485
1486 /* And deinitialize the class. */
1487 ux_device_stack_class_unregister(_ux_system_slave_class_audio_name, ux_device_class_audio_entry);
1488
1489 /* Deinitialize the device side of usbx. */
1490 _ux_device_stack_uninitialize();
1491
1492 /* And finally the usbx system resources. */
1493 _ux_system_uninitialize();
1494
1495 /* Successful test. */
1496 printf("SUCCESS!\n");
1497 test_control_return(0);
1498
1499 }
1500
1501
1502
tx_test_thread_slave_simulation_entry(ULONG arg)1503 void tx_test_thread_slave_simulation_entry(ULONG arg)
1504 {
1505 while(1)
1506 {
1507
1508 #if defined(UX_DEVICE_STANDALONE)
1509
1510 /* Standalone background task. */
1511 ux_system_tasks_run();
1512 #else
1513 /* Sleep so ThreadX on Win32 will delete this thread. */
1514 tx_thread_sleep(10);
1515 #endif
1516 }
1517 }
1518