1 
2 #include "ux_api.h"
3 #include "ux_device_class_dummy.h"
4 #include "ux_device_stack.h"
5 
6 UCHAR _ux_device_class_dummy_name[] = "ux_device_class_dummy";
7 
_ux_device_class_dummy_initialize(UX_SLAVE_CLASS_COMMAND * command)8 static UINT _ux_device_class_dummy_initialize(UX_SLAVE_CLASS_COMMAND *command)
9 {
10 
11 UX_SLAVE_CLASS                  *class;
12 UX_DEVICE_CLASS_DUMMY           *dummy;
13 UX_DEVICE_CLASS_DUMMY_PARAMETER *dummy_parameter;
14 
15 
16     /* Get the class container.  */
17     class =  command -> ux_slave_class_command_class_ptr;
18 
19     /* Get pointer to the application parameters.  */
20     dummy_parameter = (UX_DEVICE_CLASS_DUMMY_PARAMETER *)command -> ux_slave_class_command_parameter;
21 
22     /* Create dummy class instance.  */
23     dummy = (UX_DEVICE_CLASS_DUMMY *)_ux_utility_memory_allocate(UX_NO_ALIGN, UX_REGULAR_MEMORY, sizeof(UX_DEVICE_CLASS_DUMMY));
24     if (dummy == UX_NULL)
25         return(UX_MEMORY_INSUFFICIENT);
26 
27     /* Save the address of the Dummy instance inside the Dummy container.  */
28     class -> ux_slave_class_instance = (VOID *) dummy;
29 
30     /* Link to class instance.  */
31     dummy -> ux_device_class_dummy_class = class;
32 
33     /* Save parameters.  */
34     _ux_utility_memory_copy(&dummy -> ux_device_class_dummy_callbacks,
35                             &dummy_parameter -> ux_device_class_dummy_parameter_callbacks,
36                             sizeof(UX_DEVICE_CLASS_DUMMY_CALLBACKS));
37 
38     if (dummy->ux_device_class_dummy_callbacks.ux_device_class_dummy_initialize)
39         dummy->ux_device_class_dummy_callbacks.ux_device_class_dummy_initialize(dummy);
40 
41     return(UX_SUCCESS);
42 }
43 
_ux_device_class_dummy_uninitialize(UX_SLAVE_CLASS_COMMAND * command)44 static UINT _ux_device_class_dummy_uninitialize(UX_SLAVE_CLASS_COMMAND *command)
45 {
46 
47 UX_DEVICE_CLASS_DUMMY       *dummy = NULL;
48 UX_SLAVE_CLASS              *class;
49 
50 
51     /* Get the class container.  */
52     class =  command -> ux_slave_class_command_class_ptr;
53 
54     /* Get the class instance in the container.  */
55     dummy = (UX_DEVICE_CLASS_DUMMY *) class -> ux_slave_class_instance;
56 
57     if (dummy->ux_device_class_dummy_callbacks.ux_device_class_dummy_uninitialize)
58         dummy->ux_device_class_dummy_callbacks.ux_device_class_dummy_uninitialize(dummy);
59 
60     if (dummy != UX_NULL)
61         _ux_utility_memory_free(dummy);
62     return(UX_SUCCESS);
63 }
64 
_ux_device_class_dummy_query(UX_SLAVE_CLASS_COMMAND * command)65 static UINT _ux_device_class_dummy_query(UX_SLAVE_CLASS_COMMAND *command)
66 {
67 
68 UINT        status = UX_SUCCESS;
69 
70 
71     return(status);
72 }
73 
_ux_device_class_dummy_activate(UX_SLAVE_CLASS_COMMAND * command)74 static UINT _ux_device_class_dummy_activate(UX_SLAVE_CLASS_COMMAND *command)
75 {
76 
77 UX_SLAVE_CLASS                          *class;
78 UX_SLAVE_DEVICE                         *device;
79 UX_SLAVE_INTERFACE                      *interface;
80 UX_DEVICE_CLASS_DUMMY                   *dummy;
81 
82 
83     /* Get the class container.  */
84     class =  command -> ux_slave_class_command_class_ptr;
85 
86     /* Get the class instance in the container.  */
87     dummy = (UX_DEVICE_CLASS_DUMMY *) class -> ux_slave_class_instance;
88 
89     /* Get the interface that owns this instance.  */
90     interface =  (UX_SLAVE_INTERFACE  *) command -> ux_slave_class_command_interface;
91     dummy -> ux_device_class_dummy_interface = interface;
92 
93     /* Get the device instance.  */
94     device = &_ux_system_slave -> ux_system_slave_device;
95     dummy -> ux_device_class_dummy_device = device;
96 
97     /* If there is a activate function call it.  */
98     if (dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_instance_activate)
99         dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_instance_activate(dummy);
100     return(UX_SUCCESS);
101 }
102 
_ux_device_class_dummy_change(UX_SLAVE_CLASS_COMMAND * command)103 static UINT _ux_device_class_dummy_change(UX_SLAVE_CLASS_COMMAND *command)
104 {
105 
106 UX_SLAVE_CLASS                          *class;
107 UX_SLAVE_INTERFACE                      *interface;
108 UX_DEVICE_CLASS_DUMMY                   *dummy;
109 
110 
111     /* Get the class container.  */
112     class =  command -> ux_slave_class_command_class_ptr;
113 
114     /* Get the class instance in the container.  */
115     dummy = (UX_DEVICE_CLASS_DUMMY *) class -> ux_slave_class_instance;
116 
117     /* Get the interface that owns this instance.  */
118     interface =  (UX_SLAVE_INTERFACE  *) command -> ux_slave_class_command_interface;
119 
120     /* Update the interface.  */
121     dummy -> ux_device_class_dummy_interface = interface;
122 
123     /* Invoke change callback.  */
124     if (dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_change)
125         dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_change(dummy);
126     return(UX_SUCCESS);
127 }
128 
_ux_device_class_dummy_deactivate(UX_SLAVE_CLASS_COMMAND * command)129 static UINT _ux_device_class_dummy_deactivate(UX_SLAVE_CLASS_COMMAND *command)
130 {
131 
132 UX_SLAVE_CLASS                          *class;
133 UX_DEVICE_CLASS_DUMMY                   *dummy;
134 
135 
136     /* Get the class container.  */
137     class =  command -> ux_slave_class_command_class_ptr;
138 
139     /* Get the class instance in the container.  */
140     dummy = (UX_DEVICE_CLASS_DUMMY *) class -> ux_slave_class_instance;
141 
142     /* If there is a deactivate function call it.  */
143     if (dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_instance_deactivate)
144         dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_instance_deactivate(dummy);
145     return(UX_SUCCESS);
146 }
147 
_ux_device_class_dummy_request(UX_SLAVE_CLASS_COMMAND * command)148 static UINT _ux_device_class_dummy_request(UX_SLAVE_CLASS_COMMAND *command)
149 {
150 
151 UX_SLAVE_CLASS                          *class;
152 UX_DEVICE_CLASS_DUMMY                   *dummy;
153 UX_SLAVE_DEVICE                         *device;
154 UX_SLAVE_TRANSFER                       *transfer_request;
155 
156 
157     /* Get the class container.  */
158     class =  command -> ux_slave_class_command_class_ptr;
159 
160     /* Get the audio instance from this class container.  */
161     dummy =  (UX_DEVICE_CLASS_DUMMY *) class -> ux_slave_class_instance;
162 
163     /* Get the pointer to the device.  */
164     device =  dummy -> ux_device_class_dummy_device;
165 
166     /* Get the pointer to the transfer request associated with the control endpoint.  */
167     transfer_request =  &device -> ux_slave_device_control_endpoint.ux_slave_endpoint_transfer_request;
168 
169     /* Invoke callback.  */
170     if (dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_control_request)
171     {
172         dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_control_request(dummy, transfer_request);
173         return(UX_SUCCESS);
174     }
175 
176     /* By default, not handled, stall the endpoint.  */
177     _ux_device_stack_endpoint_stall(&device -> ux_slave_device_control_endpoint);
178     return(UX_SUCCESS);
179 }
180 
_ux_device_class_dummy_entry(UX_SLAVE_CLASS_COMMAND * command)181 UINT  _ux_device_class_dummy_entry(UX_SLAVE_CLASS_COMMAND *command)
182 {
183 
184 UINT        status;
185 
186 
187     switch(command -> ux_slave_class_command_request)
188     {
189 
190     case UX_SLAVE_CLASS_COMMAND_INITIALIZE:
191         status = _ux_device_class_dummy_initialize(command);
192         break;
193 
194     case UX_SLAVE_CLASS_COMMAND_UNINITIALIZE:
195         status = _ux_device_class_dummy_uninitialize(command);
196         break;
197 
198     case UX_SLAVE_CLASS_COMMAND_QUERY:
199         status = _ux_device_class_dummy_query(command);
200         break;
201 
202     case UX_SLAVE_CLASS_COMMAND_ACTIVATE:
203         status = _ux_device_class_dummy_activate(command);
204         break;
205 
206     case UX_SLAVE_CLASS_COMMAND_CHANGE:
207         status = _ux_device_class_dummy_change(command);
208         break;
209 
210     case UX_SLAVE_CLASS_COMMAND_DEACTIVATE:
211         status = _ux_device_class_dummy_deactivate(command);
212         break;
213 
214     case UX_SLAVE_CLASS_COMMAND_REQUEST:
215         status = _ux_device_class_dummy_request(command);
216         break;
217 
218     default:
219         status = UX_FUNCTION_NOT_SUPPORTED;
220         break;
221 
222     }
223     return(status);
224 }
225 
_ux_device_class_dummy_get_arg(UX_DEVICE_CLASS_DUMMY * dummy)226 VOID *_ux_device_class_dummy_get_arg(UX_DEVICE_CLASS_DUMMY *dummy)
227 {
228     return dummy -> ux_device_class_dummy_callbacks.ux_device_class_dummy_arg;
229 }
230 
_ux_device_class_dummy_get_max_packet_size(UX_DEVICE_CLASS_DUMMY * dummy,UCHAR endpoint_address)231 ULONG _ux_device_class_dummy_get_max_packet_size(UX_DEVICE_CLASS_DUMMY *dummy, UCHAR endpoint_address)
232 {
233 
234 UX_SLAVE_ENDPOINT  *endpoint = _ux_device_class_dummy_get_endpoint(dummy, endpoint_address);
235 
236 
237     if (endpoint == UX_NULL)
238         return 0;
239     return endpoint -> ux_slave_endpoint_descriptor.wMaxPacketSize;
240 }
241 
_ux_device_class_dummy_get_endpoint(UX_DEVICE_CLASS_DUMMY * dummy,UCHAR endpoint_address)242 UX_SLAVE_ENDPOINT *_ux_device_class_dummy_get_endpoint(UX_DEVICE_CLASS_DUMMY *dummy, UCHAR endpoint_address)
243 {
244 
245 UX_SLAVE_ENDPOINT  *endpoint;
246 UX_SLAVE_INTERFACE *interface;
247 
248     if (dummy == UX_NULL)
249         return(UX_NULL);
250     if (endpoint_address == 0 || endpoint_address == 0x80)
251         return(&dummy -> ux_device_class_dummy_device -> ux_slave_device_control_endpoint);
252 
253     interface = dummy -> ux_device_class_dummy_interface;
254     if (interface == UX_NULL)
255         return((UX_SLAVE_ENDPOINT *)UX_NULL);
256 
257     endpoint = interface -> ux_slave_interface_first_endpoint;
258     while(endpoint)
259     {
260         if (endpoint -> ux_slave_endpoint_descriptor.bEndpointAddress == endpoint_address)
261             break;
262         endpoint = endpoint -> ux_slave_endpoint_next_endpoint;
263     }
264     return endpoint;
265 }
266 
_ux_device_class_dummy_get_transfer_request(UX_DEVICE_CLASS_DUMMY * dummy,UCHAR endpoint_address)267 UX_SLAVE_TRANSFER *_ux_device_class_dummy_get_transfer_request(UX_DEVICE_CLASS_DUMMY *dummy, UCHAR endpoint_address)
268 {
269 
270 UX_SLAVE_ENDPOINT *endpoint = _ux_device_class_dummy_get_endpoint(dummy, endpoint_address);
271 
272 
273     return &endpoint -> ux_slave_endpoint_transfer_request;
274 }
275 
_ux_device_class_dummy_transfer(UX_DEVICE_CLASS_DUMMY * dummy,UCHAR endpoint_address,UCHAR * buffer,ULONG length,ULONG * actual_length)276 UINT  _ux_device_class_dummy_transfer(UX_DEVICE_CLASS_DUMMY *dummy, UCHAR endpoint_address, UCHAR *buffer, ULONG length, ULONG *actual_length)
277 {
278 
279 UINT               status;
280 UX_SLAVE_TRANSFER *transfer_request = _ux_device_class_dummy_get_transfer_request(dummy, endpoint_address);
281 
282 
283     if (transfer_request == UX_NULL)
284         return(UX_ERROR);
285 
286     if (length > UX_SLAVE_REQUEST_DATA_MAX_LENGTH)
287         length = UX_SLAVE_REQUEST_DATA_MAX_LENGTH;
288 
289     if (endpoint_address & 0x80) /* Device to host */
290     {
291         if (length)
292             _ux_utility_memory_copy(transfer_request -> ux_slave_transfer_request_data_pointer,
293                                     buffer, length);
294 
295         status = _ux_device_stack_transfer_request(transfer_request, length, length);
296     }
297 
298     else /* Host to Device */
299     {
300         status = _ux_device_stack_transfer_request(transfer_request, length, length);
301 
302         if (status == UX_SUCCESS && buffer != UX_NULL)
303         {
304             if (length)
305                 _ux_utility_memory_copy(buffer,
306                                         transfer_request -> ux_slave_transfer_request_data_pointer,
307                                         length);
308         }
309     }
310 
311     if (actual_length)
312         *actual_length = transfer_request -> ux_slave_transfer_request_actual_length;
313 
314     return(status);
315 }
316