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