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_change_test_application_define(void *first_unused_memory)
106 #endif
107 {
108 
109     /* Inform user.  */
110     printf("Running ux_device_class_cdc_ecm_change 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     stepinfo(">>>>>>>>>>>>>>>>>>> Test instance connect\n");
146     UX_TEST_ASSERT(cdc_ecm_device != UX_NULL);
147 
148     /* Test disconnect. */
149     stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
150     ux_test_disconnect_slave();
151     ux_test_disconnect_host_wait_for_enum_completion();
152     UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
153 
154     stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with data IF INT & BULK endpoint\n");
155     default_device_framework[BULK_EP_DESC_POS1 + 3] = 0x3;
156     default_device_framework[BULK_EP_DESC_POS1 + 6] = 0x1; /* avoid creation crush! */
157     ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
158     ux_test_hcd_sim_host_set_actions(replace_configuration_descriptor);
159     ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
160     UX_TEST_CHECK_NOT_SUCCESS(_wait_host_inst_change_to(100, 1));
161     default_device_framework[BULK_EP_DESC_POS1 + 3] = 0x2;
162 
163     /* Test disconnect. */
164     stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
165     ux_test_disconnect_slave();
166     ux_test_disconnect_host_wait_for_enum_completion();
167     UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
168 
169     stepinfo(">>>>>>>>>>>>>>>>>>> Test connect with data IF BULK & INT endpoint\n");
170     default_device_framework[BULK_EP_DESC_POS2 + 3] = 0x3;
171     default_device_framework[BULK_EP_DESC_POS2 + 6] = 0x1; /* avoid creation crush! */
172     ux_test_hcd_sim_host_set_actions(replace_configuration_descriptor);
173     ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
174     ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
175     UX_TEST_CHECK_NOT_SUCCESS(_wait_host_inst_change_to(100, 1));
176     default_device_framework[BULK_EP_DESC_POS2 + 3] = 0x2;
177 
178     /* Test disconnect. */
179     stepinfo(">>>>>>>>>>>>>>>>>>> Test disconnect\n");
180     ux_test_disconnect_slave();
181     ux_test_disconnect_host_wait_for_enum_completion();
182     UX_TEST_CHECK_SUCCESS(_wait_host_inst_change_to(100, 0));
183 
184     /* Restore framework. */
185     device_framework_restore();
186     ux_test_hcd_sim_host_set_actions(UX_NULL);
187 
188     stepinfo(">>>>>>>>>>>>>>>>>>> Test connect to avoid post post operation\n");
189     /* Connect. */
190     ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
191     ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
192     // class_cdc_ecm_get_host();
193 
194     stepinfo(">>>>>>>>>>>>>>>>>>> post_init_host done\n");
195 }
196 
post_init_device()197 static void post_init_device()
198 {
199     stepinfo(">>>>>>>>>>>>>>>>>>> post_init_device empty\n");
200 }