1 
2 #include "ux_test.h"
3 #include "ux_api.h"
4 #include "ux_host_class_dummy.h"
5 #include "ux_host_stack.h"
6 
7 static UINT _ux_host_class_dummy_activate(UX_HOST_CLASS_COMMAND *command);
8 static UINT _ux_host_class_dummy_deactivate(UX_HOST_CLASS_COMMAND *command);
9 
10 static UINT _ux_host_class_dummy_device_activate(UX_HOST_CLASS_COMMAND *command);
11 static UINT _ux_host_class_dummy_device_deactivate(UX_HOST_CLASS_COMMAND *command);
12 
13 UCHAR _ux_host_class_dummy_name[] = "ux_host_class_dummy";
14 
15 static UX_HOST_CLASS_DUMMY_QUERY *_ux_host_class_dummy_query_list;
16 
17 static UCHAR _ux_host_class_dummy_query_reject_unknown = UX_FALSE;
18 
_ux_host_class_dummy_query_reject_unknown_set(UCHAR yes_no)19 VOID _ux_host_class_dummy_query_reject_unknown_set(UCHAR yes_no)
20 {
21     _ux_host_class_dummy_query_reject_unknown = yes_no;
22 }
23 
_ux_host_class_dummy_query_list_set(UX_HOST_CLASS_DUMMY_QUERY * query_list)24 VOID _ux_host_class_dummy_query_list_set(UX_HOST_CLASS_DUMMY_QUERY *query_list)
25 {
26     _ux_host_class_dummy_query_list = query_list;
27 }
28 
_ux_host_class_dummy_command_query_list_check(UX_HOST_CLASS_COMMAND * command)29 UINT _ux_host_class_dummy_command_query_list_check(UX_HOST_CLASS_COMMAND *command)
30 {
31 UX_HOST_CLASS_DUMMY_QUERY       *query;
32     if (_ux_host_class_dummy_query_list == UX_NULL)
33         return(UX_NO_CLASS_MATCH);
34     query = _ux_host_class_dummy_query_list;
35     while(query -> ux_host_class_query_on)
36     {
37         if (query -> ux_host_class_query_entry != 0 &&
38             query -> ux_host_class_query_entry !=
39                 command -> ux_host_class_command_class_ptr -> ux_host_class_entry_function)
40         {
41             query ++;
42             continue;
43         }
44         if (query -> ux_host_class_query_usage != 0 &&
45             query -> ux_host_class_query_usage != command -> ux_host_class_command_usage)
46         {
47             query ++;
48             continue;
49         }
50         if (query -> ux_host_class_query_vid != 0 &&
51             query -> ux_host_class_query_vid != command -> ux_host_class_command_vid)
52         {
53             query ++;
54             continue;
55         }
56         if (query -> ux_host_class_query_pid != 0 &&
57             query -> ux_host_class_query_pid != command -> ux_host_class_command_pid)
58         {
59             query ++;
60             continue;
61         }
62         if (query -> ux_host_class_query_class != 0 &&
63             query -> ux_host_class_query_class != command -> ux_host_class_command_class)
64         {
65             query ++;
66             continue;
67         }
68         if (query -> ux_host_class_query_subclass != 0 &&
69             query -> ux_host_class_query_subclass != command -> ux_host_class_command_subclass)
70         {
71             query ++;
72             continue;
73         }
74         if (query -> ux_host_class_query_protocol != 0 &&
75             query -> ux_host_class_query_protocol != command -> ux_host_class_command_protocol)
76         {
77             query ++;
78             continue;
79         }
80         if (query -> ux_host_class_query_iad_class != 0 &&
81             query -> ux_host_class_query_iad_class != command -> ux_host_class_command_iad_class)
82         {
83             query ++;
84             continue;
85         }
86         if (query -> ux_host_class_query_iad_subclass != 0 &&
87             query -> ux_host_class_query_iad_subclass != command -> ux_host_class_command_iad_subclass)
88         {
89             query ++;
90             continue;
91         }
92         if (query -> ux_host_class_query_iad_protocol != 0 &&
93             query -> ux_host_class_query_iad_protocol != command -> ux_host_class_command_iad_protocol)
94         {
95             query ++;
96             continue;
97         }
98         return(UX_SUCCESS);
99     }
100     return(UX_NO_CLASS_MATCH);
101 }
102 
_ux_host_class_dummy_entry(UX_HOST_CLASS_COMMAND * command)103 UINT _ux_host_class_dummy_entry(UX_HOST_CLASS_COMMAND *command)
104 {
105 
106     /* The command request will tell us we need to do here, either a enumeration
107        query, an activation or a deactivation.  */
108     switch (command -> ux_host_class_command_request)
109     {
110 
111     case UX_HOST_CLASS_COMMAND_QUERY:
112         if (_ux_host_class_dummy_command_query_list_check(command) == UX_SUCCESS)
113             return(UX_SUCCESS);
114 
115         /* Only for interface : class subclass protocol.  */
116         if (command -> ux_host_class_command_usage != UX_HOST_CLASS_COMMAND_USAGE_CSP)
117             return(UX_NO_CLASS_MATCH);
118 
119         /* Skip undefined or composite.  */
120         if (command -> ux_host_class_command_class == 0 ||
121             command -> ux_host_class_command_class == 0xFE)
122             return(UX_NO_CLASS_MATCH);
123 
124         if (!_ux_host_class_dummy_query_reject_unknown)
125             return(UX_SUCCESS);
126         return(UX_NO_CLASS_MATCH);
127 
128     case UX_HOST_CLASS_COMMAND_ACTIVATE:
129         return _ux_host_class_dummy_activate(command);
130 
131     /* Standalone activate wait support.  */
132     case UX_HOST_CLASS_COMMAND_ACTIVATE_WAIT:
133         return (UX_STATE_NEXT);
134 
135     case UX_HOST_CLASS_COMMAND_DEACTIVATE:
136         return _ux_host_class_dummy_deactivate(command);
137 
138     default:
139 
140         /* Error trap. */
141         _ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_FUNCTION_NOT_SUPPORTED);
142 
143         /* If trace is enabled, insert this event into the trace buffer.  */
144         UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_FUNCTION_NOT_SUPPORTED, 0, 0, 0, UX_TRACE_ERRORS, 0, 0)
145 
146         return(UX_FUNCTION_NOT_SUPPORTED);
147     }
148 }
149 
_ux_host_class_dummy_activate(UX_HOST_CLASS_COMMAND * command)150 UINT _ux_host_class_dummy_activate(UX_HOST_CLASS_COMMAND *command)
151 {
152 
153 UX_INTERFACE                *interface;
154 UX_ENDPOINT                 *endpoint;
155 UX_HOST_CLASS_DUMMY         *dummy;
156 
157 
158     interface =  (UX_INTERFACE *) command -> ux_host_class_command_container;
159     dummy = (UX_HOST_CLASS_DUMMY *)_ux_utility_memory_allocate(UX_NO_ALIGN, UX_REGULAR_MEMORY, sizeof(UX_HOST_CLASS_DUMMY));
160     if (dummy == UX_NULL)
161         return(UX_MEMORY_INSUFFICIENT);
162 
163     dummy -> ux_host_class_dummy_class = command -> ux_host_class_command_class_ptr;
164     dummy -> ux_host_class_dummy_interface = interface;
165     dummy -> ux_host_class_dummy_device = UX_NULL;
166     interface -> ux_interface_class_instance = (VOID *)dummy;
167 
168     _ux_host_stack_class_instance_create(dummy -> ux_host_class_dummy_class, (VOID *)dummy);
169 
170     endpoint = interface -> ux_interface_first_endpoint;
171     while(endpoint)
172     {
173         endpoint -> ux_endpoint_transfer_request.ux_transfer_request_type =
174                         (endpoint->ux_endpoint_descriptor.bEndpointAddress &
175                                                     UX_ENDPOINT_DIRECTION) ?
176                                                 UX_REQUEST_IN : UX_REQUEST_OUT;
177         endpoint -> ux_endpoint_transfer_request.ux_transfer_request_timeout_value =
178                                                                 UX_WAIT_FOREVER;
179         endpoint = endpoint -> ux_endpoint_next_endpoint;
180     }
181 
182     dummy -> ux_host_class_dummy_state = UX_HOST_CLASS_INSTANCE_LIVE;
183 
184     if (_ux_system_host -> ux_system_host_change_function != UX_NULL)
185         _ux_system_host ->  ux_system_host_change_function(UX_DEVICE_INSERTION, dummy -> ux_host_class_dummy_class, (VOID *) dummy);
186 
187     return(UX_SUCCESS);
188 }
189 
_ux_host_class_dummy_deactivate(UX_HOST_CLASS_COMMAND * command)190 UINT _ux_host_class_dummy_deactivate(UX_HOST_CLASS_COMMAND *command)
191 {
192 
193 UX_HOST_CLASS_DUMMY         *dummy;
194 UX_ENDPOINT                 *endpoint;
195 
196 
197     dummy = (UX_HOST_CLASS_DUMMY *)command -> ux_host_class_command_instance;
198 
199     dummy -> ux_host_class_dummy_state = UX_HOST_CLASS_INSTANCE_SHUTDOWN;
200 
201     endpoint = dummy -> ux_host_class_dummy_interface -> ux_interface_first_endpoint;
202     while(endpoint)
203     {
204         _ux_host_stack_endpoint_transfer_abort(endpoint);
205         endpoint = endpoint -> ux_endpoint_next_endpoint;
206     }
207 
208     /* If the class instance was busy, let it finish properly and not return.  */
209     _ux_host_thread_sleep(UX_ENUMERATION_THREAD_WAIT);
210 
211     /* Destroy the instance.  */
212     _ux_host_stack_class_instance_destroy(dummy -> ux_host_class_dummy_class, (VOID *) dummy);
213 
214     /* Notify application.  */
215     if (_ux_system_host -> ux_system_host_change_function != UX_NULL)
216         _ux_system_host ->  ux_system_host_change_function(UX_DEVICE_REMOVAL, dummy -> ux_host_class_dummy_class, (VOID *) dummy);
217 
218     /* Free instance memory.  */
219     _ux_utility_memory_free(dummy);
220 
221     return(UX_SUCCESS);
222 }
223 
_ux_host_class_dummy_device_entry(UX_HOST_CLASS_COMMAND * command)224 UINT _ux_host_class_dummy_device_entry(UX_HOST_CLASS_COMMAND *command)
225 {
226 
227     /* The command request will tell us we need to do here, either a enumeration
228        query, an activation or a deactivation.  */
229     switch (command -> ux_host_class_command_request)
230     {
231 
232     case UX_HOST_CLASS_COMMAND_QUERY:
233         if (_ux_host_class_dummy_command_query_list_check(command) == UX_SUCCESS)
234             return(UX_SUCCESS);
235 
236         /* Only for device : class subclass protocol.  */
237         if (command -> ux_host_class_command_usage != UX_HOST_CLASS_COMMAND_USAGE_DCSP)
238             return(UX_NO_CLASS_MATCH);
239 
240         /* Skip undefined or composite.  */
241         if (command -> ux_host_class_command_class == 0 ||
242             command -> ux_host_class_command_class == 0xFE)
243             return(UX_NO_CLASS_MATCH);
244 
245         if (!_ux_host_class_dummy_query_reject_unknown)
246             return(UX_SUCCESS);
247         return(UX_NO_CLASS_MATCH);
248 
249     case UX_HOST_CLASS_COMMAND_ACTIVATE:
250         return _ux_host_class_dummy_device_activate(command);
251 
252     /* Standalone activate wait support.  */
253     case UX_HOST_CLASS_COMMAND_ACTIVATE_WAIT:
254         return (UX_STATE_NEXT);
255 
256     case UX_HOST_CLASS_COMMAND_DEACTIVATE:
257         return _ux_host_class_dummy_device_deactivate(command);
258 
259     default:
260 
261         /* Error trap. */
262         _ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_FUNCTION_NOT_SUPPORTED);
263 
264         /* If trace is enabled, insert this event into the trace buffer.  */
265         UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_FUNCTION_NOT_SUPPORTED, 0, 0, 0, UX_TRACE_ERRORS, 0, 0)
266 
267         return(UX_FUNCTION_NOT_SUPPORTED);
268     }
269 }
270 
_ux_host_class_dummy_device_configure(UX_HOST_CLASS_DUMMY * dummy)271 static UINT _ux_host_class_dummy_device_configure(UX_HOST_CLASS_DUMMY *dummy)
272 {
273 UINT                status;
274 UX_DEVICE           *device;
275 
276     device = dummy -> ux_host_class_dummy_device;
277     status =  _ux_host_stack_device_configuration_select(device -> ux_device_first_configuration);
278     return(UX_SUCCESS);
279 }
280 
_ux_host_class_dummy_device_activate(UX_HOST_CLASS_COMMAND * command)281 UINT _ux_host_class_dummy_device_activate(UX_HOST_CLASS_COMMAND *command)
282 {
283 UX_DEVICE                   *device;
284 UX_HOST_CLASS_DUMMY         *dummy;
285 
286     device =  (UX_DEVICE *) command -> ux_host_class_command_container;
287     dummy = (UX_HOST_CLASS_DUMMY *)_ux_utility_memory_allocate(UX_NO_ALIGN, UX_REGULAR_MEMORY, sizeof(UX_HOST_CLASS_DUMMY));
288     if (dummy == UX_NULL)
289         return(UX_MEMORY_INSUFFICIENT);
290 
291     dummy -> ux_host_class_dummy_class = command -> ux_host_class_command_class_ptr;
292     dummy -> ux_host_class_dummy_interface = UX_NULL;
293     dummy -> ux_host_class_dummy_device = device;
294     device -> ux_device_class_instance = (VOID *)dummy;
295 
296     _ux_host_stack_class_instance_create(dummy -> ux_host_class_dummy_class, (VOID *)dummy);
297 
298     if (_ux_host_class_dummy_device_configure(dummy) != UX_SUCCESS)
299     {
300         _ux_utility_memory_free(dummy);
301         return(UX_ERROR);
302     }
303 
304     dummy -> ux_host_class_dummy_state = UX_HOST_CLASS_INSTANCE_LIVE;
305 
306     if (_ux_system_host -> ux_system_host_change_function != UX_NULL)
307         _ux_system_host ->  ux_system_host_change_function(UX_DEVICE_INSERTION, dummy -> ux_host_class_dummy_class, (VOID *) dummy);
308 
309     return(UX_SUCCESS);
310 }
311 
_ux_host_class_dummy_device_deactivate(UX_HOST_CLASS_COMMAND * command)312 UINT _ux_host_class_dummy_device_deactivate(UX_HOST_CLASS_COMMAND *command)
313 {
314 UX_HOST_CLASS_DUMMY         *dummy;
315 UX_CONFIGURATION            *configuration;
316 UX_INTERFACE                *interface;
317 UX_ENDPOINT                 *endpoint;
318 
319 
320     dummy = (UX_HOST_CLASS_DUMMY *)command -> ux_host_class_command_instance;
321 
322     dummy -> ux_host_class_dummy_state = UX_HOST_CLASS_INSTANCE_SHUTDOWN;
323 
324     /* Abort all transfer of current configuration.  */
325     configuration = dummy -> ux_host_class_dummy_device -> ux_device_current_configuration;
326     interface = configuration -> ux_configuration_first_interface;
327     while(interface)
328     {
329         endpoint = interface -> ux_interface_first_endpoint;
330         while(endpoint)
331         {
332             _ux_host_stack_endpoint_transfer_abort(endpoint);
333             endpoint = endpoint -> ux_endpoint_next_endpoint;
334         }
335         interface = interface -> ux_interface_next_interface;
336     }
337 
338     /* If the class instance was busy, let it finish properly and not return.  */
339     _ux_host_thread_sleep(UX_ENUMERATION_THREAD_WAIT);
340 
341     /* Destroy the instance.  */
342     _ux_host_stack_class_instance_destroy(dummy -> ux_host_class_dummy_class, (VOID *) dummy);
343 
344     if (_ux_system_host -> ux_system_host_change_function != UX_NULL)
345         _ux_system_host ->  ux_system_host_change_function(UX_DEVICE_REMOVAL, dummy -> ux_host_class_dummy_class, (VOID *) dummy);
346 
347     return(UX_SUCCESS);
348 }
349 #if 0
350 UX_CONFIGURATION *_ux_host_class_dummy_get_configuration(UX_HOST_CLASS_DUMMY *dummy, UCHAR configuration_value)
351 {
352 UX_DEVICE                   *device;
353 UX_CONFIGURATION            *configuration;
354 UX_INTERFACE                *interface;
355     if (dummy == UX_NULL)
356         return(UX_NULL);
357     if (dummy -> ux_host_class_dummy_device)
358         device = dummy -> ux_host_class_dummy_device;
359     else if (dummy -> ux_host_class_dummy_interface)
360     {
361         interface = dummy -> ux_host_class_dummy_interface;
362         configuration = interface -> ux_interface_configuration;
363         device = dummy -> ux_host_class_dummy_device;
364     }
365     else
366         return(UX_NULL);
367     configuration = device -> ux_device_first_configuration;
368     while(configuration)
369     {
370         if (configuration -> ux_configuration_descriptor.bConfigurationValue == configuration_value)
371             return(configuration);
372         configuration = configuration -> ux_configuration_next_configuration;
373     }
374     return(UX_NULL);
375 }
376 #endif
_ux_host_class_dummy_get_interface(UX_HOST_CLASS_DUMMY * dummy,UCHAR interface_number,UCHAR alternate_setting)377 static UX_INTERFACE *_ux_host_class_dummy_get_interface(UX_HOST_CLASS_DUMMY *dummy, UCHAR interface_number, UCHAR alternate_setting)
378 {
379 UX_DEVICE                   *device;
380 UX_CONFIGURATION            *configuration;
381 UX_INTERFACE                *interface;
382     if (dummy == UX_NULL)
383         return(UX_NULL);
384     if (dummy -> ux_host_class_dummy_device)
385     {
386         device = dummy -> ux_host_class_dummy_device;
387         configuration = device -> ux_device_current_configuration;
388     }
389     else if (dummy -> ux_host_class_dummy_interface)
390     {
391         interface = dummy -> ux_host_class_dummy_interface;
392         configuration = interface -> ux_interface_configuration;
393     }
394     else
395         return(UX_NULL);
396     interface = configuration -> ux_configuration_first_interface;
397     while(interface)
398     {
399         if (interface -> ux_interface_descriptor.bInterfaceNumber == (ULONG)interface_number &&
400             interface -> ux_interface_descriptor.bAlternateSetting == (ULONG)alternate_setting)
401             return(interface);
402         interface = interface -> ux_interface_next_interface;
403     }
404     return(UX_NULL);
405 }
406 
_ux_host_class_dummy_select_interface(UX_HOST_CLASS_DUMMY * dummy,UCHAR interface_number,UCHAR alternate_setting)407 UINT _ux_host_class_dummy_select_interface(UX_HOST_CLASS_DUMMY *dummy, UCHAR interface_number, UCHAR alternate_setting)
408 {
409 UX_INTERFACE    *interface = _ux_host_class_dummy_get_interface(dummy, interface_number, alternate_setting);
410     if (interface == UX_NULL)
411         return(UX_ERROR);
412     return(ux_host_stack_interface_setting_select(interface));
413 }
414 
_ux_host_class_dummy_device_get_endpoint(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting)415 static UX_ENDPOINT *_ux_host_class_dummy_device_get_endpoint(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting)
416 {
417 UX_CONFIGURATION            *configuration;
418 UX_INTERFACE                *interface;
419 UX_ENDPOINT                 *endpoint;
420     if (dummy == UX_NULL)
421         return(UX_NULL);
422     if (endpoint_address == 0)
423         return(&dummy -> ux_host_class_dummy_device -> ux_device_control_endpoint);
424     configuration = dummy -> ux_host_class_dummy_device -> ux_device_current_configuration;
425     if (configuration == UX_NULL)
426         return(UX_NULL);
427     interface = configuration -> ux_configuration_first_interface;
428     while(interface)
429     {
430         if (interface -> ux_interface_descriptor.bAlternateSetting == alternate_setting)
431         {
432             endpoint = interface -> ux_interface_first_endpoint;
433             while(endpoint)
434             {
435                 if (endpoint -> ux_endpoint_descriptor.bEndpointAddress == endpoint_address)
436                     return(endpoint);
437                 endpoint = endpoint -> ux_endpoint_next_endpoint;
438             }
439         }
440         interface = interface -> ux_interface_next_interface;
441     }
442     return(UX_NULL);
443 }
_ux_host_class_dummy_get_endpoint(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting)444 UX_ENDPOINT *_ux_host_class_dummy_get_endpoint(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting)
445 {
446 UX_INTERFACE                *interface;
447 UX_ENDPOINT                 *endpoint;
448     if (dummy == UX_NULL)
449         return(UX_NULL);
450     if (dummy -> ux_host_class_dummy_device)
451         return(_ux_host_class_dummy_device_get_endpoint(dummy, endpoint_address, alternate_setting));
452     interface = dummy -> ux_host_class_dummy_interface;
453     if (endpoint_address == 0)
454         return(&interface -> ux_interface_configuration -> ux_configuration_device -> ux_device_control_endpoint);
455     if (interface -> ux_interface_descriptor.bAlternateSetting != (ULONG)alternate_setting)
456         return(UX_NULL);
457     endpoint = interface -> ux_interface_first_endpoint;
458     while(endpoint)
459     {
460         if (endpoint -> ux_endpoint_descriptor.bEndpointAddress == (ULONG)endpoint_address)
461         {
462             return(endpoint);
463         }
464         endpoint = endpoint -> ux_endpoint_next_endpoint;
465     }
466     return(UX_NULL);
467 }
468 
_ux_host_class_dummy_get_transfer_request(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting)469 UX_TRANSFER *_ux_host_class_dummy_get_transfer_request(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting)
470 {
471 UX_ENDPOINT         *endpoint;
472     endpoint = _ux_host_class_dummy_get_endpoint(dummy, endpoint_address, alternate_setting);
473     if (endpoint == UX_NULL)
474         return(UX_NULL);
475     return(&endpoint -> ux_endpoint_transfer_request);
476 }
477 
_ux_host_class_dummy_set_timeout(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting,ULONG timeout)478 VOID  _ux_host_class_dummy_set_timeout(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting, ULONG timeout)
479 {
480 UX_TRANSFER *transfer = _ux_host_class_dummy_get_transfer_request(dummy, endpoint_address, alternate_setting);
481     UX_TEST_ASSERT(transfer);
482     transfer -> ux_transfer_request_timeout_value = timeout;
483 }
484 
_ux_host_class_dummy_get_max_packet_size(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting)485 ULONG _ux_host_class_dummy_get_max_packet_size(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting)
486 {
487 UX_ENDPOINT *endpoint = _ux_host_class_dummy_get_endpoint(dummy, endpoint_address, alternate_setting);
488     UX_TEST_ASSERT(endpoint);
489     return(endpoint->ux_endpoint_descriptor.wMaxPacketSize & UX_MAX_PACKET_SIZE_MASK);
490 }
491 
_ux_host_class_dummy_get_max_payload_size(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting)492 ULONG _ux_host_class_dummy_get_max_payload_size(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting)
493 {
494 UX_ENDPOINT *endpoint = _ux_host_class_dummy_get_endpoint(dummy, endpoint_address, alternate_setting);
495 ULONG       trans, size;
496     UX_TEST_ASSERT(endpoint);
497     size = endpoint->ux_endpoint_descriptor.wMaxPacketSize & UX_MAX_PACKET_SIZE_MASK;
498     trans = endpoint->ux_endpoint_descriptor.wMaxPacketSize & UX_MAX_NUMBER_OF_TRANSACTIONS_MASK;
499     if (trans)
500     {
501         trans >>= UX_MAX_NUMBER_OF_TRANSACTIONS_SHIFT;
502         UX_TEST_ASSERT(trans < 3);
503         size *= (trans + 1);
504     }
505     return(size);
506 }
507 #if !defined(UX_HOST_STANDALONE)
_ux_host_class_dummy_transfer(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting,UCHAR * buffer,ULONG length,ULONG * actual_length)508 UINT  _ux_host_class_dummy_transfer(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting, UCHAR *buffer, ULONG length, ULONG *actual_length)
509 {
510 UX_TRANSFER     *transfer = _ux_host_class_dummy_get_transfer_request(dummy, endpoint_address, alternate_setting);
511 ULONG           payload_size = _ux_host_class_dummy_get_max_payload_size(dummy, endpoint_address, alternate_setting);
512 ULONG           transfer_size;
513 UINT            status;
514     UX_TEST_ASSERT(transfer);
515     *actual_length = 0;
516     do {
517         transfer_size = UX_MIN(payload_size, length);
518         transfer->ux_transfer_request_requested_length = transfer_size;
519         transfer->ux_transfer_request_data_pointer = buffer;
520         status = ux_host_stack_transfer_request(transfer);
521 
522         /* Error check.  */
523         if (status != UX_SUCCESS)
524             return(status);
525 
526         /* Semaphore wait.  */
527         status = _ux_utility_semaphore_get(&transfer->ux_transfer_request_semaphore, transfer->ux_transfer_request_timeout_value);
528         *actual_length += transfer->ux_transfer_request_actual_length;
529 
530         /* Semaphore error.  */
531         if (status != UX_SUCCESS)
532         {
533             ux_host_stack_transfer_request_abort(transfer);
534             transfer->ux_transfer_request_completion_code = UX_TRANSFER_TIMEOUT;
535             return(UX_TRANSFER_TIMEOUT);
536         }
537 
538         /* Short packet check.  */
539         if (transfer_size != transfer->ux_transfer_request_actual_length)
540             return(UX_SUCCESS);
541 
542         /* Update transfer.  */
543         buffer += transfer_size;
544         length -= transfer_size;
545 
546     } while(length);
547     return(UX_SUCCESS);
548 }
549 #endif
_ux_host_class_dummy_abort(UX_HOST_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR alternate_setting)550 UINT  _ux_host_class_dummy_abort(UX_HOST_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR alternate_setting)
551 {
552 UX_TRANSFER     *transfer = _ux_host_class_dummy_get_transfer_request(dummy, endpoint_address, alternate_setting);
553     UX_TEST_ASSERT(transfer);
554     return ux_host_stack_transfer_request_abort(transfer);
555 }
556