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_host_class_hid.h"
13 #include "ux_host_class_hid_keyboard.h"
14 #include "ux_host_class_hid_mouse.h"
15 #include "ux_host_class_hid_remote_control.h"
16 
17 #include "ux_test.h"
18 
19 /* Define USBX test constants.  */
20 
21 #define UX_TEST_STACK_SIZE      4096
22 #define UX_TEST_BUFFER_SIZE     2048
23 #define UX_TEST_MEMORY_SIZE     (64*1024)
24 
25 
26 /* Define the counters used in the test application...  */
27 
28 static ULONG                           thread_0_counter;
29 static ULONG                           thread_1_counter;
30 static ULONG                           error_counter;
31 
32 static UCHAR                           error_callback_ignore = UX_FALSE;
33 static ULONG                           error_callback_counter;
34 
35 
36 /* Define USBX test global variables.  */
37 
38 
39 /* Define prototypes for external Host Controller's (HCDs), classes and clients.  */
40 
41 static TX_THREAD           ux_test_thread_simulation_0;
42 static TX_THREAD           ux_test_thread_simulation_1;
43 static void                ux_test_thread_simulation_0_entry(ULONG);
44 static void                ux_test_thread_simulation_1_entry(ULONG);
45 
46 
47 /* Prototype for test control return.  */
48 
49 void  test_control_return(UINT status);
50 
51 
52 /* Define what the initial system looks like.  */
53 
54 #ifdef CTEST
test_application_define(void * first_unused_memory)55 void test_application_define(void *first_unused_memory)
56 #else
57 void usbx_uxe_device_hid_test_application_define(void *first_unused_memory)
58 #endif
59 {
60 
61 UINT status;
62 CHAR                            *stack_pointer;
63 CHAR                            *memory_pointer;
64 
65     /* Inform user.  */
66     printf("Running uxe_device_hid APIs Test.................................... ");
67 #if !defined(UX_DEVICE_CLASS_HID_ENABLE_ERROR_CHECKING)             ||\
68     !defined(UX_DEVICE_CLASS_HID_KEYBOARD_ENABLE_ERROR_CHECKING)    ||\
69     !defined(UX_DEVICE_CLASS_HID_MOUSE_ENABLE_ERROR_CHECKING)       ||\
70     !defined(UX_DEVICE_CLASS_HID_REMOTE_CONTROL_ENABLE_ERROR_CHECKING)
71 #warning Tests skipped due to compile option!
72     printf("SKIP SUCCESS!\n");
73     test_control_return(0);
74     return;
75 #endif
76 
77     /* Initialize the free memory pointer.  */
78     stack_pointer = (CHAR *) first_unused_memory;
79     memory_pointer = stack_pointer + (UX_TEST_STACK_SIZE * 2);
80 
81     /* Initialize USBX Memory.  */
82     status =  ux_system_initialize(memory_pointer, UX_TEST_MEMORY_SIZE, UX_NULL, 0);
83 
84     /* Check for error.  */
85     if (status != UX_SUCCESS)
86     {
87 
88         printf("ERROR #%d\n", __LINE__);
89         test_control_return(1);
90     }
91 
92     /* Create the simulation thread.  */
93     status =  tx_thread_create(&ux_test_thread_simulation_0, "test simulation", ux_test_thread_simulation_0_entry, 0,
94             stack_pointer, UX_TEST_STACK_SIZE,
95             20, 20, 1, TX_AUTO_START);
96 
97     /* Check for error.  */
98     if (status != TX_SUCCESS)
99     {
100 
101         printf("ERROR #%d\n", __LINE__);
102         test_control_return(1);
103     }
104 }
105 
106 
ux_test_thread_simulation_0_entry(ULONG arg)107 static void  ux_test_thread_simulation_0_entry(ULONG arg)
108 {
109 UINT                                    status;
110 UCHAR                                   *dummy_name = "dummy";
111 UX_HOST_CLASS_HID                       dummy_hid;
112 UX_HOST_CLASS_HID_KEYBOARD              dummy_keyboard;
113 UX_HOST_CLASS_HID_MOUSE                 dummy_mouse;
114 UX_HOST_CLASS_HID_REMOTE_CONTROL        dummy_remote_control;
115 
116 UX_HOST_CLASS_HID_REPORT_CALLBACK       dummy_hid_report_callback;
117 UX_HOST_CLASS_HID_REPORT_GET_ID         dummy_get_id;
118 UX_HOST_CLASS_HID_CLIENT_REPORT         dummy_client_report;
119 USHORT                                  dummy_word;
120 ULONG                                   dummy_dw1, dummy_dw2;
121 SLONG                                   dummy_sl1, dummy_sl2;
122 
123 
124     /* ux_host_class_hid_client_register()  */
125     status = ux_host_class_hid_client_register(UX_NULL, ux_host_class_hid_keyboard_entry);
126     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
127     status = ux_host_class_hid_client_register(dummy_name, UX_NULL);
128     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
129 
130     /* ux_host_class_hid_idle_get()  */
131     status = ux_host_class_hid_idle_get(UX_NULL, &dummy_word, 0);
132     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
133     status = ux_host_class_hid_idle_get(&dummy_hid, UX_NULL, 0);
134     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
135 
136     /* ux_host_class_hid_idle_set()  */
137     status = ux_host_class_hid_idle_set(UX_NULL, 0, 0);
138     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
139 
140     /* ux_host_class_hid_periodic_report_start()  */
141     status = ux_host_class_hid_periodic_report_start(UX_NULL);
142     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
143 
144     /* ux_host_class_hid_periodic_report_stop()  */
145     status = ux_host_class_hid_periodic_report_stop(UX_NULL);
146     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
147 
148     /* ux_host_class_hid_report_callback_register()  */
149     status = ux_host_class_hid_report_callback_register(UX_NULL, &dummy_hid_report_callback);
150     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
151     status = ux_host_class_hid_report_callback_register(&dummy_hid, UX_NULL);
152     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
153 
154     /* ux_host_class_hid_report_id_get()  */
155     status = ux_host_class_hid_report_id_get(UX_NULL, &dummy_get_id);
156     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
157     status = ux_host_class_hid_report_id_get(&dummy_hid, UX_NULL);
158     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
159 
160     /* ux_host_class_hid_report_get()  */
161     status = ux_host_class_hid_report_get(UX_NULL, &dummy_client_report);
162     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
163     status = ux_host_class_hid_report_get(&dummy_hid, UX_NULL);
164     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
165 
166     /* ux_host_class_hid_report_set()  */
167     status = ux_host_class_hid_report_set(UX_NULL, &dummy_client_report);
168     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
169     status = ux_host_class_hid_report_set(&dummy_hid, UX_NULL);
170     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
171 
172 #if 0//defined(UX_HOST_STANDALONE)
173 
174     /* ux_host_class_hid_idle_set_run()  */
175     status = ux_host_class_hid_idle_set_run(UX_NULL, 0, 0);
176     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
177 
178     /* ux_host_class_hid_report_set_run()  */
179     status = ux_host_class_hid_report_set_run(UX_NULL, &dummy_client_report);
180     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
181     status = ux_host_class_hid_report_set_run(&dummy_hid, UX_NULL);
182     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
183 #endif
184 
185 
186     /* ux_host_class_hid_keyboard_key_get()  */
187     status = ux_host_class_hid_keyboard_key_get(UX_NULL, &dummy_dw1, &dummy_dw2);
188     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
189     status = ux_host_class_hid_keyboard_key_get(&dummy_keyboard, UX_NULL, &dummy_dw2);
190     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
191     status = ux_host_class_hid_keyboard_key_get(&dummy_keyboard, &dummy_dw1, UX_NULL);
192     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
193     status = ux_host_class_hid_keyboard_key_get(&dummy_keyboard, &dummy_dw1, &dummy_dw1);
194     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
195 
196     /* ux_host_class_hid_keyboard_ioctl()  */
197     status = ux_host_class_hid_keyboard_ioctl(UX_NULL, 0, UX_NULL);
198     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
199 
200 
201     /* ux_host_class_hid_mouse_buttons_get()  */
202     status = ux_host_class_hid_mouse_buttons_get(UX_NULL, &dummy_dw1);
203     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
204     status = ux_host_class_hid_mouse_buttons_get(&dummy_mouse, UX_NULL);
205     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
206 
207     /* _uxe_host_class_hid_mouse_position_get()  */
208     status = _uxe_host_class_hid_mouse_position_get(UX_NULL, &dummy_sl1, &dummy_sl2);
209     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
210     status = _uxe_host_class_hid_mouse_position_get(&dummy_mouse, UX_NULL, &dummy_sl2);
211     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
212     status = _uxe_host_class_hid_mouse_position_get(&dummy_mouse, &dummy_sl1, UX_NULL);
213     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
214     status = _uxe_host_class_hid_mouse_position_get(&dummy_mouse, &dummy_sl1, &dummy_sl1);
215     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
216 
217     /* ux_host_class_hid_mouse_wheel_get()  */
218     status = ux_host_class_hid_mouse_wheel_get(UX_NULL, &dummy_sl1);
219     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
220     status = ux_host_class_hid_mouse_wheel_get(&dummy_mouse, UX_NULL);
221     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
222 
223 
224     /* ux_host_class_hid_remote_control_usage_get()  */
225     status = ux_host_class_hid_remote_control_usage_get(UX_NULL, &dummy_dw1, &dummy_dw2);
226     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
227     status = ux_host_class_hid_remote_control_usage_get(&dummy_remote_control, UX_NULL, &dummy_dw2);
228     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
229     status = ux_host_class_hid_remote_control_usage_get(&dummy_remote_control, &dummy_dw1, UX_NULL);
230     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
231     status = ux_host_class_hid_remote_control_usage_get(&dummy_remote_control, &dummy_dw1, &dummy_dw1);
232     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
233 
234 
235     /* Sleep for a tick to make sure everything is complete.  */
236     tx_thread_sleep(1);
237 
238     /* Check for errors from other threads.  */
239     if (error_counter)
240     {
241 
242         /* Test error.  */
243         printf("ERROR #%d: total %ld errors\n", __LINE__, error_counter);
244         test_control_return(1);
245     }
246     else
247     {
248 
249         /* Successful test.  */
250         printf("SUCCESS!\n");
251         test_control_return(0);
252     }
253 }
254