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 }