1 /* This test is designed to test the ux_utility_descriptor_pack. */
2
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "ux_api.h"
6 #include "ux_system.h"
7 #include "ux_utility.h"
8
9 #include "ux_host_stack.h"
10 #include "ux_device_stack.h"
11
12 #include "ux_device_class_storage.h"
13
14 #include "ux_test.h"
15
16 /* Define USBX test constants. */
17
18 #define UX_TEST_STACK_SIZE 4096
19 #define UX_TEST_BUFFER_SIZE 2048
20 #define UX_TEST_MEMORY_SIZE (64*1024)
21
22
23 /* Define the counters used in the test application... */
24
25 static ULONG thread_0_counter;
26 static ULONG thread_1_counter;
27 static ULONG error_counter;
28
29 static UCHAR error_callback_ignore = UX_FALSE;
30 static ULONG error_callback_counter;
31
32
33 /* Define USBX test global variables. */
34
35
36 /* Define prototypes for external Host Controller's (HCDs), classes and clients. */
37
38 static TX_THREAD ux_test_thread_simulation_0;
39 static TX_THREAD ux_test_thread_simulation_1;
40 static void ux_test_thread_simulation_0_entry(ULONG);
41 static void ux_test_thread_simulation_1_entry(ULONG);
42
43
44 /* Prototype for test control return. */
45
46 void test_control_return(UINT status);
47
48
49 /* Define what the initial system looks like. */
50
51 #ifdef CTEST
test_application_define(void * first_unused_memory)52 void test_application_define(void *first_unused_memory)
53 #else
54 void usbx_uxe_device_storage_test_application_define(void *first_unused_memory)
55 #endif
56 {
57
58 UINT status;
59 CHAR *stack_pointer;
60 CHAR *memory_pointer;
61
62 /* Inform user. */
63 printf("Running uxe_device_storage APIs Test................................ ");
64 #if !defined(UX_DEVICE_CLASS_STORAGE_ENABLE_ERROR_CHECKING)
65 #warning Tests skipped due to compile option!
66 printf("SKIP SUCCESS!\n");
67 test_control_return(0);
68 return;
69 #endif
70
71 /* Initialize the free memory pointer. */
72 stack_pointer = (CHAR *) first_unused_memory;
73 memory_pointer = stack_pointer + (UX_TEST_STACK_SIZE * 2);
74
75 /* Initialize USBX Memory. */
76 status = ux_system_initialize(memory_pointer, UX_TEST_MEMORY_SIZE, UX_NULL, 0);
77
78 /* Check for error. */
79 if (status != UX_SUCCESS)
80 {
81
82 printf("ERROR #%d\n", __LINE__);
83 test_control_return(1);
84 }
85
86 /* Create the simulation thread. */
87 status = tx_thread_create(&ux_test_thread_simulation_0, "test simulation", ux_test_thread_simulation_0_entry, 0,
88 stack_pointer, UX_TEST_STACK_SIZE,
89 20, 20, 1, TX_AUTO_START);
90
91 /* Check for error. */
92 if (status != TX_SUCCESS)
93 {
94
95 printf("ERROR #%d\n", __LINE__);
96 test_control_return(1);
97 }
98 }
99
100
_dummy_storage_media_read(VOID * storage,ULONG lun,UCHAR * data_pointer,ULONG number_blocks,ULONG lba,ULONG * media_status)101 static UINT _dummy_storage_media_read(VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status)
102 {
103 return(0);
104 }
_dummy_storage_media_write(VOID * storage,ULONG lun,UCHAR * data_pointer,ULONG number_blocks,ULONG lba,ULONG * media_status)105 static UINT _dummy_storage_media_write(VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status)
106 {
107 return(0);
108 }
_dummy_storage_media_flush(VOID * storage,ULONG lun,ULONG number_blocks,ULONG lba,ULONG * media_status)109 static UINT _dummy_storage_media_flush(VOID *storage, ULONG lun, ULONG number_blocks, ULONG lba, ULONG *media_status)
110 {
111 return(0);
112 }
_dummy_storage_media_status(VOID * storage,ULONG lun,ULONG media_id,ULONG * media_status)113 static UINT _dummy_storage_media_status(VOID *storage, ULONG lun, ULONG media_id, ULONG *media_status)
114 {
115 return(0);
116 }
_dummy_storage_media_notification(VOID * storage,ULONG lun,ULONG media_id,ULONG notification_class,UCHAR ** media_notification,ULONG * media_notification_length)117 static UINT _dummy_storage_media_notification(VOID *storage, ULONG lun, ULONG media_id, ULONG notification_class, UCHAR **media_notification, ULONG *media_notification_length)
118 {
119 return(0);
120 }
121
ux_test_thread_simulation_0_entry(ULONG arg)122 static void ux_test_thread_simulation_0_entry(ULONG arg)
123 {
124
125 UINT status;
126 UX_SLAVE_CLASS_COMMAND dummy_command;
127 UX_SLAVE_CLASS_STORAGE_PARAMETER dummy_parameter;
128
129 /* uxe storage initialize. */
130 dummy_command.ux_slave_class_command_parameter = &dummy_parameter;
131 dummy_command.ux_slave_class_command_request = UX_SLAVE_CLASS_COMMAND_INITIALIZE;
132
133 dummy_parameter.ux_slave_class_storage_parameter_number_lun = 0x7F;
134 status = ux_device_class_storage_entry(&dummy_command);
135 UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
136
137 dummy_parameter.ux_slave_class_storage_parameter_number_lun = 1;
138
139 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_read = UX_NULL;
140 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_write = _dummy_storage_media_write;
141 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_flush = _dummy_storage_media_flush;
142 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_status = _dummy_storage_media_status;
143 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_notification = _dummy_storage_media_notification;
144 status = ux_device_class_storage_entry(&dummy_command);
145 UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
146
147 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_read = _dummy_storage_media_read;
148 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_write = UX_NULL;
149 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_flush = _dummy_storage_media_flush;
150 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_status = _dummy_storage_media_status;
151 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_notification = _dummy_storage_media_notification;
152 status = ux_device_class_storage_entry(&dummy_command);
153 UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
154
155 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_read = _dummy_storage_media_read;
156 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_write = _dummy_storage_media_write;
157 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_flush = _dummy_storage_media_flush;
158 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_status = UX_NULL;
159 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_notification = _dummy_storage_media_notification;
160 status = ux_device_class_storage_entry(&dummy_command);
161 UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
162
163 #if defined(UX_SLAVE_CLASS_STORAGE_INCLUDE_MMC)
164 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_read = _dummy_storage_media_read;
165 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_write = _dummy_storage_media_write;
166 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_flush = _dummy_storage_media_flush;
167 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_status = _dummy_storage_media_status;
168 dummy_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_notification = UX_NULL;
169 status = ux_device_class_storage_entry(&dummy_command);
170 UX_TEST_CHECK_CODE(UX_INVALID_PARAMETER, status);
171 #endif
172
173 /* Sleep for a tick to make sure everything is complete. */
174 tx_thread_sleep(1);
175
176 /* Check for errors from other threads. */
177 if (error_counter)
178 {
179
180 /* Test error. */
181 printf("ERROR #%d: total %ld errors\n", __LINE__, error_counter);
182 test_control_return(1);
183 }
184 else
185 {
186
187 /* Successful test. */
188 printf("SUCCESS!\n");
189 test_control_return(0);
190 }
191 }
192