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_hid.h"
13 
14 #include "ux_test.h"
15 
16 /* Define USBX test constants.  */
17 
18 #define UX_TEST_STACK_SIZE      4096
19 #define UX_TEST_BUFFER_SIZE     2048
20 #define UX_TEST_MEMORY_SIZE     (64*1024)
21 
22 
23 /* Define the counters used in the test application...  */
24 
25 static ULONG                           thread_0_counter;
26 static ULONG                           thread_1_counter;
27 static ULONG                           error_counter;
28 
29 static UCHAR                           error_callback_ignore = UX_FALSE;
30 static ULONG                           error_callback_counter;
31 
32 
33 /* Define USBX test global variables.  */
34 
35 
36 /* Define prototypes for external Host Controller's (HCDs), classes and clients.  */
37 
38 static TX_THREAD           ux_test_thread_simulation_0;
39 static TX_THREAD           ux_test_thread_simulation_1;
40 static void                ux_test_thread_simulation_0_entry(ULONG);
41 static void                ux_test_thread_simulation_1_entry(ULONG);
42 
43 
44 /* Prototype for test control return.  */
45 
46 void  test_control_return(UINT status);
47 
48 
49 /* Define what the initial system looks like.  */
50 
51 #ifdef CTEST
test_application_define(void * first_unused_memory)52 void test_application_define(void *first_unused_memory)
53 #else
54 void usbx_uxe_device_hid_test_application_define(void *first_unused_memory)
55 #endif
56 {
57 
58 UINT status;
59 CHAR                            *stack_pointer;
60 CHAR                            *memory_pointer;
61 
62     /* Inform user.  */
63     printf("Running uxe_device_hid APIs Test.................................... ");
64 #if !defined(UX_DEVICE_CLASS_HID_ENABLE_ERROR_CHECKING)
65 #warning Tests skipped due to compile option!
66     printf("SKIP SUCCESS!\n");
67     test_control_return(0);
68     return;
69 #endif
70 
71     /* Initialize the free memory pointer.  */
72     stack_pointer = (CHAR *) first_unused_memory;
73     memory_pointer = stack_pointer + (UX_TEST_STACK_SIZE * 2);
74 
75     /* Initialize USBX Memory.  */
76     status =  ux_system_initialize(memory_pointer, UX_TEST_MEMORY_SIZE, UX_NULL, 0);
77 
78     /* Check for error.  */
79     if (status != UX_SUCCESS)
80     {
81 
82         printf("ERROR #%d\n", __LINE__);
83         test_control_return(1);
84     }
85 
86     /* Create the simulation thread.  */
87     status =  tx_thread_create(&ux_test_thread_simulation_0, "test simulation", ux_test_thread_simulation_0_entry, 0,
88             stack_pointer, UX_TEST_STACK_SIZE,
89             20, 20, 1, TX_AUTO_START);
90 
91     /* Check for error.  */
92     if (status != TX_SUCCESS)
93     {
94 
95         printf("ERROR #%d\n", __LINE__);
96         test_control_return(1);
97     }
98 }
99 
100 
ux_test_thread_simulation_0_entry(ULONG arg)101 static void  ux_test_thread_simulation_0_entry(ULONG arg)
102 {
103 UINT                                    status;
104 UX_SLAVE_CLASS_HID                      *dummy_hid_ptr;
105 UX_SLAVE_CLASS_HID                      dummy_hid_inst;
106 UX_SLAVE_CLASS_HID_EVENT                dummy_event;
107 UX_DEVICE_CLASS_HID_RECEIVED_EVENT      dummy_rx_event;
108 UCHAR                                   dummy_buffer[32];
109 ULONG                                   dummy_length;
110 UX_SLAVE_CLASS_HID_PARAMETER            dummy_parameter;
111 UX_SLAVE_CLASS                          dummy_class_array[2];
112 
113     /* Initialize struct for register ...  */
114     ux_utility_memory_set(dummy_class_array, 0, sizeof(dummy_class_array));
115     _ux_system_slave -> ux_system_slave_class_array = dummy_class_array;
116 #if UX_MAX_SLAVE_CLASS_DRIVER > 1
117     UX_SYSTEM_DEVICE_MAX_CLASS_SET(1);
118 #endif
119 
120     /* Device HID parameters.  */
121     dummy_parameter.ux_device_class_hid_parameter_report_address = UX_NULL;
122     dummy_parameter.ux_device_class_hid_parameter_report_length  = 10;
123     status = ux_device_stack_class_register(_ux_system_slave_class_hid_name, ux_device_class_hid_entry,
124                                               1, 1, &dummy_parameter);
125     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
126     dummy_parameter.ux_device_class_hid_parameter_report_address = dummy_buffer;
127     dummy_parameter.ux_device_class_hid_parameter_report_length  = 0;
128     status = ux_device_stack_class_register(_ux_system_slave_class_hid_name, ux_device_class_hid_entry,
129                                               1, 1, &dummy_parameter);
130     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
131     dummy_parameter.ux_device_class_hid_parameter_report_address = dummy_buffer;
132     dummy_parameter.ux_device_class_hid_parameter_report_length  = UX_SLAVE_REQUEST_CONTROL_MAX_LENGTH + 1;
133     status = ux_device_stack_class_register(_ux_system_slave_class_hid_name, ux_device_class_hid_entry,
134                                               1, 1, &dummy_parameter);
135     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
136 
137     /* ux_device_class_hid_event_set()  */
138     status = ux_device_class_hid_event_set(UX_NULL, &dummy_event);
139     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
140     status = ux_device_class_hid_event_set(&dummy_hid_inst, UX_NULL);
141     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
142 
143     /* ux_device_class_hid_event_get()  */
144     status = ux_device_class_hid_event_get(UX_NULL, &dummy_event);
145     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
146     status = ux_device_class_hid_event_get(&dummy_hid_inst, UX_NULL);
147     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
148 
149     /* ux_device_class_hid_protocol_get()  */
150     dummy_hid_ptr = UX_NULL;
151     status = ux_device_class_hid_protocol_get(dummy_hid_ptr);
152     UX_TEST_CHECK_CODE(UX_ERROR, status);
153 
154 #if !defined(UX_DEVICE_STANDALONE)
155     /* ux_device_class_hid_read()  */
156     status = ux_device_class_hid_read(UX_NULL, dummy_buffer, 8, &dummy_length);
157     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
158     status = ux_device_class_hid_read(&dummy_hid_inst, UX_NULL, 8, &dummy_length);
159     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
160     status = ux_device_class_hid_read(&dummy_hid_inst, dummy_buffer, 0, &dummy_length);
161     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
162     status = ux_device_class_hid_read(&dummy_hid_inst, dummy_buffer, 8, UX_NULL);
163     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
164 
165 #else
166     /* ux_device_class_hid_read_run()  */
167     status = ux_device_class_hid_read_run(UX_NULL, dummy_buffer, 8, &dummy_length);
168     UX_TEST_CHECK_CODE(UX_STATE_ERROR, status);
169     status = ux_device_class_hid_read_run(&dummy_hid_inst, UX_NULL, 8, &dummy_length);
170     UX_TEST_CHECK_CODE(UX_STATE_ERROR, status);
171     status = ux_device_class_hid_read_run(&dummy_hid_inst, dummy_buffer, 0, &dummy_length);
172     UX_TEST_CHECK_CODE(UX_STATE_ERROR, status);
173     status = ux_device_class_hid_read_run(&dummy_hid_inst, dummy_buffer, 8, UX_NULL);
174     UX_TEST_CHECK_CODE(UX_STATE_ERROR, status);
175 
176 #endif
177 
178     /* _uxe_device_class_hid_receiver_event_get()  */
179     status = _uxe_device_class_hid_receiver_event_get(UX_NULL, &dummy_rx_event);
180     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
181     status = _uxe_device_class_hid_receiver_event_get(&dummy_hid_inst, UX_NULL);
182     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
183 
184     /* ux_device_class_hid_receiver_event_free()  */
185     status = ux_device_class_hid_receiver_event_free(UX_NULL);
186     UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
187 
188     /* Sleep for a tick to make sure everything is complete.  */
189     tx_thread_sleep(1);
190 
191     /* Check for errors from other threads.  */
192     if (error_counter)
193     {
194 
195         /* Test error.  */
196         printf("ERROR #%d: total %ld errors\n", __LINE__, error_counter);
197         test_control_return(1);
198     }
199     else
200     {
201 
202         /* Successful test.  */
203         printf("SUCCESS!\n");
204         test_control_return(0);
205     }
206 }
207