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