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