1 /* This test is designed to test the ux_utility_descriptor_pack.  */
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 
9 #include "ux_host_stack.h"
10 #include "ux_device_stack.h"
11 
12 #include "ux_device_class_dummy.h"
13 #include "ux_host_class_dummy.h"
14 #include "ux_test_hcd_sim_host.h"
15 
16 #include "ux_test.h"
17 
18 /* Define USBX test constants.  */
19 
20 #define UX_TEST_STACK_SIZE      4096
21 #define UX_TEST_BUFFER_SIZE     2048
22 #define UX_TEST_MEMORY_SIZE     (64*1024)
23 
24 
25 /* Define the counters used in the test application...  */
26 
27 static ULONG                           thread_0_counter;
28 static ULONG                           thread_1_counter;
29 static ULONG                           error_counter;
30 
31 static UCHAR                           error_callback_ignore = UX_FALSE;
32 static ULONG                           error_callback_counter;
33 
34 
35 /* Define USBX test global variables.  */
36 
37 
38 /* Define prototypes for external Host Controller's (HCDs), classes and clients.  */
39 
40 static TX_THREAD           ux_test_thread_simulation_0;
41 static TX_THREAD           ux_test_thread_simulation_1;
42 static void                ux_test_thread_simulation_0_entry(ULONG);
43 static void                ux_test_thread_simulation_1_entry(ULONG);
44 
45 
46 /* Prototype for test control return.  */
47 
48 void  test_control_return(UINT status);
49 
50 
51 /* Define what the initial system looks like.  */
52 
53 #ifdef CTEST
test_application_define(void * first_unused_memory)54 void test_application_define(void *first_unused_memory)
55 #else
56 void usbx_uxe_system_test_application_define(void *first_unused_memory)
57 #endif
58 {
59 
60 UINT status;
61 CHAR                            *stack_pointer;
62 CHAR                            *memory_pointer;
63 
64     /* Inform user.  */
65     printf("Running uxe_system APIs Test........................................ ");
66 #if !defined(UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
67 #warning Tests skipped due to compile option!
68     printf("SKIP SUCCESS!\n");
69     test_control_return(0);
70     return;
71 #endif
72 
73     /* Initialize the free memory pointer.  */
74     stack_pointer = (CHAR *) first_unused_memory;
75     memory_pointer = stack_pointer + (UX_TEST_STACK_SIZE * 2);
76 #if 1
77     /* Initialize USBX Memory.  */
78     status =  ux_system_initialize(memory_pointer, UX_TEST_MEMORY_SIZE, UX_NULL, 0);
79 
80     /* Check for error.  */
81     if (status != UX_SUCCESS)
82     {
83 
84         printf("ERROR #%d\n", __LINE__);
85         test_control_return(1);
86     }
87 #endif
88     /* Create the simulation thread.  */
89     status =  tx_thread_create(&ux_test_thread_simulation_0, "test simulation", ux_test_thread_simulation_0_entry, 0,
90             stack_pointer, UX_TEST_STACK_SIZE,
91             20, 20, 1, TX_AUTO_START);
92 
93     /* Check for error.  */
94     if (status != TX_SUCCESS)
95     {
96 
97         printf("ERROR #%d\n", __LINE__);
98         test_control_return(1);
99     }
100 }
101 
102 
ux_test_thread_simulation_0_entry(ULONG arg)103 static void  ux_test_thread_simulation_0_entry(ULONG arg)
104 {
105 UINT                                    status;
106 UCHAR                                  *buffer = (UCHAR *)&status;
107 UX_HOST_CLASS                          dummy_class;
108 UX_HOST_CLASS                          *dummy_class_ptr = &dummy_class;
109 UX_DEVICE                              dummy_device;
110 UX_DEVICE                              *dummy_device_ptr = &dummy_device;
111 UX_CONFIGURATION                       dummy_configuration;
112 UX_CONFIGURATION                       *dummy_configuration_ptr = &dummy_configuration;
113 UX_INTERFACE                           dummy_interface;
114 UX_INTERFACE                           *dummy_interface_ptr = &dummy_interface;
115 UX_ENDPOINT                            dummy_endpoint;
116 UX_ENDPOINT                            *dummy_endpoint_ptr = &dummy_endpoint;
117 UX_TRANSFER                            dummy_transfer;
118 
119     /* ux_host_stack_class_get()  */
120     status =  ux_host_stack_class_get(UX_NULL, &dummy_class_ptr);
121     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
122     status =  ux_host_stack_class_get("dummy", UX_NULL);
123     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
124 
125     /* ux_host_stack_class_instance_get()  */
126     status =  ux_host_stack_class_instance_get(UX_NULL, 0, (VOID**)buffer);
127     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
128     status =  ux_host_stack_class_instance_get(&dummy_class, 0, UX_NULL);
129     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
130 
131     /* ux_host_stack_class_register()  */
132     status =  ux_host_stack_class_register(UX_NULL, _ux_host_class_dummy_entry);
133     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
134     status =  ux_host_stack_class_register("dummy", UX_NULL);
135     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
136 
137     /* ux_host_stack_configuration_interface_get()  */
138     status =  ux_host_stack_configuration_interface_get(UX_NULL, 0, 0, &dummy_interface_ptr);
139     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
140     status =  ux_host_stack_configuration_interface_get(&dummy_configuration, 0, 0, UX_NULL);
141     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
142 
143     /* ux_host_stack_device_configuration_activate()  */
144     status =  ux_host_stack_device_configuration_activate(UX_NULL);
145     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
146 
147     /* ux_host_stack_device_configuration_deactivate()  */
148     status =  ux_host_stack_device_configuration_deactivate(UX_NULL);
149     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
150 
151     /* ux_host_stack_device_configuration_get()  */
152     status =  ux_host_stack_device_configuration_get(UX_NULL, 0, &dummy_configuration_ptr);
153     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
154     status =  ux_host_stack_device_configuration_get(&dummy_device, 0, UX_NULL);
155     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
156 
157     /* ux_host_stack_device_get()  */
158     status =  ux_host_stack_device_get(0, UX_NULL);
159     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
160 
161     /* ux_host_stack_device_string_get()  */
162     status =  ux_host_stack_device_string_get(UX_NULL, buffer, 64, 0x1234, 1);
163     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
164     status =  ux_host_stack_device_string_get(&dummy_device, UX_NULL, 64, 0x1234, 1);
165     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
166     status =  ux_host_stack_device_string_get(&dummy_device, buffer, 0, 0x1234, 1);
167     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
168 
169     /* ux_host_stack_endpoint_transfer_abort()  */
170     status =  ux_host_stack_endpoint_transfer_abort(UX_NULL);
171     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
172 
173     /* ux_host_stack_hcd_register()  */
174     status =  ux_host_stack_hcd_register(UX_NULL, _ux_test_hcd_sim_host_initialize, 0, 0);
175     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
176     status =  ux_host_stack_hcd_register("dummy", UX_NULL, 0, 0);
177     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
178 
179     /* ux_host_stack_hcd_unregister()  */
180     status =  ux_host_stack_hcd_unregister(UX_NULL, 0, 0);
181     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
182 
183     /* ux_host_stack_interface_endpoint_get()  */
184     status =  ux_host_stack_interface_endpoint_get(UX_NULL, 0, &dummy_endpoint_ptr);
185     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
186     status =  ux_host_stack_interface_endpoint_get(&dummy_interface, 0, UX_NULL);
187     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
188 
189     /* ux_host_stack_interface_setting_select()  */
190     status =  ux_host_stack_interface_setting_select(UX_NULL);
191     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
192 
193     /* ux_host_stack_transfer_request()  */
194     status =  ux_host_stack_transfer_request(UX_NULL);
195     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
196     dummy_transfer.ux_transfer_request_endpoint = UX_NULL;
197     status =  ux_host_stack_transfer_request(&dummy_transfer);
198     UX_TEST_CHECK_CODE(UX_ENDPOINT_HANDLE_UNKNOWN, status);
199     dummy_transfer.ux_transfer_request_endpoint = &dummy_endpoint;
200     dummy_endpoint.ux_endpoint_device = UX_NULL;
201     status =  ux_host_stack_transfer_request(&dummy_transfer);
202     UX_TEST_CHECK_CODE(UX_DEVICE_HANDLE_UNKNOWN, status);
203 #if UX_MAX_HCD > 1
204     dummy_endpoint.ux_endpoint_device = &dummy_device;
205     dummy_device.ux_device_hcd = UX_NULL;
206     status =  ux_host_stack_transfer_request(&dummy_transfer);
207     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
208 #endif
209 
210 #if defined(UX_HOST_STANDALONE)
211 
212     /* ux_host_stack_transfer_run()  */
213     status =  ux_host_stack_transfer_run(UX_NULL);
214     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
215     dummy_transfer.ux_transfer_request_endpoint = UX_NULL;
216     status =  ux_host_stack_transfer_run(&dummy_transfer);
217     UX_TEST_CHECK_CODE(UX_ENDPOINT_HANDLE_UNKNOWN, status);
218     dummy_transfer.ux_transfer_request_endpoint = &dummy_endpoint;
219     dummy_endpoint.ux_endpoint_device = UX_NULL;
220     status =  ux_host_stack_transfer_run(&dummy_transfer);
221     UX_TEST_CHECK_CODE(UX_DEVICE_HANDLE_UNKNOWN, status);
222 #if UX_MAX_HCD > 1
223     dummy_endpoint.ux_endpoint_device = &dummy_device;
224     dummy_device.ux_device_hcd = UX_NULL;
225     status =  ux_host_stack_transfer_run(&dummy_transfer);
226     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
227 #endif
228 
229 #endif
230 
231     /* Sleep for a tick to make sure everything is complete.  */
232     tx_thread_sleep(1);
233 
234     /* Check for errors from other threads.  */
235     if (error_counter)
236     {
237 
238         /* Test error.  */
239         printf("ERROR #%d: total %ld errors\n", __LINE__, error_counter);
240         test_control_return(1);
241     }
242     else
243     {
244 
245         /* Successful test.  */
246         printf("SUCCESS!\n");
247         test_control_return(0);
248     }
249 }
250