1 /* Include necessary system files. */
2
3 #include "usbx_ux_test_cdc_ecm.h"
4
5 #define CFG_DESC_POS (0x12)
6
7 #define DATA_IF_DESC_POS0 (DEFAULT_FRAMEWORK_LENGTH - 2*7 - 9 - 9)
8 #define DATA_IF_DESC_POS1 (DEFAULT_FRAMEWORK_LENGTH - 2*7 - 9)
9
10 #define INT_EP_DESC_POS (0x12+0x09+0x08+0x09+0x05+0x0d+0x05)
11
12 #define BULK_EP_DESC_POS1 (_ux_system_slave -> ux_system_slave_device_framework_length - 14)
13 #define BULK_EP_DESC_POS2 (_ux_system_slave -> ux_system_slave_device_framework_length - 7)
14
15 static ULONG error_callback_counter;
16 static UCHAR framework_backup[DEFAULT_FRAMEWORK_LENGTH];
17 static UX_SLAVE_CLASS_CDC_ECM *cdc_ecm_device_bak;
18
framework_rm_data_if_alt(void)19 static void framework_rm_data_if_alt(void)
20 {
21 // printf("Remove alternate setting of interface 1 (CDC DATA)\n");
22 _ux_utility_memory_copy(default_device_framework + DATA_IF_DESC_POS0,
23 framework_backup + DATA_IF_DESC_POS1, 9 + 7 + 7);
24 default_device_framework[CFG_DESC_POS + 2] -= 9;
25 default_device_framework[DATA_IF_DESC_POS0 + 3] = 0;
26 _ux_system_slave -> ux_system_slave_device_framework_length -= 9;
27 _ux_system_slave -> ux_system_slave_device_framework_length_full_speed -= 9;
28 _ux_system_slave -> ux_system_slave_device_framework_length_high_speed -= 9;
29 }
30
framework_copy(void)31 static void framework_copy(void)
32 {
33 _ux_utility_memory_copy(framework_backup, default_device_framework, DEFAULT_FRAMEWORK_LENGTH);
34 }
35
framework_restore(void)36 static void framework_restore(void)
37 {
38 // printf("Restore framework\n");
39 _ux_utility_memory_copy(default_device_framework, framework_backup, DEFAULT_FRAMEWORK_LENGTH);
40 }
41
device_framework_restore(void)42 static void device_framework_restore(void)
43 {
44 framework_restore();
45 _ux_system_slave -> ux_system_slave_device_framework_length = DEFAULT_FRAMEWORK_LENGTH;
46 _ux_system_slave -> ux_system_slave_device_framework_length_full_speed = DEFAULT_FRAMEWORK_LENGTH;
47 _ux_system_slave -> ux_system_slave_device_framework_length_high_speed = DEFAULT_FRAMEWORK_LENGTH;
48 }
49
50 /* Setup requests */
51
52 static UX_TEST_SETUP _SetConfigure = UX_TEST_SETUP_SetConfigure;
53 static UX_TEST_SETUP _GetCfgDescr = UX_TEST_SETUP_GetCfgDescr;
54 static UX_TEST_SETUP _SetAddress = UX_TEST_SETUP_SetAddress;
55 static UX_TEST_SETUP _GetDeviceDescriptor = UX_TEST_SETUP_GetDevDescr;
56 static UX_TEST_SETUP _GetConfigDescriptor = UX_TEST_SETUP_GetCfgDescr;
57
count_error_callback(struct UX_TEST_ACTION_STRUCT * action,VOID * params)58 static void count_error_callback(struct UX_TEST_ACTION_STRUCT *action, VOID *params)
59 {
60 UX_TEST_ERROR_CALLBACK_PARAMS *error = (UX_TEST_ERROR_CALLBACK_PARAMS *)params;
61
62 // printf("error trap #%d: 0x%x, 0x%x, 0x%x\n", __LINE__, error->system_level, error->system_context, error->error_code);
63 error_callback_counter ++;
64 }
65
66 static UX_TEST_HCD_SIM_ACTION count_on_error_trap[] = {
67 { .usbx_function = UX_TEST_OVERRIDE_ERROR_CALLBACK,
68 .action_func = count_error_callback,
69 },
70 { 0 }
71 };
72
73 static UX_TEST_HCD_SIM_ACTION replace_configuration_descriptor[] = {
74 { .usbx_function = UX_TEST_OVERRIDE_UX_HCD_SIM_HOST_ENTRY,
75 .function = UX_HCD_TRANSFER_REQUEST,
76 .req_setup = &_GetConfigDescriptor,
77 .req_action = UX_TEST_SIM_REQ_ANSWER | UX_TEST_SETUP_MATCH_REQ_V,
78 .req_ep_address = 0,
79 .req_data = (framework_backup + CFG_DESC_POS),
80 .req_actual_len = 9,
81 .req_status = UX_SUCCESS,
82 .status = UX_SUCCESS,
83 .action_func = UX_NULL,
84 .no_return = UX_FALSE
85 },
86 { .usbx_function = UX_TEST_OVERRIDE_UX_HCD_SIM_HOST_ENTRY,
87 .function = UX_HCD_TRANSFER_REQUEST,
88 .req_setup = &_GetConfigDescriptor,
89 .req_action = UX_TEST_SIM_REQ_ANSWER | UX_TEST_SETUP_MATCH_REQ_V,
90 .req_ep_address = 0,
91 .req_data = (framework_backup + CFG_DESC_POS),
92 .req_actual_len = DEFAULT_FRAMEWORK_LENGTH - CFG_DESC_POS,
93 .req_status = UX_SUCCESS,
94 .status = UX_SUCCESS,
95 .action_func = UX_NULL,
96 .no_return = UX_FALSE
97 },
98 { 0 }
99 };
100
101 /* Define what the initial system looks like. */
102 #ifdef CTEST
test_application_define(void * first_unused_memory)103 void test_application_define(void *first_unused_memory)
104 #else
105 void usbx_ux_device_class_cdc_ecm_activate_test_application_define(void *first_unused_memory)
106 #endif
107 {
108
109 /* Inform user. */
110 printf("Running ux_device_class_cdc_ecm_activate Test....................... ");
111
112 stepinfo("\n");
113
114 /* Keep a copy of framework data. */
115 framework_copy();
116
117 /* Override error trap. */
118 ux_test_link_hooks_from_array(count_on_error_trap);
119
120 ux_test_cdc_ecm_initialize(first_unused_memory);
121 }
122
_wait_host_inst_change_to(ULONG loop,UCHAR available)123 static UINT _wait_host_inst_change_to(ULONG loop, UCHAR available)
124 {
125 while(loop --)
126 {
127 _ux_utility_delay_ms(10);
128 if (available)
129 {
130 if (cdc_ecm_host_from_system_change_function != UX_NULL)
131 return UX_SUCCESS;
132 }
133 else
134 {
135 if (cdc_ecm_host_from_system_change_function == UX_NULL)
136 return UX_SUCCESS;
137 }
138 }
139 return UX_ERROR;
140 }
141
post_init_host()142 static void post_init_host()
143 {
144
145 UCHAR tmp_byte;
146
147
148 stepinfo(">>>>>>>>>>>>>>>>>>> Test modify ux_slave_class_cdc_ecm_instance_ activate/deactivate\n");
149 UX_TEST_ASSERT(cdc_ecm_device != UX_NULL);
150 cdc_ecm_device_bak = cdc_ecm_device;
151
152 // ux_test_device_class_cdc_ecm_set_link_state(cdc_ecm_device, UX_DEVICE_CLASS_CDC_ECM_LINK_STATE_UP);
153 cdc_ecm_device_bak -> ux_slave_class_cdc_ecm_parameter.ux_slave_class_cdc_ecm_instance_activate = UX_NULL;
154 cdc_ecm_device_bak -> ux_slave_class_cdc_ecm_parameter.ux_slave_class_cdc_ecm_instance_deactivate = UX_NULL;
155
156 /* Test disconnect. */
157 stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
158 ux_test_disconnect_slave();
159 ux_test_disconnect_host_wait_for_enum_completion();
160 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
161
162 stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with control IF INT OUT endpoint\n");
163 // printf("epAddr: %x\n", default_device_framework[INT_EP_DESC_POS + 2]);
164 default_device_framework[INT_EP_DESC_POS + 2] = 0x03;
165 ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
166 ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
167 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 1));
168
169 /* Test disconnect. */
170 stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
171 ux_test_disconnect_slave();
172 ux_test_disconnect_host_wait_for_enum_completion();
173 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
174
175 stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with control IF BULK IN endpoint\n");
176 default_device_framework[INT_EP_DESC_POS + 2] = 0x83;
177 default_device_framework[INT_EP_DESC_POS + 3] = 0x02;
178 ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
179 ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
180 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 1));
181 default_device_framework[INT_EP_DESC_POS + 3] = 0x03;
182
183 /* Test disconnect. */
184 stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
185 ux_test_disconnect_slave();
186 ux_test_disconnect_host_wait_for_enum_completion();
187 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
188
189 stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with data IF bulk endpoints swapped\n");
190 // printf("epAddr: %x, %x\n", default_device_framework[BULK_EP_DESC_POS1 + 2], default_device_framework[BULK_EP_DESC_POS2 + 2]);
191 tmp_byte = default_device_framework[BULK_EP_DESC_POS1 + 2];
192 default_device_framework[BULK_EP_DESC_POS1 + 2] = default_device_framework[BULK_EP_DESC_POS2 + 2];
193 default_device_framework[BULK_EP_DESC_POS2 + 2] = tmp_byte;
194 ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
195 ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
196 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 1));
197
198 /* Test disconnect. */
199 stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
200 ux_test_disconnect_slave();
201 ux_test_disconnect_host_wait_for_enum_completion();
202 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
203
204 /* Modify data interface for testing. */
205 framework_rm_data_if_alt();
206
207 stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with data IF BULK & BULK endpoint\n");
208 ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
209 ux_test_hcd_sim_host_set_actions(replace_configuration_descriptor);
210 ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
211 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 1));
212
213 /* Test disconnect. */
214 stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
215 ux_test_disconnect_slave();
216 ux_test_disconnect_host_wait_for_enum_completion();
217 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
218
219 stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with data IF INT & BULK endpoint\n");
220 default_device_framework[BULK_EP_DESC_POS1 + 3] = 0x3;
221 default_device_framework[BULK_EP_DESC_POS1 + 6] = 0x1; /* avoid creation crush! */
222 ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
223 ux_test_hcd_sim_host_set_actions(replace_configuration_descriptor);
224 ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
225 UX_TEST_CHECK_NOT_SUCCESS(_wait_host_inst_change_to(100, 1));
226 default_device_framework[BULK_EP_DESC_POS1 + 3] = 0x2;
227
228 /* Test disconnect. */
229 stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
230 ux_test_disconnect_slave();
231 ux_test_disconnect_host_wait_for_enum_completion();
232 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
233
234 stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with data IF BULK & INT endpoint\n");
235 default_device_framework[BULK_EP_DESC_POS2 + 3] = 0x3;
236 default_device_framework[BULK_EP_DESC_POS2 + 6] = 0x1; /* avoid creation crush! */
237 ux_test_hcd_sim_host_set_actions(replace_configuration_descriptor);
238 ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
239 ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
240 UX_TEST_CHECK_NOT_SUCCESS(_wait_host_inst_change_to(100, 1));
241 default_device_framework[BULK_EP_DESC_POS2 + 3] = 0x2;
242
243 /* Test disconnect. */
244 stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
245 ux_test_disconnect_slave();
246 ux_test_disconnect_host_wait_for_enum_completion();
247 UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
248
249 /* Restore framework. */
250 device_framework_restore();
251 ux_test_hcd_sim_host_set_actions(UX_NULL);
252
253 stepinfo(">>>>>>>>>>>>>>>>>>> Test connect to avoid post post operation\n");
254 /* Connect. */
255 ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
256 ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
257 // class_cdc_ecm_get_host();
258
259 stepinfo(">>>>>>>>>>>>>>>>>>> post_init_host done\n");
260 }
261
post_init_device()262 static void post_init_device()
263 {
264 stepinfo(">>>>>>>>>>>>>>>>>>> post_init_device empty\n");
265 }