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