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